@amigo-ai/sdk 1.1.0 → 1.1.2

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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/core/utils.ts", "../src/core/errors.ts", "../src/core/openapi-client.ts", "../src/core/auth.ts", "../src/core/retry.ts", "../src/resources/organization.ts", "../src/resources/conversation.ts", "../src/resources/services.ts", "../src/resources/user.ts", "../src/resources/agent.ts", "../src/resources/context-graph.ts", "../src/webhooks/index.ts", "../src/webhooks/parse.ts", "../src/core/rate-limit.ts", "../src/core/branded-types.ts", "../src/index.ts"],
4
- "sourcesContent": ["import { ParseError } from './errors'\n\n// Type helper to extract the data type from openapi-fetch responses\nexport type ExtractDataType<T> = T extends { data?: infer D } ? NonNullable<D> : never\n\n// Helper function to extract data from openapi-fetch responses\n// Since our middleware throws on errors, successful responses will have data\nexport async function extractData<T extends { data?: unknown }>(\n responsePromise: Promise<T>\n): Promise<ExtractDataType<T>> {\n const result = await responsePromise\n const data = (result as { data?: ExtractDataType<T> }).data\n\n if (data === undefined || data === null) {\n // Invariant: our error middleware throws for non-2xx responses.\n // If we reach here without data, treat as a parse/protocol error.\n throw new ParseError('Expected response data to be present for successful request', 'response')\n }\n\n return data\n}\n\n/**\n * Parse an NDJSON HTTP response body into an async generator of parsed JSON objects.\n * The generator yields one parsed object per line. Empty lines are skipped.\n */\nexport async function* parseNdjsonStream<T = unknown>(response: Response): AsyncGenerator<T> {\n const body = response.body\n if (!body) return\n\n const reader = body.getReader()\n const decoder = new TextDecoder()\n let bufferedText = ''\n\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n bufferedText += decoder.decode(value, { stream: true })\n\n let newlineIndex: number\n // Process all complete lines in the buffer\n while ((newlineIndex = bufferedText.indexOf('\\n')) !== -1) {\n const line = bufferedText.slice(0, newlineIndex).trim()\n bufferedText = bufferedText.slice(newlineIndex + 1)\n if (!line) continue\n try {\n yield JSON.parse(line) as T\n } catch (err) {\n throw new ParseError('Failed to parse NDJSON line', 'json', err as Error)\n }\n }\n }\n\n // Flush any trailing line without a newline\n const trailing = bufferedText.trim()\n if (trailing) {\n try {\n yield JSON.parse(trailing) as T\n } catch (err) {\n throw new ParseError('Failed to parse trailing NDJSON line', 'json', err as Error)\n }\n }\n } finally {\n reader.releaseLock()\n }\n}\n\nexport interface ServerSentEvent<T = unknown> {\n id?: string\n event?: string\n data: T | string\n retry?: number\n}\n\n/**\n * Parse an SSE HTTP response body into an async generator of parsed events.\n * JSON data payloads are parsed; non-JSON payloads are returned as strings.\n */\nexport async function* parseSseStream<T = unknown>(\n response: Response\n): AsyncGenerator<ServerSentEvent<T>> {\n const body = response.body\n if (!body) return\n\n const reader = body.getReader()\n const decoder = new TextDecoder()\n let bufferedText = ''\n let eventId: string | undefined\n let eventName: string | undefined\n let retry: number | undefined\n let dataLines: string[] = []\n\n const flushEvent = function* (): Generator<ServerSentEvent<T>> {\n if (dataLines.length === 0) {\n eventName = undefined\n retry = undefined\n return\n }\n\n const rawData = dataLines.join('\\n')\n let data: T | string = rawData\n try {\n data = JSON.parse(rawData) as T\n } catch {\n // SSE allows plain text data frames.\n }\n\n const event: ServerSentEvent<T> = { data }\n if (eventId !== undefined) event.id = eventId\n if (eventName !== undefined) event.event = eventName\n if (retry !== undefined) event.retry = retry\n\n eventName = undefined\n retry = undefined\n dataLines = []\n yield event\n }\n\n const processLine = function* (line: string): Generator<ServerSentEvent<T>> {\n if (line === '') {\n yield* flushEvent()\n return\n }\n if (line.startsWith(':')) return\n\n const colonIndex = line.indexOf(':')\n const field = colonIndex === -1 ? line : line.slice(0, colonIndex)\n const value = colonIndex === -1 ? '' : line.slice(colonIndex + 1).replace(/^ /, '')\n\n switch (field) {\n case 'id':\n eventId = value\n break\n case 'event':\n eventName = value\n break\n case 'data':\n dataLines.push(value)\n break\n case 'retry': {\n const retryMs = Number.parseInt(value, 10)\n if (!Number.isNaN(retryMs)) retry = retryMs\n break\n }\n }\n }\n\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n bufferedText += decoder.decode(value, { stream: true })\n\n let newlineIndex: number\n while ((newlineIndex = bufferedText.search(/\\r?\\n/)) !== -1) {\n const line = bufferedText.slice(0, newlineIndex)\n const newlineLength =\n bufferedText[newlineIndex] === '\\r' && bufferedText[newlineIndex + 1] === '\\n' ? 2 : 1\n bufferedText = bufferedText.slice(newlineIndex + newlineLength)\n yield* processLine(line)\n }\n }\n\n const trailing = bufferedText.trimEnd()\n if (trailing) {\n yield* processLine(trailing)\n }\n yield* flushEvent()\n } finally {\n reader.releaseLock()\n }\n}\n\n// Utility function to safely parse response bodies without throwing errors\nexport async function parseResponseBody(response: Response): Promise<unknown> {\n try {\n const text = await response.text()\n if (!text) return undefined\n try {\n return JSON.parse(text)\n } catch {\n return text // Return as string if not valid JSON\n }\n } catch {\n return undefined // Return undefined if any error occurs\n }\n}\n\n// Helper to detect network-related errors\nexport function isNetworkError(error: unknown): boolean {\n if (!(error instanceof Error)) return false\n\n return (\n error instanceof TypeError ||\n error.message.includes('fetch') ||\n error.message.includes('Failed to fetch') ||\n error.message.includes('Network request failed') ||\n error.message.includes('ECONNREFUSED') ||\n error.message.includes('ETIMEDOUT') ||\n error.message.includes('ENOTFOUND') ||\n error.message.includes('network')\n )\n}\n", "import type { Middleware } from 'openapi-fetch'\nimport { isNetworkError, parseResponseBody } from './utils'\n\n/** Fields that may contain sensitive tokens or credentials. */\nconst SENSITIVE_FIELDS = new Set([\n 'id_token',\n 'access_token',\n 'refresh_token',\n 'authorization',\n 'api_key',\n 'apikey',\n 'token',\n 'secret',\n 'password',\n 'x-api-key',\n])\n\n/**\n * Recursively strips sensitive fields from an object to prevent token leakage in error contexts.\n * Returns a shallow copy with sensitive keys replaced by '[REDACTED]'.\n */\nexport function sanitizeErrorContext(obj: unknown): unknown {\n if (obj === null || obj === undefined) return obj\n if (typeof obj !== 'object') return obj\n if (Array.isArray(obj)) return obj.map(sanitizeErrorContext)\n\n const result: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(obj as Record<string, unknown>)) {\n if (SENSITIVE_FIELDS.has(key.toLowerCase())) {\n result[key] = '[REDACTED]'\n } else if (typeof value === 'object' && value !== null) {\n result[key] = sanitizeErrorContext(value)\n } else {\n result[key] = value\n }\n }\n return result\n}\n\n/**\n * Base error class for all Amigo SDK errors.\n * Provides common functionality and error identification.\n */\nexport class AmigoError extends Error {\n /** Unique error code for programmatic error handling */\n readonly errorCode?: string\n\n /** HTTP status code if applicable */\n readonly statusCode?: number\n\n /** Additional context data */\n readonly context?: Record<string, unknown>\n\n constructor(\n message: string,\n options?: { statusCode?: number; errorCode?: string; context?: Record<string, unknown> }\n ) {\n super(message)\n this.name = this.constructor.name\n\n // Ensure proper prototype chain for instanceof checks\n Object.setPrototypeOf(this, new.target.prototype)\n\n // Capture stack trace\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor)\n }\n\n this.statusCode = options?.statusCode\n this.errorCode = options?.errorCode\n this.context = options?.context\n }\n\n /**\n * Returns a JSON-serializable representation of the error.\n * Sensitive fields (tokens, keys) are redacted to prevent leakage.\n */\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n message: this.message,\n code: this.errorCode,\n statusCode: this.statusCode,\n context: sanitizeErrorContext(this.context) as Record<string, unknown> | undefined,\n stack: this.stack,\n }\n }\n}\n\n/* 4xx client errors */\nexport class BadRequestError extends AmigoError {}\nexport class AuthenticationError extends AmigoError {}\nexport class PermissionError extends AmigoError {}\nexport class NotFoundError extends AmigoError {}\nexport class ConflictError extends AmigoError {}\nexport class RateLimitError extends AmigoError {}\n\n/* 5xx server errors */\nexport class ServerError extends AmigoError {}\nexport class ServiceUnavailableError extends ServerError {}\n\n/* Internal SDK errors */\nexport class ConfigurationError extends AmigoError {\n constructor(\n message: string,\n public readonly field?: string\n ) {\n super(message, { context: { field } })\n }\n}\n\n/* Validation errors */\nexport class ValidationError extends BadRequestError {\n constructor(\n msg: string,\n public fieldErrors?: Record<string, string>\n ) {\n super(msg)\n }\n}\n\n/* Network-related errors */\nexport class NetworkError extends AmigoError {\n constructor(\n message: string,\n public readonly originalError?: Error,\n public readonly request?: {\n url?: string\n method?: string\n }\n ) {\n super(message, { context: { request } })\n }\n}\n\n/* Parsing errors */\nexport class ParseError extends AmigoError {\n constructor(\n message: string,\n public readonly parseType: 'json' | 'response' | 'other',\n public readonly originalError?: Error\n ) {\n super(message, { context: { parseType } })\n }\n}\n\n/* Type guard functions */\nexport function isAmigoError(error: unknown): error is AmigoError {\n return error instanceof AmigoError\n}\n\n/* Error factory to create appropriate error instances from API responses */\nexport function createApiError(response: Response, body?: unknown): AmigoError {\n const map: Record<number, typeof AmigoError> = {\n 400: BadRequestError,\n 401: AuthenticationError,\n 403: PermissionError,\n 404: NotFoundError,\n 409: ConflictError,\n 422: ValidationError,\n 429: RateLimitError,\n 500: ServerError,\n 503: ServiceUnavailableError,\n }\n\n const errorMessageKeys = ['message', 'error', 'detail']\n\n const ErrorClass = map[response.status] ?? AmigoError\n let message = `HTTP ${response.status} ${response.statusText}`\n\n if (body && typeof body === 'object') {\n for (const key of errorMessageKeys) {\n if (key in body) {\n message = String((body as Record<string, unknown>)[key])\n break\n }\n }\n }\n\n const error = new ErrorClass(message, {\n statusCode: response.status,\n errorCode:\n body && typeof body === 'object' && 'code' in body\n ? String((body as Record<string, unknown>).code)\n : undefined,\n context: { response: sanitizeErrorContext(body) },\n })\n\n return error\n}\n\nexport function createErrorMiddleware(): Middleware {\n return {\n onResponse: async ({ response }) => {\n if (!response.ok) {\n const body = await parseResponseBody(response)\n throw createApiError(response, body)\n }\n },\n onError: async ({ error, request }) => {\n // Handle network-related errors consistently\n if (isNetworkError(error)) {\n throw new NetworkError(\n `Network error: ${error instanceof Error ? error.message : String(error)}`,\n error instanceof Error ? error : new Error(String(error)),\n {\n url: request?.url,\n method: request?.method,\n }\n )\n }\n throw error\n },\n }\n}\n", "import type { Client } from 'openapi-fetch'\nimport openapiFetchImport from 'openapi-fetch'\nimport { createErrorMiddleware } from './errors'\n\n// Handle ESM/CJS interop: esbuild's __toESM wrapper can cause the default\n// import to be the module object ({ default: fn }) instead of the function directly.\n// This normalizes access to work in both environments.\nconst createClient: typeof openapiFetchImport =\n typeof openapiFetchImport === 'function'\n ? openapiFetchImport\n : (openapiFetchImport as unknown as { default: typeof openapiFetchImport }).default\nimport { createAuthMiddleware } from './auth'\nimport type { paths } from '../generated/api-types'\nimport type { AmigoSdkConfig } from '..'\nimport { createRetryingFetch } from './retry'\n\nexport type AmigoFetch = Client<paths>\n\n/** Create an OpenAPI-typed fetch client with auth, error handling, and retry middleware. */\nexport function createAmigoFetch(config: AmigoSdkConfig, mockFetch?: typeof fetch): AmigoFetch {\n const wrappedFetch = createRetryingFetch(\n config.retry,\n mockFetch ?? (globalThis.fetch as typeof fetch)\n )\n\n const client = createClient<paths>({\n baseUrl: config.baseUrl,\n fetch: wrappedFetch,\n })\n\n // Apply error handling middleware first (to catch all errors)\n client.use(createErrorMiddleware())\n\n // Apply auth middleware after error handling (so auth errors are properly handled)\n client.use(createAuthMiddleware(config))\n\n return client\n}\n", "import type { Middleware } from 'openapi-fetch'\nimport type { components } from '../generated/api-types'\nimport type { AmigoSdkConfig } from '..'\nimport { AmigoError, AuthenticationError, NetworkError, ParseError, createApiError } from './errors'\nimport { isNetworkError, parseResponseBody } from './utils'\n\ntype SignInWithApiKeyResponse = components['schemas']['user__sign_in_with_api_key__Response']\n\n/** Helper function to trade API key for a bearer token */\nexport async function getBearerToken(config: AmigoSdkConfig): Promise<SignInWithApiKeyResponse> {\n const url = `${config.baseUrl}/v1/${config.orgId}/user/signin_with_api_key`\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'x-api-key': config.apiKey,\n 'x-api-key-id': config.apiKeyId,\n 'x-user-id': config.userId,\n },\n })\n\n if (!response.ok) {\n const body = await parseResponseBody(response)\n const apiError = createApiError(response, body)\n\n // Enhance authentication errors with additional context\n if (response.status === 401) {\n throw new AuthenticationError(`Authentication failed: ${apiError.message}`, {\n ...apiError,\n context: { ...apiError.context, endpoint: 'signin_with_api_key' },\n })\n }\n throw apiError\n }\n\n return (await response.json()) as SignInWithApiKeyResponse\n } catch (err) {\n // Re-throw our custom errors as-is\n if (err instanceof AmigoError) {\n throw err\n }\n\n // Handle network errors\n if (isNetworkError(err)) {\n throw new NetworkError('Failed to connect to authentication endpoint', err as Error, {\n url,\n method: 'POST',\n })\n }\n\n // Handle JSON parsing errors\n throw new ParseError(\n 'Failed to parse authentication response',\n 'json',\n err instanceof Error ? err : new Error(String(err))\n )\n }\n}\n\nexport function createAuthMiddleware(config: AmigoSdkConfig): Middleware {\n let token: SignInWithApiKeyResponse | null = null\n let refreshPromise: Promise<SignInWithApiKeyResponse> | null = null\n\n const shouldRefreshToken = (tokenData: SignInWithApiKeyResponse): boolean => {\n if (!tokenData.expires_at) return false\n\n const expiryTime = new Date(tokenData.expires_at).getTime()\n const currentTime = Date.now()\n const timeUntilExpiry = expiryTime - currentTime\n const refreshThreshold = 5 * 60 * 1000 // 5 minutes in milliseconds\n\n return timeUntilExpiry <= refreshThreshold\n }\n\n const ensureValidToken = async (): Promise<SignInWithApiKeyResponse> => {\n if (!token || shouldRefreshToken(token)) {\n if (!refreshPromise) {\n refreshPromise = getBearerToken(config)\n try {\n token = await refreshPromise\n } finally {\n refreshPromise = null\n }\n } else {\n token = await refreshPromise\n }\n }\n return token\n }\n\n return {\n onRequest: async ({ request }) => {\n try {\n const validToken = await ensureValidToken()\n if (validToken?.id_token) {\n request.headers.set('Authorization', `Bearer ${validToken.id_token}`)\n }\n } catch (error) {\n // Clear token and re-throw - getBearerToken already provides proper error types\n token = null\n throw error\n }\n return request\n },\n\n onResponse: async ({ response }) => {\n // Handle 401 responses by clearing token to force refresh on next request\n if (response.status === 401) {\n token = null\n }\n },\n\n onError: async ({ error }) => {\n // Clear token on any error to force refresh\n token = null\n throw error\n },\n }\n}\n", "export type RetryOptions = {\n /** Maximum number of attempts to make (default: 3) */\n maxAttempts?: number\n /** Base delay between attempts (default: 250ms) */\n backoffBaseMs?: number\n /** Maximum delay between attempts (default: 30s) */\n maxDelayMs?: number\n /** Status codes to retry on (default: 408, 429, 500, 502, 503, 504) */\n retryOnStatus?: Set<number>\n /** Methods to retry on (default: GET) */\n retryOnMethods?: Set<string>\n}\n\nconst DEFAULT_RETRYABLE_STATUS = new Set([408, 429, 500, 502, 503, 504])\nconst DEFAULT_RETRYABLE_METHODS = new Set(['GET']) as Set<string>\n\n/** Merge user-provided retry options with sensible defaults. */\nexport function resolveRetryOptions(options?: RetryOptions): Required<RetryOptions> {\n return {\n maxAttempts: options?.maxAttempts ?? 3,\n backoffBaseMs: options?.backoffBaseMs ?? 250,\n maxDelayMs: options?.maxDelayMs ?? 30_000,\n retryOnStatus: new Set(options?.retryOnStatus ?? DEFAULT_RETRYABLE_STATUS),\n retryOnMethods: new Set(options?.retryOnMethods ?? DEFAULT_RETRYABLE_METHODS),\n }\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value))\n}\n\nfunction parseRetryAfterMs(headerValue: string | null, maxDelayMs: number): number | null {\n if (!headerValue) return null\n const seconds = Number(headerValue)\n if (Number.isFinite(seconds)) {\n return clamp(seconds * 1000, 0, maxDelayMs)\n }\n const date = new Date(headerValue)\n const ms = date.getTime() - Date.now()\n if (Number.isFinite(ms)) {\n return clamp(ms, 0, maxDelayMs)\n }\n return null\n}\n\nfunction computeBackoffWithJitterMs(\n attemptIndexZeroBased: number,\n baseMs: number,\n capMs: number\n): number {\n const windowMs = Math.min(capMs, baseMs * Math.pow(2, attemptIndexZeroBased))\n return Math.random() * windowMs\n}\n\nfunction isAbortError(err: unknown): boolean {\n return typeof err === 'object' && err !== null && 'name' in err && err['name'] === 'AbortError'\n}\n\nfunction isNetworkError(err: unknown): boolean {\n // Undici & browsers use TypeError for network failures\n return err instanceof TypeError && !isAbortError(err)\n}\n\nasync function abortableSleep(ms: number, signal?: AbortSignal): Promise<void> {\n if (ms <= 0) {\n signal?.throwIfAborted?.()\n return\n }\n await new Promise<void>((resolve, reject) => {\n const rejectWith =\n signal?.reason instanceof Error ? signal.reason : (signal?.reason ?? new Error('AbortError'))\n\n if (signal?.aborted) {\n reject(rejectWith)\n return\n }\n const t = setTimeout(() => {\n off()\n resolve()\n }, ms)\n const onAbort = () => {\n off()\n clearTimeout(t)\n reject(rejectWith)\n }\n const off = () => signal?.removeEventListener('abort', onAbort)\n signal?.addEventListener('abort', onAbort, { once: true })\n })\n}\n\n/** Wrap a fetch function with retry logic (exponential backoff, Retry-After support). */\nexport function createRetryingFetch(\n retryOptions?: RetryOptions,\n baseFetch?: typeof fetch\n): typeof fetch {\n const resolved = resolveRetryOptions(retryOptions)\n const underlying: typeof fetch = baseFetch ?? (globalThis.fetch as typeof fetch)\n\n const retryingFetch: typeof fetch = async (\n input: RequestInfo | URL,\n init?: RequestInit\n ): Promise<Response> => {\n const inputMethod =\n typeof Request !== 'undefined' && input instanceof Request ? input.method : undefined\n const method = ((init?.method ?? inputMethod ?? 'GET') as string).toUpperCase()\n const signal = init?.signal\n\n const isMethodRetryableByDefault = resolved.retryOnMethods.has(method)\n const maxAttempts = Math.max(1, resolved.maxAttempts)\n\n for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {\n let response: Response | null = null\n let error: unknown = null\n\n try {\n response = await underlying(input, init)\n } catch (err) {\n error = err\n }\n\n if (!error && response && response.ok) {\n return response\n }\n\n let shouldRetry = false\n let delayMs: number | null = null\n\n if (isNetworkError(error)) {\n shouldRetry = isMethodRetryableByDefault\n if (shouldRetry) {\n delayMs = computeBackoffWithJitterMs(\n attempt - 1,\n resolved.backoffBaseMs,\n resolved.maxDelayMs\n )\n }\n } else if (response) {\n const status = response.status\n if (method === 'POST') {\n if (status === 429) {\n const ra = response.headers.get('Retry-After')\n const parsed = parseRetryAfterMs(ra, resolved.maxDelayMs)\n if (parsed !== null) {\n shouldRetry = true\n delayMs = parsed\n }\n }\n } else if (isMethodRetryableByDefault && resolved.retryOnStatus.has(status)) {\n const ra = response.headers.get('Retry-After')\n delayMs =\n parseRetryAfterMs(ra, resolved.maxDelayMs) ??\n computeBackoffWithJitterMs(attempt - 1, resolved.backoffBaseMs, resolved.maxDelayMs)\n shouldRetry = true\n }\n }\n\n const attemptsRemain = attempt < maxAttempts\n if (!shouldRetry || !attemptsRemain) {\n if (error) throw error\n return response as Response\n }\n\n if (signal?.aborted) {\n if (error) throw error\n return response as Response\n }\n\n await abortableSleep(delayMs ?? 0, signal ?? undefined)\n }\n\n throw new Error('Retry loop exited unexpectedly')\n }\n\n return retryingFetch\n}\n\nexport type { RetryOptions as AmigoRetryOptions }\n", "import type { AmigoFetch } from '../core/openapi-client'\nimport { extractData } from '../core/utils'\nimport type { operations } from '../generated/api-types'\nimport type { OrgId } from '../core/branded-types'\n\n/** Resource for retrieving organization details. */\nexport class OrganizationResource {\n constructor(\n private c: AmigoFetch,\n private orgId: OrgId\n ) {}\n\n /**\n * Get organization details\n * @param headers - The headers\n * @returns The organization details\n */\n async getOrganization(headers?: operations['get-organization']['parameters']['header']) {\n return extractData(\n this.c.GET('/v1/{organization}/organization/', {\n params: { path: { organization: this.orgId } },\n headers,\n })\n )\n }\n\n /** Alias for getOrganization. */\n async get(headers?: operations['get-organization']['parameters']['header']) {\n return this.getOrganization(headers)\n }\n}\n", "import { BadRequestError } from '../core/errors'\nimport type { AmigoFetch } from '../core/openapi-client'\nimport { extractData, parseNdjsonStream } from '../core/utils'\nimport type { components, operations } from '../generated/api-types'\nimport type { ConversationId, InteractionId, MessageId, OrgId } from '../core/branded-types'\n\ntype VoiceData = Blob | Uint8Array | ReadableStream<Uint8Array>\nexport type InteractionInput = string | VoiceData\n\ntype InteractQuery = operations['interact-with-conversation']['parameters']['query']\ntype InteractQuerySerialized = Omit<InteractQuery, 'request_audio_config'> & {\n request_audio_config?: string | null\n}\n\n/** Resource for managing conversations and interactions. */\nexport class ConversationResource {\n constructor(\n private c: AmigoFetch,\n private orgId: OrgId\n ) {}\n\n /** Create a new conversation and return an async stream of NDJSON events. */\n async createConversation(options: {\n body: components['schemas']['conversation__create_conversation__Request']\n query: operations['create-conversation']['parameters']['query']\n headers?: operations['create-conversation']['parameters']['header']\n signal?: AbortSignal\n }) {\n const { body, query, headers, signal } = options\n const resp = await this.c.POST('/v1/{organization}/conversation/', {\n params: { path: { organization: this.orgId }, query },\n body,\n headers: {\n Accept: 'application/x-ndjson',\n ...(headers ?? {}),\n } as operations['create-conversation']['parameters']['header'],\n // Ensure we receive a stream for NDJSON\n parseAs: 'stream',\n ...(signal && { signal }),\n })\n\n // onResponse middleware throws for non-2xx; if we reach here, it's OK.\n return parseNdjsonStream<components['schemas']['conversation__create_conversation__Response']>(\n resp.response\n )\n }\n\n /** Send a text or voice interaction and return an async stream of NDJSON events. */\n async interactWithConversation(options: {\n conversationId: ConversationId\n input: InteractionInput\n query: operations['interact-with-conversation']['parameters']['query']\n headers?: operations['interact-with-conversation']['parameters']['header']\n signal?: AbortSignal\n }) {\n const { conversationId, input, query, headers, signal } = options\n // Build body based on requested format, then perform a single POST\n let bodyToSend: FormData | VoiceData\n\n // Prepare headers; we'll merge user-supplied headers and adjust per format\n const mergedHeaders: Record<string, unknown> = {\n Accept: 'application/x-ndjson',\n ...(headers ?? {}),\n }\n\n if (query.request_format === 'text') {\n if (typeof input !== 'string') {\n throw new BadRequestError(\"textMessage is required when request_format is 'text'\")\n }\n const form = new FormData()\n form.append('initial_message_type', 'user-message')\n form.append('recorded_message', input)\n bodyToSend = form\n } else if (query.request_format === 'voice') {\n if (typeof input === 'string') {\n throw new BadRequestError(\n \"voice input must be a byte source when request_format is 'voice'\"\n )\n }\n bodyToSend = input\n } else {\n throw new BadRequestError('Unsupported or missing request_format in params')\n }\n\n // For text/FormData, do NOT set Content-Type; fetch will set multipart boundary\n if (query.request_format === 'text') {\n delete mergedHeaders['content-type']\n delete mergedHeaders['Content-Type']\n }\n\n // For voice bytes, allow caller to specify Content-Type; if absent and input is a Blob with a type, use it\n if (query.request_format === 'voice') {\n const hasContentType =\n mergedHeaders['content-type'] !== undefined || mergedHeaders['Content-Type'] !== undefined\n if (!hasContentType && typeof Blob !== 'undefined' && input instanceof Blob && input.type) {\n mergedHeaders['content-type'] = input.type\n }\n }\n\n const headersToSend =\n mergedHeaders as unknown as operations['interact-with-conversation']['parameters']['header']\n\n // Normalize nested object params that must be sent as JSON strings\n const normalizedQuery: InteractQuerySerialized = {\n ...query,\n request_audio_config:\n typeof query.request_audio_config === 'object' && query.request_audio_config !== null\n ? JSON.stringify(query.request_audio_config)\n : (query.request_audio_config ?? undefined),\n }\n\n const resp = await this.c.POST('/v1/{organization}/conversation/{conversation_id}/interact', {\n params: {\n path: { organization: this.orgId, conversation_id: conversationId },\n query: normalizedQuery as unknown as InteractQuery,\n header: headersToSend,\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n body: bodyToSend as any, // FormData/Blob not represented in generated OpenAPI types\n parseAs: 'stream',\n ...(signal && { signal }),\n })\n\n return parseNdjsonStream<\n components['schemas']['conversation__interact_with_conversation__Response']\n >(resp.response)\n }\n\n /** List conversations, optionally filtered by query parameters. */\n async getConversations(\n queryParams?: operations['get-conversations']['parameters']['query'],\n headers?: operations['get-conversations']['parameters']['header']\n ) {\n return extractData(\n this.c.GET('/v1/{organization}/conversation/', {\n params: { path: { organization: this.orgId }, query: queryParams },\n headers,\n })\n )\n }\n\n /** Get messages for a conversation. */\n async getConversationMessages(options: {\n conversationId: ConversationId\n query?: operations['get-conversation-messages']['parameters']['query']\n headers?: operations['get-conversation-messages']['parameters']['header']\n }) {\n const { conversationId, query, headers } = options\n return extractData(\n this.c.GET('/v1/{organization}/conversation/{conversation_id}/messages/', {\n params: {\n path: { organization: this.orgId, conversation_id: conversationId },\n query,\n },\n headers,\n })\n )\n }\n\n /**\n * Finish (close) a conversation.\n * @returns void\n */\n async finishConversation(options: {\n conversationId: ConversationId\n headers?: operations['finish-conversation']['parameters']['header']\n }): Promise<void> {\n const { conversationId, headers } = options\n await this.c.POST('/v1/{organization}/conversation/{conversation_id}/finish/', {\n params: { path: { organization: this.orgId, conversation_id: conversationId } },\n headers,\n // No content is expected; parse as text to access raw Response\n parseAs: 'text',\n })\n return undefined\n }\n\n /** Get recommended responses for an interaction. */\n async recommendResponsesForInteraction(options: {\n conversationId: ConversationId\n interactionId: InteractionId\n body?: { context?: string }\n headers?: operations['recommend-responses-for-interaction']['parameters']['header']\n }) {\n const { conversationId, interactionId, body, headers } = options\n return extractData(\n this.c.POST(\n '/v1/{organization}/conversation/{conversation_id}/interaction/{interaction_id}/recommend_responses',\n {\n params: {\n path: {\n organization: this.orgId,\n conversation_id: conversationId,\n interaction_id: interactionId,\n },\n },\n body,\n headers,\n }\n )\n )\n }\n\n /** Get insights for an interaction. */\n async getInteractionInsights(options: {\n conversationId: ConversationId\n interactionId: InteractionId\n headers?: operations['get-interaction-insights']['parameters']['header']\n }) {\n const { conversationId, interactionId, headers } = options\n return extractData(\n this.c.GET(\n '/v1/{organization}/conversation/{conversation_id}/interaction/{interaction_id}/insights',\n {\n params: {\n path: {\n organization: this.orgId,\n conversation_id: conversationId,\n interaction_id: interactionId,\n },\n },\n headers,\n }\n )\n )\n }\n\n /** Get the audio/media source URL for a message. */\n async getMessageSource(options: {\n conversationId: ConversationId\n messageId: MessageId\n headers?: operations['retrieve-message-source']['parameters']['header']\n }) {\n const { conversationId, messageId, headers } = options\n return extractData(\n this.c.GET('/v1/{organization}/conversation/{conversation_id}/messages/{message_id}/source', {\n params: {\n path: {\n organization: this.orgId,\n conversation_id: conversationId,\n message_id: messageId,\n },\n },\n headers,\n })\n )\n }\n\n /** Generate conversation starter suggestions. */\n async generateConversationStarters(\n body: components['schemas']['conversation__generate_conversation_starter__Request'],\n headers?: operations['generate-conversation-starter']['parameters']['header']\n ) {\n return extractData(\n this.c.POST('/v1/{organization}/conversation/conversation_starter', {\n params: { path: { organization: this.orgId } },\n body,\n headers,\n })\n )\n }\n\n // --- Convenience aliases ---\n\n /** Alias for getConversations. */\n async list(\n queryParams?: operations['get-conversations']['parameters']['query'],\n headers?: operations['get-conversations']['parameters']['header']\n ) {\n return this.getConversations(queryParams, headers)\n }\n\n /** Alias for createConversation. */\n async create(options: Parameters<ConversationResource['createConversation']>[0]) {\n return this.createConversation(options)\n }\n\n /** Alias for interactWithConversation. */\n async interact(options: Parameters<ConversationResource['interactWithConversation']>[0]) {\n return this.interactWithConversation(options)\n }\n\n /** Alias for finishConversation. */\n async finish(options: Parameters<ConversationResource['finishConversation']>[0]) {\n return this.finishConversation(options)\n }\n\n /** Alias for getConversationMessages. */\n async messages(options: Parameters<ConversationResource['getConversationMessages']>[0]) {\n return this.getConversationMessages(options)\n }\n}\n", "import type { AmigoFetch } from '../core/openapi-client'\nimport { extractData } from '../core/utils'\nimport type { components, operations } from '../generated/api-types'\nimport type { OrgId, ServiceId } from '../core/branded-types'\n\n/** Resource for managing services. */\nexport class ServiceResource {\n constructor(\n private c: AmigoFetch,\n private orgId: OrgId\n ) {}\n\n /** List services for the organization. */\n async getServices(\n queryParams?: operations['get-services']['parameters']['query'],\n headers?: operations['get-services']['parameters']['header']\n ) {\n return extractData(\n this.c.GET('/v1/{organization}/service/', {\n params: { path: { organization: this.orgId }, query: queryParams },\n headers,\n })\n )\n }\n\n /** Create a new service. */\n async createService(options: {\n body: components['schemas']['service__create_service__Request']\n headers?: operations['create-service']['parameters']['header']\n }) {\n const { body, headers } = options\n return extractData(\n this.c.POST('/v1/{organization}/service/', {\n params: { path: { organization: this.orgId } },\n body,\n headers,\n })\n )\n }\n\n /** Update a service. */\n async updateService(options: {\n serviceId: ServiceId\n body: components['schemas']['service__update_service__Request']\n headers?: operations['update-service']['parameters']['header']\n }) {\n const { serviceId, body, headers } = options\n return extractData(\n this.c.POST('/v1/{organization}/service/{service_id}/', {\n params: { path: { organization: this.orgId, service_id: serviceId } },\n body,\n headers,\n })\n )\n }\n\n /** Upsert a service version set. */\n async upsertVersionSet(options: {\n serviceId: ServiceId\n versionSetName: string\n body: components['schemas']['service__upsert_service_version_set__Request']\n headers?: operations['upsert-service-version-set']['parameters']['header']\n }) {\n const { serviceId, versionSetName, body, headers } = options\n return extractData(\n this.c.PUT('/v1/{organization}/service/{service_id}/version_sets/{version_set_name}/', {\n params: {\n path: {\n organization: this.orgId,\n service_id: serviceId,\n version_set_name: versionSetName,\n },\n },\n body,\n headers,\n })\n )\n }\n\n /** Delete a service version set. */\n async deleteVersionSet(options: {\n serviceId: ServiceId\n versionSetName: string\n headers?: operations['delete-service-version-set']['parameters']['header']\n }): Promise<void> {\n const { serviceId, versionSetName, headers } = options\n await this.c.DELETE(\n '/v1/{organization}/service/{service_id}/version_sets/{version_set_name}/',\n {\n params: {\n path: {\n organization: this.orgId,\n service_id: serviceId,\n version_set_name: versionSetName,\n },\n },\n headers,\n }\n )\n return undefined\n }\n\n // --- Convenience aliases ---\n\n /** Alias for getServices. */\n async list(\n queryParams?: operations['get-services']['parameters']['query'],\n headers?: operations['get-services']['parameters']['header']\n ) {\n return this.getServices(queryParams, headers)\n }\n\n /** Alias for createService. */\n async create(options: Parameters<ServiceResource['createService']>[0]) {\n return this.createService(options)\n }\n}\n", "import type { AmigoFetch } from '../core/openapi-client'\nimport { extractData } from '../core/utils'\nimport type { components, operations } from '../generated/api-types'\nimport type { OrgId, UserId } from '../core/branded-types'\n\n/** Resource for managing users in the organization. */\nexport class UserResource {\n constructor(\n private c: AmigoFetch,\n private orgId: OrgId\n ) {}\n\n /** List users in the organization. */\n async getUsers(\n queryParams?: operations['get-users']['parameters']['query'],\n headers?: operations['get-users']['parameters']['header']\n ) {\n return extractData(\n this.c.GET('/v1/{organization}/user/', {\n params: { path: { organization: this.orgId }, query: queryParams },\n headers,\n })\n )\n }\n\n /** Create (invite) a new user to the organization. */\n async createUser(\n body: components['schemas']['user__create_invited_user__Request'],\n headers?: operations['create-invited-user']['parameters']['header']\n ) {\n return extractData(\n this.c.POST('/v1/{organization}/user/', {\n params: { path: { organization: this.orgId } },\n body,\n headers,\n })\n )\n }\n\n /** Delete a user by ID. */\n async deleteUser(\n userId: UserId,\n headers?: operations['delete-user']['parameters']['header']\n ): Promise<void> {\n await this.c.DELETE('/v1/{organization}/user/{requested_user_id}', {\n params: { path: { organization: this.orgId, requested_user_id: userId } },\n headers,\n })\n return undefined\n }\n\n /** Update user information. */\n async updateUser(options: {\n userId: UserId\n body: components['schemas']['user__update_user_info__Request']\n headers?: operations['update-user-info']['parameters']['header']\n }): Promise<void> {\n const { userId, body, headers } = options\n await this.c.POST('/v1/{organization}/user/{requested_user_id}', {\n params: { path: { organization: this.orgId, requested_user_id: userId } },\n body,\n headers,\n })\n return undefined\n }\n\n /** Get the user model for a user. */\n async getUserModel(\n userId: UserId,\n headers?: operations['get-user-model']['parameters']['header']\n ) {\n return extractData(\n this.c.GET('/v1/{organization}/user/{user_id}/user_model', {\n params: { path: { organization: this.orgId, user_id: userId } },\n headers,\n })\n )\n }\n\n // --- Convenience aliases ---\n\n /** Alias for getUsers. */\n async list(\n queryParams?: operations['get-users']['parameters']['query'],\n headers?: operations['get-users']['parameters']['header']\n ) {\n return this.getUsers(queryParams, headers)\n }\n\n /** Alias for createUser. */\n async create(\n body: components['schemas']['user__create_invited_user__Request'],\n headers?: operations['create-invited-user']['parameters']['header']\n ) {\n return this.createUser(body, headers)\n }\n\n /** Alias for getUserModel. */\n async getModel(userId: UserId, headers?: operations['get-user-model']['parameters']['header']) {\n return this.getUserModel(userId, headers)\n }\n\n /** Alias for deleteUser. */\n async delete(\n userId: UserId,\n headers?: operations['delete-user']['parameters']['header']\n ): Promise<void> {\n return this.deleteUser(userId, headers)\n }\n\n /** Alias for updateUser. */\n async update(options: Parameters<UserResource['updateUser']>[0]): Promise<void> {\n return this.updateUser(options)\n }\n}\n", "import type { AmigoFetch } from '../core/openapi-client'\nimport { extractData } from '../core/utils'\nimport type { components, operations } from '../generated/api-types'\nimport type { OrgId, AgentId } from '../core/branded-types'\n\n/** Resource for managing agents in the organization. */\nexport class AgentResource {\n constructor(\n private c: AmigoFetch,\n private orgId: OrgId\n ) {}\n\n /** Create a new agent for the organization. */\n async createAgent(options: {\n body: components['schemas']['organization__create_agent__Request']\n headers?: operations['create-agent']['parameters']['header']\n }) {\n const { body, headers } = options\n return extractData(\n this.c.POST('/v1/{organization}/organization/agent', {\n params: { path: { organization: this.orgId } },\n body,\n headers,\n })\n )\n }\n\n /** List agents for the organization. */\n async getAgents(options?: {\n query?: operations['get-agents']['parameters']['query']\n headers?: operations['get-agents']['parameters']['header']\n }) {\n const { query, headers } = options ?? {}\n return extractData(\n this.c.GET('/v1/{organization}/organization/agent', {\n params: { path: { organization: this.orgId }, query },\n headers,\n })\n )\n }\n\n /** Delete an agent by ID. */\n async deleteAgent(options: {\n agentId: AgentId\n headers?: operations['delete-agent']['parameters']['header']\n }): Promise<void> {\n const { agentId, headers } = options\n await this.c.DELETE('/v1/{organization}/organization/agent/{agent_id}/', {\n params: { path: { organization: this.orgId, agent_id: agentId } },\n headers,\n })\n return undefined\n }\n\n /** Create a new version of an agent. */\n async createAgentVersion(options: {\n agentId: AgentId\n body: components['schemas']['organization__create_agent_version__Request']\n query?: operations['create-agent-version']['parameters']['query']\n headers?: operations['create-agent-version']['parameters']['header']\n }) {\n const { agentId, body, query, headers } = options\n return extractData(\n this.c.POST('/v1/{organization}/organization/agent/{agent_id}/', {\n params: { path: { organization: this.orgId, agent_id: agentId }, query },\n body,\n headers,\n })\n )\n }\n\n /** Get versions of an agent. */\n async getAgentVersions(options: {\n agentId: AgentId\n query?: operations['get-agent-versions']['parameters']['query']\n headers?: operations['get-agent-versions']['parameters']['header']\n }) {\n const { agentId, query, headers } = options\n return extractData(\n this.c.GET('/v1/{organization}/organization/agent/{agent_id}/version', {\n params: { path: { organization: this.orgId, agent_id: agentId }, query },\n headers,\n })\n )\n }\n\n // --- Convenience aliases ---\n\n /** Alias for getAgents. */\n async list(options?: Parameters<AgentResource['getAgents']>[0]) {\n return this.getAgents(options)\n }\n\n /** Alias for createAgent. */\n async create(options: Parameters<AgentResource['createAgent']>[0]) {\n return this.createAgent(options)\n }\n\n /** Alias for deleteAgent. */\n async delete(options: Parameters<AgentResource['deleteAgent']>[0]): Promise<void> {\n return this.deleteAgent(options)\n }\n}\n", "import type { AmigoFetch } from '../core/openapi-client'\nimport { extractData } from '../core/utils'\nimport type { components, operations } from '../generated/api-types'\nimport type { OrgId } from '../core/branded-types'\n\n/** Branded type for Context Graph (HSM) IDs. */\ntype ContextGraphId = string\n\n/** Resource for managing context graphs (service hierarchical state machines). */\nexport class ContextGraphResource {\n constructor(\n private c: AmigoFetch,\n private orgId: OrgId\n ) {}\n\n /** Create a new context graph. */\n async createContextGraph(options: {\n body: components['schemas']['organization__create_service_hierarchical_state_machine__Request']\n headers?: operations['create-service-hierarchical-state-machine']['parameters']['header']\n }) {\n const { body, headers } = options\n return extractData(\n this.c.POST('/v1/{organization}/organization/service_hierarchical_state_machine', {\n params: { path: { organization: this.orgId } },\n body,\n headers,\n })\n )\n }\n\n /** List context graphs for the organization. */\n async getContextGraphs(options?: {\n query?: operations['get-service-hierarchical-state-machines']['parameters']['query']\n headers?: operations['get-service-hierarchical-state-machines']['parameters']['header']\n }) {\n const { query, headers } = options ?? {}\n return extractData(\n this.c.GET('/v1/{organization}/organization/service_hierarchical_state_machine', {\n params: { path: { organization: this.orgId }, query },\n headers,\n })\n )\n }\n\n /** Create a new version of a context graph. */\n async createContextGraphVersion(options: {\n contextGraphId: ContextGraphId\n body: components['schemas']['organization__create_service_hierarchical_state_machine_version__Request']\n query?: operations['create-service-hierarchical-state-machine-version']['parameters']['query']\n headers?: operations['create-service-hierarchical-state-machine-version']['parameters']['header']\n }) {\n const { contextGraphId, body, query, headers } = options\n return extractData(\n this.c.POST(\n '/v1/{organization}/organization/service_hierarchical_state_machine/{service_hierarchical_state_machine_id}/',\n {\n params: {\n path: {\n organization: this.orgId,\n service_hierarchical_state_machine_id: contextGraphId,\n },\n query,\n },\n body,\n headers,\n }\n )\n )\n }\n\n /** Delete a context graph. */\n async deleteContextGraph(options: {\n contextGraphId: ContextGraphId\n headers?: operations['delete-service-hierarchical-state-machine']['parameters']['header']\n }): Promise<void> {\n const { contextGraphId, headers } = options\n await this.c.DELETE(\n '/v1/{organization}/organization/service_hierarchical_state_machine/{state_machine_id}/',\n {\n params: {\n path: { organization: this.orgId, state_machine_id: contextGraphId },\n },\n headers,\n }\n )\n return undefined\n }\n\n /** Get versions of a context graph. */\n async getContextGraphVersions(options: {\n contextGraphId: ContextGraphId\n query?: operations['get-service-hierarchical-state-machine-versions']['parameters']['query']\n headers?: operations['get-service-hierarchical-state-machine-versions']['parameters']['header']\n }) {\n const { contextGraphId, query, headers } = options\n return extractData(\n this.c.GET(\n '/v1/{organization}/organization/service_hierarchical_state_machine/{service_hierarchical_state_machine_id}/version',\n {\n params: {\n path: {\n organization: this.orgId,\n service_hierarchical_state_machine_id: contextGraphId,\n },\n query,\n },\n headers,\n }\n )\n )\n }\n\n // --- Convenience aliases ---\n\n /** Alias for getContextGraphs. */\n async list(options?: Parameters<ContextGraphResource['getContextGraphs']>[0]) {\n return this.getContextGraphs(options)\n }\n\n /** Alias for createContextGraph. */\n async create(options: Parameters<ContextGraphResource['createContextGraph']>[0]) {\n return this.createContextGraph(options)\n }\n\n /** Alias for deleteContextGraph. */\n async delete(options: Parameters<ContextGraphResource['deleteContextGraph']>[0]) {\n return this.deleteContextGraph(options)\n }\n}\n", "export type {\n WebhookEvent,\n WebhookEventType,\n WebhookHeaders,\n PostProcessingType,\n ConversationPostProcessingCompleteEvent,\n} from './types'\nexport { parseWebhookEvent, verifySignature, WebhookVerificationError } from './parse'\nexport type { ParseWebhookEventOptions } from './parse'\n", "import { createHmac, timingSafeEqual } from 'node:crypto'\nimport type { WebhookEvent, WebhookEventType } from './types'\n\n/** Options for parsing a webhook event. */\nexport interface ParseWebhookEventOptions {\n /** Raw request body (string or Buffer). */\n payload: string | Buffer\n /** HMAC-SHA256 signature from `x-amigo-request-signature` header. */\n signature?: string\n /** Timestamp from `x-amigo-request-timestamp` header (ms). */\n timestamp?: string\n /** Webhook destination secret for signature verification. */\n secret?: string\n /**\n * Maximum age of the webhook event in milliseconds.\n * Events older than this are rejected to prevent replay attacks.\n * @default 300_000 (5 minutes)\n */\n maxAge?: number\n}\n\n/** Error thrown when webhook verification fails. */\nexport class WebhookVerificationError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'WebhookVerificationError'\n }\n}\n\nconst KNOWN_EVENT_TYPES: Set<WebhookEventType> = new Set(['conversation-post-processing-complete'])\n\n/**\n * Parse and optionally verify a webhook event payload.\n *\n * If `signature`, `timestamp`, and `secret` are all provided, the\n * payload's HMAC-SHA256 signature is verified before parsing.\n *\n * @throws {WebhookVerificationError} If signature verification fails or the event is too old.\n * @returns The typed webhook event.\n */\nexport function parseWebhookEvent(options: ParseWebhookEventOptions): WebhookEvent {\n const { payload, signature, timestamp, secret, maxAge = 300_000 } = options\n\n const body = typeof payload === 'string' ? payload : payload.toString('utf-8')\n\n // Verify signature if all pieces are present\n if (signature && timestamp && secret) {\n verifySignature(body, timestamp, signature, secret)\n\n // Check timestamp freshness\n const eventTime = parseInt(timestamp, 10)\n if (isNaN(eventTime)) {\n throw new WebhookVerificationError('Invalid timestamp')\n }\n if (Date.now() - eventTime > maxAge) {\n throw new WebhookVerificationError(\n `Webhook event is too old (received ${Date.now() - eventTime}ms ago, max ${maxAge}ms)`\n )\n }\n }\n\n let parsed: unknown\n try {\n parsed = JSON.parse(body)\n } catch {\n throw new WebhookVerificationError('Invalid JSON payload')\n }\n\n if (!parsed || typeof parsed !== 'object' || !('type' in parsed)) {\n throw new WebhookVerificationError('Payload missing \"type\" field')\n }\n\n const event = parsed as { type: string }\n if (!KNOWN_EVENT_TYPES.has(event.type as WebhookEventType)) {\n throw new WebhookVerificationError(`Unknown webhook event type: ${event.type}`)\n }\n\n return parsed as WebhookEvent\n}\n\n/**\n * Verify the HMAC-SHA256 signature of a webhook payload.\n *\n * @throws {WebhookVerificationError} If the signature does not match.\n */\nexport function verifySignature(\n body: string,\n timestamp: string,\n signature: string,\n secret: string\n): void {\n const expected = createHmac('sha256', secret).update(`v1:${timestamp}:${body}`).digest('hex')\n\n const sigBuf = Buffer.from(signature, 'utf-8')\n const expectedBuf = Buffer.from(expected, 'utf-8')\n\n if (sigBuf.length !== expectedBuf.length || !timingSafeEqual(sigBuf, expectedBuf)) {\n throw new WebhookVerificationError('Signature verification failed')\n }\n}\n", "/**\n * Rate limit metadata parsed from Amigo API response headers.\n *\n * Headers: X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset\n */\nexport interface RateLimitInfo {\n /** Maximum requests allowed in the current window. */\n limit: number\n /** Requests remaining in the current window. */\n remaining: number\n /** When the current rate-limit window resets (UTC). */\n reset: Date\n}\n\n/**\n * Parse rate limit info from HTTP response headers.\n * Returns `undefined` if the rate limit headers are not present.\n */\nexport function parseRateLimitHeaders(headers: Headers): RateLimitInfo | undefined {\n const limit = headers.get('x-ratelimit-limit')\n const remaining = headers.get('x-ratelimit-remaining')\n const reset = headers.get('x-ratelimit-reset')\n\n if (limit === null || remaining === null || reset === null) {\n return undefined\n }\n\n const limitNum = parseInt(limit, 10)\n const remainingNum = parseInt(remaining, 10)\n const resetEpoch = parseInt(reset, 10)\n\n if (isNaN(limitNum) || isNaN(remainingNum) || isNaN(resetEpoch)) {\n return undefined\n }\n\n return {\n limit: limitNum,\n remaining: remainingNum,\n reset: new Date(resetEpoch * 1000),\n }\n}\n\n/**\n * Callback invoked after each API response with rate limit info.\n * Register via `AmigoSdkConfig.onRateLimit`.\n */\nexport type RateLimitCallback = (info: RateLimitInfo, path: string) => void\n", "declare const __brand: unique symbol\ntype Brand<T, B extends string> = T & { readonly [__brand]: B }\n\n/** A branded string representing a Conversation ID. */\nexport type ConversationId = Brand<string, 'ConversationId'>\n/** A branded string representing a Message ID. */\nexport type MessageId = Brand<string, 'MessageId'>\n/** A branded string representing a User ID. */\nexport type UserId = Brand<string, 'UserId'>\n/** A branded string representing an Organization ID. */\nexport type OrgId = Brand<string, 'OrgId'>\n/** A branded string representing an Interaction ID. */\nexport type InteractionId = Brand<string, 'InteractionId'>\n/** A branded string representing a Service ID. */\nexport type ServiceId = Brand<string, 'ServiceId'>\n/** A branded string representing an Agent ID. */\nexport type AgentId = Brand<string, 'AgentId'>\n/** A branded string representing a Tool ID. */\nexport type ToolId = Brand<string, 'ToolId'>\n/** A branded string representing a Dynamic Behavior Set ID. */\nexport type DynamicBehaviorSetId = Brand<string, 'DynamicBehaviorSetId'>\n/** A branded string representing a Metric ID. */\nexport type MetricId = Brand<string, 'MetricId'>\n/** A branded string representing a Simulation Persona ID. */\nexport type SimulationPersonaId = Brand<string, 'SimulationPersonaId'>\n/** A branded string representing a Simulation Scenario ID. */\nexport type SimulationScenarioId = Brand<string, 'SimulationScenarioId'>\n/** A branded string representing a Simulation Unit Test ID. */\nexport type SimulationUnitTestId = Brand<string, 'SimulationUnitTestId'>\n/** A branded string representing a Simulation Unit Test Set ID. */\nexport type SimulationUnitTestSetId = Brand<string, 'SimulationUnitTestSetId'>\n/** A branded string representing a Webhook Destination ID. */\nexport type WebhookDestinationId = Brand<string, 'WebhookDestinationId'>\n/** A branded string representing a Role ID. */\nexport type RoleId = Brand<string, 'RoleId'>\n/** A branded string representing an API Key ID. */\nexport type ApiKeyId = Brand<string, 'ApiKeyId'>\n\n/** Create a branded ConversationId from a plain string. */\nexport function conversationId(id: string): ConversationId {\n return id as ConversationId\n}\n\n/** Create a branded MessageId from a plain string. */\nexport function messageId(id: string): MessageId {\n return id as MessageId\n}\n\n/** Create a branded UserId from a plain string. */\nexport function userId(id: string): UserId {\n return id as UserId\n}\n\n/** Create a branded OrgId from a plain string. */\nexport function orgId(id: string): OrgId {\n return id as OrgId\n}\n\n/** Create a branded InteractionId from a plain string. */\nexport function interactionId(id: string): InteractionId {\n return id as InteractionId\n}\n\n/** Create a branded ServiceId from a plain string. */\nexport function serviceId(id: string): ServiceId {\n return id as ServiceId\n}\n\n/** Create a branded AgentId from a plain string. */\nexport function agentId(id: string): AgentId {\n return id as AgentId\n}\n\n/** Create a branded ToolId from a plain string. */\nexport function toolId(id: string): ToolId {\n return id as ToolId\n}\n\n/** Create a branded DynamicBehaviorSetId from a plain string. */\nexport function dynamicBehaviorSetId(id: string): DynamicBehaviorSetId {\n return id as DynamicBehaviorSetId\n}\n\n/** Create a branded MetricId from a plain string. */\nexport function metricId(id: string): MetricId {\n return id as MetricId\n}\n\n/** Create a branded SimulationPersonaId from a plain string. */\nexport function simulationPersonaId(id: string): SimulationPersonaId {\n return id as SimulationPersonaId\n}\n\n/** Create a branded SimulationScenarioId from a plain string. */\nexport function simulationScenarioId(id: string): SimulationScenarioId {\n return id as SimulationScenarioId\n}\n\n/** Create a branded SimulationUnitTestId from a plain string. */\nexport function simulationUnitTestId(id: string): SimulationUnitTestId {\n return id as SimulationUnitTestId\n}\n\n/** Create a branded SimulationUnitTestSetId from a plain string. */\nexport function simulationUnitTestSetId(id: string): SimulationUnitTestSetId {\n return id as SimulationUnitTestSetId\n}\n\n/** Create a branded WebhookDestinationId from a plain string. */\nexport function webhookDestinationId(id: string): WebhookDestinationId {\n return id as WebhookDestinationId\n}\n\n/** Create a branded RoleId from a plain string. */\nexport function roleId(id: string): RoleId {\n return id as RoleId\n}\n\n/** Create a branded ApiKeyId from a plain string. */\nexport function apiKeyId(id: string): ApiKeyId {\n return id as ApiKeyId\n}\n", "import { ConfigurationError } from './core/errors'\nimport { createAmigoFetch } from './core/openapi-client'\nimport { OrganizationResource } from './resources/organization'\nimport { ConversationResource } from './resources/conversation'\nimport { ServiceResource } from './resources/services'\nimport { UserResource } from './resources/user'\nimport { AgentResource } from './resources/agent'\nimport { ContextGraphResource } from './resources/context-graph'\nimport type { RetryOptions } from './core/retry'\nimport type { UserId, OrgId } from './core/branded-types'\n\nexport interface AmigoSdkConfig {\n /** API key from Amigo dashboard */\n apiKey: string\n /** API-key ID from Amigo dashboard */\n apiKeyId: string\n /** User ID on whose behalf the request is made */\n userId: UserId\n /** The Organization ID */\n orgId: OrgId\n /** Base URL of the Amigo API */\n baseUrl?: string\n /** Retry configuration for HTTP requests */\n retry?: RetryOptions\n}\n\nconst defaultBaseUrl = 'https://api.amigo.ai'\n\n/**\n * Main client for the Amigo API.\n * Provides access to all API resources (organizations, conversations, services, users).\n */\nexport class AmigoClient {\n readonly organizations: OrganizationResource\n readonly conversations: ConversationResource\n readonly services: ServiceResource\n readonly users: UserResource\n readonly agents: AgentResource\n readonly contextGraphs: ContextGraphResource\n readonly config: AmigoSdkConfig\n\n /** Create a new Amigo client with the given configuration. */\n constructor(config: AmigoSdkConfig) {\n this.config = validateConfig(config)\n\n const api = createAmigoFetch(this.config)\n this.organizations = new OrganizationResource(api, this.config.orgId)\n this.conversations = new ConversationResource(api, this.config.orgId)\n this.services = new ServiceResource(api, this.config.orgId)\n this.users = new UserResource(api, this.config.orgId)\n this.agents = new AgentResource(api, this.config.orgId)\n this.contextGraphs = new ContextGraphResource(api, this.config.orgId)\n }\n}\n\nfunction validateConfig(config: AmigoSdkConfig) {\n if (!config.apiKey) {\n throw new ConfigurationError('API key is required', 'apiKey')\n }\n if (!config.apiKeyId) {\n throw new ConfigurationError('API key ID is required', 'apiKeyId')\n }\n if (!config.userId) {\n throw new ConfigurationError('User ID is required', 'userId')\n }\n if (!config.orgId) {\n throw new ConfigurationError('Organization ID is required', 'orgId')\n }\n if (!config.baseUrl) {\n config.baseUrl = defaultBaseUrl\n }\n return config\n}\n\n// Export error classes individually (not as namespace)\nexport {\n AmigoError,\n BadRequestError,\n AuthenticationError,\n PermissionError,\n NotFoundError,\n ConflictError,\n RateLimitError,\n ServerError,\n ServiceUnavailableError,\n ConfigurationError,\n ValidationError,\n NetworkError,\n ParseError,\n isAmigoError,\n} from './core/errors'\n\n// Export webhook types and helpers\nexport * as webhooks from './webhooks'\n\n// Export rate limit types\nexport type { RateLimitInfo, RateLimitCallback } from './core/rate-limit'\nexport { parseRateLimitHeaders } from './core/rate-limit'\n\n// Export retry and interaction types\nexport type { RetryOptions } from './core/retry'\nexport type { InteractionInput } from './resources/conversation'\n\n// Re-export useful types for consumers\nexport type { components, operations, paths } from './generated/api-types'\n\n// Export branded types and helper functions\nexport type {\n ConversationId,\n MessageId,\n UserId,\n OrgId,\n InteractionId,\n ServiceId,\n AgentId,\n ToolId,\n DynamicBehaviorSetId,\n MetricId,\n SimulationPersonaId,\n SimulationScenarioId,\n SimulationUnitTestId,\n SimulationUnitTestSetId,\n WebhookDestinationId,\n RoleId,\n ApiKeyId,\n} from './core/branded-types'\nexport {\n conversationId,\n messageId,\n userId,\n orgId,\n interactionId,\n serviceId,\n agentId,\n toolId,\n dynamicBehaviorSetId,\n metricId,\n simulationPersonaId,\n simulationScenarioId,\n simulationUnitTestId,\n simulationUnitTestSetId,\n webhookDestinationId,\n roleId,\n apiKeyId,\n} from './core/branded-types'\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { ParseError } from './errors'\n\n// Type helper to extract the data type from openapi-fetch responses\nexport type ExtractDataType<T> = T extends { data?: infer D } ? NonNullable<D> : never\n\n// Helper function to extract data from openapi-fetch responses\n// Since our middleware throws on errors, successful responses will have data\nexport async function extractData<T extends { data?: unknown }>(\n responsePromise: Promise<T>\n): Promise<ExtractDataType<T>> {\n const result = await responsePromise\n const data = (result as { data?: ExtractDataType<T> }).data\n\n if (data === undefined || data === null) {\n // Invariant: our error middleware throws for non-2xx responses.\n // If we reach here without data, treat as a parse/protocol error.\n throw new ParseError('Expected response data to be present for successful request', 'response')\n }\n\n return data\n}\n\n/**\n * Parse an NDJSON HTTP response body into an async generator of parsed JSON objects.\n * The generator yields one parsed object per line. Empty lines are skipped.\n */\nexport async function* parseNdjsonStream<T = unknown>(response: Response): AsyncGenerator<T> {\n const body = response.body\n if (!body) return\n\n const reader = body.getReader()\n const decoder = new TextDecoder()\n let bufferedText = ''\n\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n bufferedText += decoder.decode(value, { stream: true })\n\n let newlineIndex: number\n // Process all complete lines in the buffer\n while ((newlineIndex = bufferedText.indexOf('\\n')) !== -1) {\n const line = bufferedText.slice(0, newlineIndex).trim()\n bufferedText = bufferedText.slice(newlineIndex + 1)\n if (!line) continue\n try {\n yield JSON.parse(line) as T\n } catch (err) {\n throw new ParseError('Failed to parse NDJSON line', 'json', err as Error)\n }\n }\n }\n\n // Flush any trailing line without a newline\n const trailing = bufferedText.trim()\n if (trailing) {\n try {\n yield JSON.parse(trailing) as T\n } catch (err) {\n throw new ParseError('Failed to parse trailing NDJSON line', 'json', err as Error)\n }\n }\n } finally {\n reader.releaseLock()\n }\n}\n\nexport interface ServerSentEvent<T = unknown> {\n id?: string\n event?: string\n data: T | string\n retry?: number\n}\n\n/**\n * Parse an SSE HTTP response body into an async generator of parsed events.\n * JSON data payloads are parsed; non-JSON payloads are returned as strings.\n */\nexport async function* parseSseStream<T = unknown>(\n response: Response\n): AsyncGenerator<ServerSentEvent<T>> {\n const body = response.body\n if (!body) return\n\n const reader = body.getReader()\n const decoder = new TextDecoder()\n let bufferedText = ''\n let eventId: string | undefined\n let eventName: string | undefined\n let retry: number | undefined\n let dataLines: string[] = []\n\n const flushEvent = function* (): Generator<ServerSentEvent<T>> {\n if (dataLines.length === 0) {\n eventName = undefined\n retry = undefined\n return\n }\n\n const rawData = dataLines.join('\\n')\n let data: T | string = rawData\n try {\n data = JSON.parse(rawData) as T\n } catch {\n // SSE allows plain text data frames.\n }\n\n const event: ServerSentEvent<T> = { data }\n if (eventId !== undefined) event.id = eventId\n if (eventName !== undefined) event.event = eventName\n if (retry !== undefined) event.retry = retry\n\n eventName = undefined\n retry = undefined\n dataLines = []\n yield event\n }\n\n const processLine = function* (line: string): Generator<ServerSentEvent<T>> {\n if (line === '') {\n yield* flushEvent()\n return\n }\n if (line.startsWith(':')) return\n\n const colonIndex = line.indexOf(':')\n const field = colonIndex === -1 ? line : line.slice(0, colonIndex)\n const value = colonIndex === -1 ? '' : line.slice(colonIndex + 1).replace(/^ /, '')\n\n switch (field) {\n case 'id':\n eventId = value\n break\n case 'event':\n eventName = value\n break\n case 'data':\n dataLines.push(value)\n break\n case 'retry': {\n const retryMs = Number.parseInt(value, 10)\n if (!Number.isNaN(retryMs)) retry = retryMs\n break\n }\n }\n }\n\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n bufferedText += decoder.decode(value, { stream: true })\n\n let newlineIndex: number\n while ((newlineIndex = bufferedText.search(/\\r?\\n/)) !== -1) {\n const line = bufferedText.slice(0, newlineIndex)\n const newlineLength =\n bufferedText[newlineIndex] === '\\r' && bufferedText[newlineIndex + 1] === '\\n' ? 2 : 1\n bufferedText = bufferedText.slice(newlineIndex + newlineLength)\n yield* processLine(line)\n }\n }\n\n const trailing = bufferedText.trimEnd()\n if (trailing) {\n yield* processLine(trailing)\n }\n yield* flushEvent()\n } finally {\n reader.releaseLock()\n }\n}\n\n// Utility function to safely parse response bodies without throwing errors\nexport async function parseResponseBody(response: Response): Promise<unknown> {\n try {\n const text = await response.text()\n if (!text) return undefined\n try {\n return JSON.parse(text)\n } catch {\n return text // Return as string if not valid JSON\n }\n } catch {\n return undefined // Return undefined if any error occurs\n }\n}\n\n// Helper to detect network-related errors\nexport function isNetworkError(error: unknown): boolean {\n if (!(error instanceof Error)) return false\n\n return (\n error instanceof TypeError ||\n error.message.includes('fetch') ||\n error.message.includes('Failed to fetch') ||\n error.message.includes('Network request failed') ||\n error.message.includes('ECONNREFUSED') ||\n error.message.includes('ETIMEDOUT') ||\n error.message.includes('ENOTFOUND') ||\n error.message.includes('network')\n )\n}\n", "import type { Middleware } from 'openapi-fetch'\nimport { isNetworkError, parseResponseBody } from './utils'\n\n/** Fields that may contain sensitive tokens or credentials. */\nconst SENSITIVE_FIELDS = new Set([\n 'id_token',\n 'access_token',\n 'refresh_token',\n 'authorization',\n 'api_key',\n 'apikey',\n 'token',\n 'secret',\n 'password',\n 'x-api-key',\n])\n\n/**\n * Recursively strips sensitive fields from an object to prevent token leakage in error contexts.\n * Returns a shallow copy with sensitive keys replaced by '[REDACTED]'.\n */\nexport function sanitizeErrorContext(obj: unknown): unknown {\n if (obj === null || obj === undefined) return obj\n if (typeof obj !== 'object') return obj\n if (Array.isArray(obj)) return obj.map(sanitizeErrorContext)\n\n const result: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(obj as Record<string, unknown>)) {\n if (SENSITIVE_FIELDS.has(key.toLowerCase())) {\n result[key] = '[REDACTED]'\n } else if (typeof value === 'object' && value !== null) {\n result[key] = sanitizeErrorContext(value)\n } else {\n result[key] = value\n }\n }\n return result\n}\n\n/**\n * Base error class for all Amigo SDK errors.\n * Provides common functionality and error identification.\n */\nexport class AmigoError extends Error {\n /** Unique error code for programmatic error handling */\n readonly errorCode?: string\n\n /** HTTP status code if applicable */\n readonly statusCode?: number\n\n /** Additional context data */\n readonly context?: Record<string, unknown>\n\n constructor(\n message: string,\n options?: { statusCode?: number; errorCode?: string; context?: Record<string, unknown> }\n ) {\n super(message)\n this.name = this.constructor.name\n\n // Ensure proper prototype chain for instanceof checks\n Object.setPrototypeOf(this, new.target.prototype)\n\n // Capture stack trace\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor)\n }\n\n this.statusCode = options?.statusCode\n this.errorCode = options?.errorCode\n this.context = options?.context\n }\n\n /**\n * Returns a JSON-serializable representation of the error.\n * Sensitive fields (tokens, keys) are redacted to prevent leakage.\n */\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n message: this.message,\n code: this.errorCode,\n statusCode: this.statusCode,\n context: sanitizeErrorContext(this.context) as Record<string, unknown> | undefined,\n stack: this.stack,\n }\n }\n}\n\ntype AmigoErrorOptions = NonNullable<ConstructorParameters<typeof AmigoError>[1]>\n\nfunction isAmigoErrorOptions(value: unknown): value is AmigoErrorOptions {\n if (!value || typeof value !== 'object') return false\n const options = value as Record<string, unknown>\n return (\n ('statusCode' in options &&\n (typeof options.statusCode === 'number' || options.statusCode === undefined)) ||\n ('errorCode' in options &&\n (typeof options.errorCode === 'string' || options.errorCode === undefined)) ||\n ('context' in options && (typeof options.context === 'object' || options.context === undefined))\n )\n}\n\n/* 4xx client errors */\nexport class BadRequestError extends AmigoError {\n constructor(message: string, options?: AmigoErrorOptions) {\n super(message, { ...options, statusCode: options?.statusCode ?? 400 })\n }\n}\nexport class AuthenticationError extends AmigoError {\n constructor(message: string, options?: AmigoErrorOptions) {\n super(message, { ...options, statusCode: options?.statusCode ?? 401 })\n }\n}\nexport class PermissionError extends AmigoError {\n constructor(message: string, options?: AmigoErrorOptions) {\n super(message, { ...options, statusCode: options?.statusCode ?? 403 })\n }\n}\nexport class NotFoundError extends AmigoError {\n constructor(message: string, options?: AmigoErrorOptions) {\n super(message, { ...options, statusCode: options?.statusCode ?? 404 })\n }\n}\nexport class ConflictError extends AmigoError {\n constructor(message: string, options?: AmigoErrorOptions) {\n super(message, { ...options, statusCode: options?.statusCode ?? 409 })\n }\n}\nexport class RateLimitError extends AmigoError {\n constructor(message: string, options?: AmigoErrorOptions) {\n super(message, { ...options, statusCode: options?.statusCode ?? 429 })\n }\n}\n\n/* 5xx server errors */\nexport class ServerError extends AmigoError {\n constructor(message: string, options?: AmigoErrorOptions) {\n super(message, { ...options, statusCode: options?.statusCode ?? 500 })\n }\n}\nexport class ServiceUnavailableError extends ServerError {\n constructor(message: string, options?: AmigoErrorOptions) {\n super(message, { ...options, statusCode: options?.statusCode ?? 503 })\n }\n}\n\n/* Internal SDK errors */\nexport class ConfigurationError extends AmigoError {\n constructor(\n message: string,\n public readonly field?: string\n ) {\n super(message, { context: { field } })\n }\n}\n\n/* Validation errors */\nexport class ValidationError extends BadRequestError {\n constructor(\n msg: string,\n optionsOrFieldErrors?: AmigoErrorOptions | Record<string, string>,\n public fieldErrors?: Record<string, string>\n ) {\n const isErrorOptions = isAmigoErrorOptions(optionsOrFieldErrors)\n super(\n msg,\n isErrorOptions\n ? { ...optionsOrFieldErrors, statusCode: optionsOrFieldErrors.statusCode ?? 422 }\n : { statusCode: 422 }\n )\n this.fieldErrors = isErrorOptions\n ? fieldErrors\n : (optionsOrFieldErrors as Record<string, string> | undefined)\n }\n}\n\n/* Network-related errors */\nexport class NetworkError extends AmigoError {\n constructor(\n message: string,\n public readonly originalError?: Error,\n public readonly request?: {\n url?: string\n method?: string\n }\n ) {\n super(message, { context: { request } })\n }\n}\n\n/* Parsing errors */\nexport class ParseError extends AmigoError {\n constructor(\n message: string,\n public readonly parseType: 'json' | 'response' | 'other',\n public readonly originalError?: Error\n ) {\n super(message, { context: { parseType } })\n }\n}\n\n/* Type guard functions */\nexport function isAmigoError(error: unknown): error is AmigoError {\n return error instanceof AmigoError\n}\n\n/* Error factory to create appropriate error instances from API responses */\nexport function createApiError(response: Response, body?: unknown): AmigoError {\n const map: Record<number, typeof AmigoError> = {\n 400: BadRequestError,\n 401: AuthenticationError,\n 403: PermissionError,\n 404: NotFoundError,\n 409: ConflictError,\n 422: ValidationError,\n 429: RateLimitError,\n 500: ServerError,\n 503: ServiceUnavailableError,\n }\n\n const errorMessageKeys = ['message', 'error', 'detail']\n\n const ErrorClass = map[response.status] ?? AmigoError\n let message = `HTTP ${response.status} ${response.statusText}`\n\n if (body && typeof body === 'object') {\n for (const key of errorMessageKeys) {\n if (key in body) {\n message = String((body as Record<string, unknown>)[key])\n break\n }\n }\n }\n\n const error = new ErrorClass(message, {\n statusCode: response.status,\n errorCode:\n body && typeof body === 'object' && 'code' in body\n ? String((body as Record<string, unknown>).code)\n : undefined,\n context: { response: sanitizeErrorContext(body) },\n })\n\n return error\n}\n\nexport function createErrorMiddleware(): Middleware {\n return {\n onResponse: async ({ response }) => {\n if (!response.ok) {\n const body = await parseResponseBody(response)\n throw createApiError(response, body)\n }\n },\n onError: async ({ error, request }) => {\n // Handle network-related errors consistently\n if (isNetworkError(error)) {\n throw new NetworkError(\n `Network error: ${error instanceof Error ? error.message : String(error)}`,\n error instanceof Error ? error : new Error(String(error)),\n {\n url: request?.url,\n method: request?.method,\n }\n )\n }\n throw error\n },\n }\n}\n", "import type { Client } from 'openapi-fetch'\nimport openapiFetchImport from 'openapi-fetch'\nimport { createErrorMiddleware } from './errors'\n\n// Handle ESM/CJS interop: esbuild's __toESM wrapper can cause the default\n// import to be the module object ({ default: fn }) instead of the function directly.\n// This normalizes access to work in both environments.\nconst createClient: typeof openapiFetchImport =\n typeof openapiFetchImport === 'function'\n ? openapiFetchImport\n : (openapiFetchImport as unknown as { default: typeof openapiFetchImport }).default\nimport { createAuthMiddleware } from './auth'\nimport type { paths } from '../generated/api-types'\nimport type { AmigoSdkConfig } from '..'\nimport { createRetryingFetch } from './retry'\n\nexport type AmigoFetch = Client<paths>\n\n/** Create an OpenAPI-typed fetch client with auth, error handling, and retry middleware. */\nexport function createAmigoFetch(config: AmigoSdkConfig, mockFetch?: typeof fetch): AmigoFetch {\n const wrappedFetch = createRetryingFetch(\n config.retry,\n mockFetch ?? (globalThis.fetch as typeof fetch)\n )\n\n const client = createClient<paths>({\n baseUrl: config.baseUrl,\n fetch: wrappedFetch,\n })\n\n // Apply error handling middleware first (to catch all errors)\n client.use(createErrorMiddleware())\n\n // Apply auth middleware after error handling (so auth errors are properly handled)\n client.use(createAuthMiddleware(config))\n\n return client\n}\n", "import type { Middleware } from 'openapi-fetch'\nimport type { components } from '../generated/api-types'\nimport type { AmigoSdkConfig } from '..'\nimport { AmigoError, AuthenticationError, NetworkError, ParseError, createApiError } from './errors'\nimport { isNetworkError, parseResponseBody } from './utils'\n\ntype SignInWithApiKeyResponse = components['schemas']['user__sign_in_with_api_key__Response']\n\n/** Helper function to trade API key for a bearer token */\nexport async function getBearerToken(config: AmigoSdkConfig): Promise<SignInWithApiKeyResponse> {\n const url = `${config.baseUrl}/v1/${config.orgId}/user/signin_with_api_key`\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'x-api-key': config.apiKey,\n 'x-api-key-id': config.apiKeyId,\n 'x-user-id': config.userId,\n },\n })\n\n if (!response.ok) {\n const body = await parseResponseBody(response)\n const apiError = createApiError(response, body)\n\n // Enhance authentication errors with additional context\n if (response.status === 401) {\n throw new AuthenticationError(`Authentication failed: ${apiError.message}`, {\n ...apiError,\n context: { ...apiError.context, endpoint: 'signin_with_api_key' },\n })\n }\n throw apiError\n }\n\n return (await response.json()) as SignInWithApiKeyResponse\n } catch (err) {\n // Re-throw our custom errors as-is\n if (err instanceof AmigoError) {\n throw err\n }\n\n // Handle network errors\n if (isNetworkError(err)) {\n throw new NetworkError('Failed to connect to authentication endpoint', err as Error, {\n url,\n method: 'POST',\n })\n }\n\n // Handle JSON parsing errors\n throw new ParseError(\n 'Failed to parse authentication response',\n 'json',\n err instanceof Error ? err : new Error(String(err))\n )\n }\n}\n\nexport function createAuthMiddleware(config: AmigoSdkConfig): Middleware {\n let token: SignInWithApiKeyResponse | null = null\n let refreshPromise: Promise<SignInWithApiKeyResponse> | null = null\n\n const shouldRefreshToken = (tokenData: SignInWithApiKeyResponse): boolean => {\n if (!tokenData.expires_at) return false\n\n const expiryTime = new Date(tokenData.expires_at).getTime()\n const currentTime = Date.now()\n const timeUntilExpiry = expiryTime - currentTime\n const refreshThreshold = 5 * 60 * 1000 // 5 minutes in milliseconds\n\n return timeUntilExpiry <= refreshThreshold\n }\n\n const ensureValidToken = async (): Promise<SignInWithApiKeyResponse> => {\n if (!token || shouldRefreshToken(token)) {\n if (!refreshPromise) {\n refreshPromise = getBearerToken(config)\n try {\n token = await refreshPromise\n } finally {\n refreshPromise = null\n }\n } else {\n token = await refreshPromise\n }\n }\n return token\n }\n\n return {\n onRequest: async ({ request }) => {\n try {\n const validToken = await ensureValidToken()\n if (validToken?.id_token) {\n request.headers.set('Authorization', `Bearer ${validToken.id_token}`)\n }\n } catch (error) {\n // Clear token and re-throw - getBearerToken already provides proper error types\n token = null\n throw error\n }\n return request\n },\n\n onResponse: async ({ response }) => {\n // Handle 401 responses by clearing token to force refresh on next request\n if (response.status === 401) {\n token = null\n }\n },\n\n onError: async ({ error }) => {\n // Clear token on any error to force refresh\n token = null\n throw error\n },\n }\n}\n", "export type RetryOptions = {\n /** Maximum number of attempts to make (default: 3) */\n maxAttempts?: number\n /** Base delay between attempts (default: 250ms) */\n backoffBaseMs?: number\n /** Maximum delay between attempts (default: 30s) */\n maxDelayMs?: number\n /** Status codes to retry on (default: 408, 429, 500, 502, 503, 504) */\n retryOnStatus?: Set<number>\n /** Methods to retry on (default: GET) */\n retryOnMethods?: Set<string>\n}\n\nconst DEFAULT_RETRYABLE_STATUS = new Set([408, 429, 500, 502, 503, 504])\nconst DEFAULT_RETRYABLE_METHODS = new Set(['GET']) as Set<string>\n\n/** Merge user-provided retry options with sensible defaults. */\nexport function resolveRetryOptions(options?: RetryOptions): Required<RetryOptions> {\n return {\n maxAttempts: options?.maxAttempts ?? 3,\n backoffBaseMs: options?.backoffBaseMs ?? 250,\n maxDelayMs: options?.maxDelayMs ?? 30_000,\n retryOnStatus: new Set(options?.retryOnStatus ?? DEFAULT_RETRYABLE_STATUS),\n retryOnMethods: new Set(options?.retryOnMethods ?? DEFAULT_RETRYABLE_METHODS),\n }\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value))\n}\n\nfunction parseRetryAfterMs(headerValue: string | null, maxDelayMs: number): number | null {\n if (!headerValue) return null\n const seconds = Number(headerValue)\n if (Number.isFinite(seconds)) {\n return clamp(seconds * 1000, 0, maxDelayMs)\n }\n const date = new Date(headerValue)\n const ms = date.getTime() - Date.now()\n if (Number.isFinite(ms)) {\n return clamp(ms, 0, maxDelayMs)\n }\n return null\n}\n\nfunction computeBackoffWithJitterMs(\n attemptIndexZeroBased: number,\n baseMs: number,\n capMs: number\n): number {\n const windowMs = Math.min(capMs, baseMs * Math.pow(2, attemptIndexZeroBased))\n return Math.random() * windowMs\n}\n\nfunction isAbortError(err: unknown): boolean {\n return typeof err === 'object' && err !== null && 'name' in err && err['name'] === 'AbortError'\n}\n\nfunction isNetworkError(err: unknown): boolean {\n // Undici & browsers use TypeError for network failures\n return err instanceof TypeError && !isAbortError(err)\n}\n\nasync function abortableSleep(ms: number, signal?: AbortSignal): Promise<void> {\n if (ms <= 0) {\n signal?.throwIfAborted?.()\n return\n }\n await new Promise<void>((resolve, reject) => {\n const rejectWith =\n signal?.reason instanceof Error ? signal.reason : (signal?.reason ?? new Error('AbortError'))\n\n if (signal?.aborted) {\n reject(rejectWith)\n return\n }\n const t = setTimeout(() => {\n off()\n resolve()\n }, ms)\n const onAbort = () => {\n off()\n clearTimeout(t)\n reject(rejectWith)\n }\n const off = () => signal?.removeEventListener('abort', onAbort)\n signal?.addEventListener('abort', onAbort, { once: true })\n })\n}\n\n/** Wrap a fetch function with retry logic (exponential backoff, Retry-After support). */\nexport function createRetryingFetch(\n retryOptions?: RetryOptions,\n baseFetch?: typeof fetch\n): typeof fetch {\n const resolved = resolveRetryOptions(retryOptions)\n const underlying: typeof fetch = baseFetch ?? (globalThis.fetch as typeof fetch)\n\n const retryingFetch: typeof fetch = async (\n input: RequestInfo | URL,\n init?: RequestInit\n ): Promise<Response> => {\n const inputMethod =\n typeof Request !== 'undefined' && input instanceof Request ? input.method : undefined\n const method = ((init?.method ?? inputMethod ?? 'GET') as string).toUpperCase()\n const signal = init?.signal\n\n const isMethodRetryableByDefault = resolved.retryOnMethods.has(method)\n const maxAttempts = Math.max(1, resolved.maxAttempts)\n\n for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {\n let response: Response | null = null\n let error: unknown = null\n\n try {\n response = await underlying(input, init)\n } catch (err) {\n error = err\n }\n\n if (!error && response && response.ok) {\n return response\n }\n\n let shouldRetry = false\n let delayMs: number | null = null\n\n if (isNetworkError(error)) {\n shouldRetry = isMethodRetryableByDefault\n if (shouldRetry) {\n delayMs = computeBackoffWithJitterMs(\n attempt - 1,\n resolved.backoffBaseMs,\n resolved.maxDelayMs\n )\n }\n } else if (response) {\n const status = response.status\n if (method === 'POST') {\n if (status === 429) {\n const ra = response.headers.get('Retry-After')\n const parsed = parseRetryAfterMs(ra, resolved.maxDelayMs)\n if (parsed !== null) {\n shouldRetry = true\n delayMs = parsed\n }\n }\n } else if (isMethodRetryableByDefault && resolved.retryOnStatus.has(status)) {\n const ra = response.headers.get('Retry-After')\n delayMs =\n parseRetryAfterMs(ra, resolved.maxDelayMs) ??\n computeBackoffWithJitterMs(attempt - 1, resolved.backoffBaseMs, resolved.maxDelayMs)\n shouldRetry = true\n }\n }\n\n const attemptsRemain = attempt < maxAttempts\n if (!shouldRetry || !attemptsRemain) {\n if (error) throw error\n return response as Response\n }\n\n if (signal?.aborted) {\n if (error) throw error\n return response as Response\n }\n\n await abortableSleep(delayMs ?? 0, signal ?? undefined)\n }\n\n throw new Error('Retry loop exited unexpectedly')\n }\n\n return retryingFetch\n}\n\nexport type { RetryOptions as AmigoRetryOptions }\n", "import type { AmigoFetch } from '../core/openapi-client'\nimport { extractData } from '../core/utils'\nimport type { operations } from '../generated/api-types'\nimport type { OrgId } from '../core/branded-types'\n\n/** Resource for retrieving organization details. */\nexport class OrganizationResource {\n constructor(\n private c: AmigoFetch,\n private orgId: OrgId\n ) {}\n\n /**\n * Get organization details\n * @param headers - The headers\n * @returns The organization details\n */\n async getOrganization(headers?: operations['get-organization']['parameters']['header']) {\n return extractData(\n this.c.GET('/v1/{organization}/organization/', {\n params: { path: { organization: this.orgId } },\n headers,\n })\n )\n }\n\n /** Alias for getOrganization. */\n async get(headers?: operations['get-organization']['parameters']['header']) {\n return this.getOrganization(headers)\n }\n}\n", "import { BadRequestError } from '../core/errors'\nimport type { AmigoFetch } from '../core/openapi-client'\nimport { extractData, parseNdjsonStream } from '../core/utils'\nimport type { components, operations } from '../generated/api-types'\nimport type { ConversationId, InteractionId, MessageId, OrgId } from '../core/branded-types'\n\ntype VoiceData = Blob | Uint8Array | ReadableStream<Uint8Array>\nexport type InteractionInput = string | VoiceData\n\ntype InteractQuery = operations['interact-with-conversation']['parameters']['query']\ntype InteractQuerySerialized = Omit<InteractQuery, 'request_audio_config'> & {\n request_audio_config?: string | null\n}\n\n/** Resource for managing conversations and interactions. */\nexport class ConversationResource {\n constructor(\n private c: AmigoFetch,\n private orgId: OrgId\n ) {}\n\n /** Create a new conversation and return an async stream of NDJSON events. */\n async createConversation(options: {\n body: components['schemas']['conversation__create_conversation__Request']\n query: operations['create-conversation']['parameters']['query']\n headers?: operations['create-conversation']['parameters']['header']\n signal?: AbortSignal\n }) {\n const { body, query, headers, signal } = options\n const resp = await this.c.POST('/v1/{organization}/conversation/', {\n params: { path: { organization: this.orgId }, query },\n body,\n headers: {\n Accept: 'application/x-ndjson',\n ...(headers ?? {}),\n } as operations['create-conversation']['parameters']['header'],\n // Ensure we receive a stream for NDJSON\n parseAs: 'stream',\n ...(signal && { signal }),\n })\n\n // onResponse middleware throws for non-2xx; if we reach here, it's OK.\n return parseNdjsonStream<components['schemas']['conversation__create_conversation__Response']>(\n resp.response\n )\n }\n\n /** Send a text or voice interaction and return an async stream of NDJSON events. */\n async interactWithConversation(options: {\n conversationId: ConversationId\n input: InteractionInput\n query: operations['interact-with-conversation']['parameters']['query']\n headers?: operations['interact-with-conversation']['parameters']['header']\n signal?: AbortSignal\n }) {\n const { conversationId, input, query, headers, signal } = options\n // Build body based on requested format, then perform a single POST\n let bodyToSend: FormData | VoiceData\n\n // Prepare headers; we'll merge user-supplied headers and adjust per format\n const mergedHeaders: Record<string, unknown> = {\n Accept: 'application/x-ndjson',\n ...(headers ?? {}),\n }\n\n if (query.request_format === 'text') {\n if (typeof input !== 'string') {\n throw new BadRequestError(\"textMessage is required when request_format is 'text'\")\n }\n const form = new FormData()\n form.append('initial_message_type', 'user-message')\n form.append('recorded_message', input)\n bodyToSend = form\n } else if (query.request_format === 'voice') {\n if (typeof input === 'string') {\n throw new BadRequestError(\n \"voice input must be a byte source when request_format is 'voice'\"\n )\n }\n bodyToSend = input\n } else {\n throw new BadRequestError('Unsupported or missing request_format in params')\n }\n\n // For text/FormData, do NOT set Content-Type; fetch will set multipart boundary\n if (query.request_format === 'text') {\n delete mergedHeaders['content-type']\n delete mergedHeaders['Content-Type']\n }\n\n // For voice bytes, allow caller to specify Content-Type; if absent and input is a Blob with a type, use it\n if (query.request_format === 'voice') {\n const hasContentType =\n mergedHeaders['content-type'] !== undefined || mergedHeaders['Content-Type'] !== undefined\n if (!hasContentType && typeof Blob !== 'undefined' && input instanceof Blob && input.type) {\n mergedHeaders['content-type'] = input.type\n }\n }\n\n const headersToSend =\n mergedHeaders as unknown as operations['interact-with-conversation']['parameters']['header']\n\n // Normalize nested object params that must be sent as JSON strings\n const normalizedQuery: InteractQuerySerialized = {\n ...query,\n request_audio_config:\n typeof query.request_audio_config === 'object' && query.request_audio_config !== null\n ? JSON.stringify(query.request_audio_config)\n : (query.request_audio_config ?? undefined),\n }\n\n const resp = await this.c.POST('/v1/{organization}/conversation/{conversation_id}/interact', {\n params: {\n path: { organization: this.orgId, conversation_id: conversationId },\n query: normalizedQuery as unknown as InteractQuery,\n header: headersToSend,\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n body: bodyToSend as any, // FormData/Blob not represented in generated OpenAPI types\n parseAs: 'stream',\n ...(signal && { signal }),\n })\n\n return parseNdjsonStream<\n components['schemas']['conversation__interact_with_conversation__Response']\n >(resp.response)\n }\n\n /** List conversations, optionally filtered by query parameters. */\n async getConversations(\n queryParams?: operations['get-conversations']['parameters']['query'],\n headers?: operations['get-conversations']['parameters']['header']\n ) {\n return extractData(\n this.c.GET('/v1/{organization}/conversation/', {\n params: { path: { organization: this.orgId }, query: queryParams },\n headers,\n })\n )\n }\n\n /** Get messages for a conversation. */\n async getConversationMessages(options: {\n conversationId: ConversationId\n query?: operations['get-conversation-messages']['parameters']['query']\n headers?: operations['get-conversation-messages']['parameters']['header']\n }) {\n const { conversationId, query, headers } = options\n return extractData(\n this.c.GET('/v1/{organization}/conversation/{conversation_id}/messages/', {\n params: {\n path: { organization: this.orgId, conversation_id: conversationId },\n query,\n },\n headers,\n })\n )\n }\n\n /**\n * Finish (close) a conversation.\n * @returns void\n */\n async finishConversation(options: {\n conversationId: ConversationId\n headers?: operations['finish-conversation']['parameters']['header']\n }): Promise<void> {\n const { conversationId, headers } = options\n await this.c.POST('/v1/{organization}/conversation/{conversation_id}/finish/', {\n params: { path: { organization: this.orgId, conversation_id: conversationId } },\n headers,\n // No content is expected; parse as text to access raw Response\n parseAs: 'text',\n })\n return undefined\n }\n\n /** Get recommended responses for an interaction. */\n async recommendResponsesForInteraction(options: {\n conversationId: ConversationId\n interactionId: InteractionId\n body?: { context?: string }\n headers?: operations['recommend-responses-for-interaction']['parameters']['header']\n }) {\n const { conversationId, interactionId, body, headers } = options\n return extractData(\n this.c.POST(\n '/v1/{organization}/conversation/{conversation_id}/interaction/{interaction_id}/recommend_responses',\n {\n params: {\n path: {\n organization: this.orgId,\n conversation_id: conversationId,\n interaction_id: interactionId,\n },\n },\n body,\n headers,\n }\n )\n )\n }\n\n /** Get insights for an interaction. */\n async getInteractionInsights(options: {\n conversationId: ConversationId\n interactionId: InteractionId\n headers?: operations['get-interaction-insights']['parameters']['header']\n }) {\n const { conversationId, interactionId, headers } = options\n return extractData(\n this.c.GET(\n '/v1/{organization}/conversation/{conversation_id}/interaction/{interaction_id}/insights',\n {\n params: {\n path: {\n organization: this.orgId,\n conversation_id: conversationId,\n interaction_id: interactionId,\n },\n },\n headers,\n }\n )\n )\n }\n\n /** Get the audio/media source URL for a message. */\n async getMessageSource(options: {\n conversationId: ConversationId\n messageId: MessageId\n headers?: operations['retrieve-message-source']['parameters']['header']\n }) {\n const { conversationId, messageId, headers } = options\n return extractData(\n this.c.GET('/v1/{organization}/conversation/{conversation_id}/messages/{message_id}/source', {\n params: {\n path: {\n organization: this.orgId,\n conversation_id: conversationId,\n message_id: messageId,\n },\n },\n headers,\n })\n )\n }\n\n /** Generate conversation starter suggestions. */\n async generateConversationStarters(\n body: components['schemas']['conversation__generate_conversation_starter__Request'],\n headers?: operations['generate-conversation-starter']['parameters']['header']\n ) {\n return extractData(\n this.c.POST('/v1/{organization}/conversation/conversation_starter', {\n params: { path: { organization: this.orgId } },\n body,\n headers,\n })\n )\n }\n\n // --- Convenience aliases ---\n\n /** Alias for getConversations. */\n async list(\n queryParams?: operations['get-conversations']['parameters']['query'],\n headers?: operations['get-conversations']['parameters']['header']\n ) {\n return this.getConversations(queryParams, headers)\n }\n\n /** Alias for createConversation. */\n async create(options: Parameters<ConversationResource['createConversation']>[0]) {\n return this.createConversation(options)\n }\n\n /** Alias for interactWithConversation. */\n async interact(options: Parameters<ConversationResource['interactWithConversation']>[0]) {\n return this.interactWithConversation(options)\n }\n\n /** Alias for finishConversation. */\n async finish(options: Parameters<ConversationResource['finishConversation']>[0]) {\n return this.finishConversation(options)\n }\n\n /** Alias for getConversationMessages. */\n async messages(options: Parameters<ConversationResource['getConversationMessages']>[0]) {\n return this.getConversationMessages(options)\n }\n}\n", "import type { AmigoFetch } from '../core/openapi-client'\nimport { extractData } from '../core/utils'\nimport type { components, operations } from '../generated/api-types'\nimport type { OrgId, ServiceId } from '../core/branded-types'\n\n/** Resource for managing services. */\nexport class ServiceResource {\n constructor(\n private c: AmigoFetch,\n private orgId: OrgId\n ) {}\n\n /** List services for the organization. */\n async getServices(\n queryParams?: operations['get-services']['parameters']['query'],\n headers?: operations['get-services']['parameters']['header']\n ) {\n return extractData(\n this.c.GET('/v1/{organization}/service/', {\n params: { path: { organization: this.orgId }, query: queryParams },\n headers,\n })\n )\n }\n\n /** Create a new service. */\n async createService(options: {\n body: components['schemas']['service__create_service__Request']\n headers?: operations['create-service']['parameters']['header']\n }) {\n const { body, headers } = options\n return extractData(\n this.c.POST('/v1/{organization}/service/', {\n params: { path: { organization: this.orgId } },\n body,\n headers,\n })\n )\n }\n\n /** Update a service. */\n async updateService(options: {\n serviceId: ServiceId\n body: components['schemas']['service__update_service__Request']\n headers?: operations['update-service']['parameters']['header']\n }) {\n const { serviceId, body, headers } = options\n return extractData(\n this.c.POST('/v1/{organization}/service/{service_id}/', {\n params: { path: { organization: this.orgId, service_id: serviceId } },\n body,\n headers,\n })\n )\n }\n\n /** Upsert a service version set. */\n async upsertVersionSet(options: {\n serviceId: ServiceId\n versionSetName: string\n body: components['schemas']['service__upsert_service_version_set__Request']\n headers?: operations['upsert-service-version-set']['parameters']['header']\n }) {\n const { serviceId, versionSetName, body, headers } = options\n return extractData(\n this.c.PUT('/v1/{organization}/service/{service_id}/version_sets/{version_set_name}/', {\n params: {\n path: {\n organization: this.orgId,\n service_id: serviceId,\n version_set_name: versionSetName,\n },\n },\n body,\n headers,\n })\n )\n }\n\n /** Delete a service version set. */\n async deleteVersionSet(options: {\n serviceId: ServiceId\n versionSetName: string\n headers?: operations['delete-service-version-set']['parameters']['header']\n }): Promise<void> {\n const { serviceId, versionSetName, headers } = options\n await this.c.DELETE(\n '/v1/{organization}/service/{service_id}/version_sets/{version_set_name}/',\n {\n params: {\n path: {\n organization: this.orgId,\n service_id: serviceId,\n version_set_name: versionSetName,\n },\n },\n headers,\n }\n )\n return undefined\n }\n\n // --- Convenience aliases ---\n\n /** Alias for getServices. */\n async list(\n queryParams?: operations['get-services']['parameters']['query'],\n headers?: operations['get-services']['parameters']['header']\n ) {\n return this.getServices(queryParams, headers)\n }\n\n /** Alias for createService. */\n async create(options: Parameters<ServiceResource['createService']>[0]) {\n return this.createService(options)\n }\n}\n", "import type { AmigoFetch } from '../core/openapi-client'\nimport { extractData } from '../core/utils'\nimport type { components, operations } from '../generated/api-types'\nimport type { OrgId, UserId } from '../core/branded-types'\n\n/** Resource for managing users in the organization. */\nexport class UserResource {\n constructor(\n private c: AmigoFetch,\n private orgId: OrgId\n ) {}\n\n /** List users in the organization. */\n async getUsers(\n queryParams?: operations['get-users']['parameters']['query'],\n headers?: operations['get-users']['parameters']['header']\n ) {\n return extractData(\n this.c.GET('/v1/{organization}/user/', {\n params: { path: { organization: this.orgId }, query: queryParams },\n headers,\n })\n )\n }\n\n /** Create (invite) a new user to the organization. */\n async createUser(\n body: components['schemas']['user__create_invited_user__Request'],\n headers?: operations['create-invited-user']['parameters']['header']\n ) {\n return extractData(\n this.c.POST('/v1/{organization}/user/', {\n params: { path: { organization: this.orgId } },\n body,\n headers,\n })\n )\n }\n\n /** Delete a user by ID. */\n async deleteUser(\n userId: UserId,\n headers?: operations['delete-user']['parameters']['header']\n ): Promise<void> {\n await this.c.DELETE('/v1/{organization}/user/{requested_user_id}', {\n params: { path: { organization: this.orgId, requested_user_id: userId } },\n headers,\n })\n return undefined\n }\n\n /** Update user information. */\n async updateUser(options: {\n userId: UserId\n body: components['schemas']['user__update_user_info__Request']\n headers?: operations['update-user-info']['parameters']['header']\n }): Promise<void> {\n const { userId, body, headers } = options\n await this.c.POST('/v1/{organization}/user/{requested_user_id}', {\n params: { path: { organization: this.orgId, requested_user_id: userId } },\n body,\n headers,\n })\n return undefined\n }\n\n /** Get the user model for a user. */\n async getUserModel(\n userId: UserId,\n headers?: operations['get-user-model']['parameters']['header']\n ) {\n return extractData(\n this.c.GET('/v1/{organization}/user/{user_id}/user_model', {\n params: { path: { organization: this.orgId, user_id: userId } },\n headers,\n })\n )\n }\n\n // --- Convenience aliases ---\n\n /** Alias for getUsers. */\n async list(\n queryParams?: operations['get-users']['parameters']['query'],\n headers?: operations['get-users']['parameters']['header']\n ) {\n return this.getUsers(queryParams, headers)\n }\n\n /** Alias for createUser. */\n async create(\n body: components['schemas']['user__create_invited_user__Request'],\n headers?: operations['create-invited-user']['parameters']['header']\n ) {\n return this.createUser(body, headers)\n }\n\n /** Alias for getUserModel. */\n async getModel(userId: UserId, headers?: operations['get-user-model']['parameters']['header']) {\n return this.getUserModel(userId, headers)\n }\n\n /** Alias for deleteUser. */\n async delete(\n userId: UserId,\n headers?: operations['delete-user']['parameters']['header']\n ): Promise<void> {\n return this.deleteUser(userId, headers)\n }\n\n /** Alias for updateUser. */\n async update(options: Parameters<UserResource['updateUser']>[0]): Promise<void> {\n return this.updateUser(options)\n }\n}\n", "import type { AmigoFetch } from '../core/openapi-client'\nimport { extractData } from '../core/utils'\nimport type { components, operations } from '../generated/api-types'\nimport type { OrgId, AgentId } from '../core/branded-types'\n\n/** Resource for managing agents in the organization. */\nexport class AgentResource {\n constructor(\n private c: AmigoFetch,\n private orgId: OrgId\n ) {}\n\n /** Create a new agent for the organization. */\n async createAgent(options: {\n body: components['schemas']['organization__create_agent__Request']\n headers?: operations['create-agent']['parameters']['header']\n }) {\n const { body, headers } = options\n return extractData(\n this.c.POST('/v1/{organization}/organization/agent', {\n params: { path: { organization: this.orgId } },\n body,\n headers,\n })\n )\n }\n\n /** List agents for the organization. */\n async getAgents(options?: {\n query?: operations['get-agents']['parameters']['query']\n headers?: operations['get-agents']['parameters']['header']\n }) {\n const { query, headers } = options ?? {}\n return extractData(\n this.c.GET('/v1/{organization}/organization/agent', {\n params: { path: { organization: this.orgId }, query },\n headers,\n })\n )\n }\n\n /** Delete an agent by ID. */\n async deleteAgent(options: {\n agentId: AgentId\n headers?: operations['delete-agent']['parameters']['header']\n }): Promise<void> {\n const { agentId, headers } = options\n await this.c.DELETE('/v1/{organization}/organization/agent/{agent_id}/', {\n params: { path: { organization: this.orgId, agent_id: agentId } },\n headers,\n })\n return undefined\n }\n\n /** Create a new version of an agent. */\n async createAgentVersion(options: {\n agentId: AgentId\n body: components['schemas']['organization__create_agent_version__Request']\n query?: operations['create-agent-version']['parameters']['query']\n headers?: operations['create-agent-version']['parameters']['header']\n }) {\n const { agentId, body, query, headers } = options\n return extractData(\n this.c.POST('/v1/{organization}/organization/agent/{agent_id}/', {\n params: { path: { organization: this.orgId, agent_id: agentId }, query },\n body,\n headers,\n })\n )\n }\n\n /** Get versions of an agent. */\n async getAgentVersions(options: {\n agentId: AgentId\n query?: operations['get-agent-versions']['parameters']['query']\n headers?: operations['get-agent-versions']['parameters']['header']\n }) {\n const { agentId, query, headers } = options\n return extractData(\n this.c.GET('/v1/{organization}/organization/agent/{agent_id}/version', {\n params: { path: { organization: this.orgId, agent_id: agentId }, query },\n headers,\n })\n )\n }\n\n // --- Convenience aliases ---\n\n /** Alias for getAgents. */\n async list(options?: Parameters<AgentResource['getAgents']>[0]) {\n return this.getAgents(options)\n }\n\n /** Alias for createAgent. */\n async create(options: Parameters<AgentResource['createAgent']>[0]) {\n return this.createAgent(options)\n }\n\n /** Alias for deleteAgent. */\n async delete(options: Parameters<AgentResource['deleteAgent']>[0]): Promise<void> {\n return this.deleteAgent(options)\n }\n}\n", "import type { AmigoFetch } from '../core/openapi-client'\nimport { extractData } from '../core/utils'\nimport type { components, operations } from '../generated/api-types'\nimport type { OrgId } from '../core/branded-types'\n\n/** Branded type for Context Graph (HSM) IDs. */\ntype ContextGraphId = string\n\n/** Resource for managing context graphs (service hierarchical state machines). */\nexport class ContextGraphResource {\n constructor(\n private c: AmigoFetch,\n private orgId: OrgId\n ) {}\n\n /** Create a new context graph. */\n async createContextGraph(options: {\n body: components['schemas']['organization__create_service_hierarchical_state_machine__Request']\n headers?: operations['create-service-hierarchical-state-machine']['parameters']['header']\n }) {\n const { body, headers } = options\n return extractData(\n this.c.POST('/v1/{organization}/organization/service_hierarchical_state_machine', {\n params: { path: { organization: this.orgId } },\n body,\n headers,\n })\n )\n }\n\n /** List context graphs for the organization. */\n async getContextGraphs(options?: {\n query?: operations['get-service-hierarchical-state-machines']['parameters']['query']\n headers?: operations['get-service-hierarchical-state-machines']['parameters']['header']\n }) {\n const { query, headers } = options ?? {}\n return extractData(\n this.c.GET('/v1/{organization}/organization/service_hierarchical_state_machine', {\n params: { path: { organization: this.orgId }, query },\n headers,\n })\n )\n }\n\n /** Create a new version of a context graph. */\n async createContextGraphVersion(options: {\n contextGraphId: ContextGraphId\n body: components['schemas']['organization__create_service_hierarchical_state_machine_version__Request']\n query?: operations['create-service-hierarchical-state-machine-version']['parameters']['query']\n headers?: operations['create-service-hierarchical-state-machine-version']['parameters']['header']\n }) {\n const { contextGraphId, body, query, headers } = options\n return extractData(\n this.c.POST(\n '/v1/{organization}/organization/service_hierarchical_state_machine/{service_hierarchical_state_machine_id}/',\n {\n params: {\n path: {\n organization: this.orgId,\n service_hierarchical_state_machine_id: contextGraphId,\n },\n query,\n },\n body,\n headers,\n }\n )\n )\n }\n\n /** Delete a context graph. */\n async deleteContextGraph(options: {\n contextGraphId: ContextGraphId\n headers?: operations['delete-service-hierarchical-state-machine']['parameters']['header']\n }): Promise<void> {\n const { contextGraphId, headers } = options\n await this.c.DELETE(\n '/v1/{organization}/organization/service_hierarchical_state_machine/{state_machine_id}/',\n {\n params: {\n path: { organization: this.orgId, state_machine_id: contextGraphId },\n },\n headers,\n }\n )\n return undefined\n }\n\n /** Get versions of a context graph. */\n async getContextGraphVersions(options: {\n contextGraphId: ContextGraphId\n query?: operations['get-service-hierarchical-state-machine-versions']['parameters']['query']\n headers?: operations['get-service-hierarchical-state-machine-versions']['parameters']['header']\n }) {\n const { contextGraphId, query, headers } = options\n return extractData(\n this.c.GET(\n '/v1/{organization}/organization/service_hierarchical_state_machine/{service_hierarchical_state_machine_id}/version',\n {\n params: {\n path: {\n organization: this.orgId,\n service_hierarchical_state_machine_id: contextGraphId,\n },\n query,\n },\n headers,\n }\n )\n )\n }\n\n // --- Convenience aliases ---\n\n /** Alias for getContextGraphs. */\n async list(options?: Parameters<ContextGraphResource['getContextGraphs']>[0]) {\n return this.getContextGraphs(options)\n }\n\n /** Alias for createContextGraph. */\n async create(options: Parameters<ContextGraphResource['createContextGraph']>[0]) {\n return this.createContextGraph(options)\n }\n\n /** Alias for deleteContextGraph. */\n async delete(options: Parameters<ContextGraphResource['deleteContextGraph']>[0]) {\n return this.deleteContextGraph(options)\n }\n}\n", "export type {\n WebhookEvent,\n WebhookEventType,\n WebhookHeaders,\n PostProcessingType,\n ConversationPostProcessingCompleteEvent,\n} from './types'\nexport { parseWebhookEvent, verifySignature, WebhookVerificationError } from './parse'\nexport type { ParseWebhookEventOptions } from './parse'\n", "import { createHmac, timingSafeEqual } from 'node:crypto'\nimport type { WebhookEvent, WebhookEventType } from './types'\n\n/** Options for parsing a webhook event. */\nexport interface ParseWebhookEventOptions {\n /** Raw request body (string or Buffer). */\n payload: string | Buffer\n /** HMAC-SHA256 signature from `x-amigo-request-signature` header. */\n signature?: string\n /** Timestamp from `x-amigo-request-timestamp` header (ms). */\n timestamp?: string\n /** Webhook destination secret for signature verification. */\n secret?: string\n /**\n * Maximum age of the webhook event in milliseconds.\n * Events older than this are rejected to prevent replay attacks.\n * @default 300_000 (5 minutes)\n */\n maxAge?: number\n}\n\n/** Error thrown when webhook verification fails. */\nexport class WebhookVerificationError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'WebhookVerificationError'\n }\n}\n\nconst KNOWN_EVENT_TYPES: Set<WebhookEventType> = new Set(['conversation-post-processing-complete'])\n\n/**\n * Parse and optionally verify a webhook event payload.\n *\n * If `signature`, `timestamp`, and `secret` are all provided, the\n * payload's HMAC-SHA256 signature is verified before parsing.\n *\n * @throws {WebhookVerificationError} If signature verification fails or the event is too old.\n * @returns The typed webhook event.\n */\nexport function parseWebhookEvent(options: ParseWebhookEventOptions): WebhookEvent {\n const { payload, signature, timestamp, secret, maxAge = 300_000 } = options\n\n const body = typeof payload === 'string' ? payload : payload.toString('utf-8')\n\n // Verify signature if all pieces are present\n if (signature && timestamp && secret) {\n verifySignature(body, timestamp, signature, secret)\n\n // Check timestamp freshness\n const eventTime = parseInt(timestamp, 10)\n if (isNaN(eventTime)) {\n throw new WebhookVerificationError('Invalid timestamp')\n }\n if (Date.now() - eventTime > maxAge) {\n throw new WebhookVerificationError(\n `Webhook event is too old (received ${Date.now() - eventTime}ms ago, max ${maxAge}ms)`\n )\n }\n }\n\n let parsed: unknown\n try {\n parsed = JSON.parse(body)\n } catch {\n throw new WebhookVerificationError('Invalid JSON payload')\n }\n\n if (!parsed || typeof parsed !== 'object' || !('type' in parsed)) {\n throw new WebhookVerificationError('Payload missing \"type\" field')\n }\n\n const event = parsed as { type: string }\n if (!KNOWN_EVENT_TYPES.has(event.type as WebhookEventType)) {\n throw new WebhookVerificationError(`Unknown webhook event type: ${event.type}`)\n }\n\n return parsed as WebhookEvent\n}\n\n/**\n * Verify the HMAC-SHA256 signature of a webhook payload.\n *\n * @throws {WebhookVerificationError} If the signature does not match.\n */\nexport function verifySignature(\n body: string,\n timestamp: string,\n signature: string,\n secret: string\n): void {\n const expected = createHmac('sha256', secret).update(`v1:${timestamp}:${body}`).digest('hex')\n\n const sigBuf = Buffer.from(signature, 'utf-8')\n const expectedBuf = Buffer.from(expected, 'utf-8')\n\n if (sigBuf.length !== expectedBuf.length || !timingSafeEqual(sigBuf, expectedBuf)) {\n throw new WebhookVerificationError('Signature verification failed')\n }\n}\n", "/**\n * Rate limit metadata parsed from Amigo API response headers.\n *\n * Headers: X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset\n */\nexport interface RateLimitInfo {\n /** Maximum requests allowed in the current window. */\n limit: number\n /** Requests remaining in the current window. */\n remaining: number\n /** When the current rate-limit window resets (UTC). */\n reset: Date\n}\n\n/**\n * Parse rate limit info from HTTP response headers.\n * Returns `undefined` if the rate limit headers are not present.\n */\nexport function parseRateLimitHeaders(headers: Headers): RateLimitInfo | undefined {\n const limit = headers.get('x-ratelimit-limit')\n const remaining = headers.get('x-ratelimit-remaining')\n const reset = headers.get('x-ratelimit-reset')\n\n if (limit === null || remaining === null || reset === null) {\n return undefined\n }\n\n const limitNum = parseInt(limit, 10)\n const remainingNum = parseInt(remaining, 10)\n const resetEpoch = parseInt(reset, 10)\n\n if (isNaN(limitNum) || isNaN(remainingNum) || isNaN(resetEpoch)) {\n return undefined\n }\n\n return {\n limit: limitNum,\n remaining: remainingNum,\n reset: new Date(resetEpoch * 1000),\n }\n}\n\n/**\n * Callback invoked after each API response with rate limit info.\n * Register via `AmigoSdkConfig.onRateLimit`.\n */\nexport type RateLimitCallback = (info: RateLimitInfo, path: string) => void\n", "declare const __brand: unique symbol\ntype Brand<T, B extends string> = T & { readonly [__brand]: B }\n\n/** A branded string representing a Conversation ID. */\nexport type ConversationId = Brand<string, 'ConversationId'>\n/** A branded string representing a Message ID. */\nexport type MessageId = Brand<string, 'MessageId'>\n/** A branded string representing a User ID. */\nexport type UserId = Brand<string, 'UserId'>\n/** A branded string representing an Organization ID. */\nexport type OrgId = Brand<string, 'OrgId'>\n/** A branded string representing an Interaction ID. */\nexport type InteractionId = Brand<string, 'InteractionId'>\n/** A branded string representing a Service ID. */\nexport type ServiceId = Brand<string, 'ServiceId'>\n/** A branded string representing an Agent ID. */\nexport type AgentId = Brand<string, 'AgentId'>\n/** A branded string representing a Tool ID. */\nexport type ToolId = Brand<string, 'ToolId'>\n/** A branded string representing a Dynamic Behavior Set ID. */\nexport type DynamicBehaviorSetId = Brand<string, 'DynamicBehaviorSetId'>\n/** A branded string representing a Metric ID. */\nexport type MetricId = Brand<string, 'MetricId'>\n/** A branded string representing a Simulation Persona ID. */\nexport type SimulationPersonaId = Brand<string, 'SimulationPersonaId'>\n/** A branded string representing a Simulation Scenario ID. */\nexport type SimulationScenarioId = Brand<string, 'SimulationScenarioId'>\n/** A branded string representing a Simulation Unit Test ID. */\nexport type SimulationUnitTestId = Brand<string, 'SimulationUnitTestId'>\n/** A branded string representing a Simulation Unit Test Set ID. */\nexport type SimulationUnitTestSetId = Brand<string, 'SimulationUnitTestSetId'>\n/** A branded string representing a Webhook Destination ID. */\nexport type WebhookDestinationId = Brand<string, 'WebhookDestinationId'>\n/** A branded string representing a Role ID. */\nexport type RoleId = Brand<string, 'RoleId'>\n/** A branded string representing an API Key ID. */\nexport type ApiKeyId = Brand<string, 'ApiKeyId'>\n\n/** Create a branded ConversationId from a plain string. */\nexport function conversationId(id: string): ConversationId {\n return id as ConversationId\n}\n\n/** Create a branded MessageId from a plain string. */\nexport function messageId(id: string): MessageId {\n return id as MessageId\n}\n\n/** Create a branded UserId from a plain string. */\nexport function userId(id: string): UserId {\n return id as UserId\n}\n\n/** Create a branded OrgId from a plain string. */\nexport function orgId(id: string): OrgId {\n return id as OrgId\n}\n\n/** Create a branded InteractionId from a plain string. */\nexport function interactionId(id: string): InteractionId {\n return id as InteractionId\n}\n\n/** Create a branded ServiceId from a plain string. */\nexport function serviceId(id: string): ServiceId {\n return id as ServiceId\n}\n\n/** Create a branded AgentId from a plain string. */\nexport function agentId(id: string): AgentId {\n return id as AgentId\n}\n\n/** Create a branded ToolId from a plain string. */\nexport function toolId(id: string): ToolId {\n return id as ToolId\n}\n\n/** Create a branded DynamicBehaviorSetId from a plain string. */\nexport function dynamicBehaviorSetId(id: string): DynamicBehaviorSetId {\n return id as DynamicBehaviorSetId\n}\n\n/** Create a branded MetricId from a plain string. */\nexport function metricId(id: string): MetricId {\n return id as MetricId\n}\n\n/** Create a branded SimulationPersonaId from a plain string. */\nexport function simulationPersonaId(id: string): SimulationPersonaId {\n return id as SimulationPersonaId\n}\n\n/** Create a branded SimulationScenarioId from a plain string. */\nexport function simulationScenarioId(id: string): SimulationScenarioId {\n return id as SimulationScenarioId\n}\n\n/** Create a branded SimulationUnitTestId from a plain string. */\nexport function simulationUnitTestId(id: string): SimulationUnitTestId {\n return id as SimulationUnitTestId\n}\n\n/** Create a branded SimulationUnitTestSetId from a plain string. */\nexport function simulationUnitTestSetId(id: string): SimulationUnitTestSetId {\n return id as SimulationUnitTestSetId\n}\n\n/** Create a branded WebhookDestinationId from a plain string. */\nexport function webhookDestinationId(id: string): WebhookDestinationId {\n return id as WebhookDestinationId\n}\n\n/** Create a branded RoleId from a plain string. */\nexport function roleId(id: string): RoleId {\n return id as RoleId\n}\n\n/** Create a branded ApiKeyId from a plain string. */\nexport function apiKeyId(id: string): ApiKeyId {\n return id as ApiKeyId\n}\n", "import { ConfigurationError } from './core/errors'\nimport { createAmigoFetch } from './core/openapi-client'\nimport { OrganizationResource } from './resources/organization'\nimport { ConversationResource } from './resources/conversation'\nimport { ServiceResource } from './resources/services'\nimport { UserResource } from './resources/user'\nimport { AgentResource } from './resources/agent'\nimport { ContextGraphResource } from './resources/context-graph'\nimport type { RetryOptions } from './core/retry'\nimport type { UserId, OrgId } from './core/branded-types'\n\nexport interface AmigoSdkConfig {\n /** API key from Amigo dashboard */\n apiKey: string\n /** API-key ID from Amigo dashboard */\n apiKeyId: string\n /** User ID on whose behalf the request is made */\n userId: UserId\n /** The Organization ID */\n orgId: OrgId\n /** Base URL of the Amigo API */\n baseUrl?: string\n /** Retry configuration for HTTP requests */\n retry?: RetryOptions\n}\n\nconst defaultBaseUrl = 'https://api.amigo.ai'\n\n/**\n * Main client for the Amigo API.\n * Provides access to all API resources (organizations, conversations, services, users).\n */\nexport class AmigoClient {\n readonly organizations: OrganizationResource\n readonly conversations: ConversationResource\n readonly services: ServiceResource\n readonly users: UserResource\n readonly agents: AgentResource\n readonly contextGraphs: ContextGraphResource\n readonly config: AmigoSdkConfig\n\n /** Create a new Amigo client with the given configuration. */\n constructor(config: AmigoSdkConfig) {\n this.config = validateConfig(config)\n\n const api = createAmigoFetch(this.config)\n this.organizations = new OrganizationResource(api, this.config.orgId)\n this.conversations = new ConversationResource(api, this.config.orgId)\n this.services = new ServiceResource(api, this.config.orgId)\n this.users = new UserResource(api, this.config.orgId)\n this.agents = new AgentResource(api, this.config.orgId)\n this.contextGraphs = new ContextGraphResource(api, this.config.orgId)\n }\n}\n\nfunction validateConfig(config: AmigoSdkConfig) {\n if (!config.apiKey) {\n throw new ConfigurationError('API key is required', 'apiKey')\n }\n if (!config.apiKeyId) {\n throw new ConfigurationError('API key ID is required', 'apiKeyId')\n }\n if (!config.userId) {\n throw new ConfigurationError('User ID is required', 'userId')\n }\n if (!config.orgId) {\n throw new ConfigurationError('Organization ID is required', 'orgId')\n }\n if (!config.baseUrl) {\n config.baseUrl = defaultBaseUrl\n }\n return config\n}\n\n// Export error classes individually (not as namespace)\nexport {\n AmigoError,\n BadRequestError,\n AuthenticationError,\n PermissionError,\n NotFoundError,\n ConflictError,\n RateLimitError,\n ServerError,\n ServiceUnavailableError,\n ConfigurationError,\n ValidationError,\n NetworkError,\n ParseError,\n isAmigoError,\n} from './core/errors'\n\n// Export webhook types and helpers\nexport * as webhooks from './webhooks'\n\n// Export rate limit types\nexport type { RateLimitInfo, RateLimitCallback } from './core/rate-limit'\nexport { parseRateLimitHeaders } from './core/rate-limit'\n\n// Export retry and interaction types\nexport type { RetryOptions } from './core/retry'\nexport type { InteractionInput } from './resources/conversation'\n\n// Re-export useful types for consumers\nexport type { components, operations, paths } from './generated/api-types'\n\n// Export branded types and helper functions\nexport type {\n ConversationId,\n MessageId,\n UserId,\n OrgId,\n InteractionId,\n ServiceId,\n AgentId,\n ToolId,\n DynamicBehaviorSetId,\n MetricId,\n SimulationPersonaId,\n SimulationScenarioId,\n SimulationUnitTestId,\n SimulationUnitTestSetId,\n WebhookDestinationId,\n RoleId,\n ApiKeyId,\n} from './core/branded-types'\nexport {\n conversationId,\n messageId,\n userId,\n orgId,\n interactionId,\n serviceId,\n agentId,\n toolId,\n dynamicBehaviorSetId,\n metricId,\n simulationPersonaId,\n simulationScenarioId,\n simulationUnitTestId,\n simulationUnitTestSetId,\n webhookDestinationId,\n roleId,\n apiKeyId,\n} from './core/branded-types'\n"],
5
+ "mappings": "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",
6
6
  "names": ["isNetworkError", "orgId", "orgId", "conversationId", "interactionId", "messageId", "orgId", "serviceId", "orgId", "userId", "orgId", "agentId", "orgId"]
