@mastra/react 1.13.0-alpha.3 → 1.13.0-alpha.5

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 (149) hide show
  1. package/dist/{accumulator-BmD8-x9I.cjs → accumulator-Bjfckb5t.cjs} +5 -9
  2. package/dist/{accumulator-BmD8-x9I.cjs.map → accumulator-Bjfckb5t.cjs.map} +1 -1
  3. package/dist/{accumulator-D9jAph99.js → accumulator-DysrPe6U.js} +5 -9
  4. package/dist/{accumulator-D9jAph99.js.map → accumulator-DysrPe6U.js.map} +1 -1
  5. package/dist/chat/index.cjs +1 -1
  6. package/dist/chat/index.js +1 -1
  7. package/dist/{combine-by-ids-CcaZKGT9.js → combine-by-ids-C-0oe4eH.js} +2 -3
  8. package/dist/{combine-by-ids-CcaZKGT9.js.map → combine-by-ids-C-0oe4eH.js.map} +1 -1
  9. package/dist/{combine-by-ids-D_lp6Dvq.cjs → combine-by-ids-ERVPXXBi.cjs} +2 -3
  10. package/dist/{combine-by-ids-D_lp6Dvq.cjs.map → combine-by-ids-ERVPXXBi.cjs.map} +1 -1
  11. package/dist/{experiments-CJw1N3FB.cjs → experiments-Duv0RgkM.cjs} +12 -19
  12. package/dist/{experiments-CJw1N3FB.cjs.map → experiments-Duv0RgkM.cjs.map} +1 -1
  13. package/dist/{experiments-B7vRMK5T.js → experiments-DyecjEut.js} +12 -19
  14. package/dist/{experiments-B7vRMK5T.js.map → experiments-DyecjEut.js.map} +1 -1
  15. package/dist/{feedback-refetch-interval-XD5FVc2k.cjs → feedback-refetch-interval-BBcT9r8s.cjs} +3 -4
  16. package/dist/{feedback-refetch-interval-XD5FVc2k.cjs.map → feedback-refetch-interval-BBcT9r8s.cjs.map} +1 -1
  17. package/dist/{feedback-refetch-interval-DLHzQoVV.js → feedback-refetch-interval-C12Nzb2r.js} +3 -4
  18. package/dist/{feedback-refetch-interval-DLHzQoVV.js.map → feedback-refetch-interval-C12Nzb2r.js.map} +1 -1
  19. package/dist/hooks/agents/index.cjs +19 -37
  20. package/dist/hooks/agents/index.cjs.map +1 -1
  21. package/dist/hooks/agents/index.js +19 -37
  22. package/dist/hooks/agents/index.js.map +1 -1
  23. package/dist/hooks/auth/index.cjs +11 -21
  24. package/dist/hooks/auth/index.cjs.map +1 -1
  25. package/dist/hooks/auth/index.js +11 -21
  26. package/dist/hooks/auth/index.js.map +1 -1
  27. package/dist/hooks/capabilities/index.cjs +11 -21
  28. package/dist/hooks/capabilities/index.cjs.map +1 -1
  29. package/dist/hooks/capabilities/index.js +11 -21
  30. package/dist/hooks/capabilities/index.js.map +1 -1
  31. package/dist/hooks/configuration/index.cjs +2 -3
  32. package/dist/hooks/configuration/index.js +2 -3
  33. package/dist/hooks/datasets/index.cjs +12 -21
  34. package/dist/hooks/datasets/index.cjs.map +1 -1
  35. package/dist/hooks/datasets/index.js +12 -21
  36. package/dist/hooks/datasets/index.js.map +1 -1
  37. package/dist/hooks/embedders/index.cjs +2 -3
  38. package/dist/hooks/embedders/index.js +2 -3
  39. package/dist/hooks/experiments/index.cjs +1 -1
  40. package/dist/hooks/experiments/index.js +1 -1
  41. package/dist/hooks/feedback/index.cjs +3 -4
  42. package/dist/hooks/feedback/index.js +3 -4
  43. package/dist/hooks/llm/index.cjs +2 -3
  44. package/dist/hooks/llm/index.js +2 -3
  45. package/dist/hooks/logs/index.cjs +4 -5
  46. package/dist/hooks/logs/index.js +4 -5
  47. package/dist/hooks/mcps/index.cjs +8 -15
  48. package/dist/hooks/mcps/index.cjs.map +1 -1
  49. package/dist/hooks/mcps/index.js +8 -15
  50. package/dist/hooks/mcps/index.js.map +1 -1
  51. package/dist/hooks/memory/index.cjs +5 -9
  52. package/dist/hooks/memory/index.cjs.map +1 -1
  53. package/dist/hooks/memory/index.js +5 -9
  54. package/dist/hooks/memory/index.js.map +1 -1
  55. package/dist/hooks/metrics/index.cjs +19 -36
  56. package/dist/hooks/metrics/index.cjs.map +1 -1
  57. package/dist/hooks/metrics/index.js +19 -36
  58. package/dist/hooks/metrics/index.js.map +1 -1
  59. package/dist/hooks/processors/index.cjs +2 -3
  60. package/dist/hooks/processors/index.js +2 -3
  61. package/dist/hooks/prompt-blocks/index.cjs +3 -5
  62. package/dist/hooks/prompt-blocks/index.cjs.map +1 -1
  63. package/dist/hooks/prompt-blocks/index.js +3 -5
  64. package/dist/hooks/prompt-blocks/index.js.map +1 -1
  65. package/dist/hooks/query/index.cjs +2 -3
  66. package/dist/hooks/query/index.js +2 -3
  67. package/dist/hooks/review/index.cjs +4 -6
  68. package/dist/hooks/review/index.cjs.map +1 -1
  69. package/dist/hooks/review/index.js +4 -6
  70. package/dist/hooks/review/index.js.map +1 -1
  71. package/dist/hooks/schedules/index.cjs +6 -10
  72. package/dist/hooks/schedules/index.cjs.map +1 -1
  73. package/dist/hooks/schedules/index.js +6 -10
  74. package/dist/hooks/schedules/index.js.map +1 -1
  75. package/dist/hooks/scores/index.cjs +8 -13
  76. package/dist/hooks/scores/index.cjs.map +1 -1
  77. package/dist/hooks/scores/index.js +8 -13
  78. package/dist/hooks/scores/index.js.map +1 -1
  79. package/dist/hooks/templates/index.cjs +2 -3
  80. package/dist/hooks/templates/index.js +2 -3
  81. package/dist/hooks/tool-providers/index.cjs +10 -19
  82. package/dist/hooks/tool-providers/index.cjs.map +1 -1
  83. package/dist/hooks/tool-providers/index.js +10 -19
  84. package/dist/hooks/tool-providers/index.js.map +1 -1
  85. package/dist/hooks/tools/index.cjs +3 -5
  86. package/dist/hooks/tools/index.cjs.map +1 -1
  87. package/dist/hooks/tools/index.js +3 -5
  88. package/dist/hooks/tools/index.js.map +1 -1
  89. package/dist/hooks/traces/index.cjs +71 -54
  90. package/dist/hooks/traces/index.cjs.map +1 -1
  91. package/dist/hooks/traces/index.d.ts +2 -0
  92. package/dist/hooks/traces/index.d.ts.map +1 -1
  93. package/dist/hooks/traces/index.js +70 -55
  94. package/dist/hooks/traces/index.js.map +1 -1
  95. package/dist/hooks/traces/use-span-aggregate.d.ts +16 -0
  96. package/dist/hooks/traces/use-span-aggregate.d.ts.map +1 -0
  97. package/dist/hooks/traces/use-trace-aggregate.d.ts +17 -0
  98. package/dist/hooks/traces/use-trace-aggregate.d.ts.map +1 -0
  99. package/dist/hooks/traces/use-trace-column-preferences-storage-key.d.ts +4 -2
  100. package/dist/hooks/traces/use-trace-column-preferences-storage-key.d.ts.map +1 -1
  101. package/dist/hooks/vectors/index.cjs +2 -3
  102. package/dist/hooks/vectors/index.js +2 -3
  103. package/dist/hooks/voice/index.cjs +3 -4
  104. package/dist/hooks/voice/index.js +3 -4
  105. package/dist/hooks/workflows/index.cjs +7 -11
  106. package/dist/hooks/workflows/index.cjs.map +1 -1
  107. package/dist/hooks/workflows/index.js +7 -11
  108. package/dist/hooks/workflows/index.js.map +1 -1
  109. package/dist/hooks/workspace/index.cjs +12 -22
  110. package/dist/hooks/workspace/index.cjs.map +1 -1
  111. package/dist/hooks/workspace/index.js +12 -22
  112. package/dist/hooks/workspace/index.js.map +1 -1
  113. package/dist/{hooks-XYsmqFCz.cjs → hooks-Bt15IwzP.cjs} +6 -9
  114. package/dist/{hooks-XYsmqFCz.cjs.map → hooks-Bt15IwzP.cjs.map} +1 -1
  115. package/dist/{hooks-DG-Y1KFe.js → hooks-Btt7PyI-.js} +6 -9
  116. package/dist/{hooks-DG-Y1KFe.js.map → hooks-Btt7PyI-.js.map} +1 -1
  117. package/dist/{hooks-BfysjY_K.js → hooks-CEikbhrN.js} +9 -15
  118. package/dist/{hooks-BfysjY_K.js.map → hooks-CEikbhrN.js.map} +1 -1
  119. package/dist/{hooks-BbUMSab8.cjs → hooks-D6LDSEcm.cjs} +9 -15
  120. package/dist/{hooks-BbUMSab8.cjs.map → hooks-D6LDSEcm.cjs.map} +1 -1
  121. package/dist/index.cjs +7 -9
  122. package/dist/index.cjs.map +1 -1
  123. package/dist/index.js +7 -9
  124. package/dist/index.js.map +1 -1
  125. package/dist/{map-CDv4fbu4.js → map-5-4U5rwA.js} +2 -3
  126. package/dist/{map-CDv4fbu4.js.map → map-5-4U5rwA.js.map} +1 -1
  127. package/dist/{map-wjmL1y5O.cjs → map-BGoWBTGy.cjs} +2 -3
  128. package/dist/{map-wjmL1y5O.cjs.map → map-BGoWBTGy.cjs.map} +1 -1
  129. package/dist/{mastra-client-context-Bx_g84YB.js → mastra-client-context-DQ5z_ze9.js} +2 -3
  130. package/dist/{mastra-client-context-Bx_g84YB.js.map → mastra-client-context-DQ5z_ze9.js.map} +1 -1
  131. package/dist/{mastra-client-context-DzX3f0RF.cjs → mastra-client-context-DX8wJM9p.cjs} +2 -3
  132. package/dist/{mastra-client-context-DzX3f0RF.cjs.map → mastra-client-context-DX8wJM9p.cjs.map} +1 -1
  133. package/dist/{query-utils-CcrChYgz.cjs → query-utils-BVgE_xxj.cjs} +2 -3
  134. package/dist/{query-utils-CcrChYgz.cjs.map → query-utils-BVgE_xxj.cjs.map} +1 -1
  135. package/dist/{query-utils-D1NgFnWU.js → query-utils-DvMERIwf.js} +2 -3
  136. package/dist/{query-utils-D1NgFnWU.js.map → query-utils-DvMERIwf.js.map} +1 -1
  137. package/dist/ui/index.cjs +15 -30
  138. package/dist/ui/index.cjs.map +1 -1
  139. package/dist/ui/index.js +14 -28
  140. package/dist/ui/index.js.map +1 -1
  141. package/dist/{use-in-view-B6eJO9Zi.cjs → use-in-view-BxdrrnCw.cjs} +2 -3
  142. package/dist/{use-in-view-B6eJO9Zi.cjs.map → use-in-view-BxdrrnCw.cjs.map} +1 -1
  143. package/dist/{use-in-view-C9sYPGRm.js → use-in-view-CyjKdplM.js} +2 -3
  144. package/dist/{use-in-view-C9sYPGRm.js.map → use-in-view-CyjKdplM.js.map} +1 -1
  145. package/dist/{voice-BOtUdMi8.cjs → voice-Didej2E1.cjs} +5 -8
  146. package/dist/{voice-BOtUdMi8.cjs.map → voice-Didej2E1.cjs.map} +1 -1
  147. package/dist/{voice-DgirjEyH.js → voice-ugGu7VyA.js} +5 -8
  148. package/dist/{voice-DgirjEyH.js.map → voice-ugGu7VyA.js.map} +1 -1
  149. package/package.json +19 -19
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["PER_PAGE","tanstackQueryOptions"],"sources":["../../../src/hooks/datasets/use-dataset-items.ts","../../../src/hooks/datasets/use-dataset-mutations.ts","../../../src/hooks/datasets/use-datasets.ts","../../../src/hooks/datasets/use-compare-experiments.ts","../../../src/hooks/datasets/use-dataset-experiments.ts","../../../src/hooks/datasets/use-dataset-item-versions.ts","../../../src/hooks/datasets/use-dataset-versions.ts","../../../src/hooks/datasets/use-experiments.ts","../../../src/hooks/datasets/use-workflow-schema.ts"],"sourcesContent":["import type { MastraClient } from '@mastra/client-js';\nimport { useQuery, useInfiniteQuery } from '@tanstack/react-query';\nimport type { InfiniteData, QueryKey, UseInfiniteQueryResult, UseQueryResult } from '@tanstack/react-query';\nimport { useEffect } from 'react';\nimport { useMastraClient } from '../../mastra-client-context';\nimport type { MastraInfiniteQueryOptions, MastraQueryOptions } from '../shared/query-options';\nimport { useInView } from '../shared/use-in-view';\n\n/**\n * Hook to fetch a single dataset item by ID\n */\ntype DatasetItemResponse = Awaited<ReturnType<MastraClient['getDatasetItem']>>;\n\n/**\n * Does not guard on empty ids; pass `queryOptions: { enabled }` to skip the fetch.\n */\nexport const useDatasetItem = <TData = DatasetItemResponse>({\n datasetId,\n itemId,\n queryOptions,\n}: {\n datasetId: string;\n itemId: string;\n queryOptions?: MastraQueryOptions<DatasetItemResponse, TData>;\n}): UseQueryResult<TData, Error> => {\n const client = useMastraClient();\n return useQuery({\n queryKey: ['dataset-item', datasetId, itemId],\n queryFn: () => client.getDatasetItem(datasetId, itemId),\n retry: false, // Don't retry 404s for deleted items\n ...queryOptions,\n });\n};\n\nconst PER_PAGE = 10;\n\ntype ListDatasetItemsResponse = Awaited<ReturnType<MastraClient['listDatasetItems']>>;\n\nexport type UseDatasetItemsResult = Omit<\n UseInfiniteQueryResult<InfiniteData<ListDatasetItemsResponse>, Error>,\n 'data'\n> & {\n data: ListDatasetItemsResponse['items'];\n total: number | undefined;\n setEndOfListElement: (element: HTMLDivElement | null) => void;\n};\n\n/**\n * Hook to list items in a dataset with infinite scroll pagination and optional search\n * @param version - Optional version timestamp to view historical snapshot\n */\nexport type DatasetItemsOrderBy = NonNullable<NonNullable<Parameters<MastraClient['listDatasetItems']>[1]>['orderBy']>;\n\n/**\n * Does not guard on empty ids; pass `queryOptions: { enabled }` to skip the fetch.\n */\nexport const useDatasetItems = ({\n datasetId,\n search,\n version,\n orderBy,\n queryOptions,\n}: {\n datasetId: string;\n search?: string;\n version?: number | null;\n orderBy?: DatasetItemsOrderBy;\n queryOptions?: MastraInfiniteQueryOptions<\n ListDatasetItemsResponse,\n InfiniteData<ListDatasetItemsResponse, number>,\n QueryKey,\n number\n >;\n}): UseDatasetItemsResult => {\n const client = useMastraClient();\n const { inView: isEndOfListInView, setRef: setEndOfListElement } = useInView();\n\n const query = useInfiniteQuery({\n queryKey: ['dataset-items', datasetId, search, version, orderBy],\n queryFn: async ({ pageParam }) => {\n const res = await client.listDatasetItems(datasetId, {\n page: pageParam,\n perPage: PER_PAGE,\n search: search || undefined,\n version: version || undefined,\n orderBy,\n });\n return res;\n },\n initialPageParam: 0,\n getNextPageParam: (lastPage, _, lastPageParam) => {\n if (!lastPage?.items?.length) {\n return undefined;\n }\n const totalFetched = (lastPageParam + 1) * PER_PAGE;\n const total = lastPage?.pagination?.total ?? 0;\n if (totalFetched >= total) {\n return undefined;\n }\n return lastPageParam + 1;\n },\n retry: false,\n ...queryOptions,\n });\n\n const items = query.data?.pages.flatMap(page => page?.items ?? []) ?? [];\n const total = query.data?.pages[0]?.pagination?.total;\n\n useEffect(() => {\n if (isEndOfListInView && query.hasNextPage && !query.isFetchingNextPage) {\n void query.fetchNextPage();\n }\n }, [isEndOfListInView, query]);\n\n return { ...query, data: items, total, setEndOfListElement };\n};\n","import type {\n CreateDatasetParams,\n UpdateDatasetParams,\n AddDatasetItemParams,\n UpdateDatasetItemParams,\n TriggerDatasetExperimentParams,\n UpdateDatasetExperimentParams,\n UpdateExperimentResultParams,\n BatchInsertDatasetItemsParams,\n BatchDeleteDatasetItemsParams,\n MastraClient,\n} from '@mastra/client-js';\nimport { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useMastraClient } from '../../mastra-client-context';\nimport type { MastraMutationOptions } from '../shared/query-options';\n\ntype DatasetItemMutationVariables = {\n datasetId: string;\n itemId: string;\n};\n\ntype ClientResult<K extends keyof MastraClient> = MastraClient[K] extends (...args: any[]) => Promise<infer R>\n ? R\n : never;\n\nexport interface DatasetMutationsQueryOptions {\n createDataset?: MastraMutationOptions<ClientResult<'createDataset'>, CreateDatasetParams>;\n updateDataset?: MastraMutationOptions<ClientResult<'updateDataset'>, UpdateDatasetParams>;\n deleteDataset?: MastraMutationOptions<ClientResult<'deleteDataset'>, string>;\n addItem?: MastraMutationOptions<ClientResult<'addDatasetItem'>, AddDatasetItemParams>;\n updateItem?: MastraMutationOptions<ClientResult<'updateDatasetItem'>, UpdateDatasetItemParams>;\n deleteItem?: MastraMutationOptions<ClientResult<'deleteDatasetItem'>, DatasetItemMutationVariables>;\n purgeItem?: MastraMutationOptions<ClientResult<'purgeDatasetItem'>, DatasetItemMutationVariables>;\n deleteItems?: MastraMutationOptions<\n ClientResult<'batchDeleteDatasetItems'>,\n { datasetId: string; itemIds: string[] }\n >;\n batchInsertItems?: MastraMutationOptions<ClientResult<'batchInsertDatasetItems'>, BatchInsertDatasetItemsParams>;\n batchDeleteItems?: MastraMutationOptions<ClientResult<'batchDeleteDatasetItems'>, BatchDeleteDatasetItemsParams>;\n triggerExperiment?: MastraMutationOptions<ClientResult<'triggerDatasetExperiment'>, TriggerDatasetExperimentParams>;\n deleteExperiment?: MastraMutationOptions<ClientResult<'deleteExperiment'>, string>;\n updateExperiment?: MastraMutationOptions<ClientResult<'updateDatasetExperiment'>, UpdateDatasetExperimentParams>;\n updateExperimentResult?: MastraMutationOptions<\n ClientResult<'updateDatasetExperimentResult'>,\n UpdateExperimentResultParams\n >;\n}\n\n/**\n * Hook providing mutation functions for datasets, items, and runs\n * All mutations invalidate relevant query caches on success.\n * `queryOptions` is keyed by returned mutation name and spread last; a user `onSuccess` replaces the internal invalidation.\n */\nexport const useDatasetMutations = ({ queryOptions }: { queryOptions?: DatasetMutationsQueryOptions } = {}) => {\n const client = useMastraClient();\n const queryClient = useQueryClient();\n\n const createDataset = useMutation({\n mutationFn: (params: CreateDatasetParams) => client.createDataset(params),\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: ['datasets'] });\n },\n ...queryOptions?.createDataset,\n });\n\n const updateDataset = useMutation({\n mutationFn: (params: UpdateDatasetParams) => client.updateDataset(params),\n onSuccess: (_, variables) => {\n void queryClient.invalidateQueries({ queryKey: ['datasets'] });\n void queryClient.invalidateQueries({ queryKey: ['dataset', variables.datasetId] });\n },\n ...queryOptions?.updateDataset,\n });\n\n const deleteDataset = useMutation({\n mutationFn: (datasetId: string) => client.deleteDataset(datasetId),\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: ['datasets'] });\n },\n ...queryOptions?.deleteDataset,\n });\n\n const addItem = useMutation({\n mutationFn: (params: AddDatasetItemParams) => client.addDatasetItem(params),\n onSuccess: (_, variables) => {\n void queryClient.invalidateQueries({ queryKey: ['dataset-items', variables.datasetId] });\n void queryClient.invalidateQueries({ queryKey: ['dataset', variables.datasetId] });\n void queryClient.invalidateQueries({ queryKey: ['dataset-versions', variables.datasetId] });\n },\n ...queryOptions?.addItem,\n });\n\n const updateItem = useMutation({\n mutationFn: (params: UpdateDatasetItemParams) => client.updateDatasetItem(params),\n onSuccess: (_, variables) => {\n void queryClient.invalidateQueries({ queryKey: ['dataset-items', variables.datasetId] });\n void queryClient.invalidateQueries({ queryKey: ['dataset-item', variables.datasetId, variables.itemId] });\n void queryClient.invalidateQueries({\n queryKey: ['dataset-item-versions', variables.datasetId, variables.itemId],\n });\n void queryClient.invalidateQueries({ queryKey: ['dataset-versions', variables.datasetId] });\n },\n ...queryOptions?.updateItem,\n });\n\n const deleteItem = useMutation({\n mutationFn: ({ datasetId, itemId }: DatasetItemMutationVariables) => client.deleteDatasetItem(datasetId, itemId),\n onSuccess: (_, variables) => {\n void queryClient.invalidateQueries({ queryKey: ['dataset-items', variables.datasetId] });\n void queryClient.invalidateQueries({ queryKey: ['dataset', variables.datasetId] });\n void queryClient.invalidateQueries({ queryKey: ['dataset-versions', variables.datasetId] });\n },\n ...queryOptions?.deleteItem,\n });\n\n const purgeItem = useMutation({\n mutationFn: ({ datasetId, itemId }: DatasetItemMutationVariables) => client.purgeDatasetItem(datasetId, itemId),\n onSuccess: (_, variables) => {\n void queryClient.invalidateQueries({ queryKey: ['dataset-items', variables.datasetId] });\n void queryClient.invalidateQueries({ queryKey: ['dataset-item', variables.datasetId, variables.itemId] });\n void queryClient.invalidateQueries({\n queryKey: ['dataset-item-versions', variables.datasetId, variables.itemId],\n });\n void queryClient.invalidateQueries({ queryKey: ['dataset-experiment-results'] });\n void queryClient.invalidateQueries({ queryKey: ['experiment-results'] });\n void queryClient.invalidateQueries({ queryKey: ['review-items'] });\n void queryClient.invalidateQueries({ queryKey: ['dataset-review-items'] });\n void queryClient.invalidateQueries({ queryKey: ['dataset-completed-items'] });\n void queryClient.invalidateQueries({ queryKey: ['experiment-review-summary'] });\n },\n ...queryOptions?.purgeItem,\n });\n\n // Batch insert items using the batch endpoint\n const batchInsertItems = useMutation({\n mutationFn: (params: BatchInsertDatasetItemsParams) => client.batchInsertDatasetItems(params),\n onSuccess: (_, variables) => {\n void queryClient.invalidateQueries({ queryKey: ['dataset-items', variables.datasetId] });\n void queryClient.invalidateQueries({ queryKey: ['dataset', variables.datasetId] });\n void queryClient.invalidateQueries({ queryKey: ['dataset-versions', variables.datasetId] });\n },\n ...queryOptions?.batchInsertItems,\n });\n\n // Batch delete items using the batch endpoint\n const batchDeleteItems = useMutation({\n mutationFn: (params: BatchDeleteDatasetItemsParams) => client.batchDeleteDatasetItems(params),\n onSuccess: (_, variables) => {\n void queryClient.invalidateQueries({ queryKey: ['dataset-items', variables.datasetId] });\n void queryClient.invalidateQueries({ queryKey: ['dataset', variables.datasetId] });\n void queryClient.invalidateQueries({ queryKey: ['dataset-versions', variables.datasetId] });\n },\n ...queryOptions?.batchDeleteItems,\n });\n\n // @deprecated - use batchDeleteItems mutation instead\n const deleteItems = useMutation({\n mutationFn: async ({ datasetId, itemIds }: { datasetId: string; itemIds: string[] }) => {\n return client.batchDeleteDatasetItems({ datasetId, itemIds });\n },\n onSuccess: (_, variables) => {\n void queryClient.invalidateQueries({ queryKey: ['dataset-items', variables.datasetId] });\n void queryClient.invalidateQueries({ queryKey: ['dataset', variables.datasetId] });\n void queryClient.invalidateQueries({ queryKey: ['dataset-versions', variables.datasetId] });\n },\n ...queryOptions?.deleteItems,\n });\n\n const triggerExperiment = useMutation({\n mutationFn: (params: TriggerDatasetExperimentParams) => client.triggerDatasetExperiment(params),\n onSuccess: (_, variables) => {\n void queryClient.invalidateQueries({ queryKey: ['dataset-experiments', variables.datasetId] });\n },\n ...queryOptions?.triggerExperiment,\n });\n\n const deleteExperiment = useMutation({\n mutationFn: (experimentId: string) => client.deleteExperiment(experimentId),\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: ['experiments'] });\n void queryClient.invalidateQueries({ queryKey: ['experiment'] });\n void queryClient.invalidateQueries({ queryKey: ['dataset-experiments'] });\n void queryClient.invalidateQueries({ queryKey: ['dataset-experiment'] });\n void queryClient.invalidateQueries({ queryKey: ['dataset-experiment-results'] });\n void queryClient.invalidateQueries({ queryKey: ['review-items'] });\n void queryClient.invalidateQueries({ queryKey: ['completed-items'] });\n void queryClient.invalidateQueries({ queryKey: ['experiment-review-summary'] });\n },\n ...queryOptions?.deleteExperiment,\n });\n\n const updateExperiment = useMutation({\n mutationFn: (params: UpdateDatasetExperimentParams) => client.updateDatasetExperiment(params),\n onSuccess: (_, variables) => {\n void queryClient.invalidateQueries({ queryKey: ['experiments'] });\n void queryClient.invalidateQueries({ queryKey: ['experiment', variables.experimentId] });\n void queryClient.invalidateQueries({ queryKey: ['dataset-experiments', variables.datasetId] });\n void queryClient.invalidateQueries({\n queryKey: ['dataset-experiment', variables.datasetId, variables.experimentId],\n });\n },\n ...queryOptions?.updateExperiment,\n });\n\n const updateExperimentResult = useMutation({\n mutationFn: (params: UpdateExperimentResultParams) => client.updateDatasetExperimentResult(params),\n onSuccess: (_, variables) => {\n void queryClient.invalidateQueries({ queryKey: ['experiment-results', variables.experimentId] });\n void queryClient.invalidateQueries({ queryKey: ['dataset-experiment-results'] });\n void queryClient.invalidateQueries({ queryKey: ['review-items'] });\n void queryClient.invalidateQueries({ queryKey: ['dataset-review-items'] });\n void queryClient.invalidateQueries({ queryKey: ['dataset-completed-items'] });\n void queryClient.invalidateQueries({ queryKey: ['experiment-review-summary'] });\n },\n ...queryOptions?.updateExperimentResult,\n });\n\n return {\n createDataset,\n updateDataset,\n deleteDataset,\n addItem,\n updateItem,\n deleteItem,\n purgeItem,\n deleteItems,\n batchInsertItems,\n batchDeleteItems,\n triggerExperiment,\n deleteExperiment,\n updateExperiment,\n updateExperimentResult,\n };\n};\n","import type { ExperimentTargetType, ListDatasetsParams, MastraClient } from '@mastra/client-js';\nimport { useInfiniteQuery, useQuery } from '@tanstack/react-query';\nimport type { InfiniteData, QueryKey, UseInfiniteQueryResult, UseQueryResult } from '@tanstack/react-query';\nimport { useEffect } from 'react';\nimport { useMastraClient } from '../../mastra-client-context';\nimport type { MastraInfiniteQueryOptions, MastraQueryOptions } from '../shared/query-options';\nimport { useInView } from '../shared/use-in-view';\n\ntype ListDatasetsResponse = Awaited<ReturnType<MastraClient['listDatasets']>>;\ntype DatasetResponse = Awaited<ReturnType<MastraClient['getDataset']>>;\n\n/**\n * Hook to list all datasets with optional pagination\n */\nexport const useDatasets = <TData = ListDatasetsResponse>({\n pagination,\n queryOptions,\n}: {\n pagination?: { page?: number; perPage?: number };\n queryOptions?: MastraQueryOptions<ListDatasetsResponse, TData>;\n} = {}): UseQueryResult<TData, Error> => {\n const client = useMastraClient();\n return useQuery({\n queryKey: ['datasets', pagination],\n queryFn: () => client.listDatasets(pagination),\n placeholderData: previousData => previousData,\n ...queryOptions,\n });\n};\n\nconst DATASETS_PER_PAGE = 20;\n\nexport interface DatasetTargetFilter {\n targetType?: ExperimentTargetType | '';\n targetId?: string;\n}\n\nexport type DatasetsOrderBy = NonNullable<ListDatasetsParams['orderBy']>;\n\ntype DatasetRecord = ListDatasetsResponse['datasets'][number];\n\nexport type UseInfiniteDatasetsResult<TData = DatasetRecord[]> = UseInfiniteQueryResult<TData, Error> & {\n setEndOfListElement: (element: HTMLDivElement | null) => void;\n};\n\n/**\n * Hook to list datasets with infinite scroll pagination, optionally scoped server-side to a target.\n * `data` defaults to the flattened dataset list; a user `select` replaces that flattening.\n */\nexport const useInfiniteDatasets = <TData = DatasetRecord[]>({\n filter,\n orderBy,\n queryOptions,\n}: {\n filter?: DatasetTargetFilter;\n orderBy?: DatasetsOrderBy;\n queryOptions?: MastraInfiniteQueryOptions<ListDatasetsResponse, TData, QueryKey, number>;\n} = {}): UseInfiniteDatasetsResult<TData> => {\n const client = useMastraClient();\n const { inView: isEndOfListInView, setRef: setEndOfListElement } = useInView();\n const targetType = filter?.targetType || undefined;\n const targetIds = filter?.targetId ? [filter.targetId] : undefined;\n\n const query = useInfiniteQuery({\n queryKey: ['datasets', 'infinite', { targetType, targetIds, orderBy }],\n queryFn: ({ pageParam }) =>\n client.listDatasets({ page: pageParam, perPage: DATASETS_PER_PAGE, targetType, targetIds, orderBy }),\n initialPageParam: 0,\n getNextPageParam: (lastPage, _, lastPageParam) => {\n if (!lastPage?.datasets?.length || !lastPage.pagination?.hasMore) {\n return undefined;\n }\n return lastPageParam + 1;\n },\n select: (data: InfiniteData<ListDatasetsResponse, number>) =>\n data.pages.flatMap(page => page?.datasets ?? []) as TData,\n ...queryOptions,\n });\n\n useEffect(() => {\n if (isEndOfListInView && query.hasNextPage && !query.isFetchingNextPage) {\n void query.fetchNextPage();\n }\n }, [isEndOfListInView, query]);\n\n return { ...query, setEndOfListElement };\n};\n\n// The datasetIds filter accepts at most 100 ids per request.\nconst DATASET_IDS_PER_REQUEST = 100;\n\n/**\n * Datasets matching the given ids, in one request per 100 ids, e.g. to name the datasets of listed\n * experiments without paging through every dataset. Ids without a dataset are absent from the result.\n */\nexport const useDatasetsByIds = ({\n datasetIds,\n}: {\n datasetIds: readonly string[];\n}): UseQueryResult<DatasetRecord[], Error> => {\n const client = useMastraClient();\n const uniqueIds = [...new Set(datasetIds)].toSorted();\n\n return useQuery({\n queryKey: ['datasets', 'by-ids', uniqueIds],\n enabled: uniqueIds.length > 0,\n queryFn: async () => {\n const batches: string[][] = [];\n for (let index = 0; index < uniqueIds.length; index += DATASET_IDS_PER_REQUEST) {\n batches.push(uniqueIds.slice(index, index + DATASET_IDS_PER_REQUEST));\n }\n const responses = await Promise.all(batches.map(batch => client.listDatasets({ datasetIds: batch })));\n return responses.flatMap(response => response.datasets);\n },\n // Loading more experiments adds ids; keep the names already resolved meanwhile.\n placeholderData: previousData => previousData,\n });\n};\n\n/**\n * Hook to fetch a single dataset by ID\n *\n * Does not guard on empty ids; pass `queryOptions: { enabled }` to skip the fetch.\n */\nexport const useDataset = <TData = DatasetResponse>({\n datasetId,\n queryOptions,\n}: {\n datasetId: string;\n queryOptions?: MastraQueryOptions<DatasetResponse, TData>;\n}): UseQueryResult<TData, Error> => {\n const client = useMastraClient();\n return useQuery({\n queryKey: ['dataset', datasetId],\n queryFn: () => client.getDataset(datasetId),\n ...queryOptions,\n });\n};\n","import type { CompareExperimentsResponse } 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 compare two to ten dataset experiments item by item against a baseline.\n * @param datasetId - ID of the dataset\n * @param experimentIds - IDs of the experiments to compare\n * @param baselineId - ID of the baseline experiment; must be one of `experimentIds` (defaults to the first)\n * @param queryOptions - TanStack Query options, spread last to override defaults\n *\n * Does not guard on empty ids; pass `queryOptions: { enabled }` to skip the fetch.\n */\nexport const useCompareExperiments = <TData = CompareExperimentsResponse>({\n datasetId,\n experimentIds,\n baselineId,\n queryOptions,\n}: {\n datasetId: string;\n experimentIds: string[];\n baselineId?: string;\n queryOptions?: MastraQueryOptions<CompareExperimentsResponse, TData>;\n}): UseQueryResult<TData, Error> => {\n const client = useMastraClient();\n return useQuery({\n queryKey: ['compare-experiments', datasetId, experimentIds, baselineId],\n queryFn: () => client.compareExperiments({ datasetId, experimentIds, baselineId }),\n ...queryOptions,\n });\n};\n","import type { ClientScoreRowData, DatasetExperimentResult, MastraClient } from '@mastra/client-js';\nimport type { ExperimentStatus } from '@mastra/core/storage';\nimport { queryOptions as tanstackQueryOptions, useInfiniteQuery, useQueries, useQuery } from '@tanstack/react-query';\nimport type {\n InfiniteData,\n QueryKey,\n UseInfiniteQueryResult,\n UseQueryOptions,\n UseQueryResult,\n} from '@tanstack/react-query';\nimport { useEffect } from 'react';\nimport { useMastraClient } from '../../mastra-client-context';\nimport { useCombineByIds } from '../shared/combine-by-ids';\nimport type { ExperimentQueriesResult } from '../shared/combine-by-ids';\nimport type { MastraInfiniteQueryOptions, MastraQueryOptions } from '../shared/query-options';\n\nexport type { ExperimentQueriesResult } from '../shared/combine-by-ids';\nimport { useInView } from '../shared/use-in-view';\n\ntype DatasetExperimentResponse = Awaited<ReturnType<MastraClient['getDatasetExperiment']>>;\ntype ExperimentResultsPage = Awaited<ReturnType<MastraClient['listDatasetExperimentResults']>>;\ntype ExperimentScoresByEntity = Record<string, ClientScoreRowData[]>;\ntype DatasetExperimentQueryKey = string[];\ntype ExperimentStatusQueryKey = (string | undefined)[];\n\nconst POLL_INTERVAL_MS = 2000;\nconst RESULTS_PER_PAGE = 100;\nconst SCORES_PER_PAGE = 100;\n\nconst isInProgress = (status: string | undefined) => status === 'running' || status === 'pending';\n\n/**\n * Key, fetcher and polling policy of the `dataset-experiment` query, shared by the single and\n * multi-experiment hooks so they hit the same cache entry.\n * Polls every 2 seconds while the experiment is 'running' or 'pending'.\n */\nexport const datasetExperimentQueryOptions = (\n client: MastraClient,\n datasetId: string,\n experimentId: string,\n): UseQueryOptions<DatasetExperimentResponse, Error, DatasetExperimentResponse, DatasetExperimentQueryKey> =>\n tanstackQueryOptions({\n queryKey: ['dataset-experiment', datasetId, experimentId],\n queryFn: () => client.getDatasetExperiment(datasetId, experimentId),\n gcTime: 0,\n staleTime: 0,\n refetchInterval: query => (isInProgress(query.state.data?.status) ? POLL_INTERVAL_MS : false),\n });\n\n/**\n * Key and fetcher of the `dataset-experiment-scores` query: every score of an experiment, across all\n * pages, grouped by dataset item id. Polls every 2 seconds while `experimentStatus` is in progress.\n */\nexport const experimentScoresQueryOptions = (\n client: MastraClient,\n experimentId: string,\n experimentStatus: ExperimentStatus | undefined,\n): UseQueryOptions<ExperimentScoresByEntity, Error, ExperimentScoresByEntity, ExperimentStatusQueryKey> =>\n tanstackQueryOptions({\n queryKey: ['dataset-experiment-scores', experimentId, experimentStatus],\n queryFn: async (): Promise<ExperimentScoresByEntity> => {\n const allScores: ClientScoreRowData[] = [];\n let page = 0;\n\n while (true) {\n const response = await client.listScoresByRunId({ runId: experimentId, page, perPage: SCORES_PER_PAGE });\n allScores.push(...response.scores);\n if (!response.pagination.hasMore) break;\n page++;\n }\n\n const grouped: ExperimentScoresByEntity = {};\n for (const row of allScores) {\n (grouped[row.entityId] ??= []).push(row);\n }\n return grouped;\n },\n refetchInterval: isInProgress(experimentStatus) ? POLL_INTERVAL_MS : false,\n });\n\n/**\n * Key and fetcher of the `dataset-experiment-results-all` query: every result of an experiment, across\n * all pages. Polls every 2 seconds while `experimentStatus` is in progress.\n */\nexport const allDatasetExperimentResultsQueryOptions = (\n client: MastraClient,\n datasetId: string,\n experimentId: string,\n experimentStatus: ExperimentStatus | undefined,\n): UseQueryOptions<DatasetExperimentResult[], Error, DatasetExperimentResult[], ExperimentStatusQueryKey> =>\n tanstackQueryOptions({\n queryKey: ['dataset-experiment-results-all', datasetId, experimentId, experimentStatus],\n queryFn: async (): Promise<DatasetExperimentResult[]> => {\n const allResults: DatasetExperimentResult[] = [];\n let page = 0;\n\n while (true) {\n const response = await client.listDatasetExperimentResults(datasetId, experimentId, {\n page,\n perPage: RESULTS_PER_PAGE,\n });\n allResults.push(...response.results);\n if (!response.pagination.hasMore || response.results.length === 0) break;\n page++;\n }\n\n return allResults;\n },\n refetchInterval: isInProgress(experimentStatus) ? POLL_INTERVAL_MS : false,\n });\n\n/** An experiment id plus its status, which drives polling of its dependent queries. */\nexport interface ExperimentRef {\n id: string;\n status?: ExperimentStatus;\n}\n\n/**\n * Does not guard on empty ids; pass `queryOptions: { enabled }` to skip the fetch.\n */\nexport const useDatasetExperiment = <TData = DatasetExperimentResponse>({\n datasetId,\n experimentId,\n queryOptions,\n}: {\n datasetId: string;\n experimentId: string;\n queryOptions?: MastraQueryOptions<DatasetExperimentResponse, TData, DatasetExperimentQueryKey>;\n}): UseQueryResult<TData, Error> => {\n const client = useMastraClient();\n const { queryKey, queryFn, gcTime, staleTime, refetchInterval } = datasetExperimentQueryOptions(\n client,\n datasetId,\n experimentId,\n );\n return useQuery<DatasetExperimentResponse, Error, TData, DatasetExperimentQueryKey>({\n queryKey,\n queryFn,\n gcTime,\n staleTime,\n refetchInterval,\n ...queryOptions,\n });\n};\n\n/**\n * Fetches several experiments of one dataset in parallel, each polled while it runs.\n * The server 404s an experiment that does not belong to `datasetId`, which surfaces as `error`.\n */\nexport const useDatasetExperimentsQueries = ({\n datasetId,\n experimentIds,\n}: {\n datasetId: string;\n experimentIds: string[];\n}): ExperimentQueriesResult<DatasetExperimentResponse> => {\n const client = useMastraClient();\n const combine = useCombineByIds<DatasetExperimentResponse>(experimentIds);\n return useQueries({\n queries: experimentIds.map(id => datasetExperimentQueryOptions(client, datasetId, id)),\n combine,\n });\n};\n\nexport type ExperimentResultsOrderBy = NonNullable<\n NonNullable<Parameters<MastraClient['listDatasetExperimentResults']>[2]>['orderBy']\n>;\n\ninterface UseDatasetExperimentResultsParams<TData = DatasetExperimentResult[]> {\n datasetId: string;\n experimentId: string;\n experimentStatus?: ExperimentStatus;\n orderBy?: ExperimentResultsOrderBy;\n queryOptions?: MastraInfiniteQueryOptions<ExperimentResultsPage, TData, QueryKey, number>;\n}\n\n/**\n * Hook to list results for a dataset experiment with infinite scroll pagination.\n * Polls every 2 seconds while experiment status is 'pending' or 'running'.\n *\n * Does not guard on empty ids; pass `queryOptions: { enabled }` to skip the fetch.\n */\nexport const useDatasetExperimentResults = <TData = DatasetExperimentResult[]>({\n datasetId,\n experimentId,\n experimentStatus,\n orderBy,\n queryOptions,\n}: UseDatasetExperimentResultsParams<TData>): UseInfiniteQueryResult<TData, Error> & {\n setEndOfListElement: (element: HTMLDivElement | null) => void;\n} => {\n const client = useMastraClient();\n const { inView: isEndOfListInView, setRef: setEndOfListElement } = useInView();\n\n const query = useInfiniteQuery({\n queryKey: ['dataset-experiment-results', datasetId, experimentId, experimentStatus, orderBy],\n queryFn: async ({ pageParam }) => {\n return client.listDatasetExperimentResults(datasetId, experimentId, {\n page: pageParam,\n perPage: RESULTS_PER_PAGE,\n orderBy,\n });\n },\n initialPageParam: 0,\n getNextPageParam: (lastPage, _, lastPageParam) => {\n if (!lastPage?.results?.length) {\n return undefined;\n }\n const totalFetched = (lastPageParam + 1) * RESULTS_PER_PAGE;\n const total = lastPage?.pagination?.total ?? 0;\n if (totalFetched >= total) {\n return undefined;\n }\n return lastPageParam + 1;\n },\n refetchInterval: isInProgress(experimentStatus) ? POLL_INTERVAL_MS : false,\n select: (data: InfiniteData<ExperimentResultsPage, number>) => {\n return data.pages.flatMap(page => page?.results ?? []) as TData;\n },\n ...queryOptions,\n });\n\n useEffect(() => {\n if (isEndOfListInView && query.hasNextPage && !query.isFetchingNextPage) {\n void query.fetchNextPage();\n }\n }, [isEndOfListInView, query]);\n\n return { ...query, setEndOfListElement };\n};\n\n/**\n * Fetches every result (all pages) of several experiments of one dataset in parallel.\n * Each experiment is polled while its `status` is in progress.\n */\nexport const useAllDatasetExperimentResultsQueries = ({\n datasetId,\n experiments,\n}: {\n datasetId: string;\n experiments: ExperimentRef[];\n}): ExperimentQueriesResult<DatasetExperimentResult[]> => {\n const client = useMastraClient();\n const combine = useCombineByIds<DatasetExperimentResult[]>(experiments.map(experiment => experiment.id));\n return useQueries({\n queries: experiments.map(experiment =>\n allDatasetExperimentResultsQueryOptions(client, datasetId, experiment.id, experiment.status),\n ),\n combine,\n });\n};\n\n/**\n * Hook to fetch all scores for an experiment, transformed to Record<entityId, ClientScoreRowData[]>\n * Paginates through all pages to ensure no scores are silently dropped.\n *\n * Does not guard on empty ids; pass `queryOptions: { enabled }` to skip the fetch.\n */\nexport const useScoresByExperimentId = <TData = ExperimentScoresByEntity>({\n experimentId,\n experimentStatus,\n queryOptions,\n}: {\n experimentId: string;\n experimentStatus?: ExperimentStatus;\n queryOptions?: MastraQueryOptions<ExperimentScoresByEntity, TData, ExperimentStatusQueryKey>;\n}): UseQueryResult<TData, Error> => {\n const client = useMastraClient();\n const { queryKey, queryFn, refetchInterval } = experimentScoresQueryOptions(client, experimentId, experimentStatus);\n return useQuery<ExperimentScoresByEntity, Error, TData, ExperimentStatusQueryKey>({\n queryKey,\n queryFn,\n refetchInterval,\n ...queryOptions,\n });\n};\n\n/**\n * Fetches every score of several experiments in parallel, each grouped by dataset item id.\n * Each experiment is polled while its `status` is in progress.\n */\nexport const useScoresByExperimentIdsQueries = ({\n experiments,\n}: {\n experiments: ExperimentRef[];\n}): ExperimentQueriesResult<ExperimentScoresByEntity> => {\n const client = useMastraClient();\n const combine = useCombineByIds<ExperimentScoresByEntity>(experiments.map(experiment => experiment.id));\n return useQueries({\n queries: experiments.map(experiment => experimentScoresQueryOptions(client, experiment.id, experiment.status)),\n combine,\n });\n};\n","import type { DatasetItemVersionResponse } 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 type DatasetItemVersion = DatasetItemVersionResponse & {\n validTo: number | null;\n isDeleted: boolean;\n isLatest: boolean;\n};\n\n/**\n * Hook to fetch full item history (SCD-2 rows).\n *\n * Does not guard on empty ids; pass `queryOptions: { enabled }` to skip the fetch.\n */\nexport const useDatasetItemVersions = <TData = DatasetItemVersion[]>({\n datasetId,\n itemId,\n queryOptions,\n}: {\n datasetId: string;\n itemId: string;\n queryOptions?: MastraQueryOptions<DatasetItemVersion[], TData>;\n}): UseQueryResult<TData, Error> => {\n const client = useMastraClient();\n\n return useQuery({\n queryKey: ['dataset-item-versions', datasetId, itemId],\n queryFn: async (): Promise<DatasetItemVersion[]> => {\n const res = await client.getItemHistory(datasetId, itemId);\n\n return (res?.history ?? []).map(\n (version, index): DatasetItemVersion => ({\n id: version.id,\n datasetId: version.datasetId,\n datasetVersion: version.datasetVersion,\n input: version.input,\n groundTruth: version.groundTruth,\n expectedTrajectory: version.expectedTrajectory,\n toolMocks: version.toolMocks ?? undefined,\n scorerIds: version.scorerIds ?? undefined,\n requestContext: version.requestContext ?? undefined,\n metadata: version.metadata ?? undefined,\n validTo: version.validTo,\n isDeleted: version.isDeleted,\n createdAt: version.createdAt,\n updatedAt: version.updatedAt,\n isLatest: index === 0,\n }),\n );\n },\n ...queryOptions,\n });\n};\n\n/**\n * Hook to fetch a specific version of a dataset item.\n *\n * Does not guard on empty ids; pass `queryOptions: { enabled }` to skip the fetch.\n */\nexport const useDatasetItemVersion = <TData = DatasetItemVersion>({\n datasetId,\n itemId,\n datasetVersion,\n latestVersion,\n queryOptions,\n}: {\n datasetId: string;\n itemId: string;\n datasetVersion: number;\n latestVersion?: number;\n queryOptions?: MastraQueryOptions<DatasetItemVersion, TData>;\n}): UseQueryResult<TData, Error> => {\n const client = useMastraClient();\n\n return useQuery({\n queryKey: ['dataset-item-version', datasetId, itemId, datasetVersion],\n queryFn: async (): Promise<DatasetItemVersion> => {\n const v = await client.getDatasetItemVersion(datasetId, itemId, datasetVersion);\n\n return {\n id: v.id,\n datasetId: v.datasetId,\n datasetVersion: v.datasetVersion,\n input: v.input,\n groundTruth: v.groundTruth,\n expectedTrajectory: v.expectedTrajectory,\n toolMocks: v.toolMocks ?? undefined,\n scorerIds: v.scorerIds ?? undefined,\n requestContext: v.requestContext ?? undefined,\n metadata: v.metadata ?? undefined,\n validTo: null,\n isDeleted: false,\n createdAt: v.createdAt,\n updatedAt: v.updatedAt,\n isLatest: latestVersion != null ? datasetVersion === latestVersion : false,\n };\n },\n ...queryOptions,\n });\n};\n","import type { MastraClient } from '@mastra/client-js';\nimport { useInfiniteQuery } from '@tanstack/react-query';\nimport type { InfiniteData, QueryKey } from '@tanstack/react-query';\nimport { useMastraClient } from '../../mastra-client-context';\nimport type { MastraInfiniteQueryOptions } from '../shared/query-options';\n\nexport interface DatasetVersion {\n id?: string;\n datasetId?: string;\n version: number;\n createdAt?: Date | string;\n isCurrent: boolean;\n}\n\ntype DatasetVersionsPage = Awaited<ReturnType<MastraClient['listDatasetVersions']>>;\n\nconst PER_PAGE = 10;\n\n/**\n * Hook to fetch dataset versions from the API with infinite pagination.\n * `data` defaults to the flattened `DatasetVersion[]`; a user `select` replaces that.\n *\n * Does not guard on empty ids; pass `queryOptions: { enabled }` to skip the fetch.\n */\nexport const useDatasetVersions = <TData = DatasetVersion[]>({\n datasetId,\n queryOptions,\n}: {\n datasetId: string;\n queryOptions?: MastraInfiniteQueryOptions<DatasetVersionsPage, TData, QueryKey, number>;\n}) => {\n const client = useMastraClient();\n\n return useInfiniteQuery({\n queryKey: ['dataset-versions', datasetId],\n queryFn: async ({ pageParam }) => {\n return client.listDatasetVersions(datasetId, { page: pageParam, perPage: PER_PAGE });\n },\n initialPageParam: 0,\n getNextPageParam: (lastPage, _, lastPageParam) => {\n if (lastPage?.pagination?.hasMore) {\n return lastPageParam + 1;\n }\n return undefined;\n },\n select: (data: InfiniteData<DatasetVersionsPage, number>) => {\n return data.pages\n .flatMap(page => page?.versions ?? [])\n .map(\n (v, index): DatasetVersion => ({\n id: v.id,\n datasetId: v.datasetId,\n version: v.version,\n createdAt: v.createdAt,\n isCurrent: index === 0,\n }),\n ) as TData;\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\ntype ListExperimentsResponse = Awaited<ReturnType<MastraClient['listExperiments']>>;\ntype GetExperimentResponse = Awaited<ReturnType<MastraClient['getExperiment']>>;\n\n/**\n * Hook to list all experiments across all datasets with optional pagination\n */\nexport const useExperiments = <TData = ListExperimentsResponse>({\n pagination,\n queryOptions,\n}: {\n pagination?: { page?: number; perPage?: number };\n queryOptions?: MastraQueryOptions<ListExperimentsResponse, TData>;\n} = {}): UseQueryResult<TData, Error> => {\n const client = useMastraClient();\n return useQuery({\n queryKey: ['experiments', pagination],\n queryFn: () => client.listExperiments(pagination),\n ...queryOptions,\n });\n};\n\n/**\n * Hook to fetch a single experiment by ID without knowing its dataset\n */\nexport const useExperiment = <TData = GetExperimentResponse>({\n experimentId,\n queryOptions,\n}: {\n experimentId: string;\n queryOptions?: MastraQueryOptions<GetExperimentResponse, TData>;\n}): UseQueryResult<TData, Error> => {\n const client = useMastraClient();\n return useQuery({\n queryKey: ['experiment', experimentId],\n queryFn: () => client.getExperiment(experimentId),\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\ntype WorkflowSchemaResponse = Awaited<ReturnType<ReturnType<MastraClient['getWorkflow']>['getSchema']>>;\n\n/**\n * Hook to fetch workflow input/output schema by workflow ID.\n * Returns { inputSchema, outputSchema } where each is Record<string, unknown> | null.\n *\n * Does not guard on empty ids; pass `queryOptions: { enabled }` to skip the fetch.\n */\nexport function useWorkflowSchema<TData = WorkflowSchemaResponse>({\n workflowId,\n queryOptions,\n}: {\n workflowId: string | null;\n queryOptions?: MastraQueryOptions<WorkflowSchemaResponse, TData>;\n}): UseQueryResult<TData, Error> {\n const client = useMastraClient();\n\n return useQuery({\n queryKey: ['workflow-schema', workflowId],\n queryFn: async () => {\n if (!workflowId) throw new Error('No workflow selected');\n return client.getWorkflow(workflowId).getSchema();\n },\n staleTime: 5 * 60 * 1000, // Cache for 5 minutes\n ...queryOptions,\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["PER_PAGE","tanstackQueryOptions"],"sources":["../../../src/hooks/datasets/use-dataset-items.ts","../../../src/hooks/datasets/use-dataset-mutations.ts","../../../src/hooks/datasets/use-datasets.ts","../../../src/hooks/datasets/use-compare-experiments.ts","../../../src/hooks/datasets/use-dataset-experiments.ts","../../../src/hooks/datasets/use-dataset-item-versions.ts","../../../src/hooks/datasets/use-dataset-versions.ts","../../../src/hooks/datasets/use-experiments.ts","../../../src/hooks/datasets/use-workflow-schema.ts"],"sourcesContent":["import type { MastraClient } from '@mastra/client-js';\nimport { useQuery, useInfiniteQuery } from '@tanstack/react-query';\nimport type { InfiniteData, QueryKey, UseInfiniteQueryResult, UseQueryResult } from '@tanstack/react-query';\nimport { useEffect } from 'react';\nimport { useMastraClient } from '../../mastra-client-context';\nimport type { MastraInfiniteQueryOptions, MastraQueryOptions } from '../shared/query-options';\nimport { useInView } from '../shared/use-in-view';\n\n/**\n * Hook to fetch a single dataset item by ID\n */\ntype DatasetItemResponse = Awaited<ReturnType<MastraClient['getDatasetItem']>>;\n\n/**\n * Does not guard on empty ids; pass `queryOptions: { enabled }` to skip the fetch.\n */\nexport const useDatasetItem = <TData = DatasetItemResponse>({\n datasetId,\n itemId,\n queryOptions,\n}: {\n datasetId: string;\n itemId: string;\n queryOptions?: MastraQueryOptions<DatasetItemResponse, TData>;\n}): UseQueryResult<TData, Error> => {\n const client = useMastraClient();\n return useQuery({\n queryKey: ['dataset-item', datasetId, itemId],\n queryFn: () => client.getDatasetItem(datasetId, itemId),\n retry: false, // Don't retry 404s for deleted items\n ...queryOptions,\n });\n};\n\nconst PER_PAGE = 10;\n\ntype ListDatasetItemsResponse = Awaited<ReturnType<MastraClient['listDatasetItems']>>;\n\nexport type UseDatasetItemsResult = Omit<\n UseInfiniteQueryResult<InfiniteData<ListDatasetItemsResponse>, Error>,\n 'data'\n> & {\n data: ListDatasetItemsResponse['items'];\n total: number | undefined;\n setEndOfListElement: (element: HTMLDivElement | null) => void;\n};\n\n/**\n * Hook to list items in a dataset with infinite scroll pagination and optional search\n * @param version - Optional version timestamp to view historical snapshot\n */\nexport type DatasetItemsOrderBy = NonNullable<NonNullable<Parameters<MastraClient['listDatasetItems']>[1]>['orderBy']>;\n\n/**\n * Does not guard on empty ids; pass `queryOptions: { enabled }` to skip the fetch.\n */\nexport const useDatasetItems = ({\n datasetId,\n search,\n version,\n orderBy,\n queryOptions,\n}: {\n datasetId: string;\n search?: string;\n version?: number | null;\n orderBy?: DatasetItemsOrderBy;\n queryOptions?: MastraInfiniteQueryOptions<\n ListDatasetItemsResponse,\n InfiniteData<ListDatasetItemsResponse, number>,\n QueryKey,\n number\n >;\n}): UseDatasetItemsResult => {\n const client = useMastraClient();\n const { inView: isEndOfListInView, setRef: setEndOfListElement } = useInView();\n\n const query = useInfiniteQuery({\n queryKey: ['dataset-items', datasetId, search, version, orderBy],\n queryFn: async ({ pageParam }) => {\n const res = await client.listDatasetItems(datasetId, {\n page: pageParam,\n perPage: PER_PAGE,\n search: search || undefined,\n version: version || undefined,\n orderBy,\n });\n return res;\n },\n initialPageParam: 0,\n getNextPageParam: (lastPage, _, lastPageParam) => {\n if (!lastPage?.items?.length) {\n return undefined;\n }\n const totalFetched = (lastPageParam + 1) * PER_PAGE;\n const total = lastPage?.pagination?.total ?? 0;\n if (totalFetched >= total) {\n return undefined;\n }\n return lastPageParam + 1;\n },\n retry: false,\n ...queryOptions,\n });\n\n const items = query.data?.pages.flatMap(page => page?.items ?? []) ?? [];\n const total = query.data?.pages[0]?.pagination?.total;\n\n useEffect(() => {\n if (isEndOfListInView && query.hasNextPage && !query.isFetchingNextPage) {\n void query.fetchNextPage();\n }\n }, [isEndOfListInView, query]);\n\n return { ...query, data: items, total, setEndOfListElement };\n};\n","import type {\n CreateDatasetParams,\n UpdateDatasetParams,\n AddDatasetItemParams,\n UpdateDatasetItemParams,\n TriggerDatasetExperimentParams,\n UpdateDatasetExperimentParams,\n UpdateExperimentResultParams,\n BatchInsertDatasetItemsParams,\n BatchDeleteDatasetItemsParams,\n MastraClient,\n} from '@mastra/client-js';\nimport { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useMastraClient } from '../../mastra-client-context';\nimport type { MastraMutationOptions } from '../shared/query-options';\n\ntype DatasetItemMutationVariables = {\n datasetId: string;\n itemId: string;\n};\n\ntype ClientResult<K extends keyof MastraClient> = MastraClient[K] extends (...args: any[]) => Promise<infer R>\n ? R\n : never;\n\nexport interface DatasetMutationsQueryOptions {\n createDataset?: MastraMutationOptions<ClientResult<'createDataset'>, CreateDatasetParams>;\n updateDataset?: MastraMutationOptions<ClientResult<'updateDataset'>, UpdateDatasetParams>;\n deleteDataset?: MastraMutationOptions<ClientResult<'deleteDataset'>, string>;\n addItem?: MastraMutationOptions<ClientResult<'addDatasetItem'>, AddDatasetItemParams>;\n updateItem?: MastraMutationOptions<ClientResult<'updateDatasetItem'>, UpdateDatasetItemParams>;\n deleteItem?: MastraMutationOptions<ClientResult<'deleteDatasetItem'>, DatasetItemMutationVariables>;\n purgeItem?: MastraMutationOptions<ClientResult<'purgeDatasetItem'>, DatasetItemMutationVariables>;\n deleteItems?: MastraMutationOptions<\n ClientResult<'batchDeleteDatasetItems'>,\n { datasetId: string; itemIds: string[] }\n >;\n batchInsertItems?: MastraMutationOptions<ClientResult<'batchInsertDatasetItems'>, BatchInsertDatasetItemsParams>;\n batchDeleteItems?: MastraMutationOptions<ClientResult<'batchDeleteDatasetItems'>, BatchDeleteDatasetItemsParams>;\n triggerExperiment?: MastraMutationOptions<ClientResult<'triggerDatasetExperiment'>, TriggerDatasetExperimentParams>;\n deleteExperiment?: MastraMutationOptions<ClientResult<'deleteExperiment'>, string>;\n updateExperiment?: MastraMutationOptions<ClientResult<'updateDatasetExperiment'>, UpdateDatasetExperimentParams>;\n updateExperimentResult?: MastraMutationOptions<\n ClientResult<'updateDatasetExperimentResult'>,\n UpdateExperimentResultParams\n >;\n}\n\n/**\n * Hook providing mutation functions for datasets, items, and runs\n * All mutations invalidate relevant query caches on success.\n * `queryOptions` is keyed by returned mutation name and spread last; a user `onSuccess` replaces the internal invalidation.\n */\nexport const useDatasetMutations = ({ queryOptions }: { queryOptions?: DatasetMutationsQueryOptions } = {}) => {\n const client = useMastraClient();\n const queryClient = useQueryClient();\n\n const createDataset = useMutation({\n mutationFn: (params: CreateDatasetParams) => client.createDataset(params),\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: ['datasets'] });\n },\n ...queryOptions?.createDataset,\n });\n\n const updateDataset = useMutation({\n mutationFn: (params: UpdateDatasetParams) => client.updateDataset(params),\n onSuccess: (_, variables) => {\n void queryClient.invalidateQueries({ queryKey: ['datasets'] });\n void queryClient.invalidateQueries({ queryKey: ['dataset', variables.datasetId] });\n },\n ...queryOptions?.updateDataset,\n });\n\n const deleteDataset = useMutation({\n mutationFn: (datasetId: string) => client.deleteDataset(datasetId),\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: ['datasets'] });\n },\n ...queryOptions?.deleteDataset,\n });\n\n const addItem = useMutation({\n mutationFn: (params: AddDatasetItemParams) => client.addDatasetItem(params),\n onSuccess: (_, variables) => {\n void queryClient.invalidateQueries({ queryKey: ['dataset-items', variables.datasetId] });\n void queryClient.invalidateQueries({ queryKey: ['dataset', variables.datasetId] });\n void queryClient.invalidateQueries({ queryKey: ['dataset-versions', variables.datasetId] });\n },\n ...queryOptions?.addItem,\n });\n\n const updateItem = useMutation({\n mutationFn: (params: UpdateDatasetItemParams) => client.updateDatasetItem(params),\n onSuccess: (_, variables) => {\n void queryClient.invalidateQueries({ queryKey: ['dataset-items', variables.datasetId] });\n void queryClient.invalidateQueries({ queryKey: ['dataset-item', variables.datasetId, variables.itemId] });\n void queryClient.invalidateQueries({\n queryKey: ['dataset-item-versions', variables.datasetId, variables.itemId],\n });\n void queryClient.invalidateQueries({ queryKey: ['dataset-versions', variables.datasetId] });\n },\n ...queryOptions?.updateItem,\n });\n\n const deleteItem = useMutation({\n mutationFn: ({ datasetId, itemId }: DatasetItemMutationVariables) => client.deleteDatasetItem(datasetId, itemId),\n onSuccess: (_, variables) => {\n void queryClient.invalidateQueries({ queryKey: ['dataset-items', variables.datasetId] });\n void queryClient.invalidateQueries({ queryKey: ['dataset', variables.datasetId] });\n void queryClient.invalidateQueries({ queryKey: ['dataset-versions', variables.datasetId] });\n },\n ...queryOptions?.deleteItem,\n });\n\n const purgeItem = useMutation({\n mutationFn: ({ datasetId, itemId }: DatasetItemMutationVariables) => client.purgeDatasetItem(datasetId, itemId),\n onSuccess: (_, variables) => {\n void queryClient.invalidateQueries({ queryKey: ['dataset-items', variables.datasetId] });\n void queryClient.invalidateQueries({ queryKey: ['dataset-item', variables.datasetId, variables.itemId] });\n void queryClient.invalidateQueries({\n queryKey: ['dataset-item-versions', variables.datasetId, variables.itemId],\n });\n void queryClient.invalidateQueries({ queryKey: ['dataset-experiment-results'] });\n void queryClient.invalidateQueries({ queryKey: ['experiment-results'] });\n void queryClient.invalidateQueries({ queryKey: ['review-items'] });\n void queryClient.invalidateQueries({ queryKey: ['dataset-review-items'] });\n void queryClient.invalidateQueries({ queryKey: ['dataset-completed-items'] });\n void queryClient.invalidateQueries({ queryKey: ['experiment-review-summary'] });\n },\n ...queryOptions?.purgeItem,\n });\n\n // Batch insert items using the batch endpoint\n const batchInsertItems = useMutation({\n mutationFn: (params: BatchInsertDatasetItemsParams) => client.batchInsertDatasetItems(params),\n onSuccess: (_, variables) => {\n void queryClient.invalidateQueries({ queryKey: ['dataset-items', variables.datasetId] });\n void queryClient.invalidateQueries({ queryKey: ['dataset', variables.datasetId] });\n void queryClient.invalidateQueries({ queryKey: ['dataset-versions', variables.datasetId] });\n },\n ...queryOptions?.batchInsertItems,\n });\n\n // Batch delete items using the batch endpoint\n const batchDeleteItems = useMutation({\n mutationFn: (params: BatchDeleteDatasetItemsParams) => client.batchDeleteDatasetItems(params),\n onSuccess: (_, variables) => {\n void queryClient.invalidateQueries({ queryKey: ['dataset-items', variables.datasetId] });\n void queryClient.invalidateQueries({ queryKey: ['dataset', variables.datasetId] });\n void queryClient.invalidateQueries({ queryKey: ['dataset-versions', variables.datasetId] });\n },\n ...queryOptions?.batchDeleteItems,\n });\n\n // @deprecated - use batchDeleteItems mutation instead\n const deleteItems = useMutation({\n mutationFn: async ({ datasetId, itemIds }: { datasetId: string; itemIds: string[] }) => {\n return client.batchDeleteDatasetItems({ datasetId, itemIds });\n },\n onSuccess: (_, variables) => {\n void queryClient.invalidateQueries({ queryKey: ['dataset-items', variables.datasetId] });\n void queryClient.invalidateQueries({ queryKey: ['dataset', variables.datasetId] });\n void queryClient.invalidateQueries({ queryKey: ['dataset-versions', variables.datasetId] });\n },\n ...queryOptions?.deleteItems,\n });\n\n const triggerExperiment = useMutation({\n mutationFn: (params: TriggerDatasetExperimentParams) => client.triggerDatasetExperiment(params),\n onSuccess: (_, variables) => {\n void queryClient.invalidateQueries({ queryKey: ['dataset-experiments', variables.datasetId] });\n },\n ...queryOptions?.triggerExperiment,\n });\n\n const deleteExperiment = useMutation({\n mutationFn: (experimentId: string) => client.deleteExperiment(experimentId),\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: ['experiments'] });\n void queryClient.invalidateQueries({ queryKey: ['experiment'] });\n void queryClient.invalidateQueries({ queryKey: ['dataset-experiments'] });\n void queryClient.invalidateQueries({ queryKey: ['dataset-experiment'] });\n void queryClient.invalidateQueries({ queryKey: ['dataset-experiment-results'] });\n void queryClient.invalidateQueries({ queryKey: ['review-items'] });\n void queryClient.invalidateQueries({ queryKey: ['completed-items'] });\n void queryClient.invalidateQueries({ queryKey: ['experiment-review-summary'] });\n },\n ...queryOptions?.deleteExperiment,\n });\n\n const updateExperiment = useMutation({\n mutationFn: (params: UpdateDatasetExperimentParams) => client.updateDatasetExperiment(params),\n onSuccess: (_, variables) => {\n void queryClient.invalidateQueries({ queryKey: ['experiments'] });\n void queryClient.invalidateQueries({ queryKey: ['experiment', variables.experimentId] });\n void queryClient.invalidateQueries({ queryKey: ['dataset-experiments', variables.datasetId] });\n void queryClient.invalidateQueries({\n queryKey: ['dataset-experiment', variables.datasetId, variables.experimentId],\n });\n },\n ...queryOptions?.updateExperiment,\n });\n\n const updateExperimentResult = useMutation({\n mutationFn: (params: UpdateExperimentResultParams) => client.updateDatasetExperimentResult(params),\n onSuccess: (_, variables) => {\n void queryClient.invalidateQueries({ queryKey: ['experiment-results', variables.experimentId] });\n void queryClient.invalidateQueries({ queryKey: ['dataset-experiment-results'] });\n void queryClient.invalidateQueries({ queryKey: ['review-items'] });\n void queryClient.invalidateQueries({ queryKey: ['dataset-review-items'] });\n void queryClient.invalidateQueries({ queryKey: ['dataset-completed-items'] });\n void queryClient.invalidateQueries({ queryKey: ['experiment-review-summary'] });\n },\n ...queryOptions?.updateExperimentResult,\n });\n\n return {\n createDataset,\n updateDataset,\n deleteDataset,\n addItem,\n updateItem,\n deleteItem,\n purgeItem,\n deleteItems,\n batchInsertItems,\n batchDeleteItems,\n triggerExperiment,\n deleteExperiment,\n updateExperiment,\n updateExperimentResult,\n };\n};\n","import type { ExperimentTargetType, ListDatasetsParams, MastraClient } from '@mastra/client-js';\nimport { useInfiniteQuery, useQuery } from '@tanstack/react-query';\nimport type { InfiniteData, QueryKey, UseInfiniteQueryResult, UseQueryResult } from '@tanstack/react-query';\nimport { useEffect } from 'react';\nimport { useMastraClient } from '../../mastra-client-context';\nimport type { MastraInfiniteQueryOptions, MastraQueryOptions } from '../shared/query-options';\nimport { useInView } from '../shared/use-in-view';\n\ntype ListDatasetsResponse = Awaited<ReturnType<MastraClient['listDatasets']>>;\ntype DatasetResponse = Awaited<ReturnType<MastraClient['getDataset']>>;\n\n/**\n * Hook to list all datasets with optional pagination\n */\nexport const useDatasets = <TData = ListDatasetsResponse>({\n pagination,\n queryOptions,\n}: {\n pagination?: { page?: number; perPage?: number };\n queryOptions?: MastraQueryOptions<ListDatasetsResponse, TData>;\n} = {}): UseQueryResult<TData, Error> => {\n const client = useMastraClient();\n return useQuery({\n queryKey: ['datasets', pagination],\n queryFn: () => client.listDatasets(pagination),\n placeholderData: previousData => previousData,\n ...queryOptions,\n });\n};\n\nconst DATASETS_PER_PAGE = 20;\n\nexport interface DatasetTargetFilter {\n targetType?: ExperimentTargetType | '';\n targetId?: string;\n}\n\nexport type DatasetsOrderBy = NonNullable<ListDatasetsParams['orderBy']>;\n\ntype DatasetRecord = ListDatasetsResponse['datasets'][number];\n\nexport type UseInfiniteDatasetsResult<TData = DatasetRecord[]> = UseInfiniteQueryResult<TData, Error> & {\n setEndOfListElement: (element: HTMLDivElement | null) => void;\n};\n\n/**\n * Hook to list datasets with infinite scroll pagination, optionally scoped server-side to a target.\n * `data` defaults to the flattened dataset list; a user `select` replaces that flattening.\n */\nexport const useInfiniteDatasets = <TData = DatasetRecord[]>({\n filter,\n orderBy,\n queryOptions,\n}: {\n filter?: DatasetTargetFilter;\n orderBy?: DatasetsOrderBy;\n queryOptions?: MastraInfiniteQueryOptions<ListDatasetsResponse, TData, QueryKey, number>;\n} = {}): UseInfiniteDatasetsResult<TData> => {\n const client = useMastraClient();\n const { inView: isEndOfListInView, setRef: setEndOfListElement } = useInView();\n const targetType = filter?.targetType || undefined;\n const targetIds = filter?.targetId ? [filter.targetId] : undefined;\n\n const query = useInfiniteQuery({\n queryKey: ['datasets', 'infinite', { targetType, targetIds, orderBy }],\n queryFn: ({ pageParam }) =>\n client.listDatasets({ page: pageParam, perPage: DATASETS_PER_PAGE, targetType, targetIds, orderBy }),\n initialPageParam: 0,\n getNextPageParam: (lastPage, _, lastPageParam) => {\n if (!lastPage?.datasets?.length || !lastPage.pagination?.hasMore) {\n return undefined;\n }\n return lastPageParam + 1;\n },\n select: (data: InfiniteData<ListDatasetsResponse, number>) =>\n data.pages.flatMap(page => page?.datasets ?? []) as TData,\n ...queryOptions,\n });\n\n useEffect(() => {\n if (isEndOfListInView && query.hasNextPage && !query.isFetchingNextPage) {\n void query.fetchNextPage();\n }\n }, [isEndOfListInView, query]);\n\n return { ...query, setEndOfListElement };\n};\n\n// The datasetIds filter accepts at most 100 ids per request.\nconst DATASET_IDS_PER_REQUEST = 100;\n\n/**\n * Datasets matching the given ids, in one request per 100 ids, e.g. to name the datasets of listed\n * experiments without paging through every dataset. Ids without a dataset are absent from the result.\n */\nexport const useDatasetsByIds = ({\n datasetIds,\n}: {\n datasetIds: readonly string[];\n}): UseQueryResult<DatasetRecord[], Error> => {\n const client = useMastraClient();\n const uniqueIds = [...new Set(datasetIds)].toSorted();\n\n return useQuery({\n queryKey: ['datasets', 'by-ids', uniqueIds],\n enabled: uniqueIds.length > 0,\n queryFn: async () => {\n const batches: string[][] = [];\n for (let index = 0; index < uniqueIds.length; index += DATASET_IDS_PER_REQUEST) {\n batches.push(uniqueIds.slice(index, index + DATASET_IDS_PER_REQUEST));\n }\n const responses = await Promise.all(batches.map(batch => client.listDatasets({ datasetIds: batch })));\n return responses.flatMap(response => response.datasets);\n },\n // Loading more experiments adds ids; keep the names already resolved meanwhile.\n placeholderData: previousData => previousData,\n });\n};\n\n/**\n * Hook to fetch a single dataset by ID\n *\n * Does not guard on empty ids; pass `queryOptions: { enabled }` to skip the fetch.\n */\nexport const useDataset = <TData = DatasetResponse>({\n datasetId,\n queryOptions,\n}: {\n datasetId: string;\n queryOptions?: MastraQueryOptions<DatasetResponse, TData>;\n}): UseQueryResult<TData, Error> => {\n const client = useMastraClient();\n return useQuery({\n queryKey: ['dataset', datasetId],\n queryFn: () => client.getDataset(datasetId),\n ...queryOptions,\n });\n};\n","import type { CompareExperimentsResponse } 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 compare two to ten dataset experiments item by item against a baseline.\n * @param datasetId - ID of the dataset\n * @param experimentIds - IDs of the experiments to compare\n * @param baselineId - ID of the baseline experiment; must be one of `experimentIds` (defaults to the first)\n * @param queryOptions - TanStack Query options, spread last to override defaults\n *\n * Does not guard on empty ids; pass `queryOptions: { enabled }` to skip the fetch.\n */\nexport const useCompareExperiments = <TData = CompareExperimentsResponse>({\n datasetId,\n experimentIds,\n baselineId,\n queryOptions,\n}: {\n datasetId: string;\n experimentIds: string[];\n baselineId?: string;\n queryOptions?: MastraQueryOptions<CompareExperimentsResponse, TData>;\n}): UseQueryResult<TData, Error> => {\n const client = useMastraClient();\n return useQuery({\n queryKey: ['compare-experiments', datasetId, experimentIds, baselineId],\n queryFn: () => client.compareExperiments({ datasetId, experimentIds, baselineId }),\n ...queryOptions,\n });\n};\n","import type { ClientScoreRowData, DatasetExperimentResult, MastraClient } from '@mastra/client-js';\nimport type { ExperimentStatus } from '@mastra/core/storage';\nimport { queryOptions as tanstackQueryOptions, useInfiniteQuery, useQueries, useQuery } from '@tanstack/react-query';\nimport type {\n InfiniteData,\n QueryKey,\n UseInfiniteQueryResult,\n UseQueryOptions,\n UseQueryResult,\n} from '@tanstack/react-query';\nimport { useEffect } from 'react';\nimport { useMastraClient } from '../../mastra-client-context';\nimport { useCombineByIds } from '../shared/combine-by-ids';\nimport type { ExperimentQueriesResult } from '../shared/combine-by-ids';\nimport type { MastraInfiniteQueryOptions, MastraQueryOptions } from '../shared/query-options';\n\nexport type { ExperimentQueriesResult } from '../shared/combine-by-ids';\nimport { useInView } from '../shared/use-in-view';\n\ntype DatasetExperimentResponse = Awaited<ReturnType<MastraClient['getDatasetExperiment']>>;\ntype ExperimentResultsPage = Awaited<ReturnType<MastraClient['listDatasetExperimentResults']>>;\ntype ExperimentScoresByEntity = Record<string, ClientScoreRowData[]>;\ntype DatasetExperimentQueryKey = string[];\ntype ExperimentStatusQueryKey = (string | undefined)[];\n\nconst POLL_INTERVAL_MS = 2000;\nconst RESULTS_PER_PAGE = 100;\nconst SCORES_PER_PAGE = 100;\n\nconst isInProgress = (status: string | undefined) => status === 'running' || status === 'pending';\n\n/**\n * Key, fetcher and polling policy of the `dataset-experiment` query, shared by the single and\n * multi-experiment hooks so they hit the same cache entry.\n * Polls every 2 seconds while the experiment is 'running' or 'pending'.\n */\nexport const datasetExperimentQueryOptions = (\n client: MastraClient,\n datasetId: string,\n experimentId: string,\n): UseQueryOptions<DatasetExperimentResponse, Error, DatasetExperimentResponse, DatasetExperimentQueryKey> =>\n tanstackQueryOptions({\n queryKey: ['dataset-experiment', datasetId, experimentId],\n queryFn: () => client.getDatasetExperiment(datasetId, experimentId),\n gcTime: 0,\n staleTime: 0,\n refetchInterval: query => (isInProgress(query.state.data?.status) ? POLL_INTERVAL_MS : false),\n });\n\n/**\n * Key and fetcher of the `dataset-experiment-scores` query: every score of an experiment, across all\n * pages, grouped by dataset item id. Polls every 2 seconds while `experimentStatus` is in progress.\n */\nexport const experimentScoresQueryOptions = (\n client: MastraClient,\n experimentId: string,\n experimentStatus: ExperimentStatus | undefined,\n): UseQueryOptions<ExperimentScoresByEntity, Error, ExperimentScoresByEntity, ExperimentStatusQueryKey> =>\n tanstackQueryOptions({\n queryKey: ['dataset-experiment-scores', experimentId, experimentStatus],\n queryFn: async (): Promise<ExperimentScoresByEntity> => {\n const allScores: ClientScoreRowData[] = [];\n let page = 0;\n\n while (true) {\n const response = await client.listScoresByRunId({ runId: experimentId, page, perPage: SCORES_PER_PAGE });\n allScores.push(...response.scores);\n if (!response.pagination.hasMore) break;\n page++;\n }\n\n const grouped: ExperimentScoresByEntity = {};\n for (const row of allScores) {\n (grouped[row.entityId] ??= []).push(row);\n }\n return grouped;\n },\n refetchInterval: isInProgress(experimentStatus) ? POLL_INTERVAL_MS : false,\n });\n\n/**\n * Key and fetcher of the `dataset-experiment-results-all` query: every result of an experiment, across\n * all pages. Polls every 2 seconds while `experimentStatus` is in progress.\n */\nexport const allDatasetExperimentResultsQueryOptions = (\n client: MastraClient,\n datasetId: string,\n experimentId: string,\n experimentStatus: ExperimentStatus | undefined,\n): UseQueryOptions<DatasetExperimentResult[], Error, DatasetExperimentResult[], ExperimentStatusQueryKey> =>\n tanstackQueryOptions({\n queryKey: ['dataset-experiment-results-all', datasetId, experimentId, experimentStatus],\n queryFn: async (): Promise<DatasetExperimentResult[]> => {\n const allResults: DatasetExperimentResult[] = [];\n let page = 0;\n\n while (true) {\n const response = await client.listDatasetExperimentResults(datasetId, experimentId, {\n page,\n perPage: RESULTS_PER_PAGE,\n });\n allResults.push(...response.results);\n if (!response.pagination.hasMore || response.results.length === 0) break;\n page++;\n }\n\n return allResults;\n },\n refetchInterval: isInProgress(experimentStatus) ? POLL_INTERVAL_MS : false,\n });\n\n/** An experiment id plus its status, which drives polling of its dependent queries. */\nexport interface ExperimentRef {\n id: string;\n status?: ExperimentStatus;\n}\n\n/**\n * Does not guard on empty ids; pass `queryOptions: { enabled }` to skip the fetch.\n */\nexport const useDatasetExperiment = <TData = DatasetExperimentResponse>({\n datasetId,\n experimentId,\n queryOptions,\n}: {\n datasetId: string;\n experimentId: string;\n queryOptions?: MastraQueryOptions<DatasetExperimentResponse, TData, DatasetExperimentQueryKey>;\n}): UseQueryResult<TData, Error> => {\n const client = useMastraClient();\n const { queryKey, queryFn, gcTime, staleTime, refetchInterval } = datasetExperimentQueryOptions(\n client,\n datasetId,\n experimentId,\n );\n return useQuery<DatasetExperimentResponse, Error, TData, DatasetExperimentQueryKey>({\n queryKey,\n queryFn,\n gcTime,\n staleTime,\n refetchInterval,\n ...queryOptions,\n });\n};\n\n/**\n * Fetches several experiments of one dataset in parallel, each polled while it runs.\n * The server 404s an experiment that does not belong to `datasetId`, which surfaces as `error`.\n */\nexport const useDatasetExperimentsQueries = ({\n datasetId,\n experimentIds,\n}: {\n datasetId: string;\n experimentIds: string[];\n}): ExperimentQueriesResult<DatasetExperimentResponse> => {\n const client = useMastraClient();\n const combine = useCombineByIds<DatasetExperimentResponse>(experimentIds);\n return useQueries({\n queries: experimentIds.map(id => datasetExperimentQueryOptions(client, datasetId, id)),\n combine,\n });\n};\n\nexport type ExperimentResultsOrderBy = NonNullable<\n NonNullable<Parameters<MastraClient['listDatasetExperimentResults']>[2]>['orderBy']\n>;\n\ninterface UseDatasetExperimentResultsParams<TData = DatasetExperimentResult[]> {\n datasetId: string;\n experimentId: string;\n experimentStatus?: ExperimentStatus;\n orderBy?: ExperimentResultsOrderBy;\n queryOptions?: MastraInfiniteQueryOptions<ExperimentResultsPage, TData, QueryKey, number>;\n}\n\n/**\n * Hook to list results for a dataset experiment with infinite scroll pagination.\n * Polls every 2 seconds while experiment status is 'pending' or 'running'.\n *\n * Does not guard on empty ids; pass `queryOptions: { enabled }` to skip the fetch.\n */\nexport const useDatasetExperimentResults = <TData = DatasetExperimentResult[]>({\n datasetId,\n experimentId,\n experimentStatus,\n orderBy,\n queryOptions,\n}: UseDatasetExperimentResultsParams<TData>): UseInfiniteQueryResult<TData, Error> & {\n setEndOfListElement: (element: HTMLDivElement | null) => void;\n} => {\n const client = useMastraClient();\n const { inView: isEndOfListInView, setRef: setEndOfListElement } = useInView();\n\n const query = useInfiniteQuery({\n queryKey: ['dataset-experiment-results', datasetId, experimentId, experimentStatus, orderBy],\n queryFn: async ({ pageParam }) => {\n return client.listDatasetExperimentResults(datasetId, experimentId, {\n page: pageParam,\n perPage: RESULTS_PER_PAGE,\n orderBy,\n });\n },\n initialPageParam: 0,\n getNextPageParam: (lastPage, _, lastPageParam) => {\n if (!lastPage?.results?.length) {\n return undefined;\n }\n const totalFetched = (lastPageParam + 1) * RESULTS_PER_PAGE;\n const total = lastPage?.pagination?.total ?? 0;\n if (totalFetched >= total) {\n return undefined;\n }\n return lastPageParam + 1;\n },\n refetchInterval: isInProgress(experimentStatus) ? POLL_INTERVAL_MS : false,\n select: (data: InfiniteData<ExperimentResultsPage, number>) => {\n return data.pages.flatMap(page => page?.results ?? []) as TData;\n },\n ...queryOptions,\n });\n\n useEffect(() => {\n if (isEndOfListInView && query.hasNextPage && !query.isFetchingNextPage) {\n void query.fetchNextPage();\n }\n }, [isEndOfListInView, query]);\n\n return { ...query, setEndOfListElement };\n};\n\n/**\n * Fetches every result (all pages) of several experiments of one dataset in parallel.\n * Each experiment is polled while its `status` is in progress.\n */\nexport const useAllDatasetExperimentResultsQueries = ({\n datasetId,\n experiments,\n}: {\n datasetId: string;\n experiments: ExperimentRef[];\n}): ExperimentQueriesResult<DatasetExperimentResult[]> => {\n const client = useMastraClient();\n const combine = useCombineByIds<DatasetExperimentResult[]>(experiments.map(experiment => experiment.id));\n return useQueries({\n queries: experiments.map(experiment =>\n allDatasetExperimentResultsQueryOptions(client, datasetId, experiment.id, experiment.status),\n ),\n combine,\n });\n};\n\n/**\n * Hook to fetch all scores for an experiment, transformed to Record<entityId, ClientScoreRowData[]>\n * Paginates through all pages to ensure no scores are silently dropped.\n *\n * Does not guard on empty ids; pass `queryOptions: { enabled }` to skip the fetch.\n */\nexport const useScoresByExperimentId = <TData = ExperimentScoresByEntity>({\n experimentId,\n experimentStatus,\n queryOptions,\n}: {\n experimentId: string;\n experimentStatus?: ExperimentStatus;\n queryOptions?: MastraQueryOptions<ExperimentScoresByEntity, TData, ExperimentStatusQueryKey>;\n}): UseQueryResult<TData, Error> => {\n const client = useMastraClient();\n const { queryKey, queryFn, refetchInterval } = experimentScoresQueryOptions(client, experimentId, experimentStatus);\n return useQuery<ExperimentScoresByEntity, Error, TData, ExperimentStatusQueryKey>({\n queryKey,\n queryFn,\n refetchInterval,\n ...queryOptions,\n });\n};\n\n/**\n * Fetches every score of several experiments in parallel, each grouped by dataset item id.\n * Each experiment is polled while its `status` is in progress.\n */\nexport const useScoresByExperimentIdsQueries = ({\n experiments,\n}: {\n experiments: ExperimentRef[];\n}): ExperimentQueriesResult<ExperimentScoresByEntity> => {\n const client = useMastraClient();\n const combine = useCombineByIds<ExperimentScoresByEntity>(experiments.map(experiment => experiment.id));\n return useQueries({\n queries: experiments.map(experiment => experimentScoresQueryOptions(client, experiment.id, experiment.status)),\n combine,\n });\n};\n","import type { DatasetItemVersionResponse } 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 type DatasetItemVersion = DatasetItemVersionResponse & {\n validTo: number | null;\n isDeleted: boolean;\n isLatest: boolean;\n};\n\n/**\n * Hook to fetch full item history (SCD-2 rows).\n *\n * Does not guard on empty ids; pass `queryOptions: { enabled }` to skip the fetch.\n */\nexport const useDatasetItemVersions = <TData = DatasetItemVersion[]>({\n datasetId,\n itemId,\n queryOptions,\n}: {\n datasetId: string;\n itemId: string;\n queryOptions?: MastraQueryOptions<DatasetItemVersion[], TData>;\n}): UseQueryResult<TData, Error> => {\n const client = useMastraClient();\n\n return useQuery({\n queryKey: ['dataset-item-versions', datasetId, itemId],\n queryFn: async (): Promise<DatasetItemVersion[]> => {\n const res = await client.getItemHistory(datasetId, itemId);\n\n return (res?.history ?? []).map(\n (version, index): DatasetItemVersion => ({\n id: version.id,\n datasetId: version.datasetId,\n datasetVersion: version.datasetVersion,\n input: version.input,\n groundTruth: version.groundTruth,\n expectedTrajectory: version.expectedTrajectory,\n toolMocks: version.toolMocks ?? undefined,\n scorerIds: version.scorerIds ?? undefined,\n requestContext: version.requestContext ?? undefined,\n metadata: version.metadata ?? undefined,\n validTo: version.validTo,\n isDeleted: version.isDeleted,\n createdAt: version.createdAt,\n updatedAt: version.updatedAt,\n isLatest: index === 0,\n }),\n );\n },\n ...queryOptions,\n });\n};\n\n/**\n * Hook to fetch a specific version of a dataset item.\n *\n * Does not guard on empty ids; pass `queryOptions: { enabled }` to skip the fetch.\n */\nexport const useDatasetItemVersion = <TData = DatasetItemVersion>({\n datasetId,\n itemId,\n datasetVersion,\n latestVersion,\n queryOptions,\n}: {\n datasetId: string;\n itemId: string;\n datasetVersion: number;\n latestVersion?: number;\n queryOptions?: MastraQueryOptions<DatasetItemVersion, TData>;\n}): UseQueryResult<TData, Error> => {\n const client = useMastraClient();\n\n return useQuery({\n queryKey: ['dataset-item-version', datasetId, itemId, datasetVersion],\n queryFn: async (): Promise<DatasetItemVersion> => {\n const v = await client.getDatasetItemVersion(datasetId, itemId, datasetVersion);\n\n return {\n id: v.id,\n datasetId: v.datasetId,\n datasetVersion: v.datasetVersion,\n input: v.input,\n groundTruth: v.groundTruth,\n expectedTrajectory: v.expectedTrajectory,\n toolMocks: v.toolMocks ?? undefined,\n scorerIds: v.scorerIds ?? undefined,\n requestContext: v.requestContext ?? undefined,\n metadata: v.metadata ?? undefined,\n validTo: null,\n isDeleted: false,\n createdAt: v.createdAt,\n updatedAt: v.updatedAt,\n isLatest: latestVersion != null ? datasetVersion === latestVersion : false,\n };\n },\n ...queryOptions,\n });\n};\n","import type { MastraClient } from '@mastra/client-js';\nimport { useInfiniteQuery } from '@tanstack/react-query';\nimport type { InfiniteData, QueryKey } from '@tanstack/react-query';\nimport { useMastraClient } from '../../mastra-client-context';\nimport type { MastraInfiniteQueryOptions } from '../shared/query-options';\n\nexport interface DatasetVersion {\n id?: string;\n datasetId?: string;\n version: number;\n createdAt?: Date | string;\n isCurrent: boolean;\n}\n\ntype DatasetVersionsPage = Awaited<ReturnType<MastraClient['listDatasetVersions']>>;\n\nconst PER_PAGE = 10;\n\n/**\n * Hook to fetch dataset versions from the API with infinite pagination.\n * `data` defaults to the flattened `DatasetVersion[]`; a user `select` replaces that.\n *\n * Does not guard on empty ids; pass `queryOptions: { enabled }` to skip the fetch.\n */\nexport const useDatasetVersions = <TData = DatasetVersion[]>({\n datasetId,\n queryOptions,\n}: {\n datasetId: string;\n queryOptions?: MastraInfiniteQueryOptions<DatasetVersionsPage, TData, QueryKey, number>;\n}) => {\n const client = useMastraClient();\n\n return useInfiniteQuery({\n queryKey: ['dataset-versions', datasetId],\n queryFn: async ({ pageParam }) => {\n return client.listDatasetVersions(datasetId, { page: pageParam, perPage: PER_PAGE });\n },\n initialPageParam: 0,\n getNextPageParam: (lastPage, _, lastPageParam) => {\n if (lastPage?.pagination?.hasMore) {\n return lastPageParam + 1;\n }\n return undefined;\n },\n select: (data: InfiniteData<DatasetVersionsPage, number>) => {\n return data.pages\n .flatMap(page => page?.versions ?? [])\n .map(\n (v, index): DatasetVersion => ({\n id: v.id,\n datasetId: v.datasetId,\n version: v.version,\n createdAt: v.createdAt,\n isCurrent: index === 0,\n }),\n ) as TData;\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\ntype ListExperimentsResponse = Awaited<ReturnType<MastraClient['listExperiments']>>;\ntype GetExperimentResponse = Awaited<ReturnType<MastraClient['getExperiment']>>;\n\n/**\n * Hook to list all experiments across all datasets with optional pagination\n */\nexport const useExperiments = <TData = ListExperimentsResponse>({\n pagination,\n queryOptions,\n}: {\n pagination?: { page?: number; perPage?: number };\n queryOptions?: MastraQueryOptions<ListExperimentsResponse, TData>;\n} = {}): UseQueryResult<TData, Error> => {\n const client = useMastraClient();\n return useQuery({\n queryKey: ['experiments', pagination],\n queryFn: () => client.listExperiments(pagination),\n ...queryOptions,\n });\n};\n\n/**\n * Hook to fetch a single experiment by ID without knowing its dataset\n */\nexport const useExperiment = <TData = GetExperimentResponse>({\n experimentId,\n queryOptions,\n}: {\n experimentId: string;\n queryOptions?: MastraQueryOptions<GetExperimentResponse, TData>;\n}): UseQueryResult<TData, Error> => {\n const client = useMastraClient();\n return useQuery({\n queryKey: ['experiment', experimentId],\n queryFn: () => client.getExperiment(experimentId),\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\ntype WorkflowSchemaResponse = Awaited<ReturnType<ReturnType<MastraClient['getWorkflow']>['getSchema']>>;\n\n/**\n * Hook to fetch workflow input/output schema by workflow ID.\n * Returns { inputSchema, outputSchema } where each is Record<string, unknown> | null.\n *\n * Does not guard on empty ids; pass `queryOptions: { enabled }` to skip the fetch.\n */\nexport function useWorkflowSchema<TData = WorkflowSchemaResponse>({\n workflowId,\n queryOptions,\n}: {\n workflowId: string | null;\n queryOptions?: MastraQueryOptions<WorkflowSchemaResponse, TData>;\n}): UseQueryResult<TData, Error> {\n const client = useMastraClient();\n\n return useQuery({\n queryKey: ['workflow-schema', workflowId],\n queryFn: async () => {\n if (!workflowId) throw new Error('No workflow selected');\n return client.getWorkflow(workflowId).getSchema();\n },\n staleTime: 5 * 60 * 1000, // Cache for 5 minutes\n ...queryOptions,\n });\n}\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_mastra_client_context = require("../../mastra-client-context-DzX3f0RF.cjs");
2
+ const require_mastra_client_context = require("../../mastra-client-context-DX8wJM9p.cjs");
3
3
  let _tanstack_react_query = require("@tanstack/react-query");
4
- //#region src/hooks/embedders/use-embedders.ts
4
+ // src/hooks/embedders/use-embedders.ts
5
5
  function useEmbedders({ queryOptions } = {}) {
6
6
  const client = require_mastra_client_context.useMastraClient();
7
7
  return (0, _tanstack_react_query.useQuery)({
@@ -13,7 +13,6 @@ function useEmbedders({ queryOptions } = {}) {
13
13
  ...queryOptions
14
14
  });
15
15
  }
16
- //#endregion
17
16
  exports.useEmbedders = useEmbedders;
18
17
 
19
18
  //# sourceMappingURL=index.cjs.map
@@ -1,6 +1,6 @@
1
- import { n as useMastraClient } from "../../mastra-client-context-Bx_g84YB.js";
1
+ import { n as useMastraClient } from "../../mastra-client-context-DQ5z_ze9.js";
2
2
  import { useQuery } from "@tanstack/react-query";
3
- //#region src/hooks/embedders/use-embedders.ts
3
+ // src/hooks/embedders/use-embedders.ts
4
4
  function useEmbedders({ queryOptions } = {}) {
5
5
  const client = useMastraClient();
6
6
  return useQuery({
@@ -12,7 +12,6 @@ function useEmbedders({ queryOptions } = {}) {
12
12
  ...queryOptions
13
13
  });
14
14
  }
15
- //#endregion
16
15
  export { useEmbedders };
17
16
 
18
17
  //# sourceMappingURL=index.js.map
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_experiments = require("../../experiments-CJw1N3FB.cjs");
2
+ const require_experiments = require("../../experiments-Duv0RgkM.cjs");
3
3
  exports.EXPERIMENTS_PAGE_SIZE = require_experiments.EXPERIMENTS_PAGE_SIZE;
4
4
  exports.EXPERIMENTS_PER_PAGE = require_experiments.EXPERIMENTS_PER_PAGE;
5
5
  exports.useExperimentMetrics = require_experiments.useExperimentMetrics;
@@ -1 +1 @@
1
- export { i as EXPERIMENTS_PAGE_SIZE, t as EXPERIMENTS_PER_PAGE, s as useExperimentMetrics, o as useExperimentTrace, a as useExperimentsForDatasetFilter, c as useExperimentsItemUsage, r as useExperimentsListMetrics, n as useInfiniteExperiments } from "../../experiments-B7vRMK5T.js";
1
+ export { i as EXPERIMENTS_PAGE_SIZE, t as EXPERIMENTS_PER_PAGE, s as useExperimentMetrics, o as useExperimentTrace, a as useExperimentsForDatasetFilter, c as useExperimentsItemUsage, r as useExperimentsListMetrics, n as useInfiniteExperiments } from "../../experiments-DyecjEut.js";
@@ -1,8 +1,8 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_mastra_client_context = require("../../mastra-client-context-DzX3f0RF.cjs");
3
- const require_feedback_refetch_interval = require("../../feedback-refetch-interval-XD5FVc2k.cjs");
2
+ const require_mastra_client_context = require("../../mastra-client-context-DX8wJM9p.cjs");
3
+ const require_feedback_refetch_interval = require("../../feedback-refetch-interval-BBcT9r8s.cjs");
4
4
  let _tanstack_react_query = require("@tanstack/react-query");
5
- //#region src/hooks/feedback/use-feedback.ts
5
+ // src/hooks/feedback/use-feedback.ts
6
6
  function useUpdateFeedbackReviewStatus({ queryOptions } = {}) {
7
7
  const client = require_mastra_client_context.useMastraClient();
8
8
  const queryClient = (0, _tanstack_react_query.useQueryClient)();
@@ -15,7 +15,6 @@ function useUpdateFeedbackReviewStatus({ queryOptions } = {}) {
15
15
  ...queryOptions
16
16
  });
17
17
  }
18
- //#endregion
19
18
  exports.getFeedbackRefetchInterval = require_feedback_refetch_interval.getFeedbackRefetchInterval;
20
19
  exports.useUpdateFeedbackReviewStatus = useUpdateFeedbackReviewStatus;
21
20
 
@@ -1,7 +1,7 @@
1
- import { n as useMastraClient } from "../../mastra-client-context-Bx_g84YB.js";
2
- import { t as getFeedbackRefetchInterval } from "../../feedback-refetch-interval-DLHzQoVV.js";
1
+ import { n as useMastraClient } from "../../mastra-client-context-DQ5z_ze9.js";
2
+ import { t as getFeedbackRefetchInterval } from "../../feedback-refetch-interval-C12Nzb2r.js";
3
3
  import { useMutation, useQueryClient } from "@tanstack/react-query";
4
- //#region src/hooks/feedback/use-feedback.ts
4
+ // src/hooks/feedback/use-feedback.ts
5
5
  function useUpdateFeedbackReviewStatus({ queryOptions } = {}) {
6
6
  const client = useMastraClient();
7
7
  const queryClient = useQueryClient();
@@ -14,7 +14,6 @@ function useUpdateFeedbackReviewStatus({ queryOptions } = {}) {
14
14
  ...queryOptions
15
15
  });
16
16
  }
17
- //#endregion
18
17
  export { getFeedbackRefetchInterval, useUpdateFeedbackReviewStatus };
19
18
 
20
19
  //# sourceMappingURL=index.js.map
@@ -1,7 +1,7 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_mastra_client_context = require("../../mastra-client-context-DzX3f0RF.cjs");
2
+ const require_mastra_client_context = require("../../mastra-client-context-DX8wJM9p.cjs");
3
3
  let _tanstack_react_query = require("@tanstack/react-query");
4
- //#region src/hooks/llm/use-llm-providers.ts
4
+ // src/hooks/llm/use-llm-providers.ts
5
5
  const useLLMProviders = ({ queryOptions } = {}) => {
6
6
  const client = require_mastra_client_context.useMastraClient();
7
7
  return (0, _tanstack_react_query.useQuery)({
@@ -11,7 +11,6 @@ const useLLMProviders = ({ queryOptions } = {}) => {
11
11
  ...queryOptions
12
12
  });
13
13
  };
14
- //#endregion
15
14
  exports.useLLMProviders = useLLMProviders;
16
15
 
17
16
  //# sourceMappingURL=index.cjs.map
@@ -1,6 +1,6 @@
1
- import { n as useMastraClient } from "../../mastra-client-context-Bx_g84YB.js";
1
+ import { n as useMastraClient } from "../../mastra-client-context-DQ5z_ze9.js";
2
2
  import { useQuery } from "@tanstack/react-query";
3
- //#region src/hooks/llm/use-llm-providers.ts
3
+ // src/hooks/llm/use-llm-providers.ts
4
4
  const useLLMProviders = ({ queryOptions } = {}) => {
5
5
  const client = useMastraClient();
6
6
  return useQuery({
@@ -10,7 +10,6 @@ const useLLMProviders = ({ queryOptions } = {}) => {
10
10
  ...queryOptions
11
11
  });
12
12
  };
13
- //#endregion
14
13
  export { useLLMProviders };
15
14
 
16
15
  //# sourceMappingURL=index.js.map
@@ -1,10 +1,10 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_mastra_client_context = require("../../mastra-client-context-DzX3f0RF.cjs");
3
- const require_use_in_view = require("../../use-in-view-B6eJO9Zi.cjs");
4
- const require_query_utils = require("../../query-utils-CcrChYgz.cjs");
2
+ const require_mastra_client_context = require("../../mastra-client-context-DX8wJM9p.cjs");
3
+ const require_use_in_view = require("../../use-in-view-BxdrrnCw.cjs");
4
+ const require_query_utils = require("../../query-utils-BVgE_xxj.cjs");
5
5
  let react = require("react");
6
6
  let _tanstack_react_query = require("@tanstack/react-query");
7
- //#region src/hooks/logs/use-logs.ts
7
+ // src/hooks/logs/use-logs.ts
8
8
  const LOGS_PER_PAGE = 20;
9
9
  const LOGS_REFETCH_INTERVAL_MS = 1e4;
10
10
  const DEFAULT_LOGS_ORDER_BY = {
@@ -77,7 +77,6 @@ const useLogs = ({ filters, orderBy = DEFAULT_LOGS_ORDER_BY, queryOptions } = {}
77
77
  setEndOfListElement
78
78
  };
79
79
  };
80
- //#endregion
81
80
  exports.getLogsRefetchInterval = getLogsRefetchInterval;
82
81
  exports.useLogs = useLogs;
83
82
 
@@ -1,9 +1,9 @@
1
- import { n as useMastraClient } from "../../mastra-client-context-Bx_g84YB.js";
2
- import { t as useInView } from "../../use-in-view-C9sYPGRm.js";
3
- import { o as isObservabilityUnavailableError, s as isUnsupportedObservabilityOperationError } from "../../query-utils-D1NgFnWU.js";
1
+ import { n as useMastraClient } from "../../mastra-client-context-DQ5z_ze9.js";
2
+ import { t as useInView } from "../../use-in-view-CyjKdplM.js";
3
+ import { o as isObservabilityUnavailableError, s as isUnsupportedObservabilityOperationError } from "../../query-utils-DvMERIwf.js";
4
4
  import { useEffect } from "react";
5
5
  import { useInfiniteQuery } from "@tanstack/react-query";
6
- //#region src/hooks/logs/use-logs.ts
6
+ // src/hooks/logs/use-logs.ts
7
7
  const LOGS_PER_PAGE = 20;
8
8
  const LOGS_REFETCH_INTERVAL_MS = 1e4;
9
9
  const DEFAULT_LOGS_ORDER_BY = {
@@ -76,7 +76,6 @@ const useLogs = ({ filters, orderBy = DEFAULT_LOGS_ORDER_BY, queryOptions } = {}
76
76
  setEndOfListElement
77
77
  };
78
78
  };
79
- //#endregion
80
79
  export { getLogsRefetchInterval, useLogs };
81
80
 
82
81
  //# sourceMappingURL=index.js.map
@@ -1,7 +1,7 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_mastra_client_context = require("../../mastra-client-context-DzX3f0RF.cjs");
2
+ const require_mastra_client_context = require("../../mastra-client-context-DX8wJM9p.cjs");
3
3
  let _tanstack_react_query = require("@tanstack/react-query");
4
- //#region src/hooks/mcps/use-mcp-app-html.ts
4
+ // src/hooks/mcps/use-mcp-app-html.ts
5
5
  /**
6
6
  * The HTML of an MCP tool's `ui://` app resource (from the tool's `_meta`), for rendering the tool's own UI.
7
7
  * Skips the fetch when the tool has no app resource.
@@ -22,8 +22,7 @@ const useMcpAppHtml = ({ serverId, appResourceUri, queryOptions }) => {
22
22
  ...queryOptions
23
23
  });
24
24
  };
25
- //#endregion
26
- //#region src/hooks/mcps/use-mcp-app-tools.ts
25
+ // src/hooks/mcps/use-mcp-app-tools.ts
27
26
  /**
28
27
  * Builds a map of tool names → MCP App info for tools across all registered
29
28
  * MCP servers that have `_meta.ui.resourceUri` (i.e., tools with interactive
@@ -74,8 +73,7 @@ function useMcpAppTools({ queryOptions } = {}) {
74
73
  ...queryOptions
75
74
  });
76
75
  }
77
- //#endregion
78
- //#region src/hooks/mcps/use-mcp-server-tool.ts
76
+ // src/hooks/mcps/use-mcp-server-tool.ts
79
77
  /**
80
78
  * Does not guard on empty ids; pass `queryOptions: { enabled }` to skip the fetch.
81
79
  */
@@ -105,8 +103,7 @@ const useExecuteMCPTool = ({ serverId, toolId, queryOptions }) => {
105
103
  ...queryOptions
106
104
  });
107
105
  };
108
- //#endregion
109
- //#region src/hooks/mcps/use-mcp-server-tools.ts
106
+ // src/hooks/mcps/use-mcp-server-tools.ts
110
107
  const useMCPServerTools = ({ selectedServer, queryOptions }) => {
111
108
  const client = require_mastra_client_context.useMastraClient();
112
109
  return (0, _tanstack_react_query.useQuery)({
@@ -124,8 +121,7 @@ const useMCPServerTools = ({ selectedServer, queryOptions }) => {
124
121
  ...queryOptions
125
122
  });
126
123
  };
127
- //#endregion
128
- //#region src/hooks/mcps/use-mcp-server-tools-by-id.ts
124
+ // src/hooks/mcps/use-mcp-server-tools-by-id.ts
129
125
  /**
130
126
  * Does not guard on empty ids; pass `queryOptions: { enabled }` to skip the fetch.
131
127
  */
@@ -142,8 +138,7 @@ const useMCPServerToolsById = ({ serverId, queryOptions }) => {
142
138
  ...queryOptions
143
139
  });
144
140
  };
145
- //#endregion
146
- //#region src/hooks/mcps/use-mcp-servers.ts
141
+ // src/hooks/mcps/use-mcp-servers.ts
147
142
  const useMCPServers = ({ requestContext, queryOptions } = {}) => {
148
143
  const client = require_mastra_client_context.useMastraClient();
149
144
  return (0, _tanstack_react_query.useQuery)({
@@ -154,8 +149,7 @@ const useMCPServers = ({ requestContext, queryOptions } = {}) => {
154
149
  ...queryOptions
155
150
  });
156
151
  };
157
- //#endregion
158
- //#region src/hooks/mcps/use-try-connect-mcp.ts
152
+ // src/hooks/mcps/use-try-connect-mcp.ts
159
153
  async function parseResponse(response) {
160
154
  if ((response.headers.get("content-type") ?? "").includes("text/event-stream")) {
161
155
  const lines = (await response.text()).split("\n");
@@ -225,7 +219,6 @@ const useTryConnectMcp = ({ queryOptions } = {}) => {
225
219
  ...queryOptions
226
220
  });
227
221
  };
228
- //#endregion
229
222
  exports.useExecuteMCPTool = useExecuteMCPTool;
230
223
  exports.useMCPServerTool = useMCPServerTool;
231
224
  exports.useMCPServerTools = useMCPServerTools;
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["useMastraClient","useQuery","useMastraClient","useQuery","useMastraClient","useQuery","useMutation","useMastraClient","useQuery","useMastraClient","useQuery","useMastraClient","useQuery","useMastraClient","useMutation"],"sources":["../../../src/hooks/mcps/use-mcp-app-html.ts","../../../src/hooks/mcps/use-mcp-app-tools.ts","../../../src/hooks/mcps/use-mcp-server-tool.ts","../../../src/hooks/mcps/use-mcp-server-tools.ts","../../../src/hooks/mcps/use-mcp-server-tools-by-id.ts","../../../src/hooks/mcps/use-mcp-servers.ts","../../../src/hooks/mcps/use-try-connect-mcp.ts"],"sourcesContent":["import type { MastraClient } from '@mastra/client-js';\nimport { useQuery } from '@tanstack/react-query';\nimport type { UseQueryResult } from '@tanstack/react-query';\nimport { useMastraClient } from '../../mastra-client-context';\nimport type { MastraQueryOptions } from '../shared/query-options';\n\n/** The app HTML, or `null` when the resource has no text. */\ntype McpAppHtml = string | null;\n\nexport type ReadMcpServerResourceResponse = Awaited<ReturnType<MastraClient['readMcpServerResource']>>;\n\n/**\n * The HTML of an MCP tool's `ui://` app resource (from the tool's `_meta`), for rendering the tool's own UI.\n * Skips the fetch when the tool has no app resource.\n */\nexport const useMcpAppHtml = <TData = McpAppHtml>({\n serverId,\n appResourceUri,\n queryOptions,\n}: {\n serverId: string;\n appResourceUri?: string;\n queryOptions?: MastraQueryOptions<McpAppHtml, TData>;\n}): UseQueryResult<TData, Error> => {\n const client = useMastraClient();\n\n return useQuery({\n queryKey: ['mcp-app-resource', serverId, appResourceUri],\n queryFn: async () => {\n if (!appResourceUri) return null;\n const response = await client.readMcpServerResource(serverId, appResourceUri);\n return response.contents[0]?.text ?? null;\n },\n enabled: appResourceUri !== undefined,\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';\n\nexport interface McpAppToolInfo {\n serverId: string;\n toolId: string;\n toolName: string;\n resourceUri: string;\n}\n\n/**\n * Builds a map of tool names → MCP App info for tools across all registered\n * MCP servers that have `_meta.ui.resourceUri` (i.e., tools with interactive\n * MCP App UIs).\n *\n * For each app tool, entries are created under both the original tool name\n * and the namespaced name (`${serverId}_${toolName}`) so that agent tools\n * sourced via `MCPClient.listTools()` (which namespaces) can be resolved.\n */\nexport function useMcpAppTools<TData = Record<string, McpAppToolInfo>>({\n queryOptions,\n}: { queryOptions?: MastraQueryOptions<Record<string, McpAppToolInfo>, TData> } = {}): UseQueryResult<TData, Error> {\n const client = useMastraClient();\n\n return useQuery({\n queryKey: ['mcp-app-tools'],\n queryFn: async () => {\n const map: Record<string, McpAppToolInfo> = {};\n\n const { servers } = await client.getMcpServers();\n if (!servers?.length) return map;\n\n const results = await Promise.allSettled(\n servers.map(async server => {\n const { tools } = await client.getMcpServerTools(server.id);\n return { serverId: server.id, tools };\n }),\n );\n\n for (const result of results) {\n if (result.status !== 'fulfilled') continue;\n const { serverId, tools } = result.value;\n for (const tool of tools) {\n const meta = tool._meta as { ui?: { resourceUri?: string } } | undefined;\n const resourceUri = meta?.ui?.resourceUri;\n if (resourceUri) {\n const toolId = tool.name;\n const info: McpAppToolInfo = { serverId, toolId, toolName: tool.name, resourceUri };\n map[toolId] = info;\n if (tool.name !== toolId) {\n map[tool.name] = info;\n }\n // Also map the namespaced name used by MCPClient.listTools()\n map[`${serverId}_${tool.name}`] = info;\n }\n }\n }\n\n return map;\n },\n staleTime: 60_000,\n refetchOnWindowFocus: false,\n ...queryOptions,\n });\n}\n","import type { MastraClient } from '@mastra/client-js';\nimport type { RequestContext } from '@mastra/core/request-context';\nimport { useMutation, useQuery } from '@tanstack/react-query';\nimport type { UseMutationResult, UseQueryResult } from '@tanstack/react-query';\nimport { useMastraClient } from '../../mastra-client-context';\nimport type { MastraMutationOptions, MastraQueryOptions } from '../shared/query-options';\n\ntype MCPServerToolDetails = Awaited<ReturnType<ReturnType<MastraClient['getMcpServerTool']>['details']>>;\n\n/**\n * Does not guard on empty ids; pass `queryOptions: { enabled }` to skip the fetch.\n */\nexport const useMCPServerTool = <TData = MCPServerToolDetails>({\n serverId,\n toolId,\n requestContext,\n queryOptions,\n}: {\n serverId: string;\n toolId: string;\n requestContext?: Record<string, any>;\n queryOptions?: MastraQueryOptions<MCPServerToolDetails, TData>;\n}): UseQueryResult<TData, Error> => {\n const client = useMastraClient();\n\n return useQuery({\n queryKey: ['mcp-server-tool', serverId, toolId],\n queryFn: () => {\n const instance = client.getMcpServerTool(serverId, toolId);\n return instance.details(requestContext);\n },\n ...queryOptions,\n });\n};\n\nexport type ExecuteMCPToolResponse = Awaited<ReturnType<ReturnType<MastraClient['getMcpServerTool']>['execute']>>;\ntype ExecuteMCPToolVariables = { data: any; requestContext?: Record<string, any> };\n\nexport const useExecuteMCPTool = ({\n serverId,\n toolId,\n queryOptions,\n}: {\n serverId: string;\n toolId: string;\n queryOptions?: MastraMutationOptions<ExecuteMCPToolResponse, ExecuteMCPToolVariables>;\n}): UseMutationResult<ExecuteMCPToolResponse, Error, ExecuteMCPToolVariables> => {\n const client = useMastraClient();\n\n return useMutation({\n mutationFn: ({ data, requestContext }: ExecuteMCPToolVariables) => {\n const instance = client.getMcpServerTool(serverId, toolId);\n return instance.execute({ data, requestContext: requestContext as RequestContext });\n },\n ...queryOptions,\n });\n};\n","import type { McpToolInfo as SdkMcpToolInfo } from '@mastra/client-js';\nimport type { ServerInfo } from '@mastra/core/mcp';\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 useMCPServerTools = <TData = Record<string, SdkMcpToolInfo>>({\n selectedServer,\n queryOptions,\n}: {\n selectedServer: ServerInfo;\n queryOptions?: MastraQueryOptions<Record<string, SdkMcpToolInfo>, TData>;\n}): UseQueryResult<TData, Error> => {\n const client = useMastraClient();\n\n return useQuery({\n queryKey: ['mcpserver-tools', selectedServer?.id],\n queryFn: async () => {\n const response = await client.getMcpServerTools(selectedServer?.id);\n const fetchedToolsArray: SdkMcpToolInfo[] = response.tools;\n const transformedTools: Record<string, SdkMcpToolInfo> = {};\n fetchedToolsArray.forEach((sdkToolInfo: SdkMcpToolInfo) => {\n transformedTools[sdkToolInfo.name] = sdkToolInfo;\n });\n\n return transformedTools;\n },\n retry: false,\n refetchOnWindowFocus: false,\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\ntype MCPServerToolsById = Record<string, Awaited<ReturnType<MastraClient['getMcpServerTools']>>['tools'][number]>;\n\n/**\n * Does not guard on empty ids; pass `queryOptions: { enabled }` to skip the fetch.\n */\nexport const useMCPServerToolsById = <TData = MCPServerToolsById>({\n serverId,\n queryOptions,\n}: {\n serverId: string | null;\n queryOptions?: MastraQueryOptions<MCPServerToolsById, TData>;\n}): UseQueryResult<TData, Error> => {\n const client = useMastraClient();\n\n return useQuery({\n queryKey: ['mcpserver-tools', serverId],\n queryFn: async (): Promise<MCPServerToolsById> => {\n const response = await client.getMcpServerTools(serverId!);\n return Object.fromEntries(response.tools.map(tool => [tool.name, tool]));\n },\n retry: false,\n refetchOnWindowFocus: false,\n ...queryOptions,\n });\n};\n","import type { McpServerListResponse } 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 useMCPServers = <TData = McpServerListResponse['servers']>({\n requestContext,\n queryOptions,\n}: {\n requestContext?: Record<string, any>;\n queryOptions?: MastraQueryOptions<McpServerListResponse['servers'], TData>;\n} = {}): UseQueryResult<TData, Error> => {\n const client = useMastraClient();\n\n return useQuery({\n queryKey: ['mcp-servers'],\n queryFn: async () => {\n const mcpServers: McpServerListResponse['servers'] = (await client.getMcpServers(requestContext)).servers;\n return mcpServers;\n },\n ...queryOptions,\n });\n};\n","import { useMutation } from '@tanstack/react-query';\nimport { useMastraClient } from '../../mastra-client-context';\nimport type { MastraMutationOptions } from '../shared/query-options';\n\ninterface McpTool {\n name: string;\n description?: string;\n inputSchema?: Record<string, unknown>;\n}\n\nexport interface TryConnectResult {\n tools: McpTool[];\n}\n\nasync function parseResponse(response: Response): Promise<unknown> {\n const contentType = response.headers.get('content-type') ?? '';\n\n if (contentType.includes('text/event-stream')) {\n const text = await response.text();\n const lines = text.split('\\n');\n\n for (const line of lines) {\n if (line.startsWith('data:')) {\n const data = line.slice('data:'.length).trim();\n if (data) {\n return JSON.parse(data);\n }\n }\n }\n\n throw new Error('No data found in SSE response');\n }\n\n return response.json();\n}\n\nasync function connectAndListTools(url: string, clientHeaders?: Record<string, string>): Promise<TryConnectResult> {\n const baseHeaders: Record<string, string> = {\n ...clientHeaders,\n 'Content-Type': 'application/json',\n Accept: 'application/json, text/event-stream',\n };\n\n // Step 1: Initialize\n const initResponse = await fetch(url, {\n method: 'POST',\n headers: baseHeaders,\n credentials: 'include',\n body: JSON.stringify({\n jsonrpc: '2.0',\n id: 1,\n method: 'initialize',\n params: {\n protocolVersion: '2025-03-26',\n capabilities: {},\n clientInfo: { name: 'mastra-playground', version: '1.0.0' },\n },\n }),\n });\n\n if (!initResponse.ok) {\n throw new Error(`Initialize failed: ${initResponse.status} ${initResponse.statusText}`);\n }\n\n const sessionId = initResponse.headers.get('Mcp-Session-Id');\n await parseResponse(initResponse);\n\n const sessionHeaders: Record<string, string> = {\n ...baseHeaders,\n };\n if (sessionId) {\n sessionHeaders['Mcp-Session-Id'] = sessionId;\n }\n\n // Step 2: Send initialized notification\n await fetch(url, {\n method: 'POST',\n headers: sessionHeaders,\n credentials: 'include',\n body: JSON.stringify({\n jsonrpc: '2.0',\n method: 'notifications/initialized',\n }),\n });\n\n // Step 3: List tools\n const toolsResponse = await fetch(url, {\n method: 'POST',\n headers: sessionHeaders,\n credentials: 'include',\n body: JSON.stringify({\n jsonrpc: '2.0',\n id: 2,\n method: 'tools/list',\n }),\n });\n\n if (!toolsResponse.ok) {\n throw new Error(`tools/list failed: ${toolsResponse.status} ${toolsResponse.statusText}`);\n }\n\n const toolsResult = (await parseResponse(toolsResponse)) as { result?: { tools?: McpTool[] } };\n\n return {\n tools: toolsResult.result?.tools ?? [],\n };\n}\n\nexport const useTryConnectMcp = ({\n queryOptions,\n}: { queryOptions?: MastraMutationOptions<TryConnectResult, string> } = {}) => {\n const client = useMastraClient();\n const clientHeaders = (client.options?.headers as Record<string, string>) ?? {};\n\n return useMutation({\n mutationFn: (url: string) => connectAndListTools(url, clientHeaders),\n ...queryOptions,\n });\n};\n\nexport type TryConnectMcpMutation = ReturnType<typeof useTryConnectMcp>;\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":["useMastraClient","useQuery","useMastraClient","useQuery","useMastraClient","useQuery","useMutation","useMastraClient","useQuery","useMastraClient","useQuery","useMastraClient","useQuery","useMastraClient","useMutation"],"sources":["../../../src/hooks/mcps/use-mcp-app-html.ts","../../../src/hooks/mcps/use-mcp-app-tools.ts","../../../src/hooks/mcps/use-mcp-server-tool.ts","../../../src/hooks/mcps/use-mcp-server-tools.ts","../../../src/hooks/mcps/use-mcp-server-tools-by-id.ts","../../../src/hooks/mcps/use-mcp-servers.ts","../../../src/hooks/mcps/use-try-connect-mcp.ts"],"sourcesContent":["import type { MastraClient } from '@mastra/client-js';\nimport { useQuery } from '@tanstack/react-query';\nimport type { UseQueryResult } from '@tanstack/react-query';\nimport { useMastraClient } from '../../mastra-client-context';\nimport type { MastraQueryOptions } from '../shared/query-options';\n\n/** The app HTML, or `null` when the resource has no text. */\ntype McpAppHtml = string | null;\n\nexport type ReadMcpServerResourceResponse = Awaited<ReturnType<MastraClient['readMcpServerResource']>>;\n\n/**\n * The HTML of an MCP tool's `ui://` app resource (from the tool's `_meta`), for rendering the tool's own UI.\n * Skips the fetch when the tool has no app resource.\n */\nexport const useMcpAppHtml = <TData = McpAppHtml>({\n serverId,\n appResourceUri,\n queryOptions,\n}: {\n serverId: string;\n appResourceUri?: string;\n queryOptions?: MastraQueryOptions<McpAppHtml, TData>;\n}): UseQueryResult<TData, Error> => {\n const client = useMastraClient();\n\n return useQuery({\n queryKey: ['mcp-app-resource', serverId, appResourceUri],\n queryFn: async () => {\n if (!appResourceUri) return null;\n const response = await client.readMcpServerResource(serverId, appResourceUri);\n return response.contents[0]?.text ?? null;\n },\n enabled: appResourceUri !== undefined,\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';\n\nexport interface McpAppToolInfo {\n serverId: string;\n toolId: string;\n toolName: string;\n resourceUri: string;\n}\n\n/**\n * Builds a map of tool names → MCP App info for tools across all registered\n * MCP servers that have `_meta.ui.resourceUri` (i.e., tools with interactive\n * MCP App UIs).\n *\n * For each app tool, entries are created under both the original tool name\n * and the namespaced name (`${serverId}_${toolName}`) so that agent tools\n * sourced via `MCPClient.listTools()` (which namespaces) can be resolved.\n */\nexport function useMcpAppTools<TData = Record<string, McpAppToolInfo>>({\n queryOptions,\n}: { queryOptions?: MastraQueryOptions<Record<string, McpAppToolInfo>, TData> } = {}): UseQueryResult<TData, Error> {\n const client = useMastraClient();\n\n return useQuery({\n queryKey: ['mcp-app-tools'],\n queryFn: async () => {\n const map: Record<string, McpAppToolInfo> = {};\n\n const { servers } = await client.getMcpServers();\n if (!servers?.length) return map;\n\n const results = await Promise.allSettled(\n servers.map(async server => {\n const { tools } = await client.getMcpServerTools(server.id);\n return { serverId: server.id, tools };\n }),\n );\n\n for (const result of results) {\n if (result.status !== 'fulfilled') continue;\n const { serverId, tools } = result.value;\n for (const tool of tools) {\n const meta = tool._meta as { ui?: { resourceUri?: string } } | undefined;\n const resourceUri = meta?.ui?.resourceUri;\n if (resourceUri) {\n const toolId = tool.name;\n const info: McpAppToolInfo = { serverId, toolId, toolName: tool.name, resourceUri };\n map[toolId] = info;\n if (tool.name !== toolId) {\n map[tool.name] = info;\n }\n // Also map the namespaced name used by MCPClient.listTools()\n map[`${serverId}_${tool.name}`] = info;\n }\n }\n }\n\n return map;\n },\n staleTime: 60_000,\n refetchOnWindowFocus: false,\n ...queryOptions,\n });\n}\n","import type { MastraClient } from '@mastra/client-js';\nimport type { RequestContext } from '@mastra/core/request-context';\nimport { useMutation, useQuery } from '@tanstack/react-query';\nimport type { UseMutationResult, UseQueryResult } from '@tanstack/react-query';\nimport { useMastraClient } from '../../mastra-client-context';\nimport type { MastraMutationOptions, MastraQueryOptions } from '../shared/query-options';\n\ntype MCPServerToolDetails = Awaited<ReturnType<ReturnType<MastraClient['getMcpServerTool']>['details']>>;\n\n/**\n * Does not guard on empty ids; pass `queryOptions: { enabled }` to skip the fetch.\n */\nexport const useMCPServerTool = <TData = MCPServerToolDetails>({\n serverId,\n toolId,\n requestContext,\n queryOptions,\n}: {\n serverId: string;\n toolId: string;\n requestContext?: Record<string, any>;\n queryOptions?: MastraQueryOptions<MCPServerToolDetails, TData>;\n}): UseQueryResult<TData, Error> => {\n const client = useMastraClient();\n\n return useQuery({\n queryKey: ['mcp-server-tool', serverId, toolId],\n queryFn: () => {\n const instance = client.getMcpServerTool(serverId, toolId);\n return instance.details(requestContext);\n },\n ...queryOptions,\n });\n};\n\nexport type ExecuteMCPToolResponse = Awaited<ReturnType<ReturnType<MastraClient['getMcpServerTool']>['execute']>>;\ntype ExecuteMCPToolVariables = { data: any; requestContext?: Record<string, any> };\n\nexport const useExecuteMCPTool = ({\n serverId,\n toolId,\n queryOptions,\n}: {\n serverId: string;\n toolId: string;\n queryOptions?: MastraMutationOptions<ExecuteMCPToolResponse, ExecuteMCPToolVariables>;\n}): UseMutationResult<ExecuteMCPToolResponse, Error, ExecuteMCPToolVariables> => {\n const client = useMastraClient();\n\n return useMutation({\n mutationFn: ({ data, requestContext }: ExecuteMCPToolVariables) => {\n const instance = client.getMcpServerTool(serverId, toolId);\n return instance.execute({ data, requestContext: requestContext as RequestContext });\n },\n ...queryOptions,\n });\n};\n","import type { McpToolInfo as SdkMcpToolInfo } from '@mastra/client-js';\nimport type { ServerInfo } from '@mastra/core/mcp';\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 useMCPServerTools = <TData = Record<string, SdkMcpToolInfo>>({\n selectedServer,\n queryOptions,\n}: {\n selectedServer: ServerInfo;\n queryOptions?: MastraQueryOptions<Record<string, SdkMcpToolInfo>, TData>;\n}): UseQueryResult<TData, Error> => {\n const client = useMastraClient();\n\n return useQuery({\n queryKey: ['mcpserver-tools', selectedServer?.id],\n queryFn: async () => {\n const response = await client.getMcpServerTools(selectedServer?.id);\n const fetchedToolsArray: SdkMcpToolInfo[] = response.tools;\n const transformedTools: Record<string, SdkMcpToolInfo> = {};\n fetchedToolsArray.forEach((sdkToolInfo: SdkMcpToolInfo) => {\n transformedTools[sdkToolInfo.name] = sdkToolInfo;\n });\n\n return transformedTools;\n },\n retry: false,\n refetchOnWindowFocus: false,\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\ntype MCPServerToolsById = Record<string, Awaited<ReturnType<MastraClient['getMcpServerTools']>>['tools'][number]>;\n\n/**\n * Does not guard on empty ids; pass `queryOptions: { enabled }` to skip the fetch.\n */\nexport const useMCPServerToolsById = <TData = MCPServerToolsById>({\n serverId,\n queryOptions,\n}: {\n serverId: string | null;\n queryOptions?: MastraQueryOptions<MCPServerToolsById, TData>;\n}): UseQueryResult<TData, Error> => {\n const client = useMastraClient();\n\n return useQuery({\n queryKey: ['mcpserver-tools', serverId],\n queryFn: async (): Promise<MCPServerToolsById> => {\n const response = await client.getMcpServerTools(serverId!);\n return Object.fromEntries(response.tools.map(tool => [tool.name, tool]));\n },\n retry: false,\n refetchOnWindowFocus: false,\n ...queryOptions,\n });\n};\n","import type { McpServerListResponse } 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 useMCPServers = <TData = McpServerListResponse['servers']>({\n requestContext,\n queryOptions,\n}: {\n requestContext?: Record<string, any>;\n queryOptions?: MastraQueryOptions<McpServerListResponse['servers'], TData>;\n} = {}): UseQueryResult<TData, Error> => {\n const client = useMastraClient();\n\n return useQuery({\n queryKey: ['mcp-servers'],\n queryFn: async () => {\n const mcpServers: McpServerListResponse['servers'] = (await client.getMcpServers(requestContext)).servers;\n return mcpServers;\n },\n ...queryOptions,\n });\n};\n","import { useMutation } from '@tanstack/react-query';\nimport { useMastraClient } from '../../mastra-client-context';\nimport type { MastraMutationOptions } from '../shared/query-options';\n\ninterface McpTool {\n name: string;\n description?: string;\n inputSchema?: Record<string, unknown>;\n}\n\nexport interface TryConnectResult {\n tools: McpTool[];\n}\n\nasync function parseResponse(response: Response): Promise<unknown> {\n const contentType = response.headers.get('content-type') ?? '';\n\n if (contentType.includes('text/event-stream')) {\n const text = await response.text();\n const lines = text.split('\\n');\n\n for (const line of lines) {\n if (line.startsWith('data:')) {\n const data = line.slice('data:'.length).trim();\n if (data) {\n return JSON.parse(data);\n }\n }\n }\n\n throw new Error('No data found in SSE response');\n }\n\n return response.json();\n}\n\nasync function connectAndListTools(url: string, clientHeaders?: Record<string, string>): Promise<TryConnectResult> {\n const baseHeaders: Record<string, string> = {\n ...clientHeaders,\n 'Content-Type': 'application/json',\n Accept: 'application/json, text/event-stream',\n };\n\n // Step 1: Initialize\n const initResponse = await fetch(url, {\n method: 'POST',\n headers: baseHeaders,\n credentials: 'include',\n body: JSON.stringify({\n jsonrpc: '2.0',\n id: 1,\n method: 'initialize',\n params: {\n protocolVersion: '2025-03-26',\n capabilities: {},\n clientInfo: { name: 'mastra-playground', version: '1.0.0' },\n },\n }),\n });\n\n if (!initResponse.ok) {\n throw new Error(`Initialize failed: ${initResponse.status} ${initResponse.statusText}`);\n }\n\n const sessionId = initResponse.headers.get('Mcp-Session-Id');\n await parseResponse(initResponse);\n\n const sessionHeaders: Record<string, string> = {\n ...baseHeaders,\n };\n if (sessionId) {\n sessionHeaders['Mcp-Session-Id'] = sessionId;\n }\n\n // Step 2: Send initialized notification\n await fetch(url, {\n method: 'POST',\n headers: sessionHeaders,\n credentials: 'include',\n body: JSON.stringify({\n jsonrpc: '2.0',\n method: 'notifications/initialized',\n }),\n });\n\n // Step 3: List tools\n const toolsResponse = await fetch(url, {\n method: 'POST',\n headers: sessionHeaders,\n credentials: 'include',\n body: JSON.stringify({\n jsonrpc: '2.0',\n id: 2,\n method: 'tools/list',\n }),\n });\n\n if (!toolsResponse.ok) {\n throw new Error(`tools/list failed: ${toolsResponse.status} ${toolsResponse.statusText}`);\n }\n\n const toolsResult = (await parseResponse(toolsResponse)) as { result?: { tools?: McpTool[] } };\n\n return {\n tools: toolsResult.result?.tools ?? [],\n };\n}\n\nexport const useTryConnectMcp = ({\n queryOptions,\n}: { queryOptions?: MastraMutationOptions<TryConnectResult, string> } = {}) => {\n const client = useMastraClient();\n const clientHeaders = (client.options?.headers as Record<string, string>) ?? {};\n\n return useMutation({\n mutationFn: (url: string) => connectAndListTools(url, clientHeaders),\n ...queryOptions,\n });\n};\n\nexport type TryConnectMcpMutation = ReturnType<typeof useTryConnectMcp>;\n"],"mappings":"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"}