{"version":3,"file":"CopilotRuntimeClient.cjs","names":["CopilotKitVersionMismatchError","ResolvedCopilotKitError","CopilotKitError","CopilotKitLowLevelError","Client","cacheExchange","fetchExchange","generateCopilotResponseMutation","getAvailableAgentsQuery","loadAgentStateQuery"],"sources":["../../src/client/CopilotRuntimeClient.ts"],"sourcesContent":["import { Client, cacheExchange, fetchExchange } from \"@urql/core\";\nimport * as packageJson from \"../../package.json\";\nimport {\n  AvailableAgentsQuery,\n  GenerateCopilotResponseMutation,\n  GenerateCopilotResponseMutationVariables,\n  LoadAgentStateQuery,\n} from \"../graphql/@generated/graphql\";\nimport { generateCopilotResponseMutation } from \"../graphql/definitions/mutations\";\nimport {\n  getAvailableAgentsQuery,\n  loadAgentStateQuery,\n} from \"../graphql/definitions/queries\";\nimport { OperationResultSource, OperationResult } from \"urql\";\nimport {\n  ResolvedCopilotKitError,\n  CopilotKitLowLevelError,\n  CopilotKitError,\n  CopilotKitVersionMismatchError,\n  getPossibleVersionMismatch,\n} from \"@copilotkit/shared\";\n\nconst createFetchFn =\n  (signal?: AbortSignal, handleGQLWarning?: (warning: string) => void) =>\n  async (...args: Parameters<typeof fetch>) => {\n    // @ts-expect-error -- since this is our own header, TS will not recognize\n    const publicApiKey = args[1]?.headers?.[\"x-copilotcloud-public-api-key\"];\n    try {\n      const result = await fetch(args[0], { ...args[1], signal });\n\n      // No mismatch checking if cloud is being used\n      const mismatch = publicApiKey\n        ? null\n        : await getPossibleVersionMismatch({\n            runtimeVersion: result.headers.get(\"X-CopilotKit-Runtime-Version\")!,\n            runtimeClientGqlVersion: packageJson.version,\n          });\n      if (result.status !== 200) {\n        if (result.status >= 400 && result.status <= 500) {\n          if (mismatch) {\n            throw new CopilotKitVersionMismatchError(mismatch);\n          }\n\n          throw new ResolvedCopilotKitError({ status: result.status });\n        }\n      }\n\n      if (mismatch && handleGQLWarning) {\n        handleGQLWarning(mismatch.message);\n      }\n\n      return result;\n    } catch (error) {\n      // Let abort error pass through. It will be suppressed later\n      if (\n        (error as Error).message.includes(\"BodyStreamBuffer was aborted\") ||\n        (error as Error).message.includes(\"signal is aborted without reason\")\n      ) {\n        throw error;\n      }\n      if (error instanceof CopilotKitError) {\n        throw error;\n      }\n      throw new CopilotKitLowLevelError({\n        error: error as Error,\n        url: args[0] as string,\n      });\n    }\n  };\n\nexport interface CopilotRuntimeClientOptions {\n  url: string;\n  publicApiKey?: string;\n  headers?: Record<string, string>;\n  credentials?: RequestCredentials;\n  handleGQLErrors?: (error: Error) => void;\n  handleGQLWarning?: (warning: string) => void;\n}\n\nexport class CopilotRuntimeClient {\n  client: Client;\n  public handleGQLErrors?: (error: Error) => void;\n  public handleGQLWarning?: (warning: string) => void;\n\n  constructor(options: CopilotRuntimeClientOptions) {\n    const headers: Record<string, string> = {};\n\n    this.handleGQLErrors = options.handleGQLErrors;\n    this.handleGQLWarning = options.handleGQLWarning;\n\n    if (options.headers) {\n      Object.assign(headers, options.headers);\n    }\n\n    if (options.publicApiKey) {\n      headers[\"x-copilotcloud-public-api-key\"] = options.publicApiKey;\n    }\n\n    this.client = new Client({\n      url: options.url,\n      exchanges: [cacheExchange, fetchExchange],\n      fetchOptions: {\n        headers: {\n          ...headers,\n          \"X-CopilotKit-Runtime-Client-GQL-Version\": packageJson.version,\n        },\n        ...(options.credentials ? { credentials: options.credentials } : {}),\n      },\n    });\n  }\n\n  generateCopilotResponse({\n    data,\n    properties,\n    signal,\n  }: {\n    data: GenerateCopilotResponseMutationVariables[\"data\"];\n    properties?: GenerateCopilotResponseMutationVariables[\"properties\"];\n    signal?: AbortSignal;\n  }) {\n    const fetchFn = createFetchFn(signal, this.handleGQLWarning);\n    const result = this.client.mutation<\n      GenerateCopilotResponseMutation,\n      GenerateCopilotResponseMutationVariables\n    >(\n      generateCopilotResponseMutation,\n      { data, properties },\n      { fetch: fetchFn },\n    );\n\n    return result;\n  }\n\n  public asStream<S, T>(\n    source: OperationResultSource<OperationResult<S, { data: T }>>,\n  ) {\n    const handleGQLErrors = this.handleGQLErrors;\n    return new ReadableStream<S>({\n      start(controller) {\n        source.subscribe(({ data, hasNext, error }) => {\n          if (error) {\n            if (\n              error.message.includes(\"BodyStreamBuffer was aborted\") ||\n              error.message.includes(\"signal is aborted without reason\")\n            ) {\n              // close the stream if there is no next item\n              if (!hasNext) controller.close();\n\n              //suppress this specific error\n              console.warn(\"Abort error suppressed\");\n              return;\n            }\n\n            // Handle structured errors specially - check if it's a CopilotKitError with visibility\n            if ((error as any).extensions?.visibility) {\n              // Create a synthetic GraphQL error with the structured error info\n              const syntheticError = {\n                ...error,\n                graphQLErrors: [\n                  {\n                    message: error.message,\n                    extensions: (error as any).extensions,\n                  },\n                ],\n              };\n\n              if (handleGQLErrors) {\n                handleGQLErrors(syntheticError);\n              }\n              return; // Don't close the stream for structured errors, let the error handler decide\n            }\n\n            controller.error(error);\n            if (handleGQLErrors) {\n              handleGQLErrors(error);\n            }\n          } else {\n            controller.enqueue(data);\n            if (!hasNext) {\n              controller.close();\n            }\n          }\n        });\n      },\n    });\n  }\n\n  availableAgents() {\n    const fetchFn = createFetchFn();\n    return this.client.query<AvailableAgentsQuery>(\n      getAvailableAgentsQuery,\n      {},\n      { fetch: fetchFn },\n    );\n  }\n\n  loadAgentState(data: { threadId: string; agentName: string }) {\n    const fetchFn = createFetchFn();\n    const result = this.client.query<LoadAgentStateQuery>(\n      loadAgentStateQuery,\n      { data },\n      { fetch: fetchFn },\n    );\n\n    // Add error handling for GraphQL errors - similar to generateCopilotResponse\n    result\n      .toPromise()\n      .then(({ error }) => {\n        if (error && this.handleGQLErrors) {\n          this.handleGQLErrors(error);\n        }\n      })\n      .catch(() => {}); // Suppress promise rejection warnings\n\n    return result;\n  }\n\n  static removeGraphQLTypename(data: any) {\n    if (Array.isArray(data)) {\n      data.forEach((item) => CopilotRuntimeClient.removeGraphQLTypename(item));\n    } else if (typeof data === \"object\" && data !== null) {\n      delete data.__typename;\n      Object.keys(data).forEach((key) => {\n        if (typeof data[key] === \"object\" && data[key] !== null) {\n          CopilotRuntimeClient.removeGraphQLTypename(data[key]);\n        }\n      });\n    }\n    return data;\n  }\n}\n"],"mappings":"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"}