@mastra/playground-ui 43.0.0-alpha.3 → 43.0.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,29 @@
1
1
  # @mastra/playground-ui
2
2
 
3
+ ## 43.0.0-alpha.5
4
+
5
+ ### Patch Changes
6
+
7
+ - Fixed autoscroll scrollbars not becoming transparent. ([#20171](https://github.com/mastra-ai/mastra/pull/20171))
8
+
9
+ - Fixed the trace feedback panel continuing to poll every 3 seconds when the observability storage domain is disabled. Studio now also recognizes the "Scores storage domain is not available" response from the span scores endpoint, so span score polling stops for disabled scores storage as well. Follow-up to [#20158](https://github.com/mastra-ai/mastra/pull/20158). ([#20170](https://github.com/mastra-ai/mastra/pull/20170))
10
+
11
+ - Updated dependencies [[`73839cb`](https://github.com/mastra-ai/mastra/commit/73839cb58322679c170627d1015669ede5f619aa), [`8e4dc79`](https://github.com/mastra-ai/mastra/commit/8e4dc793dcf035ea506f9ce79f56d2d501a4be14), [`2db93cc`](https://github.com/mastra-ai/mastra/commit/2db93ccd0b872e4de7853a93383efe0647901df8), [`094ab61`](https://github.com/mastra-ai/mastra/commit/094ab6129a1a3ecf6eeb86decac17d5faea4e02a), [`fe80944`](https://github.com/mastra-ai/mastra/commit/fe80944f3ef6681fea6eae8200fce387b7bb3c2f), [`e51e166`](https://github.com/mastra-ai/mastra/commit/e51e166c52e220abc9b64554ce37359dca8544b1)]:
12
+ - @mastra/core@1.53.0-alpha.4
13
+ - @mastra/client-js@1.34.0-alpha.5
14
+ - @mastra/react@1.3.2-alpha.5
15
+
16
+ ## 43.0.0-alpha.4
17
+
18
+ ### Patch Changes
19
+
20
+ - Fixed Studio repeatedly polling observability endpoints when the observability storage domain is disabled. Studio now treats the disabled domain as an unavailable capability: score and log views stop polling, failed requests are not retried, and the Logs page shows a clear unavailable state instead of a generic error. Related to [#20157](https://github.com/mastra-ai/mastra/issues/20157). ([#20158](https://github.com/mastra-ai/mastra/pull/20158))
21
+
22
+ - Updated dependencies:
23
+ - @mastra/core@1.53.0-alpha.3
24
+ - @mastra/client-js@1.34.0-alpha.4
25
+ - @mastra/react@1.3.2-alpha.4
26
+
3
27
  ## 43.0.0-alpha.3
4
28
 
5
29
  ### Patch Changes
@@ -13,6 +13,16 @@ const utils_queryUtils = require('../../../utils/query-utils.cjs.js');
13
13
  function LogsErrorContent({ error, resource, errorTitle }) {
14
14
  if (utils_queryUtils.is401UnauthorizedError(error)) return /* @__PURE__ */ jsxRuntime.jsx(SessionExpired.SessionExpired, {});
15
15
  if (utils_queryUtils.is403ForbiddenError(error)) return /* @__PURE__ */ jsxRuntime.jsx(PermissionDenied.PermissionDenied, { resource });
16
+ if (utils_queryUtils.isObservabilityUnavailableError(error)) {
17
+ return /* @__PURE__ */ jsxRuntime.jsx(
18
+ EmptyState.EmptyState,
19
+ {
20
+ iconSlot: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CircleSlashIcon, {}),
21
+ titleSlot: "Observability storage is not available",
22
+ descriptionSlot: "The observability storage domain is disabled or not configured. Enable it in your storage configuration to view logs in Studio."
23
+ }
24
+ );
25
+ }
16
26
  if (utils_queryUtils.isUnsupportedObservabilityOperationError(error, "logs")) {
17
27
  return /* @__PURE__ */ jsxRuntime.jsx(
18
28
  EmptyState.EmptyState,
@@ -1 +1 @@
1
- {"version":3,"file":"logs-error-content.cjs.js","sources":["../../../../src/domains/logs/components/logs-error-content.tsx"],"sourcesContent":["import { CircleSlashIcon } from 'lucide-react';\nimport { EmptyState } from '@/ds/components/EmptyState';\nimport { ErrorState } from '@/ds/components/ErrorState';\nimport { PermissionDenied } from '@/ds/components/PermissionDenied';\nimport { SessionExpired } from '@/ds/components/SessionExpired';\nimport {\n is401UnauthorizedError,\n is403ForbiddenError,\n isUnsupportedObservabilityOperationError,\n} from '@/lib/query-utils';\n\nexport interface LogsErrorContentProps {\n /** The error from a useLogs query. */\n error: unknown;\n /** Passed to PermissionDenied (usually 'logs'). */\n resource: string;\n /** Title shown on the generic ErrorState fallback. */\n errorTitle: string;\n}\n\n/**\n * Renders the appropriate fallback content for a logs-related query error:\n * `<SessionExpired />` for 401, `<PermissionDenied />` for 403, otherwise `<ErrorState />`.\n * Mirror of `TracesErrorContent` for the logs domain.\n */\nexport function LogsErrorContent({ error, resource, errorTitle }: LogsErrorContentProps) {\n if (is401UnauthorizedError(error)) return <SessionExpired />;\n if (is403ForbiddenError(error)) return <PermissionDenied resource={resource} />;\n if (isUnsupportedObservabilityOperationError(error, 'logs')) {\n return (\n <EmptyState\n iconSlot={<CircleSlashIcon />}\n titleSlot=\"Logs are not available with your current storage\"\n descriptionSlot=\"The configured observability storage provider does not support listing logs. Switch to a storage provider with logs support to view runtime logs in Studio.\"\n />\n );\n }\n const message = error instanceof Error ? error.message : undefined;\n return <ErrorState title={errorTitle} message={message ?? 'Unknown error'} />;\n}\n"],"names":["is401UnauthorizedError","SessionExpired","is403ForbiddenError","jsx","PermissionDenied","isUnsupportedObservabilityOperationError","EmptyState","CircleSlashIcon","ErrorState"],"mappings":";;;;;;;;;;;;AAyBO,SAAS,gBAAA,CAAiB,EAAE,KAAA,EAAO,QAAA,EAAU,YAAW,EAA0B;AACvF,EAAA,IAAIA,uCAAA,CAAuB,KAAK,CAAA,EAAG,sCAAQC,6BAAA,EAAA,EAAe,CAAA;AAC1D,EAAA,IAAIC,qCAAoB,KAAK,CAAA,EAAG,uBAAOC,cAAA,CAACC,qCAAiB,QAAA,EAAoB,CAAA;AAC7E,EAAA,IAAIC,yDAAA,CAAyC,KAAA,EAAO,MAAM,CAAA,EAAG;AAC3D,IAAA,uBACEF,cAAA;AAAA,MAACG,qBAAA;AAAA,MAAA;AAAA,QACC,QAAA,iCAAWC,2BAAA,EAAA,EAAgB,CAAA;AAAA,QAC3B,SAAA,EAAU,kDAAA;AAAA,QACV,eAAA,EAAgB;AAAA;AAAA,KAClB;AAAA,EAEJ;AACA,EAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,MAAA;AACzD,EAAA,sCAAQC,qBAAA,EAAA,EAAW,KAAA,EAAO,UAAA,EAAY,OAAA,EAAS,WAAW,eAAA,EAAiB,CAAA;AAC7E;;;;"}
1
+ {"version":3,"file":"logs-error-content.cjs.js","sources":["../../../../src/domains/logs/components/logs-error-content.tsx"],"sourcesContent":["import { CircleSlashIcon } from 'lucide-react';\nimport { EmptyState } from '@/ds/components/EmptyState';\nimport { ErrorState } from '@/ds/components/ErrorState';\nimport { PermissionDenied } from '@/ds/components/PermissionDenied';\nimport { SessionExpired } from '@/ds/components/SessionExpired';\nimport {\n is401UnauthorizedError,\n is403ForbiddenError,\n isObservabilityUnavailableError,\n isUnsupportedObservabilityOperationError,\n} from '@/lib/query-utils';\n\nexport interface LogsErrorContentProps {\n /** The error from a useLogs query. */\n error: unknown;\n /** Passed to PermissionDenied (usually 'logs'). */\n resource: string;\n /** Title shown on the generic ErrorState fallback. */\n errorTitle: string;\n}\n\n/**\n * Renders the appropriate fallback content for a logs-related query error:\n * `<SessionExpired />` for 401, `<PermissionDenied />` for 403, otherwise `<ErrorState />`.\n * Mirror of `TracesErrorContent` for the logs domain.\n */\nexport function LogsErrorContent({ error, resource, errorTitle }: LogsErrorContentProps) {\n if (is401UnauthorizedError(error)) return <SessionExpired />;\n if (is403ForbiddenError(error)) return <PermissionDenied resource={resource} />;\n if (isObservabilityUnavailableError(error)) {\n return (\n <EmptyState\n iconSlot={<CircleSlashIcon />}\n titleSlot=\"Observability storage is not available\"\n descriptionSlot=\"The observability storage domain is disabled or not configured. Enable it in your storage configuration to view logs in Studio.\"\n />\n );\n }\n if (isUnsupportedObservabilityOperationError(error, 'logs')) {\n return (\n <EmptyState\n iconSlot={<CircleSlashIcon />}\n titleSlot=\"Logs are not available with your current storage\"\n descriptionSlot=\"The configured observability storage provider does not support listing logs. Switch to a storage provider with logs support to view runtime logs in Studio.\"\n />\n );\n }\n const message = error instanceof Error ? error.message : undefined;\n return <ErrorState title={errorTitle} message={message ?? 'Unknown error'} />;\n}\n"],"names":["is401UnauthorizedError","SessionExpired","is403ForbiddenError","jsx","PermissionDenied","isObservabilityUnavailableError","EmptyState","CircleSlashIcon","isUnsupportedObservabilityOperationError","ErrorState"],"mappings":";;;;;;;;;;;;AA0BO,SAAS,gBAAA,CAAiB,EAAE,KAAA,EAAO,QAAA,EAAU,YAAW,EAA0B;AACvF,EAAA,IAAIA,uCAAA,CAAuB,KAAK,CAAA,EAAG,sCAAQC,6BAAA,EAAA,EAAe,CAAA;AAC1D,EAAA,IAAIC,qCAAoB,KAAK,CAAA,EAAG,uBAAOC,cAAA,CAACC,qCAAiB,QAAA,EAAoB,CAAA;AAC7E,EAAA,IAAIC,gDAAA,CAAgC,KAAK,CAAA,EAAG;AAC1C,IAAA,uBACEF,cAAA;AAAA,MAACG,qBAAA;AAAA,MAAA;AAAA,QACC,QAAA,iCAAWC,2BAAA,EAAA,EAAgB,CAAA;AAAA,QAC3B,SAAA,EAAU,wCAAA;AAAA,QACV,eAAA,EAAgB;AAAA;AAAA,KAClB;AAAA,EAEJ;AACA,EAAA,IAAIC,yDAAA,CAAyC,KAAA,EAAO,MAAM,CAAA,EAAG;AAC3D,IAAA,uBACEL,cAAA;AAAA,MAACG,qBAAA;AAAA,MAAA;AAAA,QACC,QAAA,iCAAWC,2BAAA,EAAA,EAAgB,CAAA;AAAA,QAC3B,SAAA,EAAU,kDAAA;AAAA,QACV,eAAA,EAAgB;AAAA;AAAA,KAClB;AAAA,EAEJ;AACA,EAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,MAAA;AACzD,EAAA,sCAAQE,qBAAA,EAAA,EAAW,KAAA,EAAO,UAAA,EAAY,OAAA,EAAS,WAAW,eAAA,EAAiB,CAAA;AAC7E;;;;"}
@@ -4,11 +4,21 @@ import { E as EmptyState } from '../../../EmptyState-BLd-LJOA.js';
4
4
  import { E as ErrorState } from '../../../ErrorState-t59EAa55.js';
5
5
  import { P as PermissionDenied } from '../../../PermissionDenied-8otNeK_X.js';
6
6
  import { S as SessionExpired } from '../../../SessionExpired-CHF__hq9.js';
7
- import { is401UnauthorizedError, is403ForbiddenError, isUnsupportedObservabilityOperationError } from '../../../utils/query-utils.es.js';
7
+ import { is401UnauthorizedError, is403ForbiddenError, isObservabilityUnavailableError, isUnsupportedObservabilityOperationError } from '../../../utils/query-utils.es.js';
8
8
 
9
9
  function LogsErrorContent({ error, resource, errorTitle }) {
10
10
  if (is401UnauthorizedError(error)) return /* @__PURE__ */ jsx(SessionExpired, {});
11
11
  if (is403ForbiddenError(error)) return /* @__PURE__ */ jsx(PermissionDenied, { resource });
12
+ if (isObservabilityUnavailableError(error)) {
13
+ return /* @__PURE__ */ jsx(
14
+ EmptyState,
15
+ {
16
+ iconSlot: /* @__PURE__ */ jsx(CircleSlashIcon, {}),
17
+ titleSlot: "Observability storage is not available",
18
+ descriptionSlot: "The observability storage domain is disabled or not configured. Enable it in your storage configuration to view logs in Studio."
19
+ }
20
+ );
21
+ }
12
22
  if (isUnsupportedObservabilityOperationError(error, "logs")) {
13
23
  return /* @__PURE__ */ jsx(
14
24
  EmptyState,
@@ -1 +1 @@
1
- {"version":3,"file":"logs-error-content.es.js","sources":["../../../../src/domains/logs/components/logs-error-content.tsx"],"sourcesContent":["import { CircleSlashIcon } from 'lucide-react';\nimport { EmptyState } from '@/ds/components/EmptyState';\nimport { ErrorState } from '@/ds/components/ErrorState';\nimport { PermissionDenied } from '@/ds/components/PermissionDenied';\nimport { SessionExpired } from '@/ds/components/SessionExpired';\nimport {\n is401UnauthorizedError,\n is403ForbiddenError,\n isUnsupportedObservabilityOperationError,\n} from '@/lib/query-utils';\n\nexport interface LogsErrorContentProps {\n /** The error from a useLogs query. */\n error: unknown;\n /** Passed to PermissionDenied (usually 'logs'). */\n resource: string;\n /** Title shown on the generic ErrorState fallback. */\n errorTitle: string;\n}\n\n/**\n * Renders the appropriate fallback content for a logs-related query error:\n * `<SessionExpired />` for 401, `<PermissionDenied />` for 403, otherwise `<ErrorState />`.\n * Mirror of `TracesErrorContent` for the logs domain.\n */\nexport function LogsErrorContent({ error, resource, errorTitle }: LogsErrorContentProps) {\n if (is401UnauthorizedError(error)) return <SessionExpired />;\n if (is403ForbiddenError(error)) return <PermissionDenied resource={resource} />;\n if (isUnsupportedObservabilityOperationError(error, 'logs')) {\n return (\n <EmptyState\n iconSlot={<CircleSlashIcon />}\n titleSlot=\"Logs are not available with your current storage\"\n descriptionSlot=\"The configured observability storage provider does not support listing logs. Switch to a storage provider with logs support to view runtime logs in Studio.\"\n />\n );\n }\n const message = error instanceof Error ? error.message : undefined;\n return <ErrorState title={errorTitle} message={message ?? 'Unknown error'} />;\n}\n"],"names":[],"mappings":";;;;;;;;AAyBO,SAAS,gBAAA,CAAiB,EAAE,KAAA,EAAO,QAAA,EAAU,YAAW,EAA0B;AACvF,EAAA,IAAI,sBAAA,CAAuB,KAAK,CAAA,EAAG,2BAAQ,cAAA,EAAA,EAAe,CAAA;AAC1D,EAAA,IAAI,oBAAoB,KAAK,CAAA,EAAG,uBAAO,GAAA,CAAC,oBAAiB,QAAA,EAAoB,CAAA;AAC7E,EAAA,IAAI,wCAAA,CAAyC,KAAA,EAAO,MAAM,CAAA,EAAG;AAC3D,IAAA,uBACE,GAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,QAAA,sBAAW,eAAA,EAAA,EAAgB,CAAA;AAAA,QAC3B,SAAA,EAAU,kDAAA;AAAA,QACV,eAAA,EAAgB;AAAA;AAAA,KAClB;AAAA,EAEJ;AACA,EAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,MAAA;AACzD,EAAA,2BAAQ,UAAA,EAAA,EAAW,KAAA,EAAO,UAAA,EAAY,OAAA,EAAS,WAAW,eAAA,EAAiB,CAAA;AAC7E;;;;"}
1
+ {"version":3,"file":"logs-error-content.es.js","sources":["../../../../src/domains/logs/components/logs-error-content.tsx"],"sourcesContent":["import { CircleSlashIcon } from 'lucide-react';\nimport { EmptyState } from '@/ds/components/EmptyState';\nimport { ErrorState } from '@/ds/components/ErrorState';\nimport { PermissionDenied } from '@/ds/components/PermissionDenied';\nimport { SessionExpired } from '@/ds/components/SessionExpired';\nimport {\n is401UnauthorizedError,\n is403ForbiddenError,\n isObservabilityUnavailableError,\n isUnsupportedObservabilityOperationError,\n} from '@/lib/query-utils';\n\nexport interface LogsErrorContentProps {\n /** The error from a useLogs query. */\n error: unknown;\n /** Passed to PermissionDenied (usually 'logs'). */\n resource: string;\n /** Title shown on the generic ErrorState fallback. */\n errorTitle: string;\n}\n\n/**\n * Renders the appropriate fallback content for a logs-related query error:\n * `<SessionExpired />` for 401, `<PermissionDenied />` for 403, otherwise `<ErrorState />`.\n * Mirror of `TracesErrorContent` for the logs domain.\n */\nexport function LogsErrorContent({ error, resource, errorTitle }: LogsErrorContentProps) {\n if (is401UnauthorizedError(error)) return <SessionExpired />;\n if (is403ForbiddenError(error)) return <PermissionDenied resource={resource} />;\n if (isObservabilityUnavailableError(error)) {\n return (\n <EmptyState\n iconSlot={<CircleSlashIcon />}\n titleSlot=\"Observability storage is not available\"\n descriptionSlot=\"The observability storage domain is disabled or not configured. Enable it in your storage configuration to view logs in Studio.\"\n />\n );\n }\n if (isUnsupportedObservabilityOperationError(error, 'logs')) {\n return (\n <EmptyState\n iconSlot={<CircleSlashIcon />}\n titleSlot=\"Logs are not available with your current storage\"\n descriptionSlot=\"The configured observability storage provider does not support listing logs. Switch to a storage provider with logs support to view runtime logs in Studio.\"\n />\n );\n }\n const message = error instanceof Error ? error.message : undefined;\n return <ErrorState title={errorTitle} message={message ?? 'Unknown error'} />;\n}\n"],"names":[],"mappings":";;;;;;;;AA0BO,SAAS,gBAAA,CAAiB,EAAE,KAAA,EAAO,QAAA,EAAU,YAAW,EAA0B;AACvF,EAAA,IAAI,sBAAA,CAAuB,KAAK,CAAA,EAAG,2BAAQ,cAAA,EAAA,EAAe,CAAA;AAC1D,EAAA,IAAI,oBAAoB,KAAK,CAAA,EAAG,uBAAO,GAAA,CAAC,oBAAiB,QAAA,EAAoB,CAAA;AAC7E,EAAA,IAAI,+BAAA,CAAgC,KAAK,CAAA,EAAG;AAC1C,IAAA,uBACE,GAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,QAAA,sBAAW,eAAA,EAAA,EAAgB,CAAA;AAAA,QAC3B,SAAA,EAAU,wCAAA;AAAA,QACV,eAAA,EAAgB;AAAA;AAAA,KAClB;AAAA,EAEJ;AACA,EAAA,IAAI,wCAAA,CAAyC,KAAA,EAAO,MAAM,CAAA,EAAG;AAC3D,IAAA,uBACE,GAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,QAAA,sBAAW,eAAA,EAAA,EAAgB,CAAA;AAAA,QAC3B,SAAA,EAAU,kDAAA;AAAA,QACV,eAAA,EAAgB;AAAA;AAAA,KAClB;AAAA,EAEJ;AACA,EAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,MAAA;AACzD,EAAA,2BAAQ,UAAA,EAAA,EAAW,KAAA,EAAO,UAAA,EAAY,OAAA,EAAS,WAAW,eAAA,EAAiB,CAAA;AAC7E;;;;"}
@@ -30,7 +30,7 @@ function selectLogs(data) {
30
30
  return result;
31
31
  }
32
32
  function getLogsRefetchInterval(query) {
33
- if (utils_queryUtils.isUnsupportedObservabilityOperationError(query.state.error, "logs")) {
33
+ if (utils_queryUtils.isUnsupportedObservabilityOperationError(query.state.error, "logs") || utils_queryUtils.isObservabilityUnavailableError(query.state.error)) {
34
34
  return false;
35
35
  }
36
36
  return LOGS_REFETCH_INTERVAL_MS;
@@ -1 +1 @@
1
- {"version":3,"file":"use-logs.cjs.js","sources":["../../../../src/domains/logs/hooks/use-logs.ts"],"sourcesContent":["import type { ListLogsArgs, ListLogsResponse } from '@mastra/core/storage';\nimport { useMastraClient } from '@mastra/react';\nimport { useInfiniteQuery } from '@tanstack/react-query';\nimport { useEffect } from 'react';\n\nimport type { LogRecord } from '../types';\nimport { useInView } from '@/hooks/use-in-view';\nimport { isUnsupportedObservabilityOperationError } from '@/lib/query-utils';\n\ninterface UseLogsReturn {\n data: LogRecord[] | undefined;\n hasNextPage: boolean;\n isFetchingNextPage: boolean;\n fetchNextPage: () => void;\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n setEndOfListElement: (node: HTMLDivElement | null) => void;\n}\n\nconst LOGS_PER_PAGE = 20;\nconst LOGS_REFETCH_INTERVAL_MS = 10000;\n\nexport interface LogsFilters {\n filters?: ListLogsArgs['filters'];\n}\n\nfunction getNextPageParam(lastPage: ListLogsResponse | undefined, _allPages: unknown, lastPageParam: number) {\n if (lastPage?.pagination?.hasMore) {\n return lastPageParam + 1;\n }\n return undefined;\n}\n\n/** Deduplicates logs across loaded pages. Offset-based pagination duplicates rows at the page\n * boundary whenever new logs are inserted between sequential `fetchNextPage` calls — without\n * this filter the duplicates produce duplicate React keys and chaotic virtualizer offsets.\n * Falls back to the full serialized record when `logId` is absent so logs that happen to\n * share `(timestamp, message, data)` but differ in other fields aren't collapsed. */\nfunction selectLogs(data: { pages: ListLogsResponse[] }) {\n const seen = new Set<string>();\n const result = [];\n for (const page of data.pages) {\n for (const log of page.logs ?? []) {\n const key = log.logId ?? JSON.stringify(log);\n if (seen.has(key)) continue;\n seen.add(key);\n result.push(log);\n }\n }\n return result;\n}\n\nexport function getLogsRefetchInterval(query: { state: { error: unknown } }) {\n if (isUnsupportedObservabilityOperationError(query.state.error, 'logs')) {\n return false;\n }\n return LOGS_REFETCH_INTERVAL_MS;\n}\n\nexport const useLogs: (props?: LogsFilters) => UseLogsReturn = ({ filters }: LogsFilters = {}) => {\n const client = useMastraClient();\n const { inView: isEndOfListInView, setRef: setEndOfListElement } = useInView();\n\n const query = useInfiniteQuery<ListLogsResponse, Error, ReturnType<typeof selectLogs>, readonly unknown[], number>({\n queryKey: ['logs', filters],\n queryFn: ({ pageParam }) =>\n client.listLogsVNext({\n pagination: { page: pageParam, perPage: LOGS_PER_PAGE },\n filters,\n orderBy: { field: 'timestamp', direction: 'DESC' },\n }),\n initialPageParam: 0,\n getNextPageParam,\n select: selectLogs,\n retry: false,\n refetchInterval: getLogsRefetchInterval,\n });\n\n const { hasNextPage, isFetchingNextPage, fetchNextPage, data, isLoading, isError, error } = query;\n\n useEffect(() => {\n if (isEndOfListInView && hasNextPage && !isFetchingNextPage) {\n void fetchNextPage();\n }\n }, [isEndOfListInView, hasNextPage, isFetchingNextPage, fetchNextPage]);\n\n return { data, hasNextPage, isFetchingNextPage, fetchNextPage, isLoading, isError, error, setEndOfListElement };\n};\n"],"names":["isUnsupportedObservabilityOperationError","useMastraClient","useInView","useInfiniteQuery","useEffect"],"mappings":";;;;;;;;;;AAoBA,MAAM,aAAA,GAAgB,EAAA;AACtB,MAAM,wBAAA,GAA2B,GAAA;AAMjC,SAAS,gBAAA,CAAiB,QAAA,EAAwC,SAAA,EAAoB,aAAA,EAAuB;AAC3G,EAAA,IAAI,QAAA,EAAU,YAAY,OAAA,EAAS;AACjC,IAAA,OAAO,aAAA,GAAgB,CAAA;AAAA,EACzB;AACA,EAAA,OAAO,MAAA;AACT;AAOA,SAAS,WAAW,IAAA,EAAqC;AACvD,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,MAAM,SAAS,EAAC;AAChB,EAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,KAAA,EAAO;AAC7B,IAAA,KAAA,MAAW,GAAA,IAAO,IAAA,CAAK,IAAA,IAAQ,EAAC,EAAG;AACjC,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,KAAA,IAAS,IAAA,CAAK,UAAU,GAAG,CAAA;AAC3C,MAAA,IAAI,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,EAAG;AACnB,MAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AACZ,MAAA,MAAA,CAAO,KAAK,GAAG,CAAA;AAAA,IACjB;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,uBAAuB,KAAA,EAAsC;AAC3E,EAAA,IAAIA,yDAAA,CAAyC,KAAA,CAAM,KAAA,CAAM,KAAA,EAAO,MAAM,CAAA,EAAG;AACvE,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,OAAO,wBAAA;AACT;AAEO,MAAM,UAAkD,CAAC,EAAE,OAAA,EAAQ,GAAiB,EAAC,KAAM;AAChG,EAAA,MAAM,SAASC,qBAAA,EAAgB;AAC/B,EAAA,MAAM,EAAE,MAAA,EAAQ,iBAAA,EAAmB,MAAA,EAAQ,mBAAA,KAAwBC,yBAAA,EAAU;AAE7E,EAAA,MAAM,QAAQC,2BAAA,CAAqG;AAAA,IACjH,QAAA,EAAU,CAAC,MAAA,EAAQ,OAAO,CAAA;AAAA,IAC1B,SAAS,CAAC,EAAE,SAAA,EAAU,KACpB,OAAO,aAAA,CAAc;AAAA,MACnB,UAAA,EAAY,EAAE,IAAA,EAAM,SAAA,EAAW,SAAS,aAAA,EAAc;AAAA,MACtD,OAAA;AAAA,MACA,OAAA,EAAS,EAAE,KAAA,EAAO,WAAA,EAAa,WAAW,MAAA;AAAO,KAClD,CAAA;AAAA,IACH,gBAAA,EAAkB,CAAA;AAAA,IAClB,gBAAA;AAAA,IACA,MAAA,EAAQ,UAAA;AAAA,IACR,KAAA,EAAO,KAAA;AAAA,IACP,eAAA,EAAiB;AAAA,GAClB,CAAA;AAED,EAAA,MAAM,EAAE,aAAa,kBAAA,EAAoB,aAAA,EAAe,MAAM,SAAA,EAAW,OAAA,EAAS,OAAM,GAAI,KAAA;AAE5F,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,iBAAA,IAAqB,WAAA,IAAe,CAAC,kBAAA,EAAoB;AAC3D,MAAA,KAAK,aAAA,EAAc;AAAA,IACrB;AAAA,EACF,GAAG,CAAC,iBAAA,EAAmB,WAAA,EAAa,kBAAA,EAAoB,aAAa,CAAC,CAAA;AAEtE,EAAA,OAAO,EAAE,MAAM,WAAA,EAAa,kBAAA,EAAoB,eAAe,SAAA,EAAW,OAAA,EAAS,OAAO,mBAAA,EAAoB;AAChH;;;;;"}
1
+ {"version":3,"file":"use-logs.cjs.js","sources":["../../../../src/domains/logs/hooks/use-logs.ts"],"sourcesContent":["import type { ListLogsArgs, ListLogsResponse } from '@mastra/core/storage';\nimport { useMastraClient } from '@mastra/react';\nimport { useInfiniteQuery } from '@tanstack/react-query';\nimport { useEffect } from 'react';\n\nimport type { LogRecord } from '../types';\nimport { useInView } from '@/hooks/use-in-view';\nimport { isObservabilityUnavailableError, isUnsupportedObservabilityOperationError } from '@/lib/query-utils';\n\ninterface UseLogsReturn {\n data: LogRecord[] | undefined;\n hasNextPage: boolean;\n isFetchingNextPage: boolean;\n fetchNextPage: () => void;\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n setEndOfListElement: (node: HTMLDivElement | null) => void;\n}\n\nconst LOGS_PER_PAGE = 20;\nconst LOGS_REFETCH_INTERVAL_MS = 10000;\n\nexport interface LogsFilters {\n filters?: ListLogsArgs['filters'];\n}\n\nfunction getNextPageParam(lastPage: ListLogsResponse | undefined, _allPages: unknown, lastPageParam: number) {\n if (lastPage?.pagination?.hasMore) {\n return lastPageParam + 1;\n }\n return undefined;\n}\n\n/** Deduplicates logs across loaded pages. Offset-based pagination duplicates rows at the page\n * boundary whenever new logs are inserted between sequential `fetchNextPage` calls — without\n * this filter the duplicates produce duplicate React keys and chaotic virtualizer offsets.\n * Falls back to the full serialized record when `logId` is absent so logs that happen to\n * share `(timestamp, message, data)` but differ in other fields aren't collapsed. */\nfunction selectLogs(data: { pages: ListLogsResponse[] }) {\n const seen = new Set<string>();\n const result = [];\n for (const page of data.pages) {\n for (const log of page.logs ?? []) {\n const key = log.logId ?? JSON.stringify(log);\n if (seen.has(key)) continue;\n seen.add(key);\n result.push(log);\n }\n }\n return result;\n}\n\nexport function getLogsRefetchInterval(query: { state: { error: unknown } }) {\n if (\n isUnsupportedObservabilityOperationError(query.state.error, 'logs') ||\n isObservabilityUnavailableError(query.state.error)\n ) {\n return false;\n }\n return LOGS_REFETCH_INTERVAL_MS;\n}\n\nexport const useLogs: (props?: LogsFilters) => UseLogsReturn = ({ filters }: LogsFilters = {}) => {\n const client = useMastraClient();\n const { inView: isEndOfListInView, setRef: setEndOfListElement } = useInView();\n\n const query = useInfiniteQuery<ListLogsResponse, Error, ReturnType<typeof selectLogs>, readonly unknown[], number>({\n queryKey: ['logs', filters],\n queryFn: ({ pageParam }) =>\n client.listLogsVNext({\n pagination: { page: pageParam, perPage: LOGS_PER_PAGE },\n filters,\n orderBy: { field: 'timestamp', direction: 'DESC' },\n }),\n initialPageParam: 0,\n getNextPageParam,\n select: selectLogs,\n retry: false,\n refetchInterval: getLogsRefetchInterval,\n });\n\n const { hasNextPage, isFetchingNextPage, fetchNextPage, data, isLoading, isError, error } = query;\n\n useEffect(() => {\n if (isEndOfListInView && hasNextPage && !isFetchingNextPage) {\n void fetchNextPage();\n }\n }, [isEndOfListInView, hasNextPage, isFetchingNextPage, fetchNextPage]);\n\n return { data, hasNextPage, isFetchingNextPage, fetchNextPage, isLoading, isError, error, setEndOfListElement };\n};\n"],"names":["isUnsupportedObservabilityOperationError","isObservabilityUnavailableError","useMastraClient","useInView","useInfiniteQuery","useEffect"],"mappings":";;;;;;;;;;AAoBA,MAAM,aAAA,GAAgB,EAAA;AACtB,MAAM,wBAAA,GAA2B,GAAA;AAMjC,SAAS,gBAAA,CAAiB,QAAA,EAAwC,SAAA,EAAoB,aAAA,EAAuB;AAC3G,EAAA,IAAI,QAAA,EAAU,YAAY,OAAA,EAAS;AACjC,IAAA,OAAO,aAAA,GAAgB,CAAA;AAAA,EACzB;AACA,EAAA,OAAO,MAAA;AACT;AAOA,SAAS,WAAW,IAAA,EAAqC;AACvD,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,MAAM,SAAS,EAAC;AAChB,EAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,KAAA,EAAO;AAC7B,IAAA,KAAA,MAAW,GAAA,IAAO,IAAA,CAAK,IAAA,IAAQ,EAAC,EAAG;AACjC,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,KAAA,IAAS,IAAA,CAAK,UAAU,GAAG,CAAA;AAC3C,MAAA,IAAI,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,EAAG;AACnB,MAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AACZ,MAAA,MAAA,CAAO,KAAK,GAAG,CAAA;AAAA,IACjB;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,uBAAuB,KAAA,EAAsC;AAC3E,EAAA,IACEA,yDAAA,CAAyC,KAAA,CAAM,KAAA,CAAM,KAAA,EAAO,MAAM,KAClEC,gDAAA,CAAgC,KAAA,CAAM,KAAA,CAAM,KAAK,CAAA,EACjD;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,OAAO,wBAAA;AACT;AAEO,MAAM,UAAkD,CAAC,EAAE,OAAA,EAAQ,GAAiB,EAAC,KAAM;AAChG,EAAA,MAAM,SAASC,qBAAA,EAAgB;AAC/B,EAAA,MAAM,EAAE,MAAA,EAAQ,iBAAA,EAAmB,MAAA,EAAQ,mBAAA,KAAwBC,yBAAA,EAAU;AAE7E,EAAA,MAAM,QAAQC,2BAAA,CAAqG;AAAA,IACjH,QAAA,EAAU,CAAC,MAAA,EAAQ,OAAO,CAAA;AAAA,IAC1B,SAAS,CAAC,EAAE,SAAA,EAAU,KACpB,OAAO,aAAA,CAAc;AAAA,MACnB,UAAA,EAAY,EAAE,IAAA,EAAM,SAAA,EAAW,SAAS,aAAA,EAAc;AAAA,MACtD,OAAA;AAAA,MACA,OAAA,EAAS,EAAE,KAAA,EAAO,WAAA,EAAa,WAAW,MAAA;AAAO,KAClD,CAAA;AAAA,IACH,gBAAA,EAAkB,CAAA;AAAA,IAClB,gBAAA;AAAA,IACA,MAAA,EAAQ,UAAA;AAAA,IACR,KAAA,EAAO,KAAA;AAAA,IACP,eAAA,EAAiB;AAAA,GAClB,CAAA;AAED,EAAA,MAAM,EAAE,aAAa,kBAAA,EAAoB,aAAA,EAAe,MAAM,SAAA,EAAW,OAAA,EAAS,OAAM,GAAI,KAAA;AAE5F,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,iBAAA,IAAqB,WAAA,IAAe,CAAC,kBAAA,EAAoB;AAC3D,MAAA,KAAK,aAAA,EAAc;AAAA,IACrB;AAAA,EACF,GAAG,CAAC,iBAAA,EAAmB,WAAA,EAAa,kBAAA,EAAoB,aAAa,CAAC,CAAA;AAEtE,EAAA,OAAO,EAAE,MAAM,WAAA,EAAa,kBAAA,EAAoB,eAAe,SAAA,EAAW,OAAA,EAAS,OAAO,mBAAA,EAAoB;AAChH;;;;;"}
@@ -2,7 +2,7 @@ import { useMastraClient } from '@mastra/react';
2
2
  import { useInfiniteQuery } from '@tanstack/react-query';
3
3
  import { useEffect } from 'react';
4
4
  import { useInView } from '../../../hooks/use-in-view.es.js';
5
- import { isUnsupportedObservabilityOperationError } from '../../../utils/query-utils.es.js';
5
+ import { isUnsupportedObservabilityOperationError, isObservabilityUnavailableError } from '../../../utils/query-utils.es.js';
6
6
 
7
7
  const LOGS_PER_PAGE = 20;
8
8
  const LOGS_REFETCH_INTERVAL_MS = 1e4;
@@ -26,7 +26,7 @@ function selectLogs(data) {
26
26
  return result;
27
27
  }
28
28
  function getLogsRefetchInterval(query) {
29
- if (isUnsupportedObservabilityOperationError(query.state.error, "logs")) {
29
+ if (isUnsupportedObservabilityOperationError(query.state.error, "logs") || isObservabilityUnavailableError(query.state.error)) {
30
30
  return false;
31
31
  }
32
32
  return LOGS_REFETCH_INTERVAL_MS;
@@ -1 +1 @@
1
- {"version":3,"file":"use-logs.es.js","sources":["../../../../src/domains/logs/hooks/use-logs.ts"],"sourcesContent":["import type { ListLogsArgs, ListLogsResponse } from '@mastra/core/storage';\nimport { useMastraClient } from '@mastra/react';\nimport { useInfiniteQuery } from '@tanstack/react-query';\nimport { useEffect } from 'react';\n\nimport type { LogRecord } from '../types';\nimport { useInView } from '@/hooks/use-in-view';\nimport { isUnsupportedObservabilityOperationError } from '@/lib/query-utils';\n\ninterface UseLogsReturn {\n data: LogRecord[] | undefined;\n hasNextPage: boolean;\n isFetchingNextPage: boolean;\n fetchNextPage: () => void;\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n setEndOfListElement: (node: HTMLDivElement | null) => void;\n}\n\nconst LOGS_PER_PAGE = 20;\nconst LOGS_REFETCH_INTERVAL_MS = 10000;\n\nexport interface LogsFilters {\n filters?: ListLogsArgs['filters'];\n}\n\nfunction getNextPageParam(lastPage: ListLogsResponse | undefined, _allPages: unknown, lastPageParam: number) {\n if (lastPage?.pagination?.hasMore) {\n return lastPageParam + 1;\n }\n return undefined;\n}\n\n/** Deduplicates logs across loaded pages. Offset-based pagination duplicates rows at the page\n * boundary whenever new logs are inserted between sequential `fetchNextPage` calls — without\n * this filter the duplicates produce duplicate React keys and chaotic virtualizer offsets.\n * Falls back to the full serialized record when `logId` is absent so logs that happen to\n * share `(timestamp, message, data)` but differ in other fields aren't collapsed. */\nfunction selectLogs(data: { pages: ListLogsResponse[] }) {\n const seen = new Set<string>();\n const result = [];\n for (const page of data.pages) {\n for (const log of page.logs ?? []) {\n const key = log.logId ?? JSON.stringify(log);\n if (seen.has(key)) continue;\n seen.add(key);\n result.push(log);\n }\n }\n return result;\n}\n\nexport function getLogsRefetchInterval(query: { state: { error: unknown } }) {\n if (isUnsupportedObservabilityOperationError(query.state.error, 'logs')) {\n return false;\n }\n return LOGS_REFETCH_INTERVAL_MS;\n}\n\nexport const useLogs: (props?: LogsFilters) => UseLogsReturn = ({ filters }: LogsFilters = {}) => {\n const client = useMastraClient();\n const { inView: isEndOfListInView, setRef: setEndOfListElement } = useInView();\n\n const query = useInfiniteQuery<ListLogsResponse, Error, ReturnType<typeof selectLogs>, readonly unknown[], number>({\n queryKey: ['logs', filters],\n queryFn: ({ pageParam }) =>\n client.listLogsVNext({\n pagination: { page: pageParam, perPage: LOGS_PER_PAGE },\n filters,\n orderBy: { field: 'timestamp', direction: 'DESC' },\n }),\n initialPageParam: 0,\n getNextPageParam,\n select: selectLogs,\n retry: false,\n refetchInterval: getLogsRefetchInterval,\n });\n\n const { hasNextPage, isFetchingNextPage, fetchNextPage, data, isLoading, isError, error } = query;\n\n useEffect(() => {\n if (isEndOfListInView && hasNextPage && !isFetchingNextPage) {\n void fetchNextPage();\n }\n }, [isEndOfListInView, hasNextPage, isFetchingNextPage, fetchNextPage]);\n\n return { data, hasNextPage, isFetchingNextPage, fetchNextPage, isLoading, isError, error, setEndOfListElement };\n};\n"],"names":[],"mappings":";;;;;;AAoBA,MAAM,aAAA,GAAgB,EAAA;AACtB,MAAM,wBAAA,GAA2B,GAAA;AAMjC,SAAS,gBAAA,CAAiB,QAAA,EAAwC,SAAA,EAAoB,aAAA,EAAuB;AAC3G,EAAA,IAAI,QAAA,EAAU,YAAY,OAAA,EAAS;AACjC,IAAA,OAAO,aAAA,GAAgB,CAAA;AAAA,EACzB;AACA,EAAA,OAAO,MAAA;AACT;AAOA,SAAS,WAAW,IAAA,EAAqC;AACvD,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,MAAM,SAAS,EAAC;AAChB,EAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,KAAA,EAAO;AAC7B,IAAA,KAAA,MAAW,GAAA,IAAO,IAAA,CAAK,IAAA,IAAQ,EAAC,EAAG;AACjC,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,KAAA,IAAS,IAAA,CAAK,UAAU,GAAG,CAAA;AAC3C,MAAA,IAAI,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,EAAG;AACnB,MAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AACZ,MAAA,MAAA,CAAO,KAAK,GAAG,CAAA;AAAA,IACjB;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,uBAAuB,KAAA,EAAsC;AAC3E,EAAA,IAAI,wCAAA,CAAyC,KAAA,CAAM,KAAA,CAAM,KAAA,EAAO,MAAM,CAAA,EAAG;AACvE,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,OAAO,wBAAA;AACT;AAEO,MAAM,UAAkD,CAAC,EAAE,OAAA,EAAQ,GAAiB,EAAC,KAAM;AAChG,EAAA,MAAM,SAAS,eAAA,EAAgB;AAC/B,EAAA,MAAM,EAAE,MAAA,EAAQ,iBAAA,EAAmB,MAAA,EAAQ,mBAAA,KAAwB,SAAA,EAAU;AAE7E,EAAA,MAAM,QAAQ,gBAAA,CAAqG;AAAA,IACjH,QAAA,EAAU,CAAC,MAAA,EAAQ,OAAO,CAAA;AAAA,IAC1B,SAAS,CAAC,EAAE,SAAA,EAAU,KACpB,OAAO,aAAA,CAAc;AAAA,MACnB,UAAA,EAAY,EAAE,IAAA,EAAM,SAAA,EAAW,SAAS,aAAA,EAAc;AAAA,MACtD,OAAA;AAAA,MACA,OAAA,EAAS,EAAE,KAAA,EAAO,WAAA,EAAa,WAAW,MAAA;AAAO,KAClD,CAAA;AAAA,IACH,gBAAA,EAAkB,CAAA;AAAA,IAClB,gBAAA;AAAA,IACA,MAAA,EAAQ,UAAA;AAAA,IACR,KAAA,EAAO,KAAA;AAAA,IACP,eAAA,EAAiB;AAAA,GAClB,CAAA;AAED,EAAA,MAAM,EAAE,aAAa,kBAAA,EAAoB,aAAA,EAAe,MAAM,SAAA,EAAW,OAAA,EAAS,OAAM,GAAI,KAAA;AAE5F,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,iBAAA,IAAqB,WAAA,IAAe,CAAC,kBAAA,EAAoB;AAC3D,MAAA,KAAK,aAAA,EAAc;AAAA,IACrB;AAAA,EACF,GAAG,CAAC,iBAAA,EAAmB,WAAA,EAAa,kBAAA,EAAoB,aAAa,CAAC,CAAA;AAEtE,EAAA,OAAO,EAAE,MAAM,WAAA,EAAa,kBAAA,EAAoB,eAAe,SAAA,EAAW,OAAA,EAAS,OAAO,mBAAA,EAAoB;AAChH;;;;"}
1
+ {"version":3,"file":"use-logs.es.js","sources":["../../../../src/domains/logs/hooks/use-logs.ts"],"sourcesContent":["import type { ListLogsArgs, ListLogsResponse } from '@mastra/core/storage';\nimport { useMastraClient } from '@mastra/react';\nimport { useInfiniteQuery } from '@tanstack/react-query';\nimport { useEffect } from 'react';\n\nimport type { LogRecord } from '../types';\nimport { useInView } from '@/hooks/use-in-view';\nimport { isObservabilityUnavailableError, isUnsupportedObservabilityOperationError } from '@/lib/query-utils';\n\ninterface UseLogsReturn {\n data: LogRecord[] | undefined;\n hasNextPage: boolean;\n isFetchingNextPage: boolean;\n fetchNextPage: () => void;\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n setEndOfListElement: (node: HTMLDivElement | null) => void;\n}\n\nconst LOGS_PER_PAGE = 20;\nconst LOGS_REFETCH_INTERVAL_MS = 10000;\n\nexport interface LogsFilters {\n filters?: ListLogsArgs['filters'];\n}\n\nfunction getNextPageParam(lastPage: ListLogsResponse | undefined, _allPages: unknown, lastPageParam: number) {\n if (lastPage?.pagination?.hasMore) {\n return lastPageParam + 1;\n }\n return undefined;\n}\n\n/** Deduplicates logs across loaded pages. Offset-based pagination duplicates rows at the page\n * boundary whenever new logs are inserted between sequential `fetchNextPage` calls — without\n * this filter the duplicates produce duplicate React keys and chaotic virtualizer offsets.\n * Falls back to the full serialized record when `logId` is absent so logs that happen to\n * share `(timestamp, message, data)` but differ in other fields aren't collapsed. */\nfunction selectLogs(data: { pages: ListLogsResponse[] }) {\n const seen = new Set<string>();\n const result = [];\n for (const page of data.pages) {\n for (const log of page.logs ?? []) {\n const key = log.logId ?? JSON.stringify(log);\n if (seen.has(key)) continue;\n seen.add(key);\n result.push(log);\n }\n }\n return result;\n}\n\nexport function getLogsRefetchInterval(query: { state: { error: unknown } }) {\n if (\n isUnsupportedObservabilityOperationError(query.state.error, 'logs') ||\n isObservabilityUnavailableError(query.state.error)\n ) {\n return false;\n }\n return LOGS_REFETCH_INTERVAL_MS;\n}\n\nexport const useLogs: (props?: LogsFilters) => UseLogsReturn = ({ filters }: LogsFilters = {}) => {\n const client = useMastraClient();\n const { inView: isEndOfListInView, setRef: setEndOfListElement } = useInView();\n\n const query = useInfiniteQuery<ListLogsResponse, Error, ReturnType<typeof selectLogs>, readonly unknown[], number>({\n queryKey: ['logs', filters],\n queryFn: ({ pageParam }) =>\n client.listLogsVNext({\n pagination: { page: pageParam, perPage: LOGS_PER_PAGE },\n filters,\n orderBy: { field: 'timestamp', direction: 'DESC' },\n }),\n initialPageParam: 0,\n getNextPageParam,\n select: selectLogs,\n retry: false,\n refetchInterval: getLogsRefetchInterval,\n });\n\n const { hasNextPage, isFetchingNextPage, fetchNextPage, data, isLoading, isError, error } = query;\n\n useEffect(() => {\n if (isEndOfListInView && hasNextPage && !isFetchingNextPage) {\n void fetchNextPage();\n }\n }, [isEndOfListInView, hasNextPage, isFetchingNextPage, fetchNextPage]);\n\n return { data, hasNextPage, isFetchingNextPage, fetchNextPage, isLoading, isError, error, setEndOfListElement };\n};\n"],"names":[],"mappings":";;;;;;AAoBA,MAAM,aAAA,GAAgB,EAAA;AACtB,MAAM,wBAAA,GAA2B,GAAA;AAMjC,SAAS,gBAAA,CAAiB,QAAA,EAAwC,SAAA,EAAoB,aAAA,EAAuB;AAC3G,EAAA,IAAI,QAAA,EAAU,YAAY,OAAA,EAAS;AACjC,IAAA,OAAO,aAAA,GAAgB,CAAA;AAAA,EACzB;AACA,EAAA,OAAO,MAAA;AACT;AAOA,SAAS,WAAW,IAAA,EAAqC;AACvD,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,MAAM,SAAS,EAAC;AAChB,EAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,KAAA,EAAO;AAC7B,IAAA,KAAA,MAAW,GAAA,IAAO,IAAA,CAAK,IAAA,IAAQ,EAAC,EAAG;AACjC,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,KAAA,IAAS,IAAA,CAAK,UAAU,GAAG,CAAA;AAC3C,MAAA,IAAI,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,EAAG;AACnB,MAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AACZ,MAAA,MAAA,CAAO,KAAK,GAAG,CAAA;AAAA,IACjB;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,uBAAuB,KAAA,EAAsC;AAC3E,EAAA,IACE,wCAAA,CAAyC,KAAA,CAAM,KAAA,CAAM,KAAA,EAAO,MAAM,KAClE,+BAAA,CAAgC,KAAA,CAAM,KAAA,CAAM,KAAK,CAAA,EACjD;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,OAAO,wBAAA;AACT;AAEO,MAAM,UAAkD,CAAC,EAAE,OAAA,EAAQ,GAAiB,EAAC,KAAM;AAChG,EAAA,MAAM,SAAS,eAAA,EAAgB;AAC/B,EAAA,MAAM,EAAE,MAAA,EAAQ,iBAAA,EAAmB,MAAA,EAAQ,mBAAA,KAAwB,SAAA,EAAU;AAE7E,EAAA,MAAM,QAAQ,gBAAA,CAAqG;AAAA,IACjH,QAAA,EAAU,CAAC,MAAA,EAAQ,OAAO,CAAA;AAAA,IAC1B,SAAS,CAAC,EAAE,SAAA,EAAU,KACpB,OAAO,aAAA,CAAc;AAAA,MACnB,UAAA,EAAY,EAAE,IAAA,EAAM,SAAA,EAAW,SAAS,aAAA,EAAc;AAAA,MACtD,OAAA;AAAA,MACA,OAAA,EAAS,EAAE,KAAA,EAAO,WAAA,EAAa,WAAW,MAAA;AAAO,KAClD,CAAA;AAAA,IACH,gBAAA,EAAkB,CAAA;AAAA,IAClB,gBAAA;AAAA,IACA,MAAA,EAAQ,UAAA;AAAA,IACR,KAAA,EAAO,KAAA;AAAA,IACP,eAAA,EAAiB;AAAA,GAClB,CAAA;AAED,EAAA,MAAM,EAAE,aAAa,kBAAA,EAAoB,aAAA,EAAe,MAAM,SAAA,EAAW,OAAA,EAAS,OAAM,GAAI,KAAA;AAE5F,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,iBAAA,IAAqB,WAAA,IAAe,CAAC,kBAAA,EAAoB;AAC3D,MAAA,KAAK,aAAA,EAAc;AAAA,IACrB;AAAA,EACF,GAAG,CAAC,iBAAA,EAAmB,WAAA,EAAa,kBAAA,EAAoB,aAAa,CAAC,CAAA;AAEtE,EAAA,OAAO,EAAE,MAAM,WAAA,EAAa,kBAAA,EAAoB,eAAe,SAAA,EAAW,OAAA,EAAS,OAAO,mBAAA,EAAoB;AAChH;;;;"}
@@ -32,6 +32,8 @@ export type UnsupportedObservabilityOperation = 'logs' | 'metrics' | 'scores' |
32
32
  * instead, like the trace branch support check above.
33
33
  */
34
34
  export declare function isUnsupportedObservabilityOperationError(error: unknown, operation: UnsupportedObservabilityOperation): boolean;
35
+ /** Check if an error came from a server whose observability storage domain is disabled. */
36
+ export declare function isObservabilityUnavailableError(error: unknown): boolean;
35
37
  /**
36
38
  * Check if error has a status code that shouldn't be retried.
37
39
  * Used to prevent retrying client errors that won't resolve.
@@ -39,7 +41,7 @@ export declare function isUnsupportedObservabilityOperationError(error: unknown,
39
41
  export declare function isNonRetryableError(error: unknown): boolean;
40
42
  /**
41
43
  * Default retry function for TanStack Query.
42
- * Does not retry 4xx client errors (400, 401, 403, 404).
44
+ * Does not retry 4xx client errors (400, 401, 403, 404) or 501 capability gaps.
43
45
  * Retries other errors up to 3 times.
44
46
  */
45
47
  export declare function shouldRetryQuery(failureCount: number, error: unknown): boolean;
package/dist/style.css CHANGED
@@ -1,4 +1,4 @@
1
- /*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */
1
+ /*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
2
2
  @layer properties {
3
3
  @supports (((-webkit-hyphens: none)) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color: rgb(from red r g b)))) {
4
4
  *, :before, :after, ::backdrop {
@@ -73,6 +73,8 @@
73
73
  --tw-duration: initial;
74
74
  --tw-ease: initial;
75
75
  --tw-content: "";
76
+ --tw-scrollbar-thumb: #0000;
77
+ --tw-scrollbar-track: #0000;
76
78
  --tw-mask-linear: linear-gradient(#fff, #fff);
77
79
  --tw-mask-radial: linear-gradient(#fff, #fff);
78
80
  --tw-mask-conic: linear-gradient(#fff, #fff);
@@ -145,7 +147,7 @@
145
147
  --color-gray-100: oklch(96.7% .003 264.542);
146
148
  --color-gray-300: oklch(87.2% .01 258.338);
147
149
  --color-gray-700: oklch(37.3% .034 259.733);
148
- --color-neutral-500: oklch(55.6% 0 0);
150
+ --color-neutral-500: oklch(55.6% 0 none);
149
151
  --color-black: #000;
150
152
  --color-white: #fff;
151
153
  --breakpoint-lg: 64rem;
@@ -350,7 +352,7 @@
350
352
  -webkit-text-size-adjust: 100%;
351
353
  tab-size: 4;
352
354
  line-height: 1.5;
353
- font-family: var(--default-font-family, ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");
355
+ font-family: var(--default-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");
354
356
  font-feature-settings: var(--default-font-feature-settings, normal);
355
357
  font-variation-settings: var(--default-font-variation-settings, normal);
356
358
  -webkit-tap-highlight-color: transparent;
@@ -416,7 +418,7 @@
416
418
  border-collapse: collapse;
417
419
  }
418
420
 
419
- :-moz-focusring {
421
+ :-moz-focusring:where(:not(iframe)) {
420
422
  outline: auto;
421
423
  }
422
424
 
@@ -2317,7 +2319,6 @@
2317
2319
  .-translate-y-px {
2318
2320
  --tw-translate-y: calc(var(--spacing-px) * -1);
2319
2321
  translate: var(--tw-translate-x) var(--tw-translate-y);
2320
- translate: var(--tw-translate-x) var(--tw-translate-y);
2321
2322
  }
2322
2323
 
2323
2324
  .scale-50 {
@@ -2435,6 +2436,10 @@
2435
2436
  resize: vertical;
2436
2437
  }
2437
2438
 
2439
+ .\[scrollbar-width\:none\] {
2440
+ scrollbar-width: none;
2441
+ }
2442
+
2438
2443
  .list-decimal {
2439
2444
  list-style-type: decimal;
2440
2445
  }
@@ -4854,7 +4859,7 @@
4854
4859
  text-wrap: wrap;
4855
4860
  }
4856
4861
 
4857
- .break-words, .wrap-break-word, .wrap-break-word {
4862
+ .break-words, .wrap-break-word {
4858
4863
  overflow-wrap: break-word;
4859
4864
  }
4860
4865
 
@@ -5659,10 +5664,6 @@
5659
5664
  overflow-clip-margin: .75rem;
5660
5665
  }
5661
5666
 
5662
- .\[scrollbar-width\:none\] {
5663
- scrollbar-width: none;
5664
- }
5665
-
5666
5667
  .\[stroke-dasharray\:28\] {
5667
5668
  stroke-dasharray: 28;
5668
5669
  }
@@ -6231,7 +6232,6 @@
6231
6232
  }
6232
6233
 
6233
6234
  .after\:-left-px:after {
6234
- content: var(--tw-content);
6235
6235
  content: var(--tw-content);
6236
6236
  left: -1px;
6237
6237
  left: calc(var(--spacing-px) * -1);
@@ -6243,7 +6243,6 @@
6243
6243
  }
6244
6244
 
6245
6245
  .after\:h-px:after {
6246
- content: var(--tw-content);
6247
6246
  content: var(--tw-content);
6248
6247
  height: 1px;
6249
6248
  height: var(--spacing-px);
@@ -6255,7 +6254,6 @@
6255
6254
  }
6256
6255
 
6257
6256
  .after\:w-px:after {
6258
- content: var(--tw-content);
6259
6257
  content: var(--tw-content);
6260
6258
  width: 1px;
6261
6259
  width: var(--spacing-px);
@@ -7109,6 +7107,16 @@
7109
7107
  opacity: 1;
7110
7108
  }
7111
7109
 
7110
+ .data-autoscrolling\:scrollbar-thumb-transparent[data-autoscrolling] {
7111
+ --tw-scrollbar-thumb: transparent;
7112
+ scrollbar-color: var(--tw-scrollbar-thumb) var(--tw-scrollbar-track);
7113
+ }
7114
+
7115
+ .data-autoscrolling\:scrollbar-track-transparent[data-autoscrolling] {
7116
+ --tw-scrollbar-track: transparent;
7117
+ scrollbar-color: var(--tw-scrollbar-thumb) var(--tw-scrollbar-track);
7118
+ }
7119
+
7112
7120
  .data-disabled\:pointer-events-none[data-disabled] {
7113
7121
  pointer-events: none;
7114
7122
  }
@@ -8377,7 +8385,6 @@
8377
8385
  }
8378
8386
 
8379
8387
  .\[\&_\.data-list-row\]\:after\:-bottom-px .data-list-row:after {
8380
- content: var(--tw-content);
8381
8388
  content: var(--tw-content);
8382
8389
  bottom: -1px;
8383
8390
  bottom: calc(var(--spacing-px) * -1);
@@ -8389,7 +8396,6 @@
8389
8396
  }
8390
8397
 
8391
8398
  .\[\&_\.data-list-row\]\:after\:h-px .data-list-row:after {
8392
- content: var(--tw-content);
8393
8399
  content: var(--tw-content);
8394
8400
  height: 1px;
8395
8401
  height: var(--spacing-px);
@@ -8490,7 +8496,6 @@
8490
8496
  }
8491
8497
 
8492
8498
  .\[\&_\.data-list-top\>\*\:not\(\:first-child\)\]\:before\:w-px .data-list-top > :not(:first-child):before {
8493
- content: var(--tw-content);
8494
8499
  content: var(--tw-content);
8495
8500
  width: 1px;
8496
8501
  width: var(--spacing-px);
@@ -10253,6 +10258,18 @@ html.light {
10253
10258
  initial-value: "";
10254
10259
  }
10255
10260
 
10261
+ @property --tw-scrollbar-thumb {
10262
+ syntax: "<color>";
10263
+ inherits: false;
10264
+ initial-value: #0000;
10265
+ }
10266
+
10267
+ @property --tw-scrollbar-track {
10268
+ syntax: "<color>";
10269
+ inherits: false;
10270
+ initial-value: #0000;
10271
+ }
10272
+
10256
10273
  @property --tw-mask-linear {
10257
10274
  syntax: "*";
10258
10275
  inherits: false;
@@ -27,6 +27,7 @@ exports.is403ForbiddenError = utils_queryUtils.is403ForbiddenError;
27
27
  exports.is404NotFoundError = utils_queryUtils.is404NotFoundError;
28
28
  exports.isBranchesNotSupportedError = utils_queryUtils.isBranchesNotSupportedError;
29
29
  exports.isNonRetryableError = utils_queryUtils.isNonRetryableError;
30
+ exports.isObservabilityUnavailableError = utils_queryUtils.isObservabilityUnavailableError;
30
31
  exports.isUnsupportedObservabilityOperationError = utils_queryUtils.isUnsupportedObservabilityOperationError;
31
32
  exports.shouldRetryQuery = utils_queryUtils.shouldRetryQuery;
32
33
  exports.parseError = parseError;
@@ -1 +1 @@
1
- {"version":3,"file":"errors.cjs.js","sources":["../../src/lib/errors.ts"],"sourcesContent":["const errorFallback = 'Something went wrong while fetching the data.';\nexport const parseError = (error: Error) => {\n try {\n const httpErrorPattern = /^HTTP error! status:\\s*\\d+\\s*- \\s*/;\n const errorMessage = error?.message.replace(httpErrorPattern, '');\n const jsonError = JSON.parse(errorMessage || '{}');\n return {\n error: jsonError?.error || errorFallback,\n stack: jsonError?.stack || error?.stack,\n };\n } catch {\n return {\n error: error?.message || errorFallback,\n stack: undefined,\n };\n }\n};\n"],"names":[],"mappings":";;;;;;AAAA,MAAM,aAAA,GAAgB,+CAAA;AACf,MAAM,UAAA,GAAa,CAAC,KAAA,KAAiB;AAC1C,EAAA,IAAI;AACF,IAAA,MAAM,gBAAA,GAAmB,oCAAA;AACzB,IAAA,MAAM,YAAA,GAAe,KAAA,EAAO,OAAA,CAAQ,OAAA,CAAQ,kBAAkB,EAAE,CAAA;AAChE,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,YAAA,IAAgB,IAAI,CAAA;AACjD,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,WAAW,KAAA,IAAS,aAAA;AAAA,MAC3B,KAAA,EAAO,SAAA,EAAW,KAAA,IAAS,KAAA,EAAO;AAAA,KACpC;AAAA,EACF,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,OAAO,OAAA,IAAW,aAAA;AAAA,MACzB,KAAA,EAAO;AAAA,KACT;AAAA,EACF;AACF;;;;;;;;;;;"}
1
+ {"version":3,"file":"errors.cjs.js","sources":["../../src/lib/errors.ts"],"sourcesContent":["const errorFallback = 'Something went wrong while fetching the data.';\nexport const parseError = (error: Error) => {\n try {\n const httpErrorPattern = /^HTTP error! status:\\s*\\d+\\s*- \\s*/;\n const errorMessage = error?.message.replace(httpErrorPattern, '');\n const jsonError = JSON.parse(errorMessage || '{}');\n return {\n error: jsonError?.error || errorFallback,\n stack: jsonError?.stack || error?.stack,\n };\n } catch {\n return {\n error: error?.message || errorFallback,\n stack: undefined,\n };\n }\n};\n"],"names":[],"mappings":";;;;;;AAAA,MAAM,aAAA,GAAgB,+CAAA;AACf,MAAM,UAAA,GAAa,CAAC,KAAA,KAAiB;AAC1C,EAAA,IAAI;AACF,IAAA,MAAM,gBAAA,GAAmB,oCAAA;AACzB,IAAA,MAAM,YAAA,GAAe,KAAA,EAAO,OAAA,CAAQ,OAAA,CAAQ,kBAAkB,EAAE,CAAA;AAChE,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,YAAA,IAAgB,IAAI,CAAA;AACjD,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,WAAW,KAAA,IAAS,aAAA;AAAA,MAC3B,KAAA,EAAO,SAAA,EAAW,KAAA,IAAS,KAAA,EAAO;AAAA,KACpC;AAAA,EACF,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,OAAO,OAAA,IAAW,aAAA;AAAA,MACzB,KAAA,EAAO;AAAA,KACT;AAAA,EACF;AACF;;;;;;;;;;;;"}
@@ -1,4 +1,4 @@
1
- export { is401UnauthorizedError, is403ForbiddenError, is404NotFoundError, isBranchesNotSupportedError, isNonRetryableError, isUnsupportedObservabilityOperationError, shouldRetryQuery } from './query-utils.es.js';
1
+ export { is401UnauthorizedError, is403ForbiddenError, is404NotFoundError, isBranchesNotSupportedError, isNonRetryableError, isObservabilityUnavailableError, isUnsupportedObservabilityOperationError, shouldRetryQuery } from './query-utils.es.js';
2
2
 
3
3
  const errorFallback = "Something went wrong while fetching the data.";
4
4
  const parseError = (error) => {
@@ -2,7 +2,7 @@
2
2
 
3
3
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
4
 
5
- const HTTP_NO_RETRY_STATUSES = [400, 401, 403, 404];
5
+ const HTTP_NO_RETRY_STATUSES = [400, 401, 403, 404, 501];
6
6
  function is401UnauthorizedError(error) {
7
7
  if (!error || typeof error !== "object") return false;
8
8
  if ("status" in error && error.status === 401) {
@@ -63,6 +63,16 @@ function isUnsupportedObservabilityOperationError(error, operation) {
63
63
  if (typeof message !== "string") return false;
64
64
  return message.includes(`does not support listing ${operation}`);
65
65
  }
66
+ const OBSERVABILITY_UNAVAILABLE_MESSAGES = [
67
+ "Observability storage domain is not available",
68
+ "Scores storage domain is not available"
69
+ ];
70
+ function isObservabilityUnavailableError(error) {
71
+ if (!error || typeof error !== "object" || !("message" in error)) return false;
72
+ const message = error.message;
73
+ if (typeof message !== "string") return false;
74
+ return OBSERVABILITY_UNAVAILABLE_MESSAGES.some((m) => message.includes(m));
75
+ }
66
76
  function isNonRetryableError(error) {
67
77
  if (!error || typeof error !== "object") return false;
68
78
  if ("status" in error) {
@@ -93,6 +103,7 @@ exports.is403ForbiddenError = is403ForbiddenError;
93
103
  exports.is404NotFoundError = is404NotFoundError;
94
104
  exports.isBranchesNotSupportedError = isBranchesNotSupportedError;
95
105
  exports.isNonRetryableError = isNonRetryableError;
106
+ exports.isObservabilityUnavailableError = isObservabilityUnavailableError;
96
107
  exports.isUnsupportedObservabilityOperationError = isUnsupportedObservabilityOperationError;
97
108
  exports.shouldRetryQuery = shouldRetryQuery;
98
109
  //# sourceMappingURL=query-utils.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"query-utils.cjs.js","sources":["../../src/lib/query-utils.ts"],"sourcesContent":["/**\n * HTTP status codes that should not be retried.\n * - 400: Bad Request (client error, won't change)\n * - 401: Unauthorized (needs re-auth, not retry)\n * - 403: Forbidden (RBAC permission denied)\n * - 404: Not Found (resource doesn't exist)\n */\nconst HTTP_NO_RETRY_STATUSES = [400, 401, 403, 404];\n\n/**\n * Check if error is a 401 Unauthorized response.\n * Indicates the user's session has expired or token is invalid.\n * Handles both direct status property and client-js error message format.\n */\nexport function is401UnauthorizedError(error: unknown): boolean {\n if (!error || typeof error !== 'object') return false;\n\n // Check for status property (direct response or wrapped)\n if ('status' in error && (error as { status: number }).status === 401) {\n return true;\n }\n\n // Check for statusCode property (some HTTP clients)\n if ('statusCode' in error && (error as { statusCode: number }).statusCode === 401) {\n return true;\n }\n\n // Check error message for client-js pattern: \"HTTP error! status: 401\"\n if ('message' in error) {\n const message = (error as { message: unknown }).message;\n if (typeof message === 'string') {\n return /\\bstatus:\\s*401\\b/.test(message);\n }\n }\n\n return false;\n}\n\n/**\n * Check if error is a 403 Forbidden response.\n * Handles both direct status property and client-js error message format.\n */\nexport function is403ForbiddenError(error: unknown): boolean {\n if (!error || typeof error !== 'object') return false;\n\n // Check for status property (direct response or wrapped)\n if ('status' in error && (error as { status: number }).status === 403) {\n return true;\n }\n\n // Check for statusCode property (some HTTP clients)\n if ('statusCode' in error && (error as { statusCode: number }).statusCode === 403) {\n return true;\n }\n\n // Check error message for client-js pattern: \"HTTP error! status: 403\"\n if ('message' in error) {\n const message = (error as { message: unknown }).message;\n if (typeof message === 'string') {\n return /\\bstatus:\\s*403\\b/.test(message);\n }\n }\n\n return false;\n}\n\n/**\n * Check if error is a 404 Not Found response.\n * Handles both direct status property and client-js error message format.\n */\nexport function is404NotFoundError(error: unknown): boolean {\n if (!error || typeof error !== 'object') return false;\n\n if ('status' in error && (error as { status: number }).status === 404) {\n return true;\n }\n\n if ('statusCode' in error && (error as { statusCode: number }).statusCode === 404) {\n return true;\n }\n\n if ('message' in error) {\n const message = (error as { message: unknown }).message;\n if (typeof message === 'string') {\n return /\\bstatus:\\s*404\\b/.test(message);\n }\n }\n\n return false;\n}\n\n/**\n * Check if an error came from a storage provider that does not implement `listBranches`.\n *\n * The server's `handleError` strips the original MastraError's `code`/`id` before serializing,\n * so we can't match on the ID `OBSERVABILITY_STORAGE_LIST_BRANCHES_NOT_IMPLEMENTED` directly —\n * we match on the message text from `core/.../observability/base.ts` instead.\n */\nexport function isBranchesNotSupportedError(error: unknown): boolean {\n if (!error || typeof error !== 'object' || !('message' in error)) return false;\n const message = (error as { message: unknown }).message;\n if (typeof message !== 'string') return false;\n return message.includes('does not support listing trace branches');\n}\n\nexport type UnsupportedObservabilityOperation = 'logs' | 'metrics' | 'scores' | 'feedback';\n\n/**\n * Check if an error came from an observability storage provider that does not\n * implement a list operation. These are capability gaps, not transient failures.\n *\n * The server serializes these as plain HTTP errors, so the original MastraError\n * ID is not available in the browser. Match the stable base-storage message text\n * instead, like the trace branch support check above.\n */\nexport function isUnsupportedObservabilityOperationError(\n error: unknown,\n operation: UnsupportedObservabilityOperation,\n): boolean {\n if (!error || typeof error !== 'object' || !('message' in error)) return false;\n const message = (error as { message: unknown }).message;\n if (typeof message !== 'string') return false;\n return message.includes(`does not support listing ${operation}`);\n}\n\n/**\n * Check if error has a status code that shouldn't be retried.\n * Used to prevent retrying client errors that won't resolve.\n */\nexport function isNonRetryableError(error: unknown): boolean {\n if (!error || typeof error !== 'object') return false;\n\n // Check for status property\n if ('status' in error) {\n const status = (error as { status: number }).status;\n return HTTP_NO_RETRY_STATUSES.includes(status);\n }\n\n // Check for statusCode property\n if ('statusCode' in error) {\n const statusCode = (error as { statusCode: number }).statusCode;\n return HTTP_NO_RETRY_STATUSES.includes(statusCode);\n }\n\n // Check error message for client-js pattern\n if ('message' in error) {\n const message = (error as { message: unknown }).message;\n if (typeof message === 'string') {\n return HTTP_NO_RETRY_STATUSES.some(code => new RegExp(`\\\\bstatus:\\\\s*${code}\\\\b`).test(message));\n }\n }\n\n return false;\n}\n\n/**\n * Default retry function for TanStack Query.\n * Does not retry 4xx client errors (400, 401, 403, 404).\n * Retries other errors up to 3 times.\n */\nexport function shouldRetryQuery(failureCount: number, error: unknown): boolean {\n // Don't retry client errors - they won't resolve with retries\n if (isNonRetryableError(error)) {\n return false;\n }\n // Default: retry up to 3 times for transient errors\n return failureCount < 3;\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"query-utils.cjs.js","sources":["../../src/lib/query-utils.ts"],"sourcesContent":["/**\n * HTTP status codes that should not be retried.\n * - 400: Bad Request (client error, won't change)\n * - 401: Unauthorized (needs re-auth, not retry)\n * - 403: Forbidden (RBAC permission denied)\n * - 404: Not Found (resource doesn't exist)\n * - 501: Not Implemented (capability gap, e.g. disabled storage domain, won't change)\n */\nconst HTTP_NO_RETRY_STATUSES = [400, 401, 403, 404, 501];\n\n/**\n * Check if error is a 401 Unauthorized response.\n * Indicates the user's session has expired or token is invalid.\n * Handles both direct status property and client-js error message format.\n */\nexport function is401UnauthorizedError(error: unknown): boolean {\n if (!error || typeof error !== 'object') return false;\n\n // Check for status property (direct response or wrapped)\n if ('status' in error && (error as { status: number }).status === 401) {\n return true;\n }\n\n // Check for statusCode property (some HTTP clients)\n if ('statusCode' in error && (error as { statusCode: number }).statusCode === 401) {\n return true;\n }\n\n // Check error message for client-js pattern: \"HTTP error! status: 401\"\n if ('message' in error) {\n const message = (error as { message: unknown }).message;\n if (typeof message === 'string') {\n return /\\bstatus:\\s*401\\b/.test(message);\n }\n }\n\n return false;\n}\n\n/**\n * Check if error is a 403 Forbidden response.\n * Handles both direct status property and client-js error message format.\n */\nexport function is403ForbiddenError(error: unknown): boolean {\n if (!error || typeof error !== 'object') return false;\n\n // Check for status property (direct response or wrapped)\n if ('status' in error && (error as { status: number }).status === 403) {\n return true;\n }\n\n // Check for statusCode property (some HTTP clients)\n if ('statusCode' in error && (error as { statusCode: number }).statusCode === 403) {\n return true;\n }\n\n // Check error message for client-js pattern: \"HTTP error! status: 403\"\n if ('message' in error) {\n const message = (error as { message: unknown }).message;\n if (typeof message === 'string') {\n return /\\bstatus:\\s*403\\b/.test(message);\n }\n }\n\n return false;\n}\n\n/**\n * Check if error is a 404 Not Found response.\n * Handles both direct status property and client-js error message format.\n */\nexport function is404NotFoundError(error: unknown): boolean {\n if (!error || typeof error !== 'object') return false;\n\n if ('status' in error && (error as { status: number }).status === 404) {\n return true;\n }\n\n if ('statusCode' in error && (error as { statusCode: number }).statusCode === 404) {\n return true;\n }\n\n if ('message' in error) {\n const message = (error as { message: unknown }).message;\n if (typeof message === 'string') {\n return /\\bstatus:\\s*404\\b/.test(message);\n }\n }\n\n return false;\n}\n\n/**\n * Check if an error came from a storage provider that does not implement `listBranches`.\n *\n * The server's `handleError` strips the original MastraError's `code`/`id` before serializing,\n * so we can't match on the ID `OBSERVABILITY_STORAGE_LIST_BRANCHES_NOT_IMPLEMENTED` directly —\n * we match on the message text from `core/.../observability/base.ts` instead.\n */\nexport function isBranchesNotSupportedError(error: unknown): boolean {\n if (!error || typeof error !== 'object' || !('message' in error)) return false;\n const message = (error as { message: unknown }).message;\n if (typeof message !== 'string') return false;\n return message.includes('does not support listing trace branches');\n}\n\nexport type UnsupportedObservabilityOperation = 'logs' | 'metrics' | 'scores' | 'feedback';\n\n/**\n * Check if an error came from an observability storage provider that does not\n * implement a list operation. These are capability gaps, not transient failures.\n *\n * The server serializes these as plain HTTP errors, so the original MastraError\n * ID is not available in the browser. Match the stable base-storage message text\n * instead, like the trace branch support check above.\n */\nexport function isUnsupportedObservabilityOperationError(\n error: unknown,\n operation: UnsupportedObservabilityOperation,\n): boolean {\n if (!error || typeof error !== 'object' || !('message' in error)) return false;\n const message = (error as { message: unknown }).message;\n if (typeof message !== 'string') return false;\n return message.includes(`does not support listing ${operation}`);\n}\n\n// Span scores are backed by the separate `scores` domain. Explicit list: many\n// unrelated server domains share the \"storage domain is not available\" suffix.\nconst OBSERVABILITY_UNAVAILABLE_MESSAGES = [\n 'Observability storage domain is not available',\n 'Scores storage domain is not available',\n];\n\n/** Check if an error came from a server whose observability storage domain is disabled. */\nexport function isObservabilityUnavailableError(error: unknown): boolean {\n if (!error || typeof error !== 'object' || !('message' in error)) return false;\n const message = (error as { message: unknown }).message;\n if (typeof message !== 'string') return false;\n return OBSERVABILITY_UNAVAILABLE_MESSAGES.some(m => message.includes(m));\n}\n\n/**\n * Check if error has a status code that shouldn't be retried.\n * Used to prevent retrying client errors that won't resolve.\n */\nexport function isNonRetryableError(error: unknown): boolean {\n if (!error || typeof error !== 'object') return false;\n\n // Check for status property\n if ('status' in error) {\n const status = (error as { status: number }).status;\n return HTTP_NO_RETRY_STATUSES.includes(status);\n }\n\n // Check for statusCode property\n if ('statusCode' in error) {\n const statusCode = (error as { statusCode: number }).statusCode;\n return HTTP_NO_RETRY_STATUSES.includes(statusCode);\n }\n\n // Check error message for client-js pattern\n if ('message' in error) {\n const message = (error as { message: unknown }).message;\n if (typeof message === 'string') {\n return HTTP_NO_RETRY_STATUSES.some(code => new RegExp(`\\\\bstatus:\\\\s*${code}\\\\b`).test(message));\n }\n }\n\n return false;\n}\n\n/**\n * Default retry function for TanStack Query.\n * Does not retry 4xx client errors (400, 401, 403, 404) or 501 capability gaps.\n * Retries other errors up to 3 times.\n */\nexport function shouldRetryQuery(failureCount: number, error: unknown): boolean {\n // Don't retry client errors - they won't resolve with retries\n if (isNonRetryableError(error)) {\n return false;\n }\n // Default: retry up to 3 times for transient errors\n return failureCount < 3;\n}\n"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- const HTTP_NO_RETRY_STATUSES = [400, 401, 403, 404];
1
+ const HTTP_NO_RETRY_STATUSES = [400, 401, 403, 404, 501];
2
2
  function is401UnauthorizedError(error) {
3
3
  if (!error || typeof error !== "object") return false;
4
4
  if ("status" in error && error.status === 401) {
@@ -59,6 +59,16 @@ function isUnsupportedObservabilityOperationError(error, operation) {
59
59
  if (typeof message !== "string") return false;
60
60
  return message.includes(`does not support listing ${operation}`);
61
61
  }
62
+ const OBSERVABILITY_UNAVAILABLE_MESSAGES = [
63
+ "Observability storage domain is not available",
64
+ "Scores storage domain is not available"
65
+ ];
66
+ function isObservabilityUnavailableError(error) {
67
+ if (!error || typeof error !== "object" || !("message" in error)) return false;
68
+ const message = error.message;
69
+ if (typeof message !== "string") return false;
70
+ return OBSERVABILITY_UNAVAILABLE_MESSAGES.some((m) => message.includes(m));
71
+ }
62
72
  function isNonRetryableError(error) {
63
73
  if (!error || typeof error !== "object") return false;
64
74
  if ("status" in error) {
@@ -84,5 +94,5 @@ function shouldRetryQuery(failureCount, error) {
84
94
  return failureCount < 3;
85
95
  }
86
96
 
87
- export { is401UnauthorizedError, is403ForbiddenError, is404NotFoundError, isBranchesNotSupportedError, isNonRetryableError, isUnsupportedObservabilityOperationError, shouldRetryQuery };
97
+ export { is401UnauthorizedError, is403ForbiddenError, is404NotFoundError, isBranchesNotSupportedError, isNonRetryableError, isObservabilityUnavailableError, isUnsupportedObservabilityOperationError, shouldRetryQuery };
88
98
  //# sourceMappingURL=query-utils.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"query-utils.es.js","sources":["../../src/lib/query-utils.ts"],"sourcesContent":["/**\n * HTTP status codes that should not be retried.\n * - 400: Bad Request (client error, won't change)\n * - 401: Unauthorized (needs re-auth, not retry)\n * - 403: Forbidden (RBAC permission denied)\n * - 404: Not Found (resource doesn't exist)\n */\nconst HTTP_NO_RETRY_STATUSES = [400, 401, 403, 404];\n\n/**\n * Check if error is a 401 Unauthorized response.\n * Indicates the user's session has expired or token is invalid.\n * Handles both direct status property and client-js error message format.\n */\nexport function is401UnauthorizedError(error: unknown): boolean {\n if (!error || typeof error !== 'object') return false;\n\n // Check for status property (direct response or wrapped)\n if ('status' in error && (error as { status: number }).status === 401) {\n return true;\n }\n\n // Check for statusCode property (some HTTP clients)\n if ('statusCode' in error && (error as { statusCode: number }).statusCode === 401) {\n return true;\n }\n\n // Check error message for client-js pattern: \"HTTP error! status: 401\"\n if ('message' in error) {\n const message = (error as { message: unknown }).message;\n if (typeof message === 'string') {\n return /\\bstatus:\\s*401\\b/.test(message);\n }\n }\n\n return false;\n}\n\n/**\n * Check if error is a 403 Forbidden response.\n * Handles both direct status property and client-js error message format.\n */\nexport function is403ForbiddenError(error: unknown): boolean {\n if (!error || typeof error !== 'object') return false;\n\n // Check for status property (direct response or wrapped)\n if ('status' in error && (error as { status: number }).status === 403) {\n return true;\n }\n\n // Check for statusCode property (some HTTP clients)\n if ('statusCode' in error && (error as { statusCode: number }).statusCode === 403) {\n return true;\n }\n\n // Check error message for client-js pattern: \"HTTP error! status: 403\"\n if ('message' in error) {\n const message = (error as { message: unknown }).message;\n if (typeof message === 'string') {\n return /\\bstatus:\\s*403\\b/.test(message);\n }\n }\n\n return false;\n}\n\n/**\n * Check if error is a 404 Not Found response.\n * Handles both direct status property and client-js error message format.\n */\nexport function is404NotFoundError(error: unknown): boolean {\n if (!error || typeof error !== 'object') return false;\n\n if ('status' in error && (error as { status: number }).status === 404) {\n return true;\n }\n\n if ('statusCode' in error && (error as { statusCode: number }).statusCode === 404) {\n return true;\n }\n\n if ('message' in error) {\n const message = (error as { message: unknown }).message;\n if (typeof message === 'string') {\n return /\\bstatus:\\s*404\\b/.test(message);\n }\n }\n\n return false;\n}\n\n/**\n * Check if an error came from a storage provider that does not implement `listBranches`.\n *\n * The server's `handleError` strips the original MastraError's `code`/`id` before serializing,\n * so we can't match on the ID `OBSERVABILITY_STORAGE_LIST_BRANCHES_NOT_IMPLEMENTED` directly —\n * we match on the message text from `core/.../observability/base.ts` instead.\n */\nexport function isBranchesNotSupportedError(error: unknown): boolean {\n if (!error || typeof error !== 'object' || !('message' in error)) return false;\n const message = (error as { message: unknown }).message;\n if (typeof message !== 'string') return false;\n return message.includes('does not support listing trace branches');\n}\n\nexport type UnsupportedObservabilityOperation = 'logs' | 'metrics' | 'scores' | 'feedback';\n\n/**\n * Check if an error came from an observability storage provider that does not\n * implement a list operation. These are capability gaps, not transient failures.\n *\n * The server serializes these as plain HTTP errors, so the original MastraError\n * ID is not available in the browser. Match the stable base-storage message text\n * instead, like the trace branch support check above.\n */\nexport function isUnsupportedObservabilityOperationError(\n error: unknown,\n operation: UnsupportedObservabilityOperation,\n): boolean {\n if (!error || typeof error !== 'object' || !('message' in error)) return false;\n const message = (error as { message: unknown }).message;\n if (typeof message !== 'string') return false;\n return message.includes(`does not support listing ${operation}`);\n}\n\n/**\n * Check if error has a status code that shouldn't be retried.\n * Used to prevent retrying client errors that won't resolve.\n */\nexport function isNonRetryableError(error: unknown): boolean {\n if (!error || typeof error !== 'object') return false;\n\n // Check for status property\n if ('status' in error) {\n const status = (error as { status: number }).status;\n return HTTP_NO_RETRY_STATUSES.includes(status);\n }\n\n // Check for statusCode property\n if ('statusCode' in error) {\n const statusCode = (error as { statusCode: number }).statusCode;\n return HTTP_NO_RETRY_STATUSES.includes(statusCode);\n }\n\n // Check error message for client-js pattern\n if ('message' in error) {\n const message = (error as { message: unknown }).message;\n if (typeof message === 'string') {\n return HTTP_NO_RETRY_STATUSES.some(code => new RegExp(`\\\\bstatus:\\\\s*${code}\\\\b`).test(message));\n }\n }\n\n return false;\n}\n\n/**\n * Default retry function for TanStack Query.\n * Does not retry 4xx client errors (400, 401, 403, 404).\n * Retries other errors up to 3 times.\n */\nexport function shouldRetryQuery(failureCount: number, error: unknown): boolean {\n // Don't retry client errors - they won't resolve with retries\n if (isNonRetryableError(error)) {\n return false;\n }\n // Default: retry up to 3 times for transient errors\n return failureCount < 3;\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"query-utils.es.js","sources":["../../src/lib/query-utils.ts"],"sourcesContent":["/**\n * HTTP status codes that should not be retried.\n * - 400: Bad Request (client error, won't change)\n * - 401: Unauthorized (needs re-auth, not retry)\n * - 403: Forbidden (RBAC permission denied)\n * - 404: Not Found (resource doesn't exist)\n * - 501: Not Implemented (capability gap, e.g. disabled storage domain, won't change)\n */\nconst HTTP_NO_RETRY_STATUSES = [400, 401, 403, 404, 501];\n\n/**\n * Check if error is a 401 Unauthorized response.\n * Indicates the user's session has expired or token is invalid.\n * Handles both direct status property and client-js error message format.\n */\nexport function is401UnauthorizedError(error: unknown): boolean {\n if (!error || typeof error !== 'object') return false;\n\n // Check for status property (direct response or wrapped)\n if ('status' in error && (error as { status: number }).status === 401) {\n return true;\n }\n\n // Check for statusCode property (some HTTP clients)\n if ('statusCode' in error && (error as { statusCode: number }).statusCode === 401) {\n return true;\n }\n\n // Check error message for client-js pattern: \"HTTP error! status: 401\"\n if ('message' in error) {\n const message = (error as { message: unknown }).message;\n if (typeof message === 'string') {\n return /\\bstatus:\\s*401\\b/.test(message);\n }\n }\n\n return false;\n}\n\n/**\n * Check if error is a 403 Forbidden response.\n * Handles both direct status property and client-js error message format.\n */\nexport function is403ForbiddenError(error: unknown): boolean {\n if (!error || typeof error !== 'object') return false;\n\n // Check for status property (direct response or wrapped)\n if ('status' in error && (error as { status: number }).status === 403) {\n return true;\n }\n\n // Check for statusCode property (some HTTP clients)\n if ('statusCode' in error && (error as { statusCode: number }).statusCode === 403) {\n return true;\n }\n\n // Check error message for client-js pattern: \"HTTP error! status: 403\"\n if ('message' in error) {\n const message = (error as { message: unknown }).message;\n if (typeof message === 'string') {\n return /\\bstatus:\\s*403\\b/.test(message);\n }\n }\n\n return false;\n}\n\n/**\n * Check if error is a 404 Not Found response.\n * Handles both direct status property and client-js error message format.\n */\nexport function is404NotFoundError(error: unknown): boolean {\n if (!error || typeof error !== 'object') return false;\n\n if ('status' in error && (error as { status: number }).status === 404) {\n return true;\n }\n\n if ('statusCode' in error && (error as { statusCode: number }).statusCode === 404) {\n return true;\n }\n\n if ('message' in error) {\n const message = (error as { message: unknown }).message;\n if (typeof message === 'string') {\n return /\\bstatus:\\s*404\\b/.test(message);\n }\n }\n\n return false;\n}\n\n/**\n * Check if an error came from a storage provider that does not implement `listBranches`.\n *\n * The server's `handleError` strips the original MastraError's `code`/`id` before serializing,\n * so we can't match on the ID `OBSERVABILITY_STORAGE_LIST_BRANCHES_NOT_IMPLEMENTED` directly —\n * we match on the message text from `core/.../observability/base.ts` instead.\n */\nexport function isBranchesNotSupportedError(error: unknown): boolean {\n if (!error || typeof error !== 'object' || !('message' in error)) return false;\n const message = (error as { message: unknown }).message;\n if (typeof message !== 'string') return false;\n return message.includes('does not support listing trace branches');\n}\n\nexport type UnsupportedObservabilityOperation = 'logs' | 'metrics' | 'scores' | 'feedback';\n\n/**\n * Check if an error came from an observability storage provider that does not\n * implement a list operation. These are capability gaps, not transient failures.\n *\n * The server serializes these as plain HTTP errors, so the original MastraError\n * ID is not available in the browser. Match the stable base-storage message text\n * instead, like the trace branch support check above.\n */\nexport function isUnsupportedObservabilityOperationError(\n error: unknown,\n operation: UnsupportedObservabilityOperation,\n): boolean {\n if (!error || typeof error !== 'object' || !('message' in error)) return false;\n const message = (error as { message: unknown }).message;\n if (typeof message !== 'string') return false;\n return message.includes(`does not support listing ${operation}`);\n}\n\n// Span scores are backed by the separate `scores` domain. Explicit list: many\n// unrelated server domains share the \"storage domain is not available\" suffix.\nconst OBSERVABILITY_UNAVAILABLE_MESSAGES = [\n 'Observability storage domain is not available',\n 'Scores storage domain is not available',\n];\n\n/** Check if an error came from a server whose observability storage domain is disabled. */\nexport function isObservabilityUnavailableError(error: unknown): boolean {\n if (!error || typeof error !== 'object' || !('message' in error)) return false;\n const message = (error as { message: unknown }).message;\n if (typeof message !== 'string') return false;\n return OBSERVABILITY_UNAVAILABLE_MESSAGES.some(m => message.includes(m));\n}\n\n/**\n * Check if error has a status code that shouldn't be retried.\n * Used to prevent retrying client errors that won't resolve.\n */\nexport function isNonRetryableError(error: unknown): boolean {\n if (!error || typeof error !== 'object') return false;\n\n // Check for status property\n if ('status' in error) {\n const status = (error as { status: number }).status;\n return HTTP_NO_RETRY_STATUSES.includes(status);\n }\n\n // Check for statusCode property\n if ('statusCode' in error) {\n const statusCode = (error as { statusCode: number }).statusCode;\n return HTTP_NO_RETRY_STATUSES.includes(statusCode);\n }\n\n // Check error message for client-js pattern\n if ('message' in error) {\n const message = (error as { message: unknown }).message;\n if (typeof message === 'string') {\n return HTTP_NO_RETRY_STATUSES.some(code => new RegExp(`\\\\bstatus:\\\\s*${code}\\\\b`).test(message));\n }\n }\n\n return false;\n}\n\n/**\n * Default retry function for TanStack Query.\n * Does not retry 4xx client errors (400, 401, 403, 404) or 501 capability gaps.\n * Retries other errors up to 3 times.\n */\nexport function shouldRetryQuery(failureCount: number, error: unknown): boolean {\n // Don't retry client errors - they won't resolve with retries\n if (isNonRetryableError(error)) {\n return false;\n }\n // Default: retry up to 3 times for transient errors\n return failureCount < 3;\n}\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@mastra/playground-ui",
3
3
  "type": "module",
4
- "version": "43.0.0-alpha.3",
4
+ "version": "43.0.0-alpha.5",
5
5
  "description": "Mastra Playground components",
6
6
  "sideEffects": [
7
7
  "**/*.css"
@@ -150,17 +150,17 @@
150
150
  "react": ">=19.0.0",
151
151
  "react-dom": ">=19.0.0",
152
152
  "tailwindcss": "^4.0.0",
153
- "@mastra/client-js": "^1.34.0-alpha.3",
154
- "@mastra/react": "1.3.2-alpha.3"
153
+ "@mastra/client-js": "^1.34.0-alpha.5",
154
+ "@mastra/react": "1.3.2-alpha.5"
155
155
  },
156
156
  "devDependencies": {
157
157
  "@storybook/addon-a11y": "^10.4.1",
158
158
  "@storybook/addon-docs": "^10.4.1",
159
159
  "@storybook/addon-mcp": "^0.6.0",
160
160
  "@storybook/react-vite": "^10.4.1",
161
- "@tailwindcss/postcss": "^4.2.2",
161
+ "@tailwindcss/postcss": "^4.3.3",
162
162
  "@tailwindcss/typography": "^0.5.19",
163
- "@tailwindcss/vite": "4.2.2",
163
+ "@tailwindcss/vite": "4.3.3",
164
164
  "@tanstack/react-query": "^5.90.21",
165
165
  "@testing-library/react": "^16.3.2",
166
166
  "@types/json-schema": "^7.0.15",
@@ -182,18 +182,18 @@
182
182
  "rollup-plugin-node-externals": "^8.1.2",
183
183
  "storybook": "^10.4.1",
184
184
  "tailwind-merge": "^3.5.0",
185
- "tailwindcss": "4.2.2",
185
+ "tailwindcss": "4.3.3",
186
186
  "tw-animate-css": "^1.4.0",
187
187
  "typescript": "^6.0.3",
188
188
  "vite": "^7.3.1",
189
189
  "vite-plugin-dts": "^4.5.4",
190
190
  "vite-plugin-lib-inject-css": "^2.2.2",
191
191
  "vitest": "4.1.10",
192
- "@mastra/client-js": "^1.34.0-alpha.3",
193
- "@mastra/memory": "1.23.1",
194
- "@mastra/core": "1.53.0-alpha.2",
195
192
  "@internal/lint": "0.0.116",
196
- "@mastra/react": "1.3.2-alpha.3"
193
+ "@mastra/client-js": "^1.34.0-alpha.5",
194
+ "@mastra/core": "1.53.0-alpha.4",
195
+ "@mastra/react": "1.3.2-alpha.5",
196
+ "@mastra/memory": "1.23.1"
197
197
  },
198
198
  "homepage": "https://mastra.ai",
199
199
  "repository": {