@morphllm/morphsdk 0.2.93 → 0.2.95

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 (135) hide show
  1. package/dist/chunk-2AMEQAO2.js +46 -0
  2. package/dist/chunk-2AMEQAO2.js.map +1 -0
  3. package/dist/{chunk-EI4UKP24.js → chunk-2HMEZZKK.js} +2 -2
  4. package/dist/{chunk-EI4UKP24.js.map → chunk-2HMEZZKK.js.map} +1 -1
  5. package/dist/chunk-2VERUKO2.js +177 -0
  6. package/dist/chunk-2VERUKO2.js.map +1 -0
  7. package/dist/{chunk-VHOWYK66.js → chunk-43LQLGP6.js} +23 -33
  8. package/dist/chunk-43LQLGP6.js.map +1 -0
  9. package/dist/{chunk-LMUZ3NGC.js → chunk-73RV6EXR.js} +2 -2
  10. package/dist/{chunk-PBLPZ6AU.js → chunk-7D6TXC7X.js} +2 -2
  11. package/dist/{chunk-GU6DACME.js → chunk-O7LDZA52.js} +2 -2
  12. package/dist/{chunk-5QIWYEHJ.js → chunk-PE4KGDA6.js} +1 -8
  13. package/dist/chunk-PE4KGDA6.js.map +1 -0
  14. package/dist/{chunk-SQN4DUQS.js → chunk-Q6Y4R236.js} +26 -2
  15. package/dist/chunk-Q6Y4R236.js.map +1 -0
  16. package/dist/{chunk-PUGIOVSP.js → chunk-QAT5UVPX.js} +2 -2
  17. package/dist/{chunk-MIIJWDOQ.js → chunk-QJP62BXH.js} +166 -71
  18. package/dist/chunk-QJP62BXH.js.map +1 -0
  19. package/dist/{chunk-EYGBUH2R.js → chunk-R7IQWNSA.js} +8 -8
  20. package/dist/chunk-R7IQWNSA.js.map +1 -0
  21. package/dist/chunk-SI2CKRKJ.js +389 -0
  22. package/dist/chunk-SI2CKRKJ.js.map +1 -0
  23. package/dist/{chunk-4WLGDYWQ.js → chunk-TSENDJQI.js} +6 -6
  24. package/dist/chunk-TSENDJQI.js.map +1 -0
  25. package/dist/{chunk-IUG2FHNN.js → chunk-XH7P7HVT.js} +1 -8
  26. package/dist/chunk-XH7P7HVT.js.map +1 -0
  27. package/dist/{chunk-FNLNDMIX.js → chunk-YZ5NCWO2.js} +6 -6
  28. package/dist/chunk-YZ5NCWO2.js.map +1 -0
  29. package/dist/{chunk-IJ54DTJ3.js → chunk-ZYTAKEBW.js} +13 -13
  30. package/dist/client.cjs +770 -110
  31. package/dist/client.cjs.map +1 -1
  32. package/dist/client.d.ts +2 -0
  33. package/dist/client.js +16 -13
  34. package/dist/index.cjs +770 -110
  35. package/dist/index.cjs.map +1 -1
  36. package/dist/index.d.ts +2 -0
  37. package/dist/index.js +16 -13
  38. package/dist/tools/browser/anthropic.cjs +58 -23
  39. package/dist/tools/browser/anthropic.cjs.map +1 -1
  40. package/dist/tools/browser/anthropic.js +7 -4
  41. package/dist/tools/browser/core.cjs +750 -70
  42. package/dist/tools/browser/core.cjs.map +1 -1
  43. package/dist/tools/browser/core.d.ts +30 -24
  44. package/dist/tools/browser/core.js +5 -2
  45. package/dist/tools/browser/errors.cjs +208 -0
  46. package/dist/tools/browser/errors.cjs.map +1 -0
  47. package/dist/tools/browser/errors.d.ts +158 -0
  48. package/dist/tools/browser/errors.js +22 -0
  49. package/dist/tools/browser/errors.js.map +1 -0
  50. package/dist/tools/browser/index.cjs +783 -85
  51. package/dist/tools/browser/index.cjs.map +1 -1
  52. package/dist/tools/browser/index.d.ts +5 -2
  53. package/dist/tools/browser/index.js +32 -9
  54. package/dist/tools/browser/index.js.map +1 -1
  55. package/dist/tools/browser/live.cjs +25 -1
  56. package/dist/tools/browser/live.cjs.map +1 -1
  57. package/dist/tools/browser/live.js +1 -1
  58. package/dist/tools/browser/openai.cjs +58 -23
  59. package/dist/tools/browser/openai.cjs.map +1 -1
  60. package/dist/tools/browser/openai.js +7 -4
  61. package/dist/tools/browser/profiles/core.cjs +670 -0
  62. package/dist/tools/browser/profiles/core.cjs.map +1 -0
  63. package/dist/tools/browser/profiles/core.d.ts +187 -0
  64. package/dist/tools/browser/profiles/core.js +29 -0
  65. package/dist/tools/browser/profiles/core.js.map +1 -0
  66. package/dist/tools/browser/profiles/index.cjs +670 -0
  67. package/dist/tools/browser/profiles/index.cjs.map +1 -0
  68. package/dist/tools/browser/profiles/index.d.ts +4 -0
  69. package/dist/tools/browser/profiles/index.js +29 -0
  70. package/dist/tools/browser/profiles/index.js.map +1 -0
  71. package/dist/tools/browser/profiles/types.cjs +74 -0
  72. package/dist/tools/browser/profiles/types.cjs.map +1 -0
  73. package/dist/tools/browser/profiles/types.d.ts +195 -0
  74. package/dist/tools/browser/profiles/types.js +16 -0
  75. package/dist/tools/browser/profiles/types.js.map +1 -0
  76. package/dist/tools/browser/prompts.cjs +1 -1
  77. package/dist/tools/browser/prompts.cjs.map +1 -1
  78. package/dist/tools/browser/prompts.d.ts +1 -1
  79. package/dist/tools/browser/prompts.js +1 -1
  80. package/dist/tools/browser/types.cjs.map +1 -1
  81. package/dist/tools/browser/types.d.ts +55 -51
  82. package/dist/tools/browser/vercel.cjs +60 -25
  83. package/dist/tools/browser/vercel.cjs.map +1 -1
  84. package/dist/tools/browser/vercel.d.ts +1 -1
  85. package/dist/tools/browser/vercel.js +7 -4
  86. package/dist/tools/fastapply/anthropic.cjs +0 -7
  87. package/dist/tools/fastapply/anthropic.cjs.map +1 -1
  88. package/dist/tools/fastapply/anthropic.js +1 -1
  89. package/dist/tools/fastapply/index.cjs +0 -14
  90. package/dist/tools/fastapply/index.cjs.map +1 -1
  91. package/dist/tools/fastapply/index.js +5 -5
  92. package/dist/tools/fastapply/openai.cjs +0 -7
  93. package/dist/tools/fastapply/openai.cjs.map +1 -1
  94. package/dist/tools/fastapply/openai.js +1 -1
  95. package/dist/tools/index.cjs +0 -14
  96. package/dist/tools/index.cjs.map +1 -1
  97. package/dist/tools/index.js +5 -5
  98. package/dist/tools/warp_grep/agent/runner.cjs +18 -98
  99. package/dist/tools/warp_grep/agent/runner.cjs.map +1 -1
  100. package/dist/tools/warp_grep/agent/runner.js +2 -3
  101. package/dist/tools/warp_grep/anthropic.cjs +18 -98
  102. package/dist/tools/warp_grep/anthropic.cjs.map +1 -1
  103. package/dist/tools/warp_grep/anthropic.js +8 -9
  104. package/dist/tools/warp_grep/client.cjs +18 -98
  105. package/dist/tools/warp_grep/client.cjs.map +1 -1
  106. package/dist/tools/warp_grep/client.js +5 -6
  107. package/dist/tools/warp_grep/gemini.cjs +18 -98
  108. package/dist/tools/warp_grep/gemini.cjs.map +1 -1
  109. package/dist/tools/warp_grep/gemini.js +7 -8
  110. package/dist/tools/warp_grep/gemini.js.map +1 -1
  111. package/dist/tools/warp_grep/harness.js +10 -10
  112. package/dist/tools/warp_grep/index.cjs +18 -98
  113. package/dist/tools/warp_grep/index.cjs.map +1 -1
  114. package/dist/tools/warp_grep/index.js +8 -9
  115. package/dist/tools/warp_grep/openai.cjs +18 -98
  116. package/dist/tools/warp_grep/openai.cjs.map +1 -1
  117. package/dist/tools/warp_grep/openai.js +8 -9
  118. package/dist/tools/warp_grep/vercel.cjs +18 -98
  119. package/dist/tools/warp_grep/vercel.cjs.map +1 -1
  120. package/dist/tools/warp_grep/vercel.js +8 -9
  121. package/dist/{vercel-CsnNSdze.d.ts → vercel-CVF27qFK.d.ts} +10 -10
  122. package/package.json +7 -2
  123. package/dist/chunk-4WLGDYWQ.js.map +0 -1
  124. package/dist/chunk-5QIWYEHJ.js.map +0 -1
  125. package/dist/chunk-EYGBUH2R.js.map +0 -1
  126. package/dist/chunk-FNLNDMIX.js.map +0 -1
  127. package/dist/chunk-IUG2FHNN.js.map +0 -1
  128. package/dist/chunk-MIIJWDOQ.js.map +0 -1
  129. package/dist/chunk-SQN4DUQS.js.map +0 -1
  130. package/dist/chunk-VHOWYK66.js.map +0 -1
  131. /package/dist/{chunk-LMUZ3NGC.js.map → chunk-73RV6EXR.js.map} +0 -0
  132. /package/dist/{chunk-PBLPZ6AU.js.map → chunk-7D6TXC7X.js.map} +0 -0
  133. /package/dist/{chunk-GU6DACME.js.map → chunk-O7LDZA52.js.map} +0 -0
  134. /package/dist/{chunk-PUGIOVSP.js.map → chunk-QAT5UVPX.js.map} +0 -0
  135. /package/dist/{chunk-IJ54DTJ3.js.map → chunk-ZYTAKEBW.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../tools/browser/profiles/index.ts","../../../../tools/utils/resilience.ts","../../../../tools/browser/errors.ts","../../../../tools/browser/profiles/types.ts","../../../../tools/browser/profiles/core.ts"],"sourcesContent":["/**\n * Browser Profiles - Persistent browser state management\n */\n\nexport { ProfilesClient } from './core.js';\nexport {\n createProfile,\n listProfiles,\n getProfile,\n updateProfile,\n deleteProfile,\n startProfileSession,\n saveProfileSession,\n getProfileState,\n listRepos,\n} from './core.js';\nexport type {\n Profile,\n ProfileSetup,\n ProfileWithMethods,\n CreateProfileInput,\n ProfileListResponse,\n ProfileSession,\n ProfileSessionInput,\n SaveProfileSessionInput,\n ProfileStateResponse,\n RepoSummary,\n RepoListResponse,\n} from './types.js';\n","/**\n * Resilience utilities for retry logic and timeout handling\n */\n\nexport interface RetryConfig {\n maxRetries?: number; // Default: 3\n initialDelay?: number; // Default: 1000ms\n maxDelay?: number; // Default: 30000ms\n backoffMultiplier?: number; // Default: 2\n retryableErrors?: string[]; // Default: ['ECONNREFUSED', 'ETIMEDOUT', 'ENOTFOUND']\n onRetry?: (attempt: number, error: Error) => void;\n}\n\nconst DEFAULT_RETRY_CONFIG: Required<Omit<RetryConfig, 'onRetry'>> = {\n maxRetries: 3,\n initialDelay: 1000,\n maxDelay: 30000,\n backoffMultiplier: 2,\n retryableErrors: ['ECONNREFUSED', 'ETIMEDOUT', 'ENOTFOUND'],\n};\n\n/**\n * Retry a fetch request with exponential backoff\n * \n * @param url - Request URL\n * @param options - Fetch options\n * @param retryConfig - Retry configuration\n * @returns Response from fetch\n * \n * @example\n * ```typescript\n * const response = await fetchWithRetry(\n * 'https://api.example.com/data',\n * { method: 'POST', body: JSON.stringify(data) },\n * { maxRetries: 5, initialDelay: 500 }\n * );\n * ```\n */\nexport async function fetchWithRetry(\n url: string,\n options: RequestInit,\n retryConfig: RetryConfig = {}\n): Promise<Response> {\n const {\n maxRetries = DEFAULT_RETRY_CONFIG.maxRetries,\n initialDelay = DEFAULT_RETRY_CONFIG.initialDelay,\n maxDelay = DEFAULT_RETRY_CONFIG.maxDelay,\n backoffMultiplier = DEFAULT_RETRY_CONFIG.backoffMultiplier,\n retryableErrors = DEFAULT_RETRY_CONFIG.retryableErrors,\n onRetry,\n } = retryConfig;\n\n let lastError: Error | null = null;\n let delay = initialDelay;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n const response = await fetch(url, options);\n \n // Retry on 429 (rate limit) or 503 (service unavailable)\n if (response.status === 429 || response.status === 503) {\n if (attempt < maxRetries) {\n // Check for Retry-After header\n const retryAfter = response.headers.get('Retry-After');\n const waitTime = retryAfter \n ? parseInt(retryAfter) * 1000 \n : Math.min(delay, maxDelay);\n \n const error = new Error(`HTTP ${response.status}: Retrying after ${waitTime}ms`);\n if (onRetry) {\n onRetry(attempt + 1, error);\n }\n \n await sleep(waitTime);\n delay *= backoffMultiplier;\n continue;\n }\n }\n\n return response;\n } catch (error) {\n lastError = error as Error;\n \n // Check if error is retryable\n const isRetryable = retryableErrors.some(errType => \n lastError?.message?.includes(errType)\n );\n\n if (!isRetryable || attempt === maxRetries) {\n throw lastError;\n }\n\n // Exponential backoff\n const waitTime = Math.min(delay, maxDelay);\n if (onRetry) {\n onRetry(attempt + 1, lastError);\n }\n \n await sleep(waitTime);\n delay *= backoffMultiplier;\n }\n }\n\n throw lastError || new Error('Max retries exceeded');\n}\n\n/**\n * Add timeout to any promise\n * \n * @param promise - Promise to wrap with timeout\n * @param timeoutMs - Timeout in milliseconds\n * @param errorMessage - Optional custom error message\n * @returns Promise that rejects if timeout is reached\n * \n * @example\n * ```typescript\n * const result = await withTimeout(\n * fetchData(),\n * 5000,\n * 'Data fetch timed out'\n * );\n * ```\n */\nexport async function withTimeout<T>(\n promise: Promise<T>,\n timeoutMs: number,\n errorMessage?: string\n): Promise<T> {\n let timeoutId: NodeJS.Timeout | number;\n \n const timeoutPromise = new Promise<never>((_, reject) => {\n timeoutId = setTimeout(() => {\n reject(new Error(errorMessage || `Operation timed out after ${timeoutMs}ms`));\n }, timeoutMs);\n });\n\n try {\n const result = await Promise.race([promise, timeoutPromise]);\n clearTimeout(timeoutId!);\n return result;\n } catch (error) {\n clearTimeout(timeoutId!);\n throw error;\n }\n}\n\n/**\n * Sleep for specified milliseconds\n */\nfunction sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n\n/**\n * Unified error type for all tools\n */\nexport class MorphError extends Error {\n constructor(\n message: string,\n public code: string,\n public statusCode?: number,\n public retryable: boolean = false\n ) {\n super(message);\n this.name = 'MorphError';\n }\n}\n\n\n","/**\n * Custom error classes for browser automation and profiles.\n *\n * @example\n * ```typescript\n * try {\n * await morph.browser.profiles.createProfile({ name: '', repoId: 'owner/repo' });\n * } catch (e) {\n * if (e instanceof MorphValidationError) {\n * console.log('Validation failed:', e.field, e.message);\n * } else if (e instanceof MorphAPIError) {\n * console.log('API error:', e.code, e.statusCode);\n * }\n * }\n * ```\n */\n\n/**\n * Error codes for Morph Browser SDK\n */\nexport type MorphErrorCode =\n // Validation errors\n | 'validation_error'\n | 'invalid_parameter'\n | 'missing_required_field'\n // Authentication errors\n | 'authentication_required'\n | 'invalid_api_key'\n | 'insufficient_permissions'\n // Resource errors\n | 'profile_not_found'\n | 'session_not_found'\n | 'resource_not_found'\n // Limit errors\n | 'profile_limit_exceeded'\n | 'rate_limit_exceeded'\n // Session errors\n | 'session_expired'\n | 'session_save_failed'\n // Network errors\n | 'network_error'\n | 'timeout'\n | 'service_unavailable';\n\n/**\n * Base error class for all Morph SDK errors.\n */\nexport class MorphError extends Error {\n /** Error code for programmatic handling */\n readonly code: MorphErrorCode;\n /** Original cause of the error, if any */\n readonly cause?: Error;\n\n constructor(message: string, code: MorphErrorCode, cause?: Error) {\n super(message);\n this.name = 'MorphError';\n this.code = code;\n this.cause = cause;\n\n // Maintains proper stack trace in V8 environments\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n\n /**\n * Returns a JSON representation of the error for logging.\n */\n toJSON() {\n return {\n name: this.name,\n message: this.message,\n code: this.code,\n cause: this.cause?.message,\n };\n }\n}\n\n/**\n * Error thrown when API request validation fails.\n */\nexport class MorphValidationError extends MorphError {\n /** The field that failed validation */\n readonly field?: string;\n\n constructor(message: string, field?: string) {\n super(message, 'validation_error');\n this.name = 'MorphValidationError';\n this.field = field;\n }\n\n toJSON() {\n return {\n ...super.toJSON(),\n field: this.field,\n };\n }\n}\n\n/**\n * Error thrown when an API request fails.\n */\nexport class MorphAPIError extends MorphError {\n /** HTTP status code */\n readonly statusCode: number;\n /** Request ID for debugging (if available) */\n readonly requestId?: string;\n /** Raw response body */\n readonly rawResponse?: string;\n\n constructor(\n message: string,\n code: MorphErrorCode,\n statusCode: number,\n options?: {\n requestId?: string;\n rawResponse?: string;\n cause?: Error;\n }\n ) {\n super(message, code, options?.cause);\n this.name = 'MorphAPIError';\n this.statusCode = statusCode;\n this.requestId = options?.requestId;\n this.rawResponse = options?.rawResponse;\n }\n\n toJSON() {\n return {\n ...super.toJSON(),\n statusCode: this.statusCode,\n requestId: this.requestId,\n };\n }\n}\n\n/**\n * Error thrown when authentication fails.\n */\nexport class MorphAuthenticationError extends MorphAPIError {\n constructor(message: string = 'Authentication required. Please provide a valid API key.') {\n super(message, 'authentication_required', 401);\n this.name = 'MorphAuthenticationError';\n }\n}\n\n/**\n * Error thrown when rate limit is exceeded.\n */\nexport class MorphRateLimitError extends MorphAPIError {\n /** When the rate limit resets (Unix timestamp) */\n readonly resetAt?: number;\n /** Number of seconds until reset */\n readonly retryAfter?: number;\n\n constructor(\n message: string = 'Rate limit exceeded. Please retry later.',\n options?: {\n resetAt?: number;\n retryAfter?: number;\n requestId?: string;\n }\n ) {\n super(message, 'rate_limit_exceeded', 429, { requestId: options?.requestId });\n this.name = 'MorphRateLimitError';\n this.resetAt = options?.resetAt;\n this.retryAfter = options?.retryAfter;\n }\n\n toJSON() {\n return {\n ...super.toJSON(),\n resetAt: this.resetAt,\n retryAfter: this.retryAfter,\n };\n }\n}\n\n/**\n * Error thrown when a resource is not found.\n */\nexport class MorphNotFoundError extends MorphAPIError {\n /** The type of resource that was not found */\n readonly resourceType: string;\n /** The ID of the resource that was not found */\n readonly resourceId?: string;\n\n constructor(resourceType: string, resourceId?: string) {\n const message = resourceId\n ? `${resourceType} '${resourceId}' not found`\n : `${resourceType} not found`;\n super(message, 'resource_not_found', 404);\n this.name = 'MorphNotFoundError';\n this.resourceType = resourceType;\n this.resourceId = resourceId;\n }\n\n toJSON() {\n return {\n ...super.toJSON(),\n resourceType: this.resourceType,\n resourceId: this.resourceId,\n };\n }\n}\n\n/**\n * Error thrown when profile limit is exceeded.\n */\nexport class MorphProfileLimitError extends MorphAPIError {\n /** Current number of profiles */\n readonly currentCount?: number;\n /** Maximum allowed profiles for the plan */\n readonly maxAllowed?: number;\n\n constructor(\n message: string = 'Profile limit exceeded for your plan.',\n options?: {\n currentCount?: number;\n maxAllowed?: number;\n requestId?: string;\n }\n ) {\n super(message, 'profile_limit_exceeded', 403, { requestId: options?.requestId });\n this.name = 'MorphProfileLimitError';\n this.currentCount = options?.currentCount;\n this.maxAllowed = options?.maxAllowed;\n }\n\n toJSON() {\n return {\n ...super.toJSON(),\n currentCount: this.currentCount,\n maxAllowed: this.maxAllowed,\n };\n }\n}\n\n/**\n * Parse an API error response and return the appropriate error class.\n */\nexport function parseAPIError(\n statusCode: number,\n responseText: string,\n requestId?: string\n): MorphAPIError {\n // Try to parse JSON error response\n let errorData: { detail?: string; code?: string; message?: string } = {};\n try {\n errorData = JSON.parse(responseText);\n } catch {\n // Not JSON, use raw text\n }\n\n const message = errorData.detail || errorData.message || responseText || 'Unknown error';\n const code = errorData.code;\n\n // Map status codes to specific error classes\n switch (statusCode) {\n case 401:\n return new MorphAuthenticationError(message);\n\n case 403:\n if (code === 'profile_limit_exceeded' || message.toLowerCase().includes('limit')) {\n return new MorphProfileLimitError(message, { requestId });\n }\n return new MorphAPIError(message, 'insufficient_permissions', statusCode, { requestId, rawResponse: responseText });\n\n case 404:\n if (message.toLowerCase().includes('profile')) {\n return new MorphNotFoundError('Profile', undefined);\n }\n if (message.toLowerCase().includes('session')) {\n return new MorphNotFoundError('Session', undefined);\n }\n return new MorphAPIError(message, 'resource_not_found', statusCode, { requestId, rawResponse: responseText });\n\n case 429:\n return new MorphRateLimitError(message, { requestId });\n\n case 422:\n return new MorphAPIError(message, 'validation_error', statusCode, { requestId, rawResponse: responseText });\n\n case 500:\n case 502:\n case 503:\n case 504:\n return new MorphAPIError(message, 'service_unavailable', statusCode, { requestId, rawResponse: responseText });\n\n default:\n return new MorphAPIError(message, 'network_error', statusCode, { requestId, rawResponse: responseText });\n }\n}\n","/**\n * Type definitions for browser profiles.\n *\n * All types use camelCase for SDK ergonomics.\n * API responses are normalized from snake_case to camelCase.\n */\n\n/**\n * A browser profile that stores login state (cookies, localStorage).\n *\n * @example\n * ```typescript\n * const profile = await morph.browser.profiles.getProfile('profile-id');\n * console.log(profile.cookieDomains); // ['linkedin.com', 'google.com']\n * ```\n */\nexport interface Profile {\n /** Unique profile identifier (UUID) */\n id: string;\n /** Human-readable profile name */\n name: string;\n /** Repository ID this profile is associated with */\n repoId: string;\n /** List of domains with stored cookies */\n cookieDomains?: string[];\n /** ISO 8601 timestamp of last use */\n lastUsedAt?: string;\n /** ISO 8601 timestamp of creation */\n createdAt: string;\n /** ISO 8601 timestamp of last update */\n updatedAt: string;\n}\n\n/**\n * Input for creating a new profile.\n *\n * @example\n * ```typescript\n * await morph.browser.profiles.createProfile({\n * name: 'LinkedIn Production',\n * repoId: 'owner/repo'\n * });\n * ```\n */\nexport interface CreateProfileInput {\n /** Profile name (1-100 characters) */\n name: string;\n /** Repository ID - profiles are repo-specific */\n repoId: string;\n}\n\n/**\n * Input for updating a profile.\n */\n// Intentionally no UpdateProfileInput: update means \"open a live session\"\n\n/**\n * Response for listing profiles.\n */\nexport interface ProfileListResponse {\n profiles: Profile[];\n}\n\n/**\n * A browser session for profile setup.\n *\n * @example\n * ```typescript\n * const session = await morph.browser.profiles.startSession();\n * console.log('Sign in at:', session.debugUrl);\n * // After user signs in...\n * await morph.browser.profiles.saveSession(session.sessionId, profile.id);\n * ```\n */\nexport interface ProfileSession {\n /** Unique session identifier */\n sessionId: string;\n /** Live session URL for viewing/interacting with the browser */\n debugUrl: string;\n}\n\n/**\n * Profile setup handle returned by create/update.\n *\n * Provides a live URL for login and an explicit save() helper.\n */\nexport interface ProfileSetup {\n profile: Profile;\n session: ProfileSession;\n save: () => Promise<Profile>;\n}\n/**\n * Input for starting a profile session.\n */\nexport interface ProfileSessionInput {\n /** Optional profile ID to update an existing profile */\n profileId?: string;\n}\n\n/**\n * Input for saving a profile session.\n */\nexport interface SaveProfileSessionInput {\n /** The browser session ID to extract state from */\n sessionId: string;\n /** The profile ID to save state to */\n profileId: string;\n}\n\n/**\n * Response for profile state URL.\n */\nexport interface ProfileStateResponse {\n /** Profile ID */\n profileId: string;\n /** Presigned URL to download the profile state (expires in `expiresIn` seconds) */\n stateUrl: string;\n /** URL expiry time in seconds */\n expiresIn: number;\n}\n\n/**\n * Repo summary for profile discovery.\n */\nexport interface RepoSummary {\n repoId: string;\n repoFullName?: string;\n profileCount: number;\n}\n\n/**\n * Response for repo discovery.\n */\nexport interface RepoListResponse {\n repos: RepoSummary[];\n}\n\n/**\n * Profile with convenience methods attached.\n *\n * @example\n * ```typescript\n * const profile = await morph.browser.profiles.getProfile('id');\n * const state = await profile.getState();\n * await profile.delete();\n * ```\n */\nexport interface ProfileWithMethods extends Profile {\n /** Get presigned URL for profile state */\n getState: () => Promise<ProfileStateResponse>;\n /** Delete this profile */\n delete: () => Promise<void>;\n}\n\n// ============================================================================\n// Internal API types (snake_case - matches backend response)\n// ============================================================================\n\n/** @internal API response format */\nexport interface APIProfile {\n id: string;\n name: string;\n repo_id: string;\n cookie_domains?: string[];\n last_used_at?: string;\n created_at: string;\n updated_at: string;\n}\n\n/** @internal API response format */\nexport interface APIProfileSession {\n session_id: string;\n debug_url?: string;\n}\n\n/** @internal API response format */\nexport interface APIProfileStateResponse {\n profile_id: string;\n state_url: string;\n expires_in: number;\n}\n\n// ============================================================================\n// Transformers\n// ============================================================================\n\n/**\n * Transform API profile response to SDK format.\n * @internal\n */\nexport function transformProfile(api: APIProfile): Profile {\n return {\n id: api.id,\n name: api.name,\n repoId: api.repo_id,\n cookieDomains: api.cookie_domains,\n lastUsedAt: api.last_used_at,\n createdAt: api.created_at,\n updatedAt: api.updated_at,\n };\n}\n\n/**\n * Transform SDK input to API format.\n * @internal\n */\nexport function transformCreateInput(input: CreateProfileInput): { name: string; repo_id: string } {\n return {\n name: input.name,\n repo_id: input.repoId,\n };\n}\n\n/**\n * Transform API session response to SDK format.\n * @internal\n */\nexport function transformSession(api: APIProfileSession): ProfileSession {\n return {\n sessionId: api.session_id,\n debugUrl: api.debug_url || '',\n };\n}\n\n/**\n * Transform SDK save input to API format.\n * @internal\n */\nexport function transformSaveInput(input: SaveProfileSessionInput): { session_id: string; profile_id: string } {\n return {\n session_id: input.sessionId,\n profile_id: input.profileId,\n };\n}\n\n/**\n * Transform API state response to SDK format.\n * @internal\n */\nexport function transformStateResponse(api: APIProfileStateResponse): ProfileStateResponse {\n return {\n profileId: api.profile_id,\n stateUrl: api.state_url,\n expiresIn: api.expires_in,\n };\n}\n","/**\n * ProfilesClient - Manage browser profiles for storing login state.\n *\n * @example\n * ```typescript\n * const morph = new MorphClient({ apiKey: '...' });\n *\n * // Create a profile + live setup session\n * const setup = await morph.browser.profiles.createProfile({\n * name: 'LinkedIn',\n * repoId: 'owner/repo'\n * });\n *\n * console.log('Sign in at:', setup.session.debugUrl);\n * // User logs in, then explicitly save\n * await setup.save();\n *\n * // Use profile in browser tasks\n * await morph.browser.execute({\n * task: 'Check notifications',\n * url: 'https://linkedin.com',\n * profileId: profile.id\n * });\n * ```\n */\n\nimport { fetchWithRetry } from '../../utils/resilience.js';\nimport type { BrowserConfig } from '../types.js';\nimport {\n MorphValidationError,\n MorphAuthenticationError,\n parseAPIError,\n} from '../errors.js';\nimport type {\n Profile,\n ProfileSetup,\n ProfileWithMethods,\n CreateProfileInput,\n ProfileListResponse,\n ProfileSession,\n ProfileSessionInput,\n SaveProfileSessionInput,\n ProfileStateResponse,\n RepoSummary,\n RepoListResponse,\n APIProfile,\n APIProfileSession,\n APIProfileStateResponse,\n} from './types.js';\nimport {\n transformProfile,\n transformCreateInput,\n transformSession,\n transformSaveInput,\n transformStateResponse,\n} from './types.js';\n\nconst DEFAULT_API_URL = process.env.MORPH_ENVIRONMENT === 'DEV'\n ? 'http://localhost:8000'\n : 'https://browser.morphllm.com';\n\n/**\n * ProfilesClient class for managing browser profiles.\n *\n * Access via `morph.browser.profiles` on a MorphClient instance.\n */\nexport class ProfilesClient {\n private config: BrowserConfig;\n\n constructor(config: BrowserConfig) {\n this.config = config;\n }\n\n /**\n * Create a new browser profile and immediately start a live session.\n *\n * @param input - Profile creation parameters\n * @returns Profile setup handle with live URL + save()\n * @throws {MorphValidationError} If input validation fails\n * @throws {MorphProfileLimitError} If profile limit is exceeded\n * @throws {MorphAuthenticationError} If API key is missing or invalid\n *\n * @example\n * ```typescript\n * const setup = await morph.browser.profiles.createProfile({\n * name: 'LinkedIn Production',\n * repoId: 'owner/repo'\n * });\n * console.log(setup.session.debugUrl);\n * await setup.save();\n * ```\n */\n async createProfile(input: CreateProfileInput): Promise<ProfileSetup> {\n return createProfile(input, this.config);\n }\n\n /**\n * List all profiles for the authenticated user.\n *\n * @param repoId - Optional repository ID to filter by\n * @returns Array of profiles\n *\n * @example\n * ```typescript\n * // List all profiles\n * const allProfiles = await morph.browser.profiles.listProfiles();\n *\n * // List profiles for a specific repo\n * const repoProfiles = await morph.browser.profiles.listProfiles('owner/repo');\n * ```\n */\n async listProfiles(repoId?: string): Promise<Profile[]> {\n return listProfiles(this.config, repoId);\n }\n\n /**\n * Get a profile by ID with convenience methods.\n *\n * @param id - Profile ID\n * @returns Profile with attached methods\n * @throws {MorphNotFoundError} If profile is not found\n *\n * @example\n * ```typescript\n * const profile = await morph.browser.profiles.getProfile('profile-id');\n * const state = await profile.getState();\n * await profile.delete();\n * ```\n */\n async getProfile(id: string): Promise<ProfileWithMethods> {\n return getProfile(id, this.config);\n }\n\n /**\n * Update a profile by opening a live session (no rename).\n *\n * @param id - Profile ID\n * @returns Profile setup handle with live URL + save()\n */\n async updateProfile(id: string): Promise<ProfileSetup> {\n return updateProfile(id, this.config);\n }\n\n /**\n * Delete a profile.\n *\n * @param id - Profile ID\n * @throws {MorphNotFoundError} If profile is not found\n */\n async deleteProfile(id: string): Promise<void> {\n return deleteProfile(id, this.config);\n }\n\n /**\n * Start a browser session for profile setup.\n *\n * Returns a live URL where the user can sign into accounts.\n * After signing in, call `saveSession` to persist the state.\n *\n * @param input - Optional session parameters\n * @returns Session with debug URL\n *\n * @example\n * ```typescript\n * const session = await morph.browser.profiles.startSession();\n * console.log('Sign in at:', session.debugUrl);\n * // Open debugUrl in browser, user signs in...\n * await morph.browser.profiles.saveSession(session.sessionId, profile.id);\n * ```\n */\n async startSession(input?: ProfileSessionInput): Promise<ProfileSession> {\n return startProfileSession(this.config, input);\n }\n\n /**\n * Save browser state from a session to a profile.\n *\n * Call this after the user is done signing into accounts.\n * Extracts cookies, localStorage, and sessionStorage.\n *\n * @param sessionId - Browser session ID from startSession\n * @param profileId - Profile ID to save state to\n * @returns Updated profile with cookie domains\n */\n async saveSession(sessionId: string, profileId: string): Promise<Profile> {\n return saveProfileSession({ sessionId, profileId }, this.config);\n }\n\n /**\n * List available repo IDs (discovery).\n *\n * @returns Repo summaries with profile counts\n */\n async listRepos(): Promise<RepoSummary[]> {\n return listRepos(this.config);\n }\n\n /**\n * Get the presigned URL for a profile's state.\n *\n * Use this to download the raw state JSON for debugging\n * or to restore state manually.\n *\n * @param profileId - Profile ID\n * @returns State URL with expiry information\n */\n async getProfileState(profileId: string): Promise<ProfileStateResponse> {\n return getProfileState(profileId, this.config);\n }\n}\n\n// ============================================================================\n// Validation Helpers\n// ============================================================================\n\nfunction validateCreateInput(input: CreateProfileInput): void {\n if (!input.name || typeof input.name !== 'string') {\n throw new MorphValidationError('name is required', 'name');\n }\n\n const trimmedName = input.name.trim();\n if (trimmedName.length === 0) {\n throw new MorphValidationError('name cannot be empty', 'name');\n }\n\n if (trimmedName.length > 100) {\n throw new MorphValidationError('name must be 100 characters or less', 'name');\n }\n\n if (!input.repoId || typeof input.repoId !== 'string') {\n throw new MorphValidationError('repoId is required', 'repoId');\n }\n\n if (input.repoId.trim().length === 0) {\n throw new MorphValidationError('repoId cannot be empty', 'repoId');\n }\n}\n\nfunction validateId(id: string, fieldName: string): void {\n if (!id || typeof id !== 'string') {\n throw new MorphValidationError(`${fieldName} is required`, fieldName);\n }\n\n if (id.trim().length === 0) {\n throw new MorphValidationError(`${fieldName} cannot be empty`, fieldName);\n }\n}\n\n// ============================================================================\n// Standalone Functions\n// ============================================================================\n\n/**\n * Create a new browser profile.\n */\nexport async function createProfile(\n input: CreateProfileInput,\n config: BrowserConfig = {}\n): Promise<ProfileSetup> {\n validateCreateInput(input);\n\n const apiUrl = config.apiUrl || DEFAULT_API_URL;\n const headers = buildHeaders(config);\n\n const response = await fetchWithRetry(\n `${apiUrl}/profiles`,\n {\n method: 'POST',\n headers,\n body: JSON.stringify(transformCreateInput(input)),\n },\n config.retryConfig\n );\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => response.statusText);\n const requestId = response.headers.get('x-request-id') || undefined;\n throw parseAPIError(response.status, errorText, requestId);\n }\n\n const apiProfile: APIProfile = await response.json();\n const profile = transformProfile(apiProfile);\n const session = await startProfileSession(config, { profileId: profile.id });\n return buildProfileSetup(profile, session, config);\n}\n\n/**\n * List all profiles for the authenticated user.\n */\nexport async function listProfiles(\n config: BrowserConfig = {},\n repoId?: string\n): Promise<Profile[]> {\n const apiUrl = config.apiUrl || DEFAULT_API_URL;\n const headers = buildHeaders(config);\n\n const url = repoId\n ? `${apiUrl}/profiles?repo_id=${encodeURIComponent(repoId)}`\n : `${apiUrl}/profiles`;\n\n const response = await fetchWithRetry(\n url,\n { method: 'GET', headers },\n config.retryConfig\n );\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => response.statusText);\n const requestId = response.headers.get('x-request-id') || undefined;\n throw parseAPIError(response.status, errorText, requestId);\n }\n\n const data: { profiles: APIProfile[] } = await response.json();\n return data.profiles.map(transformProfile);\n}\n\n/**\n * Get a profile by ID with convenience methods.\n */\nexport async function getProfile(\n id: string,\n config: BrowserConfig = {}\n): Promise<ProfileWithMethods> {\n validateId(id, 'id');\n\n const apiUrl = config.apiUrl || DEFAULT_API_URL;\n const headers = buildHeaders(config);\n\n const response = await fetchWithRetry(\n `${apiUrl}/profiles/${encodeURIComponent(id)}`,\n { method: 'GET', headers },\n config.retryConfig\n );\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => response.statusText);\n const requestId = response.headers.get('x-request-id') || undefined;\n throw parseAPIError(response.status, errorText, requestId);\n }\n\n const apiProfile: APIProfile = await response.json();\n const profile = transformProfile(apiProfile);\n\n // Attach convenience methods\n return {\n ...profile,\n getState: () => getProfileState(id, config),\n delete: () => deleteProfile(id, config),\n };\n}\n\n/**\n * Update a profile.\n */\nexport async function updateProfile(\n id: string,\n config: BrowserConfig = {}\n): Promise<ProfileSetup> {\n validateId(id, 'id');\n const profile = await fetchProfile(id, config);\n const session = await startProfileSession(config, { profileId: profile.id });\n return buildProfileSetup(profile, session, config);\n}\n\n/**\n * Delete a profile.\n */\nexport async function deleteProfile(\n id: string,\n config: BrowserConfig = {}\n): Promise<void> {\n validateId(id, 'id');\n\n const apiUrl = config.apiUrl || DEFAULT_API_URL;\n const headers = buildHeaders(config);\n\n const response = await fetchWithRetry(\n `${apiUrl}/profiles/${encodeURIComponent(id)}`,\n { method: 'DELETE', headers },\n config.retryConfig\n );\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => response.statusText);\n const requestId = response.headers.get('x-request-id') || undefined;\n throw parseAPIError(response.status, errorText, requestId);\n }\n}\n\n/**\n * Start a browser session for profile setup.\n */\nexport async function startProfileSession(\n config: BrowserConfig = {},\n input?: ProfileSessionInput\n): Promise<ProfileSession> {\n if (!config.apiKey) {\n throw new MorphAuthenticationError();\n }\n\n const apiUrl = config.apiUrl || DEFAULT_API_URL;\n const headers = buildHeaders(config);\n\n // Transform input if provided\n const body = input?.profileId\n ? { profile_id: input.profileId }\n : {};\n\n const response = await fetchWithRetry(\n `${apiUrl}/profiles/session/start`,\n {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n },\n config.retryConfig\n );\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => response.statusText);\n const requestId = response.headers.get('x-request-id') || undefined;\n throw parseAPIError(response.status, errorText, requestId);\n }\n\n const apiSession: APIProfileSession = await response.json();\n return transformSession(apiSession);\n}\n\n/**\n * Save browser state from a session to a profile.\n */\nexport async function saveProfileSession(\n input: SaveProfileSessionInput,\n config: BrowserConfig = {}\n): Promise<Profile> {\n validateId(input.sessionId, 'sessionId');\n validateId(input.profileId, 'profileId');\n\n const apiUrl = config.apiUrl || DEFAULT_API_URL;\n const headers = buildHeaders(config);\n\n const response = await fetchWithRetry(\n `${apiUrl}/profiles/session/save`,\n {\n method: 'POST',\n headers,\n body: JSON.stringify(transformSaveInput(input)),\n },\n config.retryConfig\n );\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => response.statusText);\n const requestId = response.headers.get('x-request-id') || undefined;\n throw parseAPIError(response.status, errorText, requestId);\n }\n\n const apiProfile: APIProfile = await response.json();\n return transformProfile(apiProfile);\n}\n\n/**\n * List repo IDs available to the authenticated user/org.\n */\nexport async function listRepos(config: BrowserConfig = {}): Promise<RepoSummary[]> {\n const apiUrl = config.apiUrl || DEFAULT_API_URL;\n const headers = buildHeaders(config);\n\n const response = await fetchWithRetry(\n `${apiUrl}/repos`,\n { method: 'GET', headers },\n config.retryConfig\n );\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => response.statusText);\n const requestId = response.headers.get('x-request-id') || undefined;\n throw parseAPIError(response.status, errorText, requestId);\n }\n\n const data = await response.json();\n const repos = Array.isArray(data?.repos) ? data.repos : [];\n\n return repos.map((repo: any) => ({\n repoId: repo.repo_id,\n repoFullName: repo.repo_full_name,\n profileCount: repo.profile_count ?? 0,\n })) satisfies RepoSummary[];\n}\n\n/**\n * Get the presigned URL for a profile's state.\n */\nexport async function getProfileState(\n profileId: string,\n config: BrowserConfig = {}\n): Promise<ProfileStateResponse> {\n validateId(profileId, 'profileId');\n\n const apiUrl = config.apiUrl || DEFAULT_API_URL;\n const headers = buildHeaders(config);\n\n const response = await fetchWithRetry(\n `${apiUrl}/profiles/${encodeURIComponent(profileId)}/state`,\n { method: 'GET', headers },\n config.retryConfig\n );\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => response.statusText);\n const requestId = response.headers.get('x-request-id') || undefined;\n throw parseAPIError(response.status, errorText, requestId);\n }\n\n const apiState: APIProfileStateResponse = await response.json();\n return transformStateResponse(apiState);\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nfunction buildHeaders(config: BrowserConfig): Record<string, string> {\n const headers: Record<string, string> = { 'Content-Type': 'application/json' };\n if (config.apiKey) {\n headers['Authorization'] = `Bearer ${config.apiKey}`;\n }\n return headers;\n}\n\nasync function fetchProfile(id: string, config: BrowserConfig): Promise<Profile> {\n const apiUrl = config.apiUrl || DEFAULT_API_URL;\n const headers = buildHeaders(config);\n\n const response = await fetchWithRetry(\n `${apiUrl}/profiles/${encodeURIComponent(id)}`,\n { method: 'GET', headers },\n config.retryConfig\n );\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => response.statusText);\n const requestId = response.headers.get('x-request-id') || undefined;\n throw parseAPIError(response.status, errorText, requestId);\n }\n\n const apiProfile: APIProfile = await response.json();\n return transformProfile(apiProfile);\n}\n\nfunction buildProfileSetup(profile: Profile, session: ProfileSession, config: BrowserConfig): ProfileSetup {\n return {\n profile,\n session,\n save: () => saveProfileSession({ sessionId: session.sessionId, profileId: profile.id }, config),\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACaA,IAAM,uBAA+D;AAAA,EACnE,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,UAAU;AAAA,EACV,mBAAmB;AAAA,EACnB,iBAAiB,CAAC,gBAAgB,aAAa,WAAW;AAC5D;AAmBA,eAAsB,eACpB,KACA,SACA,cAA2B,CAAC,GACT;AACnB,QAAM;AAAA,IACJ,aAAa,qBAAqB;AAAA,IAClC,eAAe,qBAAqB;AAAA,IACpC,WAAW,qBAAqB;AAAA,IAChC,oBAAoB,qBAAqB;AAAA,IACzC,kBAAkB,qBAAqB;AAAA,IACvC;AAAA,EACF,IAAI;AAEJ,MAAI,YAA0B;AAC9B,MAAI,QAAQ;AAEZ,WAAS,UAAU,GAAG,WAAW,YAAY,WAAW;AACtD,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,KAAK,OAAO;AAGzC,UAAI,SAAS,WAAW,OAAO,SAAS,WAAW,KAAK;AACtD,YAAI,UAAU,YAAY;AAExB,gBAAM,aAAa,SAAS,QAAQ,IAAI,aAAa;AACrD,gBAAM,WAAW,aACb,SAAS,UAAU,IAAI,MACvB,KAAK,IAAI,OAAO,QAAQ;AAE5B,gBAAM,QAAQ,IAAI,MAAM,QAAQ,SAAS,MAAM,oBAAoB,QAAQ,IAAI;AAC/E,cAAI,SAAS;AACX,oBAAQ,UAAU,GAAG,KAAK;AAAA,UAC5B;AAEA,gBAAM,MAAM,QAAQ;AACpB,mBAAS;AACT;AAAA,QACF;AAAA,MACF;AAEA,aAAO;AAAA,IACT,SAAS,OAAO;AACd,kBAAY;AAGZ,YAAM,cAAc,gBAAgB;AAAA,QAAK,aACvC,WAAW,SAAS,SAAS,OAAO;AAAA,MACtC;AAEA,UAAI,CAAC,eAAe,YAAY,YAAY;AAC1C,cAAM;AAAA,MACR;AAGA,YAAM,WAAW,KAAK,IAAI,OAAO,QAAQ;AACzC,UAAI,SAAS;AACX,gBAAQ,UAAU,GAAG,SAAS;AAAA,MAChC;AAEA,YAAM,MAAM,QAAQ;AACpB,eAAS;AAAA,IACX;AAAA,EACF;AAEA,QAAM,aAAa,IAAI,MAAM,sBAAsB;AACrD;AA6CA,SAAS,MAAM,IAA2B;AACxC,SAAO,IAAI,QAAQ,aAAW,WAAW,SAAS,EAAE,CAAC;AACvD;;;ACxGO,IAAM,aAAN,cAAyB,MAAM;AAAA;AAAA,EAE3B;AAAA;AAAA,EAEA;AAAA,EAET,YAAY,SAAiB,MAAsB,OAAe;AAChE,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,OAAO;AACZ,SAAK,QAAQ;AAGb,QAAI,MAAM,mBAAmB;AAC3B,YAAM,kBAAkB,MAAM,KAAK,WAAW;AAAA,IAChD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS;AACP,WAAO;AAAA,MACL,MAAM,KAAK;AAAA,MACX,SAAS,KAAK;AAAA,MACd,MAAM,KAAK;AAAA,MACX,OAAO,KAAK,OAAO;AAAA,IACrB;AAAA,EACF;AACF;AAKO,IAAM,uBAAN,cAAmC,WAAW;AAAA;AAAA,EAE1C;AAAA,EAET,YAAY,SAAiB,OAAgB;AAC3C,UAAM,SAAS,kBAAkB;AACjC,SAAK,OAAO;AACZ,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,SAAS;AACP,WAAO;AAAA,MACL,GAAG,MAAM,OAAO;AAAA,MAChB,OAAO,KAAK;AAAA,IACd;AAAA,EACF;AACF;AAKO,IAAM,gBAAN,cAA4B,WAAW;AAAA;AAAA,EAEnC;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA,EAET,YACE,SACA,MACA,YACA,SAKA;AACA,UAAM,SAAS,MAAM,SAAS,KAAK;AACnC,SAAK,OAAO;AACZ,SAAK,aAAa;AAClB,SAAK,YAAY,SAAS;AAC1B,SAAK,cAAc,SAAS;AAAA,EAC9B;AAAA,EAEA,SAAS;AACP,WAAO;AAAA,MACL,GAAG,MAAM,OAAO;AAAA,MAChB,YAAY,KAAK;AAAA,MACjB,WAAW,KAAK;AAAA,IAClB;AAAA,EACF;AACF;AAKO,IAAM,2BAAN,cAAuC,cAAc;AAAA,EAC1D,YAAY,UAAkB,4DAA4D;AACxF,UAAM,SAAS,2BAA2B,GAAG;AAC7C,SAAK,OAAO;AAAA,EACd;AACF;AAKO,IAAM,sBAAN,cAAkC,cAAc;AAAA;AAAA,EAE5C;AAAA;AAAA,EAEA;AAAA,EAET,YACE,UAAkB,4CAClB,SAKA;AACA,UAAM,SAAS,uBAAuB,KAAK,EAAE,WAAW,SAAS,UAAU,CAAC;AAC5E,SAAK,OAAO;AACZ,SAAK,UAAU,SAAS;AACxB,SAAK,aAAa,SAAS;AAAA,EAC7B;AAAA,EAEA,SAAS;AACP,WAAO;AAAA,MACL,GAAG,MAAM,OAAO;AAAA,MAChB,SAAS,KAAK;AAAA,MACd,YAAY,KAAK;AAAA,IACnB;AAAA,EACF;AACF;AAKO,IAAM,qBAAN,cAAiC,cAAc;AAAA;AAAA,EAE3C;AAAA;AAAA,EAEA;AAAA,EAET,YAAY,cAAsB,YAAqB;AACrD,UAAM,UAAU,aACZ,GAAG,YAAY,KAAK,UAAU,gBAC9B,GAAG,YAAY;AACnB,UAAM,SAAS,sBAAsB,GAAG;AACxC,SAAK,OAAO;AACZ,SAAK,eAAe;AACpB,SAAK,aAAa;AAAA,EACpB;AAAA,EAEA,SAAS;AACP,WAAO;AAAA,MACL,GAAG,MAAM,OAAO;AAAA,MAChB,cAAc,KAAK;AAAA,MACnB,YAAY,KAAK;AAAA,IACnB;AAAA,EACF;AACF;AAKO,IAAM,yBAAN,cAAqC,cAAc;AAAA;AAAA,EAE/C;AAAA;AAAA,EAEA;AAAA,EAET,YACE,UAAkB,yCAClB,SAKA;AACA,UAAM,SAAS,0BAA0B,KAAK,EAAE,WAAW,SAAS,UAAU,CAAC;AAC/E,SAAK,OAAO;AACZ,SAAK,eAAe,SAAS;AAC7B,SAAK,aAAa,SAAS;AAAA,EAC7B;AAAA,EAEA,SAAS;AACP,WAAO;AAAA,MACL,GAAG,MAAM,OAAO;AAAA,MAChB,cAAc,KAAK;AAAA,MACnB,YAAY,KAAK;AAAA,IACnB;AAAA,EACF;AACF;AAKO,SAAS,cACd,YACA,cACA,WACe;AAEf,MAAI,YAAkE,CAAC;AACvE,MAAI;AACF,gBAAY,KAAK,MAAM,YAAY;AAAA,EACrC,QAAQ;AAAA,EAER;AAEA,QAAM,UAAU,UAAU,UAAU,UAAU,WAAW,gBAAgB;AACzE,QAAM,OAAO,UAAU;AAGvB,UAAQ,YAAY;AAAA,IAClB,KAAK;AACH,aAAO,IAAI,yBAAyB,OAAO;AAAA,IAE7C,KAAK;AACH,UAAI,SAAS,4BAA4B,QAAQ,YAAY,EAAE,SAAS,OAAO,GAAG;AAChF,eAAO,IAAI,uBAAuB,SAAS,EAAE,UAAU,CAAC;AAAA,MAC1D;AACA,aAAO,IAAI,cAAc,SAAS,4BAA4B,YAAY,EAAE,WAAW,aAAa,aAAa,CAAC;AAAA,IAEpH,KAAK;AACH,UAAI,QAAQ,YAAY,EAAE,SAAS,SAAS,GAAG;AAC7C,eAAO,IAAI,mBAAmB,WAAW,MAAS;AAAA,MACpD;AACA,UAAI,QAAQ,YAAY,EAAE,SAAS,SAAS,GAAG;AAC7C,eAAO,IAAI,mBAAmB,WAAW,MAAS;AAAA,MACpD;AACA,aAAO,IAAI,cAAc,SAAS,sBAAsB,YAAY,EAAE,WAAW,aAAa,aAAa,CAAC;AAAA,IAE9G,KAAK;AACH,aAAO,IAAI,oBAAoB,SAAS,EAAE,UAAU,CAAC;AAAA,IAEvD,KAAK;AACH,aAAO,IAAI,cAAc,SAAS,oBAAoB,YAAY,EAAE,WAAW,aAAa,aAAa,CAAC;AAAA,IAE5G,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO,IAAI,cAAc,SAAS,uBAAuB,YAAY,EAAE,WAAW,aAAa,aAAa,CAAC;AAAA,IAE/G;AACE,aAAO,IAAI,cAAc,SAAS,iBAAiB,YAAY,EAAE,WAAW,aAAa,aAAa,CAAC;AAAA,EAC3G;AACF;;;ACtGO,SAAS,iBAAiB,KAA0B;AACzD,SAAO;AAAA,IACL,IAAI,IAAI;AAAA,IACR,MAAM,IAAI;AAAA,IACV,QAAQ,IAAI;AAAA,IACZ,eAAe,IAAI;AAAA,IACnB,YAAY,IAAI;AAAA,IAChB,WAAW,IAAI;AAAA,IACf,WAAW,IAAI;AAAA,EACjB;AACF;AAMO,SAAS,qBAAqB,OAA8D;AACjG,SAAO;AAAA,IACL,MAAM,MAAM;AAAA,IACZ,SAAS,MAAM;AAAA,EACjB;AACF;AAMO,SAAS,iBAAiB,KAAwC;AACvE,SAAO;AAAA,IACL,WAAW,IAAI;AAAA,IACf,UAAU,IAAI,aAAa;AAAA,EAC7B;AACF;AAMO,SAAS,mBAAmB,OAA4E;AAC7G,SAAO;AAAA,IACL,YAAY,MAAM;AAAA,IAClB,YAAY,MAAM;AAAA,EACpB;AACF;AAMO,SAAS,uBAAuB,KAAoD;AACzF,SAAO;AAAA,IACL,WAAW,IAAI;AAAA,IACf,UAAU,IAAI;AAAA,IACd,WAAW,IAAI;AAAA,EACjB;AACF;;;AC5LA,IAAM,kBAAkB,QAAQ,IAAI,sBAAsB,QACtD,0BACA;AAOG,IAAM,iBAAN,MAAqB;AAAA,EAClB;AAAA,EAER,YAAY,QAAuB;AACjC,SAAK,SAAS;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqBA,MAAM,cAAc,OAAkD;AACpE,WAAO,cAAc,OAAO,KAAK,MAAM;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,MAAM,aAAa,QAAqC;AACtD,WAAO,aAAa,KAAK,QAAQ,MAAM;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,MAAM,WAAW,IAAyC;AACxD,WAAO,WAAW,IAAI,KAAK,MAAM;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,cAAc,IAAmC;AACrD,WAAO,cAAc,IAAI,KAAK,MAAM;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,cAAc,IAA2B;AAC7C,WAAO,cAAc,IAAI,KAAK,MAAM;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,MAAM,aAAa,OAAsD;AACvE,WAAO,oBAAoB,KAAK,QAAQ,KAAK;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,YAAY,WAAmB,WAAqC;AACxE,WAAO,mBAAmB,EAAE,WAAW,UAAU,GAAG,KAAK,MAAM;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,YAAoC;AACxC,WAAO,UAAU,KAAK,MAAM;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,gBAAgB,WAAkD;AACtE,WAAO,gBAAgB,WAAW,KAAK,MAAM;AAAA,EAC/C;AACF;AAMA,SAAS,oBAAoB,OAAiC;AAC5D,MAAI,CAAC,MAAM,QAAQ,OAAO,MAAM,SAAS,UAAU;AACjD,UAAM,IAAI,qBAAqB,oBAAoB,MAAM;AAAA,EAC3D;AAEA,QAAM,cAAc,MAAM,KAAK,KAAK;AACpC,MAAI,YAAY,WAAW,GAAG;AAC5B,UAAM,IAAI,qBAAqB,wBAAwB,MAAM;AAAA,EAC/D;AAEA,MAAI,YAAY,SAAS,KAAK;AAC5B,UAAM,IAAI,qBAAqB,uCAAuC,MAAM;AAAA,EAC9E;AAEA,MAAI,CAAC,MAAM,UAAU,OAAO,MAAM,WAAW,UAAU;AACrD,UAAM,IAAI,qBAAqB,sBAAsB,QAAQ;AAAA,EAC/D;AAEA,MAAI,MAAM,OAAO,KAAK,EAAE,WAAW,GAAG;AACpC,UAAM,IAAI,qBAAqB,0BAA0B,QAAQ;AAAA,EACnE;AACF;AAEA,SAAS,WAAW,IAAY,WAAyB;AACvD,MAAI,CAAC,MAAM,OAAO,OAAO,UAAU;AACjC,UAAM,IAAI,qBAAqB,GAAG,SAAS,gBAAgB,SAAS;AAAA,EACtE;AAEA,MAAI,GAAG,KAAK,EAAE,WAAW,GAAG;AAC1B,UAAM,IAAI,qBAAqB,GAAG,SAAS,oBAAoB,SAAS;AAAA,EAC1E;AACF;AASA,eAAsB,cACpB,OACA,SAAwB,CAAC,GACF;AACvB,sBAAoB,KAAK;AAEzB,QAAM,SAAS,OAAO,UAAU;AAChC,QAAM,UAAU,aAAa,MAAM;AAEnC,QAAM,WAAW,MAAM;AAAA,IACrB,GAAG,MAAM;AAAA,IACT;AAAA,MACE,QAAQ;AAAA,MACR;AAAA,MACA,MAAM,KAAK,UAAU,qBAAqB,KAAK,CAAC;AAAA,IAClD;AAAA,IACA,OAAO;AAAA,EACT;AAEA,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,YAAY,MAAM,SAAS,KAAK,EAAE,MAAM,MAAM,SAAS,UAAU;AACvE,UAAM,YAAY,SAAS,QAAQ,IAAI,cAAc,KAAK;AAC1D,UAAM,cAAc,SAAS,QAAQ,WAAW,SAAS;AAAA,EAC3D;AAEA,QAAM,aAAyB,MAAM,SAAS,KAAK;AACnD,QAAM,UAAU,iBAAiB,UAAU;AAC3C,QAAM,UAAU,MAAM,oBAAoB,QAAQ,EAAE,WAAW,QAAQ,GAAG,CAAC;AAC3E,SAAO,kBAAkB,SAAS,SAAS,MAAM;AACnD;AAKA,eAAsB,aACpB,SAAwB,CAAC,GACzB,QACoB;AACpB,QAAM,SAAS,OAAO,UAAU;AAChC,QAAM,UAAU,aAAa,MAAM;AAEnC,QAAM,MAAM,SACR,GAAG,MAAM,qBAAqB,mBAAmB,MAAM,CAAC,KACxD,GAAG,MAAM;AAEb,QAAM,WAAW,MAAM;AAAA,IACrB;AAAA,IACA,EAAE,QAAQ,OAAO,QAAQ;AAAA,IACzB,OAAO;AAAA,EACT;AAEA,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,YAAY,MAAM,SAAS,KAAK,EAAE,MAAM,MAAM,SAAS,UAAU;AACvE,UAAM,YAAY,SAAS,QAAQ,IAAI,cAAc,KAAK;AAC1D,UAAM,cAAc,SAAS,QAAQ,WAAW,SAAS;AAAA,EAC3D;AAEA,QAAM,OAAmC,MAAM,SAAS,KAAK;AAC7D,SAAO,KAAK,SAAS,IAAI,gBAAgB;AAC3C;AAKA,eAAsB,WACpB,IACA,SAAwB,CAAC,GACI;AAC7B,aAAW,IAAI,IAAI;AAEnB,QAAM,SAAS,OAAO,UAAU;AAChC,QAAM,UAAU,aAAa,MAAM;AAEnC,QAAM,WAAW,MAAM;AAAA,IACrB,GAAG,MAAM,aAAa,mBAAmB,EAAE,CAAC;AAAA,IAC5C,EAAE,QAAQ,OAAO,QAAQ;AAAA,IACzB,OAAO;AAAA,EACT;AAEA,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,YAAY,MAAM,SAAS,KAAK,EAAE,MAAM,MAAM,SAAS,UAAU;AACvE,UAAM,YAAY,SAAS,QAAQ,IAAI,cAAc,KAAK;AAC1D,UAAM,cAAc,SAAS,QAAQ,WAAW,SAAS;AAAA,EAC3D;AAEA,QAAM,aAAyB,MAAM,SAAS,KAAK;AACnD,QAAM,UAAU,iBAAiB,UAAU;AAG3C,SAAO;AAAA,IACL,GAAG;AAAA,IACH,UAAU,MAAM,gBAAgB,IAAI,MAAM;AAAA,IAC1C,QAAQ,MAAM,cAAc,IAAI,MAAM;AAAA,EACxC;AACF;AAKA,eAAsB,cACpB,IACA,SAAwB,CAAC,GACF;AACvB,aAAW,IAAI,IAAI;AACnB,QAAM,UAAU,MAAM,aAAa,IAAI,MAAM;AAC7C,QAAM,UAAU,MAAM,oBAAoB,QAAQ,EAAE,WAAW,QAAQ,GAAG,CAAC;AAC3E,SAAO,kBAAkB,SAAS,SAAS,MAAM;AACnD;AAKA,eAAsB,cACpB,IACA,SAAwB,CAAC,GACV;AACf,aAAW,IAAI,IAAI;AAEnB,QAAM,SAAS,OAAO,UAAU;AAChC,QAAM,UAAU,aAAa,MAAM;AAEnC,QAAM,WAAW,MAAM;AAAA,IACrB,GAAG,MAAM,aAAa,mBAAmB,EAAE,CAAC;AAAA,IAC5C,EAAE,QAAQ,UAAU,QAAQ;AAAA,IAC5B,OAAO;AAAA,EACT;AAEA,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,YAAY,MAAM,SAAS,KAAK,EAAE,MAAM,MAAM,SAAS,UAAU;AACvE,UAAM,YAAY,SAAS,QAAQ,IAAI,cAAc,KAAK;AAC1D,UAAM,cAAc,SAAS,QAAQ,WAAW,SAAS;AAAA,EAC3D;AACF;AAKA,eAAsB,oBACpB,SAAwB,CAAC,GACzB,OACyB;AACzB,MAAI,CAAC,OAAO,QAAQ;AAClB,UAAM,IAAI,yBAAyB;AAAA,EACrC;AAEA,QAAM,SAAS,OAAO,UAAU;AAChC,QAAM,UAAU,aAAa,MAAM;AAGnC,QAAM,OAAO,OAAO,YAChB,EAAE,YAAY,MAAM,UAAU,IAC9B,CAAC;AAEL,QAAM,WAAW,MAAM;AAAA,IACrB,GAAG,MAAM;AAAA,IACT;AAAA,MACE,QAAQ;AAAA,MACR;AAAA,MACA,MAAM,KAAK,UAAU,IAAI;AAAA,IAC3B;AAAA,IACA,OAAO;AAAA,EACT;AAEA,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,YAAY,MAAM,SAAS,KAAK,EAAE,MAAM,MAAM,SAAS,UAAU;AACvE,UAAM,YAAY,SAAS,QAAQ,IAAI,cAAc,KAAK;AAC1D,UAAM,cAAc,SAAS,QAAQ,WAAW,SAAS;AAAA,EAC3D;AAEA,QAAM,aAAgC,MAAM,SAAS,KAAK;AAC1D,SAAO,iBAAiB,UAAU;AACpC;AAKA,eAAsB,mBACpB,OACA,SAAwB,CAAC,GACP;AAClB,aAAW,MAAM,WAAW,WAAW;AACvC,aAAW,MAAM,WAAW,WAAW;AAEvC,QAAM,SAAS,OAAO,UAAU;AAChC,QAAM,UAAU,aAAa,MAAM;AAEnC,QAAM,WAAW,MAAM;AAAA,IACrB,GAAG,MAAM;AAAA,IACT;AAAA,MACE,QAAQ;AAAA,MACR;AAAA,MACA,MAAM,KAAK,UAAU,mBAAmB,KAAK,CAAC;AAAA,IAChD;AAAA,IACA,OAAO;AAAA,EACT;AAEA,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,YAAY,MAAM,SAAS,KAAK,EAAE,MAAM,MAAM,SAAS,UAAU;AACvE,UAAM,YAAY,SAAS,QAAQ,IAAI,cAAc,KAAK;AAC1D,UAAM,cAAc,SAAS,QAAQ,WAAW,SAAS;AAAA,EAC3D;AAEA,QAAM,aAAyB,MAAM,SAAS,KAAK;AACnD,SAAO,iBAAiB,UAAU;AACpC;AAKA,eAAsB,UAAU,SAAwB,CAAC,GAA2B;AAClF,QAAM,SAAS,OAAO,UAAU;AAChC,QAAM,UAAU,aAAa,MAAM;AAEnC,QAAM,WAAW,MAAM;AAAA,IACrB,GAAG,MAAM;AAAA,IACT,EAAE,QAAQ,OAAO,QAAQ;AAAA,IACzB,OAAO;AAAA,EACT;AAEA,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,YAAY,MAAM,SAAS,KAAK,EAAE,MAAM,MAAM,SAAS,UAAU;AACvE,UAAM,YAAY,SAAS,QAAQ,IAAI,cAAc,KAAK;AAC1D,UAAM,cAAc,SAAS,QAAQ,WAAW,SAAS;AAAA,EAC3D;AAEA,QAAM,OAAO,MAAM,SAAS,KAAK;AACjC,QAAM,QAAQ,MAAM,QAAQ,MAAM,KAAK,IAAI,KAAK,QAAQ,CAAC;AAEzD,SAAO,MAAM,IAAI,CAAC,UAAe;AAAA,IAC/B,QAAQ,KAAK;AAAA,IACb,cAAc,KAAK;AAAA,IACnB,cAAc,KAAK,iBAAiB;AAAA,EACtC,EAAE;AACJ;AAKA,eAAsB,gBACpB,WACA,SAAwB,CAAC,GACM;AAC/B,aAAW,WAAW,WAAW;AAEjC,QAAM,SAAS,OAAO,UAAU;AAChC,QAAM,UAAU,aAAa,MAAM;AAEnC,QAAM,WAAW,MAAM;AAAA,IACrB,GAAG,MAAM,aAAa,mBAAmB,SAAS,CAAC;AAAA,IACnD,EAAE,QAAQ,OAAO,QAAQ;AAAA,IACzB,OAAO;AAAA,EACT;AAEA,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,YAAY,MAAM,SAAS,KAAK,EAAE,MAAM,MAAM,SAAS,UAAU;AACvE,UAAM,YAAY,SAAS,QAAQ,IAAI,cAAc,KAAK;AAC1D,UAAM,cAAc,SAAS,QAAQ,WAAW,SAAS;AAAA,EAC3D;AAEA,QAAM,WAAoC,MAAM,SAAS,KAAK;AAC9D,SAAO,uBAAuB,QAAQ;AACxC;AAMA,SAAS,aAAa,QAA+C;AACnE,QAAM,UAAkC,EAAE,gBAAgB,mBAAmB;AAC7E,MAAI,OAAO,QAAQ;AACjB,YAAQ,eAAe,IAAI,UAAU,OAAO,MAAM;AAAA,EACpD;AACA,SAAO;AACT;AAEA,eAAe,aAAa,IAAY,QAAyC;AAC/E,QAAM,SAAS,OAAO,UAAU;AAChC,QAAM,UAAU,aAAa,MAAM;AAEnC,QAAM,WAAW,MAAM;AAAA,IACrB,GAAG,MAAM,aAAa,mBAAmB,EAAE,CAAC;AAAA,IAC5C,EAAE,QAAQ,OAAO,QAAQ;AAAA,IACzB,OAAO;AAAA,EACT;AAEA,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,YAAY,MAAM,SAAS,KAAK,EAAE,MAAM,MAAM,SAAS,UAAU;AACvE,UAAM,YAAY,SAAS,QAAQ,IAAI,cAAc,KAAK;AAC1D,UAAM,cAAc,SAAS,QAAQ,WAAW,SAAS;AAAA,EAC3D;AAEA,QAAM,aAAyB,MAAM,SAAS,KAAK;AACnD,SAAO,iBAAiB,UAAU;AACpC;AAEA,SAAS,kBAAkB,SAAkB,SAAyB,QAAqC;AACzG,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,MAAM,MAAM,mBAAmB,EAAE,WAAW,QAAQ,WAAW,WAAW,QAAQ,GAAG,GAAG,MAAM;AAAA,EAChG;AACF;","names":[]}
@@ -0,0 +1,4 @@
1
+ export { ProfilesClient, createProfile, deleteProfile, getProfile, getProfileState, listProfiles, listRepos, saveProfileSession, startProfileSession, updateProfile } from './core.js';
2
+ export { CreateProfileInput, Profile, ProfileListResponse, ProfileSession, ProfileSessionInput, ProfileSetup, ProfileStateResponse, ProfileWithMethods, RepoListResponse, RepoSummary, SaveProfileSessionInput } from './types.js';
3
+ import '../types.js';
4
+ import '../../utils/resilience.js';
@@ -0,0 +1,29 @@
1
+ import {
2
+ ProfilesClient,
3
+ createProfile,
4
+ deleteProfile,
5
+ getProfile,
6
+ getProfileState,
7
+ listProfiles,
8
+ listRepos,
9
+ saveProfileSession,
10
+ startProfileSession,
11
+ updateProfile
12
+ } from "../../../chunk-SI2CKRKJ.js";
13
+ import "../../../chunk-2AMEQAO2.js";
14
+ import "../../../chunk-2VERUKO2.js";
15
+ import "../../../chunk-4VWJFZVS.js";
16
+ import "../../../chunk-PZ5AY32C.js";
17
+ export {
18
+ ProfilesClient,
19
+ createProfile,
20
+ deleteProfile,
21
+ getProfile,
22
+ getProfileState,
23
+ listProfiles,
24
+ listRepos,
25
+ saveProfileSession,
26
+ startProfileSession,
27
+ updateProfile
28
+ };
29
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // tools/browser/profiles/types.ts
21
+ var types_exports = {};
22
+ __export(types_exports, {
23
+ transformCreateInput: () => transformCreateInput,
24
+ transformProfile: () => transformProfile,
25
+ transformSaveInput: () => transformSaveInput,
26
+ transformSession: () => transformSession,
27
+ transformStateResponse: () => transformStateResponse
28
+ });
29
+ module.exports = __toCommonJS(types_exports);
30
+ function transformProfile(api) {
31
+ return {
32
+ id: api.id,
33
+ name: api.name,
34
+ repoId: api.repo_id,
35
+ cookieDomains: api.cookie_domains,
36
+ lastUsedAt: api.last_used_at,
37
+ createdAt: api.created_at,
38
+ updatedAt: api.updated_at
39
+ };
40
+ }
41
+ function transformCreateInput(input) {
42
+ return {
43
+ name: input.name,
44
+ repo_id: input.repoId
45
+ };
46
+ }
47
+ function transformSession(api) {
48
+ return {
49
+ sessionId: api.session_id,
50
+ debugUrl: api.debug_url || ""
51
+ };
52
+ }
53
+ function transformSaveInput(input) {
54
+ return {
55
+ session_id: input.sessionId,
56
+ profile_id: input.profileId
57
+ };
58
+ }
59
+ function transformStateResponse(api) {
60
+ return {
61
+ profileId: api.profile_id,
62
+ stateUrl: api.state_url,
63
+ expiresIn: api.expires_in
64
+ };
65
+ }
66
+ // Annotate the CommonJS export names for ESM import in node:
67
+ 0 && (module.exports = {
68
+ transformCreateInput,
69
+ transformProfile,
70
+ transformSaveInput,
71
+ transformSession,
72
+ transformStateResponse
73
+ });
74
+ //# sourceMappingURL=types.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../tools/browser/profiles/types.ts"],"sourcesContent":["/**\n * Type definitions for browser profiles.\n *\n * All types use camelCase for SDK ergonomics.\n * API responses are normalized from snake_case to camelCase.\n */\n\n/**\n * A browser profile that stores login state (cookies, localStorage).\n *\n * @example\n * ```typescript\n * const profile = await morph.browser.profiles.getProfile('profile-id');\n * console.log(profile.cookieDomains); // ['linkedin.com', 'google.com']\n * ```\n */\nexport interface Profile {\n /** Unique profile identifier (UUID) */\n id: string;\n /** Human-readable profile name */\n name: string;\n /** Repository ID this profile is associated with */\n repoId: string;\n /** List of domains with stored cookies */\n cookieDomains?: string[];\n /** ISO 8601 timestamp of last use */\n lastUsedAt?: string;\n /** ISO 8601 timestamp of creation */\n createdAt: string;\n /** ISO 8601 timestamp of last update */\n updatedAt: string;\n}\n\n/**\n * Input for creating a new profile.\n *\n * @example\n * ```typescript\n * await morph.browser.profiles.createProfile({\n * name: 'LinkedIn Production',\n * repoId: 'owner/repo'\n * });\n * ```\n */\nexport interface CreateProfileInput {\n /** Profile name (1-100 characters) */\n name: string;\n /** Repository ID - profiles are repo-specific */\n repoId: string;\n}\n\n/**\n * Input for updating a profile.\n */\n// Intentionally no UpdateProfileInput: update means \"open a live session\"\n\n/**\n * Response for listing profiles.\n */\nexport interface ProfileListResponse {\n profiles: Profile[];\n}\n\n/**\n * A browser session for profile setup.\n *\n * @example\n * ```typescript\n * const session = await morph.browser.profiles.startSession();\n * console.log('Sign in at:', session.debugUrl);\n * // After user signs in...\n * await morph.browser.profiles.saveSession(session.sessionId, profile.id);\n * ```\n */\nexport interface ProfileSession {\n /** Unique session identifier */\n sessionId: string;\n /** Live session URL for viewing/interacting with the browser */\n debugUrl: string;\n}\n\n/**\n * Profile setup handle returned by create/update.\n *\n * Provides a live URL for login and an explicit save() helper.\n */\nexport interface ProfileSetup {\n profile: Profile;\n session: ProfileSession;\n save: () => Promise<Profile>;\n}\n/**\n * Input for starting a profile session.\n */\nexport interface ProfileSessionInput {\n /** Optional profile ID to update an existing profile */\n profileId?: string;\n}\n\n/**\n * Input for saving a profile session.\n */\nexport interface SaveProfileSessionInput {\n /** The browser session ID to extract state from */\n sessionId: string;\n /** The profile ID to save state to */\n profileId: string;\n}\n\n/**\n * Response for profile state URL.\n */\nexport interface ProfileStateResponse {\n /** Profile ID */\n profileId: string;\n /** Presigned URL to download the profile state (expires in `expiresIn` seconds) */\n stateUrl: string;\n /** URL expiry time in seconds */\n expiresIn: number;\n}\n\n/**\n * Repo summary for profile discovery.\n */\nexport interface RepoSummary {\n repoId: string;\n repoFullName?: string;\n profileCount: number;\n}\n\n/**\n * Response for repo discovery.\n */\nexport interface RepoListResponse {\n repos: RepoSummary[];\n}\n\n/**\n * Profile with convenience methods attached.\n *\n * @example\n * ```typescript\n * const profile = await morph.browser.profiles.getProfile('id');\n * const state = await profile.getState();\n * await profile.delete();\n * ```\n */\nexport interface ProfileWithMethods extends Profile {\n /** Get presigned URL for profile state */\n getState: () => Promise<ProfileStateResponse>;\n /** Delete this profile */\n delete: () => Promise<void>;\n}\n\n// ============================================================================\n// Internal API types (snake_case - matches backend response)\n// ============================================================================\n\n/** @internal API response format */\nexport interface APIProfile {\n id: string;\n name: string;\n repo_id: string;\n cookie_domains?: string[];\n last_used_at?: string;\n created_at: string;\n updated_at: string;\n}\n\n/** @internal API response format */\nexport interface APIProfileSession {\n session_id: string;\n debug_url?: string;\n}\n\n/** @internal API response format */\nexport interface APIProfileStateResponse {\n profile_id: string;\n state_url: string;\n expires_in: number;\n}\n\n// ============================================================================\n// Transformers\n// ============================================================================\n\n/**\n * Transform API profile response to SDK format.\n * @internal\n */\nexport function transformProfile(api: APIProfile): Profile {\n return {\n id: api.id,\n name: api.name,\n repoId: api.repo_id,\n cookieDomains: api.cookie_domains,\n lastUsedAt: api.last_used_at,\n createdAt: api.created_at,\n updatedAt: api.updated_at,\n };\n}\n\n/**\n * Transform SDK input to API format.\n * @internal\n */\nexport function transformCreateInput(input: CreateProfileInput): { name: string; repo_id: string } {\n return {\n name: input.name,\n repo_id: input.repoId,\n };\n}\n\n/**\n * Transform API session response to SDK format.\n * @internal\n */\nexport function transformSession(api: APIProfileSession): ProfileSession {\n return {\n sessionId: api.session_id,\n debugUrl: api.debug_url || '',\n };\n}\n\n/**\n * Transform SDK save input to API format.\n * @internal\n */\nexport function transformSaveInput(input: SaveProfileSessionInput): { session_id: string; profile_id: string } {\n return {\n session_id: input.sessionId,\n profile_id: input.profileId,\n };\n}\n\n/**\n * Transform API state response to SDK format.\n * @internal\n */\nexport function transformStateResponse(api: APIProfileStateResponse): ProfileStateResponse {\n return {\n profileId: api.profile_id,\n stateUrl: api.state_url,\n expiresIn: api.expires_in,\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA8LO,SAAS,iBAAiB,KAA0B;AACzD,SAAO;AAAA,IACL,IAAI,IAAI;AAAA,IACR,MAAM,IAAI;AAAA,IACV,QAAQ,IAAI;AAAA,IACZ,eAAe,IAAI;AAAA,IACnB,YAAY,IAAI;AAAA,IAChB,WAAW,IAAI;AAAA,IACf,WAAW,IAAI;AAAA,EACjB;AACF;AAMO,SAAS,qBAAqB,OAA8D;AACjG,SAAO;AAAA,IACL,MAAM,MAAM;AAAA,IACZ,SAAS,MAAM;AAAA,EACjB;AACF;AAMO,SAAS,iBAAiB,KAAwC;AACvE,SAAO;AAAA,IACL,WAAW,IAAI;AAAA,IACf,UAAU,IAAI,aAAa;AAAA,EAC7B;AACF;AAMO,SAAS,mBAAmB,OAA4E;AAC7G,SAAO;AAAA,IACL,YAAY,MAAM;AAAA,IAClB,YAAY,MAAM;AAAA,EACpB;AACF;AAMO,SAAS,uBAAuB,KAAoD;AACzF,SAAO;AAAA,IACL,WAAW,IAAI;AAAA,IACf,UAAU,IAAI;AAAA,IACd,WAAW,IAAI;AAAA,EACjB;AACF;","names":[]}
@@ -0,0 +1,195 @@
1
+ /**
2
+ * Type definitions for browser profiles.
3
+ *
4
+ * All types use camelCase for SDK ergonomics.
5
+ * API responses are normalized from snake_case to camelCase.
6
+ */
7
+ /**
8
+ * A browser profile that stores login state (cookies, localStorage).
9
+ *
10
+ * @example
11
+ * ```typescript
12
+ * const profile = await morph.browser.profiles.getProfile('profile-id');
13
+ * console.log(profile.cookieDomains); // ['linkedin.com', 'google.com']
14
+ * ```
15
+ */
16
+ interface Profile {
17
+ /** Unique profile identifier (UUID) */
18
+ id: string;
19
+ /** Human-readable profile name */
20
+ name: string;
21
+ /** Repository ID this profile is associated with */
22
+ repoId: string;
23
+ /** List of domains with stored cookies */
24
+ cookieDomains?: string[];
25
+ /** ISO 8601 timestamp of last use */
26
+ lastUsedAt?: string;
27
+ /** ISO 8601 timestamp of creation */
28
+ createdAt: string;
29
+ /** ISO 8601 timestamp of last update */
30
+ updatedAt: string;
31
+ }
32
+ /**
33
+ * Input for creating a new profile.
34
+ *
35
+ * @example
36
+ * ```typescript
37
+ * await morph.browser.profiles.createProfile({
38
+ * name: 'LinkedIn Production',
39
+ * repoId: 'owner/repo'
40
+ * });
41
+ * ```
42
+ */
43
+ interface CreateProfileInput {
44
+ /** Profile name (1-100 characters) */
45
+ name: string;
46
+ /** Repository ID - profiles are repo-specific */
47
+ repoId: string;
48
+ }
49
+ /**
50
+ * Input for updating a profile.
51
+ */
52
+ /**
53
+ * Response for listing profiles.
54
+ */
55
+ interface ProfileListResponse {
56
+ profiles: Profile[];
57
+ }
58
+ /**
59
+ * A browser session for profile setup.
60
+ *
61
+ * @example
62
+ * ```typescript
63
+ * const session = await morph.browser.profiles.startSession();
64
+ * console.log('Sign in at:', session.debugUrl);
65
+ * // After user signs in...
66
+ * await morph.browser.profiles.saveSession(session.sessionId, profile.id);
67
+ * ```
68
+ */
69
+ interface ProfileSession {
70
+ /** Unique session identifier */
71
+ sessionId: string;
72
+ /** Live session URL for viewing/interacting with the browser */
73
+ debugUrl: string;
74
+ }
75
+ /**
76
+ * Profile setup handle returned by create/update.
77
+ *
78
+ * Provides a live URL for login and an explicit save() helper.
79
+ */
80
+ interface ProfileSetup {
81
+ profile: Profile;
82
+ session: ProfileSession;
83
+ save: () => Promise<Profile>;
84
+ }
85
+ /**
86
+ * Input for starting a profile session.
87
+ */
88
+ interface ProfileSessionInput {
89
+ /** Optional profile ID to update an existing profile */
90
+ profileId?: string;
91
+ }
92
+ /**
93
+ * Input for saving a profile session.
94
+ */
95
+ interface SaveProfileSessionInput {
96
+ /** The browser session ID to extract state from */
97
+ sessionId: string;
98
+ /** The profile ID to save state to */
99
+ profileId: string;
100
+ }
101
+ /**
102
+ * Response for profile state URL.
103
+ */
104
+ interface ProfileStateResponse {
105
+ /** Profile ID */
106
+ profileId: string;
107
+ /** Presigned URL to download the profile state (expires in `expiresIn` seconds) */
108
+ stateUrl: string;
109
+ /** URL expiry time in seconds */
110
+ expiresIn: number;
111
+ }
112
+ /**
113
+ * Repo summary for profile discovery.
114
+ */
115
+ interface RepoSummary {
116
+ repoId: string;
117
+ repoFullName?: string;
118
+ profileCount: number;
119
+ }
120
+ /**
121
+ * Response for repo discovery.
122
+ */
123
+ interface RepoListResponse {
124
+ repos: RepoSummary[];
125
+ }
126
+ /**
127
+ * Profile with convenience methods attached.
128
+ *
129
+ * @example
130
+ * ```typescript
131
+ * const profile = await morph.browser.profiles.getProfile('id');
132
+ * const state = await profile.getState();
133
+ * await profile.delete();
134
+ * ```
135
+ */
136
+ interface ProfileWithMethods extends Profile {
137
+ /** Get presigned URL for profile state */
138
+ getState: () => Promise<ProfileStateResponse>;
139
+ /** Delete this profile */
140
+ delete: () => Promise<void>;
141
+ }
142
+ /** @internal API response format */
143
+ interface APIProfile {
144
+ id: string;
145
+ name: string;
146
+ repo_id: string;
147
+ cookie_domains?: string[];
148
+ last_used_at?: string;
149
+ created_at: string;
150
+ updated_at: string;
151
+ }
152
+ /** @internal API response format */
153
+ interface APIProfileSession {
154
+ session_id: string;
155
+ debug_url?: string;
156
+ }
157
+ /** @internal API response format */
158
+ interface APIProfileStateResponse {
159
+ profile_id: string;
160
+ state_url: string;
161
+ expires_in: number;
162
+ }
163
+ /**
164
+ * Transform API profile response to SDK format.
165
+ * @internal
166
+ */
167
+ declare function transformProfile(api: APIProfile): Profile;
168
+ /**
169
+ * Transform SDK input to API format.
170
+ * @internal
171
+ */
172
+ declare function transformCreateInput(input: CreateProfileInput): {
173
+ name: string;
174
+ repo_id: string;
175
+ };
176
+ /**
177
+ * Transform API session response to SDK format.
178
+ * @internal
179
+ */
180
+ declare function transformSession(api: APIProfileSession): ProfileSession;
181
+ /**
182
+ * Transform SDK save input to API format.
183
+ * @internal
184
+ */
185
+ declare function transformSaveInput(input: SaveProfileSessionInput): {
186
+ session_id: string;
187
+ profile_id: string;
188
+ };
189
+ /**
190
+ * Transform API state response to SDK format.
191
+ * @internal
192
+ */
193
+ declare function transformStateResponse(api: APIProfileStateResponse): ProfileStateResponse;
194
+
195
+ export { type APIProfile, type APIProfileSession, type APIProfileStateResponse, type CreateProfileInput, type Profile, type ProfileListResponse, type ProfileSession, type ProfileSessionInput, type ProfileSetup, type ProfileStateResponse, type ProfileWithMethods, type RepoListResponse, type RepoSummary, type SaveProfileSessionInput, transformCreateInput, transformProfile, transformSaveInput, transformSession, transformStateResponse };
@@ -0,0 +1,16 @@
1
+ import {
2
+ transformCreateInput,
3
+ transformProfile,
4
+ transformSaveInput,
5
+ transformSession,
6
+ transformStateResponse
7
+ } from "../../../chunk-2AMEQAO2.js";
8
+ import "../../../chunk-PZ5AY32C.js";
9
+ export {
10
+ transformCreateInput,
11
+ transformProfile,
12
+ transformSaveInput,
13
+ transformSession,
14
+ transformStateResponse
15
+ };
16
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -59,7 +59,7 @@ Include verification steps:
59
59
  ## Requirements
60
60
  - **URL**: Must be publicly accessible (use tunnels like ngrok, Cloudflare, or deploy to staging)
61
61
  - **Timing**: Use this after implementation, not during coding
62
- - **Complexity**: Set max_steps higher (20-30) for multi-step user workflows`;
62
+ - **Complexity**: Set maxSteps higher (20-30) for multi-step user workflows`;
63
63
  var BROWSER_SYSTEM_PROMPT = `You are an AI agent designed to automate browser tasks to accomplish the <user_request>. Respond with a valid JSON object in the format: {"thinking": "Reason step-by-step about your current state, history, and the user request to decide your next goal and action. Analyze the browser state and screenshot to confirm the outcome of your last action.", "evaluation_previous_goal": "A concise, one-sentence evaluation of your last action's outcome (e.g., Success, Failure, or Uncertain).", "memory": "1-3 sentences summarizing key information and progress so far. This helps you track progress across multiple steps (e.g., items collected, pages visited).", "next_goal": "A clear, one-sentence description of your immediate next objective.", "action": [{"action_name": {"parameter": "value"}}]}`;
64
64
  // Annotate the CommonJS export names for ESM import in node:
65
65
  0 && (module.exports = {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../tools/browser/prompts.ts"],"sourcesContent":["/**\n * Tool descriptions and prompts for AI models\n */\n\nexport const BROWSER_TOOL_DESCRIPTION = `Test and verify your implemented code in a live browser. This tool executes natural language test instructions and returns a video recording plus detailed logs to help you debug issues.\n\n## When to Use\nUse this AFTER coding is complete to verify your implementation:\n- You've finished writing/modifying code and need to verify it works\n- You need to test user interactions end-to-end (clicks, forms, navigation)\n- You want to catch runtime errors, console warnings, or network failures\n- You need visual confirmation that UI elements render and behave correctly\n\n## What You Get Back\nThe tool returns debugging artifacts to help you identify and fix issues:\n- **Video recording**: Watch exactly what happened in the browser session\n- **Console logs**: All console.log, warnings, and errors with timestamps\n- **Network logs**: Failed requests, 404s, API errors with screenshots\n- **Error screenshots**: Visual snapshots captured when errors occur\n\n## How to Write Good Tests\nBe specific about the user journey you're testing:\n❌ Bad: \"Test the login feature\"\n✅ Good: \"Navigate to /login, enter 'test@example.com' and 'password123', click the Login button, verify we reach the /dashboard page\"\n\nInclude verification steps:\n✅ \"Click the Add Item button, verify the item appears in the list\"\n✅ \"Submit the form, verify a success message is displayed\"\n\n## Iterating on Failures\n1. Run the test and review the video + logs\n2. Identify the specific issue (console error, failed request, wrong behavior)\n3. Fix the code based on the evidence\n4. Re-run the test to verify the fix\n5. Repeat until test passes\n\n## Requirements\n- **URL**: Must be publicly accessible (use tunnels like ngrok, Cloudflare, or deploy to staging)\n- **Timing**: Use this after implementation, not during coding\n- **Complexity**: Set max_steps higher (20-30) for multi-step user workflows`;\n\n\nexport const BROWSER_SYSTEM_PROMPT = `You are an AI agent designed to automate browser tasks to accomplish the <user_request>. Respond with a valid JSON object in the format: {\"thinking\": \"Reason step-by-step about your current state, history, and the user request to decide your next goal and action. Analyze the browser state and screenshot to confirm the outcome of your last action.\", \"evaluation_previous_goal\": \"A concise, one-sentence evaluation of your last action's outcome (e.g., Success, Failure, or Uncertain).\", \"memory\": \"1-3 sentences summarizing key information and progress so far. This helps you track progress across multiple steps (e.g., items collected, pages visited).\", \"next_goal\": \"A clear, one-sentence description of your immediate next objective.\", \"action\": [{\"action_name\": {\"parameter\": \"value\"}}]}`;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIO,IAAM,2BAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsCjC,IAAM,wBAAwB;","names":[]}
1
+ {"version":3,"sources":["../../../tools/browser/prompts.ts"],"sourcesContent":["/**\n * Tool descriptions and prompts for AI models\n */\n\nexport const BROWSER_TOOL_DESCRIPTION = `Test and verify your implemented code in a live browser. This tool executes natural language test instructions and returns a video recording plus detailed logs to help you debug issues.\n\n## When to Use\nUse this AFTER coding is complete to verify your implementation:\n- You've finished writing/modifying code and need to verify it works\n- You need to test user interactions end-to-end (clicks, forms, navigation)\n- You want to catch runtime errors, console warnings, or network failures\n- You need visual confirmation that UI elements render and behave correctly\n\n## What You Get Back\nThe tool returns debugging artifacts to help you identify and fix issues:\n- **Video recording**: Watch exactly what happened in the browser session\n- **Console logs**: All console.log, warnings, and errors with timestamps\n- **Network logs**: Failed requests, 404s, API errors with screenshots\n- **Error screenshots**: Visual snapshots captured when errors occur\n\n## How to Write Good Tests\nBe specific about the user journey you're testing:\n❌ Bad: \"Test the login feature\"\n✅ Good: \"Navigate to /login, enter 'test@example.com' and 'password123', click the Login button, verify we reach the /dashboard page\"\n\nInclude verification steps:\n✅ \"Click the Add Item button, verify the item appears in the list\"\n✅ \"Submit the form, verify a success message is displayed\"\n\n## Iterating on Failures\n1. Run the test and review the video + logs\n2. Identify the specific issue (console error, failed request, wrong behavior)\n3. Fix the code based on the evidence\n4. Re-run the test to verify the fix\n5. Repeat until test passes\n\n## Requirements\n- **URL**: Must be publicly accessible (use tunnels like ngrok, Cloudflare, or deploy to staging)\n- **Timing**: Use this after implementation, not during coding\n- **Complexity**: Set maxSteps higher (20-30) for multi-step user workflows`;\n\n\nexport const BROWSER_SYSTEM_PROMPT = `You are an AI agent designed to automate browser tasks to accomplish the <user_request>. Respond with a valid JSON object in the format: {\"thinking\": \"Reason step-by-step about your current state, history, and the user request to decide your next goal and action. Analyze the browser state and screenshot to confirm the outcome of your last action.\", \"evaluation_previous_goal\": \"A concise, one-sentence evaluation of your last action's outcome (e.g., Success, Failure, or Uncertain).\", \"memory\": \"1-3 sentences summarizing key information and progress so far. This helps you track progress across multiple steps (e.g., items collected, pages visited).\", \"next_goal\": \"A clear, one-sentence description of your immediate next objective.\", \"action\": [{\"action_name\": {\"parameter\": \"value\"}}]}`;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIO,IAAM,2BAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsCjC,IAAM,wBAAwB;","names":[]}
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Tool descriptions and prompts for AI models
3
3
  */
4
- declare const BROWSER_TOOL_DESCRIPTION = "Test and verify your implemented code in a live browser. This tool executes natural language test instructions and returns a video recording plus detailed logs to help you debug issues.\n\n## When to Use\nUse this AFTER coding is complete to verify your implementation:\n- You've finished writing/modifying code and need to verify it works\n- You need to test user interactions end-to-end (clicks, forms, navigation)\n- You want to catch runtime errors, console warnings, or network failures\n- You need visual confirmation that UI elements render and behave correctly\n\n## What You Get Back\nThe tool returns debugging artifacts to help you identify and fix issues:\n- **Video recording**: Watch exactly what happened in the browser session\n- **Console logs**: All console.log, warnings, and errors with timestamps\n- **Network logs**: Failed requests, 404s, API errors with screenshots\n- **Error screenshots**: Visual snapshots captured when errors occur\n\n## How to Write Good Tests\nBe specific about the user journey you're testing:\n\u274C Bad: \"Test the login feature\"\n\u2705 Good: \"Navigate to /login, enter 'test@example.com' and 'password123', click the Login button, verify we reach the /dashboard page\"\n\nInclude verification steps:\n\u2705 \"Click the Add Item button, verify the item appears in the list\"\n\u2705 \"Submit the form, verify a success message is displayed\"\n\n## Iterating on Failures\n1. Run the test and review the video + logs\n2. Identify the specific issue (console error, failed request, wrong behavior)\n3. Fix the code based on the evidence\n4. Re-run the test to verify the fix\n5. Repeat until test passes\n\n## Requirements\n- **URL**: Must be publicly accessible (use tunnels like ngrok, Cloudflare, or deploy to staging)\n- **Timing**: Use this after implementation, not during coding\n- **Complexity**: Set max_steps higher (20-30) for multi-step user workflows";
4
+ declare const BROWSER_TOOL_DESCRIPTION = "Test and verify your implemented code in a live browser. This tool executes natural language test instructions and returns a video recording plus detailed logs to help you debug issues.\n\n## When to Use\nUse this AFTER coding is complete to verify your implementation:\n- You've finished writing/modifying code and need to verify it works\n- You need to test user interactions end-to-end (clicks, forms, navigation)\n- You want to catch runtime errors, console warnings, or network failures\n- You need visual confirmation that UI elements render and behave correctly\n\n## What You Get Back\nThe tool returns debugging artifacts to help you identify and fix issues:\n- **Video recording**: Watch exactly what happened in the browser session\n- **Console logs**: All console.log, warnings, and errors with timestamps\n- **Network logs**: Failed requests, 404s, API errors with screenshots\n- **Error screenshots**: Visual snapshots captured when errors occur\n\n## How to Write Good Tests\nBe specific about the user journey you're testing:\n\u274C Bad: \"Test the login feature\"\n\u2705 Good: \"Navigate to /login, enter 'test@example.com' and 'password123', click the Login button, verify we reach the /dashboard page\"\n\nInclude verification steps:\n\u2705 \"Click the Add Item button, verify the item appears in the list\"\n\u2705 \"Submit the form, verify a success message is displayed\"\n\n## Iterating on Failures\n1. Run the test and review the video + logs\n2. Identify the specific issue (console error, failed request, wrong behavior)\n3. Fix the code based on the evidence\n4. Re-run the test to verify the fix\n5. Repeat until test passes\n\n## Requirements\n- **URL**: Must be publicly accessible (use tunnels like ngrok, Cloudflare, or deploy to staging)\n- **Timing**: Use this after implementation, not during coding\n- **Complexity**: Set maxSteps higher (20-30) for multi-step user workflows";
5
5
  declare const BROWSER_SYSTEM_PROMPT = "You are an AI agent designed to automate browser tasks to accomplish the <user_request>. Respond with a valid JSON object in the format: {\"thinking\": \"Reason step-by-step about your current state, history, and the user request to decide your next goal and action. Analyze the browser state and screenshot to confirm the outcome of your last action.\", \"evaluation_previous_goal\": \"A concise, one-sentence evaluation of your last action's outcome (e.g., Success, Failure, or Uncertain).\", \"memory\": \"1-3 sentences summarizing key information and progress so far. This helps you track progress across multiple steps (e.g., items collected, pages visited).\", \"next_goal\": \"A clear, one-sentence description of your immediate next objective.\", \"action\": [{\"action_name\": {\"parameter\": \"value\"}}]}";
6
6
 
7
7
  export { BROWSER_SYSTEM_PROMPT, BROWSER_TOOL_DESCRIPTION };
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  BROWSER_SYSTEM_PROMPT,
3
3
  BROWSER_TOOL_DESCRIPTION
4
- } from "../../chunk-EI4UKP24.js";
4
+ } from "../../chunk-2HMEZZKK.js";
5
5
  import "../../chunk-PZ5AY32C.js";
6
6
  export {
7
7
  BROWSER_SYSTEM_PROMPT,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../tools/browser/types.ts"],"sourcesContent":["/**\n * Type definitions for browser automation tool\n */\n\nimport type { RetryConfig } from '../utils/resilience.js';\n\n/**\n * Available browser automation models\n */\nexport type BrowserModel =\n | 'gemini-3-flash-preview'\n | 'morph-computer-use-v0';\n\n/**\n * Configuration for the browser worker service\n */\nexport interface BrowserConfig {\n /** Browser worker API URL (default: https://browser.morphllm.com) */\n apiUrl?: string;\n /** Morph API key for authentication (required in production) */\n apiKey?: string;\n /** Request timeout in milliseconds (default: 1000000) */\n timeout?: number;\n /** Retry configuration for API calls */\n retryConfig?: RetryConfig;\n /** Enable debug logging (default: false) */\n debug?: boolean;\n}\n\n/**\n * Authentication credentials for site login (follows browser-use sensitive_data pattern)\n */\nexport interface AuthCredentials {\n /** Username/email for login */\n username?: string;\n /** Password for login */\n password?: string;\n /** Cookies in any JSON format, passed through to browser-use */\n cookies?: any;\n}\n\n/**\n * Input parameters for browser automation task\n */\nexport interface BrowserTaskInput {\n /** Natural language description of what to do */\n task: string;\n /** Starting URL (e.g., https://3000-xyz.e2b.dev) */\n url?: string;\n /** Maximum number of browser actions to take (1-50, default: 10) */\n max_steps?: number;\n /** Model to use for task execution (default: morph-computer-use-v0) */\n model?: BrowserModel;\n /** Browserless region: 'sfo' (US West) or 'lon' (Europe) */\n region?: 'sfo' | 'lon';\n /** Enable stealth mode to avoid bot detection (default: true) */\n stealth?: boolean;\n /** Browser viewport width (default: 1280) */\n viewport_width?: number;\n /** Browser viewport height (default: 720) */\n viewport_height?: number;\n /** User-defined reference/tracking ID (e.g., \"PR-1234\", \"jira-PROJ-567\") */\n external_id?: string;\n /** Optional repository ID to associate with this session */\n repo_id?: string;\n /** Optional commit UUID to associate with this session */\n commit_id?: string;\n /** Record session video to S3 (default: false) */\n record_video?: boolean;\n /** Video width (default: 1280) */\n video_width?: number;\n /** Video height (default: 720) */\n video_height?: number;\n /** Enable window resizing for responsive/mobile testing. Disables stealth mode. (default: false) */\n allow_resizing?: boolean;\n /** Serialized structured output schema (internal use) */\n structured_output?: string;\n /** Site authentication - global credentials or per-domain dict (follows browser-use pattern) */\n auth?: AuthCredentials | Record<string, AuthCredentials>;\n}\n\n/**\n * Input with Zod schema for structured output\n */\nexport interface BrowserTaskInputWithSchema<T> extends Omit<BrowserTaskInput, 'structured_output'> {\n /** Zod schema for structured output */\n schema: any;\n}\n\n/**\n * Result from executing a browser task\n */\nexport interface BrowserTaskResult {\n /** Whether the task completed successfully */\n success: boolean;\n /** Task result or findings */\n result?: string;\n /** Error message if task failed */\n error?: string;\n /** Number of browser actions taken */\n steps_taken?: number;\n /** Total execution time in milliseconds */\n execution_time_ms?: number;\n \n // Rich agent history data\n /** All URLs visited during execution */\n urls?: (string | null)[];\n /** Names of all actions executed */\n action_names?: string[];\n /** Per-step errors (null for steps without errors) */\n errors?: (string | null)[];\n /** All model actions with parameters */\n model_actions?: any[];\n /** Whether agent marked task as done */\n is_done?: boolean;\n /** Truncated action history with essential fields */\n action_history?: any[][];\n /** All action results */\n action_results?: any[];\n /** Whether any errors occurred */\n has_errors?: boolean;\n /** Total number of steps executed */\n number_of_steps?: number;\n \n // Judge validation\n /** Judge validation result if available */\n judgement?: {\n reasoning?: string;\n verdict: boolean;\n failure_reason?: string;\n impossible_task?: boolean;\n reached_captcha?: boolean;\n };\n /** Whether judge validated the execution */\n is_validated?: boolean;\n \n /** UUID of saved replay record (if session replay enabled) */\n replay_id?: string;\n /** Browserless replay URL (if session replay enabled) */\n replay_url?: string;\n /** Recording ID (if record_video=true) */\n recording_id?: string;\n /** Recording status: PENDING, PROCESSING, COMPLETED, ERROR */\n recording_status?: string;\n /** Task ID for async task tracking */\n task_id?: string;\n /** Task status: pending, running, completed, failed */\n status?: string;\n /** Structured output (JSON string) */\n output?: string;\n /** Live session debug URL for real-time viewing (WebRTC streaming) */\n debugUrl?: string;\n}\n\n/**\n * Configuration for live session viewing\n */\nexport interface LiveSessionOptions {\n /** Enable or disable remote control (default: true for headful, varies for headless) */\n interactive?: boolean;\n /** UI theme: 'dark' or 'light' (headless only, default: 'dark') */\n theme?: 'dark' | 'light';\n /** Show or hide navigation controls (headless only, default: true) */\n showControls?: boolean;\n /** Focus view on specific page/tab ID (headless only) */\n pageId?: string;\n /** Display specific tab by index (headless only) */\n pageIndex?: string;\n}\n\n/**\n * Configuration for iframe generation\n */\nexport interface IframeOptions extends LiveSessionOptions {\n /** Iframe width (default: '100%') */\n width?: string | number;\n /** Iframe height (default: '600px') */\n height?: string | number;\n /** Additional inline styles */\n style?: string;\n /** CSS class name */\n className?: string;\n}\n\n/**\n * Task result with convenience methods for async execution\n */\nexport interface BrowserTaskWithPromise extends BrowserTaskResult {\n task_id: string;\n /** Live URL to watch task execution in real-time */\n liveUrl: string;\n /** Wait for task completion */\n complete: (pollConfig?: { interval?: number; timeout?: number }) => Promise<BrowserTaskResult>;\n /** Get live session URL with optional parameters (Steel.dev) - throws if debugUrl not available */\n getLiveUrl: (options?: LiveSessionOptions) => string;\n /** Get iframe HTML for embedding live session - throws if debugUrl not available */\n getLiveIframe: (optionsOrPreset?: string | IframeOptions) => string;\n /** Get complete embed code snippet - throws if debugUrl not available */\n getEmbedCode: () => string;\n}\n\n/**\n * Task result with schema validation\n */\nexport interface BrowserTaskWithPromiseAndSchema<T> extends BrowserTaskResult {\n task_id: string;\n /** Live URL to watch task execution in real-time */\n liveUrl: string;\n /** Parsed and validated output */\n parsed: T | null;\n /** Wait for task completion with schema validation */\n complete: (pollConfig?: { interval?: number; timeout?: number }) => Promise<BrowserTaskResult & { parsed: T | null }>;\n /** Get live session URL with optional parameters - throws if debugUrl not available */\n getLiveUrl: (options?: LiveSessionOptions) => string;\n /** Get iframe HTML for embedding live session - throws if debugUrl not available */\n getLiveIframe: (optionsOrPreset?: string | IframeOptions) => string;\n /** Get complete embed code snippet - throws if debugUrl not available */\n getEmbedCode: () => string;\n}\n\n/**\n * Recording status and metadata\n */\nexport interface RecordingStatus {\n /** Recording ID */\n id: string;\n /** Current status */\n status: 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'ERROR';\n /** Presigned S3 URL for rrweb replay JSON (interactive DOM replay) */\n replay_url?: string;\n /** Presigned S3 URL for network logs (NDJSON format) */\n network_url?: string;\n /** Presigned S3 URL for console logs (NDJSON format) */\n console_url?: string;\n /** Presigned S3 URL for native browser video (WebM or MP4 format, real-time recording) */\n video_url?: string;\n /** Total rrweb events captured */\n total_events?: number;\n /** Total bytes of all files */\n file_size?: number;\n /** Duration in milliseconds */\n duration?: number;\n /** Error message if status=ERROR */\n error?: string;\n /** When recording was created */\n created_at: string;\n}\n\n/**\n * Browser error with screenshot captured at error time\n */\nexport interface BrowserError {\n /** Error type: console error or network error */\n type: 'console' | 'network';\n /** Error message */\n message: string;\n /** URL where error occurred */\n url?: string;\n /** CDP timestamp in seconds since browser start */\n timestamp: number;\n /** Presigned S3 URL to screenshot JPEG (captured 500ms after error) */\n screenshot_url?: string;\n /** When screenshot was captured (Unix timestamp) */\n captured_at?: number;\n \n // Network-specific fields\n /** HTTP status code (for network errors) */\n status?: number;\n}\n\n/**\n * Response from getErrors()\n */\nexport interface ErrorsResponse {\n /** Recording ID */\n recording_id: string;\n /** Total number of errors */\n total_errors: number;\n /** Errors with real-time screenshots */\n errors: BrowserError[];\n}\n\n/**\n * Options for WebP generation\n */\nexport interface WebpOptions {\n /** Maximum duration in seconds (1-120, default: 60) */\n max_duration?: number;\n /** Frame rate (5-30, default: 15) */\n fps?: number;\n /** Output width in pixels (320-1920, default: 780) */\n width?: number;\n /** Quality (10-100, default: 65) */\n quality?: number;\n /** Enable auto-zoom that follows click/input actions (default: false) */\n autoZoom?: boolean;\n /** Maximum file size in MB (0.5-50). Uses iterative reduction to guarantee budget. */\n max_size_mb?: number;\n}\n\n/**\n * Response from getWebp()\n */\nexport interface WebpResponse {\n /** Presigned S3 URL for the WebP file */\n webp_url: string;\n /** Whether the WebP was served from cache */\n cached: boolean;\n /** Width of the WebP (may differ from requested if budget-constrained) */\n width: number;\n /** Frame rate of the WebP (may differ from requested if budget-constrained) */\n fps: number;\n /** Max duration used (may differ from requested if budget-constrained) */\n max_duration: number;\n /** File size in bytes */\n file_size?: number;\n /** Max size budget in MB (if specified) */\n max_size_mb?: number;\n /** Whether the file fits within the budget */\n budget_met?: boolean;\n /** Quality setting used (may differ from requested if budget-constrained) */\n quality_used?: number;\n /** Number of encoding attempts needed to meet budget */\n attempts?: number;\n}\n\n/**\n * Recording with convenience methods\n */\nexport interface RecordingWithMethods extends RecordingStatus {\n /** Get animated WebP preview */\n getWebp: (options?: WebpOptions) => Promise<WebpResponse>;\n /** Get errors with screenshots */\n getErrors: () => Promise<ErrorsResponse>;\n}\n\n"],"mappings":";;;;;;;;;;;;;;;;AAAA;AAAA;","names":[]}
1
+ {"version":3,"sources":["../../../tools/browser/types.ts"],"sourcesContent":["/**\n * Type definitions for browser automation tool\n */\n\nimport type { RetryConfig } from '../utils/resilience.js';\n\n/**\n * Available browser automation models\n */\nexport type BrowserModel =\n | 'gemini-3-flash-preview'\n | 'morph-computer-use-v0'\n | 'morph-computer-use-v1';\n\n/**\n * Configuration for the browser worker service\n */\nexport interface BrowserConfig {\n /** Browser worker API URL (default: https://browser.morphllm.com) */\n apiUrl?: string;\n /** Morph API key for authentication (required in production) */\n apiKey?: string;\n /** Request timeout in milliseconds (default: 1000000) */\n timeout?: number;\n /** Retry configuration for API calls */\n retryConfig?: RetryConfig;\n /** Enable debug logging (default: false) */\n debug?: boolean;\n}\n\n/**\n * Authentication credentials for site login (follows browser-use sensitive_data pattern)\n */\nexport interface AuthCredentials {\n /** Username/email for login */\n username?: string;\n /** Password for login */\n password?: string;\n /** Cookies in any JSON format, passed through to browser-use */\n cookies?: any;\n}\n\n/**\n * Input parameters for browser automation task\n */\nexport interface BrowserTaskInput {\n /** Natural language description of what to do */\n task: string;\n /** Starting URL (e.g., https://3000-xyz.e2b.dev) */\n url?: string;\n /** Maximum number of browser actions to take (1-50, default: 10) */\n maxSteps?: number;\n /** Model to use for task execution (default: morph-computer-use-v0) */\n model?: BrowserModel;\n /** Browserless region: 'sfo' (US West) or 'lon' (Europe) */\n region?: 'sfo' | 'lon';\n /** Enable stealth mode to avoid bot detection (default: true) */\n stealth?: boolean;\n /** Browser viewport width (default: 1280) */\n viewportWidth?: number;\n /** Browser viewport height (default: 720) */\n viewportHeight?: number;\n /** User-defined reference/tracking ID (e.g., \"PR-1234\", \"jira-PROJ-567\") */\n externalId?: string;\n /** Optional repository database ID (UUID) to associate with this session - for internal use */\n repoId?: string;\n /** Optional repository full name (e.g., \"owner/repo\") - for external SDK users */\n repoFullName?: string;\n /** Optional commit UUID to associate with this session */\n commitId?: string;\n /** Record session video to S3 (default: false) */\n recordVideo?: boolean;\n /** Video width (default: 1280) */\n videoWidth?: number;\n /** Video height (default: 720) */\n videoHeight?: number;\n /** Enable window resizing for responsive/mobile testing. Disables stealth mode. (default: false) */\n allowResizing?: boolean;\n /** Serialized structured output schema (internal use) */\n structuredOutput?: string;\n /** Site authentication - global credentials or per-domain dict (follows browser-use pattern) */\n auth?: AuthCredentials | Record<string, AuthCredentials>;\n /** Profile ID - restore cookies/localStorage from a saved browser profile */\n profileId?: string;\n}\n\n/**\n * Input with Zod schema for structured output\n */\nexport interface BrowserTaskInputWithSchema<T> extends Omit<BrowserTaskInput, 'structuredOutput'> {\n /** Zod schema for structured output */\n schema: any;\n}\n\n/**\n * Result from executing a browser task\n */\nexport interface BrowserTaskResult {\n /** Whether the task completed successfully */\n success: boolean;\n /** Task result or findings */\n result?: string;\n /** Error message if task failed */\n error?: string;\n /** Number of browser actions taken */\n stepsTaken?: number;\n /** Total execution time in milliseconds */\n executionTimeMs?: number;\n \n // Rich agent history data\n /** All URLs visited during execution */\n urls?: (string | null)[];\n /** Names of all actions executed */\n actionNames?: string[];\n /** Per-step errors (null for steps without errors) */\n errors?: (string | null)[];\n /** All model actions with parameters */\n modelActions?: any[];\n /** Whether agent marked task as done */\n isDone?: boolean;\n /** Truncated action history with essential fields */\n actionHistory?: any[][];\n /** All action results */\n actionResults?: any[];\n /** Whether any errors occurred */\n hasErrors?: boolean;\n /** Total number of steps executed */\n numberOfSteps?: number;\n \n // Judge validation\n /** Judge validation result if available */\n judgement?: {\n reasoning?: string;\n verdict: boolean;\n failure_reason?: string;\n impossible_task?: boolean;\n reached_captcha?: boolean;\n };\n /** Whether judge validated the execution */\n isValidated?: boolean;\n \n /** UUID of saved replay record (if session replay enabled) */\n replayId?: string;\n /** Browserless replay URL (if session replay enabled) */\n replayUrl?: string;\n /** Recording ID (if recordVideo=true) */\n recordingId?: string;\n /** Recording status: PENDING, PROCESSING, COMPLETED, ERROR */\n recordingStatus?: string;\n /** Task ID for async task tracking */\n taskId?: string;\n /** Task status: pending, running, completed, failed */\n status?: string;\n /** Structured output (JSON string) */\n output?: string;\n /** Live session debug URL for real-time viewing (WebRTC streaming) */\n debugUrl?: string;\n}\n\n/**\n * Configuration for live session viewing\n */\nexport interface LiveSessionOptions {\n /** Enable or disable remote control (default: true for headful, varies for headless) */\n interactive?: boolean;\n /** UI theme: 'dark' or 'light' (headless only, default: 'dark') */\n theme?: 'dark' | 'light';\n /** Show or hide navigation controls (headless only, default: true) */\n showControls?: boolean;\n /** Focus view on specific page/tab ID (headless only) */\n pageId?: string;\n /** Display specific tab by index (headless only) */\n pageIndex?: string;\n}\n\n/**\n * Configuration for iframe generation\n */\nexport interface IframeOptions extends LiveSessionOptions {\n /** Iframe width (default: '100%') */\n width?: string | number;\n /** Iframe height (default: '600px') */\n height?: string | number;\n /** Additional inline styles */\n style?: string;\n /** CSS class name */\n className?: string;\n}\n\n/**\n * Task result with convenience methods for async execution\n */\nexport interface BrowserTaskWithPromise extends BrowserTaskResult {\n taskId: string;\n /** Live URL to watch task execution in real-time */\n liveUrl: string;\n /** Wait for task completion */\n complete: (pollConfig?: { interval?: number; timeout?: number }) => Promise<BrowserTaskResult>;\n /** Get live session URL with optional parameters (Steel.dev) - throws if debugUrl not available */\n getLiveUrl: (options?: LiveSessionOptions) => string;\n /** Get iframe HTML for embedding live session - throws if debugUrl not available */\n getLiveIframe: (optionsOrPreset?: string | IframeOptions) => string;\n /** Get complete embed code snippet - throws if debugUrl not available */\n getEmbedCode: () => string;\n}\n\n/**\n * Task result with schema validation\n */\nexport interface BrowserTaskWithPromiseAndSchema<T> extends BrowserTaskResult {\n taskId: string;\n /** Live URL to watch task execution in real-time */\n liveUrl: string;\n /** Parsed and validated output */\n parsed: T | null;\n /** Wait for task completion with schema validation */\n complete: (pollConfig?: { interval?: number; timeout?: number }) => Promise<BrowserTaskResult & { parsed: T | null }>;\n /** Get live session URL with optional parameters - throws if debugUrl not available */\n getLiveUrl: (options?: LiveSessionOptions) => string;\n /** Get iframe HTML for embedding live session - throws if debugUrl not available */\n getLiveIframe: (optionsOrPreset?: string | IframeOptions) => string;\n /** Get complete embed code snippet - throws if debugUrl not available */\n getEmbedCode: () => string;\n}\n\n/**\n * Recording status and metadata\n */\nexport interface RecordingStatus {\n /** Recording ID */\n id: string;\n /** Current status */\n status: 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'ERROR';\n /** Presigned S3 URL for rrweb replay JSON (interactive DOM replay) */\n replayUrl?: string;\n /** Presigned S3 URL for network logs (NDJSON format) */\n networkUrl?: string;\n /** Presigned S3 URL for console logs (NDJSON format) */\n consoleUrl?: string;\n /** Presigned S3 URL for native browser video (WebM or MP4 format, real-time recording) */\n videoUrl?: string;\n /** Total rrweb events captured */\n totalEvents?: number;\n /** Total bytes of all files */\n fileSize?: number;\n /** Duration in milliseconds */\n duration?: number;\n /** Error message if status=ERROR */\n error?: string;\n /** When recording was created */\n createdAt: string;\n}\n\n/**\n * Browser error with screenshot captured at error time\n */\nexport interface BrowserError {\n /** Error type: console error or network error */\n type: 'console' | 'network';\n /** Error message */\n message: string;\n /** URL where error occurred */\n url?: string;\n /** CDP timestamp in seconds since browser start */\n timestamp: number;\n /** Presigned S3 URL to screenshot JPEG (captured 500ms after error) */\n screenshotUrl?: string;\n /** When screenshot was captured (Unix timestamp) */\n capturedAt?: number;\n \n // Network-specific fields\n /** HTTP status code (for network errors) */\n status?: number;\n}\n\n/**\n * Response from getErrors()\n */\nexport interface ErrorsResponse {\n /** Recording ID */\n recordingId: string;\n /** Total number of errors */\n totalErrors: number;\n /** Errors with real-time screenshots */\n errors: BrowserError[];\n}\n\n/**\n * Options for WebP generation\n */\nexport interface WebpOptions {\n /** Maximum duration in seconds (1-120, default: 60) */\n maxDuration?: number;\n /** Frame rate (5-30, default: 15) */\n fps?: number;\n /** Output width in pixels (320-1920, default: 780) */\n width?: number;\n /** Quality (10-100, default: 65) */\n quality?: number;\n /** Enable auto-zoom that follows click/input actions (default: false) */\n autoZoom?: boolean;\n /** Maximum file size in MB (0.5-50). Uses iterative reduction to guarantee budget. */\n maxSizeMb?: number;\n}\n\n/**\n * Response from getWebp()\n */\nexport interface WebpResponse {\n /** Presigned S3 URL for the WebP file */\n webpUrl: string;\n /** Whether the WebP was served from cache */\n cached: boolean;\n /** Width of the WebP (may differ from requested if budget-constrained) */\n width: number;\n /** Frame rate of the WebP (may differ from requested if budget-constrained) */\n fps: number;\n /** Max duration used (may differ from requested if budget-constrained) */\n maxDuration: number;\n /** File size in bytes */\n fileSize?: number;\n /** Max size budget in MB (if specified) */\n maxSizeMb?: number;\n /** Whether the file fits within the budget */\n budgetMet?: boolean;\n /** Quality setting used (may differ from requested if budget-constrained) */\n qualityUsed?: number;\n /** Number of encoding attempts needed to meet budget */\n attempts?: number;\n}\n\n/**\n * Recording with convenience methods\n */\nexport interface RecordingWithMethods extends RecordingStatus {\n /** Get animated WebP preview */\n getWebp: (options?: WebpOptions) => Promise<WebpResponse>;\n /** Get errors with screenshots */\n getErrors: () => Promise<ErrorsResponse>;\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAAA;AAAA;","names":[]}