@mastra/react 1.12.0-alpha.9 → 1.13.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.
Files changed (130) hide show
  1. package/dist/{accumulator-BQGsraqS.cjs → accumulator-BmD8-x9I.cjs} +52 -4
  2. package/dist/accumulator-BmD8-x9I.cjs.map +1 -0
  3. package/dist/{accumulator-C8kIc450.js → accumulator-D9jAph99.js} +52 -4
  4. package/dist/accumulator-D9jAph99.js.map +1 -0
  5. package/dist/chat/index.cjs +1 -1
  6. package/dist/chat/index.js +1 -2
  7. package/dist/combine-by-ids-D_lp6Dvq.cjs.map +1 -1
  8. package/dist/experiments-B7vRMK5T.js +306 -0
  9. package/dist/experiments-B7vRMK5T.js.map +1 -0
  10. package/dist/experiments-CJw1N3FB.cjs +353 -0
  11. package/dist/experiments-CJw1N3FB.cjs.map +1 -0
  12. package/dist/hooks/agents/index.cjs +2 -2
  13. package/dist/hooks/agents/index.cjs.map +1 -1
  14. package/dist/hooks/agents/index.js +2 -2
  15. package/dist/hooks/agents/index.js.map +1 -1
  16. package/dist/hooks/auth/index.cjs +2 -2
  17. package/dist/hooks/auth/index.cjs.map +1 -1
  18. package/dist/hooks/auth/index.js +2 -2
  19. package/dist/hooks/auth/index.js.map +1 -1
  20. package/dist/hooks/capabilities/index.cjs +58 -1
  21. package/dist/hooks/capabilities/index.cjs.map +1 -1
  22. package/dist/hooks/capabilities/index.d.ts +4 -0
  23. package/dist/hooks/capabilities/index.d.ts.map +1 -1
  24. package/dist/hooks/capabilities/index.js +55 -2
  25. package/dist/hooks/capabilities/index.js.map +1 -1
  26. package/dist/hooks/capabilities/use-span-aggregate-available.d.ts +9 -0
  27. package/dist/hooks/capabilities/use-span-aggregate-available.d.ts.map +1 -0
  28. package/dist/hooks/capabilities/use-span-query-available.d.ts +9 -0
  29. package/dist/hooks/capabilities/use-span-query-available.d.ts.map +1 -0
  30. package/dist/hooks/capabilities/use-thread-query-available.d.ts +9 -0
  31. package/dist/hooks/capabilities/use-thread-query-available.d.ts.map +1 -0
  32. package/dist/hooks/capabilities/use-trace-query-delta-polling-available.d.ts +10 -0
  33. package/dist/hooks/capabilities/use-trace-query-delta-polling-available.d.ts.map +1 -0
  34. package/dist/hooks/configuration/index.cjs.map +1 -1
  35. package/dist/hooks/datasets/index.cjs +25 -1
  36. package/dist/hooks/datasets/index.cjs.map +1 -1
  37. package/dist/hooks/datasets/index.js +25 -2
  38. package/dist/hooks/datasets/index.js.map +1 -1
  39. package/dist/hooks/datasets/use-datasets.d.ts +7 -0
  40. package/dist/hooks/datasets/use-datasets.d.ts.map +1 -1
  41. package/dist/hooks/embedders/index.cjs.map +1 -1
  42. package/dist/hooks/experiments/index.cjs +9 -235
  43. package/dist/hooks/experiments/index.d.ts +1 -0
  44. package/dist/hooks/experiments/index.d.ts.map +1 -1
  45. package/dist/hooks/experiments/index.js +1 -229
  46. package/dist/hooks/experiments/usage-accumulator.d.ts +25 -0
  47. package/dist/hooks/experiments/usage-accumulator.d.ts.map +1 -0
  48. package/dist/hooks/experiments/use-experiment-item-usage.d.ts +2 -7
  49. package/dist/hooks/experiments/use-experiment-item-usage.d.ts.map +1 -1
  50. package/dist/hooks/experiments/use-experiments-list-metrics.d.ts +19 -0
  51. package/dist/hooks/experiments/use-experiments-list-metrics.d.ts.map +1 -0
  52. package/dist/hooks/feedback/index.cjs.map +1 -1
  53. package/dist/hooks/llm/index.cjs.map +1 -1
  54. package/dist/hooks/logs/index.cjs.map +1 -1
  55. package/dist/hooks/mcps/index.cjs.map +1 -1
  56. package/dist/hooks/memory/index.cjs +10 -10
  57. package/dist/hooks/memory/index.cjs.map +1 -1
  58. package/dist/hooks/memory/index.js +10 -10
  59. package/dist/hooks/memory/index.js.map +1 -1
  60. package/dist/hooks/metrics/index.cjs +13 -11
  61. package/dist/hooks/metrics/index.cjs.map +1 -1
  62. package/dist/hooks/metrics/index.js +13 -11
  63. package/dist/hooks/metrics/index.js.map +1 -1
  64. package/dist/hooks/processors/index.cjs.map +1 -1
  65. package/dist/hooks/prompt-blocks/index.cjs.map +1 -1
  66. package/dist/hooks/query/index.cjs.map +1 -1
  67. package/dist/hooks/review/index.cjs +2 -2
  68. package/dist/hooks/review/index.cjs.map +1 -1
  69. package/dist/hooks/review/index.js +1 -1
  70. package/dist/hooks/schedules/index.cjs.map +1 -1
  71. package/dist/hooks/scores/index.cjs.map +1 -1
  72. package/dist/hooks/templates/index.cjs +20 -18
  73. package/dist/hooks/templates/index.cjs.map +1 -1
  74. package/dist/hooks/templates/index.js +20 -18
  75. package/dist/hooks/templates/index.js.map +1 -1
  76. package/dist/hooks/templates/use-templates.d.ts.map +1 -1
  77. package/dist/hooks/tool-providers/index.cjs +1 -1
  78. package/dist/hooks/tool-providers/index.cjs.map +1 -1
  79. package/dist/hooks/tool-providers/index.js +1 -1
  80. package/dist/hooks/tool-providers/index.js.map +1 -1
  81. package/dist/hooks/tools/index.cjs.map +1 -1
  82. package/dist/hooks/traces/index.cjs +292 -9
  83. package/dist/hooks/traces/index.cjs.map +1 -1
  84. package/dist/hooks/traces/index.d.ts +2 -0
  85. package/dist/hooks/traces/index.d.ts.map +1 -1
  86. package/dist/hooks/traces/index.js +285 -10
  87. package/dist/hooks/traces/index.js.map +1 -1
  88. package/dist/hooks/traces/use-query-spans.d.ts +27 -0
  89. package/dist/hooks/traces/use-query-spans.d.ts.map +1 -0
  90. package/dist/hooks/traces/use-query-threads.d.ts +30 -0
  91. package/dist/hooks/traces/use-query-threads.d.ts.map +1 -0
  92. package/dist/hooks/traces/use-trace-query.d.ts +50 -1
  93. package/dist/hooks/traces/use-trace-query.d.ts.map +1 -1
  94. package/dist/hooks/traces/use-traces.d.ts +37 -37
  95. package/dist/hooks/vectors/index.cjs.map +1 -1
  96. package/dist/hooks/voice/index.cjs.map +1 -1
  97. package/dist/hooks/workflows/index.cjs +1 -1
  98. package/dist/hooks/workflows/index.cjs.map +1 -1
  99. package/dist/hooks/workflows/index.js +1 -1
  100. package/dist/hooks/workspace/index.cjs +1 -1
  101. package/dist/hooks/workspace/index.cjs.map +1 -1
  102. package/dist/hooks/workspace/index.js +1 -1
  103. package/dist/hooks/workspace/index.js.map +1 -1
  104. package/dist/{hooks-CIutb3DO.cjs → hooks-C6CJtoOR.cjs} +6 -4
  105. package/dist/hooks-C6CJtoOR.cjs.map +1 -0
  106. package/dist/{hooks-0L0RNfau.js → hooks-DG-Y1KFe.js} +2 -2
  107. package/dist/{hooks-0L0RNfau.js.map → hooks-DG-Y1KFe.js.map} +1 -1
  108. package/dist/{hooks-FVbeHlov.js → hooks-DvLSZtUd.js} +6 -4
  109. package/dist/{hooks-FVbeHlov.js.map → hooks-DvLSZtUd.js.map} +1 -1
  110. package/dist/{hooks-_YevKidX.cjs → hooks-XYsmqFCz.cjs} +2 -2
  111. package/dist/hooks-XYsmqFCz.cjs.map +1 -0
  112. package/dist/index.cjs +3 -3
  113. package/dist/index.cjs.map +1 -1
  114. package/dist/index.js +3 -3
  115. package/dist/lib/mastra-db/accumulator.d.ts +0 -6
  116. package/dist/lib/mastra-db/accumulator.d.ts.map +1 -1
  117. package/dist/mastra-client-context-DzX3f0RF.cjs.map +1 -1
  118. package/dist/ui/index.cjs +4 -4
  119. package/dist/ui/index.cjs.map +1 -1
  120. package/dist/ui/index.js +3 -3
  121. package/dist/ui/index.js.map +1 -1
  122. package/dist/use-in-view-B6eJO9Zi.cjs.map +1 -1
  123. package/dist/voice-BOtUdMi8.cjs.map +1 -1
  124. package/package.json +7 -7
  125. package/dist/accumulator-BQGsraqS.cjs.map +0 -1
  126. package/dist/accumulator-C8kIc450.js.map +0 -1
  127. package/dist/hooks/experiments/index.cjs.map +0 -1
  128. package/dist/hooks/experiments/index.js.map +0 -1
  129. package/dist/hooks-CIutb3DO.cjs.map +0 -1
  130. package/dist/hooks-_YevKidX.cjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/hooks/workspace/client-utils.ts","../../../src/hooks/workspace/compatibility.ts","../../../src/hooks/workspace/file-type.ts","../../../src/hooks/workspace/use-skills-sh.ts","../../../src/hooks/workspace/use-stored-workspaces.ts","../../../src/hooks/workspace/use-workspace.ts","../../../src/hooks/workspace/use-workspace-directory.ts","../../../src/hooks/workspace/use-workspace-file-content.ts","../../../src/hooks/workspace/use-workspace-search.ts","../../../src/hooks/workspace/use-workspace-skills.ts"],"sourcesContent":["/**\n * Checks if a method exists on an object and is callable.\n */\nexport function hasMethod<T>(obj: T, method: string): boolean {\n return method in (obj as object) && typeof (obj as Record<string, unknown>)[method] === 'function';\n}\n","import type { MastraClient } from '@mastra/client-js';\nimport { coreFeatures } from '@mastra/core/features';\nimport { isNonRetryableError } from '../query/query-utils';\nimport { hasMethod } from './client-utils';\n\n/**\n * Checks if workspace v1 features are supported by both core and client.\n * This guards against version mismatches between playground-ui, core, and client-js.\n */\nexport const isWorkspaceV1Supported = (client: MastraClient) => {\n const workspaceClientMethods = ['listWorkspaces', 'getWorkspace'];\n\n const coreSupported = coreFeatures.has('workspaces-v1');\n const clientSupported = workspaceClientMethods.every(method => hasMethod(client, method));\n\n return coreSupported && clientSupported;\n};\n\n/**\n * Gets the HTTP status code from an error if present.\n * Supports MastraClientError, fetch Response, and other HTTP client error formats.\n */\nconst getStatusCode = (error: unknown): number | undefined => {\n if (!error || typeof error !== 'object') return undefined;\n\n // Check for status property (MastraClientError, fetch Response, etc.)\n if ('status' in error && typeof (error as { status: unknown }).status === 'number') {\n return (error as { status: number }).status;\n }\n\n // Check for statusCode property (from some HTTP clients)\n if ('statusCode' in error && typeof (error as { statusCode: unknown }).statusCode === 'number') {\n return (error as { statusCode: number }).statusCode;\n }\n\n return undefined;\n};\n\n/**\n * Checks if an error has a specific HTTP status code.\n * Supports MastraClientError, fetch Response, and other HTTP client error formats.\n */\nconst hasStatusCode = (error: unknown, statusCode: number): boolean => {\n return getStatusCode(error) === statusCode;\n};\n\n/**\n * Checks if an error is a 4xx client error (e.g., 400, 401, 403, 404).\n * Client errors won't resolve with retries.\n */\nconst isClientError = (error: unknown): boolean => {\n const status = getStatusCode(error);\n return status !== undefined && status >= 400 && status < 500;\n};\n\n/**\n * Checks if an error is a \"Not Implemented\" (501) error from the server.\n * This indicates the server's @mastra/core version doesn't support workspaces.\n */\nexport const isWorkspaceNotSupportedError = (error: unknown): boolean => {\n if (hasStatusCode(error, 501)) {\n return true;\n }\n\n // Check error message for our specific error\n if (error && typeof error === 'object' && 'message' in error) {\n const message = (error as { message: string }).message;\n return message.includes('Workspace v1 not supported') || message.includes('501');\n }\n\n return false;\n};\n\n/**\n * Checks if an error is a \"Not Found\" (404) error from the server.\n * This indicates the requested resource doesn't exist (e.g., file not found).\n */\nexport const isNotFoundError = (error: unknown): boolean => {\n if (hasStatusCode(error, 404)) {\n return true;\n }\n\n // Check error message for status code (client-js throws Error with message like \"HTTP error! status: 404 - ...\")\n if (error && typeof error === 'object' && 'message' in error) {\n const message = (error as { message: string }).message;\n return message.includes('status: 404');\n }\n\n return false;\n};\n\n/**\n * React Query retry function that doesn't retry on client errors (4xx) or 501 errors.\n * Use this to prevent infinite retries when resources don't exist, access is denied, or workspaces aren't supported.\n */\nexport const shouldRetryWorkspaceQuery = (failureCount: number, error: Error): boolean => {\n // Don't retry 4xx client errors (400, 401, 403, 404, etc.) - these won't resolve with retries\n if (isClientError(error)) {\n return false;\n }\n // Don't retry 501 \"Not Implemented\" errors - they won't resolve with retries\n if (isWorkspaceNotSupportedError(error)) {\n return false;\n }\n // Don't retry 4xx client errors (400, 401, 403, 404)\n if (isNonRetryableError(error)) {\n return false;\n }\n // Default retry behavior: retry up to 3 times\n return failureCount < 3;\n};\n","const IMAGE_EXTENSIONS = ['png', 'jpg', 'jpeg', 'gif', 'svg', 'webp', 'bmp', 'avif', 'tiff', 'tif'];\nconst VIDEO_MIME_TYPES: Record<string, string> = {\n mp4: 'video/mp4',\n webm: 'video/webm',\n mov: 'video/quicktime',\n m4v: 'video/mp4',\n ogv: 'video/ogg',\n};\n\nconst extension = (path: string) => path.split('/').pop()?.split('.').pop()?.toLowerCase() ?? '';\n\nexport const isImageFile = (path: string, mimeType?: string) =>\n mimeType?.startsWith('image/') || IMAGE_EXTENSIONS.includes(extension(path));\n\nexport const isVideoFile = (path: string, mimeType?: string) =>\n mimeType?.startsWith('video/') || extension(path) in VIDEO_MIME_TYPES;\n\n/** Media must be read as base64: reading it as utf-8 corrupts the bytes. */\nexport const isMediaFile = (path: string) => isImageFile(path) || isVideoFile(path);\n\nexport const videoMimeType = (path: string, mimeType?: string) =>\n mimeType?.startsWith('video/') ? mimeType : (VIDEO_MIME_TYPES[extension(path)] ?? 'video/mp4');\n\nexport const isMarkdownFile = (path: string) => /\\.mdx?$/i.test(path);\n","import type { MastraClient, SkillsShSkill } from '@mastra/client-js';\nimport type { UseMutationResult, UseQueryResult } from '@tanstack/react-query';\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';\nimport { useMastraClient } from '../../mastra-client-context';\nimport type { MastraMutationOptions, MastraQueryOptions } from '../shared/query-options';\n\nexport type { SkillsShSkill };\n\ntype SearchSkillsShResponse = Awaited<ReturnType<ReturnType<MastraClient['getWorkspace']>['searchSkillsSh']>>;\ntype PopularSkillsShResponse = Awaited<ReturnType<ReturnType<MastraClient['getWorkspace']>['listPopularSkillsSh']>>;\ntype InstallSkillsShResponse = Awaited<ReturnType<ReturnType<MastraClient['getWorkspace']>['installSkillsSh']>>;\ntype UpdateSkillsShResponse = Awaited<ReturnType<ReturnType<MastraClient['getWorkspace']>['updateSkillsSh']>>;\ntype RemoveSkillsShResponse = Awaited<ReturnType<ReturnType<MastraClient['getWorkspace']>['removeSkillsSh']>>;\n\n/**\n * Search skills on skills.sh (via server proxy)\n */\nexport const useSearchSkillsSh = ({\n workspaceId,\n queryOptions,\n}: {\n workspaceId: string | undefined;\n queryOptions?: MastraMutationOptions<SearchSkillsShResponse, string>;\n}): UseMutationResult<SearchSkillsShResponse, Error, string> => {\n const client = useMastraClient();\n\n return useMutation<SearchSkillsShResponse, Error, string>({\n mutationFn: (query: string) => {\n if (!workspaceId) throw new Error('Workspace ID is required');\n return client.getWorkspace(workspaceId).searchSkillsSh({ q: query, limit: 10 });\n },\n ...queryOptions,\n });\n};\n\n/**\n * Get popular skills from skills.sh (via server proxy, cached for 5 minutes)\n *\n * Does not guard on empty ids; pass `queryOptions: { enabled }` to skip the fetch.\n */\nexport const usePopularSkillsSh = <TData = PopularSkillsShResponse>({\n workspaceId,\n queryOptions,\n}: {\n workspaceId: string | undefined;\n queryOptions?: MastraQueryOptions<PopularSkillsShResponse, TData>;\n}): UseQueryResult<TData, Error> => {\n const client = useMastraClient();\n\n return useQuery<PopularSkillsShResponse, Error, TData>({\n queryKey: ['skills-sh', 'popular', workspaceId],\n queryFn: () => {\n if (!workspaceId) throw new Error('Workspace ID is required');\n return client.getWorkspace(workspaceId).listPopularSkillsSh({ limit: 10, offset: 0 });\n },\n staleTime: 5 * 60 * 1000,\n ...queryOptions,\n });\n};\n\n/**\n * Preview a skill by fetching its SKILL.md (via server proxy to avoid CORS)\n *\n * Does not guard on empty ids; pass `queryOptions: { enabled }` to skip the fetch.\n */\nexport const useSkillPreview = <TData = string>({\n workspaceId,\n owner,\n repo,\n skillPath,\n queryOptions,\n}: {\n workspaceId: string | undefined;\n owner: string | undefined;\n repo: string | undefined;\n skillPath: string | undefined;\n queryOptions?: MastraQueryOptions<string, TData>;\n}): UseQueryResult<TData, Error> => {\n const client = useMastraClient();\n\n return useQuery<string, Error, TData>({\n queryKey: ['skills-sh', 'preview', workspaceId, owner, repo, skillPath],\n queryFn: async () => {\n if (!workspaceId || !owner || !repo || !skillPath) {\n throw new Error('workspaceId, owner, repo, and skillPath are required');\n }\n const { content } = await client.getWorkspace(workspaceId).previewSkillsSh({ owner, repo, path: skillPath });\n return content;\n },\n retry: false,\n ...queryOptions,\n });\n};\n\n// =============================================================================\n// Helper: Parse skills.sh skill ID to repository info\n// =============================================================================\n\n/**\n * Parse a skill's topSource field to extract GitHub repository info\n *\n * skills.sh topSource formats:\n * - \"owner/repo\" (e.g., \"vercel-labs/agent-skills\")\n * - \"owner/repo/path\" (e.g., \"anthropics/skills/frontend-design\")\n * - \"github.com/owner/repo/path\" (full URL format)\n *\n * The skill name is used as the path within the repo when not specified\n */\nexport function parseSkillSource(\n topSource: string,\n skillName?: string,\n): {\n owner: string;\n repo: string;\n skillPath: string;\n} | null {\n // Remove protocol and github.com prefix if present\n let cleanSource = topSource.replace(/^https?:\\/\\//, '');\n cleanSource = cleanSource.replace(/^github\\.com\\//, '');\n // Remove trailing slash if present\n cleanSource = cleanSource.replace(/\\/$/, '');\n\n const parts = cleanSource.split('/').filter(Boolean);\n const [owner, repo] = parts;\n\n if (!owner || !repo) {\n return null;\n }\n\n // If there's a path in topSource, use it; otherwise use skill name\n let skillPath: string;\n if (parts.length > 2) {\n // Path is specified in topSource (e.g., \"anthropics/skills/frontend-design\")\n skillPath = parts.slice(2).join('/');\n } else if (skillName) {\n // No path in topSource, use skill name (e.g., for \"vercel-labs/agent-skills\" + skill \"web-design-guidelines\")\n skillPath = skillName;\n } else {\n return null;\n }\n\n return {\n owner,\n repo,\n skillPath,\n };\n}\n\n// =============================================================================\n// Skill Management Hooks (via server proxy)\n// =============================================================================\n\nexport interface InstallSkillParams {\n workspaceId: string;\n /** Repository in format owner/repo */\n repository: string;\n /** Skill name within the repo */\n skillName: string;\n /** Mount path to install into (for CompositeFilesystem) */\n mount?: string;\n}\n\n/**\n * Install a skill by fetching from GitHub and writing to workspace filesystem.\n */\nexport const useInstallSkill = ({\n queryOptions,\n}: { queryOptions?: MastraMutationOptions<InstallSkillsShResponse, InstallSkillParams> } = {}) => {\n const client = useMastraClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (params: InstallSkillParams) => {\n const [owner, repo] = params.repository.split('/');\n if (!owner || !repo) {\n throw new Error('Invalid repository format. Expected owner/repo');\n }\n return client\n .getWorkspace(params.workspaceId)\n .installSkillsSh({ owner, repo, skillName: params.skillName, mount: params.mount });\n },\n onSuccess: (_, variables) => {\n void queryClient.invalidateQueries({ queryKey: ['workspace', 'skills', variables.workspaceId] });\n },\n ...queryOptions,\n });\n};\n\nexport interface UpdateSkillsParams {\n workspaceId: string;\n skillName?: string;\n}\n\n/**\n * Update installed skills by re-fetching from GitHub.\n */\nexport const useUpdateSkills = ({\n queryOptions,\n}: { queryOptions?: MastraMutationOptions<UpdateSkillsShResponse, UpdateSkillsParams> } = {}) => {\n const client = useMastraClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (params: UpdateSkillsParams) =>\n client.getWorkspace(params.workspaceId).updateSkillsSh({ skillName: params.skillName }),\n onSuccess: (_, variables) => {\n void queryClient.invalidateQueries({ queryKey: ['workspace', 'skills', variables.workspaceId] });\n },\n ...queryOptions,\n });\n};\n\nexport interface RemoveSkillParams {\n workspaceId: string;\n skillName: string;\n}\n\n/**\n * Remove an installed skill by deleting its directory.\n */\nexport const useRemoveSkill = ({\n queryOptions,\n}: { queryOptions?: MastraMutationOptions<RemoveSkillsShResponse, RemoveSkillParams> } = {}) => {\n const client = useMastraClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (params: RemoveSkillParams) =>\n client.getWorkspace(params.workspaceId).removeSkillsSh({ skillName: params.skillName }),\n onSuccess: (_, variables) => {\n void queryClient.invalidateQueries({ queryKey: ['workspace', 'skills', variables.workspaceId] });\n },\n ...queryOptions,\n });\n};\n","import type { ListStoredWorkspacesParams, ListStoredWorkspacesResponse } from '@mastra/client-js';\nimport type { UseQueryResult } from '@tanstack/react-query';\nimport { useQuery } from '@tanstack/react-query';\nimport { useMastraClient } from '../../mastra-client-context';\nimport type { MastraQueryOptions } from '../shared/query-options';\n\n/**\n * Hook to list stored workspaces from the database.\n * These are workspaces that have been persisted via the stored workspaces API,\n * as opposed to runtime-registered workspaces from code-defined agents.\n */\nexport const useStoredWorkspaces = <TData = ListStoredWorkspacesResponse>({\n queryOptions,\n ...params\n}: ListStoredWorkspacesParams & {\n queryOptions?: MastraQueryOptions<ListStoredWorkspacesResponse, TData>;\n} = {}): UseQueryResult<TData, Error> => {\n const client = useMastraClient();\n\n return useQuery<ListStoredWorkspacesResponse, Error, TData>({\n queryKey: ['stored-workspaces', params],\n queryFn: async (): Promise<ListStoredWorkspacesResponse> => {\n return client.listStoredWorkspaces(params);\n },\n ...queryOptions,\n });\n};\n","import type { UseQueryResult } from '@tanstack/react-query';\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useMastraClient } from '../../mastra-client-context';\nimport type { MastraMutationOptions, MastraQueryOptions } from '../shared/query-options';\nimport { isWorkspaceV1Supported, shouldRetryWorkspaceQuery, isWorkspaceNotSupportedError } from './compatibility';\nimport type {\n WorkspaceInfo,\n WorkspacesListResponse,\n FileStatResponse,\n WriteFileParams,\n WriteFileFromFileParams,\n} from './types';\n\nexport type DeleteWorkspaceFileParams = { path: string; recursive?: boolean; force?: boolean; workspaceId?: string };\nexport type CreateWorkspaceDirectoryParams = { path: string; recursive?: boolean; workspaceId?: string };\nexport type IndexWorkspaceContentParams = {\n workspaceId: string;\n path: string;\n content: string;\n metadata?: Record<string, unknown>;\n};\n\nfunction getParentPath(path: string): string {\n return path.split('/').slice(0, -1).join('/') || (path.startsWith('/') ? '/' : '.');\n}\n\n// Re-export for other hooks to use\nexport { isWorkspaceV1Supported, isWorkspaceNotSupportedError };\n\n// =============================================================================\n// Workspace Info Hook\n// =============================================================================\n\n/**\n * Does not guard on empty ids; pass `queryOptions: { enabled }` to skip the fetch.\n */\nexport const useWorkspaceInfo = <TData = WorkspaceInfo>({\n workspaceId,\n queryOptions,\n}: {\n workspaceId?: string;\n queryOptions?: MastraQueryOptions<WorkspaceInfo, TData>;\n} = {}): UseQueryResult<TData, Error> => {\n const client = useMastraClient();\n\n return useQuery<WorkspaceInfo, Error, TData>({\n queryKey: ['workspace', 'info', workspaceId],\n queryFn: async (): Promise<WorkspaceInfo> => {\n if (!isWorkspaceV1Supported(client)) {\n throw new Error('Workspace v1 not supported by core or client');\n }\n if (!workspaceId) {\n throw new Error('workspaceId is required');\n }\n const workspace = (client as any).getWorkspace(workspaceId);\n return workspace.info();\n },\n retry: shouldRetryWorkspaceQuery,\n ...queryOptions,\n enabled: isWorkspaceV1Supported(client) && (queryOptions?.enabled ?? true),\n });\n};\n\n// =============================================================================\n// List All Workspaces Hook\n// =============================================================================\n\nexport const useWorkspaces = <TData = WorkspacesListResponse>({\n queryOptions,\n}: { queryOptions?: MastraQueryOptions<WorkspacesListResponse, TData> } = {}): UseQueryResult<TData, Error> => {\n const client = useMastraClient();\n\n return useQuery<WorkspacesListResponse, Error, TData>({\n queryKey: ['workspaces'],\n queryFn: async (): Promise<WorkspacesListResponse> => {\n if (!isWorkspaceV1Supported(client)) {\n throw new Error('Workspace v1 not supported by core or client');\n }\n return (client as any).listWorkspaces();\n },\n retry: shouldRetryWorkspaceQuery,\n ...queryOptions,\n });\n};\n\n// =============================================================================\n// Filesystem Hooks\n// =============================================================================\n\n/**\n * Does not guard on empty ids; pass `queryOptions: { enabled }` to skip the fetch.\n */\nexport const useWorkspaceFileStat = <TData = FileStatResponse>({\n path,\n workspaceId,\n queryOptions,\n}: {\n path: string;\n workspaceId?: string;\n queryOptions?: MastraQueryOptions<FileStatResponse, TData>;\n}): UseQueryResult<TData, Error> => {\n const client = useMastraClient();\n\n return useQuery<FileStatResponse, Error, TData>({\n queryKey: ['workspace', 'stat', path, workspaceId],\n queryFn: async (): Promise<FileStatResponse> => {\n if (!isWorkspaceV1Supported(client)) {\n throw new Error('Workspace v1 not supported by core or client');\n }\n if (!workspaceId) {\n throw new Error('workspaceId is required');\n }\n const workspace = (client as any).getWorkspace(workspaceId);\n return workspace.stat(path);\n },\n retry: shouldRetryWorkspaceQuery,\n ...queryOptions,\n enabled: isWorkspaceV1Supported(client) && (queryOptions?.enabled ?? true),\n });\n};\n\nexport const useWriteWorkspaceFile = ({\n queryOptions,\n}: { queryOptions?: MastraMutationOptions<unknown, WriteFileParams> } = {}) => {\n const client = useMastraClient();\n const queryClient = useQueryClient();\n\n return useMutation<unknown, Error, WriteFileParams>({\n mutationFn: async (params: WriteFileParams) => {\n if (!isWorkspaceV1Supported(client)) {\n throw new Error('Workspace v1 not supported by core or client');\n }\n const workspace = (client as any).getWorkspace(params.workspaceId);\n return workspace.writeFile(params.path, params.content, {\n encoding: params.encoding,\n recursive: params.recursive ?? true,\n });\n },\n onSuccess: (_, variables) => {\n const parentPath = getParentPath(variables.path);\n void queryClient.invalidateQueries({ queryKey: ['workspace', 'files', parentPath] });\n void queryClient.invalidateQueries({ queryKey: ['workspace', 'file', variables.path] });\n },\n ...queryOptions,\n });\n};\n\nexport const useWriteWorkspaceFileFromFile = ({\n queryOptions,\n}: { queryOptions?: MastraMutationOptions<unknown, WriteFileFromFileParams> } = {}) => {\n const client = useMastraClient();\n const queryClient = useQueryClient();\n\n return useMutation<unknown, Error, WriteFileFromFileParams>({\n mutationFn: async (params: WriteFileFromFileParams) => {\n if (!isWorkspaceV1Supported(client)) {\n throw new Error('Workspace v1 not supported by core or client');\n }\n // Convert file to base64\n const arrayBuffer = await params.file.arrayBuffer();\n const base64 = btoa(new Uint8Array(arrayBuffer).reduce((data, byte) => data + String.fromCharCode(byte), ''));\n\n const workspace = (client as any).getWorkspace(params.workspaceId);\n return workspace.writeFile(params.path, base64, {\n encoding: 'base64',\n recursive: params.recursive ?? true,\n });\n },\n onSuccess: (_, variables) => {\n const parentPath = getParentPath(variables.path);\n void queryClient.invalidateQueries({ queryKey: ['workspace', 'files', parentPath] });\n void queryClient.invalidateQueries({ queryKey: ['workspace', 'file', variables.path] });\n },\n ...queryOptions,\n });\n};\n\nexport const useDeleteWorkspaceFile = ({\n queryOptions,\n}: { queryOptions?: MastraMutationOptions<unknown, DeleteWorkspaceFileParams> } = {}) => {\n const client = useMastraClient();\n const queryClient = useQueryClient();\n\n return useMutation<unknown, Error, DeleteWorkspaceFileParams>({\n mutationFn: async (params: DeleteWorkspaceFileParams) => {\n if (!isWorkspaceV1Supported(client)) {\n throw new Error('Workspace v1 not supported by core or client');\n }\n const workspace = (client as any).getWorkspace(params.workspaceId);\n return workspace.delete(params.path, {\n recursive: params.recursive,\n force: params.force,\n });\n },\n onSuccess: (_, variables) => {\n const parentPath = getParentPath(variables.path);\n void queryClient.invalidateQueries({ queryKey: ['workspace', 'files', parentPath] });\n void queryClient.invalidateQueries({ queryKey: ['workspace', 'file', variables.path] });\n },\n ...queryOptions,\n });\n};\n\nexport const useCreateWorkspaceDirectory = ({\n queryOptions,\n}: { queryOptions?: MastraMutationOptions<unknown, CreateWorkspaceDirectoryParams> } = {}) => {\n const client = useMastraClient();\n const queryClient = useQueryClient();\n\n return useMutation<unknown, Error, CreateWorkspaceDirectoryParams>({\n mutationFn: async (params: CreateWorkspaceDirectoryParams) => {\n if (!isWorkspaceV1Supported(client)) {\n throw new Error('Workspace v1 not supported by core or client');\n }\n const workspace = (client as any).getWorkspace(params.workspaceId);\n return workspace.mkdir(params.path, params.recursive);\n },\n onSuccess: (_, variables) => {\n const parentPath = getParentPath(variables.path);\n void queryClient.invalidateQueries({ queryKey: ['workspace', 'files', parentPath] });\n },\n ...queryOptions,\n });\n};\n\n// =============================================================================\n// Search Hooks\n// =============================================================================\n\nexport const useIndexWorkspaceContent = ({\n queryOptions,\n}: { queryOptions?: MastraMutationOptions<unknown, IndexWorkspaceContentParams> } = {}) => {\n const client = useMastraClient();\n\n return useMutation<unknown, Error, IndexWorkspaceContentParams>({\n mutationFn: async (params: IndexWorkspaceContentParams) => {\n if (!isWorkspaceV1Supported(client)) {\n throw new Error('Workspace v1 not supported by core or client');\n }\n const workspace = (client as any).getWorkspace(params.workspaceId);\n return workspace.index({\n path: params.path,\n content: params.content,\n metadata: params.metadata,\n });\n },\n ...queryOptions,\n });\n};\n","import type { MastraClient } from '@mastra/client-js';\nimport type { UseQueryResult } from '@tanstack/react-query';\nimport { useQuery } from '@tanstack/react-query';\nimport { useMastraClient } from '../../mastra-client-context';\nimport type { MastraQueryOptions } from '../shared/query-options';\n\nexport const WORKSPACE_REFETCH_INTERVAL = 10_000;\n\n/** Lists a single directory level and polls it. Callers enable it only once the folder is expanded. */\ntype WorkspaceDirectoryEntries = Awaited<ReturnType<ReturnType<MastraClient['getWorkspace']>['listFiles']>>['entries'];\n\nexport function useWorkspaceDirectory<TData = WorkspaceDirectoryEntries>({\n workspaceId,\n path,\n queryOptions,\n}: {\n workspaceId: string;\n path: string;\n queryOptions?: MastraQueryOptions<WorkspaceDirectoryEntries, TData>;\n}): UseQueryResult<TData, Error> {\n const client = useMastraClient();\n\n return useQuery<WorkspaceDirectoryEntries, Error, TData>({\n queryKey: ['workspace', workspaceId, 'fs', 'list', path],\n queryFn: async () => (await client.getWorkspace(workspaceId).listFiles(path, false)).entries,\n refetchInterval: WORKSPACE_REFETCH_INTERVAL,\n ...queryOptions,\n });\n}\n","import type { MastraClient } from '@mastra/client-js';\nimport type { UseQueryResult } from '@tanstack/react-query';\nimport { useQuery } from '@tanstack/react-query';\nimport { useMastraClient } from '../../mastra-client-context';\nimport type { MastraQueryOptions } from '../shared/query-options';\nimport { isMediaFile } from './file-type';\nimport { WORKSPACE_REFETCH_INTERVAL } from './use-workspace-directory';\n\n/** Reads a file (base64 for images/videos) and polls it so the viewer follows external edits. */\ntype WorkspaceFileContent = Awaited<ReturnType<ReturnType<MastraClient['getWorkspace']>['readFile']>>;\n\n/**\n * Does not guard on empty ids; pass `queryOptions: { enabled }` to skip the fetch.\n */\nexport function useWorkspaceFileContent<TData = WorkspaceFileContent>({\n workspaceId,\n path,\n queryOptions,\n}: {\n workspaceId: string;\n path?: string;\n queryOptions?: MastraQueryOptions<WorkspaceFileContent, TData>;\n}): UseQueryResult<TData, Error> {\n const client = useMastraClient();\n const encoding = path && isMediaFile(path) ? 'base64' : undefined;\n\n return useQuery<WorkspaceFileContent, Error, TData>({\n queryKey: ['workspace', workspaceId, 'fs', 'read', path, encoding],\n queryFn: () => client.getWorkspace(workspaceId).readFile(path ?? '', encoding),\n refetchInterval: WORKSPACE_REFETCH_INTERVAL,\n ...queryOptions,\n });\n}\n","import type { SkillSearchResult } from '@mastra/client-js';\nimport type { UseQueryResult } from '@tanstack/react-query';\nimport { useQuery } from '@tanstack/react-query';\nimport { useMastraClient } from '../../mastra-client-context';\nimport type { MastraQueryOptions } from '../shared/query-options';\n\nexport interface WorkspaceSearchHit {\n kind: 'file' | 'skill';\n path: string;\n label: string;\n score: number;\n}\n\n// Chunked files are indexed as `<path>#chunk-<n>`.\nconst filePathFromId = (id: string) => id.replace(/#chunk-\\d+$/, '');\n\nconst basename = (path: string) => path.split('/').filter(Boolean).pop() ?? path;\n\n// The server returns `skillPath`, which the client type does not declare yet.\nconst skillFilePath = (result: SkillSearchResult & { skillPath?: string }) =>\n result.skillPath ? `${result.skillPath.replace(/\\/$/, '')}/SKILL.md` : result.source;\n\n/** Searches files and skills in parallel; one failing source (e.g. 501 not configured) keeps the other's hits. */\n/**\n * Does not guard on empty ids; pass `queryOptions: { enabled }` to skip the fetch.\n */\nexport function useWorkspaceSearch<TData = WorkspaceSearchHit[]>({\n workspaceId,\n query,\n files: searchFiles = true,\n skills: searchSkills = true,\n queryOptions,\n}: {\n workspaceId: string;\n query: string;\n files?: boolean;\n skills?: boolean;\n queryOptions?: MastraQueryOptions<WorkspaceSearchHit[], TData>;\n}): UseQueryResult<TData, Error> {\n const client = useMastraClient();\n const trimmed = query.trim();\n\n return useQuery<WorkspaceSearchHit[], Error, TData>({\n queryKey: ['workspace', workspaceId, 'search', trimmed, searchFiles, searchSkills],\n queryFn: async () => {\n const workspace = client.getWorkspace(workspaceId);\n const [files, skills] = await Promise.allSettled([\n searchFiles ? workspace.search({ query: trimmed }) : Promise.reject(new Error('File search disabled')),\n searchSkills ? workspace.searchSkills({ query: trimmed }) : Promise.reject(new Error('Skill search disabled')),\n ]);\n\n if (files.status === 'rejected' && skills.status === 'rejected') {\n throw (searchFiles ? files : skills).reason;\n }\n\n const hits = new Map<string, WorkspaceSearchHit>();\n const add = (hit: WorkspaceSearchHit) => {\n const existing = hits.get(hit.path);\n if (!existing || existing.score < hit.score) hits.set(hit.path, hit);\n };\n\n if (files.status === 'fulfilled') {\n for (const result of files.value.results) {\n const path = filePathFromId(result.id);\n add({ kind: 'file', path, label: basename(path), score: result.score });\n }\n }\n if (skills.status === 'fulfilled') {\n for (const result of skills.value.results) {\n add({\n kind: 'skill',\n path: skillFilePath(result),\n label: result.skillName,\n score: result.score,\n });\n }\n }\n\n return [...hits.values()].sort((a, b) => b.score - a.score);\n },\n ...queryOptions,\n });\n}\n","import type { UseQueryResult } from '@tanstack/react-query';\nimport { useQuery } from '@tanstack/react-query';\nimport { useMastraClient } from '../../mastra-client-context';\nimport type { MastraQueryOptions } from '../shared/query-options';\nimport { isWorkspaceV1Supported, shouldRetryWorkspaceQuery } from './compatibility';\nimport type { Skill, ListSkillsResponse } from './types';\n\n// =============================================================================\n// Skills Hooks (via Workspace API)\n// =============================================================================\n\n/**\n * Does not guard on empty ids; pass `queryOptions: { enabled }` to skip the fetch.\n */\nexport const useWorkspaceSkills = <TData = ListSkillsResponse>({\n workspaceId,\n queryOptions,\n}: {\n workspaceId?: string;\n queryOptions?: MastraQueryOptions<ListSkillsResponse, TData>;\n} = {}): UseQueryResult<TData, Error> => {\n const client = useMastraClient();\n\n return useQuery<ListSkillsResponse, Error, TData>({\n queryKey: ['workspace', 'skills', workspaceId],\n queryFn: async (): Promise<ListSkillsResponse> => {\n if (!isWorkspaceV1Supported(client)) {\n throw new Error('Workspace v1 not supported by core or client');\n }\n if (!workspaceId) {\n throw new Error('workspaceId is required');\n }\n const workspace = (client as any).getWorkspace(workspaceId);\n return workspace.listSkills();\n },\n retry: shouldRetryWorkspaceQuery,\n ...queryOptions,\n enabled: isWorkspaceV1Supported(client) && (queryOptions?.enabled ?? true),\n });\n};\n\n// =============================================================================\n// Agent-Specific Skill Hook\n// =============================================================================\n\n/**\n * Hook to get a specific skill from an agent's workspace\n *\n * Does not guard on empty ids; pass `queryOptions: { enabled }` to skip the fetch.\n */\nexport const useAgentSkill = <TData = Skill>({\n agentId,\n skillName,\n workspaceId,\n path,\n queryOptions,\n}: {\n agentId: string;\n skillName: string;\n workspaceId?: string;\n path?: string;\n queryOptions?: MastraQueryOptions<Skill, TData>;\n}): UseQueryResult<TData, Error> => {\n const client = useMastraClient();\n\n return useQuery<Skill, Error, TData>({\n queryKey: ['agents', agentId, 'skills', skillName, path, workspaceId],\n queryFn: async (): Promise<Skill> => {\n if (!isWorkspaceV1Supported(client)) {\n throw new Error('Workspace v1 not supported by core or client');\n }\n if (!workspaceId) {\n throw new Error('workspaceId is required');\n }\n const workspace = (client as any).getWorkspace(workspaceId);\n const skill = workspace.getSkill(skillName, path);\n return skill.details();\n },\n retry: shouldRetryWorkspaceQuery,\n ...queryOptions,\n enabled: isWorkspaceV1Supported(client) && (queryOptions?.enabled ?? true),\n });\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/hooks/workspace/client-utils.ts","../../../src/hooks/workspace/compatibility.ts","../../../src/hooks/workspace/file-type.ts","../../../src/hooks/workspace/use-skills-sh.ts","../../../src/hooks/workspace/use-stored-workspaces.ts","../../../src/hooks/workspace/use-workspace.ts","../../../src/hooks/workspace/use-workspace-directory.ts","../../../src/hooks/workspace/use-workspace-file-content.ts","../../../src/hooks/workspace/use-workspace-search.ts","../../../src/hooks/workspace/use-workspace-skills.ts"],"sourcesContent":["/**\n * Checks if a method exists on an object and is callable.\n */\nexport function hasMethod<T>(obj: T, method: string): boolean {\n return method in (obj as object) && typeof (obj as Record<string, unknown>)[method] === 'function';\n}\n","import type { MastraClient } from '@mastra/client-js';\nimport { coreFeatures } from '@mastra/core/features';\nimport { isNonRetryableError } from '../query/query-utils';\nimport { hasMethod } from './client-utils';\n\n/**\n * Checks if workspace v1 features are supported by both core and client.\n * This guards against version mismatches between playground-ui, core, and client-js.\n */\nexport const isWorkspaceV1Supported = (client: MastraClient) => {\n const workspaceClientMethods = ['listWorkspaces', 'getWorkspace'];\n\n const coreSupported = coreFeatures.has('workspaces-v1');\n const clientSupported = workspaceClientMethods.every(method => hasMethod(client, method));\n\n return coreSupported && clientSupported;\n};\n\n/**\n * Gets the HTTP status code from an error if present.\n * Supports MastraClientError, fetch Response, and other HTTP client error formats.\n */\nconst getStatusCode = (error: unknown): number | undefined => {\n if (!error || typeof error !== 'object') return undefined;\n\n // Check for status property (MastraClientError, fetch Response, etc.)\n if ('status' in error && typeof (error as { status: unknown }).status === 'number') {\n return (error as { status: number }).status;\n }\n\n // Check for statusCode property (from some HTTP clients)\n if ('statusCode' in error && typeof (error as { statusCode: unknown }).statusCode === 'number') {\n return (error as { statusCode: number }).statusCode;\n }\n\n return undefined;\n};\n\n/**\n * Checks if an error has a specific HTTP status code.\n * Supports MastraClientError, fetch Response, and other HTTP client error formats.\n */\nconst hasStatusCode = (error: unknown, statusCode: number): boolean => {\n return getStatusCode(error) === statusCode;\n};\n\n/**\n * Checks if an error is a 4xx client error (e.g., 400, 401, 403, 404).\n * Client errors won't resolve with retries.\n */\nconst isClientError = (error: unknown): boolean => {\n const status = getStatusCode(error);\n return status !== undefined && status >= 400 && status < 500;\n};\n\n/**\n * Checks if an error is a \"Not Implemented\" (501) error from the server.\n * This indicates the server's @mastra/core version doesn't support workspaces.\n */\nexport const isWorkspaceNotSupportedError = (error: unknown): boolean => {\n if (hasStatusCode(error, 501)) {\n return true;\n }\n\n // Check error message for our specific error\n if (error && typeof error === 'object' && 'message' in error) {\n const message = (error as { message: string }).message;\n return message.includes('Workspace v1 not supported') || message.includes('501');\n }\n\n return false;\n};\n\n/**\n * Checks if an error is a \"Not Found\" (404) error from the server.\n * This indicates the requested resource doesn't exist (e.g., file not found).\n */\nexport const isNotFoundError = (error: unknown): boolean => {\n if (hasStatusCode(error, 404)) {\n return true;\n }\n\n // Check error message for status code (client-js throws Error with message like \"HTTP error! status: 404 - ...\")\n if (error && typeof error === 'object' && 'message' in error) {\n const message = (error as { message: string }).message;\n return message.includes('status: 404');\n }\n\n return false;\n};\n\n/**\n * React Query retry function that doesn't retry on client errors (4xx) or 501 errors.\n * Use this to prevent infinite retries when resources don't exist, access is denied, or workspaces aren't supported.\n */\nexport const shouldRetryWorkspaceQuery = (failureCount: number, error: Error): boolean => {\n // Don't retry 4xx client errors (400, 401, 403, 404, etc.) - these won't resolve with retries\n if (isClientError(error)) {\n return false;\n }\n // Don't retry 501 \"Not Implemented\" errors - they won't resolve with retries\n if (isWorkspaceNotSupportedError(error)) {\n return false;\n }\n // Don't retry 4xx client errors (400, 401, 403, 404)\n if (isNonRetryableError(error)) {\n return false;\n }\n // Default retry behavior: retry up to 3 times\n return failureCount < 3;\n};\n","const IMAGE_EXTENSIONS = ['png', 'jpg', 'jpeg', 'gif', 'svg', 'webp', 'bmp', 'avif', 'tiff', 'tif'];\nconst VIDEO_MIME_TYPES: Record<string, string> = {\n mp4: 'video/mp4',\n webm: 'video/webm',\n mov: 'video/quicktime',\n m4v: 'video/mp4',\n ogv: 'video/ogg',\n};\n\nconst extension = (path: string) => path.split('/').pop()?.split('.').pop()?.toLowerCase() ?? '';\n\nexport const isImageFile = (path: string, mimeType?: string) =>\n mimeType?.startsWith('image/') || IMAGE_EXTENSIONS.includes(extension(path));\n\nexport const isVideoFile = (path: string, mimeType?: string) =>\n mimeType?.startsWith('video/') || extension(path) in VIDEO_MIME_TYPES;\n\n/** Media must be read as base64: reading it as utf-8 corrupts the bytes. */\nexport const isMediaFile = (path: string) => isImageFile(path) || isVideoFile(path);\n\nexport const videoMimeType = (path: string, mimeType?: string) =>\n mimeType?.startsWith('video/') ? mimeType : (VIDEO_MIME_TYPES[extension(path)] ?? 'video/mp4');\n\nexport const isMarkdownFile = (path: string) => /\\.mdx?$/i.test(path);\n","import type { MastraClient, SkillsShSkill } from '@mastra/client-js';\nimport type { UseMutationResult, UseQueryResult } from '@tanstack/react-query';\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';\nimport { useMastraClient } from '../../mastra-client-context';\nimport type { MastraMutationOptions, MastraQueryOptions } from '../shared/query-options';\n\nexport type { SkillsShSkill };\n\ntype SearchSkillsShResponse = Awaited<ReturnType<ReturnType<MastraClient['getWorkspace']>['searchSkillsSh']>>;\ntype PopularSkillsShResponse = Awaited<ReturnType<ReturnType<MastraClient['getWorkspace']>['listPopularSkillsSh']>>;\ntype InstallSkillsShResponse = Awaited<ReturnType<ReturnType<MastraClient['getWorkspace']>['installSkillsSh']>>;\ntype UpdateSkillsShResponse = Awaited<ReturnType<ReturnType<MastraClient['getWorkspace']>['updateSkillsSh']>>;\ntype RemoveSkillsShResponse = Awaited<ReturnType<ReturnType<MastraClient['getWorkspace']>['removeSkillsSh']>>;\n\n/**\n * Search skills on skills.sh (via server proxy)\n */\nexport const useSearchSkillsSh = ({\n workspaceId,\n queryOptions,\n}: {\n workspaceId: string | undefined;\n queryOptions?: MastraMutationOptions<SearchSkillsShResponse, string>;\n}): UseMutationResult<SearchSkillsShResponse, Error, string> => {\n const client = useMastraClient();\n\n return useMutation<SearchSkillsShResponse, Error, string>({\n mutationFn: (query: string) => {\n if (!workspaceId) throw new Error('Workspace ID is required');\n return client.getWorkspace(workspaceId).searchSkillsSh({ q: query, limit: 10 });\n },\n ...queryOptions,\n });\n};\n\n/**\n * Get popular skills from skills.sh (via server proxy, cached for 5 minutes)\n *\n * Does not guard on empty ids; pass `queryOptions: { enabled }` to skip the fetch.\n */\nexport const usePopularSkillsSh = <TData = PopularSkillsShResponse>({\n workspaceId,\n queryOptions,\n}: {\n workspaceId: string | undefined;\n queryOptions?: MastraQueryOptions<PopularSkillsShResponse, TData>;\n}): UseQueryResult<TData, Error> => {\n const client = useMastraClient();\n\n return useQuery<PopularSkillsShResponse, Error, TData>({\n queryKey: ['skills-sh', 'popular', workspaceId],\n queryFn: () => {\n if (!workspaceId) throw new Error('Workspace ID is required');\n return client.getWorkspace(workspaceId).listPopularSkillsSh({ limit: 10, offset: 0 });\n },\n staleTime: 5 * 60 * 1000,\n ...queryOptions,\n });\n};\n\n/**\n * Preview a skill by fetching its SKILL.md (via server proxy to avoid CORS)\n *\n * Does not guard on empty ids; pass `queryOptions: { enabled }` to skip the fetch.\n */\nexport const useSkillPreview = <TData = string>({\n workspaceId,\n owner,\n repo,\n skillPath,\n queryOptions,\n}: {\n workspaceId: string | undefined;\n owner: string | undefined;\n repo: string | undefined;\n skillPath: string | undefined;\n queryOptions?: MastraQueryOptions<string, TData>;\n}): UseQueryResult<TData, Error> => {\n const client = useMastraClient();\n\n return useQuery<string, Error, TData>({\n queryKey: ['skills-sh', 'preview', workspaceId, owner, repo, skillPath],\n queryFn: async () => {\n if (!workspaceId || !owner || !repo || !skillPath) {\n throw new Error('workspaceId, owner, repo, and skillPath are required');\n }\n const { content } = await client.getWorkspace(workspaceId).previewSkillsSh({ owner, repo, path: skillPath });\n return content;\n },\n retry: false,\n ...queryOptions,\n });\n};\n\n// =============================================================================\n// Helper: Parse skills.sh skill ID to repository info\n// =============================================================================\n\n/**\n * Parse a skill's topSource field to extract GitHub repository info\n *\n * skills.sh topSource formats:\n * - \"owner/repo\" (e.g., \"vercel-labs/agent-skills\")\n * - \"owner/repo/path\" (e.g., \"anthropics/skills/frontend-design\")\n * - \"github.com/owner/repo/path\" (full URL format)\n *\n * The skill name is used as the path within the repo when not specified\n */\nexport function parseSkillSource(\n topSource: string,\n skillName?: string,\n): {\n owner: string;\n repo: string;\n skillPath: string;\n} | null {\n // Remove protocol and github.com prefix if present\n let cleanSource = topSource.replace(/^https?:\\/\\//, '');\n cleanSource = cleanSource.replace(/^github\\.com\\//, '');\n // Remove trailing slash if present\n cleanSource = cleanSource.replace(/\\/$/, '');\n\n const parts = cleanSource.split('/').filter(Boolean);\n const [owner, repo] = parts;\n\n if (!owner || !repo) {\n return null;\n }\n\n // If there's a path in topSource, use it; otherwise use skill name\n let skillPath: string;\n if (parts.length > 2) {\n // Path is specified in topSource (e.g., \"anthropics/skills/frontend-design\")\n skillPath = parts.slice(2).join('/');\n } else if (skillName) {\n // No path in topSource, use skill name (e.g., for \"vercel-labs/agent-skills\" + skill \"web-design-guidelines\")\n skillPath = skillName;\n } else {\n return null;\n }\n\n return {\n owner,\n repo,\n skillPath,\n };\n}\n\n// =============================================================================\n// Skill Management Hooks (via server proxy)\n// =============================================================================\n\nexport interface InstallSkillParams {\n workspaceId: string;\n /** Repository in format owner/repo */\n repository: string;\n /** Skill name within the repo */\n skillName: string;\n /** Mount path to install into (for CompositeFilesystem) */\n mount?: string;\n}\n\n/**\n * Install a skill by fetching from GitHub and writing to workspace filesystem.\n */\nexport const useInstallSkill = ({\n queryOptions,\n}: { queryOptions?: MastraMutationOptions<InstallSkillsShResponse, InstallSkillParams> } = {}) => {\n const client = useMastraClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (params: InstallSkillParams) => {\n const [owner, repo] = params.repository.split('/');\n if (!owner || !repo) {\n throw new Error('Invalid repository format. Expected owner/repo');\n }\n return client\n .getWorkspace(params.workspaceId)\n .installSkillsSh({ owner, repo, skillName: params.skillName, mount: params.mount });\n },\n onSuccess: (_, variables) => {\n void queryClient.invalidateQueries({ queryKey: ['workspace', 'skills', variables.workspaceId] });\n },\n ...queryOptions,\n });\n};\n\nexport interface UpdateSkillsParams {\n workspaceId: string;\n skillName?: string;\n}\n\n/**\n * Update installed skills by re-fetching from GitHub.\n */\nexport const useUpdateSkills = ({\n queryOptions,\n}: { queryOptions?: MastraMutationOptions<UpdateSkillsShResponse, UpdateSkillsParams> } = {}) => {\n const client = useMastraClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (params: UpdateSkillsParams) =>\n client.getWorkspace(params.workspaceId).updateSkillsSh({ skillName: params.skillName }),\n onSuccess: (_, variables) => {\n void queryClient.invalidateQueries({ queryKey: ['workspace', 'skills', variables.workspaceId] });\n },\n ...queryOptions,\n });\n};\n\nexport interface RemoveSkillParams {\n workspaceId: string;\n skillName: string;\n}\n\n/**\n * Remove an installed skill by deleting its directory.\n */\nexport const useRemoveSkill = ({\n queryOptions,\n}: { queryOptions?: MastraMutationOptions<RemoveSkillsShResponse, RemoveSkillParams> } = {}) => {\n const client = useMastraClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (params: RemoveSkillParams) =>\n client.getWorkspace(params.workspaceId).removeSkillsSh({ skillName: params.skillName }),\n onSuccess: (_, variables) => {\n void queryClient.invalidateQueries({ queryKey: ['workspace', 'skills', variables.workspaceId] });\n },\n ...queryOptions,\n });\n};\n","import type { ListStoredWorkspacesParams, ListStoredWorkspacesResponse } from '@mastra/client-js';\nimport type { UseQueryResult } from '@tanstack/react-query';\nimport { useQuery } from '@tanstack/react-query';\nimport { useMastraClient } from '../../mastra-client-context';\nimport type { MastraQueryOptions } from '../shared/query-options';\n\n/**\n * Hook to list stored workspaces from the database.\n * These are workspaces that have been persisted via the stored workspaces API,\n * as opposed to runtime-registered workspaces from code-defined agents.\n */\nexport const useStoredWorkspaces = <TData = ListStoredWorkspacesResponse>({\n queryOptions,\n ...params\n}: ListStoredWorkspacesParams & {\n queryOptions?: MastraQueryOptions<ListStoredWorkspacesResponse, TData>;\n} = {}): UseQueryResult<TData, Error> => {\n const client = useMastraClient();\n\n return useQuery<ListStoredWorkspacesResponse, Error, TData>({\n queryKey: ['stored-workspaces', params],\n queryFn: async (): Promise<ListStoredWorkspacesResponse> => {\n return client.listStoredWorkspaces(params);\n },\n ...queryOptions,\n });\n};\n","import type { UseQueryResult } from '@tanstack/react-query';\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useMastraClient } from '../../mastra-client-context';\nimport type { MastraMutationOptions, MastraQueryOptions } from '../shared/query-options';\nimport { isWorkspaceV1Supported, shouldRetryWorkspaceQuery, isWorkspaceNotSupportedError } from './compatibility';\nimport type {\n WorkspaceInfo,\n WorkspacesListResponse,\n FileStatResponse,\n WriteFileParams,\n WriteFileFromFileParams,\n} from './types';\n\nexport type DeleteWorkspaceFileParams = { path: string; recursive?: boolean; force?: boolean; workspaceId?: string };\nexport type CreateWorkspaceDirectoryParams = { path: string; recursive?: boolean; workspaceId?: string };\nexport type IndexWorkspaceContentParams = {\n workspaceId: string;\n path: string;\n content: string;\n metadata?: Record<string, unknown>;\n};\n\nfunction getParentPath(path: string): string {\n return path.split('/').slice(0, -1).join('/') || (path.startsWith('/') ? '/' : '.');\n}\n\n// Re-export for other hooks to use\nexport { isWorkspaceV1Supported, isWorkspaceNotSupportedError };\n\n// =============================================================================\n// Workspace Info Hook\n// =============================================================================\n\n/**\n * Does not guard on empty ids; pass `queryOptions: { enabled }` to skip the fetch.\n */\nexport const useWorkspaceInfo = <TData = WorkspaceInfo>({\n workspaceId,\n queryOptions,\n}: {\n workspaceId?: string;\n queryOptions?: MastraQueryOptions<WorkspaceInfo, TData>;\n} = {}): UseQueryResult<TData, Error> => {\n const client = useMastraClient();\n\n return useQuery<WorkspaceInfo, Error, TData>({\n queryKey: ['workspace', 'info', workspaceId],\n queryFn: async (): Promise<WorkspaceInfo> => {\n if (!isWorkspaceV1Supported(client)) {\n throw new Error('Workspace v1 not supported by core or client');\n }\n if (!workspaceId) {\n throw new Error('workspaceId is required');\n }\n const workspace = (client as any).getWorkspace(workspaceId);\n return workspace.info();\n },\n retry: shouldRetryWorkspaceQuery,\n ...queryOptions,\n enabled: isWorkspaceV1Supported(client) && (queryOptions?.enabled ?? true),\n });\n};\n\n// =============================================================================\n// List All Workspaces Hook\n// =============================================================================\n\nexport const useWorkspaces = <TData = WorkspacesListResponse>({\n queryOptions,\n}: { queryOptions?: MastraQueryOptions<WorkspacesListResponse, TData> } = {}): UseQueryResult<TData, Error> => {\n const client = useMastraClient();\n\n return useQuery<WorkspacesListResponse, Error, TData>({\n queryKey: ['workspaces'],\n queryFn: async (): Promise<WorkspacesListResponse> => {\n if (!isWorkspaceV1Supported(client)) {\n throw new Error('Workspace v1 not supported by core or client');\n }\n return (client as any).listWorkspaces();\n },\n retry: shouldRetryWorkspaceQuery,\n ...queryOptions,\n });\n};\n\n// =============================================================================\n// Filesystem Hooks\n// =============================================================================\n\n/**\n * Does not guard on empty ids; pass `queryOptions: { enabled }` to skip the fetch.\n */\nexport const useWorkspaceFileStat = <TData = FileStatResponse>({\n path,\n workspaceId,\n queryOptions,\n}: {\n path: string;\n workspaceId?: string;\n queryOptions?: MastraQueryOptions<FileStatResponse, TData>;\n}): UseQueryResult<TData, Error> => {\n const client = useMastraClient();\n\n return useQuery<FileStatResponse, Error, TData>({\n queryKey: ['workspace', 'stat', path, workspaceId],\n queryFn: async (): Promise<FileStatResponse> => {\n if (!isWorkspaceV1Supported(client)) {\n throw new Error('Workspace v1 not supported by core or client');\n }\n if (!workspaceId) {\n throw new Error('workspaceId is required');\n }\n const workspace = (client as any).getWorkspace(workspaceId);\n return workspace.stat(path);\n },\n retry: shouldRetryWorkspaceQuery,\n ...queryOptions,\n enabled: isWorkspaceV1Supported(client) && (queryOptions?.enabled ?? true),\n });\n};\n\nexport const useWriteWorkspaceFile = ({\n queryOptions,\n}: { queryOptions?: MastraMutationOptions<unknown, WriteFileParams> } = {}) => {\n const client = useMastraClient();\n const queryClient = useQueryClient();\n\n return useMutation<unknown, Error, WriteFileParams>({\n mutationFn: async (params: WriteFileParams) => {\n if (!isWorkspaceV1Supported(client)) {\n throw new Error('Workspace v1 not supported by core or client');\n }\n const workspace = (client as any).getWorkspace(params.workspaceId);\n return workspace.writeFile(params.path, params.content, {\n encoding: params.encoding,\n recursive: params.recursive ?? true,\n });\n },\n onSuccess: (_, variables) => {\n const parentPath = getParentPath(variables.path);\n void queryClient.invalidateQueries({ queryKey: ['workspace', 'files', parentPath] });\n void queryClient.invalidateQueries({ queryKey: ['workspace', 'file', variables.path] });\n },\n ...queryOptions,\n });\n};\n\nexport const useWriteWorkspaceFileFromFile = ({\n queryOptions,\n}: { queryOptions?: MastraMutationOptions<unknown, WriteFileFromFileParams> } = {}) => {\n const client = useMastraClient();\n const queryClient = useQueryClient();\n\n return useMutation<unknown, Error, WriteFileFromFileParams>({\n mutationFn: async (params: WriteFileFromFileParams) => {\n if (!isWorkspaceV1Supported(client)) {\n throw new Error('Workspace v1 not supported by core or client');\n }\n // Convert file to base64\n const arrayBuffer = await params.file.arrayBuffer();\n const base64 = btoa(new Uint8Array(arrayBuffer).reduce((data, byte) => data + String.fromCharCode(byte), ''));\n\n const workspace = (client as any).getWorkspace(params.workspaceId);\n return workspace.writeFile(params.path, base64, {\n encoding: 'base64',\n recursive: params.recursive ?? true,\n });\n },\n onSuccess: (_, variables) => {\n const parentPath = getParentPath(variables.path);\n void queryClient.invalidateQueries({ queryKey: ['workspace', 'files', parentPath] });\n void queryClient.invalidateQueries({ queryKey: ['workspace', 'file', variables.path] });\n },\n ...queryOptions,\n });\n};\n\nexport const useDeleteWorkspaceFile = ({\n queryOptions,\n}: { queryOptions?: MastraMutationOptions<unknown, DeleteWorkspaceFileParams> } = {}) => {\n const client = useMastraClient();\n const queryClient = useQueryClient();\n\n return useMutation<unknown, Error, DeleteWorkspaceFileParams>({\n mutationFn: async (params: DeleteWorkspaceFileParams) => {\n if (!isWorkspaceV1Supported(client)) {\n throw new Error('Workspace v1 not supported by core or client');\n }\n const workspace = (client as any).getWorkspace(params.workspaceId);\n return workspace.delete(params.path, {\n recursive: params.recursive,\n force: params.force,\n });\n },\n onSuccess: (_, variables) => {\n const parentPath = getParentPath(variables.path);\n void queryClient.invalidateQueries({ queryKey: ['workspace', 'files', parentPath] });\n void queryClient.invalidateQueries({ queryKey: ['workspace', 'file', variables.path] });\n },\n ...queryOptions,\n });\n};\n\nexport const useCreateWorkspaceDirectory = ({\n queryOptions,\n}: { queryOptions?: MastraMutationOptions<unknown, CreateWorkspaceDirectoryParams> } = {}) => {\n const client = useMastraClient();\n const queryClient = useQueryClient();\n\n return useMutation<unknown, Error, CreateWorkspaceDirectoryParams>({\n mutationFn: async (params: CreateWorkspaceDirectoryParams) => {\n if (!isWorkspaceV1Supported(client)) {\n throw new Error('Workspace v1 not supported by core or client');\n }\n const workspace = (client as any).getWorkspace(params.workspaceId);\n return workspace.mkdir(params.path, params.recursive);\n },\n onSuccess: (_, variables) => {\n const parentPath = getParentPath(variables.path);\n void queryClient.invalidateQueries({ queryKey: ['workspace', 'files', parentPath] });\n },\n ...queryOptions,\n });\n};\n\n// =============================================================================\n// Search Hooks\n// =============================================================================\n\nexport const useIndexWorkspaceContent = ({\n queryOptions,\n}: { queryOptions?: MastraMutationOptions<unknown, IndexWorkspaceContentParams> } = {}) => {\n const client = useMastraClient();\n\n return useMutation<unknown, Error, IndexWorkspaceContentParams>({\n mutationFn: async (params: IndexWorkspaceContentParams) => {\n if (!isWorkspaceV1Supported(client)) {\n throw new Error('Workspace v1 not supported by core or client');\n }\n const workspace = (client as any).getWorkspace(params.workspaceId);\n return workspace.index({\n path: params.path,\n content: params.content,\n metadata: params.metadata,\n });\n },\n ...queryOptions,\n });\n};\n","import type { MastraClient } from '@mastra/client-js';\nimport type { UseQueryResult } from '@tanstack/react-query';\nimport { useQuery } from '@tanstack/react-query';\nimport { useMastraClient } from '../../mastra-client-context';\nimport type { MastraQueryOptions } from '../shared/query-options';\n\nexport const WORKSPACE_REFETCH_INTERVAL = 10_000;\n\n/** Lists a single directory level and polls it. Callers enable it only once the folder is expanded. */\ntype WorkspaceDirectoryEntries = Awaited<ReturnType<ReturnType<MastraClient['getWorkspace']>['listFiles']>>['entries'];\n\nexport function useWorkspaceDirectory<TData = WorkspaceDirectoryEntries>({\n workspaceId,\n path,\n queryOptions,\n}: {\n workspaceId: string;\n path: string;\n queryOptions?: MastraQueryOptions<WorkspaceDirectoryEntries, TData>;\n}): UseQueryResult<TData, Error> {\n const client = useMastraClient();\n\n return useQuery<WorkspaceDirectoryEntries, Error, TData>({\n queryKey: ['workspace', workspaceId, 'fs', 'list', path],\n queryFn: async () => (await client.getWorkspace(workspaceId).listFiles(path, false)).entries,\n refetchInterval: WORKSPACE_REFETCH_INTERVAL,\n ...queryOptions,\n });\n}\n","import type { MastraClient } from '@mastra/client-js';\nimport type { UseQueryResult } from '@tanstack/react-query';\nimport { useQuery } from '@tanstack/react-query';\nimport { useMastraClient } from '../../mastra-client-context';\nimport type { MastraQueryOptions } from '../shared/query-options';\nimport { isMediaFile } from './file-type';\nimport { WORKSPACE_REFETCH_INTERVAL } from './use-workspace-directory';\n\n/** Reads a file (base64 for images/videos) and polls it so the viewer follows external edits. */\ntype WorkspaceFileContent = Awaited<ReturnType<ReturnType<MastraClient['getWorkspace']>['readFile']>>;\n\n/**\n * Does not guard on empty ids; pass `queryOptions: { enabled }` to skip the fetch.\n */\nexport function useWorkspaceFileContent<TData = WorkspaceFileContent>({\n workspaceId,\n path,\n queryOptions,\n}: {\n workspaceId: string;\n path?: string;\n queryOptions?: MastraQueryOptions<WorkspaceFileContent, TData>;\n}): UseQueryResult<TData, Error> {\n const client = useMastraClient();\n const encoding = path && isMediaFile(path) ? 'base64' : undefined;\n\n return useQuery<WorkspaceFileContent, Error, TData>({\n queryKey: ['workspace', workspaceId, 'fs', 'read', path, encoding],\n queryFn: () => client.getWorkspace(workspaceId).readFile(path ?? '', encoding),\n refetchInterval: WORKSPACE_REFETCH_INTERVAL,\n ...queryOptions,\n });\n}\n","import type { SkillSearchResult } from '@mastra/client-js';\nimport type { UseQueryResult } from '@tanstack/react-query';\nimport { useQuery } from '@tanstack/react-query';\nimport { useMastraClient } from '../../mastra-client-context';\nimport type { MastraQueryOptions } from '../shared/query-options';\n\nexport interface WorkspaceSearchHit {\n kind: 'file' | 'skill';\n path: string;\n label: string;\n score: number;\n}\n\n// Chunked files are indexed as `<path>#chunk-<n>`.\nconst filePathFromId = (id: string) => id.replace(/#chunk-\\d+$/, '');\n\nconst basename = (path: string) => path.split('/').filter(Boolean).pop() ?? path;\n\n// The server returns `skillPath`, which the client type does not declare yet.\nconst skillFilePath = (result: SkillSearchResult & { skillPath?: string }) =>\n result.skillPath ? `${result.skillPath.replace(/\\/$/, '')}/SKILL.md` : result.source;\n\n/** Searches files and skills in parallel; one failing source (e.g. 501 not configured) keeps the other's hits. */\n/**\n * Does not guard on empty ids; pass `queryOptions: { enabled }` to skip the fetch.\n */\nexport function useWorkspaceSearch<TData = WorkspaceSearchHit[]>({\n workspaceId,\n query,\n files: searchFiles = true,\n skills: searchSkills = true,\n queryOptions,\n}: {\n workspaceId: string;\n query: string;\n files?: boolean;\n skills?: boolean;\n queryOptions?: MastraQueryOptions<WorkspaceSearchHit[], TData>;\n}): UseQueryResult<TData, Error> {\n const client = useMastraClient();\n const trimmed = query.trim();\n\n return useQuery<WorkspaceSearchHit[], Error, TData>({\n queryKey: ['workspace', workspaceId, 'search', trimmed, searchFiles, searchSkills],\n queryFn: async () => {\n const workspace = client.getWorkspace(workspaceId);\n const [files, skills] = await Promise.allSettled([\n searchFiles ? workspace.search({ query: trimmed }) : Promise.reject(new Error('File search disabled')),\n searchSkills ? workspace.searchSkills({ query: trimmed }) : Promise.reject(new Error('Skill search disabled')),\n ]);\n\n if (files.status === 'rejected' && skills.status === 'rejected') {\n throw (searchFiles ? files : skills).reason;\n }\n\n const hits = new Map<string, WorkspaceSearchHit>();\n const add = (hit: WorkspaceSearchHit) => {\n const existing = hits.get(hit.path);\n if (!existing || existing.score < hit.score) hits.set(hit.path, hit);\n };\n\n if (files.status === 'fulfilled') {\n for (const result of files.value.results) {\n const path = filePathFromId(result.id);\n add({ kind: 'file', path, label: basename(path), score: result.score });\n }\n }\n if (skills.status === 'fulfilled') {\n for (const result of skills.value.results) {\n add({\n kind: 'skill',\n path: skillFilePath(result),\n label: result.skillName,\n score: result.score,\n });\n }\n }\n\n return [...hits.values()].sort((a, b) => b.score - a.score);\n },\n ...queryOptions,\n });\n}\n","import type { UseQueryResult } from '@tanstack/react-query';\nimport { useQuery } from '@tanstack/react-query';\nimport { useMastraClient } from '../../mastra-client-context';\nimport type { MastraQueryOptions } from '../shared/query-options';\nimport { isWorkspaceV1Supported, shouldRetryWorkspaceQuery } from './compatibility';\nimport type { Skill, ListSkillsResponse } from './types';\n\n// =============================================================================\n// Skills Hooks (via Workspace API)\n// =============================================================================\n\n/**\n * Does not guard on empty ids; pass `queryOptions: { enabled }` to skip the fetch.\n */\nexport const useWorkspaceSkills = <TData = ListSkillsResponse>({\n workspaceId,\n queryOptions,\n}: {\n workspaceId?: string;\n queryOptions?: MastraQueryOptions<ListSkillsResponse, TData>;\n} = {}): UseQueryResult<TData, Error> => {\n const client = useMastraClient();\n\n return useQuery<ListSkillsResponse, Error, TData>({\n queryKey: ['workspace', 'skills', workspaceId],\n queryFn: async (): Promise<ListSkillsResponse> => {\n if (!isWorkspaceV1Supported(client)) {\n throw new Error('Workspace v1 not supported by core or client');\n }\n if (!workspaceId) {\n throw new Error('workspaceId is required');\n }\n const workspace = (client as any).getWorkspace(workspaceId);\n return workspace.listSkills();\n },\n retry: shouldRetryWorkspaceQuery,\n ...queryOptions,\n enabled: isWorkspaceV1Supported(client) && (queryOptions?.enabled ?? true),\n });\n};\n\n// =============================================================================\n// Agent-Specific Skill Hook\n// =============================================================================\n\n/**\n * Hook to get a specific skill from an agent's workspace\n *\n * Does not guard on empty ids; pass `queryOptions: { enabled }` to skip the fetch.\n */\nexport const useAgentSkill = <TData = Skill>({\n agentId,\n skillName,\n workspaceId,\n path,\n queryOptions,\n}: {\n agentId: string;\n skillName: string;\n workspaceId?: string;\n path?: string;\n queryOptions?: MastraQueryOptions<Skill, TData>;\n}): UseQueryResult<TData, Error> => {\n const client = useMastraClient();\n\n return useQuery<Skill, Error, TData>({\n queryKey: ['agents', agentId, 'skills', skillName, path, workspaceId],\n queryFn: async (): Promise<Skill> => {\n if (!isWorkspaceV1Supported(client)) {\n throw new Error('Workspace v1 not supported by core or client');\n }\n if (!workspaceId) {\n throw new Error('workspaceId is required');\n }\n const workspace = (client as any).getWorkspace(workspaceId);\n const skill = workspace.getSkill(skillName, path);\n return skill.details();\n },\n retry: shouldRetryWorkspaceQuery,\n ...queryOptions,\n enabled: isWorkspaceV1Supported(client) && (queryOptions?.enabled ?? true),\n });\n};\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  const require_mastra_client_context = require("./mastra-client-context-DzX3f0RF.cjs");
2
- const require_accumulator = require("./accumulator-BQGsraqS.cjs");
2
+ const require_accumulator = require("./accumulator-BmD8-x9I.cjs");
3
3
  let _mastra_client_js = require("@mastra/client-js");
4
4
  let react = require("react");
5
5
  let _lukeed_uuid = require("@lukeed/uuid");
@@ -779,8 +779,10 @@ const useChat = ({ agentId, resourceId, threadId, initialMessages, requestContex
779
779
  _streamAbortRef.current?.abort();
780
780
  const internalAbort = new AbortController();
781
781
  _streamAbortRef.current = internalAbort;
782
- if (signal) if (signal.aborted) internalAbort.abort();
783
- else signal.addEventListener("abort", () => internalAbort.abort(), { once: true });
782
+ if (signal) {
783
+ if (signal.aborted) internalAbort.abort();
784
+ else signal.addEventListener("abort", () => internalAbort.abort(), { once: true });
785
+ }
784
786
  const agent = new _mastra_client_js.MastraClient({
785
787
  ...baseClient.options,
786
788
  abortSignal: internalAbort.signal
@@ -1281,4 +1283,4 @@ Object.defineProperty(exports, "useChat", {
1281
1283
  }
1282
1284
  });
1283
1285
 
1284
- //# sourceMappingURL=hooks-CIutb3DO.cjs.map
1286
+ //# sourceMappingURL=hooks-C6CJtoOR.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks-C6CJtoOR.cjs","names":["encodeFilePartDataForStorage","exhaustiveCheck","isDataChunk","isRecord","CLIENT_MESSAGE_ID_KEY","isRecord","CLIENT_MESSAGE_ID_KEY","AIV5Adapter","useRef","useState","useMastraClient","convertSignalDataToBase64String","useCallback","accumulateChunk","MastraClient","uuid","accumulateNetworkChunk","finishStreamingAssistantMessage"],"sources":["../src/lib/mastra-db/fromCoreUserMessage.ts","../src/agent/extract-tasks.ts","../src/agent/extractRunIdFromMessages.ts","../src/agent/merge-history.ts","../src/agent/user-message.ts","../src/agent/hooks.ts"],"sourcesContent":["import type { MastraDBMessage, MastraMessagePart } from '@mastra/core/agent/message-list';\nimport type { CoreUserMessage } from '@mastra/core/llm';\nimport { encodeFilePartDataForStorage } from '../../agent/signal-data';\n\n/**\n * Convert a CoreUserMessage into a canonical `MastraDBMessage` (`format: 2`).\n *\n * Image and file inputs are emitted as the canonical V4 `file` part shape\n * (`{ type: 'file', mimeType, data }`) — the exact shape memory resolves on\n * reload (see `AIV4Adapter`), so optimistic-send and reload render identically.\n *\n * Handles all CoreUserMessage content types:\n * - String content → single text part\n * - Array content with text/image/file parts → corresponding `MastraMessagePart`s\n */\nconst coreUserMessageToParts = (coreUserMessage: CoreUserMessage): MastraMessagePart[] =>\n typeof coreUserMessage.content === 'string'\n ? [{ type: 'text' as const, text: coreUserMessage.content }]\n : coreUserMessage.content.map((part): MastraMessagePart => {\n switch (part.type) {\n case 'text': {\n return { type: 'text' as const, text: part.text };\n }\n case 'image': {\n const mimeType = part.mimeType ?? 'image/*';\n return {\n type: 'file' as const,\n mimeType,\n data: encodeFilePartDataForStorage(part.image, mimeType),\n };\n }\n case 'file': {\n return {\n type: 'file' as const,\n mimeType: part.mimeType,\n data: encodeFilePartDataForStorage(part.data, part.mimeType),\n ...(part.filename !== undefined ? { filename: part.filename } : {}),\n };\n }\n default: {\n const exhaustiveCheck: never = part;\n throw new Error(`Unhandled content part type: ${(exhaustiveCheck as { type: string }).type}`);\n }\n }\n });\n\nconst newUserMessage = (parts: MastraMessagePart[]): MastraDBMessage => ({\n id: `user-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`,\n role: 'user',\n createdAt: new Date(),\n content: {\n format: 2,\n parts,\n },\n});\n\nexport const fromCoreUserMessageToMastraDBMessage = (coreUserMessage: CoreUserMessage): MastraDBMessage =>\n newUserMessage(coreUserMessageToParts(coreUserMessage));\n\n/**\n * Merge multiple `CoreUserMessage`s into a single canonical `MastraDBMessage`.\n *\n * A user turn that carries attachments arrives as several `CoreUserMessage`s\n * (one for the text, one per attachment). Flatten their parts for the optimistic\n * display. The send path must also submit a single multipart message: this\n * display conversion alone cannot combine separately persisted messages.\n */\nexport const fromCoreUserMessagesToMastraDBMessage = (coreUserMessages: CoreUserMessage[]): MastraDBMessage =>\n newUserMessage(coreUserMessages.flatMap(coreUserMessageToParts));\n","import type { MastraDBMessage } from '@mastra/core/agent/message-list';\nimport type { TaskItem } from '@mastra/core/signals';\nimport type { ChunkType, DataChunkType } from '@mastra/core/stream';\n\nexport const TASK_TOOL_NAMES = new Set(['task_write', 'task_update', 'task_complete', 'task_check']);\nconst TASK_SIGNAL_ID = 'tasks';\nconst TASK_TAG_NAMES = new Set(['current-task-list', 'task-list-update']);\nconst TASK_STATUSES = new Set(['pending', 'in_progress', 'completed']);\n\ntype DataChunk = Extract<ChunkType, DataChunkType>;\n\nconst isDataChunk = (chunk: ChunkType): chunk is DataChunk =>\n typeof chunk.type === 'string' && chunk.type.startsWith('data-');\n\nexport const isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\nconst isTaskStatus = (value: unknown): value is TaskItem['status'] =>\n typeof value === 'string' && TASK_STATUSES.has(value);\n\nexport const isTaskItemArray = (value: unknown): value is TaskItem[] =>\n Array.isArray(value) &&\n value.every(\n item =>\n isRecord(item) &&\n typeof item.id === 'string' &&\n typeof item.content === 'string' &&\n isTaskStatus(item.status) &&\n typeof item.activeForm === 'string',\n );\n\nconst isTaskSignal = (value: unknown): boolean => {\n if (!isRecord(value)) return false;\n return value.id === TASK_SIGNAL_ID || (typeof value.tagName === 'string' && TASK_TAG_NAMES.has(value.tagName));\n};\n\nconst extractTasksFromSignalData = (data: unknown): TaskItem[] | undefined => {\n if (!isTaskSignal(data) || !isRecord(data)) return undefined;\n const metadata = data.metadata;\n if (!isRecord(metadata)) return undefined;\n const value = metadata.value;\n if (!isRecord(value)) return undefined;\n return isTaskItemArray(value.tasks) ? value.tasks : undefined;\n};\n\nconst parseTasksFromResult = (raw: unknown): TaskItem[] | undefined => {\n if (isRecord(raw) && isTaskItemArray(raw.tasks)) return raw.tasks;\n\n if (typeof raw !== 'string') return undefined;\n\n try {\n const parsed: unknown = JSON.parse(raw);\n return isRecord(parsed) && isTaskItemArray(parsed.tasks) ? parsed.tasks : undefined;\n } catch {\n return undefined;\n }\n};\n\nexport const extractTasksFromSignalChunk = (chunk: ChunkType): TaskItem[] | undefined => {\n if (!isDataChunk(chunk)) return undefined;\n return extractTasksFromSignalData(chunk.data);\n};\n\nexport const extractTasksFromToolResultChunk = (chunk: ChunkType): TaskItem[] | undefined => {\n if (chunk.type !== 'tool-result') return undefined;\n const payload = chunk.payload;\n if (!isRecord(payload) || typeof payload.toolName !== 'string' || !TASK_TOOL_NAMES.has(payload.toolName)) {\n return undefined;\n }\n return parseTasksFromResult(payload.result);\n};\n\nconst extractTasksFromToolInvocationPart = (part: unknown): TaskItem[] | undefined => {\n if (!isRecord(part) || part.type !== 'tool-invocation' || !isRecord(part.toolInvocation)) return undefined;\n const toolInvocation = part.toolInvocation;\n if (typeof toolInvocation.toolName !== 'string' || !TASK_TOOL_NAMES.has(toolInvocation.toolName)) return undefined;\n return parseTasksFromResult(toolInvocation.result);\n};\n\nconst extractTasksFromDataPart = (part: unknown): TaskItem[] | undefined => {\n if (!isRecord(part) || typeof part.type !== 'string' || !part.type.startsWith('data-')) return undefined;\n return extractTasksFromSignalData(part.data);\n};\n\nconst extractTasksFromSignalMessage = (message: MastraDBMessage): TaskItem[] | undefined => {\n if (message.role !== 'signal') return undefined;\n const metadata = message.content?.metadata;\n if (!isRecord(metadata)) return undefined;\n return extractTasksFromSignalData(metadata.signal);\n};\n\nexport const extractLatestTasksFromMessages = (messages: MastraDBMessage[]): TaskItem[] => {\n let latest: TaskItem[] | undefined;\n\n for (const message of messages) {\n for (const part of message.content?.parts ?? []) {\n const toolTasks = extractTasksFromToolInvocationPart(part);\n if (toolTasks !== undefined) latest = toolTasks;\n }\n\n const signalTasks = extractTasksFromSignalMessage(message);\n if (signalTasks !== undefined) latest = signalTasks;\n\n for (const part of message.content?.parts ?? []) {\n const dataTasks = extractTasksFromDataPart(part);\n if (dataTasks !== undefined) latest = dataTasks;\n }\n }\n\n return latest ?? [];\n};\n","import type { MastraDBMessage } from '@mastra/core/agent/message-list';\n\ntype RunIdMetadataEntry = { runId?: unknown };\ntype RunIdMetadataSource = Record<string, RunIdMetadataEntry>;\n\nconst isRecord = (value: unknown): value is Record<string, unknown> => value !== null && typeof value === 'object';\n\nconst runIdMetadataKeys = ['pendingToolApprovals', 'requireApprovalMetadata', 'suspendedTools'] as const;\n\nconst isRunIdMetadataSource = (value: unknown): value is RunIdMetadataSource =>\n isRecord(value) && Object.values(value).every(entry => isRecord(entry));\n\nconst getRunIdMetadataSources = (metadata: unknown): RunIdMetadataSource[] => {\n if (!isRecord(metadata)) return [];\n\n const sources: RunIdMetadataSource[] = [];\n for (const key of runIdMetadataKeys) {\n const source = metadata[key];\n if (isRunIdMetadataSource(source)) {\n sources.push(source);\n }\n }\n return sources;\n};\n\n/**\n * Scan initial DB-shape messages for any pending approvals, suspended tools, or\n * `requireApprovalMetadata` entries and return the first non-empty `runId`.\n *\n * Metadata is read off `message.content.metadata`, the canonical location for\n * MastraDBMessage UX hints.\n */\nexport const extractRunIdFromMessages = (messages: MastraDBMessage[]): string | undefined => {\n for (const message of messages) {\n for (const source of getRunIdMetadataSources(message.content?.metadata)) {\n for (const entry of Object.values(source)) {\n if (isRecord(entry) && typeof entry.runId === 'string' && entry.runId.length > 0) {\n return entry.runId;\n }\n }\n }\n }\n\n return undefined;\n};\n","import type { MastraDBMessage } from '@mastra/core/agent/message-list';\nimport { CLIENT_MESSAGE_ID_KEY } from '../lib/mastra-db';\nimport { isRecord } from './extract-tasks';\n\nconst liveClientMessageId = (message: MastraDBMessage): string | undefined => {\n const clientMessageId = message.content.metadata?.[CLIENT_MESSAGE_ID_KEY];\n return typeof clientMessageId === 'string' ? clientMessageId : undefined;\n};\n\n// A stored user signal keeps the sender's metadata under `metadata.signal.metadata`.\nconst storedClientMessageId = (message: MastraDBMessage): string | undefined => {\n const signal = message.content.metadata?.signal;\n const clientMessageId =\n isRecord(signal) && isRecord(signal.metadata) ? signal.metadata[CLIENT_MESSAGE_ID_KEY] : undefined;\n return typeof clientMessageId === 'string' ? clientMessageId : undefined;\n};\n\nexport const mergeHistoryIntoConversation = ({\n conversation,\n history,\n previousHistory,\n}: {\n conversation: MastraDBMessage[];\n history: MastraDBMessage[];\n previousHistory: MastraDBMessage[];\n}): MastraDBMessage[] => {\n const previousById = new Map(previousHistory.map(message => [message.id, message]));\n const live = conversation.filter(message => previousById.get(message.id) !== message);\n const liveById = new Map(live.map(message => [message.id, message]));\n const liveClientMessageIds = new Set(live.flatMap(message => liveClientMessageId(message) ?? []));\n const historyIds = new Set(history.map(message => message.id));\n const storedClientMessageIds = new Set(history.flatMap(message => storedClientMessageId(message) ?? []));\n\n const mergedHistory = history.map(message => {\n const liveCopy = liveById.get(message.id);\n if (liveCopy) return liveCopy;\n const clientMessageId = storedClientMessageId(message);\n if (!clientMessageId || !liveClientMessageIds.has(clientMessageId)) return message;\n // Rows key on the client id; keeping it stops the user row remounting mid-answer.\n return {\n ...message,\n content: {\n ...message.content,\n metadata: { ...message.content.metadata, [CLIENT_MESSAGE_ID_KEY]: clientMessageId },\n },\n };\n });\n const unstoredLive = live.filter(message => {\n const clientMessageId = liveClientMessageId(message);\n return !historyIds.has(message.id) && !(clientMessageId && storedClientMessageIds.has(clientMessageId));\n });\n\n return [...mergedHistory, ...unstoredLive];\n};\n","import type { CoreUserMessage } from '@mastra/core/llm';\n\ntype UserPart = Exclude<CoreUserMessage['content'], string>[number];\n\nconst messageParts = (message: CoreUserMessage): UserPart[] => {\n const parts: UserPart[] =\n typeof message.content === 'string' ? [{ type: 'text', text: message.content }] : message.content;\n const inheritedOptions = message.providerOptions ?? message.experimental_providerMetadata;\n if (!inheritedOptions) return parts;\n\n return parts.map(part => {\n const providerOptions = { ...inheritedOptions };\n for (const [provider, options] of Object.entries(\n part.providerOptions ?? part.experimental_providerMetadata ?? {},\n )) {\n providerOptions[provider] = { ...providerOptions[provider], ...options };\n }\n return { ...part, providerOptions };\n });\n};\n\n/** One send is one user message, with each attachment retained as a content part. */\nexport const createUserMessage = (text: string, attachments: CoreUserMessage[] = []): CoreUserMessage => ({\n role: 'user',\n content: [\n ...(text || attachments.length === 0 ? [{ type: 'text' as const, text }] : []),\n ...attachments.flatMap(messageParts),\n ],\n});\n","import { v4 as uuid } from '@lukeed/uuid';\nimport { MastraClient } from '@mastra/client-js';\nimport type { SendAgentSignalParams } from '@mastra/client-js';\nimport type { AIV5Type, MastraDBMessage, MastraToolInvocationPart } from '@mastra/core/agent/message-list';\nimport { AIV5Adapter } from '@mastra/core/agent/message-list';\nimport type { CoreUserMessage } from '@mastra/core/llm';\nimport type { TracingOptions } from '@mastra/core/observability';\nimport type { RequestContext } from '@mastra/core/request-context';\nimport type { TaskItem } from '@mastra/core/signals';\nimport type { ChunkType, DataChunkType, NetworkChunkType } from '@mastra/core/stream';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport {\n accumulateChunk,\n accumulateNetworkChunk,\n CLIENT_MESSAGE_ID_KEY,\n finishStreamingAssistantMessage,\n fromCoreUserMessagesToMastraDBMessage,\n} from '../lib/mastra-db';\nimport type { MastraDBMessageMetadata } from '../lib/mastra-db';\nimport { useMastraClient } from '../mastra-client-context';\nimport {\n extractLatestTasksFromMessages,\n extractTasksFromSignalChunk,\n extractTasksFromToolResultChunk,\n} from './extract-tasks';\nimport { extractRunIdFromMessages } from './extractRunIdFromMessages';\nimport { mergeHistoryIntoConversation } from './merge-history';\nimport { convertSignalDataToBase64String } from './signal-data';\nimport type { ClientToolsInput, ClientToolsResolver, ModelSettings } from './types';\nimport { createUserMessage } from './user-message';\n\nconst extractPendingToolApprovalIdsFromMessages = (messages: MastraDBMessage[], runId?: string) => {\n const pendingToolApprovalIds = new Set<string>();\n\n for (const message of messages) {\n const metadata = message.content?.metadata as MastraDBMessageMetadata | undefined;\n if (!metadata) continue;\n\n const metadataSources = [\n metadata.pendingToolApprovals,\n metadata.requireApprovalMetadata,\n metadata.suspendedTools,\n ] as Array<Record<string, { toolCallId?: unknown; runId?: unknown }> | undefined>;\n\n for (const source of metadataSources) {\n if (!source || typeof source !== 'object') continue;\n\n for (const suspensionData of Object.values(source)) {\n if (runId && suspensionData?.runId !== runId) continue;\n const toolCallId = suspensionData?.toolCallId;\n if (typeof toolCallId === 'string' && toolCallId.length > 0) {\n pendingToolApprovalIds.add(toolCallId);\n }\n }\n }\n }\n\n return pendingToolApprovalIds;\n};\n\nconst toolCallHasOutput = (parts: MastraDBMessage['content']['parts'], toolCallId: string): boolean =>\n parts.some(part => {\n if (part.type !== 'tool-invocation') return false;\n const invocation = (part as MastraToolInvocationPart).toolInvocation;\n if (invocation.toolCallId !== toolCallId) return false;\n return invocation.state === 'result' || (invocation as { result?: unknown }).result != null;\n });\n\nconst filterUnresolvedApprovals = <T extends { toolCallId: string }>(\n entries: Record<string, T> | undefined,\n parts: MastraDBMessage['content']['parts'],\n): Record<string, T> | undefined => {\n if (!entries || typeof entries !== 'object') return undefined;\n const pending = Object.fromEntries(\n Object.entries(entries).filter(\n ([, approval]) =>\n approval &&\n typeof approval === 'object' &&\n typeof approval.toolCallId === 'string' &&\n !toolCallHasOutput(parts, approval.toolCallId),\n ),\n );\n return Object.keys(pending).length ? pending : undefined;\n};\n\n/**\n * Normalize persisted initial messages back into the stream-friendly shape the\n * UI renders from. Mirrors `main`'s `resolveInitialMessages`:\n *\n * - Converts persisted `pendingToolApprovals` (DB shape) into\n * `requireApprovalMetadata` (stream shape) so reloaded threads still render\n * approve/decline buttons, filtering out approvals whose tool already\n * produced output, and marks the message `mode: 'stream'`.\n * - Drops assistant completion messages flagged `suppressFeedback`, which are\n * persisted by the supervisor agent but must stay hidden on reload.\n */\nconst resolveInitialMessages = (messages: MastraDBMessage[]): MastraDBMessage[] =>\n messages\n .filter(message => {\n const metadata = message.content?.metadata as MastraDBMessageMetadata | undefined;\n if (metadata?.completionResult?.suppressFeedback || metadata?.isTaskCompleteResult?.suppressFeedback) {\n return false;\n }\n return true;\n })\n .map(message => {\n const metadata = message.content?.metadata as MastraDBMessageMetadata | undefined;\n\n // A persisted/refetched thread must never show a stuck \"sending\" bubble\n // and must never carry the optimistic correlation key: the pending status\n // and its `clientMessageId` are transient UI state. The `clientMessageId`\n // can survive into storage (it is sent to the server with the message), so\n // strip it on every reload regardless of pending status; the rendered row\n // key falls back to the stable server `id`.\n const normalizedMessage =\n metadata && (metadata.status === 'pending' || CLIENT_MESSAGE_ID_KEY in metadata)\n ? (() => {\n const { [CLIENT_MESSAGE_ID_KEY]: _omitClientMessageId, ...rest } = metadata;\n const { status: _omitStatus, ...restWithoutStatus } = rest;\n return {\n ...message,\n content: {\n ...message.content,\n metadata: metadata.status === 'pending' ? restWithoutStatus : rest,\n },\n };\n })()\n : message;\n\n const normalizedMetadata = normalizedMessage.content?.metadata as MastraDBMessageMetadata | undefined;\n if (\n !normalizedMetadata?.pendingToolApprovals &&\n !normalizedMetadata?.requireApprovalMetadata &&\n !normalizedMetadata?.suspendedTools\n ) {\n return normalizedMessage;\n }\n\n const { pendingToolApprovals, requireApprovalMetadata, suspendedTools, ...restMetadata } = normalizedMetadata;\n const parts = normalizedMessage.content.parts;\n const pending = filterUnresolvedApprovals(pendingToolApprovals, parts);\n const required = { ...filterUnresolvedApprovals(requireApprovalMetadata, parts), ...pending };\n const suspended = filterUnresolvedApprovals(suspendedTools, parts);\n\n return {\n ...normalizedMessage,\n content: {\n ...normalizedMessage.content,\n metadata: {\n ...restMetadata,\n ...(pendingToolApprovals ? { mode: 'stream' as const } : {}),\n ...(pending ? { pendingToolApprovals: pending } : {}),\n ...(Object.keys(required).length ? { requireApprovalMetadata: required } : {}),\n ...(suspended ? { suspendedTools: suspended } : {}),\n },\n },\n };\n });\n\ntype SignalContinuationOptions = {\n model?: string;\n maxSteps?: number;\n modelSettings?: {\n frequencyPenalty?: number;\n presencePenalty?: number;\n maxRetries?: number;\n maxOutputTokens?: number;\n temperature?: number;\n topK?: number;\n topP?: number;\n };\n instructions?: ModelSettings['instructions'];\n system?: ModelSettings['system'];\n providerOptions?: ModelSettings['providerOptions'];\n requireToolApproval?: boolean;\n tracingOptions?: TracingOptions;\n};\n\ntype ActiveContinuation = {\n model?: string;\n requestContext?: RequestContext;\n};\n\nexport interface MastraChatProps {\n agentId: string;\n resourceId?: string;\n threadId?: string;\n initialMessages?: MastraDBMessage[];\n /** Persistent request context used for tool approval/decline calls (e.g. agentVersionId). */\n requestContext?: RequestContext;\n /**\n * Client-side tool definitions. Forwarded once to `subscribeToThread` so\n * the client-js subscription drives the full client-tool execution loop\n * (execute, emit tool-result, continuation) without any logic in React.\n */\n clientTools?: ClientToolsInput;\n onSignalSent?: (signalId: string, preview: string) => void;\n onSignalEcho?: (signalId: string) => void;\n onThreadSignalsUnsupported?: () => void;\n /**\n * Use the agent-signals streaming path (sendSignal + subscribeToThread).\n * Defaults to `false`; set to `true` to opt into thread signals.\n */\n enableThreadSignals?: boolean;\n /** Override the legacy stream route for editor-owned hidden agents. */\n streamPath?: string;\n /**\n * Load stored thread messages through the thread subscription instead of\n * `initialMessages`. The subscription sends them as one `thread-history`\n * chunk and skips run parts already covered by it. Requires thread signals.\n */\n withInitialHistory?: boolean | { perPage?: number };\n}\n\ninterface SharedArgs {\n coreUserMessages: CoreUserMessage[];\n model?: string;\n requestContext?: RequestContext;\n threadId?: string;\n modelSettings?: ModelSettings;\n signal?: AbortSignal;\n tracingOptions?: TracingOptions;\n}\n\n/** JSON-serializable metadata attached to a user message sent through `useChat`. */\nexport type UserMessageMetadata = NonNullable<SendAgentSignalParams['signal']['metadata']>;\n\nexport type SendMessageArgs = {\n message: string;\n coreUserMessages?: CoreUserMessage[];\n /**\n * Custom metadata for the user message. It is merged into the optimistic\n * message's `content.metadata` and, on the thread-signals path, sent with the\n * outgoing message. Internal keys (`mode`, `status`, `clientMessageId`) take\n * precedence over user-supplied values.\n */\n metadata?: UserMessageMetadata;\n} & (\n | ({ mode: 'generate' } & Omit<GenerateArgs, 'coreUserMessages'>)\n | ({ mode: 'stream' } & Omit<StreamArgs, 'coreUserMessages'>)\n | ({ mode: 'network' } & Omit<NetworkArgs, 'coreUserMessages'>)\n | ({ mode?: undefined } & Omit<StreamArgs, 'coreUserMessages'>)\n);\n\nexport type GenerateArgs = SharedArgs & {\n onFinish?: (messages: MastraDBMessage[]) => Promise<void>;\n clientTools?: ClientToolsInput;\n clientToolsResolver?: ClientToolsResolver;\n};\n\nexport type StreamArgs = SharedArgs & {\n onChunk?: (chunk: ChunkType) => Promise<void>;\n clientTools?: ClientToolsInput;\n clientToolsResolver?: ClientToolsResolver;\n signalId?: string;\n /**\n * Client-generated correlation id stamped on the optimistic pending bubble\n * and the outgoing message metadata so the server echo can reconcile them.\n */\n clientMessageId?: string;\n /** Custom user-message metadata sent alongside the thread signal. */\n metadata?: UserMessageMetadata;\n};\n\nexport type NetworkArgs = SharedArgs & {\n onNetworkChunk?: (chunk: NetworkChunkType) => Promise<void>;\n};\n\nconst isObject = (value: unknown): value is Record<string, unknown> => typeof value === 'object' && value !== null;\n\nconst getErrorName = (error: unknown) => (isObject(error) && typeof error.name === 'string' ? error.name : undefined);\n\nconst isAbortError = (error: unknown) => getErrorName(error) === 'AbortError';\n\nconst isThreadSignalUnsupportedError = (error: unknown) => {\n if (!isObject(error)) return false;\n\n const status = error.status;\n if (status === 404 || status === 405 || status === 501) {\n return true;\n }\n\n return (\n status === 400 &&\n typeof error.message === 'string' &&\n error.message.includes('No active agent run found for signal target')\n );\n};\n\ntype DataChunk = Extract<ChunkType, DataChunkType>;\n\nconst isDataChunk = (chunk: ChunkType): chunk is DataChunk =>\n typeof chunk.type === 'string' && chunk.type.startsWith('data-');\n\n/**\n * Convert AI-SDK v5 UIMessages returned by the server (generate mode) into\n * `MastraDBMessage[]`, stamping the supplied metadata onto each message's\n * `content.metadata`. Private helper — `useChat` never exposes the AI-SDK\n * shape to consumers.\n */\nconst dbFromServerUiMessages = (\n uiMessages: AIV5Type.UIMessage[],\n metadata: MastraDBMessageMetadata,\n): MastraDBMessage[] =>\n uiMessages.map(uiMsg => {\n const dbMsg = AIV5Adapter.fromUIMessage(uiMsg);\n return {\n ...dbMsg,\n content: {\n ...dbMsg.content,\n metadata: {\n ...(dbMsg.content.metadata ?? {}),\n ...metadata,\n },\n },\n };\n });\n\nexport const useChat = ({\n agentId,\n resourceId,\n threadId,\n initialMessages,\n requestContext: propsRequestContext,\n clientTools: hookClientTools,\n onSignalSent,\n onSignalEcho,\n onThreadSignalsUnsupported,\n enableThreadSignals = false,\n streamPath,\n withInitialHistory,\n}: MastraChatProps) => {\n const threadSignalsDisabled = enableThreadSignals === false;\n const _currentRunId = useRef<string | undefined>(undefined);\n const _onChunk = useRef<((chunk: ChunkType) => Promise<void>) | undefined>(undefined);\n const _networkRunId = useRef<string | undefined>(undefined);\n const _onNetworkChunk = useRef<((chunk: NetworkChunkType) => Promise<void>) | undefined>(undefined);\n const _activeContinuation = useRef<ActiveContinuation>({ requestContext: propsRequestContext });\n // Tracks the active stream (untilIdle) request so a subsequent stream() call\n // can abort the previous one. Without this, a still-open prior stream keeps\n // its background-task pubsub subscription alive and fans events into a second\n // concurrent UI consumer, producing duplicate bg-task events and duplicate\n // continuation turns on the server.\n const _streamAbortRef = useRef<AbortController | null>(null);\n const _threadSubscriptionAbortRef = useRef<AbortController | null>(null);\n const _threadSubscriptionRef = useRef<{ abort?: () => Promise<boolean> | boolean; unsubscribe?: () => void } | null>(\n null,\n );\n const _threadSubscriptionKeyRef = useRef<string | undefined>(undefined);\n const _threadSubscriptionPromiseRef = useRef<Promise<void> | null>(null);\n const _threadSignalsUnsupportedRef = useRef(false);\n const [messages, setMessages] = useState<MastraDBMessage[]>([]);\n const [tasks, setTasks] = useState<TaskItem[]>([]);\n const liveTasks = useRef<TaskItem[] | undefined>(undefined);\n const [toolCallApprovals, setToolCallApprovals] = useState<{\n [toolCallId: string]: { status: 'approved' | 'declined' };\n }>({});\n const [networkToolCallApprovals, setNetworkToolCallApprovals] = useState<{\n [toolName: string]: { status: 'approved' | 'declined' };\n }>({});\n const pendingToolApprovalIdsRef = useRef(new Set<string>());\n const liveApprovalIds = useRef(new Set<string>());\n const liveRunId = useRef<string | undefined>(undefined);\n const liveRunFinished = useRef(false);\n const [isAwaitingToolApproval, setIsAwaitingToolApproval] = useState(false);\n\n const baseClient = useMastraClient();\n const [isRunning, setIsRunning] = useState(false);\n const [subscriptionHistory, setSubscriptionHistory] = useState<\n { key: string; messages: MastraDBMessage[] } | undefined\n >(undefined);\n // `hasMore` from the initial `thread-history` chunk, keyed by the subscription\n // that delivered it so a stale page never describes a different thread or config.\n const [subscriptionPagination, setSubscriptionPagination] = useState<\n { key: string; pagination: { hasMore: boolean } } | undefined\n >(undefined);\n const historyKey = `${agentId}:${resourceId ?? ''}:${threadId ?? ''}`;\n const historyConfigKey = !withInitialHistory\n ? ''\n : withInitialHistory === true\n ? 'history'\n : `history:${withInitialHistory.perPage ?? ''}`;\n const initialHistoryPagination: { hasMore: boolean } | undefined =\n withInitialHistory &&\n !threadSignalsDisabled &&\n threadId &&\n subscriptionPagination?.key ===\n `${agentId}:${resourceId || agentId}:${threadId}:${streamPath ?? ''}:${historyConfigKey}`\n ? subscriptionPagination.pagination\n : undefined;\n const hydratedMessages =\n withInitialHistory && subscriptionHistory?.key === historyKey ? subscriptionHistory.messages : initialMessages;\n\n const lastHydration = useRef<\n | {\n agentId: string;\n resourceId?: string;\n threadId?: string;\n initialMessages: MastraChatProps['initialMessages'];\n formattedMessages: MastraDBMessage[];\n }\n | undefined\n >(undefined);\n\n useEffect(() => {\n const previous = lastHydration.current;\n const sameThread =\n previous?.agentId === agentId && previous.resourceId === resourceId && previous.threadId === threadId;\n if (sameThread && previous.initialMessages === hydratedMessages) return;\n const formattedMessages = resolveInitialMessages(hydratedMessages ?? []);\n lastHydration.current = { agentId, resourceId, threadId, initialMessages: hydratedMessages, formattedMessages };\n\n if (sameThread) {\n setMessages(current =>\n mergeHistoryIntoConversation({\n conversation: current,\n history: formattedMessages,\n previousHistory: previous.formattedMessages,\n }),\n );\n setTasks(liveTasks.current ?? extractLatestTasksFromMessages(formattedMessages));\n // History may arrive before the live approval event, but must not undo\n // a live approval decision or terminal event, nor switch the active run.\n const historyRunId = extractRunIdFromMessages(formattedMessages);\n if (liveRunFinished.current) return;\n if (!liveRunId.current && isRunning && historyRunId !== _currentRunId.current) return;\n } else {\n liveTasks.current = undefined;\n liveApprovalIds.current.clear();\n liveRunId.current = undefined;\n liveRunFinished.current = false;\n if (previous) setIsRunning(false);\n setMessages(formattedMessages);\n setTasks(extractLatestTasksFromMessages(formattedMessages));\n }\n const pendingApprovals = extractPendingToolApprovalIdsFromMessages(formattedMessages, liveRunId.current);\n for (const toolCallId of liveApprovalIds.current) {\n if (pendingToolApprovalIdsRef.current.has(toolCallId)) pendingApprovals.add(toolCallId);\n else pendingApprovals.delete(toolCallId);\n }\n pendingToolApprovalIdsRef.current = pendingApprovals;\n setIsAwaitingToolApproval(pendingApprovals.size > 0);\n _currentRunId.current = liveRunId.current ?? extractRunIdFromMessages(formattedMessages);\n }, [agentId, resourceId, threadId, hydratedMessages, isRunning, isAwaitingToolApproval]);\n\n useEffect(() => {\n _activeContinuation.current = {\n ..._activeContinuation.current,\n requestContext: propsRequestContext,\n };\n }, [propsRequestContext]);\n\n type SignalContentPart =\n | { type: 'text'; text: string }\n | { type: 'file'; data: string; mediaType: string; filename?: string };\n type UserMessageSignalContents = string | SignalContentPart[];\n\n const normalizeSignalFileData = (data: string | URL | ArrayBuffer | Uint8Array) => {\n if (data instanceof URL) return data.toString();\n return convertSignalDataToBase64String(data);\n };\n\n const getSignalContents = (coreUserMessages: CoreUserMessage[]): UserMessageSignalContents => {\n const parts = coreUserMessages.reduce<SignalContentPart[]>((allParts, message) => {\n if (typeof message.content === 'string') {\n allParts.push({ type: 'text', text: message.content });\n return allParts;\n }\n\n for (const part of message.content) {\n if (part.type === 'text') {\n allParts.push({ type: 'text', text: part.text });\n } else if (part.type === 'file') {\n allParts.push({\n type: 'file',\n data: normalizeSignalFileData(part.data),\n mediaType: part.mimeType,\n ...(part.filename ? { filename: part.filename } : {}),\n });\n } else if (part.type === 'image') {\n allParts.push({\n type: 'file',\n data: normalizeSignalFileData(part.image),\n mediaType: part.mimeType ?? 'image/png',\n });\n }\n }\n\n return allParts;\n }, []);\n\n return parts.length === 1 && parts[0]?.type === 'text' ? parts[0].text : parts;\n };\n\n const markThreadSignalsUnsupported = useCallback(() => {\n _threadSignalsUnsupportedRef.current = true;\n onThreadSignalsUnsupported?.();\n }, [onThreadSignalsUnsupported]);\n\n const getSignalPreview = (coreUserMessages: CoreUserMessage[]) => {\n const preview = coreUserMessages\n .flatMap(message => {\n if (typeof message.content === 'string') {\n return [message.content];\n }\n\n return message.content.map(part => {\n if (part.type === 'text') return part.text;\n if (part.type === 'image') return 'Image';\n return part.filename ? `File: ${part.filename}` : 'File';\n });\n })\n .join(' ')\n .replace(/\\s+/g, ' ')\n .trim();\n\n return preview || 'Attachment';\n };\n\n const closeThreadSubscription = useCallback(() => {\n const subscription = _threadSubscriptionRef.current;\n if (subscription?.unsubscribe) {\n subscription.unsubscribe();\n } else {\n _threadSubscriptionAbortRef.current?.abort();\n }\n _threadSubscriptionRef.current = null;\n _threadSubscriptionAbortRef.current = null;\n _threadSubscriptionKeyRef.current = undefined;\n _threadSubscriptionPromiseRef.current = null;\n setSubscriptionPagination(undefined);\n }, []);\n\n const processStreamChunk = useCallback(\n async (chunk: ChunkType, onChunk?: (chunk: ChunkType) => Promise<void>) => {\n const isTerminal = chunk.type === 'finish' || chunk.type === 'abort' || chunk.type === 'error';\n // A delayed terminal event must not finish another run's message, clear\n // its approvals, or trigger its completion callback.\n if (isTerminal && liveRunId.current && chunk.runId !== liveRunId.current) return;\n const runId = 'runId' in chunk && typeof chunk.runId === 'string' ? chunk.runId : undefined;\n setMessages(prev => {\n const metadata = { mode: 'stream' as const, runId };\n const next = accumulateChunk({ chunk, conversation: prev, metadata });\n // A resumed response can already exist in history; explicit framing\n // establishes ownership even when the accumulator deduplicates it.\n if ((chunk.type === 'start' || chunk.type === 'step-start') && chunk.payload?.messageId && runId) {\n return next.map(message =>\n message.id === chunk.payload.messageId && message.role === 'assistant'\n ? { ...message, content: { ...message.content, metadata: { ...message.content.metadata, ...metadata } } }\n : message,\n );\n }\n return next;\n });\n\n const streamedTasks = extractTasksFromToolResultChunk(chunk) ?? extractTasksFromSignalChunk(chunk);\n if (streamedTasks !== undefined) {\n liveTasks.current = streamedTasks;\n setTasks(streamedTasks);\n }\n\n if (\n chunk.type === 'data-user-message' &&\n isDataChunk(chunk) &&\n (chunk.data?.type === 'user-message' || chunk.data?.type === 'user') &&\n typeof chunk.data?.id === 'string'\n ) {\n onSignalEcho?.(chunk.data.id);\n }\n\n if (chunk.type === 'start') {\n setIsRunning(true);\n if ('runId' in chunk && typeof chunk.runId === 'string') {\n if (liveRunId.current !== chunk.runId) liveApprovalIds.current.clear();\n liveRunFinished.current = false;\n liveRunId.current = chunk.runId;\n _currentRunId.current = chunk.runId;\n }\n }\n\n if (chunk.type === 'tool-call-approval' || chunk.type === 'tool-call-suspended') {\n const toolCallId = chunk.payload?.toolCallId;\n if (typeof toolCallId === 'string') {\n liveApprovalIds.current.add(toolCallId);\n pendingToolApprovalIdsRef.current.add(toolCallId);\n setIsAwaitingToolApproval(true);\n }\n // Some runs (e.g. Inngest durable agents) emit no `start` chunk, so the\n // approval chunk is the only place the run ID reaches the client.\n if (runId) {\n if (!liveRunId.current || liveRunFinished.current) {\n liveRunId.current = runId;\n liveRunFinished.current = false;\n }\n if (liveRunId.current === runId) {\n _currentRunId.current = runId;\n }\n }\n setIsRunning(false);\n }\n\n if (chunk.type === 'tool-call-resumed') {\n const toolCallId = chunk.payload?.toolCallId;\n if (typeof toolCallId === 'string') {\n // Keep it as a live decision so stale hydrated history can't re-mark it pending.\n liveApprovalIds.current.add(toolCallId);\n pendingToolApprovalIdsRef.current.delete(toolCallId);\n setIsAwaitingToolApproval(pendingToolApprovalIdsRef.current.size > 0);\n }\n }\n\n if (isTerminal) {\n if (chunk.runId === liveRunId.current) liveRunFinished.current = true;\n for (const toolCallId of pendingToolApprovalIdsRef.current) liveApprovalIds.current.add(toolCallId);\n pendingToolApprovalIdsRef.current.clear();\n setIsAwaitingToolApproval(false);\n setIsRunning(false);\n }\n\n void (onChunk ?? _onChunk.current)?.(chunk);\n },\n [onSignalEcho],\n );\n\n const ensureThreadSubscription = useCallback(\n async ({ threadId, resourceId }: { threadId: string; resourceId?: string }) => {\n const subscriptionKey = `${agentId}:${resourceId ?? ''}:${threadId}:${streamPath ?? ''}:${historyConfigKey}`;\n if (_threadSubscriptionKeyRef.current === subscriptionKey && _threadSubscriptionPromiseRef.current) {\n await _threadSubscriptionPromiseRef.current;\n return;\n }\n\n closeThreadSubscription();\n const subscriptionAbort = new AbortController();\n _threadSubscriptionAbortRef.current = subscriptionAbort;\n _threadSubscriptionKeyRef.current = subscriptionKey;\n\n // Release the cached subscription state, but only while this attempt\n // still owns it — a newer attempt cleans up after itself.\n const releaseSubscriptionRefs = () => {\n if (_threadSubscriptionAbortRef.current !== subscriptionAbort) return;\n _threadSubscriptionRef.current = null;\n _threadSubscriptionAbortRef.current = null;\n _threadSubscriptionKeyRef.current = undefined;\n _threadSubscriptionPromiseRef.current = null;\n setSubscriptionPagination(undefined);\n };\n\n const clientWithAbort = new MastraClient({\n ...baseClient!.options,\n abortSignal: subscriptionAbort.signal,\n });\n const subscriptionAgent = clientWithAbort.getAgent(agentId, undefined, { stream: streamPath });\n\n _threadSubscriptionPromiseRef.current = subscriptionAgent\n .subscribeToThread({ resourceId, threadId, ...(withInitialHistory ? { withInitialHistory } : {}) })\n .then(response => {\n const subscription = response;\n if (_threadSubscriptionAbortRef.current !== subscriptionAbort) {\n subscription.unsubscribe();\n return;\n }\n\n _threadSubscriptionRef.current = subscription;\n void subscription\n .processDataStream({\n onChunk: chunk => {\n if (chunk.type === 'thread-history') {\n if (_threadSubscriptionAbortRef.current === subscriptionAbort) {\n const { hasMore } = chunk.payload;\n setSubscriptionPagination(\n typeof hasMore === 'boolean' ? { key: subscriptionKey, pagination: { hasMore } } : undefined,\n );\n }\n // Merge history into `messages` now, as a queued update, so the\n // live chunks right behind it accumulate onto the stored parts.\n const history = resolveInitialMessages(chunk.payload.messages);\n const previousHistory = lastHydration.current?.formattedMessages ?? [];\n setMessages(current =>\n mergeHistoryIntoConversation({ conversation: current, history, previousHistory }),\n );\n setSubscriptionHistory({\n key: `${agentId}:${resourceId ?? ''}:${threadId}`,\n messages: chunk.payload.messages,\n });\n return;\n }\n return processStreamChunk(chunk);\n },\n })\n .catch(error => {\n if (!isAbortError(error)) {\n console.error('[useChat] Thread subscription failed', error);\n setIsRunning(false);\n }\n })\n .finally(() => {\n if (_threadSubscriptionRef.current === subscription) {\n _threadSubscriptionRef.current = null;\n }\n releaseSubscriptionRefs();\n });\n })\n .catch(error => {\n // Release on every failure so the next call retries with a fresh\n // fetch instead of re-awaiting this rejected promise. Without this,\n // an aborted mount-time subscribe strands the channel and the reply\n // never arrives until reload (issue #18768).\n releaseSubscriptionRefs();\n\n if (isThreadSignalUnsupportedError(error)) {\n markThreadSignalsUnsupported();\n return;\n }\n if (!isAbortError(error)) {\n console.error('[useChat] Thread subscription failed', error);\n setIsRunning(false);\n }\n throw error;\n });\n\n await _threadSubscriptionPromiseRef.current;\n },\n [\n agentId,\n baseClient,\n closeThreadSubscription,\n historyConfigKey,\n markThreadSignalsUnsupported,\n processStreamChunk,\n streamPath,\n withInitialHistory,\n ],\n );\n\n useEffect(() => {\n _threadSignalsUnsupportedRef.current = false;\n return closeThreadSubscription;\n }, [agentId, resourceId, threadId, closeThreadSubscription]);\n\n useEffect(() => {\n if (!threadId || threadSignalsDisabled) {\n closeThreadSubscription();\n return;\n }\n\n void ensureThreadSubscription({ threadId, resourceId: resourceId || agentId }).catch(error => {\n if (!isAbortError(error)) {\n console.error('[useChat] Thread subscription failed', error);\n }\n });\n }, [agentId, closeThreadSubscription, ensureThreadSubscription, resourceId, threadId, threadSignalsDisabled]);\n\n const generate = async ({\n coreUserMessages,\n model,\n requestContext,\n threadId,\n modelSettings,\n signal,\n onFinish,\n tracingOptions,\n clientTools,\n clientToolsResolver,\n }: GenerateArgs) => {\n const {\n frequencyPenalty,\n presencePenalty,\n maxRetries,\n maxTokens,\n temperature,\n topK,\n topP,\n instructions,\n system,\n providerOptions,\n maxSteps,\n requireToolApproval,\n } = modelSettings || {};\n const resolvedRequestContext = requestContext ?? propsRequestContext;\n const resolvedClientTools = clientTools ?? hookClientTools;\n _activeContinuation.current = {\n model,\n requestContext: resolvedRequestContext,\n };\n setIsRunning(true);\n\n const clientWithAbort = new MastraClient({\n ...baseClient!.options,\n abortSignal: signal,\n });\n\n const agent = clientWithAbort.getAgent(agentId, undefined, { stream: streamPath });\n\n const runId = uuid();\n _currentRunId.current = runId;\n\n const response = await agent.generate(coreUserMessages, {\n model,\n runId,\n maxSteps,\n modelSettings: {\n frequencyPenalty,\n presencePenalty,\n maxRetries,\n maxOutputTokens: maxTokens,\n temperature,\n topK,\n topP,\n },\n instructions,\n system,\n requestContext: resolvedRequestContext,\n ...(threadId ? { memory: { thread: threadId, resource: resourceId || agentId } } : {}),\n providerOptions,\n tracingOptions,\n requireToolApproval,\n clientTools: resolvedClientTools,\n clientToolsResolver,\n });\n\n // Check if suspended for tool approval\n if (response.finishReason === 'suspended' && response.suspendPayload) {\n const { toolCallId, toolName, args } = response.suspendPayload;\n\n // Add uiMessages with requireApprovalMetadata so UI shows approval buttons\n if (response.response?.uiMessages) {\n const dbMessages = dbFromServerUiMessages(response.response.uiMessages, {\n mode: 'generate',\n requireApprovalMetadata: {\n [toolName]: { toolCallId, toolName, args },\n },\n });\n\n setMessages(prev => [...prev, ...dbMessages]);\n }\n\n // Set isRunning to false so approval buttons are enabled\n // The approval/decline functions will set isRunning to true when clicked\n setIsRunning(false);\n return;\n }\n\n setIsRunning(false);\n\n if (response && 'uiMessages' in response.response && response.response.uiMessages) {\n const dbMessages = dbFromServerUiMessages(response.response.uiMessages, { mode: 'generate' });\n void onFinish?.(dbMessages);\n setMessages(prev => [...prev, ...dbMessages]);\n }\n };\n\n const stream = async ({\n coreUserMessages,\n model,\n requestContext,\n threadId,\n onChunk,\n modelSettings,\n signal,\n tracingOptions,\n clientTools,\n clientToolsResolver,\n signalId,\n clientMessageId,\n metadata,\n }: StreamArgs) => {\n const {\n frequencyPenalty,\n presencePenalty,\n maxRetries,\n maxTokens,\n temperature,\n topK,\n topP,\n instructions,\n system,\n providerOptions,\n maxSteps,\n requireToolApproval,\n } = modelSettings || {};\n\n const resolvedRequestContext = requestContext ?? propsRequestContext;\n const resolvedClientTools = clientTools ?? hookClientTools;\n const signalContinuationOptions: SignalContinuationOptions = {\n model,\n maxSteps,\n modelSettings: {\n frequencyPenalty,\n presencePenalty,\n maxRetries,\n maxOutputTokens: maxTokens,\n temperature,\n topK,\n topP,\n },\n instructions,\n system,\n providerOptions,\n requireToolApproval,\n tracingOptions,\n };\n _activeContinuation.current = {\n model,\n requestContext: resolvedRequestContext,\n };\n setIsRunning(true);\n\n _streamAbortRef.current?.abort();\n const internalAbort = new AbortController();\n _streamAbortRef.current = internalAbort;\n\n if (signal) {\n if (signal.aborted) internalAbort.abort();\n else signal.addEventListener('abort', () => internalAbort.abort(), { once: true });\n }\n\n const clientWithAbort = new MastraClient({\n ...baseClient!.options,\n abortSignal: internalAbort.signal,\n });\n\n const agent = clientWithAbort.getAgent(agentId, undefined, { stream: streamPath });\n\n const streamWithLegacyRoute = async () => {\n const runId = uuid();\n const response = await agent.stream(coreUserMessages, {\n model,\n runId,\n maxSteps,\n untilIdle: true,\n modelSettings: {\n frequencyPenalty,\n presencePenalty,\n maxRetries,\n maxOutputTokens: maxTokens,\n temperature,\n topK,\n topP,\n },\n instructions,\n system,\n requestContext: resolvedRequestContext,\n ...(threadId ? { memory: { thread: threadId, resource: resourceId || agentId } } : {}),\n providerOptions,\n requireToolApproval,\n tracingOptions,\n clientTools: resolvedClientTools,\n clientToolsResolver,\n });\n\n _onChunk.current = onChunk;\n _currentRunId.current = runId;\n\n await response.processDataStream({\n onChunk: chunk => processStreamChunk(chunk, onChunk),\n });\n\n if (_streamAbortRef.current === internalAbort) {\n _streamAbortRef.current = null;\n }\n setIsRunning(false);\n };\n\n if (!threadId || _threadSignalsUnsupportedRef.current || threadSignalsDisabled) {\n await streamWithLegacyRoute();\n return;\n }\n\n _onChunk.current = onChunk;\n\n await ensureThreadSubscription({ threadId, resourceId: resourceId || agentId });\n\n if (_threadSignalsUnsupportedRef.current) {\n await streamWithLegacyRoute();\n return;\n }\n\n const resolvedSignalId = signalId ?? uuid();\n const messageContents = getSignalContents(coreUserMessages);\n // RequestContext serializes to a plain record via its toJSON(), but the class has no\n // index signature, so it isn't assignable to the generated `Record<string, unknown>` body type.\n const requestContextRecord = resolvedRequestContext as Record<string, unknown> | undefined;\n const streamOptions = {\n model,\n maxSteps,\n modelSettings: {\n frequencyPenalty,\n presencePenalty,\n maxRetries,\n maxOutputTokens: maxTokens,\n temperature,\n topK,\n topP,\n },\n instructions,\n system,\n requestContext: requestContextRecord,\n providerOptions: providerOptions as any,\n requireToolApproval,\n tracingOptions,\n clientTools: resolvedClientTools,\n clientToolsResolver,\n };\n\n try {\n const result = await agent.sendMessage({\n message:\n clientMessageId || metadata\n ? {\n contents: messageContents,\n metadata: { ...metadata, ...(clientMessageId ? { [CLIENT_MESSAGE_ID_KEY]: clientMessageId } : {}) },\n }\n : messageContents,\n resourceId: resourceId || agentId,\n threadId,\n ifIdle: {\n streamOptions: {\n ...signalContinuationOptions,\n requestContext: requestContextRecord,\n clientTools: resolvedClientTools,\n clientToolsResolver,\n },\n },\n });\n const echoedSignalId =\n result.signal &&\n typeof result.signal === 'object' &&\n 'id' in result.signal &&\n typeof result.signal.id === 'string'\n ? result.signal.id\n : resolvedSignalId;\n onSignalSent?.(echoedSignalId, getSignalPreview(coreUserMessages));\n if (pendingToolApprovalIdsRef.current.size > 0) {\n setIsRunning(false);\n }\n } catch (error) {\n if (isThreadSignalUnsupportedError(error)) {\n try {\n await agent.sendSignal({\n signal: {\n id: resolvedSignalId,\n type: 'user-message',\n contents: messageContents,\n ...(metadata ? { metadata } : {}),\n },\n resourceId: resourceId || agentId,\n threadId,\n ifIdle: { streamOptions },\n });\n onSignalSent?.(resolvedSignalId, getSignalPreview(coreUserMessages));\n return;\n } catch (signalError) {\n onSignalEcho?.(resolvedSignalId);\n if (isThreadSignalUnsupportedError(signalError)) {\n markThreadSignalsUnsupported();\n setMessages(prev => [...prev, fromCoreUserMessagesToMastraDBMessage(coreUserMessages)]);\n await streamWithLegacyRoute();\n return;\n }\n throw signalError;\n }\n }\n throw error;\n }\n\n if (_streamAbortRef.current === internalAbort) {\n _streamAbortRef.current = null;\n }\n };\n\n const network = async ({\n coreUserMessages,\n model,\n requestContext,\n threadId,\n onNetworkChunk,\n modelSettings,\n signal,\n tracingOptions,\n }: NetworkArgs) => {\n const { frequencyPenalty, presencePenalty, maxRetries, maxTokens, temperature, topK, topP, maxSteps } =\n modelSettings || {};\n\n const resolvedRequestContext = requestContext ?? propsRequestContext;\n _activeContinuation.current = {\n model,\n requestContext: resolvedRequestContext,\n };\n setIsRunning(true);\n\n const clientWithAbort = new MastraClient({\n ...baseClient!.options,\n abortSignal: signal,\n });\n\n const agent = clientWithAbort.getAgent(agentId, undefined, { stream: streamPath });\n\n const runId = uuid();\n _currentRunId.current = runId;\n\n const response = await agent.network(coreUserMessages, {\n model,\n maxSteps,\n modelSettings: {\n frequencyPenalty,\n presencePenalty,\n maxRetries,\n maxOutputTokens: maxTokens,\n temperature,\n topK,\n topP,\n },\n runId,\n requestContext: resolvedRequestContext,\n ...(threadId ? { memory: { thread: threadId, resource: resourceId || agentId } } : {}),\n tracingOptions,\n });\n\n _onNetworkChunk.current = onNetworkChunk;\n _networkRunId.current = runId;\n\n // Accumulate network chunks into `messages` as `MastraDBMessage` (temporary\n // bridge until the next major), while still forwarding chunks to the\n // consumer for side-effects (OM, working memory, thread list, errors).\n await response.processDataStream({\n onChunk: async (chunk: NetworkChunkType) => {\n setMessages(prev =>\n accumulateNetworkChunk({ chunk, conversation: prev, metadata: { mode: 'network', runId } }),\n );\n void onNetworkChunk?.(chunk);\n },\n });\n\n setMessages(prev => finishStreamingAssistantMessage(prev));\n setIsRunning(false);\n };\n\n const handleCancelRun = () => {\n _streamAbortRef.current?.abort();\n _streamAbortRef.current = null;\n const threadSubscription = _threadSubscriptionRef.current;\n void Promise.resolve(threadSubscription?.abort?.()).catch(error => {\n console.error('[useChat] Failed to abort thread subscription', error);\n });\n closeThreadSubscription();\n setMessages(prev => finishStreamingAssistantMessage(prev));\n liveRunFinished.current = true;\n pendingToolApprovalIdsRef.current.clear();\n setIsAwaitingToolApproval(false);\n setIsRunning(false);\n _currentRunId.current = undefined;\n _onChunk.current = undefined;\n _networkRunId.current = undefined;\n _onNetworkChunk.current = undefined;\n _activeContinuation.current = {};\n };\n\n const approveToolCall = async (toolCallId: string, resumeData?: unknown) => {\n const onChunk = _onChunk.current;\n const currentRunId = _currentRunId.current;\n const continuation = _activeContinuation.current;\n\n if (!currentRunId)\n return console.info('[approveToolCall] approveToolCall can only be called after a stream has started');\n\n setIsRunning(true);\n setToolCallApprovals(prev => ({ ...prev, [toolCallId]: { status: 'approved' } }));\n\n const agent = baseClient.getAgent(agentId, undefined, { stream: streamPath });\n if (_threadSubscriptionKeyRef.current && threadId) {\n try {\n await agent.sendToolApproval({\n resourceId: resourceId || agentId,\n threadId,\n toolCallId,\n approved: true,\n ...(continuation.model !== undefined ? { streamOptions: { model: continuation.model } } : {}),\n ...(resumeData !== undefined ? { resumeData } : {}),\n requestContext: continuation.requestContext,\n });\n liveRunId.current ??= currentRunId;\n liveApprovalIds.current.add(toolCallId);\n pendingToolApprovalIdsRef.current.delete(toolCallId);\n setIsAwaitingToolApproval(pendingToolApprovalIdsRef.current.size > 0);\n setIsRunning(false);\n } catch (error) {\n setToolCallApprovals(prev => {\n const next = { ...prev };\n delete next[toolCallId];\n return next;\n });\n setIsRunning(false);\n throw error;\n }\n return;\n }\n\n try {\n const response =\n resumeData !== undefined\n ? await agent.resumeStream(resumeData as Parameters<typeof agent.resumeStream>[0], {\n runId: currentRunId,\n toolCallId,\n ...continuation,\n })\n : await agent.approveToolCall({\n runId: currentRunId,\n toolCallId,\n ...continuation,\n });\n\n await response.processDataStream({\n onChunk: async (chunk: ChunkType) => {\n await processStreamChunk(chunk, onChunk);\n },\n });\n setIsRunning(false);\n } catch (error) {\n setToolCallApprovals(prev => {\n const next = { ...prev };\n delete next[toolCallId];\n return next;\n });\n setIsRunning(false);\n throw error;\n }\n };\n\n const declineToolCall = async (toolCallId: string) => {\n const onChunk = _onChunk.current;\n const currentRunId = _currentRunId.current;\n const continuation = _activeContinuation.current;\n\n if (!currentRunId)\n return console.info('[declineToolCall] declineToolCall can only be called after a stream has started');\n\n setIsRunning(true);\n setToolCallApprovals(prev => ({ ...prev, [toolCallId]: { status: 'declined' } }));\n const agent = baseClient.getAgent(agentId, undefined, { stream: streamPath });\n if (_threadSubscriptionKeyRef.current && threadId) {\n try {\n await agent.sendToolApproval({\n resourceId: resourceId || agentId,\n threadId,\n toolCallId,\n approved: false,\n ...(continuation.model !== undefined ? { streamOptions: { model: continuation.model } } : {}),\n requestContext: continuation.requestContext,\n });\n liveRunId.current ??= currentRunId;\n liveApprovalIds.current.add(toolCallId);\n pendingToolApprovalIdsRef.current.delete(toolCallId);\n setIsAwaitingToolApproval(pendingToolApprovalIdsRef.current.size > 0);\n setIsRunning(false);\n } catch (error) {\n setToolCallApprovals(prev => {\n const next = { ...prev };\n delete next[toolCallId];\n return next;\n });\n setIsRunning(false);\n throw error;\n }\n return;\n }\n\n const response = await agent.declineToolCall({\n runId: currentRunId,\n toolCallId,\n ...continuation,\n });\n\n await response.processDataStream({\n onChunk: async (chunk: ChunkType) => {\n await processStreamChunk(chunk, onChunk);\n },\n });\n setIsRunning(false);\n };\n\n const approveToolCallGenerate = async (toolCallId: string) => {\n const currentRunId = _currentRunId.current;\n const continuation = _activeContinuation.current;\n\n if (!currentRunId)\n return console.info(\n '[approveToolCallGenerate] approveToolCallGenerate can only be called after a generate has started',\n );\n\n setIsRunning(true);\n setToolCallApprovals(prev => ({ ...prev, [toolCallId]: { status: 'approved' } }));\n\n const agent = baseClient.getAgent(agentId, undefined, { stream: streamPath });\n const response = await agent.approveToolCallGenerate({\n runId: currentRunId,\n toolCallId,\n ...continuation,\n });\n\n if (response && 'uiMessages' in response.response && response.response.uiMessages) {\n const dbMessages = dbFromServerUiMessages(response.response.uiMessages, { mode: 'generate' });\n setMessages(prev => [...prev, ...dbMessages]);\n }\n\n setIsRunning(false);\n };\n\n const declineToolCallGenerate = async (toolCallId: string) => {\n const currentRunId = _currentRunId.current;\n const continuation = _activeContinuation.current;\n\n if (!currentRunId)\n return console.info(\n '[declineToolCallGenerate] declineToolCallGenerate can only be called after a generate has started',\n );\n\n setIsRunning(true);\n setToolCallApprovals(prev => ({ ...prev, [toolCallId]: { status: 'declined' } }));\n\n const agent = baseClient.getAgent(agentId, undefined, { stream: streamPath });\n const response = await agent.declineToolCallGenerate({\n runId: currentRunId,\n toolCallId,\n ...continuation,\n });\n\n if (response && 'uiMessages' in response.response && response.response.uiMessages) {\n const dbMessages = dbFromServerUiMessages(response.response.uiMessages, { mode: 'generate' });\n setMessages(prev => [...prev, ...dbMessages]);\n }\n\n setIsRunning(false);\n };\n\n const approveNetworkToolCall = async (toolName: string, runId?: string) => {\n const onNetworkChunk = _onNetworkChunk.current;\n const networkRunId = runId || _networkRunId.current;\n const continuation = _activeContinuation.current;\n\n if (!networkRunId)\n return console.info(\n '[approveNetworkToolCall] approveNetworkToolCall can only be called after a network stream has started',\n );\n\n _currentRunId.current = networkRunId;\n setIsRunning(true);\n setNetworkToolCallApprovals(prev => ({\n ...prev,\n [runId ? `${runId}-${toolName}` : toolName]: { status: 'approved' },\n }));\n\n const agent = baseClient.getAgent(agentId, undefined, { stream: streamPath });\n const response = await agent.approveNetworkToolCall({\n runId: networkRunId,\n ...continuation,\n });\n\n await response.processDataStream({\n onChunk: async (chunk: NetworkChunkType) => {\n setMessages(prev =>\n accumulateNetworkChunk({ chunk, conversation: prev, metadata: { mode: 'network', runId: networkRunId } }),\n );\n void onNetworkChunk?.(chunk);\n },\n });\n\n setMessages(prev => finishStreamingAssistantMessage(prev));\n setIsRunning(false);\n };\n\n const declineNetworkToolCall = async (toolName: string, runId?: string) => {\n const onNetworkChunk = _onNetworkChunk.current;\n const networkRunId = runId || _networkRunId.current;\n const continuation = _activeContinuation.current;\n\n if (!networkRunId)\n return console.info(\n '[declineNetworkToolCall] declineNetworkToolCall can only be called after a network stream has started',\n );\n\n _currentRunId.current = networkRunId;\n setIsRunning(true);\n setNetworkToolCallApprovals(prev => ({\n ...prev,\n [runId ? `${runId}-${toolName}` : toolName]: { status: 'declined' },\n }));\n\n const agent = baseClient.getAgent(agentId, undefined, { stream: streamPath });\n const response = await agent.declineNetworkToolCall({\n runId: networkRunId,\n ...continuation,\n });\n\n await response.processDataStream({\n onChunk: async (chunk: NetworkChunkType) => {\n setMessages(prev =>\n accumulateNetworkChunk({ chunk, conversation: prev, metadata: { mode: 'network', runId: networkRunId } }),\n );\n void onNetworkChunk?.(chunk);\n },\n });\n\n setMessages(prev => finishStreamingAssistantMessage(prev));\n setIsRunning(false);\n };\n\n const sendMessage = async ({ mode = 'stream', metadata: userMetadata, ...args }: SendMessageArgs) => {\n if (!isRunning && !isAwaitingToolApproval) _currentRunId.current = undefined;\n const coreUserMessages = [createUserMessage(args.message, args.coreUserMessages)];\n\n // Use the same multipart message for the request and optimistic display.\n // Sending separate attachment messages would persist separate rows on reload.\n const coreDbUserMessage = fromCoreUserMessagesToMastraDBMessage(coreUserMessages);\n const dbUserMessage: MastraDBMessage = userMetadata\n ? {\n ...coreDbUserMessage,\n content: {\n ...coreDbUserMessage.content,\n metadata: { ...coreDbUserMessage.content.metadata, ...userMetadata },\n },\n }\n : coreDbUserMessage;\n const clientSetId =\n mode === 'stream' && args.threadId && !_threadSignalsUnsupportedRef.current && !threadSignalsDisabled\n ? `client-set-${uuid()}`\n : undefined;\n const signalId = clientSetId;\n const clientMessageId = clientSetId;\n\n if (signalId) {\n // Signal path: append the user turn optimistically as `pending` with a\n // visibly client-owned id. The server echo can replace the final message\n // id while the matching client id reconciles the pending bubble.\n const metadata: MastraDBMessageMetadata = {\n ...dbUserMessage.content.metadata,\n mode: 'stream',\n status: 'pending',\n [CLIENT_MESSAGE_ID_KEY]: clientMessageId,\n };\n const pendingMessage = { ...dbUserMessage, id: clientSetId, content: { ...dbUserMessage.content, metadata } };\n setMessages(s => [...s, pendingMessage]);\n } else {\n setMessages(s => [...s, dbUserMessage]);\n }\n\n try {\n if (mode === 'generate') {\n await generate({ ...args, coreUserMessages });\n } else if (mode === 'stream') {\n await stream({ ...args, coreUserMessages, signalId, clientMessageId, metadata: userMetadata });\n } else if (mode === 'network') {\n await network({ ...args, coreUserMessages });\n }\n } catch (error) {\n // A failed send (subscription setup, request, or stream) must not leave\n // the chat stranded in a \"running\" state until reload (issue #18768).\n setIsRunning(false);\n // Drop the optimistic bubble instead of leaving it pending until reload\n // (issue #26831). If the server did accept the turn before the response\n // was lost, the message can still reappear through the live subscription\n // echo or when the caller reloads thread history.\n if (signalId) {\n setMessages(s => s.filter(m => !(m.id === signalId && m.content.metadata?.status === 'pending')));\n }\n throw error;\n }\n };\n\n return {\n setMessages,\n sendMessage,\n isRunning,\n activeRunId: isRunning || isAwaitingToolApproval ? _currentRunId.current : undefined,\n isAwaitingToolApproval,\n messages,\n /**\n * Pagination of the initial `thread-history` page from `withInitialHistory`:\n * `hasMore: true` when older messages exist, `false` when the page reached the\n * start of the thread, and `undefined` while history is disabled, pending, or\n * the subscription for the current agent/resource/thread/config has ended.\n */\n initialHistoryPagination,\n tasks,\n approveToolCall,\n declineToolCall,\n approveToolCallGenerate,\n declineToolCallGenerate,\n cancelRun: handleCancelRun,\n toolCallApprovals,\n approveNetworkToolCall,\n declineNetworkToolCall,\n networkToolCallApprovals,\n };\n};\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { n as useMastraClient } from "./mastra-client-context-Bx_g84YB.js";
2
- import { i as mapWorkflowStreamChunkToWatchResult } from "./accumulator-C8kIc450.js";
2
+ import { i as mapWorkflowStreamChunkToWatchResult } from "./accumulator-D9jAph99.js";
3
3
  import { useCallback, useEffect, useRef, useState } from "react";
4
4
  //#region src/lib/use-mutation.ts
5
5
  /**
@@ -249,4 +249,4 @@ function useCancelWorkflowRun() {
249
249
  //#endregion
250
250
  export { useCreateWorkflowRun as n, useStreamWorkflow as r, useCancelWorkflowRun as t };
251
251
 
252
- //# sourceMappingURL=hooks-0L0RNfau.js.map
252
+ //# sourceMappingURL=hooks-DG-Y1KFe.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"hooks-0L0RNfau.js","names":["typedError"],"sources":["../src/lib/use-mutation.ts","../src/workflows/use-stream-workflow.ts","../src/workflows/hooks.ts"],"sourcesContent":["import { useState, useCallback, useRef } from 'react';\n\n/**\n * Represents the state of a mutation operation.\n * Mimics the essential return type of react-query's useMutation.\n */\nexport interface MutationState<TData, TError extends Error, TVariables> {\n /** Execute the mutation without waiting for the result */\n mutate: (variables: TVariables) => void;\n /** Execute the mutation and return a promise with the result */\n mutateAsync: (variables: TVariables) => Promise<TData>;\n /** Whether the mutation is currently executing */\n isPending: boolean;\n /** Whether the mutation completed successfully */\n isSuccess: boolean;\n /** Whether the mutation failed with an error */\n isError: boolean;\n /** The error if the mutation failed, null otherwise */\n error: TError | null;\n /** The data returned by the mutation if successful */\n data: TData | undefined;\n /** Reset the mutation state to initial values */\n reset: () => void;\n}\n\n/**\n * Internal helper hook that provides mutation-like functionality without react-query.\n * Tracks pending, success, and error states for async operations.\n */\nexport function useMutation<TData, TError extends Error, TVariables>(\n mutationFn: (variables: TVariables) => Promise<TData>,\n): MutationState<TData, TError, TVariables> {\n const [isPending, setIsPending] = useState(false);\n const [isSuccess, setIsSuccess] = useState(false);\n const [isError, setIsError] = useState(false);\n const [error, setError] = useState<TError | null>(null);\n const [data, setData] = useState<TData | undefined>(undefined);\n\n const mutationFnRef = useRef(mutationFn);\n mutationFnRef.current = mutationFn;\n\n const reset = useCallback(() => {\n setIsPending(false);\n setIsSuccess(false);\n setIsError(false);\n setError(null);\n setData(undefined);\n }, []);\n\n const mutateAsync = useCallback(async (variables: TVariables): Promise<TData> => {\n setIsPending(true);\n setIsSuccess(false);\n setIsError(false);\n setError(null);\n\n try {\n const result = await mutationFnRef.current(variables);\n setData(result);\n setIsSuccess(true);\n return result;\n } catch (err) {\n const typedError = err as TError;\n setError(typedError);\n setIsError(true);\n throw err;\n } finally {\n setIsPending(false);\n }\n }, []);\n\n const mutate = useCallback(\n (variables: TVariables) => {\n mutateAsync(variables).catch(() => {\n // Error is already captured in state\n });\n },\n [mutateAsync],\n );\n\n return {\n mutate,\n mutateAsync,\n isPending,\n isSuccess,\n isError,\n error,\n data,\n reset,\n };\n}\n","import type { StreamVNextChunkType } from '@mastra/client-js';\nimport { useState, useRef, useEffect, useCallback } from 'react';\nimport { mapWorkflowStreamChunkToWatchResult } from '../lib/mastra-db';\nimport { useMutation } from '../lib/use-mutation';\nimport { useMastraClient } from '../mastra-client-context';\nimport type {\n UseStreamWorkflowParams,\n WorkflowStreamResult,\n StreamWorkflowParams,\n ObserveWorkflowStreamParams,\n ResumeWorkflowStreamParams,\n TimeTravelWorkflowStreamParams,\n} from './types';\n\ntype StreamOperation = {\n controller: AbortController;\n reader?: ReadableStreamDefaultReader<StreamVNextChunkType>;\n};\n\nexport function useStreamWorkflow({ debugMode, tracingOptions, onError }: UseStreamWorkflowParams) {\n const client = useMastraClient();\n const [streamResult, setStreamResult] = useState<WorkflowStreamResult>();\n const [isStreaming, setIsStreaming] = useState(false);\n const activeStream = useRef<StreamOperation | undefined>(undefined);\n const isMountedRef = useRef(true);\n\n const closeActiveStream = useCallback(() => {\n const operation = activeStream.current;\n activeStream.current = undefined;\n if (!operation) return;\n operation.controller.abort();\n // An already errored transport may reject cancellation during disposal.\n void operation.reader?.cancel().catch(() => undefined);\n operation.reader?.releaseLock();\n operation.reader = undefined;\n }, []);\n\n useEffect(() => {\n isMountedRef.current = true;\n return () => {\n isMountedRef.current = false;\n closeActiveStream();\n };\n }, [closeActiveStream]);\n\n async function consumeStream(\n openStream: (signal: AbortSignal) => Promise<ReadableStream<StreamVNextChunkType> | undefined>,\n defaultMessage: string,\n ) {\n if (!isMountedRef.current) return;\n closeActiveStream();\n const operation: StreamOperation = { controller: new AbortController() };\n activeStream.current = operation;\n const { signal } = operation.controller;\n setIsStreaming(true);\n\n try {\n const stream = await openStream(signal);\n if (signal.aborted) {\n await stream?.cancel();\n return;\n }\n if (!stream) {\n onError?.(new Error('No stream returned'), 'No stream returned');\n return;\n }\n const reader = stream.getReader();\n operation.reader = reader;\n\n while (!signal.aborted) {\n const { done, value } = await reader.read();\n if (done || signal.aborted) break;\n setStreamResult(previous => mapWorkflowStreamChunkToWatchResult(previous, value));\n if (value.type === 'workflow-step-start') setIsStreaming(true);\n if (value.type === 'workflow-step-suspended') setIsStreaming(false);\n if (value.type === 'workflow-finish' && value.payload.workflowStatus === 'failed') {\n throw new Error(value.payload.metadata?.errorMessage || 'Workflow execution failed');\n }\n }\n } catch (error) {\n // Releasing an obsolete reader rejects its pending read; real transport TypeErrors must still surface.\n if (!signal.aborted) {\n if (!operation.reader) throw error;\n onError?.(error instanceof Error ? error : new Error(defaultMessage), defaultMessage);\n }\n } finally {\n operation.reader?.releaseLock();\n operation.reader = undefined;\n if (activeStream.current === operation) {\n activeStream.current = undefined;\n setIsStreaming(false);\n }\n }\n }\n\n const streamWorkflow = useMutation<void, Error, StreamWorkflowParams>(\n ({ workflowId, runId, inputData, initialState, requestContext, perStep, resourceId }) => {\n setStreamResult({ status: 'pending', input: inputData, steps: {} });\n return consumeStream(async signal => {\n const run = await client.getWorkflow(workflowId).createRun({ runId, resourceId });\n if (signal.aborted) return;\n return run.stream({\n inputData,\n initialState,\n requestContext,\n closeOnSuspend: true,\n tracingOptions,\n perStep: perStep ?? debugMode,\n resourceId,\n });\n }, 'Error streaming workflow');\n },\n );\n\n const observeWorkflowStream = useMutation<void, Error, ObserveWorkflowStreamParams>(\n async ({ workflowId, runId, storeRunResult }) => {\n if (!isMountedRef.current) return;\n setStreamResult(storeRunResult ?? undefined);\n if (storeRunResult?.status === 'suspended') {\n closeActiveStream();\n setIsStreaming(false);\n return;\n }\n await consumeStream(async signal => {\n const run = await client.getWorkflow(workflowId).createRun({ runId });\n if (signal.aborted) return;\n return run.observeStream();\n }, 'Error observing workflow');\n },\n );\n\n const resumeWorkflowStream = useMutation<void, Error, ResumeWorkflowStreamParams>(\n ({ workflowId, runId, step, resumeData, requestContext, perStep }) =>\n consumeStream(async signal => {\n const run = await client.getWorkflow(workflowId).createRun({ runId });\n if (signal.aborted) return;\n return run.resumeStream({ step, resumeData, requestContext, tracingOptions, perStep: perStep ?? debugMode });\n }, 'Error resuming workflow stream'),\n );\n\n const timeTravelWorkflowStream = useMutation<void, Error, TimeTravelWorkflowStreamParams>(\n ({ workflowId, requestContext, runId, perStep, ...params }) =>\n consumeStream(async signal => {\n const run = await client.getWorkflow(workflowId).createRun({ runId });\n if (signal.aborted) return;\n return run.timeTravelStream({\n ...params,\n perStep: perStep ?? debugMode,\n requestContext,\n tracingOptions,\n });\n }, 'Error time traveling workflow stream'),\n );\n\n const closeStreamsAndReset = useCallback(() => {\n closeActiveStream();\n setIsStreaming(false);\n setStreamResult(undefined);\n }, [closeActiveStream]);\n\n return {\n streamWorkflow,\n streamResult,\n isStreaming,\n observeWorkflowStream,\n closeStreamsAndReset,\n resumeWorkflowStream,\n timeTravelWorkflowStream,\n };\n}\n","import { useMutation } from '../lib/use-mutation';\nimport { useMastraClient } from '../mastra-client-context';\nimport type {\n CreateWorkflowRunParams,\n CreateWorkflowRunResult,\n CancelWorkflowRunParams,\n CancelWorkflowRunResult,\n} from './types';\n\nexport { useStreamWorkflow } from './use-stream-workflow';\n\n/**\n * Hook for creating workflow runs.\n * Returns a mutation for creating a new workflow run.\n *\n * @example\n * ```tsx\n * const createWorkflowRun = useCreateWorkflowRun();\n *\n * // Create a run\n * const { runId } = await createWorkflowRun.mutateAsync({\n * workflowId: 'my-workflow'\n * });\n * ```\n */\nexport function useCreateWorkflowRun() {\n const client = useMastraClient();\n\n return useMutation<CreateWorkflowRunResult, Error, CreateWorkflowRunParams>(\n async ({ workflowId, prevRunId, resourceId }) => {\n try {\n const workflow = client.getWorkflow(workflowId);\n const { runId: newRunId } = await workflow.createRun({ runId: prevRunId, resourceId });\n return { runId: newRunId };\n } catch (error) {\n console.error('Error creating workflow run:', error);\n throw error;\n }\n },\n );\n}\n\n/**\n * Hook for canceling workflow runs.\n * Returns a mutation for canceling a running workflow.\n *\n * @example\n * ```tsx\n * const cancelWorkflowRun = useCancelWorkflowRun();\n *\n * // Cancel a run\n * await cancelWorkflowRun.mutateAsync({\n * workflowId: 'my-workflow',\n * runId: 'run-123'\n * });\n * ```\n */\nexport function useCancelWorkflowRun() {\n const client = useMastraClient();\n\n return useMutation<CancelWorkflowRunResult, Error, CancelWorkflowRunParams>(async ({ workflowId, runId }) => {\n try {\n const workflow = client.getWorkflow(workflowId);\n const run = await workflow.createRun({ runId });\n return run.cancelRun();\n } catch (error) {\n console.error('Error canceling workflow run:', error);\n throw error;\n }\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"hooks-DG-Y1KFe.js","names":["typedError"],"sources":["../src/lib/use-mutation.ts","../src/workflows/use-stream-workflow.ts","../src/workflows/hooks.ts"],"sourcesContent":["import { useState, useCallback, useRef } from 'react';\n\n/**\n * Represents the state of a mutation operation.\n * Mimics the essential return type of react-query's useMutation.\n */\nexport interface MutationState<TData, TError extends Error, TVariables> {\n /** Execute the mutation without waiting for the result */\n mutate: (variables: TVariables) => void;\n /** Execute the mutation and return a promise with the result */\n mutateAsync: (variables: TVariables) => Promise<TData>;\n /** Whether the mutation is currently executing */\n isPending: boolean;\n /** Whether the mutation completed successfully */\n isSuccess: boolean;\n /** Whether the mutation failed with an error */\n isError: boolean;\n /** The error if the mutation failed, null otherwise */\n error: TError | null;\n /** The data returned by the mutation if successful */\n data: TData | undefined;\n /** Reset the mutation state to initial values */\n reset: () => void;\n}\n\n/**\n * Internal helper hook that provides mutation-like functionality without react-query.\n * Tracks pending, success, and error states for async operations.\n */\nexport function useMutation<TData, TError extends Error, TVariables>(\n mutationFn: (variables: TVariables) => Promise<TData>,\n): MutationState<TData, TError, TVariables> {\n const [isPending, setIsPending] = useState(false);\n const [isSuccess, setIsSuccess] = useState(false);\n const [isError, setIsError] = useState(false);\n const [error, setError] = useState<TError | null>(null);\n const [data, setData] = useState<TData | undefined>(undefined);\n\n const mutationFnRef = useRef(mutationFn);\n mutationFnRef.current = mutationFn;\n\n const reset = useCallback(() => {\n setIsPending(false);\n setIsSuccess(false);\n setIsError(false);\n setError(null);\n setData(undefined);\n }, []);\n\n const mutateAsync = useCallback(async (variables: TVariables): Promise<TData> => {\n setIsPending(true);\n setIsSuccess(false);\n setIsError(false);\n setError(null);\n\n try {\n const result = await mutationFnRef.current(variables);\n setData(result);\n setIsSuccess(true);\n return result;\n } catch (err) {\n const typedError = err as TError;\n setError(typedError);\n setIsError(true);\n throw err;\n } finally {\n setIsPending(false);\n }\n }, []);\n\n const mutate = useCallback(\n (variables: TVariables) => {\n mutateAsync(variables).catch(() => {\n // Error is already captured in state\n });\n },\n [mutateAsync],\n );\n\n return {\n mutate,\n mutateAsync,\n isPending,\n isSuccess,\n isError,\n error,\n data,\n reset,\n };\n}\n","import type { StreamVNextChunkType } from '@mastra/client-js';\nimport { useState, useRef, useEffect, useCallback } from 'react';\nimport { mapWorkflowStreamChunkToWatchResult } from '../lib/mastra-db';\nimport { useMutation } from '../lib/use-mutation';\nimport { useMastraClient } from '../mastra-client-context';\nimport type {\n UseStreamWorkflowParams,\n WorkflowStreamResult,\n StreamWorkflowParams,\n ObserveWorkflowStreamParams,\n ResumeWorkflowStreamParams,\n TimeTravelWorkflowStreamParams,\n} from './types';\n\ntype StreamOperation = {\n controller: AbortController;\n reader?: ReadableStreamDefaultReader<StreamVNextChunkType>;\n};\n\nexport function useStreamWorkflow({ debugMode, tracingOptions, onError }: UseStreamWorkflowParams) {\n const client = useMastraClient();\n const [streamResult, setStreamResult] = useState<WorkflowStreamResult>();\n const [isStreaming, setIsStreaming] = useState(false);\n const activeStream = useRef<StreamOperation | undefined>(undefined);\n const isMountedRef = useRef(true);\n\n const closeActiveStream = useCallback(() => {\n const operation = activeStream.current;\n activeStream.current = undefined;\n if (!operation) return;\n operation.controller.abort();\n // An already errored transport may reject cancellation during disposal.\n void operation.reader?.cancel().catch(() => undefined);\n operation.reader?.releaseLock();\n operation.reader = undefined;\n }, []);\n\n useEffect(() => {\n isMountedRef.current = true;\n return () => {\n isMountedRef.current = false;\n closeActiveStream();\n };\n }, [closeActiveStream]);\n\n async function consumeStream(\n openStream: (signal: AbortSignal) => Promise<ReadableStream<StreamVNextChunkType> | undefined>,\n defaultMessage: string,\n ) {\n if (!isMountedRef.current) return;\n closeActiveStream();\n const operation: StreamOperation = { controller: new AbortController() };\n activeStream.current = operation;\n const { signal } = operation.controller;\n setIsStreaming(true);\n\n try {\n const stream = await openStream(signal);\n if (signal.aborted) {\n await stream?.cancel();\n return;\n }\n if (!stream) {\n onError?.(new Error('No stream returned'), 'No stream returned');\n return;\n }\n const reader = stream.getReader();\n operation.reader = reader;\n\n while (!signal.aborted) {\n const { done, value } = await reader.read();\n if (done || signal.aborted) break;\n setStreamResult(previous => mapWorkflowStreamChunkToWatchResult(previous, value));\n if (value.type === 'workflow-step-start') setIsStreaming(true);\n if (value.type === 'workflow-step-suspended') setIsStreaming(false);\n if (value.type === 'workflow-finish' && value.payload.workflowStatus === 'failed') {\n throw new Error(value.payload.metadata?.errorMessage || 'Workflow execution failed');\n }\n }\n } catch (error) {\n // Releasing an obsolete reader rejects its pending read; real transport TypeErrors must still surface.\n if (!signal.aborted) {\n if (!operation.reader) throw error;\n onError?.(error instanceof Error ? error : new Error(defaultMessage), defaultMessage);\n }\n } finally {\n operation.reader?.releaseLock();\n operation.reader = undefined;\n if (activeStream.current === operation) {\n activeStream.current = undefined;\n setIsStreaming(false);\n }\n }\n }\n\n const streamWorkflow = useMutation<void, Error, StreamWorkflowParams>(\n ({ workflowId, runId, inputData, initialState, requestContext, perStep, resourceId }) => {\n setStreamResult({ status: 'pending', input: inputData, steps: {} });\n return consumeStream(async signal => {\n const run = await client.getWorkflow(workflowId).createRun({ runId, resourceId });\n if (signal.aborted) return;\n return run.stream({\n inputData,\n initialState,\n requestContext,\n closeOnSuspend: true,\n tracingOptions,\n perStep: perStep ?? debugMode,\n resourceId,\n });\n }, 'Error streaming workflow');\n },\n );\n\n const observeWorkflowStream = useMutation<void, Error, ObserveWorkflowStreamParams>(\n async ({ workflowId, runId, storeRunResult }) => {\n if (!isMountedRef.current) return;\n setStreamResult(storeRunResult ?? undefined);\n if (storeRunResult?.status === 'suspended') {\n closeActiveStream();\n setIsStreaming(false);\n return;\n }\n await consumeStream(async signal => {\n const run = await client.getWorkflow(workflowId).createRun({ runId });\n if (signal.aborted) return;\n return run.observeStream();\n }, 'Error observing workflow');\n },\n );\n\n const resumeWorkflowStream = useMutation<void, Error, ResumeWorkflowStreamParams>(\n ({ workflowId, runId, step, resumeData, requestContext, perStep }) =>\n consumeStream(async signal => {\n const run = await client.getWorkflow(workflowId).createRun({ runId });\n if (signal.aborted) return;\n return run.resumeStream({ step, resumeData, requestContext, tracingOptions, perStep: perStep ?? debugMode });\n }, 'Error resuming workflow stream'),\n );\n\n const timeTravelWorkflowStream = useMutation<void, Error, TimeTravelWorkflowStreamParams>(\n ({ workflowId, requestContext, runId, perStep, ...params }) =>\n consumeStream(async signal => {\n const run = await client.getWorkflow(workflowId).createRun({ runId });\n if (signal.aborted) return;\n return run.timeTravelStream({\n ...params,\n perStep: perStep ?? debugMode,\n requestContext,\n tracingOptions,\n });\n }, 'Error time traveling workflow stream'),\n );\n\n const closeStreamsAndReset = useCallback(() => {\n closeActiveStream();\n setIsStreaming(false);\n setStreamResult(undefined);\n }, [closeActiveStream]);\n\n return {\n streamWorkflow,\n streamResult,\n isStreaming,\n observeWorkflowStream,\n closeStreamsAndReset,\n resumeWorkflowStream,\n timeTravelWorkflowStream,\n };\n}\n","import { useMutation } from '../lib/use-mutation';\nimport { useMastraClient } from '../mastra-client-context';\nimport type {\n CreateWorkflowRunParams,\n CreateWorkflowRunResult,\n CancelWorkflowRunParams,\n CancelWorkflowRunResult,\n} from './types';\n\nexport { useStreamWorkflow } from './use-stream-workflow';\n\n/**\n * Hook for creating workflow runs.\n * Returns a mutation for creating a new workflow run.\n *\n * @example\n * ```tsx\n * const createWorkflowRun = useCreateWorkflowRun();\n *\n * // Create a run\n * const { runId } = await createWorkflowRun.mutateAsync({\n * workflowId: 'my-workflow'\n * });\n * ```\n */\nexport function useCreateWorkflowRun() {\n const client = useMastraClient();\n\n return useMutation<CreateWorkflowRunResult, Error, CreateWorkflowRunParams>(\n async ({ workflowId, prevRunId, resourceId }) => {\n try {\n const workflow = client.getWorkflow(workflowId);\n const { runId: newRunId } = await workflow.createRun({ runId: prevRunId, resourceId });\n return { runId: newRunId };\n } catch (error) {\n console.error('Error creating workflow run:', error);\n throw error;\n }\n },\n );\n}\n\n/**\n * Hook for canceling workflow runs.\n * Returns a mutation for canceling a running workflow.\n *\n * @example\n * ```tsx\n * const cancelWorkflowRun = useCancelWorkflowRun();\n *\n * // Cancel a run\n * await cancelWorkflowRun.mutateAsync({\n * workflowId: 'my-workflow',\n * runId: 'run-123'\n * });\n * ```\n */\nexport function useCancelWorkflowRun() {\n const client = useMastraClient();\n\n return useMutation<CancelWorkflowRunResult, Error, CancelWorkflowRunParams>(async ({ workflowId, runId }) => {\n try {\n const workflow = client.getWorkflow(workflowId);\n const run = await workflow.createRun({ runId });\n return run.cancelRun();\n } catch (error) {\n console.error('Error canceling workflow run:', error);\n throw error;\n }\n });\n}\n"],"mappings":"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"}