@mastra/playground-ui 43.0.0-alpha.3 → 43.0.0-alpha.4

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,16 @@
1
1
  # @mastra/playground-ui
2
2
 
3
+ ## 43.0.0-alpha.4
4
+
5
+ ### Patch Changes
6
+
7
+ - 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))
8
+
9
+ - Updated dependencies:
10
+ - @mastra/core@1.53.0-alpha.3
11
+ - @mastra/client-js@1.34.0-alpha.4
12
+ - @mastra/react@1.3.2-alpha.4
13
+
3
14
  ## 43.0.0-alpha.3
4
15
 
5
16
  ### 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,13 @@ 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
+ /**
36
+ * Check if an error came from a server whose observability storage domain is
37
+ * unavailable — e.g. disabled with `domains: { observability: false }` on a
38
+ * composite store. Affects every observability endpoint, so no operation
39
+ * argument. Matches the stable message from the server's `getObservabilityStore()`.
40
+ */
41
+ export declare function isObservabilityUnavailableError(error: unknown): boolean;
35
42
  /**
36
43
  * Check if error has a status code that shouldn't be retried.
37
44
  * Used to prevent retrying client errors that won't resolve.
@@ -39,7 +46,7 @@ export declare function isUnsupportedObservabilityOperationError(error: unknown,
39
46
  export declare function isNonRetryableError(error: unknown): boolean;
40
47
  /**
41
48
  * Default retry function for TanStack Query.
42
- * Does not retry 4xx client errors (400, 401, 403, 404).
49
+ * Does not retry 4xx client errors (400, 401, 403, 404) or 501 capability gaps.
43
50
  * Retries other errors up to 3 times.
44
51
  */
45
52
  export declare function shouldRetryQuery(failureCount: number, error: unknown): boolean;