7
7
  }
package/dist/platform.cjs CHANGED
@@ -236,21 +236,50 @@ var AmigoError = class extends Error {
236
236
  };
237
237
  }
238
238
  };
239
+ function isAmigoErrorOptions(value) {
240
+ if (!value || typeof value !== "object") return false;
241
+ const options = value;
242
+ return "statusCode" in options && (typeof options.statusCode === "number" || options.statusCode === void 0) || "errorCode" in options && (typeof options.errorCode === "string" || options.errorCode === void 0) || "context" in options && (typeof options.context === "object" || options.context === void 0);
243
+ }
239
244
  var BadRequestError = class extends AmigoError {
245
+ constructor(message, options) {
246
+ super(message, { ...options, statusCode: options?.statusCode ?? 400 });
247
+ }
240
248
  };
241
249
  var AuthenticationError = class extends AmigoError {
250
+ constructor(message, options) {
251
+ super(message, { ...options, statusCode: options?.statusCode ?? 401 });
252
+ }
242
253
  };
243
254
  var PermissionError = class extends AmigoError {
255
+ constructor(message, options) {
256
+ super(message, { ...options, statusCode: options?.statusCode ?? 403 });
257
+ }
244
258
  };
245
259
  var NotFoundError = class extends AmigoError {
260
+ constructor(message, options) {
261
+ super(message, { ...options, statusCode: options?.statusCode ?? 404 });
262
+ }
246
263
  };
