{"version":3,"sources":["../src/hooks/use-ai-runtime-client.ts"],"sourcesContent":["import {\n  AiRuntimeClient,\n  AiRuntimeClientOptions,\n  GraphQLError,\n} from \"@vn-sdk/runtime-client-gql\";\nimport { useToast } from \"../components/toast/toast-provider\";\nimport { useMemo, useRef } from \"react\";\nimport {\n  ErrorVisibility,\n  AiSDKApiDiscoveryError,\n  AiSDKRemoteEndpointDiscoveryError,\n  AiSDKAgentDiscoveryError,\n  AiSDKError,\n  AiSDKErrorCode,\n  AiErrorHandler,\n  AiErrorEvent,\n} from \"@vn-sdk/shared\";\nimport { shouldShowDevConsole } from \"../utils/dev-console\";\n\nexport interface AiRuntimeClientHookOptions extends AiRuntimeClientOptions {\n  showDevConsole?: boolean;\n  onError: AiErrorHandler;\n}\n\nexport const useAiRuntimeClient = (options: AiRuntimeClientHookOptions) => {\n  const { setBannerError } = useToast();\n  const { showDevConsole, onError, ...runtimeOptions } = options;\n\n  // Deduplication state for structured errors\n  const lastStructuredErrorRef = useRef<{ message: string; timestamp: number } | null>(null);\n\n  // Helper function to trace UI errors\n  const traceUIError = async (error: AiSDKError, originalError?: any) => {\n    try {\n      const errorEvent: AiErrorEvent = {\n        type: \"error\",\n        timestamp: Date.now(),\n        context: {\n          source: \"ui\",\n          request: {\n            operation: \"runtimeClient\",\n            url: runtimeOptions.url,\n            startTime: Date.now(),\n          },\n          technical: {\n            environment: \"browser\",\n            userAgent: typeof navigator !== \"undefined\" ? navigator.userAgent : undefined,\n            stackTrace: originalError instanceof Error ? originalError.stack : undefined,\n          },\n        },\n        error,\n      };\n      await onError(errorEvent);\n    } catch (error) {\n      console.error(\"Error in onError handler:\", error);\n    }\n  };\n\n  const runtimeClient = useMemo(() => {\n    return new AiRuntimeClient({\n      ...runtimeOptions,\n      handleGQLErrors: (error) => {\n        if ((error as any).graphQLErrors?.length) {\n          const graphQLErrors = (error as any).graphQLErrors as GraphQLError[];\n\n          // Route all errors to banners for consistent UI\n          const routeError = (gqlError: GraphQLError) => {\n            const extensions = gqlError.extensions;\n            const visibility = extensions?.visibility as ErrorVisibility;\n            const isDev = shouldShowDevConsole(showDevConsole ?? false);\n\n            // Silent errors - just log\n            if (visibility === ErrorVisibility.SILENT) {\n              console.error(\"VN SDK Silent Error:\", gqlError.message);\n              return;\n            }\n\n            if (!isDev) {\n              console.error(\"VN SDK Error (hidden in production):\", gqlError.message);\n              return;\n            }\n\n            // All errors (including DEV_ONLY) show as banners for consistency\n            // Deduplicate to prevent spam\n            const now = Date.now();\n            const errorMessage = gqlError.message;\n            if (\n              lastStructuredErrorRef.current &&\n              lastStructuredErrorRef.current.message === errorMessage &&\n              now - lastStructuredErrorRef.current.timestamp < 150\n            ) {\n              return; // Skip duplicate\n            }\n            lastStructuredErrorRef.current = { message: errorMessage, timestamp: now };\n\n            const ckError = createStructuredError(gqlError);\n            if (ckError) {\n              setBannerError(ckError);\n              // Trace the error\n              traceUIError(ckError, gqlError);\n              // TODO: if onError & renderError should work without key, insert here\n            } else {\n              // Fallback for unstructured errors\n              const fallbackError = new AiSDKError({\n                message: gqlError.message,\n                code: AiSDKErrorCode.UNKNOWN,\n              });\n              setBannerError(fallbackError);\n              // Trace the fallback error\n              traceUIError(fallbackError, gqlError);\n              // TODO: if onError & renderError should work without key, insert here\n            }\n          };\n\n          // Process all errors as banners\n          graphQLErrors.forEach(routeError);\n        } else {\n          const isDev = shouldShowDevConsole(showDevConsole ?? false);\n          if (!isDev) {\n            console.error(\"VN SDK Error (hidden in production):\", error);\n          } else {\n            // Route non-GraphQL errors to banner as well\n            const fallbackError = new AiSDKError({\n              message: error?.message || String(error),\n              code: AiSDKErrorCode.UNKNOWN,\n            });\n            setBannerError(fallbackError);\n            // Trace the non-GraphQL error\n            traceUIError(fallbackError, error);\n            // TODO: if onError & renderError should work without key, insert here\n          }\n        }\n      },\n      handleGQLWarning: (message: string) => {\n        console.warn(message);\n        // Show warnings as banners too for consistency\n        const warningError = new AiSDKError({\n          message,\n          code: AiSDKErrorCode.UNKNOWN,\n        });\n        setBannerError(warningError);\n      },\n    });\n  }, [runtimeOptions, setBannerError, showDevConsole, onError]);\n\n  return runtimeClient;\n};\n\n// Create appropriate structured error from GraphQL error\nfunction createStructuredError(gqlError: GraphQLError): AiSDKError | null {\n  const extensions = gqlError.extensions;\n  const originalError = extensions?.originalError as any;\n  const message = originalError?.message || gqlError.message;\n  const code = extensions?.code as AiSDKErrorCode;\n\n  if (code) {\n    return new AiSDKError({ message, code });\n  }\n\n  // Legacy error detection by stack trace\n  if (originalError?.stack?.includes(\"AiApiDiscoveryError\")) {\n    return new AiSDKApiDiscoveryError({ message });\n  }\n  if (originalError?.stack?.includes(\"AiSDKRemoteEndpointDiscoveryError\")) {\n    return new AiSDKRemoteEndpointDiscoveryError({ message });\n  }\n  if (originalError?.stack?.includes(\"AiSDKAgentDiscoveryError\")) {\n    return new AiSDKAgentDiscoveryError({\n      agentName: \"\",\n      availableAgents: [],\n    });\n  }\n\n  return null;\n}\n"],"mappings":"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","names":["error","_a"]}