@mastra/react 1.12.0-alpha.9 → 1.13.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (130) hide show
  1. package/dist/{accumulator-BQGsraqS.cjs → accumulator-BmD8-x9I.cjs} +52 -4
  2. package/dist/accumulator-BmD8-x9I.cjs.map +1 -0
  3. package/dist/{accumulator-C8kIc450.js → accumulator-D9jAph99.js} +52 -4
  4. package/dist/accumulator-D9jAph99.js.map +1 -0
  5. package/dist/chat/index.cjs +1 -1
  6. package/dist/chat/index.js +1 -2
  7. package/dist/combine-by-ids-D_lp6Dvq.cjs.map +1 -1
  8. package/dist/experiments-B7vRMK5T.js +306 -0
  9. package/dist/experiments-B7vRMK5T.js.map +1 -0
  10. package/dist/experiments-CJw1N3FB.cjs +353 -0
  11. package/dist/experiments-CJw1N3FB.cjs.map +1 -0
  12. package/dist/hooks/agents/index.cjs +2 -2
  13. package/dist/hooks/agents/index.cjs.map +1 -1
  14. package/dist/hooks/agents/index.js +2 -2
  15. package/dist/hooks/agents/index.js.map +1 -1
  16. package/dist/hooks/auth/index.cjs +2 -2
  17. package/dist/hooks/auth/index.cjs.map +1 -1
  18. package/dist/hooks/auth/index.js +2 -2
  19. package/dist/hooks/auth/index.js.map +1 -1
  20. package/dist/hooks/capabilities/index.cjs +58 -1
  21. package/dist/hooks/capabilities/index.cjs.map +1 -1
  22. package/dist/hooks/capabilities/index.d.ts +4 -0
  23. package/dist/hooks/capabilities/index.d.ts.map +1 -1
  24. package/dist/hooks/capabilities/index.js +55 -2
  25. package/dist/hooks/capabilities/index.js.map +1 -1
  26. package/dist/hooks/capabilities/use-span-aggregate-available.d.ts +9 -0
  27. package/dist/hooks/capabilities/use-span-aggregate-available.d.ts.map +1 -0
  28. package/dist/hooks/capabilities/use-span-query-available.d.ts +9 -0
  29. package/dist/hooks/capabilities/use-span-query-available.d.ts.map +1 -0
  30. package/dist/hooks/capabilities/use-thread-query-available.d.ts +9 -0
  31. package/dist/hooks/capabilities/use-thread-query-available.d.ts.map +1 -0
  32. package/dist/hooks/capabilities/use-trace-query-delta-polling-available.d.ts +10 -0
  33. package/dist/hooks/capabilities/use-trace-query-delta-polling-available.d.ts.map +1 -0
  34. package/dist/hooks/configuration/index.cjs.map +1 -1
  35. package/dist/hooks/datasets/index.cjs +25 -1
  36. package/dist/hooks/datasets/index.cjs.map +1 -1
  37. package/dist/hooks/datasets/index.js +25 -2
  38. package/dist/hooks/datasets/index.js.map +1 -1
  39. package/dist/hooks/datasets/use-datasets.d.ts +7 -0
  40. package/dist/hooks/datasets/use-datasets.d.ts.map +1 -1
  41. package/dist/hooks/embedders/index.cjs.map +1 -1
  42. package/dist/hooks/experiments/index.cjs +9 -235
  43. package/dist/hooks/experiments/index.d.ts +1 -0
  44. package/dist/hooks/experiments/index.d.ts.map +1 -1
  45. package/dist/hooks/experiments/index.js +1 -229
  46. package/dist/hooks/experiments/usage-accumulator.d.ts +25 -0
  47. package/dist/hooks/experiments/usage-accumulator.d.ts.map +1 -0
  48. package/dist/hooks/experiments/use-experiment-item-usage.d.ts +2 -7
  49. package/dist/hooks/experiments/use-experiment-item-usage.d.ts.map +1 -1
  50. package/dist/hooks/experiments/use-experiments-list-metrics.d.ts +19 -0
  51. package/dist/hooks/experiments/use-experiments-list-metrics.d.ts.map +1 -0
  52. package/dist/hooks/feedback/index.cjs.map +1 -1
  53. package/dist/hooks/llm/index.cjs.map +1 -1
  54. package/dist/hooks/logs/index.cjs.map +1 -1
  55. package/dist/hooks/mcps/index.cjs.map +1 -1
  56. package/dist/hooks/memory/index.cjs +10 -10
  57. package/dist/hooks/memory/index.cjs.map +1 -1
  58. package/dist/hooks/memory/index.js +10 -10
  59. package/dist/hooks/memory/index.js.map +1 -1
  60. package/dist/hooks/metrics/index.cjs +13 -11
  61. package/dist/hooks/metrics/index.cjs.map +1 -1
  62. package/dist/hooks/metrics/index.js +13 -11
  63. package/dist/hooks/metrics/index.js.map +1 -1
  64. package/dist/hooks/processors/index.cjs.map +1 -1
  65. package/dist/hooks/prompt-blocks/index.cjs.map +1 -1
  66. package/dist/hooks/query/index.cjs.map +1 -1
  67. package/dist/hooks/review/index.cjs +2 -2
  68. package/dist/hooks/review/index.cjs.map +1 -1
  69. package/dist/hooks/review/index.js +1 -1
  70. package/dist/hooks/schedules/index.cjs.map +1 -1
  71. package/dist/hooks/scores/index.cjs.map +1 -1
  72. package/dist/hooks/templates/index.cjs +20 -18
  73. package/dist/hooks/templates/index.cjs.map +1 -1
  74. package/dist/hooks/templates/index.js +20 -18
  75. package/dist/hooks/templates/index.js.map +1 -1
  76. package/dist/hooks/templates/use-templates.d.ts.map +1 -1
  77. package/dist/hooks/tool-providers/index.cjs +1 -1
  78. package/dist/hooks/tool-providers/index.cjs.map +1 -1
  79. package/dist/hooks/tool-providers/index.js +1 -1
  80. package/dist/hooks/tool-providers/index.js.map +1 -1
  81. package/dist/hooks/tools/index.cjs.map +1 -1
  82. package/dist/hooks/traces/index.cjs +292 -9
  83. package/dist/hooks/traces/index.cjs.map +1 -1
  84. package/dist/hooks/traces/index.d.ts +2 -0
  85. package/dist/hooks/traces/index.d.ts.map +1 -1
  86. package/dist/hooks/traces/index.js +285 -10
  87. package/dist/hooks/traces/index.js.map +1 -1
  88. package/dist/hooks/traces/use-query-spans.d.ts +27 -0
  89. package/dist/hooks/traces/use-query-spans.d.ts.map +1 -0
  90. package/dist/hooks/traces/use-query-threads.d.ts +30 -0
  91. package/dist/hooks/traces/use-query-threads.d.ts.map +1 -0
  92. package/dist/hooks/traces/use-trace-query.d.ts +50 -1
  93. package/dist/hooks/traces/use-trace-query.d.ts.map +1 -1
  94. package/dist/hooks/traces/use-traces.d.ts +37 -37
  95. package/dist/hooks/vectors/index.cjs.map +1 -1
  96. package/dist/hooks/voice/index.cjs.map +1 -1
  97. package/dist/hooks/workflows/index.cjs +1 -1
  98. package/dist/hooks/workflows/index.cjs.map +1 -1
  99. package/dist/hooks/workflows/index.js +1 -1
  100. package/dist/hooks/workspace/index.cjs +1 -1
  101. package/dist/hooks/workspace/index.cjs.map +1 -1
  102. package/dist/hooks/workspace/index.js +1 -1
  103. package/dist/hooks/workspace/index.js.map +1 -1
  104. package/dist/{hooks-CIutb3DO.cjs → hooks-C6CJtoOR.cjs} +6 -4
  105. package/dist/hooks-C6CJtoOR.cjs.map +1 -0
  106. package/dist/{hooks-0L0RNfau.js → hooks-DG-Y1KFe.js} +2 -2
  107. package/dist/{hooks-0L0RNfau.js.map → hooks-DG-Y1KFe.js.map} +1 -1
  108. package/dist/{hooks-FVbeHlov.js → hooks-DvLSZtUd.js} +6 -4
  109. package/dist/{hooks-FVbeHlov.js.map → hooks-DvLSZtUd.js.map} +1 -1
  110. package/dist/{hooks-_YevKidX.cjs → hooks-XYsmqFCz.cjs} +2 -2
  111. package/dist/hooks-XYsmqFCz.cjs.map +1 -0
  112. package/dist/index.cjs +3 -3
  113. package/dist/index.cjs.map +1 -1
  114. package/dist/index.js +3 -3
  115. package/dist/lib/mastra-db/accumulator.d.ts +0 -6
  116. package/dist/lib/mastra-db/accumulator.d.ts.map +1 -1
  117. package/dist/mastra-client-context-DzX3f0RF.cjs.map +1 -1
  118. package/dist/ui/index.cjs +4 -4
  119. package/dist/ui/index.cjs.map +1 -1
  120. package/dist/ui/index.js +3 -3
  121. package/dist/ui/index.js.map +1 -1
  122. package/dist/use-in-view-B6eJO9Zi.cjs.map +1 -1
  123. package/dist/voice-BOtUdMi8.cjs.map +1 -1
  124. package/package.json +7 -7
  125. package/dist/accumulator-BQGsraqS.cjs.map +0 -1
  126. package/dist/accumulator-C8kIc450.js.map +0 -1
  127. package/dist/hooks/experiments/index.cjs.map +0 -1
  128. package/dist/hooks/experiments/index.js.map +0 -1
  129. package/dist/hooks-CIutb3DO.cjs.map +0 -1
  130. package/dist/hooks-_YevKidX.cjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/hooks/auth/types.ts","../../../src/hooks/auth/fetch-with-refresh.ts","../../../src/hooks/auth/get-client-query-key.ts","../../../src/hooks/auth/sso-login.ts","../../../src/hooks/auth/use-auth-capabilities.ts","../../../src/hooks/auth/use-current-user.ts","../../../src/hooks/auth/use-permission-patterns.ts","../../../src/hooks/auth/use-credentials-login.ts","../../../src/hooks/auth/use-credentials-signup.ts","../../../src/hooks/auth/use-auth-actions.ts"],"sourcesContent":["/**\n * Auth types for EE authentication in playground-ui.\n *\n * These types mirror the server schemas from @mastra/server.\n */\n\n/**\n * SSO configuration for login\n */\nexport type SSOConfig = {\n provider: string;\n text: string;\n icon?: string;\n description?: string;\n url: string;\n};\n\n/**\n * Login configuration\n */\nexport type LoginConfig = {\n type: 'sso' | 'credentials' | 'both';\n /** Whether sign-up is enabled (defaults to true) */\n signUpEnabled?: boolean;\n /** Optional description explaining the auth requirement and what credentials to use */\n description?: string;\n sso?: SSOConfig;\n} | null;\n\n/**\n * Public capabilities (unauthenticated)\n */\nexport type PublicAuthCapabilities = {\n enabled: boolean;\n login: LoginConfig;\n};\n\n/**\n * Authenticated user information\n */\nexport type AuthenticatedUser = {\n id: string;\n email?: string;\n name?: string;\n avatarUrl?: string;\n};\n\n/**\n * Capability flags\n */\nexport type CapabilityFlags = {\n user: boolean;\n session: boolean;\n sso: boolean;\n rbac: boolean;\n acl: boolean;\n};\n\n/**\n * User access information\n */\nexport type UserAccess = {\n roles: string[];\n permissions: string[];\n} | null;\n\n/**\n * Authenticated capabilities (extends public)\n */\nexport type AuthenticatedCapabilities = PublicAuthCapabilities & {\n user: AuthenticatedUser;\n capabilities: CapabilityFlags;\n access: UserAccess;\n /** Available roles in the system (only present for admin users) */\n availableRoles?: { id: string; name: string }[];\n};\n\n/**\n * Auth capabilities response (union of public and authenticated)\n */\nexport type AuthCapabilities = PublicAuthCapabilities | AuthenticatedCapabilities;\n\n/**\n * Current user response (may be null if not authenticated)\n */\nexport type CurrentUser = {\n id: string;\n email?: string;\n name?: string;\n avatarUrl?: string;\n roles?: string[];\n permissions?: string[];\n} | null;\n\n/**\n * SSO callback response\n */\nexport type SSOCallbackResponse = {\n success: boolean;\n user?: AuthenticatedUser;\n redirectTo?: string;\n};\n\n/**\n * Logout response\n */\nexport type LogoutResponse = {\n success: boolean;\n redirectTo?: string;\n};\n\n/**\n * Type guard to check if capabilities include authenticated user\n */\nexport function isAuthenticated(capabilities: AuthCapabilities): capabilities is AuthenticatedCapabilities {\n return 'user' in capabilities && capabilities.user !== undefined;\n}\n","/**\n * Fetch wrapper for the Mastra server API.\n *\n * ⚠️ MIRRORS: `platform/frontend/src/shared/lib/fetch-with-refresh.ts`\n *\n * Both files must stay behaviourally in lockstep — the platform dashboard and\n * the embedded playground both talk to WorkOS-backed auth and both would be\n * vulnerable to the same 429 lockout loop if either regressed. If you change\n * one, change the other in the same PR (or extract to a shared package —\n * currently blocked by the platform/mastra-ai monorepo boundary).\n *\n * ---\n *\n * The server middleware already refreshes the WorkOS session transparently\n * on every protected request. There is no scenario where the client can\n * succeed by calling /auth/refresh after a 401 — that endpoint hits the\n * same broken WorkOS with the same session and would only amplify transient\n * failures into forced logout (PLTFRM-1270).\n *\n * These are pass-throughs today. The names and signatures are preserved for\n * compatibility with existing call sites (`App.tsx`, `use-current-user.ts`).\n * Transient-failure retry belongs one level up — in React Query's `retry`\n * config on individual queries — not in a fetch wrapper that would compound\n * with the query-level retry.\n */\n\nexport async function fetchWithRefresh(\n _baseUrl: string,\n input: RequestInfo | URL,\n init?: RequestInit,\n): Promise<Response> {\n return fetch(input, init);\n}\n\nexport function createFetchWithRefresh(_baseUrl?: string, _apiPrefix?: string): typeof fetch {\n return (input, init) => fetch(input, init);\n}\n","import type { MastraClient } from '@mastra/client-js';\n\nconst clientQueryKeys = new WeakMap<MastraClient, number>();\nlet nextClientQueryKey = 0;\n\n/**\n * Returns a stable, non-sensitive query key for a Mastra client instance.\n * A new client is created whenever its connection options change.\n */\nexport function getClientQueryKey(client: MastraClient) {\n const existingKey = clientQueryKeys.get(client);\n if (existingKey !== undefined) return existingKey;\n\n const queryKey = nextClientQueryKey++;\n clientQueryKeys.set(client, queryKey);\n return queryKey;\n}\n","import type { MastraClient } from '@mastra/client-js';\n\nexport type SSOLoginResponse = {\n url: string;\n};\n\nexport async function makeSSOLoginRequest(\n client: Pick<MastraClient, 'options'>,\n { redirectUri }: { redirectUri?: string },\n): Promise<SSOLoginResponse> {\n const { baseUrl = '', apiPrefix, headers: clientHeaders = {} } = client.options;\n const raw = (apiPrefix || '/api').trim();\n const prefix = (raw.startsWith('/') ? raw : `/${raw}`).replace(/\\/$/, '');\n\n const params = new URLSearchParams();\n if (redirectUri) {\n params.set('redirect_uri', redirectUri);\n }\n\n const url = `${baseUrl}${prefix}/auth/sso/login${params.toString() ? `?${params}` : ''}`;\n\n const response = await fetch(url, {\n credentials: 'include',\n headers: {\n ...clientHeaders,\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to initiate SSO login: ${response.status}`);\n }\n\n return response.json();\n}\n","import type { MastraClient } from '@mastra/client-js';\nimport type { UseQueryResult } from '@tanstack/react-query';\nimport { useQuery } from '@tanstack/react-query';\nimport { useMastraClient } from '../../mastra-client-context';\nimport type { MastraQueryOptions } from '../shared/query-options';\n\nimport { getClientQueryKey } from './get-client-query-key';\nimport type { AuthCapabilities } from './types';\n\n/**\n * Makes a request to the auth capabilities endpoint.\n * Exported for testing purposes.\n *\n * @internal\n */\nexport async function makeAuthCapabilitiesRequest(client: MastraClient): Promise<AuthCapabilities> {\n const { baseUrl = '', headers: clientHeaders = {}, apiPrefix } = client.options;\n const raw = (apiPrefix || '/api').trim();\n const prefix = (raw.startsWith('/') ? raw : `/${raw}`).replace(/\\/$/, '');\n\n const response = await fetch(`${baseUrl}${prefix}/auth/capabilities`, {\n credentials: 'include',\n headers: {\n ...clientHeaders,\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch auth capabilities: ${response.status}`);\n }\n\n return response.json();\n}\n\n/**\n * Hook to fetch authentication capabilities.\n *\n * Returns server-authoritative capability detection including:\n * - Whether auth is enabled\n * - Login configuration (SSO, credentials, or both)\n * - Current user (if authenticated)\n * - Available capabilities (user awareness, session, SSO, RBAC, ACL, audit)\n * - User access (roles and permissions)\n *\n * @example\n * ```tsx\n * import { useAuthCapabilities } from '@mastra/react/hooks/auth';\n *\n * function AuthStatus() {\n * const { data: capabilities, isLoading } = useAuthCapabilities();\n *\n * if (isLoading) return <div>Loading...</div>;\n * if (!capabilities?.enabled) return <div>Auth not enabled</div>;\n *\n * if (isAuthenticated(capabilities)) {\n * return <div>Welcome, {capabilities.user.name}</div>;\n * }\n *\n * return <LoginButton config={capabilities.login} />;\n * }\n * ```\n */\nexport function useAuthCapabilities<TData = AuthCapabilities>({\n queryOptions,\n}: { queryOptions?: MastraQueryOptions<AuthCapabilities, TData> } = {}): UseQueryResult<TData, Error> {\n const client = useMastraClient();\n\n return useQuery<AuthCapabilities, Error, TData>({\n queryKey: ['auth', 'capabilities', getClientQueryKey(client)],\n queryFn: () => makeAuthCapabilitiesRequest(client),\n staleTime: 60 * 1000, // Cache for 1 minute\n retry: false, // Don't retry auth requests\n ...queryOptions,\n });\n}\n","import type { UseQueryResult } from '@tanstack/react-query';\nimport { useQuery } from '@tanstack/react-query';\nimport { useMastraClient } from '../../mastra-client-context';\nimport type { MastraQueryOptions } from '../shared/query-options';\n\nimport { fetchWithRefresh } from './fetch-with-refresh';\nimport type { CurrentUser } from './types';\n\nconst AUTH_TRANSIENT_MAX_RETRIES = 3;\nconst AUTH_TRANSIENT_MAX_BACKOFF_MS = 8_000;\n\nexport class CurrentUserError extends Error {\n constructor(public readonly status: number) {\n super(`Failed to fetch current user: ${status}`);\n this.name = 'CurrentUserError';\n }\n}\n\nexport function isUnauthenticatedError(error: unknown): boolean {\n return error instanceof CurrentUserError && error.status === 401;\n}\n\n/**\n * Hook to fetch the current authenticated user.\n *\n * Returns the current user if authenticated, null otherwise.\n * Includes roles and permissions if RBAC is available.\n *\n * Uses fetchWithRefresh to automatically refresh the session on 401 errors,\n * preventing users from being logged out when the access token expires.\n *\n * @example\n * ```tsx\n * import { useCurrentUser } from '@mastra/react/hooks/auth';\n *\n * function UserMenu() {\n * const { data: user, isLoading } = useCurrentUser();\n *\n * if (isLoading) return <Skeleton />;\n * if (!user) return <LoginButton />;\n *\n * return (\n * <Menu>\n * <Avatar src={user.avatarUrl} />\n * <span>{user.name || user.email}</span>\n * </Menu>\n * );\n * }\n * ```\n */\nexport function useCurrentUser<TData = CurrentUser>({\n queryOptions,\n}: { queryOptions?: MastraQueryOptions<CurrentUser, TData> } = {}): UseQueryResult<TData, Error> {\n const client = useMastraClient();\n const baseUrl = client.options?.baseUrl || '';\n\n return useQuery<CurrentUser, Error, TData>({\n queryKey: ['auth', 'me'],\n queryFn: async () => {\n const response = await fetchWithRefresh(baseUrl, `${baseUrl}/api/auth/me`, {\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n throw new CurrentUserError(response.status);\n }\n\n return response.json();\n },\n staleTime: 60 * 1000, // Cache for 1 minute\n // Retry the /api/auth/me query on transient auth-provider failures (HTTP 503)\n // so the UI stays in `isLoading` instead of flipping to `isError` and\n // triggering login — that redirect is what fed the WorkOS 429 lockout loop\n // (PLTFRM-1270). 401 (terminal) still fails fast.\n retry: (failureCount, error) => {\n if (!(error instanceof CurrentUserError)) return false;\n if (error.status !== 503) return false;\n return failureCount < AUTH_TRANSIENT_MAX_RETRIES;\n },\n retryDelay: attemptIndex => Math.min(AUTH_TRANSIENT_MAX_BACKOFF_MS, 500 * 2 ** attemptIndex),\n ...queryOptions,\n });\n}\n","import type { MastraClient, PermissionPattern } from '@mastra/client-js';\nimport { useQuery } from '@tanstack/react-query';\nimport { useMemo } from 'react';\nimport { useMastraClient } from '../../mastra-client-context';\nimport type { MastraQueryOptions } from '../shared/query-options';\n\nimport { getClientQueryKey } from './get-client-query-key';\nimport { isAuthenticated } from './types';\nimport { useAuthCapabilities } from './use-auth-capabilities';\n\n/**\n * Fetches the authoritative set of permission patterns from the server\n * (`GET /auth/permission-patterns`).\n *\n * The server owns the permission source of truth (generated from the route\n * registry), so the browser never imports the server-only `@mastra/core/auth/ee`\n * code just to validate hardcoded route-permission literals.\n *\n * The request only fires when RBAC is actually enabled — when auth is off or\n * RBAC isn't configured, route gating is a no-op so the pattern vocabulary is\n * not needed, and we avoid an unnecessary (and potentially 403/401) call.\n */\ntype PermissionPatternsResponse = Awaited<ReturnType<MastraClient['getPermissionPatterns']>>;\n\nexport const usePermissionPatterns = ({\n queryOptions,\n}: { queryOptions?: MastraQueryOptions<PermissionPatternsResponse> } = {}) => {\n const client = useMastraClient();\n const { data: capabilities, isLoading: capabilitiesLoading, error: capabilitiesError } = useAuthCapabilities();\n\n const rbacEnabled = !!(capabilities && isAuthenticated(capabilities) && capabilities.capabilities.rbac);\n\n const { data, isLoading, error } = useQuery({\n queryKey: ['permission-patterns', getClientQueryKey(client)],\n queryFn: () => client.getPermissionPatterns(),\n // Only fetch the pattern vocabulary when RBAC gating is in effect.\n enabled: rbacEnabled,\n // The endpoint requires auth; on 403/401 we don't want React Query to\n // thrash with retries (which toggles isLoading and re-triggers redirect\n // guards). One attempt is enough — gating falls back to the user's\n // permissions if the pattern set is empty.\n retry: false,\n staleTime: Infinity,\n ...queryOptions,\n });\n\n const patterns = useMemo(() => new Set<PermissionPattern>(data?.patterns ?? []), [data]);\n\n // While capabilities are resolving we don't yet know whether RBAC applies, so\n // report loading. Once RBAC is ruled out, this hook is never \"loading\".\n return { patterns, isLoading: capabilitiesLoading || (rbacEnabled && isLoading), error: capabilitiesError || error };\n};\n","import type { MastraClient } from '@mastra/client-js';\nimport { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useMastraClient } from '../../mastra-client-context';\nimport type { MastraMutationOptions } from '../shared/query-options';\n\nexport type CredentialsLoginRequest = {\n email: string;\n password: string;\n};\n\nexport type CredentialsLoginResponse = {\n user?: {\n id: string;\n email: string;\n name?: string;\n };\n error?: string;\n};\n\n/**\n * Hook to login with email/password credentials.\n *\n * Uses Better Auth's email sign-in endpoint.\n *\n * @example\n * ```tsx\n * import { useCredentialsLogin } from '@mastra/react/hooks/auth';\n *\n * function LoginForm() {\n * const { mutate: login, isPending, error } = useCredentialsLogin();\n *\n * const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {\n * e.preventDefault();\n * const formData = new FormData(e.currentTarget);\n * login({\n * email: formData.get('email') as string,\n * password: formData.get('password') as string,\n * }, {\n * onSuccess: () => {\n * window.location.href = '/';\n * },\n * });\n * };\n *\n * return (\n * <form onSubmit={handleSubmit}>\n * <input name=\"email\" type=\"email\" required />\n * <input name=\"password\" type=\"password\" required />\n * <button type=\"submit\" disabled={isPending}>\n * Sign in\n * </button>\n * {error && <p>{error.message}</p>}\n * </form>\n * );\n * }\n * ```\n */\n/**\n * Makes a credentials sign-in request.\n * Exported for testing purposes.\n *\n * @internal\n */\nexport async function makeCredentialsLoginRequest(\n client: MastraClient,\n { email, password }: CredentialsLoginRequest,\n): Promise<CredentialsLoginResponse> {\n const { baseUrl = '', apiPrefix, headers: clientHeaders = {} } = client.options || {};\n const raw = (apiPrefix ?? '/api').trim();\n const normalized = raw === '' ? '' : raw.startsWith('/') ? raw : `/${raw}`;\n const prefix = normalized.replace(/\\/+$/, '');\n\n // Generic Mastra auth endpoint - works with any credentials provider\n const response = await fetch(`${baseUrl}${prefix}/auth/credentials/sign-in`, {\n method: 'POST',\n credentials: 'include',\n headers: {\n ...clientHeaders,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ email, password }),\n });\n\n const data = await response.json();\n\n if (!response.ok) {\n throw new Error(data.message || data.error || 'Invalid email or password');\n }\n\n return data;\n}\n\nexport function useCredentialsLogin({\n queryOptions,\n}: { queryOptions?: MastraMutationOptions<CredentialsLoginResponse, CredentialsLoginRequest> } = {}) {\n const client = useMastraClient();\n const queryClient = useQueryClient();\n\n return useMutation<CredentialsLoginResponse, Error, CredentialsLoginRequest>({\n mutationFn: ({ email, password }) => makeCredentialsLoginRequest(client, { email, password }),\n onSuccess: () => {\n // Invalidate auth queries to refetch user state\n void queryClient.invalidateQueries({ queryKey: ['auth'] });\n },\n ...queryOptions,\n });\n}\n","import type { MastraClient } from '@mastra/client-js';\nimport { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useMastraClient } from '../../mastra-client-context';\nimport type { MastraMutationOptions } from '../shared/query-options';\n\nexport type CredentialsSignUpRequest = {\n email: string;\n password: string;\n name?: string;\n};\n\nexport type CredentialsSignUpResponse = {\n user?: {\n id: string;\n email: string;\n name?: string;\n };\n error?: string;\n};\n\n/**\n * Hook to sign up with email/password credentials.\n *\n * Uses Better Auth's email sign-up endpoint.\n *\n * @example\n * ```tsx\n * import { useCredentialsSignUp } from '@mastra/react/hooks/auth';\n *\n * function SignUpForm() {\n * const { mutate: signUp, isPending, error } = useCredentialsSignUp();\n *\n * const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {\n * e.preventDefault();\n * const formData = new FormData(e.currentTarget);\n * signUp({\n * email: formData.get('email') as string,\n * password: formData.get('password') as string,\n * name: formData.get('name') as string,\n * }, {\n * onSuccess: () => {\n * window.location.href = '/';\n * },\n * });\n * };\n *\n * return (\n * <form onSubmit={handleSubmit}>\n * <input name=\"name\" type=\"text\" />\n * <input name=\"email\" type=\"email\" required />\n * <input name=\"password\" type=\"password\" required />\n * <button type=\"submit\" disabled={isPending}>\n * Sign up\n * </button>\n * {error && <p>{error.message}</p>}\n * </form>\n * );\n * }\n * ```\n */\n/**\n * Makes a credentials sign-up request.\n * Exported for testing purposes.\n *\n * @internal\n */\nexport async function makeCredentialsSignUpRequest(\n client: MastraClient,\n { email, password, name }: CredentialsSignUpRequest,\n): Promise<CredentialsSignUpResponse> {\n const { baseUrl = '', apiPrefix, headers: clientHeaders = {} } = client.options || {};\n const raw = (apiPrefix ?? '/api').trim();\n const normalized = raw === '' ? '' : raw.startsWith('/') ? raw : `/${raw}`;\n const prefix = normalized.replace(/\\/+$/, '');\n\n // Generic Mastra auth endpoint - works with any credentials provider\n const response = await fetch(`${baseUrl}${prefix}/auth/credentials/sign-up`, {\n method: 'POST',\n credentials: 'include',\n headers: {\n ...clientHeaders,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ email, password, name }),\n });\n\n const data = await response.json();\n\n if (!response.ok) {\n throw new Error(data.message || data.error || 'Failed to create account');\n }\n\n return data;\n}\n\nexport function useCredentialsSignUp({\n queryOptions,\n}: { queryOptions?: MastraMutationOptions<CredentialsSignUpResponse, CredentialsSignUpRequest> } = {}) {\n const client = useMastraClient();\n const queryClient = useQueryClient();\n\n return useMutation<CredentialsSignUpResponse, Error, CredentialsSignUpRequest>({\n mutationFn: ({ email, password, name }) => makeCredentialsSignUpRequest(client, { email, password, name }),\n onSuccess: () => {\n // Invalidate auth queries to refetch user state\n void queryClient.invalidateQueries({ queryKey: ['auth'] });\n },\n ...queryOptions,\n });\n}\n","import type { MastraClient } from '@mastra/client-js';\nimport { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useMastraClient } from '../../mastra-client-context';\nimport type { MastraMutationOptions } from '../shared/query-options';\n\nimport { makeSSOLoginRequest } from './sso-login';\nimport type { LogoutResponse } from './types';\n\n/**\n * Hook to initiate SSO login.\n *\n * Returns mutation to get the SSO login URL and redirect.\n *\n * @example\n * ```tsx\n * import { useSSOLogin } from '@mastra/react/hooks/auth';\n *\n * function SSOLoginButton() {\n * const { mutate: login, isPending } = useSSOLogin();\n *\n * const handleClick = () => {\n * login({ redirectUri: window.location.href }, {\n * onSuccess: (data) => {\n * window.location.href = data.url;\n * },\n * });\n * };\n *\n * return (\n * <button onClick={handleClick} disabled={isPending}>\n * Sign in with SSO\n * </button>\n * );\n * }\n * ```\n */\ntype SSOLoginResponse = Awaited<ReturnType<typeof makeSSOLoginRequest>>;\n\nexport function useSSOLogin({\n queryOptions,\n}: { queryOptions?: MastraMutationOptions<SSOLoginResponse, { redirectUri?: string }> } = {}) {\n const client = useMastraClient();\n\n return useMutation({\n mutationFn: ({ redirectUri }: { redirectUri?: string }) => makeSSOLoginRequest(client, { redirectUri }),\n ...queryOptions,\n });\n}\n\n/**\n * Hook to logout the current user.\n *\n * Destroys the current session and optionally redirects to\n * the SSO logout URL if available.\n *\n * @example\n * ```tsx\n * import { useLogout } from '@mastra/react/hooks/auth';\n *\n * function LogoutButton({ userId }: { userId: string }) {\n * const { mutate: logout, isPending } = useLogout();\n * const queryClient = useQueryClient();\n *\n * const handleLogout = () => {\n * logout({ userId }, {\n * onSuccess: (data) => {\n * queryClient.invalidateQueries({ queryKey: ['auth'] });\n * if (data.redirectTo) {\n * window.location.href = data.redirectTo;\n * } else {\n * window.location.reload();\n * }\n * },\n * });\n * };\n *\n * return (\n * <button onClick={handleLogout} disabled={isPending}>\n * Sign out\n * </button>\n * );\n * }\n * ```\n */\n/**\n * Makes a logout request.\n * Exported for testing purposes.\n *\n * @internal\n */\nexport async function makeLogoutRequest(client: Pick<MastraClient, 'options'>): Promise<LogoutResponse> {\n const { baseUrl = '', apiPrefix, headers: clientHeaders = {} } = client.options;\n const raw = (apiPrefix || '/api').trim();\n const prefix = (raw.startsWith('/') ? raw : `/${raw}`).replace(/\\/$/, '');\n\n const response = await fetch(`${baseUrl}${prefix}/auth/logout`, {\n method: 'POST',\n credentials: 'include',\n headers: {\n ...clientHeaders,\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to logout: ${response.status}`);\n }\n\n return response.json();\n}\n\nexport interface UseLogoutOptions {\n /**\n * Runs once the server has ended the session, before the mutation resolves.\n * Failures are ignored so cleanup never turns a completed sign-out into an error.\n */\n onLoggedOut?: (variables: { userId: string }) => Promise<void>;\n queryOptions?: MastraMutationOptions<LogoutResponse, { userId: string }>;\n}\n\nexport function useLogout({ onLoggedOut, queryOptions }: UseLogoutOptions = {}) {\n const client = useMastraClient();\n const queryClient = useQueryClient();\n\n return useMutation<LogoutResponse, Error, { userId: string }>({\n mutationFn: async variables => {\n const response = await makeLogoutRequest(client);\n await onLoggedOut?.(variables).catch(() => {});\n return response;\n },\n onSuccess: () => {\n // Invalidate all auth-related queries\n void queryClient.invalidateQueries({ queryKey: ['auth'] });\n },\n ...queryOptions,\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/hooks/auth/types.ts","../../../src/hooks/auth/fetch-with-refresh.ts","../../../src/hooks/auth/get-client-query-key.ts","../../../src/hooks/auth/sso-login.ts","../../../src/hooks/auth/use-auth-capabilities.ts","../../../src/hooks/auth/use-current-user.ts","../../../src/hooks/auth/use-permission-patterns.ts","../../../src/hooks/auth/use-credentials-login.ts","../../../src/hooks/auth/use-credentials-signup.ts","../../../src/hooks/auth/use-auth-actions.ts"],"sourcesContent":["/**\n * Auth types for EE authentication in playground-ui.\n *\n * These types mirror the server schemas from @mastra/server.\n */\n\n/**\n * SSO configuration for login\n */\nexport type SSOConfig = {\n provider: string;\n text: string;\n icon?: string;\n description?: string;\n url: string;\n};\n\n/**\n * Login configuration\n */\nexport type LoginConfig = {\n type: 'sso' | 'credentials' | 'both';\n /** Whether sign-up is enabled (defaults to true) */\n signUpEnabled?: boolean;\n /** Optional description explaining the auth requirement and what credentials to use */\n description?: string;\n sso?: SSOConfig;\n} | null;\n\n/**\n * Public capabilities (unauthenticated)\n */\nexport type PublicAuthCapabilities = {\n enabled: boolean;\n login: LoginConfig;\n};\n\n/**\n * Authenticated user information\n */\nexport type AuthenticatedUser = {\n id: string;\n email?: string;\n name?: string;\n avatarUrl?: string;\n};\n\n/**\n * Capability flags\n */\nexport type CapabilityFlags = {\n user: boolean;\n session: boolean;\n sso: boolean;\n rbac: boolean;\n acl: boolean;\n};\n\n/**\n * User access information\n */\nexport type UserAccess = {\n roles: string[];\n permissions: string[];\n} | null;\n\n/**\n * Authenticated capabilities (extends public)\n */\nexport type AuthenticatedCapabilities = PublicAuthCapabilities & {\n user: AuthenticatedUser;\n capabilities: CapabilityFlags;\n access: UserAccess;\n /** Available roles in the system (only present for admin users) */\n availableRoles?: { id: string; name: string }[];\n};\n\n/**\n * Auth capabilities response (union of public and authenticated)\n */\nexport type AuthCapabilities = PublicAuthCapabilities | AuthenticatedCapabilities;\n\n/**\n * Current user response (may be null if not authenticated)\n */\nexport type CurrentUser = {\n id: string;\n email?: string;\n name?: string;\n avatarUrl?: string;\n roles?: string[];\n permissions?: string[];\n} | null;\n\n/**\n * SSO callback response\n */\nexport type SSOCallbackResponse = {\n success: boolean;\n user?: AuthenticatedUser;\n redirectTo?: string;\n};\n\n/**\n * Logout response\n */\nexport type LogoutResponse = {\n success: boolean;\n redirectTo?: string;\n};\n\n/**\n * Type guard to check if capabilities include authenticated user\n */\nexport function isAuthenticated(capabilities: AuthCapabilities): capabilities is AuthenticatedCapabilities {\n return 'user' in capabilities && capabilities.user !== undefined;\n}\n","/**\n * Fetch wrapper for the Mastra server API.\n *\n * ⚠️ MIRRORS: `platform/frontend/src/shared/lib/fetch-with-refresh.ts`\n *\n * Both files must stay behaviourally in lockstep — the platform dashboard and\n * the embedded playground both talk to WorkOS-backed auth and both would be\n * vulnerable to the same 429 lockout loop if either regressed. If you change\n * one, change the other in the same PR (or extract to a shared package —\n * currently blocked by the platform/mastra-ai monorepo boundary).\n *\n * ---\n *\n * The server middleware already refreshes the WorkOS session transparently\n * on every protected request. There is no scenario where the client can\n * succeed by calling /auth/refresh after a 401 — that endpoint hits the\n * same broken WorkOS with the same session and would only amplify transient\n * failures into forced logout (PLTFRM-1270).\n *\n * These are pass-throughs today. The names and signatures are preserved for\n * compatibility with existing call sites (`App.tsx`, `use-current-user.ts`).\n * Transient-failure retry belongs one level up — in React Query's `retry`\n * config on individual queries — not in a fetch wrapper that would compound\n * with the query-level retry.\n */\n\nexport async function fetchWithRefresh(\n _baseUrl: string,\n input: RequestInfo | URL,\n init?: RequestInit,\n): Promise<Response> {\n return fetch(input, init);\n}\n\nexport function createFetchWithRefresh(_baseUrl?: string, _apiPrefix?: string): typeof fetch {\n return (input, init) => fetch(input, init);\n}\n","import type { MastraClient } from '@mastra/client-js';\n\nconst clientQueryKeys = new WeakMap<MastraClient, number>();\nlet nextClientQueryKey = 0;\n\n/**\n * Returns a stable, non-sensitive query key for a Mastra client instance.\n * A new client is created whenever its connection options change.\n */\nexport function getClientQueryKey(client: MastraClient) {\n const existingKey = clientQueryKeys.get(client);\n if (existingKey !== undefined) return existingKey;\n\n const queryKey = nextClientQueryKey++;\n clientQueryKeys.set(client, queryKey);\n return queryKey;\n}\n","import type { MastraClient } from '@mastra/client-js';\n\nexport type SSOLoginResponse = {\n url: string;\n};\n\nexport async function makeSSOLoginRequest(\n client: Pick<MastraClient, 'options'>,\n { redirectUri }: { redirectUri?: string },\n): Promise<SSOLoginResponse> {\n const { baseUrl = '', apiPrefix, headers: clientHeaders = {} } = client.options;\n const raw = (apiPrefix || '/api').trim();\n const prefix = (raw.startsWith('/') ? raw : `/${raw}`).replace(/\\/$/, '');\n\n const params = new URLSearchParams();\n if (redirectUri) {\n params.set('redirect_uri', redirectUri);\n }\n\n const url = `${baseUrl}${prefix}/auth/sso/login${params.toString() ? `?${params}` : ''}`;\n\n const response = await fetch(url, {\n credentials: 'include',\n headers: {\n ...clientHeaders,\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to initiate SSO login: ${response.status}`);\n }\n\n return response.json();\n}\n","import type { MastraClient } from '@mastra/client-js';\nimport type { UseQueryResult } from '@tanstack/react-query';\nimport { useQuery } from '@tanstack/react-query';\nimport { useMastraClient } from '../../mastra-client-context';\nimport type { MastraQueryOptions } from '../shared/query-options';\n\nimport { getClientQueryKey } from './get-client-query-key';\nimport type { AuthCapabilities } from './types';\n\n/**\n * Makes a request to the auth capabilities endpoint.\n * Exported for testing purposes.\n *\n * @internal\n */\nexport async function makeAuthCapabilitiesRequest(client: MastraClient): Promise<AuthCapabilities> {\n const { baseUrl = '', headers: clientHeaders = {}, apiPrefix } = client.options;\n const raw = (apiPrefix || '/api').trim();\n const prefix = (raw.startsWith('/') ? raw : `/${raw}`).replace(/\\/$/, '');\n\n const response = await fetch(`${baseUrl}${prefix}/auth/capabilities`, {\n credentials: 'include',\n headers: {\n ...clientHeaders,\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch auth capabilities: ${response.status}`);\n }\n\n return response.json();\n}\n\n/**\n * Hook to fetch authentication capabilities.\n *\n * Returns server-authoritative capability detection including:\n * - Whether auth is enabled\n * - Login configuration (SSO, credentials, or both)\n * - Current user (if authenticated)\n * - Available capabilities (user awareness, session, SSO, RBAC, ACL, audit)\n * - User access (roles and permissions)\n *\n * @example\n * ```tsx\n * import { useAuthCapabilities } from '@mastra/react/hooks/auth';\n *\n * function AuthStatus() {\n * const { data: capabilities, isLoading } = useAuthCapabilities();\n *\n * if (isLoading) return <div>Loading...</div>;\n * if (!capabilities?.enabled) return <div>Auth not enabled</div>;\n *\n * if (isAuthenticated(capabilities)) {\n * return <div>Welcome, {capabilities.user.name}</div>;\n * }\n *\n * return <LoginButton config={capabilities.login} />;\n * }\n * ```\n */\nexport function useAuthCapabilities<TData = AuthCapabilities>({\n queryOptions,\n}: { queryOptions?: MastraQueryOptions<AuthCapabilities, TData> } = {}): UseQueryResult<TData, Error> {\n const client = useMastraClient();\n\n return useQuery<AuthCapabilities, Error, TData>({\n queryKey: ['auth', 'capabilities', getClientQueryKey(client)],\n queryFn: () => makeAuthCapabilitiesRequest(client),\n staleTime: 60 * 1000, // Cache for 1 minute\n retry: false, // Don't retry auth requests\n ...queryOptions,\n });\n}\n","import type { UseQueryResult } from '@tanstack/react-query';\nimport { useQuery } from '@tanstack/react-query';\nimport { useMastraClient } from '../../mastra-client-context';\nimport type { MastraQueryOptions } from '../shared/query-options';\n\nimport { fetchWithRefresh } from './fetch-with-refresh';\nimport type { CurrentUser } from './types';\n\nconst AUTH_TRANSIENT_MAX_RETRIES = 3;\nconst AUTH_TRANSIENT_MAX_BACKOFF_MS = 8_000;\n\nexport class CurrentUserError extends Error {\n constructor(public readonly status: number) {\n super(`Failed to fetch current user: ${status}`);\n this.name = 'CurrentUserError';\n }\n}\n\nexport function isUnauthenticatedError(error: unknown): boolean {\n return error instanceof CurrentUserError && error.status === 401;\n}\n\n/**\n * Hook to fetch the current authenticated user.\n *\n * Returns the current user if authenticated, null otherwise.\n * Includes roles and permissions if RBAC is available.\n *\n * Uses fetchWithRefresh to automatically refresh the session on 401 errors,\n * preventing users from being logged out when the access token expires.\n *\n * @example\n * ```tsx\n * import { useCurrentUser } from '@mastra/react/hooks/auth';\n *\n * function UserMenu() {\n * const { data: user, isLoading } = useCurrentUser();\n *\n * if (isLoading) return <Skeleton />;\n * if (!user) return <LoginButton />;\n *\n * return (\n * <Menu>\n * <Avatar src={user.avatarUrl} />\n * <span>{user.name || user.email}</span>\n * </Menu>\n * );\n * }\n * ```\n */\nexport function useCurrentUser<TData = CurrentUser>({\n queryOptions,\n}: { queryOptions?: MastraQueryOptions<CurrentUser, TData> } = {}): UseQueryResult<TData, Error> {\n const client = useMastraClient();\n const baseUrl = client.options?.baseUrl || '';\n\n return useQuery<CurrentUser, Error, TData>({\n queryKey: ['auth', 'me'],\n queryFn: async () => {\n const response = await fetchWithRefresh(baseUrl, `${baseUrl}/api/auth/me`, {\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n throw new CurrentUserError(response.status);\n }\n\n return response.json();\n },\n staleTime: 60 * 1000, // Cache for 1 minute\n // Retry the /api/auth/me query on transient auth-provider failures (HTTP 503)\n // so the UI stays in `isLoading` instead of flipping to `isError` and\n // triggering login — that redirect is what fed the WorkOS 429 lockout loop\n // (PLTFRM-1270). 401 (terminal) still fails fast.\n retry: (failureCount, error) => {\n if (!(error instanceof CurrentUserError)) return false;\n if (error.status !== 503) return false;\n return failureCount < AUTH_TRANSIENT_MAX_RETRIES;\n },\n retryDelay: attemptIndex => Math.min(AUTH_TRANSIENT_MAX_BACKOFF_MS, 500 * 2 ** attemptIndex),\n ...queryOptions,\n });\n}\n","import type { MastraClient, PermissionPattern } from '@mastra/client-js';\nimport { useQuery } from '@tanstack/react-query';\nimport { useMemo } from 'react';\nimport { useMastraClient } from '../../mastra-client-context';\nimport type { MastraQueryOptions } from '../shared/query-options';\n\nimport { getClientQueryKey } from './get-client-query-key';\nimport { isAuthenticated } from './types';\nimport { useAuthCapabilities } from './use-auth-capabilities';\n\n/**\n * Fetches the authoritative set of permission patterns from the server\n * (`GET /auth/permission-patterns`).\n *\n * The server owns the permission source of truth (generated from the route\n * registry), so the browser never imports the server-only `@mastra/core/auth/ee`\n * code just to validate hardcoded route-permission literals.\n *\n * The request only fires when RBAC is actually enabled — when auth is off or\n * RBAC isn't configured, route gating is a no-op so the pattern vocabulary is\n * not needed, and we avoid an unnecessary (and potentially 403/401) call.\n */\ntype PermissionPatternsResponse = Awaited<ReturnType<MastraClient['getPermissionPatterns']>>;\n\nexport const usePermissionPatterns = ({\n queryOptions,\n}: { queryOptions?: MastraQueryOptions<PermissionPatternsResponse> } = {}) => {\n const client = useMastraClient();\n const { data: capabilities, isLoading: capabilitiesLoading, error: capabilitiesError } = useAuthCapabilities();\n\n const rbacEnabled = !!(capabilities && isAuthenticated(capabilities) && capabilities.capabilities.rbac);\n\n const { data, isLoading, error } = useQuery({\n queryKey: ['permission-patterns', getClientQueryKey(client)],\n queryFn: () => client.getPermissionPatterns(),\n // Only fetch the pattern vocabulary when RBAC gating is in effect.\n enabled: rbacEnabled,\n // The endpoint requires auth; on 403/401 we don't want React Query to\n // thrash with retries (which toggles isLoading and re-triggers redirect\n // guards). One attempt is enough — gating falls back to the user's\n // permissions if the pattern set is empty.\n retry: false,\n staleTime: Infinity,\n ...queryOptions,\n });\n\n const patterns = useMemo(() => new Set<PermissionPattern>(data?.patterns ?? []), [data]);\n\n // While capabilities are resolving we don't yet know whether RBAC applies, so\n // report loading. Once RBAC is ruled out, this hook is never \"loading\".\n return { patterns, isLoading: capabilitiesLoading || (rbacEnabled && isLoading), error: capabilitiesError || error };\n};\n","import type { MastraClient } from '@mastra/client-js';\nimport { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useMastraClient } from '../../mastra-client-context';\nimport type { MastraMutationOptions } from '../shared/query-options';\n\nexport type CredentialsLoginRequest = {\n email: string;\n password: string;\n};\n\nexport type CredentialsLoginResponse = {\n user?: {\n id: string;\n email: string;\n name?: string;\n };\n error?: string;\n};\n\n/**\n * Hook to login with email/password credentials.\n *\n * Uses Better Auth's email sign-in endpoint.\n *\n * @example\n * ```tsx\n * import { useCredentialsLogin } from '@mastra/react/hooks/auth';\n *\n * function LoginForm() {\n * const { mutate: login, isPending, error } = useCredentialsLogin();\n *\n * const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {\n * e.preventDefault();\n * const formData = new FormData(e.currentTarget);\n * login({\n * email: formData.get('email') as string,\n * password: formData.get('password') as string,\n * }, {\n * onSuccess: () => {\n * window.location.href = '/';\n * },\n * });\n * };\n *\n * return (\n * <form onSubmit={handleSubmit}>\n * <input name=\"email\" type=\"email\" required />\n * <input name=\"password\" type=\"password\" required />\n * <button type=\"submit\" disabled={isPending}>\n * Sign in\n * </button>\n * {error && <p>{error.message}</p>}\n * </form>\n * );\n * }\n * ```\n */\n/**\n * Makes a credentials sign-in request.\n * Exported for testing purposes.\n *\n * @internal\n */\nexport async function makeCredentialsLoginRequest(\n client: MastraClient,\n { email, password }: CredentialsLoginRequest,\n): Promise<CredentialsLoginResponse> {\n const { baseUrl = '', apiPrefix, headers: clientHeaders = {} } = client.options || {};\n const raw = (apiPrefix ?? '/api').trim();\n const normalized = raw === '' ? '' : raw.startsWith('/') ? raw : `/${raw}`;\n const prefix = normalized.replace(/\\/+$/, '');\n\n // Generic Mastra auth endpoint - works with any credentials provider\n const response = await fetch(`${baseUrl}${prefix}/auth/credentials/sign-in`, {\n method: 'POST',\n credentials: 'include',\n headers: {\n ...clientHeaders,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ email, password }),\n });\n\n const data = await response.json();\n\n if (!response.ok) {\n throw new Error(data.message || data.error || 'Invalid email or password');\n }\n\n return data;\n}\n\nexport function useCredentialsLogin({\n queryOptions,\n}: { queryOptions?: MastraMutationOptions<CredentialsLoginResponse, CredentialsLoginRequest> } = {}) {\n const client = useMastraClient();\n const queryClient = useQueryClient();\n\n return useMutation<CredentialsLoginResponse, Error, CredentialsLoginRequest>({\n mutationFn: ({ email, password }) => makeCredentialsLoginRequest(client, { email, password }),\n onSuccess: () => {\n // Invalidate auth queries to refetch user state\n void queryClient.invalidateQueries({ queryKey: ['auth'] });\n },\n ...queryOptions,\n });\n}\n","import type { MastraClient } from '@mastra/client-js';\nimport { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useMastraClient } from '../../mastra-client-context';\nimport type { MastraMutationOptions } from '../shared/query-options';\n\nexport type CredentialsSignUpRequest = {\n email: string;\n password: string;\n name?: string;\n};\n\nexport type CredentialsSignUpResponse = {\n user?: {\n id: string;\n email: string;\n name?: string;\n };\n error?: string;\n};\n\n/**\n * Hook to sign up with email/password credentials.\n *\n * Uses Better Auth's email sign-up endpoint.\n *\n * @example\n * ```tsx\n * import { useCredentialsSignUp } from '@mastra/react/hooks/auth';\n *\n * function SignUpForm() {\n * const { mutate: signUp, isPending, error } = useCredentialsSignUp();\n *\n * const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {\n * e.preventDefault();\n * const formData = new FormData(e.currentTarget);\n * signUp({\n * email: formData.get('email') as string,\n * password: formData.get('password') as string,\n * name: formData.get('name') as string,\n * }, {\n * onSuccess: () => {\n * window.location.href = '/';\n * },\n * });\n * };\n *\n * return (\n * <form onSubmit={handleSubmit}>\n * <input name=\"name\" type=\"text\" />\n * <input name=\"email\" type=\"email\" required />\n * <input name=\"password\" type=\"password\" required />\n * <button type=\"submit\" disabled={isPending}>\n * Sign up\n * </button>\n * {error && <p>{error.message}</p>}\n * </form>\n * );\n * }\n * ```\n */\n/**\n * Makes a credentials sign-up request.\n * Exported for testing purposes.\n *\n * @internal\n */\nexport async function makeCredentialsSignUpRequest(\n client: MastraClient,\n { email, password, name }: CredentialsSignUpRequest,\n): Promise<CredentialsSignUpResponse> {\n const { baseUrl = '', apiPrefix, headers: clientHeaders = {} } = client.options || {};\n const raw = (apiPrefix ?? '/api').trim();\n const normalized = raw === '' ? '' : raw.startsWith('/') ? raw : `/${raw}`;\n const prefix = normalized.replace(/\\/+$/, '');\n\n // Generic Mastra auth endpoint - works with any credentials provider\n const response = await fetch(`${baseUrl}${prefix}/auth/credentials/sign-up`, {\n method: 'POST',\n credentials: 'include',\n headers: {\n ...clientHeaders,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ email, password, name }),\n });\n\n const data = await response.json();\n\n if (!response.ok) {\n throw new Error(data.message || data.error || 'Failed to create account');\n }\n\n return data;\n}\n\nexport function useCredentialsSignUp({\n queryOptions,\n}: { queryOptions?: MastraMutationOptions<CredentialsSignUpResponse, CredentialsSignUpRequest> } = {}) {\n const client = useMastraClient();\n const queryClient = useQueryClient();\n\n return useMutation<CredentialsSignUpResponse, Error, CredentialsSignUpRequest>({\n mutationFn: ({ email, password, name }) => makeCredentialsSignUpRequest(client, { email, password, name }),\n onSuccess: () => {\n // Invalidate auth queries to refetch user state\n void queryClient.invalidateQueries({ queryKey: ['auth'] });\n },\n ...queryOptions,\n });\n}\n","import type { MastraClient } from '@mastra/client-js';\nimport { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useMastraClient } from '../../mastra-client-context';\nimport type { MastraMutationOptions } from '../shared/query-options';\n\nimport { makeSSOLoginRequest } from './sso-login';\nimport type { LogoutResponse } from './types';\n\n/**\n * Hook to initiate SSO login.\n *\n * Returns mutation to get the SSO login URL and redirect.\n *\n * @example\n * ```tsx\n * import { useSSOLogin } from '@mastra/react/hooks/auth';\n *\n * function SSOLoginButton() {\n * const { mutate: login, isPending } = useSSOLogin();\n *\n * const handleClick = () => {\n * login({ redirectUri: window.location.href }, {\n * onSuccess: (data) => {\n * window.location.href = data.url;\n * },\n * });\n * };\n *\n * return (\n * <button onClick={handleClick} disabled={isPending}>\n * Sign in with SSO\n * </button>\n * );\n * }\n * ```\n */\ntype SSOLoginResponse = Awaited<ReturnType<typeof makeSSOLoginRequest>>;\n\nexport function useSSOLogin({\n queryOptions,\n}: { queryOptions?: MastraMutationOptions<SSOLoginResponse, { redirectUri?: string }> } = {}) {\n const client = useMastraClient();\n\n return useMutation({\n mutationFn: ({ redirectUri }: { redirectUri?: string }) => makeSSOLoginRequest(client, { redirectUri }),\n ...queryOptions,\n });\n}\n\n/**\n * Hook to logout the current user.\n *\n * Destroys the current session and optionally redirects to\n * the SSO logout URL if available.\n *\n * @example\n * ```tsx\n * import { useLogout } from '@mastra/react/hooks/auth';\n *\n * function LogoutButton({ userId }: { userId: string }) {\n * const { mutate: logout, isPending } = useLogout();\n * const queryClient = useQueryClient();\n *\n * const handleLogout = () => {\n * logout({ userId }, {\n * onSuccess: (data) => {\n * queryClient.invalidateQueries({ queryKey: ['auth'] });\n * if (data.redirectTo) {\n * window.location.href = data.redirectTo;\n * } else {\n * window.location.reload();\n * }\n * },\n * });\n * };\n *\n * return (\n * <button onClick={handleLogout} disabled={isPending}>\n * Sign out\n * </button>\n * );\n * }\n * ```\n */\n/**\n * Makes a logout request.\n * Exported for testing purposes.\n *\n * @internal\n */\nexport async function makeLogoutRequest(client: Pick<MastraClient, 'options'>): Promise<LogoutResponse> {\n const { baseUrl = '', apiPrefix, headers: clientHeaders = {} } = client.options;\n const raw = (apiPrefix || '/api').trim();\n const prefix = (raw.startsWith('/') ? raw : `/${raw}`).replace(/\\/$/, '');\n\n const response = await fetch(`${baseUrl}${prefix}/auth/logout`, {\n method: 'POST',\n credentials: 'include',\n headers: {\n ...clientHeaders,\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to logout: ${response.status}`);\n }\n\n return response.json();\n}\n\nexport interface UseLogoutOptions {\n /**\n * Runs once the server has ended the session, before the mutation resolves.\n * Failures are ignored so cleanup never turns a completed sign-out into an error.\n */\n onLoggedOut?: (variables: { userId: string }) => Promise<void>;\n queryOptions?: MastraMutationOptions<LogoutResponse, { userId: string }>;\n}\n\nexport function useLogout({ onLoggedOut, queryOptions }: UseLogoutOptions = {}) {\n const client = useMastraClient();\n const queryClient = useQueryClient();\n\n return useMutation<LogoutResponse, Error, { userId: string }>({\n mutationFn: async variables => {\n const response = await makeLogoutRequest(client);\n await onLoggedOut?.(variables).catch(() => {});\n return response;\n },\n onSuccess: () => {\n // Invalidate all auth-related queries\n void queryClient.invalidateQueries({ queryKey: ['auth'] });\n },\n ...queryOptions,\n });\n}\n"],"mappings":"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"}
@@ -2,7 +2,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_mastra_client_context = require("../../mastra-client-context-DzX3f0RF.cjs");
3
3
  let _tanstack_react_query = require("@tanstack/react-query");
4
4
  //#region src/hooks/capabilities/use-observability-capabilities.ts
5
- const OBSERVABILITY_CAPABILITIES_STALE_TIME = 1440 * 60 * 1e3;
5
+ const OBSERVABILITY_CAPABILITIES_STALE_TIME = 864e5;
6
6
  const useObservabilityCapabilities = ({ queryOptions } = {}) => {
7
7
  const client = require_mastra_client_context.useMastraClient();
8
8
  return (0, _tanstack_react_query.useQuery)({
@@ -27,6 +27,32 @@ const useTraceQueryAvailable = () => {
27
27
  };
28
28
  };
29
29
  //#endregion
30
+ //#region src/hooks/capabilities/use-span-query-available.ts
31
+ /**
32
+ * `enabled` stays false while capabilities load. Servers without the
33
+ * capabilities endpoint predate span query, so they fall back to `false`.
34
+ */
35
+ const useSpanQueryAvailable = () => {
36
+ const { data, isLoading } = useObservabilityCapabilities();
37
+ return {
38
+ isLoading,
39
+ enabled: !isLoading && (data?.capabilities.spanQuery ?? false)
40
+ };
41
+ };
42
+ //#endregion
43
+ //#region src/hooks/capabilities/use-thread-query-available.ts
44
+ /**
45
+ * `enabled` stays false while capabilities load. Servers without the
46
+ * capabilities endpoint predate thread rows, so they fall back to `false`.
47
+ */
48
+ const useThreadQueryAvailable = () => {
49
+ const { data, isLoading } = useObservabilityCapabilities();
50
+ return {
51
+ isLoading,
52
+ enabled: !isLoading && (data?.capabilities.threadQueryRows ?? false)
53
+ };
54
+ };
55
+ //#endregion
30
56
  //#region src/hooks/capabilities/use-trace-aggregate-available.ts
31
57
  /**
32
58
  * Whether the server can answer `aggregateTraces()`. `enabled` stays false while capabilities load.
@@ -41,6 +67,19 @@ const useTraceAggregateAvailable = () => {
41
67
  };
42
68
  };
43
69
  //#endregion
70
+ //#region src/hooks/capabilities/use-span-aggregate-available.ts
71
+ /**
72
+ * Whether the server can answer `aggregateSpans()`. `enabled` stays false while capabilities load.
73
+ * A missing `spanAggregate` (an older server) or a missing capabilities endpoint means aggregation is unavailable.
74
+ */
75
+ const useSpanAggregateAvailable = () => {
76
+ const { data, isLoading } = useObservabilityCapabilities();
77
+ return {
78
+ isLoading,
79
+ enabled: !isLoading && data?.capabilities.spanAggregate === true
80
+ };
81
+ };
82
+ //#endregion
44
83
  //#region src/hooks/capabilities/use-trace-query-discovery-available.ts
45
84
  /**
46
85
  * Whether the store supports trace query field/value discovery. Callers combine it with
@@ -69,6 +108,20 @@ const useTraceQueryRootDurationAvailable = () => {
69
108
  };
70
109
  };
71
110
  //#endregion
111
+ //#region src/hooks/capabilities/use-trace-query-delta-polling-available.ts
112
+ /**
113
+ * Whether the store supports delta polling (`queryTraces({ mode: 'delta' })`).
114
+ * `enabled` stays false while capabilities load, and also when the capability is missing: older
115
+ * servers answer delta requests with 501, so this does not fall back to `true`.
116
+ */
117
+ const useTraceQueryDeltaPollingAvailable = () => {
118
+ const { data, isLoading } = useObservabilityCapabilities();
119
+ return {
120
+ isLoading,
121
+ enabled: !isLoading && (data?.capabilities.deltaPolling ?? false)
122
+ };
123
+ };
124
+ //#endregion
72
125
  //#region src/hooks/capabilities/use-feedback-available.ts
73
126
  /**
74
127
  * `enabled` stays false while capabilities load. Servers without the
@@ -84,8 +137,12 @@ const useFeedbackAvailable = () => {
84
137
  //#endregion
85
138
  exports.useFeedbackAvailable = useFeedbackAvailable;
86
139
  exports.useObservabilityCapabilities = useObservabilityCapabilities;
140
+ exports.useSpanAggregateAvailable = useSpanAggregateAvailable;
141
+ exports.useSpanQueryAvailable = useSpanQueryAvailable;
142
+ exports.useThreadQueryAvailable = useThreadQueryAvailable;
87
143
  exports.useTraceAggregateAvailable = useTraceAggregateAvailable;
88
144
  exports.useTraceQueryAvailable = useTraceQueryAvailable;
145
+ exports.useTraceQueryDeltaPollingAvailable = useTraceQueryDeltaPollingAvailable;
89
146
  exports.useTraceQueryDiscoveryAvailable = useTraceQueryDiscoveryAvailable;
90
147
  exports.useTraceQueryRootDurationAvailable = useTraceQueryRootDurationAvailable;
91
148
 
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["useMastraClient"],"sources":["../../../src/hooks/capabilities/use-observability-capabilities.ts","../../../src/hooks/capabilities/use-trace-query-available.ts","../../../src/hooks/capabilities/use-trace-aggregate-available.ts","../../../src/hooks/capabilities/use-trace-query-discovery-available.ts","../../../src/hooks/capabilities/use-trace-query-root-duration-available.ts","../../../src/hooks/capabilities/use-feedback-available.ts"],"sourcesContent":["import type { MastraClient } from '@mastra/client-js';\nimport type { UseQueryResult } from '@tanstack/react-query';\nimport { useQuery } from '@tanstack/react-query';\nimport { useMastraClient } from '../../mastra-client-context';\nimport type { MastraQueryOptions } from '../shared/query-options';\n\nconst OBSERVABILITY_CAPABILITIES_STALE_TIME = 24 * 60 * 60 * 1000;\n\ntype ObservabilityCapabilitiesResponse = Awaited<ReturnType<MastraClient['getObservabilityCapabilities']>>;\n\nexport const useObservabilityCapabilities = <TData = ObservabilityCapabilitiesResponse>({\n queryOptions,\n}: { queryOptions?: MastraQueryOptions<ObservabilityCapabilitiesResponse, TData> } = {}): UseQueryResult<\n TData,\n Error\n> => {\n const client = useMastraClient();\n\n return useQuery({\n queryKey: ['observability-capabilities'],\n queryFn: () => client.getObservabilityCapabilities(),\n retry: false,\n staleTime: OBSERVABILITY_CAPABILITIES_STALE_TIME,\n ...queryOptions,\n });\n};\n","import { useObservabilityCapabilities } from './use-observability-capabilities';\n\n/**\n * `enabled` stays false while capabilities load. Servers without the\n * capabilities endpoint fall back to `true` (trace query was the default before).\n */\nexport const useTraceQueryAvailable = (): { isLoading: boolean; enabled: boolean } => {\n const { data, isLoading } = useObservabilityCapabilities();\n\n return {\n isLoading,\n enabled: !isLoading && (data?.capabilities.traceQuery ?? true),\n };\n};\n","import { useObservabilityCapabilities } from './use-observability-capabilities';\n\n/**\n * Whether the server can answer `aggregateTraces()`. `enabled` stays false while capabilities load.\n * Unlike trace query, a missing `traceAggregate` (an older server) or a missing capabilities endpoint\n * means aggregation is unavailable.\n */\nexport const useTraceAggregateAvailable = (): { isLoading: boolean; enabled: boolean } => {\n const { data, isLoading } = useObservabilityCapabilities();\n\n return {\n isLoading,\n enabled: !isLoading && data?.capabilities.traceAggregate === true,\n };\n};\n","import { useObservabilityCapabilities } from './use-observability-capabilities';\n\n/**\n * Whether the store supports trace query field/value discovery. Callers combine it with\n * `useTraceQueryAvailable` when they also need the trace query API. `enabled` stays false\n * while capabilities load; servers without the capabilities endpoint fall back to `true`.\n */\nexport const useTraceQueryDiscoveryAvailable = (): { isLoading: boolean; enabled: boolean } => {\n const { data, isLoading } = useObservabilityCapabilities();\n\n return {\n isLoading,\n enabled: !isLoading && (data?.capabilities.traceQueryDiscovery ?? true),\n };\n};\n","import { useObservabilityCapabilities } from './use-observability-capabilities';\n\n/**\n * Whether the store supports trace-level `durationMs` (root duration) predicates in trace queries.\n * `enabled` stays false while capabilities load, and also when the capability is missing: older\n * servers reject `durationMs` predicates, so this does not fall back to `true`.\n */\nexport const useTraceQueryRootDurationAvailable = (): { isLoading: boolean; enabled: boolean } => {\n const { data, isLoading } = useObservabilityCapabilities();\n\n return {\n isLoading,\n enabled: !isLoading && (data?.capabilities.traceQueryRootDuration ?? false),\n };\n};\n","import { useObservabilityCapabilities } from './use-observability-capabilities';\n\n/**\n * `enabled` stays false while capabilities load. Servers without the\n * capabilities endpoint fall back to `true` (feedback was shown by default before).\n */\nexport const useFeedbackAvailable = (): { isLoading: boolean; enabled: boolean } => {\n const { data, isLoading } = useObservabilityCapabilities();\n\n return {\n isLoading,\n enabled: !isLoading && (data?.capabilities.feedback ?? true),\n };\n};\n"],"mappings":";;;;AAMA,MAAM,wCAAwC,OAAU,KAAK;AAI7D,MAAa,gCAA2E,EACtF,iBACmF,CAAC,MAGjF;CACH,MAAM,SAASA,8BAAAA,gBAAgB;CAE/B,QAAA,GAAA,sBAAA,SAAA,CAAgB;EACd,UAAU,CAAC,4BAA4B;EACvC,eAAe,OAAO,6BAA6B;EACnD,OAAO;EACP,WAAW;EACX,GAAG;CACL,CAAC;AACH;;;;;;;ACnBA,MAAa,+BAAyE;CACpF,MAAM,EAAE,MAAM,cAAc,6BAA6B;CAEzD,OAAO;EACL;EACA,SAAS,CAAC,cAAc,MAAM,aAAa,cAAc;CAC3D;AACF;;;;;;;;ACNA,MAAa,mCAA6E;CACxF,MAAM,EAAE,MAAM,cAAc,6BAA6B;CAEzD,OAAO;EACL;EACA,SAAS,CAAC,aAAa,MAAM,aAAa,mBAAmB;CAC/D;AACF;;;;;;;;ACPA,MAAa,wCAAkF;CAC7F,MAAM,EAAE,MAAM,cAAc,6BAA6B;CAEzD,OAAO;EACL;EACA,SAAS,CAAC,cAAc,MAAM,aAAa,uBAAuB;CACpE;AACF;;;;;;;;ACPA,MAAa,2CAAqF;CAChG,MAAM,EAAE,MAAM,cAAc,6BAA6B;CAEzD,OAAO;EACL;EACA,SAAS,CAAC,cAAc,MAAM,aAAa,0BAA0B;CACvE;AACF;;;;;;;ACRA,MAAa,6BAAuE;CAClF,MAAM,EAAE,MAAM,cAAc,6BAA6B;CAEzD,OAAO;EACL;EACA,SAAS,CAAC,cAAc,MAAM,aAAa,YAAY;CACzD;AACF"}
1
+ {"version":3,"file":"index.cjs","names":["useMastraClient","useQuery"],"sources":["../../../src/hooks/capabilities/use-observability-capabilities.ts","../../../src/hooks/capabilities/use-trace-query-available.ts","../../../src/hooks/capabilities/use-span-query-available.ts","../../../src/hooks/capabilities/use-thread-query-available.ts","../../../src/hooks/capabilities/use-trace-aggregate-available.ts","../../../src/hooks/capabilities/use-span-aggregate-available.ts","../../../src/hooks/capabilities/use-trace-query-discovery-available.ts","../../../src/hooks/capabilities/use-trace-query-root-duration-available.ts","../../../src/hooks/capabilities/use-trace-query-delta-polling-available.ts","../../../src/hooks/capabilities/use-feedback-available.ts"],"sourcesContent":["import type { MastraClient } from '@mastra/client-js';\nimport type { UseQueryResult } from '@tanstack/react-query';\nimport { useQuery } from '@tanstack/react-query';\nimport { useMastraClient } from '../../mastra-client-context';\nimport type { MastraQueryOptions } from '../shared/query-options';\n\nconst OBSERVABILITY_CAPABILITIES_STALE_TIME = 24 * 60 * 60 * 1000;\n\ntype ObservabilityCapabilitiesResponse = Awaited<ReturnType<MastraClient['getObservabilityCapabilities']>>;\n\nexport const useObservabilityCapabilities = <TData = ObservabilityCapabilitiesResponse>({\n queryOptions,\n}: { queryOptions?: MastraQueryOptions<ObservabilityCapabilitiesResponse, TData> } = {}): UseQueryResult<\n TData,\n Error\n> => {\n const client = useMastraClient();\n\n return useQuery({\n queryKey: ['observability-capabilities'],\n queryFn: () => client.getObservabilityCapabilities(),\n retry: false,\n staleTime: OBSERVABILITY_CAPABILITIES_STALE_TIME,\n ...queryOptions,\n });\n};\n","import { useObservabilityCapabilities } from './use-observability-capabilities';\n\n/**\n * `enabled` stays false while capabilities load. Servers without the\n * capabilities endpoint fall back to `true` (trace query was the default before).\n */\nexport const useTraceQueryAvailable = (): { isLoading: boolean; enabled: boolean } => {\n const { data, isLoading } = useObservabilityCapabilities();\n\n return {\n isLoading,\n enabled: !isLoading && (data?.capabilities.traceQuery ?? true),\n };\n};\n","import { useObservabilityCapabilities } from './use-observability-capabilities';\n\n/**\n * `enabled` stays false while capabilities load. Servers without the\n * capabilities endpoint predate span query, so they fall back to `false`.\n */\nexport const useSpanQueryAvailable = (): { isLoading: boolean; enabled: boolean } => {\n const { data, isLoading } = useObservabilityCapabilities();\n\n return {\n isLoading,\n enabled: !isLoading && (data?.capabilities.spanQuery ?? false),\n };\n};\n","import { useObservabilityCapabilities } from './use-observability-capabilities';\n\n/**\n * `enabled` stays false while capabilities load. Servers without the\n * capabilities endpoint predate thread rows, so they fall back to `false`.\n */\nexport const useThreadQueryAvailable = (): { isLoading: boolean; enabled: boolean } => {\n const { data, isLoading } = useObservabilityCapabilities();\n\n return {\n isLoading,\n enabled: !isLoading && (data?.capabilities.threadQueryRows ?? false),\n };\n};\n","import { useObservabilityCapabilities } from './use-observability-capabilities';\n\n/**\n * Whether the server can answer `aggregateTraces()`. `enabled` stays false while capabilities load.\n * Unlike trace query, a missing `traceAggregate` (an older server) or a missing capabilities endpoint\n * means aggregation is unavailable.\n */\nexport const useTraceAggregateAvailable = (): { isLoading: boolean; enabled: boolean } => {\n const { data, isLoading } = useObservabilityCapabilities();\n\n return {\n isLoading,\n enabled: !isLoading && data?.capabilities.traceAggregate === true,\n };\n};\n","import { useObservabilityCapabilities } from './use-observability-capabilities';\n\n/**\n * Whether the server can answer `aggregateSpans()`. `enabled` stays false while capabilities load.\n * A missing `spanAggregate` (an older server) or a missing capabilities endpoint means aggregation is unavailable.\n */\nexport const useSpanAggregateAvailable = (): { isLoading: boolean; enabled: boolean } => {\n const { data, isLoading } = useObservabilityCapabilities();\n\n return {\n isLoading,\n enabled: !isLoading && data?.capabilities.spanAggregate === true,\n };\n};\n","import { useObservabilityCapabilities } from './use-observability-capabilities';\n\n/**\n * Whether the store supports trace query field/value discovery. Callers combine it with\n * `useTraceQueryAvailable` when they also need the trace query API. `enabled` stays false\n * while capabilities load; servers without the capabilities endpoint fall back to `true`.\n */\nexport const useTraceQueryDiscoveryAvailable = (): { isLoading: boolean; enabled: boolean } => {\n const { data, isLoading } = useObservabilityCapabilities();\n\n return {\n isLoading,\n enabled: !isLoading && (data?.capabilities.traceQueryDiscovery ?? true),\n };\n};\n","import { useObservabilityCapabilities } from './use-observability-capabilities';\n\n/**\n * Whether the store supports trace-level `durationMs` (root duration) predicates in trace queries.\n * `enabled` stays false while capabilities load, and also when the capability is missing: older\n * servers reject `durationMs` predicates, so this does not fall back to `true`.\n */\nexport const useTraceQueryRootDurationAvailable = (): { isLoading: boolean; enabled: boolean } => {\n const { data, isLoading } = useObservabilityCapabilities();\n\n return {\n isLoading,\n enabled: !isLoading && (data?.capabilities.traceQueryRootDuration ?? false),\n };\n};\n","import { useObservabilityCapabilities } from './use-observability-capabilities';\n\n/**\n * Whether the store supports delta polling (`queryTraces({ mode: 'delta' })`).\n * `enabled` stays false while capabilities load, and also when the capability is missing: older\n * servers answer delta requests with 501, so this does not fall back to `true`.\n */\nexport const useTraceQueryDeltaPollingAvailable = (): { isLoading: boolean; enabled: boolean } => {\n const { data, isLoading } = useObservabilityCapabilities();\n\n return {\n isLoading,\n enabled: !isLoading && (data?.capabilities.deltaPolling ?? false),\n };\n};\n","import { useObservabilityCapabilities } from './use-observability-capabilities';\n\n/**\n * `enabled` stays false while capabilities load. Servers without the\n * capabilities endpoint fall back to `true` (feedback was shown by default before).\n */\nexport const useFeedbackAvailable = (): { isLoading: boolean; enabled: boolean } => {\n const { data, isLoading } = useObservabilityCapabilities();\n\n return {\n isLoading,\n enabled: !isLoading && (data?.capabilities.feedback ?? true),\n };\n};\n"],"mappings":";;;;AAMA,MAAM,wCAAwC;AAI9C,MAAa,gCAA2E,EACtF,iBACmF,CAAC,MAGjF;CACH,MAAM,SAASA,8BAAAA,gBAAgB;CAE/B,QAAA,GAAOC,sBAAAA,SAAAA,CAAS;EACd,UAAU,CAAC,4BAA4B;EACvC,eAAe,OAAO,6BAA6B;EACnD,OAAO;EACP,WAAW;EACX,GAAG;CACL,CAAC;AACH;;;;;;;ACnBA,MAAa,+BAAyE;CACpF,MAAM,EAAE,MAAM,cAAc,6BAA6B;CAEzD,OAAO;EACL;EACA,SAAS,CAAC,cAAc,MAAM,aAAa,cAAc;CAC3D;AACF;;;;;;;ACPA,MAAa,8BAAwE;CACnF,MAAM,EAAE,MAAM,cAAc,6BAA6B;CAEzD,OAAO;EACL;EACA,SAAS,CAAC,cAAc,MAAM,aAAa,aAAa;CAC1D;AACF;;;;;;;ACPA,MAAa,gCAA0E;CACrF,MAAM,EAAE,MAAM,cAAc,6BAA6B;CAEzD,OAAO;EACL;EACA,SAAS,CAAC,cAAc,MAAM,aAAa,mBAAmB;CAChE;AACF;;;;;;;;ACNA,MAAa,mCAA6E;CACxF,MAAM,EAAE,MAAM,cAAc,6BAA6B;CAEzD,OAAO;EACL;EACA,SAAS,CAAC,aAAa,MAAM,aAAa,mBAAmB;CAC/D;AACF;;;;;;;ACRA,MAAa,kCAA4E;CACvF,MAAM,EAAE,MAAM,cAAc,6BAA6B;CAEzD,OAAO;EACL;EACA,SAAS,CAAC,aAAa,MAAM,aAAa,kBAAkB;CAC9D;AACF;;;;;;;;ACNA,MAAa,wCAAkF;CAC7F,MAAM,EAAE,MAAM,cAAc,6BAA6B;CAEzD,OAAO;EACL;EACA,SAAS,CAAC,cAAc,MAAM,aAAa,uBAAuB;CACpE;AACF;;;;;;;;ACPA,MAAa,2CAAqF;CAChG,MAAM,EAAE,MAAM,cAAc,6BAA6B;CAEzD,OAAO;EACL;EACA,SAAS,CAAC,cAAc,MAAM,aAAa,0BAA0B;CACvE;AACF;;;;;;;;ACPA,MAAa,2CAAqF;CAChG,MAAM,EAAE,MAAM,cAAc,6BAA6B;CAEzD,OAAO;EACL;EACA,SAAS,CAAC,cAAc,MAAM,aAAa,gBAAgB;CAC7D;AACF;;;;;;;ACRA,MAAa,6BAAuE;CAClF,MAAM,EAAE,MAAM,cAAc,6BAA6B;CAEzD,OAAO;EACL;EACA,SAAS,CAAC,cAAc,MAAM,aAAa,YAAY;CACzD;AACF"}
@@ -1,7 +1,11 @@
1
1
  export * from './use-observability-capabilities.js';
2
2
  export * from './use-trace-query-available.js';
3
+ export * from './use-span-query-available.js';
4
+ export * from './use-thread-query-available.js';
3
5
  export * from './use-trace-aggregate-available.js';
6
+ export * from './use-span-aggregate-available.js';
4
7
  export * from './use-trace-query-discovery-available.js';
5
8
  export * from './use-trace-query-root-duration-available.js';
9
+ export * from './use-trace-query-delta-polling-available.js';
6
10
  export * from './use-feedback-available.js';
7
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/hooks/capabilities/index.ts"],"names":[],"mappings":"AAAA,cAAc,kCAAkC,CAAC;AACjD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iCAAiC,CAAC;AAChD,cAAc,uCAAuC,CAAC;AACtD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/hooks/capabilities/index.ts"],"names":[],"mappings":"AAAA,cAAc,kCAAkC,CAAC;AACjD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iCAAiC,CAAC;AAChD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,uCAAuC,CAAC;AACtD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,2CAA2C,CAAC;AAC1D,cAAc,0BAA0B,CAAC"}
@@ -1,7 +1,7 @@
1
1
  import { n as useMastraClient } from "../../mastra-client-context-Bx_g84YB.js";
2
2
  import { useQuery } from "@tanstack/react-query";
3
3
  //#region src/hooks/capabilities/use-observability-capabilities.ts
4
- const OBSERVABILITY_CAPABILITIES_STALE_TIME = 1440 * 60 * 1e3;
4
+ const OBSERVABILITY_CAPABILITIES_STALE_TIME = 864e5;
5
5
  const useObservabilityCapabilities = ({ queryOptions } = {}) => {
6
6
  const client = useMastraClient();
7
7
  return useQuery({
@@ -26,6 +26,32 @@ const useTraceQueryAvailable = () => {
26
26
  };
27
27
  };
28
28
  //#endregion
29
+ //#region src/hooks/capabilities/use-span-query-available.ts
30
+ /**
31
+ * `enabled` stays false while capabilities load. Servers without the
32
+ * capabilities endpoint predate span query, so they fall back to `false`.
33
+ */
34
+ const useSpanQueryAvailable = () => {
35
+ const { data, isLoading } = useObservabilityCapabilities();
36
+ return {
37
+ isLoading,
38
+ enabled: !isLoading && (data?.capabilities.spanQuery ?? false)
39
+ };
40
+ };
41
+ //#endregion
42
+ //#region src/hooks/capabilities/use-thread-query-available.ts
43
+ /**
44
+ * `enabled` stays false while capabilities load. Servers without the
45
+ * capabilities endpoint predate thread rows, so they fall back to `false`.
46
+ */
47
+ const useThreadQueryAvailable = () => {
48
+ const { data, isLoading } = useObservabilityCapabilities();
49
+ return {
50
+ isLoading,
51
+ enabled: !isLoading && (data?.capabilities.threadQueryRows ?? false)
52
+ };
53
+ };
54
+ //#endregion
29
55
  //#region src/hooks/capabilities/use-trace-aggregate-available.ts
30
56
  /**
31
57
  * Whether the server can answer `aggregateTraces()`. `enabled` stays false while capabilities load.
@@ -40,6 +66,19 @@ const useTraceAggregateAvailable = () => {
40
66
  };
41
67
  };
42
68
  //#endregion
69
+ //#region src/hooks/capabilities/use-span-aggregate-available.ts
70
+ /**
71
+ * Whether the server can answer `aggregateSpans()`. `enabled` stays false while capabilities load.
72
+ * A missing `spanAggregate` (an older server) or a missing capabilities endpoint means aggregation is unavailable.
73
+ */
74
+ const useSpanAggregateAvailable = () => {
75
+ const { data, isLoading } = useObservabilityCapabilities();
76
+ return {
77
+ isLoading,
78
+ enabled: !isLoading && data?.capabilities.spanAggregate === true
79
+ };
80
+ };
81
+ //#endregion
43
82
  //#region src/hooks/capabilities/use-trace-query-discovery-available.ts
44
83
  /**
45
84
  * Whether the store supports trace query field/value discovery. Callers combine it with
@@ -68,6 +107,20 @@ const useTraceQueryRootDurationAvailable = () => {
68
107
  };
69
108
  };
70
109
  //#endregion
110
+ //#region src/hooks/capabilities/use-trace-query-delta-polling-available.ts
111
+ /**
112
+ * Whether the store supports delta polling (`queryTraces({ mode: 'delta' })`).
113
+ * `enabled` stays false while capabilities load, and also when the capability is missing: older
114
+ * servers answer delta requests with 501, so this does not fall back to `true`.
115
+ */
116
+ const useTraceQueryDeltaPollingAvailable = () => {
117
+ const { data, isLoading } = useObservabilityCapabilities();
118
+ return {
119
+ isLoading,
120
+ enabled: !isLoading && (data?.capabilities.deltaPolling ?? false)
121
+ };
122
+ };
123
+ //#endregion
71
124
  //#region src/hooks/capabilities/use-feedback-available.ts
72
125
  /**
73
126
  * `enabled` stays false while capabilities load. Servers without the
@@ -81,6 +134,6 @@ const useFeedbackAvailable = () => {
81
134
  };
82
135
  };
83
136
  //#endregion
84
- export { useFeedbackAvailable, useObservabilityCapabilities, useTraceAggregateAvailable, useTraceQueryAvailable, useTraceQueryDiscoveryAvailable, useTraceQueryRootDurationAvailable };
137
+ export { useFeedbackAvailable, useObservabilityCapabilities, useSpanAggregateAvailable, useSpanQueryAvailable, useThreadQueryAvailable, useTraceAggregateAvailable, useTraceQueryAvailable, useTraceQueryDeltaPollingAvailable, useTraceQueryDiscoveryAvailable, useTraceQueryRootDurationAvailable };
85
138
 
86
139
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/hooks/capabilities/use-observability-capabilities.ts","../../../src/hooks/capabilities/use-trace-query-available.ts","../../../src/hooks/capabilities/use-trace-aggregate-available.ts","../../../src/hooks/capabilities/use-trace-query-discovery-available.ts","../../../src/hooks/capabilities/use-trace-query-root-duration-available.ts","../../../src/hooks/capabilities/use-feedback-available.ts"],"sourcesContent":["import type { MastraClient } from '@mastra/client-js';\nimport type { UseQueryResult } from '@tanstack/react-query';\nimport { useQuery } from '@tanstack/react-query';\nimport { useMastraClient } from '../../mastra-client-context';\nimport type { MastraQueryOptions } from '../shared/query-options';\n\nconst OBSERVABILITY_CAPABILITIES_STALE_TIME = 24 * 60 * 60 * 1000;\n\ntype ObservabilityCapabilitiesResponse = Awaited<ReturnType<MastraClient['getObservabilityCapabilities']>>;\n\nexport const useObservabilityCapabilities = <TData = ObservabilityCapabilitiesResponse>({\n queryOptions,\n}: { queryOptions?: MastraQueryOptions<ObservabilityCapabilitiesResponse, TData> } = {}): UseQueryResult<\n TData,\n Error\n> => {\n const client = useMastraClient();\n\n return useQuery({\n queryKey: ['observability-capabilities'],\n queryFn: () => client.getObservabilityCapabilities(),\n retry: false,\n staleTime: OBSERVABILITY_CAPABILITIES_STALE_TIME,\n ...queryOptions,\n });\n};\n","import { useObservabilityCapabilities } from './use-observability-capabilities';\n\n/**\n * `enabled` stays false while capabilities load. Servers without the\n * capabilities endpoint fall back to `true` (trace query was the default before).\n */\nexport const useTraceQueryAvailable = (): { isLoading: boolean; enabled: boolean } => {\n const { data, isLoading } = useObservabilityCapabilities();\n\n return {\n isLoading,\n enabled: !isLoading && (data?.capabilities.traceQuery ?? true),\n };\n};\n","import { useObservabilityCapabilities } from './use-observability-capabilities';\n\n/**\n * Whether the server can answer `aggregateTraces()`. `enabled` stays false while capabilities load.\n * Unlike trace query, a missing `traceAggregate` (an older server) or a missing capabilities endpoint\n * means aggregation is unavailable.\n */\nexport const useTraceAggregateAvailable = (): { isLoading: boolean; enabled: boolean } => {\n const { data, isLoading } = useObservabilityCapabilities();\n\n return {\n isLoading,\n enabled: !isLoading && data?.capabilities.traceAggregate === true,\n };\n};\n","import { useObservabilityCapabilities } from './use-observability-capabilities';\n\n/**\n * Whether the store supports trace query field/value discovery. Callers combine it with\n * `useTraceQueryAvailable` when they also need the trace query API. `enabled` stays false\n * while capabilities load; servers without the capabilities endpoint fall back to `true`.\n */\nexport const useTraceQueryDiscoveryAvailable = (): { isLoading: boolean; enabled: boolean } => {\n const { data, isLoading } = useObservabilityCapabilities();\n\n return {\n isLoading,\n enabled: !isLoading && (data?.capabilities.traceQueryDiscovery ?? true),\n };\n};\n","import { useObservabilityCapabilities } from './use-observability-capabilities';\n\n/**\n * Whether the store supports trace-level `durationMs` (root duration) predicates in trace queries.\n * `enabled` stays false while capabilities load, and also when the capability is missing: older\n * servers reject `durationMs` predicates, so this does not fall back to `true`.\n */\nexport const useTraceQueryRootDurationAvailable = (): { isLoading: boolean; enabled: boolean } => {\n const { data, isLoading } = useObservabilityCapabilities();\n\n return {\n isLoading,\n enabled: !isLoading && (data?.capabilities.traceQueryRootDuration ?? false),\n };\n};\n","import { useObservabilityCapabilities } from './use-observability-capabilities';\n\n/**\n * `enabled` stays false while capabilities load. Servers without the\n * capabilities endpoint fall back to `true` (feedback was shown by default before).\n */\nexport const useFeedbackAvailable = (): { isLoading: boolean; enabled: boolean } => {\n const { data, isLoading } = useObservabilityCapabilities();\n\n return {\n isLoading,\n enabled: !isLoading && (data?.capabilities.feedback ?? true),\n };\n};\n"],"mappings":";;;AAMA,MAAM,wCAAwC,OAAU,KAAK;AAI7D,MAAa,gCAA2E,EACtF,iBACmF,CAAC,MAGjF;CACH,MAAM,SAAS,gBAAgB;CAE/B,OAAO,SAAS;EACd,UAAU,CAAC,4BAA4B;EACvC,eAAe,OAAO,6BAA6B;EACnD,OAAO;EACP,WAAW;EACX,GAAG;CACL,CAAC;AACH;;;;;;;ACnBA,MAAa,+BAAyE;CACpF,MAAM,EAAE,MAAM,cAAc,6BAA6B;CAEzD,OAAO;EACL;EACA,SAAS,CAAC,cAAc,MAAM,aAAa,cAAc;CAC3D;AACF;;;;;;;;ACNA,MAAa,mCAA6E;CACxF,MAAM,EAAE,MAAM,cAAc,6BAA6B;CAEzD,OAAO;EACL;EACA,SAAS,CAAC,aAAa,MAAM,aAAa,mBAAmB;CAC/D;AACF;;;;;;;;ACPA,MAAa,wCAAkF;CAC7F,MAAM,EAAE,MAAM,cAAc,6BAA6B;CAEzD,OAAO;EACL;EACA,SAAS,CAAC,cAAc,MAAM,aAAa,uBAAuB;CACpE;AACF;;;;;;;;ACPA,MAAa,2CAAqF;CAChG,MAAM,EAAE,MAAM,cAAc,6BAA6B;CAEzD,OAAO;EACL;EACA,SAAS,CAAC,cAAc,MAAM,aAAa,0BAA0B;CACvE;AACF;;;;;;;ACRA,MAAa,6BAAuE;CAClF,MAAM,EAAE,MAAM,cAAc,6BAA6B;CAEzD,OAAO;EACL;EACA,SAAS,CAAC,cAAc,MAAM,aAAa,YAAY;CACzD;AACF"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/hooks/capabilities/use-observability-capabilities.ts","../../../src/hooks/capabilities/use-trace-query-available.ts","../../../src/hooks/capabilities/use-span-query-available.ts","../../../src/hooks/capabilities/use-thread-query-available.ts","../../../src/hooks/capabilities/use-trace-aggregate-available.ts","../../../src/hooks/capabilities/use-span-aggregate-available.ts","../../../src/hooks/capabilities/use-trace-query-discovery-available.ts","../../../src/hooks/capabilities/use-trace-query-root-duration-available.ts","../../../src/hooks/capabilities/use-trace-query-delta-polling-available.ts","../../../src/hooks/capabilities/use-feedback-available.ts"],"sourcesContent":["import type { MastraClient } from '@mastra/client-js';\nimport type { UseQueryResult } from '@tanstack/react-query';\nimport { useQuery } from '@tanstack/react-query';\nimport { useMastraClient } from '../../mastra-client-context';\nimport type { MastraQueryOptions } from '../shared/query-options';\n\nconst OBSERVABILITY_CAPABILITIES_STALE_TIME = 24 * 60 * 60 * 1000;\n\ntype ObservabilityCapabilitiesResponse = Awaited<ReturnType<MastraClient['getObservabilityCapabilities']>>;\n\nexport const useObservabilityCapabilities = <TData = ObservabilityCapabilitiesResponse>({\n queryOptions,\n}: { queryOptions?: MastraQueryOptions<ObservabilityCapabilitiesResponse, TData> } = {}): UseQueryResult<\n TData,\n Error\n> => {\n const client = useMastraClient();\n\n return useQuery({\n queryKey: ['observability-capabilities'],\n queryFn: () => client.getObservabilityCapabilities(),\n retry: false,\n staleTime: OBSERVABILITY_CAPABILITIES_STALE_TIME,\n ...queryOptions,\n });\n};\n","import { useObservabilityCapabilities } from './use-observability-capabilities';\n\n/**\n * `enabled` stays false while capabilities load. Servers without the\n * capabilities endpoint fall back to `true` (trace query was the default before).\n */\nexport const useTraceQueryAvailable = (): { isLoading: boolean; enabled: boolean } => {\n const { data, isLoading } = useObservabilityCapabilities();\n\n return {\n isLoading,\n enabled: !isLoading && (data?.capabilities.traceQuery ?? true),\n };\n};\n","import { useObservabilityCapabilities } from './use-observability-capabilities';\n\n/**\n * `enabled` stays false while capabilities load. Servers without the\n * capabilities endpoint predate span query, so they fall back to `false`.\n */\nexport const useSpanQueryAvailable = (): { isLoading: boolean; enabled: boolean } => {\n const { data, isLoading } = useObservabilityCapabilities();\n\n return {\n isLoading,\n enabled: !isLoading && (data?.capabilities.spanQuery ?? false),\n };\n};\n","import { useObservabilityCapabilities } from './use-observability-capabilities';\n\n/**\n * `enabled` stays false while capabilities load. Servers without the\n * capabilities endpoint predate thread rows, so they fall back to `false`.\n */\nexport const useThreadQueryAvailable = (): { isLoading: boolean; enabled: boolean } => {\n const { data, isLoading } = useObservabilityCapabilities();\n\n return {\n isLoading,\n enabled: !isLoading && (data?.capabilities.threadQueryRows ?? false),\n };\n};\n","import { useObservabilityCapabilities } from './use-observability-capabilities';\n\n/**\n * Whether the server can answer `aggregateTraces()`. `enabled` stays false while capabilities load.\n * Unlike trace query, a missing `traceAggregate` (an older server) or a missing capabilities endpoint\n * means aggregation is unavailable.\n */\nexport const useTraceAggregateAvailable = (): { isLoading: boolean; enabled: boolean } => {\n const { data, isLoading } = useObservabilityCapabilities();\n\n return {\n isLoading,\n enabled: !isLoading && data?.capabilities.traceAggregate === true,\n };\n};\n","import { useObservabilityCapabilities } from './use-observability-capabilities';\n\n/**\n * Whether the server can answer `aggregateSpans()`. `enabled` stays false while capabilities load.\n * A missing `spanAggregate` (an older server) or a missing capabilities endpoint means aggregation is unavailable.\n */\nexport const useSpanAggregateAvailable = (): { isLoading: boolean; enabled: boolean } => {\n const { data, isLoading } = useObservabilityCapabilities();\n\n return {\n isLoading,\n enabled: !isLoading && data?.capabilities.spanAggregate === true,\n };\n};\n","import { useObservabilityCapabilities } from './use-observability-capabilities';\n\n/**\n * Whether the store supports trace query field/value discovery. Callers combine it with\n * `useTraceQueryAvailable` when they also need the trace query API. `enabled` stays false\n * while capabilities load; servers without the capabilities endpoint fall back to `true`.\n */\nexport const useTraceQueryDiscoveryAvailable = (): { isLoading: boolean; enabled: boolean } => {\n const { data, isLoading } = useObservabilityCapabilities();\n\n return {\n isLoading,\n enabled: !isLoading && (data?.capabilities.traceQueryDiscovery ?? true),\n };\n};\n","import { useObservabilityCapabilities } from './use-observability-capabilities';\n\n/**\n * Whether the store supports trace-level `durationMs` (root duration) predicates in trace queries.\n * `enabled` stays false while capabilities load, and also when the capability is missing: older\n * servers reject `durationMs` predicates, so this does not fall back to `true`.\n */\nexport const useTraceQueryRootDurationAvailable = (): { isLoading: boolean; enabled: boolean } => {\n const { data, isLoading } = useObservabilityCapabilities();\n\n return {\n isLoading,\n enabled: !isLoading && (data?.capabilities.traceQueryRootDuration ?? false),\n };\n};\n","import { useObservabilityCapabilities } from './use-observability-capabilities';\n\n/**\n * Whether the store supports delta polling (`queryTraces({ mode: 'delta' })`).\n * `enabled` stays false while capabilities load, and also when the capability is missing: older\n * servers answer delta requests with 501, so this does not fall back to `true`.\n */\nexport const useTraceQueryDeltaPollingAvailable = (): { isLoading: boolean; enabled: boolean } => {\n const { data, isLoading } = useObservabilityCapabilities();\n\n return {\n isLoading,\n enabled: !isLoading && (data?.capabilities.deltaPolling ?? false),\n };\n};\n","import { useObservabilityCapabilities } from './use-observability-capabilities';\n\n/**\n * `enabled` stays false while capabilities load. Servers without the\n * capabilities endpoint fall back to `true` (feedback was shown by default before).\n */\nexport const useFeedbackAvailable = (): { isLoading: boolean; enabled: boolean } => {\n const { data, isLoading } = useObservabilityCapabilities();\n\n return {\n isLoading,\n enabled: !isLoading && (data?.capabilities.feedback ?? true),\n };\n};\n"],"mappings":";;;AAMA,MAAM,wCAAwC;AAI9C,MAAa,gCAA2E,EACtF,iBACmF,CAAC,MAGjF;CACH,MAAM,SAAS,gBAAgB;CAE/B,OAAO,SAAS;EACd,UAAU,CAAC,4BAA4B;EACvC,eAAe,OAAO,6BAA6B;EACnD,OAAO;EACP,WAAW;EACX,GAAG;CACL,CAAC;AACH;;;;;;;ACnBA,MAAa,+BAAyE;CACpF,MAAM,EAAE,MAAM,cAAc,6BAA6B;CAEzD,OAAO;EACL;EACA,SAAS,CAAC,cAAc,MAAM,aAAa,cAAc;CAC3D;AACF;;;;;;;ACPA,MAAa,8BAAwE;CACnF,MAAM,EAAE,MAAM,cAAc,6BAA6B;CAEzD,OAAO;EACL;EACA,SAAS,CAAC,cAAc,MAAM,aAAa,aAAa;CAC1D;AACF;;;;;;;ACPA,MAAa,gCAA0E;CACrF,MAAM,EAAE,MAAM,cAAc,6BAA6B;CAEzD,OAAO;EACL;EACA,SAAS,CAAC,cAAc,MAAM,aAAa,mBAAmB;CAChE;AACF;;;;;;;;ACNA,MAAa,mCAA6E;CACxF,MAAM,EAAE,MAAM,cAAc,6BAA6B;CAEzD,OAAO;EACL;EACA,SAAS,CAAC,aAAa,MAAM,aAAa,mBAAmB;CAC/D;AACF;;;;;;;ACRA,MAAa,kCAA4E;CACvF,MAAM,EAAE,MAAM,cAAc,6BAA6B;CAEzD,OAAO;EACL;EACA,SAAS,CAAC,aAAa,MAAM,aAAa,kBAAkB;CAC9D;AACF;;;;;;;;ACNA,MAAa,wCAAkF;CAC7F,MAAM,EAAE,MAAM,cAAc,6BAA6B;CAEzD,OAAO;EACL;EACA,SAAS,CAAC,cAAc,MAAM,aAAa,uBAAuB;CACpE;AACF;;;;;;;;ACPA,MAAa,2CAAqF;CAChG,MAAM,EAAE,MAAM,cAAc,6BAA6B;CAEzD,OAAO;EACL;EACA,SAAS,CAAC,cAAc,MAAM,aAAa,0BAA0B;CACvE;AACF;;;;;;;;ACPA,MAAa,2CAAqF;CAChG,MAAM,EAAE,MAAM,cAAc,6BAA6B;CAEzD,OAAO;EACL;EACA,SAAS,CAAC,cAAc,MAAM,aAAa,gBAAgB;CAC7D;AACF;;;;;;;ACRA,MAAa,6BAAuE;CAClF,MAAM,EAAE,MAAM,cAAc,6BAA6B;CAEzD,OAAO;EACL;EACA,SAAS,CAAC,cAAc,MAAM,aAAa,YAAY;CACzD;AACF"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Whether the server can answer `aggregateSpans()`. `enabled` stays false while capabilities load.
3
+ * A missing `spanAggregate` (an older server) or a missing capabilities endpoint means aggregation is unavailable.
4
+ */
5
+ export declare const useSpanAggregateAvailable: () => {
6
+ isLoading: boolean;
7
+ enabled: boolean;
8
+ };
9
+ //# sourceMappingURL=use-span-aggregate-available.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-span-aggregate-available.d.ts","sourceRoot":"","sources":["../../../src/hooks/capabilities/use-span-aggregate-available.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,eAAO,MAAM,yBAAyB,QAAO;IAAE,SAAS,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAOlF,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * `enabled` stays false while capabilities load. Servers without the
3
+ * capabilities endpoint predate span query, so they fall back to `false`.
4
+ */
5
+ export declare const useSpanQueryAvailable: () => {
6
+ isLoading: boolean;
7
+ enabled: boolean;
8
+ };
9
+ //# sourceMappingURL=use-span-query-available.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-span-query-available.d.ts","sourceRoot":"","sources":["../../../src/hooks/capabilities/use-span-query-available.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,eAAO,MAAM,qBAAqB,QAAO;IAAE,SAAS,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAO9E,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * `enabled` stays false while capabilities load. Servers without the
3
+ * capabilities endpoint predate thread rows, so they fall back to `false`.
4
+ */
5
+ export declare const useThreadQueryAvailable: () => {
6
+ isLoading: boolean;
7
+ enabled: boolean;
8
+ };
9
+ //# sourceMappingURL=use-thread-query-available.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-thread-query-available.d.ts","sourceRoot":"","sources":["../../../src/hooks/capabilities/use-thread-query-available.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,eAAO,MAAM,uBAAuB,QAAO;IAAE,SAAS,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAOhF,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Whether the store supports delta polling (`queryTraces({ mode: 'delta' })`).
3
+ * `enabled` stays false while capabilities load, and also when the capability is missing: older
4
+ * servers answer delta requests with 501, so this does not fall back to `true`.
5
+ */
6
+ export declare const useTraceQueryDeltaPollingAvailable: () => {
7
+ isLoading: boolean;
8
+ enabled: boolean;
9
+ };
10
+ //# sourceMappingURL=use-trace-query-delta-polling-available.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-trace-query-delta-polling-available.d.ts","sourceRoot":"","sources":["../../../src/hooks/capabilities/use-trace-query-delta-polling-available.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,eAAO,MAAM,kCAAkC,QAAO;IAAE,SAAS,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAO3F,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["useMastraClient"],"sources":["../../../src/hooks/configuration/use-mastra-packages.ts"],"sourcesContent":["import type { MastraClient } from '@mastra/client-js';\nimport type { UseQueryResult } from '@tanstack/react-query';\nimport { useQuery } from '@tanstack/react-query';\nimport { useMastraClient } from '../../mastra-client-context';\nimport type { MastraQueryOptions } from '../shared/query-options';\n\ntype SystemPackagesResponse = Awaited<ReturnType<MastraClient['getSystemPackages']>>;\n\nexport const useMastraPackages = <TData = SystemPackagesResponse>({\n queryOptions,\n}: { queryOptions?: MastraQueryOptions<SystemPackagesResponse, TData> } = {}): UseQueryResult<TData, Error> => {\n const client = useMastraClient();\n\n return useQuery({\n queryKey: ['mastra-packages'],\n queryFn: () => {\n return client.getSystemPackages();\n },\n ...queryOptions,\n });\n};\n"],"mappings":";;;;AAQA,MAAa,qBAAqD,EAChE,iBACwE,CAAC,MAAoC;CAC7G,MAAM,SAASA,8BAAAA,gBAAgB;CAE/B,QAAA,GAAA,sBAAA,SAAA,CAAgB;EACd,UAAU,CAAC,iBAAiB;EAC5B,eAAe;GACb,OAAO,OAAO,kBAAkB;EAClC;EACA,GAAG;CACL,CAAC;AACH"}
1
+ {"version":3,"file":"index.cjs","names":["useMastraClient","useQuery"],"sources":["../../../src/hooks/configuration/use-mastra-packages.ts"],"sourcesContent":["import type { MastraClient } from '@mastra/client-js';\nimport type { UseQueryResult } from '@tanstack/react-query';\nimport { useQuery } from '@tanstack/react-query';\nimport { useMastraClient } from '../../mastra-client-context';\nimport type { MastraQueryOptions } from '../shared/query-options';\n\ntype SystemPackagesResponse = Awaited<ReturnType<MastraClient['getSystemPackages']>>;\n\nexport const useMastraPackages = <TData = SystemPackagesResponse>({\n queryOptions,\n}: { queryOptions?: MastraQueryOptions<SystemPackagesResponse, TData> } = {}): UseQueryResult<TData, Error> => {\n const client = useMastraClient();\n\n return useQuery({\n queryKey: ['mastra-packages'],\n queryFn: () => {\n return client.getSystemPackages();\n },\n ...queryOptions,\n });\n};\n"],"mappings":";;;;AAQA,MAAa,qBAAqD,EAChE,iBACwE,CAAC,MAAoC;CAC7G,MAAM,SAASA,8BAAAA,gBAAgB;CAE/B,QAAA,GAAOC,sBAAAA,SAAAA,CAAS;EACd,UAAU,CAAC,iBAAiB;EAC5B,eAAe;GACb,OAAO,OAAO,kBAAkB;EAClC;EACA,GAAG;CACL,CAAC;AACH"}
@@ -305,6 +305,29 @@ const useInfiniteDatasets = ({ filter, orderBy, queryOptions } = {}) => {
305
305
  setEndOfListElement
306
306
  };
307
307
  };
308
+ const DATASET_IDS_PER_REQUEST = 100;
309
+ /**
310
+ * Datasets matching the given ids, in one request per 100 ids, e.g. to name the datasets of listed
311
+ * experiments without paging through every dataset. Ids without a dataset are absent from the result.
312
+ */
313
+ const useDatasetsByIds = ({ datasetIds }) => {
314
+ const client = require_mastra_client_context.useMastraClient();
315
+ const uniqueIds = [...new Set(datasetIds)].toSorted();
316
+ return (0, _tanstack_react_query.useQuery)({
317
+ queryKey: [
318
+ "datasets",
319
+ "by-ids",
320
+ uniqueIds
321
+ ],
322
+ enabled: uniqueIds.length > 0,
323
+ queryFn: async () => {
324
+ const batches = [];
325
+ for (let index = 0; index < uniqueIds.length; index += DATASET_IDS_PER_REQUEST) batches.push(uniqueIds.slice(index, index + DATASET_IDS_PER_REQUEST));
326
+ return (await Promise.all(batches.map((batch) => client.listDatasets({ datasetIds: batch })))).flatMap((response) => response.datasets);
327
+ },
328
+ placeholderData: (previousData) => previousData
329
+ });
330
+ };
308
331
  /**
309
332
  * Hook to fetch a single dataset by ID
310
333
  *
@@ -684,7 +707,7 @@ function useWorkflowSchema({ workflowId, queryOptions }) {
684
707
  if (!workflowId) throw new Error("No workflow selected");
685
708
  return client.getWorkflow(workflowId).getSchema();
686
709
  },
687
- staleTime: 300 * 1e3,
710
+ staleTime: 3e5,
688
711
  ...queryOptions
689
712
  });
690
713
  }
@@ -705,6 +728,7 @@ exports.useDatasetItems = useDatasetItems;
705
728
  exports.useDatasetMutations = useDatasetMutations;
706
729
  exports.useDatasetVersions = useDatasetVersions;
707
730
  exports.useDatasets = useDatasets;
731
+ exports.useDatasetsByIds = useDatasetsByIds;
708
732
  exports.useExperiment = useExperiment;
709
733
  exports.useExperiments = useExperiments;
710
734
  exports.useInfiniteDatasets = useInfiniteDatasets;