@@ -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,12 @@ 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
+ 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 message.includes("Observability storage domain is not available");
71
+ }
66
72
  function isNonRetryableError(error) {
67
73
  if (!error || typeof error !== "object") return false;
68
74
  if ("status" in error) {
@@ -93,6 +99,7 @@ exports.is403ForbiddenError = is403ForbiddenError;
93
99
  exports.is404NotFoundError = is404NotFoundError;
94
100
  exports.isBranchesNotSupportedError = isBranchesNotSupportedError;
95
101
  exports.isNonRetryableError = isNonRetryableError;
102
+ exports.isObservabilityUnavailableError = isObservabilityUnavailableError;
96
103
  exports.isUnsupportedObservabilityOperationError = isUnsupportedObservabilityOperationError;
97
104
  exports.shouldRetryQuery = shouldRetryQuery;
98
105
  //# 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/**\n * Check if an error came from a server whose observability storage domain is\n * unavailable — e.g. disabled with `domains: { observability: false }` on a\n * composite store. Affects every observability endpoint, so no operation\n * argument. Matches the stable message from the server's `getObservabilityStore()`.\n */\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 message.includes('Observability storage domain is not available');\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":";;;;AAQA,MAAM,yBAAyB,CAAC,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,KAAK,GAAG,CAAA;AAOhD,SAAS,uBAAuB,KAAA,EAAyB;AAC9D,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,UAAU,OAAO,KAAA;AAGhD,EAAA,IAAI,QAAA,IAAY,KAAA,IAAU,KAAA,CAA6B,MAAA,KAAW,GAAA,EAAK;AACrE,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,YAAA,IAAgB,KAAA,IAAU,KAAA,CAAiC,UAAA,KAAe,GAAA,EAAK;AACjF,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,aAAa,KAAA,EAAO;AACtB,IAAA,MAAM,UAAW,KAAA,CAA+B,OAAA;AAChD,IAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,MAAA,OAAO,mBAAA,CAAoB,KAAK,OAAO,CAAA;AAAA,IACzC;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;AAMO,SAAS,oBAAoB,KAAA,EAAyB;AAC3D,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,UAAU,OAAO,KAAA;AAGhD,EAAA,IAAI,QAAA,IAAY,KAAA,IAAU,KAAA,CAA6B,MAAA,KAAW,GAAA,EAAK;AACrE,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,YAAA,IAAgB,KAAA,IAAU,KAAA,CAAiC,UAAA,KAAe,GAAA,EAAK;AACjF,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,aAAa,KAAA,EAAO;AACtB,IAAA,MAAM,UAAW,KAAA,CAA+B,OAAA;AAChD,IAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,MAAA,OAAO,mBAAA,CAAoB,KAAK,OAAO,CAAA;AAAA,IACzC;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;AAMO,SAAS,mBAAmB,KAAA,EAAyB;AAC1D,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,UAAU,OAAO,KAAA;AAEhD,EAAA,IAAI,QAAA,IAAY,KAAA,IAAU,KAAA,CAA6B,MAAA,KAAW,GAAA,EAAK;AACrE,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,YAAA,IAAgB,KAAA,IAAU,KAAA,CAAiC,UAAA,KAAe,GAAA,EAAK;AACjF,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,aAAa,KAAA,EAAO;AACtB,IAAA,MAAM,UAAW,KAAA,CAA+B,OAAA;AAChD,IAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,MAAA,OAAO,mBAAA,CAAoB,KAAK,OAAO,CAAA;AAAA,IACzC;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;AASO,SAAS,4BAA4B,KAAA,EAAyB;AACnE,EAAA,IAAI,CAAC,SAAS,OAAO,KAAA,KAAU,YAAY,EAAE,SAAA,IAAa,QAAQ,OAAO,KAAA;AACzE,EAAA,MAAM,UAAW,KAAA,CAA+B,OAAA;AAChD,EAAA,IAAI,OAAO,OAAA,KAAY,QAAA,EAAU,OAAO,KAAA;AACxC,EAAA,OAAO,OAAA,CAAQ,SAAS,yCAAyC,CAAA;AACnE;AAYO,SAAS,wCAAA,CACd,OACA,SAAA,EACS;AACT,EAAA,IAAI,CAAC,SAAS,OAAO,KAAA,KAAU,YAAY,EAAE,SAAA,IAAa,QAAQ,OAAO,KAAA;AACzE,EAAA,MAAM,UAAW,KAAA,CAA+B,OAAA;AAChD,EAAA,IAAI,OAAO,OAAA,KAAY,QAAA,EAAU,OAAO,KAAA;AACxC,EAAA,OAAO,OAAA,CAAQ,QAAA,CAAS,CAAA,yBAAA,EAA4B,SAAS,CAAA,CAAE,CAAA;AACjE;AAQO,SAAS,gCAAgC,KAAA,EAAyB;AACvE,EAAA,IAAI,CAAC,SAAS,OAAO,KAAA,KAAU,YAAY,EAAE,SAAA,IAAa,QAAQ,OAAO,KAAA;AACzE,EAAA,MAAM,UAAW,KAAA,CAA+B,OAAA;AAChD,EAAA,IAAI,OAAO,OAAA,KAAY,QAAA,EAAU,OAAO,KAAA;AACxC,EAAA,OAAO,OAAA,CAAQ,SAAS,+CAA+C,CAAA;AACzE;AAMO,SAAS,oBAAoB,KAAA,EAAyB;AAC3D,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,UAAU,OAAO,KAAA;AAGhD,EAAA,IAAI,YAAY,KAAA,EAAO;AACrB,IAAA,MAAM,SAAU,KAAA,CAA6B,MAAA;AAC7C,IAAA,OAAO,sBAAA,CAAuB,SAAS,MAAM,CAAA;AAAA,EAC/C;AAGA,EAAA,IAAI,gBAAgB,KAAA,EAAO;AACzB,IAAA,MAAM,aAAc,KAAA,CAAiC,UAAA;AACrD,IAAA,OAAO,sBAAA,CAAuB,SAAS,UAAU,CAAA;AAAA,EACnD;AAGA,EAAA,IAAI,aAAa,KAAA,EAAO;AACtB,IAAA,MAAM,UAAW,KAAA,CAA+B,OAAA;AAChD,IAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,MAAA,OAAO,sBAAA,CAAuB,IAAA,CAAK,CAAA,IAAA,KAAQ,IAAI,MAAA,CAAO,CAAA,cAAA,EAAiB,IAAI,CAAA,GAAA,CAAK,CAAA,CAAE,IAAA,CAAK,OAAO,CAAC,CAAA;AAAA,IACjG;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;AAOO,SAAS,gBAAA,CAAiB,cAAsB,KAAA,EAAyB;AAE9E,EAAA,IAAI,mBAAA,CAAoB,KAAK,CAAA,EAAG;AAC9B,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,OAAO,YAAA,GAAe,CAAA;AACxB;;;;;;;;;;;"}
@@ -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,12 @@ 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
+ function isObservabilityUnavailableError(error) {
63
+ if (!error || typeof error !== "object" || !("message" in error)) return false;
64
+ const message = error.message;
65
+ if (typeof message !== "string") return false;
66
+ return message.includes("Observability storage domain is not available");
67
+ }
62
68
  function isNonRetryableError(error) {
63
69
  if (!error || typeof error !== "object") return false;
64
70
  if ("status" in error) {
@@ -84,5 +90,5 @@ function shouldRetryQuery(failureCount, error) {
84
90
  return failureCount < 3;
85
91
  }
86
92
 
87
- export { is401UnauthorizedError, is403ForbiddenError, is404NotFoundError, isBranchesNotSupportedError, isNonRetryableError, isUnsupportedObservabilityOperationError, shouldRetryQuery };
93
+ export { is401UnauthorizedError, is403ForbiddenError, is404NotFoundError, isBranchesNotSupportedError, isNonRetryableError, isObservabilityUnavailableError, isUnsupportedObservabilityOperationError, shouldRetryQuery };
88
94
  //# 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/**\n * Check if an error came from a server whose observability storage domain is\n * unavailable — e.g. disabled with `domains: { observability: false }` on a\n * composite store. Affects every observability endpoint, so no operation\n * argument. Matches the stable message from the server's `getObservabilityStore()`.\n */\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 message.includes('Observability storage domain is not available');\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.4",
5
5
  "description": "Mastra Playground components",
6
6
  "sideEffects": [
7
7
  "**/*.css"
@@ -150,8 +150,8 @@
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.4",
154
+ "@mastra/react": "1.3.2-alpha.4"
155
155
  },
156
156
  "devDependencies": {
157
157
  "@storybook/addon-a11y": "^10.4.1",
@@ -189,11 +189,11 @@
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/memory": "1.23.1",
194
+ "@mastra/core": "1.53.0-alpha.3",
195
+ "@mastra/client-js": "^1.34.0-alpha.4",
196
+ "@mastra/react": "1.3.2-alpha.4"
197
197
  },
198
198
  "homepage": "https://mastra.ai",
199
199
  "repository": {