{"version":3,"sources":["../src/common/agent-task.ts","../src/common/setup.ts","../src/common/helpers-utils.ts"],"sourcesContent":["import type { AgentTask, ClerkClient } from '@clerk/backend';\nimport { createClerkClient } from '@clerk/backend';\n\nexport type CreateAgentTaskParams = Parameters<ClerkClient['agentTasks']['create']>[0] &\n  (\n    | {\n        /**\n         * The API URL for your Clerk instance.\n         * If not provided, falls back to the `CLERK_API_URL` environment variable.\n         */\n        apiUrl?: string;\n        /**\n         * The secret key for your Clerk instance.\n         * If not provided, falls back to the `CLERK_SECRET_KEY` environment variable.\n         */\n        secretKey?: string;\n\n        clerkClient?: never;\n      }\n    | {\n        /**\n         * The Clerk client to use to create the agent task.\n         * If not provided, a new Clerk client will be created.\n         */\n        clerkClient?: ClerkClient;\n        apiUrl?: string;\n        secretKey?: string;\n      }\n  );\n\nexport const ERROR_MISSING_SECRET_KEY =\n  'A secretKey is required to create agent tasks. ' +\n  'Pass it directly or set the CLERK_SECRET_KEY environment variable.';\n\nexport const ERROR_MISSING_API_URL =\n  'An apiUrl is required to create agent tasks. ' + 'Pass it directly or set the CLERK_API_URL environment variable.';\n\nexport const ERROR_AGENT_TASK_FAILED = 'Failed to create agent task: ';\n\n/**\n * Creates an agent task using the Clerk Backend API and returns its URL.\n *\n * @internal Framework-specific wrappers should call this after resolving the secret key.\n *\n * @experimental This is an experimental API for the Agent Tasks feature that is available under a private beta,\n * and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version\n * and the clerk-js version to avoid breaking changes.\n */\nexport async function createAgentTestingTask(params: CreateAgentTaskParams): Promise<AgentTask> {\n  const { apiUrl, secretKey, clerkClient, ...taskParams } = params;\n\n  if (!clerkClient && !secretKey) {\n    throw new Error(ERROR_MISSING_SECRET_KEY);\n  }\n\n  const client = clerkClient ?? createClerkClient({ apiUrl, secretKey });\n\n  try {\n    return await client.agentTasks.create(taskParams);\n  } catch (error) {\n    throw new Error(ERROR_AGENT_TASK_FAILED + (error instanceof Error ? error.message : String(error)));\n  }\n}\n","import { createClerkClient } from '@clerk/backend';\nimport { isClerkAPIResponseError } from '@clerk/shared/error';\nimport { parsePublishableKey } from '@clerk/shared/keys';\nimport dotenv from 'dotenv';\n\nimport type { ClerkSetupOptions, ClerkSetupReturn } from './types';\n\nconst MAX_RETRIES = 5;\nconst BASE_DELAY_MS = 1000;\nconst JITTER_MAX_MS = 500;\nconst MAX_RETRY_DELAY_MS = 30_000;\nconst RETRYABLE_STATUS_CODES = new Set([408, 429, 500, 502, 503, 504]);\nconst RETRYABLE_NETWORK_ERRORS = new Set(['ECONNREFUSED', 'ECONNRESET', 'ENOTFOUND', 'ETIMEDOUT', 'EAI_AGAIN']);\n\nfunction isNetworkError(error: unknown): boolean {\n  return (\n    error instanceof Error &&\n    'code' in error &&\n    RETRYABLE_NETWORK_ERRORS.has((error as NodeJS.ErrnoException).code ?? '')\n  );\n}\n\nasync function fetchWithRetry<T>(fn: () => Promise<T>, label: string): Promise<T> {\n  for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {\n    try {\n      return await fn();\n    } catch (error) {\n      const isRetryableApi = isClerkAPIResponseError(error) && RETRYABLE_STATUS_CODES.has(error.status);\n      const isRetryableNetwork = isNetworkError(error);\n      if ((!isRetryableApi && !isRetryableNetwork) || attempt === MAX_RETRIES) {\n        throw error;\n      }\n      const status = isClerkAPIResponseError(error) ? error.status : (error as NodeJS.ErrnoException).code;\n      const exponentialDelay = BASE_DELAY_MS * Math.pow(2, attempt) + Math.random() * JITTER_MAX_MS;\n      const delay =\n        isClerkAPIResponseError(error) && typeof error.retryAfter === 'number'\n          ? Math.min(Math.max(error.retryAfter * 1000, exponentialDelay), MAX_RETRY_DELAY_MS)\n          : Math.min(exponentialDelay, MAX_RETRY_DELAY_MS);\n      console.warn(\n        `[Retry] ${status} for ${label}, attempt ${attempt + 1}/${MAX_RETRIES}, waiting ${Math.round(delay)}ms`,\n      );\n      await new Promise(resolve => setTimeout(resolve, delay));\n    }\n  }\n  throw new Error('Unreachable');\n}\n\nexport const fetchEnvVars = async (options?: ClerkSetupOptions): Promise<ClerkSetupReturn> => {\n  const { debug = false, dotenv: loadDotEnv = true, ...rest } = options || {};\n\n  const log = (msg: string) => {\n    if (debug) {\n      console.log(`Clerk: ${msg}`);\n    }\n  };\n\n  log('Setting up Clerk...');\n\n  if (loadDotEnv) {\n    dotenv.config({ path: ['.env.local', '.env'] });\n  }\n\n  const publishableKey =\n    rest.publishableKey ||\n    process.env.NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY ||\n    process.env.VITE_CLERK_PUBLISHABLE_KEY ||\n    process.env.CLERK_PUBLISHABLE_KEY ||\n    process.env.REACT_APP_CLERK_PUBLISHABLE_KEY ||\n    process.env.EXPO_PUBLIC_CLERK_PUBLISHABLE_KEY;\n\n  const secretKey = rest.secretKey || process.env.CLERK_SECRET_KEY;\n  let testingToken = process.env.CLERK_TESTING_TOKEN;\n\n  if (!publishableKey) {\n    throw new Error('You need to set the CLERK_PUBLISHABLE_KEY environment variable.');\n  }\n\n  if (!secretKey && !testingToken) {\n    throw new Error('You need to set the CLERK_SECRET_KEY or the CLERK_TESTING_TOKEN environment variable.');\n  }\n\n  if (secretKey && !testingToken) {\n    log('Fetching testing token from Clerk Backend API...');\n\n    try {\n      const apiUrl = (rest as any)?.apiUrl || process.env.CLERK_API_URL;\n      const clerkClient = createClerkClient({ secretKey, apiUrl });\n      const tokenData = await fetchWithRetry(\n        () => clerkClient.testingTokens.createTestingToken(),\n        'testingTokens.createTestingToken',\n      );\n      testingToken = tokenData.token;\n    } catch (err) {\n      console.error('Failed to fetch testing token from Clerk API.');\n      throw err;\n    }\n  }\n\n  return {\n    CLERK_FAPI: options?.frontendApiUrl || parsePublishableKey(publishableKey)?.frontendApi,\n    CLERK_TESTING_TOKEN: testingToken,\n  };\n};\n","import type { EmailCodeFactor, PhoneCodeFactor, SignInFirstFactor } from '@clerk/shared/types';\n\nimport type { SignInHelperParams } from './types';\n\n// This function is serialized and executed in the browser context\nexport const signInHelper = async ({ signInParams, windowObject }: SignInHelperParams) => {\n  try {\n    const w = windowObject || window;\n    if (!w.Clerk.client) {\n      return;\n    }\n\n    const signIn = w.Clerk.client.signIn;\n\n    switch (signInParams.strategy) {\n      case 'password': {\n        const res = await signIn.create(signInParams);\n        await w.Clerk.setActive({\n          session: res.createdSessionId,\n        });\n        break;\n      }\n\n      case 'ticket': {\n        const res = await signIn.create({\n          strategy: 'ticket',\n          ticket: signInParams.ticket,\n        });\n\n        if (res.status === 'complete') {\n          await w.Clerk.setActive({\n            session: res.createdSessionId,\n          });\n        } else {\n          throw new Error(`Sign-in with ticket failed. Status: ${res.status}`);\n        }\n        break;\n      }\n\n      case 'phone_code': {\n        // Assert that the identifier is a test phone number\n        if (!/^\\+1\\d{3}55501\\d{2}$/.test(signInParams.identifier)) {\n          throw new Error(\n            `Phone number should be a test phone number.\\n\n       Example: +1XXX55501XX.\\n\n       Learn more here: https://clerk.com/docs/testing/test-emails-and-phones#phone-numbers`,\n          );\n        }\n\n        // Sign in with phone code\n        const { supportedFirstFactors } = await signIn.create({\n          identifier: signInParams.identifier,\n        });\n        const phoneFactor = supportedFirstFactors?.find(\n          (factor: SignInFirstFactor): factor is PhoneCodeFactor => factor.strategy === 'phone_code',\n        );\n\n        if (phoneFactor) {\n          await signIn.prepareFirstFactor({\n            strategy: 'phone_code',\n            phoneNumberId: phoneFactor.phoneNumberId,\n          });\n          const signInAttempt = await signIn.attemptFirstFactor({\n            strategy: 'phone_code',\n            code: '424242',\n          });\n\n          if (signInAttempt.status === 'complete') {\n            await w.Clerk.setActive({ session: signInAttempt.createdSessionId });\n          } else {\n            throw new Error(`Status is ${signInAttempt.status}`);\n          }\n        } else {\n          throw new Error('phone_code is not enabled.');\n        }\n        break;\n      }\n\n      case 'email_code': {\n        // Assert that the identifier is a test email\n        if (!signInParams.identifier.includes('+clerk_test')) {\n          throw new Error(\n            `Email should be a test email.\\n\n       Any email with the +clerk_test subaddress is a test email address.\\n\n       Learn more here: https://clerk.com/docs/testing/test-emails-and-phones#email-addresses`,\n          );\n        }\n\n        // Sign in with email code\n        const { supportedFirstFactors } = await signIn.create({\n          identifier: signInParams.identifier,\n        });\n        const emailFactor = supportedFirstFactors?.find(\n          (factor: SignInFirstFactor): factor is EmailCodeFactor => factor.strategy === 'email_code',\n        );\n\n        if (emailFactor) {\n          await signIn.prepareFirstFactor({\n            strategy: 'email_code',\n            emailAddressId: emailFactor.emailAddressId,\n          });\n          const signInAttempt = await signIn.attemptFirstFactor({\n            strategy: 'email_code',\n            code: '424242',\n          });\n\n          if (signInAttempt.status === 'complete') {\n            await w.Clerk.setActive({ session: signInAttempt.createdSessionId });\n          } else {\n            throw new Error(`Status is ${signInAttempt.status}`);\n          }\n        } else {\n          throw new Error('email_code is not enabled.');\n        }\n        break;\n      }\n\n      default:\n        throw new Error(`Unsupported strategy: ${(signInParams as any).strategy}`);\n    }\n  } catch (err: any) {\n    throw new Error(`Clerk: Failed to sign in: ${err?.message}`);\n  }\n};\n"],"mappings":"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","names":["createClerkClient","ERROR_MISSING_SECRET_KEY","ERROR_AGENT_TASK_FAILED","createAgentTestingTask","params","apiUrl","secretKey","clerkClient","taskParams","ERROR_MISSING_SECRET_KEY","client","createClerkClient","error","createClerkClient","isClerkAPIResponseError","parsePublishableKey","dotenv","MAX_RETRIES","BASE_DELAY_MS","JITTER_MAX_MS","MAX_RETRY_DELAY_MS","RETRYABLE_STATUS_CODES","RETRYABLE_NETWORK_ERRORS","isNetworkError","error","fetchWithRetry","fn","label","attempt","isRetryableApi","isRetryableNetwork","status","exponentialDelay","delay","resolve","fetchEnvVars","options","debug","loadDotEnv","rest","log","msg","publishableKey","secretKey","testingToken","apiUrl","clerkClient","err","signInHelper","signInParams","windowObject","w","signIn","res","supportedFirstFactors","phoneFactor","factor","signInAttempt","emailFactor","err"]}