247
264
  var ConflictError = class extends AmigoError {
265
+ constructor(message, options) {
266
+ super(message, { ...options, statusCode: options?.statusCode ?? 409 });
267
+ }
248
268
  };
249
269
  var RateLimitError = class extends AmigoError {
270
+ constructor(message, options) {
271
+ super(message, { ...options, statusCode: options?.statusCode ?? 429 });
272
+ }
250
273
  };
251
274
  var ServerError = class extends AmigoError {
275
+ constructor(message, options) {
276
+ super(message, { ...options, statusCode: options?.statusCode ?? 500 });
277
+ }
252
278
  };
253
279
  var ServiceUnavailableError = class extends ServerError {
280
+ constructor(message, options) {
281
+ super(message, { ...options, statusCode: options?.statusCode ?? 503 });
282
+ }
254
283
  };
255
284
  var ConfigurationError = class extends AmigoError {
256
285
  constructor(message, field) {
@@ -259,9 +288,14 @@ var ConfigurationError = class extends AmigoError {
259
288
  }
260
289
  };
261
290
  var ValidationError = class extends BadRequestError {
262
- constructor(msg, fieldErrors) {
263
- super(msg);
291
+ constructor(msg, optionsOrFieldErrors, fieldErrors) {
292
+ const isErrorOptions = isAmigoErrorOptions(optionsOrFieldErrors);
293
+ super(
294
+ msg,
295
+ isErrorOptions ? { ...optionsOrFieldErrors, statusCode: optionsOrFieldErrors.statusCode ?? 422 } : { statusCode: 422 }
296
+ );
264
297
  this.fieldErrors = fieldErrors;
298
+ this.fieldErrors = isErrorOptions ? fieldErrors : optionsOrFieldErrors;
265
299
  }
266
300
  };
267
301
  var NetworkError = class extends AmigoError {