@synova-cloud/sdk 2.0.0 → 2.0.1

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.
package/dist/index.cjs CHANGED
@@ -96,7 +96,7 @@ var ExecutionSynovaError = class extends SynovaError {
96
96
  };
97
97
 
98
98
  // src/version.ts
99
- var SDK_VERSION = "2.0.0" ;
99
+ var SDK_VERSION = "2.0.1" ;
100
100
 
101
101
  // src/utils/http.ts
102
102
  var HttpClient = class {
@@ -622,7 +622,7 @@ var PromptsResource = class {
622
622
  if (response.object === void 0) {
623
623
  throw new Error("Expected structured response but received undefined");
624
624
  }
625
- return response.object;
625
+ return response;
626
626
  }
627
627
  return response;
628
628
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors/index.ts","../src/version.ts","../src/utils/http.ts","../src/schema/adapters/zod.adapter.ts","../src/schema/adapters/yup.adapter.ts","../src/schema/adapters/joi.adapter.ts","../src/schema/adapters/json-schema.adapter.ts","../src/schema/resolver.ts","../src/resources/prompts.ts","../src/resources/models.ts","../src/resources/files.ts","../src/resources/spans.ts","../src/client.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["import type { IApiErrorResponse, ISynovaExecutionError } from '../types';\n\n/**\n * Base error class for all Synova SDK errors\n */\nexport class SynovaError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'SynovaError';\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * Error thrown when API returns an error response.\n * Base class for all API-related errors.\n */\nexport class ApiSynovaError extends SynovaError {\n readonly code: string;\n readonly httpCode: number;\n readonly requestId: string;\n readonly timestamp: string;\n readonly path?: string;\n readonly method?: string;\n readonly details?: unknown;\n\n constructor(response: IApiErrorResponse) {\n super(response.message);\n this.name = 'ApiSynovaError';\n this.code = response.code;\n this.httpCode = response.httpCode;\n this.requestId = response.requestId;\n this.timestamp = response.timestamp;\n this.path = response.path;\n this.method = response.method;\n this.details = response.details;\n }\n}\n\n/**\n * Error thrown when authentication fails (401)\n */\nexport class AuthSynovaError extends ApiSynovaError {\n constructor(response: IApiErrorResponse) {\n super(response);\n this.name = 'AuthSynovaError';\n }\n}\n\n/**\n * Error thrown when resource is not found (404)\n */\nexport class NotFoundSynovaError extends ApiSynovaError {\n constructor(response: IApiErrorResponse) {\n super(response);\n this.name = 'NotFoundSynovaError';\n }\n}\n\n/**\n * Error thrown when rate limit is exceeded (429)\n */\nexport class RateLimitSynovaError extends ApiSynovaError {\n readonly retryAfterMs?: number;\n\n constructor(response: IApiErrorResponse, retryAfterMs?: number) {\n super(response);\n this.name = 'RateLimitSynovaError';\n this.retryAfterMs = retryAfterMs;\n }\n}\n\n/**\n * Error thrown when server returns 5xx error\n */\nexport class ServerSynovaError extends ApiSynovaError {\n readonly retryable: boolean = true;\n\n constructor(response: IApiErrorResponse) {\n super(response);\n this.name = 'ServerSynovaError';\n }\n}\n\n/**\n * Error thrown when request times out (client-side)\n */\nexport class TimeoutSynovaError extends SynovaError {\n readonly timeoutMs: number;\n\n constructor(timeoutMs: number) {\n super(`Request timed out after ${timeoutMs}ms`);\n this.name = 'TimeoutSynovaError';\n this.timeoutMs = timeoutMs;\n }\n}\n\n/**\n * Error thrown when network request fails (client-side)\n */\nexport class NetworkSynovaError extends SynovaError {\n readonly cause?: Error;\n\n constructor(message: string, cause?: Error) {\n super(message);\n this.name = 'NetworkSynovaError';\n this.cause = cause;\n }\n}\n\n/**\n * Error thrown when LLM execution fails (returned in response with type='error')\n */\nexport class ExecutionSynovaError extends SynovaError {\n readonly code: string;\n readonly provider?: string;\n readonly retryable: boolean;\n readonly retryAfterMs?: number;\n readonly details?: ISynovaExecutionError['details'];\n\n constructor(error: ISynovaExecutionError) {\n super(error.message);\n this.name = 'ExecutionSynovaError';\n this.code = error.code;\n this.provider = error.provider;\n this.retryable = error.retryable;\n this.retryAfterMs = error.retryAfterMs;\n this.details = error.details;\n }\n}\n","declare const __SDK_VERSION__: string;\n\nexport const SDK_VERSION = typeof __SDK_VERSION__ !== 'undefined' ? __SDK_VERSION__ : 'dev';\n","import type { IApiErrorResponse, ISynovaLogger, TSynovaRetryStrategy } from '../types';\nimport {\n ApiSynovaError,\n AuthSynovaError,\n NetworkSynovaError,\n NotFoundSynovaError,\n RateLimitSynovaError,\n ServerSynovaError,\n TimeoutSynovaError,\n} from '../errors';\nimport { SDK_VERSION } from '../version';\n\nexport interface IRetryOptions {\n maxRetries: number;\n strategy: TSynovaRetryStrategy;\n initialDelayMs: number;\n maxDelayMs: number;\n backoffMultiplier: number;\n}\n\nexport interface IHttpClientConfig {\n baseUrl: string;\n apiKey: string;\n timeout: number;\n retry: IRetryOptions;\n debug: boolean;\n logger: ISynovaLogger;\n}\n\nexport interface IRequestOptions {\n method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n path: string;\n body?: unknown;\n query?: Record<string, string | undefined>;\n}\n\nexport interface IUploadOptions {\n path: string;\n formData: FormData;\n}\n\nexport class HttpClient {\n private readonly config: IHttpClientConfig;\n\n constructor(config: IHttpClientConfig) {\n this.config = config;\n }\n\n async request<T>(options: IRequestOptions): Promise<T> {\n const url = this.buildUrl(options.path, options.query);\n const { maxRetries } = this.config.retry;\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n if (attempt > 0) {\n const delay = this.calculateRetryDelay(attempt, lastError);\n this.log(\n `Retry attempt ${attempt}/${maxRetries} after ${delay}ms (strategy: ${this.config.retry.strategy})`,\n );\n await this.sleep(delay);\n }\n\n return await this.makeRequest<T>(url, options);\n } catch (error) {\n lastError = error as Error;\n\n if (!this.isRetryable(error)) {\n throw error;\n }\n\n if (attempt === maxRetries) {\n throw error;\n }\n\n this.log(`Request failed, will retry: ${(error as Error).message}`);\n }\n }\n\n throw lastError;\n }\n\n async upload<T>(options: IUploadOptions): Promise<T> {\n const url = this.buildUrl(options.path);\n const { maxRetries } = this.config.retry;\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n if (attempt > 0) {\n const delay = this.calculateRetryDelay(attempt, lastError);\n this.log(\n `Retry attempt ${attempt}/${maxRetries} after ${delay}ms (strategy: ${this.config.retry.strategy})`,\n );\n await this.sleep(delay);\n }\n\n return await this.makeUploadRequest<T>(url, options.formData);\n } catch (error) {\n lastError = error as Error;\n\n if (!this.isRetryable(error)) {\n throw error;\n }\n\n if (attempt === maxRetries) {\n throw error;\n }\n\n this.log(`Upload failed, will retry: ${(error as Error).message}`);\n }\n }\n\n throw lastError;\n }\n\n private async makeRequest<T>(url: string, options: IRequestOptions): Promise<T> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\n\n this.log(`${options.method} ${url}`);\n\n try {\n const response = await fetch(url, {\n method: options.method,\n headers: {\n Authorization: `Bearer ${this.config.apiKey}`,\n 'Content-Type': 'application/json',\n 'User-Agent': `synova-cloud-sdk-node/${SDK_VERSION}`,\n },\n body: options.body ? JSON.stringify(options.body) : undefined,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n await this.handleErrorResponse(response);\n }\n\n const data = (await response.json()) as T;\n this.log(`Response: ${response.status}`);\n return data;\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof Error && error.name === 'AbortError') {\n throw new TimeoutSynovaError(this.config.timeout);\n }\n\n if (\n error instanceof ApiSynovaError ||\n error instanceof AuthSynovaError ||\n error instanceof NotFoundSynovaError ||\n error instanceof RateLimitSynovaError ||\n error instanceof ServerSynovaError\n ) {\n throw error;\n }\n\n throw new NetworkSynovaError(\n `Network request failed: ${(error as Error).message}`,\n error as Error,\n );\n }\n }\n\n private async makeUploadRequest<T>(url: string, formData: FormData): Promise<T> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\n\n this.log(`POST (upload) ${url}`);\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${this.config.apiKey}`,\n 'User-Agent': `synova-cloud-sdk-node/${SDK_VERSION}`,\n // Note: Content-Type is not set for FormData - browser/node sets it with boundary\n },\n body: formData,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n await this.handleErrorResponse(response);\n }\n\n const data = (await response.json()) as T;\n this.log(`Response: ${response.status}`);\n return data;\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof Error && error.name === 'AbortError') {\n throw new TimeoutSynovaError(this.config.timeout);\n }\n\n if (\n error instanceof ApiSynovaError ||\n error instanceof AuthSynovaError ||\n error instanceof NotFoundSynovaError ||\n error instanceof RateLimitSynovaError ||\n error instanceof ServerSynovaError\n ) {\n throw error;\n }\n\n throw new NetworkSynovaError(\n `Upload request failed: ${(error as Error).message}`,\n error as Error,\n );\n }\n }\n\n private async handleErrorResponse(response: Response): Promise<never> {\n const status = response.status;\n\n // Try to parse error body\n let errorBody: IApiErrorResponse | null = null;\n try {\n errorBody = (await response.json()) as IApiErrorResponse;\n } catch {\n // Ignore JSON parse errors\n }\n\n // Create default error body if parsing failed\n const defaultErrorBody: IApiErrorResponse = {\n code: 'UNKNOWN_ERROR',\n httpCode: status,\n message: errorBody?.message || `HTTP ${status}: ${response.statusText}`,\n requestId: errorBody?.requestId || 'unknown',\n timestamp: errorBody?.timestamp || new Date().toISOString(),\n path: errorBody?.path,\n method: errorBody?.method,\n details: errorBody?.details,\n };\n\n const body = errorBody || defaultErrorBody;\n\n if (status === 401) {\n throw new AuthSynovaError(body);\n }\n\n if (status === 404) {\n throw new NotFoundSynovaError(body);\n }\n\n if (status === 429) {\n const retryAfter = response.headers.get('Retry-After');\n const retryAfterMs = retryAfter ? parseInt(retryAfter, 10) * 1000 : undefined;\n throw new RateLimitSynovaError(body, retryAfterMs);\n }\n\n if (status >= 500) {\n throw new ServerSynovaError(body);\n }\n\n throw new ApiSynovaError(body);\n }\n\n private buildUrl(path: string, query?: Record<string, string | undefined>): string {\n const url = new URL(path, this.config.baseUrl);\n\n if (query) {\n for (const [key, value] of Object.entries(query)) {\n if (value !== undefined) {\n url.searchParams.set(key, value);\n }\n }\n }\n\n return url.toString();\n }\n\n private isRetryable(error: unknown): boolean {\n if (error instanceof RateLimitSynovaError) return true;\n if (error instanceof ServerSynovaError) return true;\n if (error instanceof NetworkSynovaError) return true;\n if (error instanceof TimeoutSynovaError) return true;\n return false;\n }\n\n private calculateRetryDelay(attempt: number, error: Error | null): number {\n const { strategy, initialDelayMs, maxDelayMs, backoffMultiplier } = this.config.retry;\n\n // Use Retry-After header if available (takes priority)\n if (error instanceof RateLimitSynovaError && error.retryAfterMs) {\n return Math.min(error.retryAfterMs, maxDelayMs);\n }\n\n let baseDelay: number;\n\n if (strategy === 'linear') {\n // Linear: initialDelay * attempt (1000, 2000, 3000, ...)\n baseDelay = initialDelayMs * attempt;\n } else {\n // Exponential: initialDelay * multiplier^(attempt-1) (1000, 2000, 4000, ...)\n baseDelay = initialDelayMs * Math.pow(backoffMultiplier, attempt - 1);\n }\n\n // Add jitter (±10%) to prevent thundering herd\n const jitter = baseDelay * 0.1 * (Math.random() * 2 - 1);\n const delay = baseDelay + jitter;\n\n return Math.min(Math.max(delay, 0), maxDelayMs);\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n private log(message: string): void {\n if (this.config.debug) {\n this.config.logger.debug(`[Synova SDK] ${message}`);\n }\n }\n}\n","import type { IJsonSchema } from '../types';\nimport type { ISchemaAdapter } from './base.adapter';\n\n/**\n * Zod schema type definition\n */\ninterface IZodSchema {\n _def: { typeName: string };\n safeParse: (data: unknown) => { success: boolean };\n}\n\n/**\n * Adapter for Zod schemas.\n * Uses zod-to-json-schema for conversion.\n */\nexport class ZodAdapter implements ISchemaAdapter<IZodSchema> {\n canHandle(schema: unknown): schema is IZodSchema {\n if (typeof schema !== 'object' || schema === null) return false;\n\n const s = schema as Partial<IZodSchema>;\n return (\n typeof s._def === 'object' &&\n s._def !== null &&\n typeof s._def.typeName === 'string' &&\n s._def.typeName.startsWith('Zod') &&\n typeof s.safeParse === 'function'\n );\n }\n\n toJsonSchema(schema: IZodSchema): IJsonSchema {\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { zodToJsonSchema } = require('zod-to-json-schema');\n const result = { ...zodToJsonSchema(schema, { $refStrategy: 'none' }) };\n delete result.$schema;\n return result as IJsonSchema;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'MODULE_NOT_FOUND') {\n throw new Error(\n 'zod-to-json-schema is required to convert Zod schemas. Install it with: npm install zod-to-json-schema',\n );\n }\n throw new Error(`Failed to convert Zod schema: ${(error as Error).message}`);\n }\n }\n}\n","import type { IJsonSchema } from '../types';\nimport type { ISchemaAdapter } from './base.adapter';\n\n/**\n * Yup schema type definition\n */\ninterface IYupSchema {\n __isYupSchema__: boolean;\n}\n\n/**\n * Adapter for Yup schemas.\n * Uses @sodaru/yup-to-json-schema for conversion.\n *\n * @see https://github.com/jquense/yup/blob/master/src/schema.ts\n */\nexport class YupAdapter implements ISchemaAdapter<IYupSchema> {\n canHandle(schema: unknown): schema is IYupSchema {\n if (typeof schema !== 'object' || schema === null) return false;\n return (schema as IYupSchema).__isYupSchema__ === true;\n }\n\n toJsonSchema(schema: IYupSchema): IJsonSchema {\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { convertSchema } = require('@sodaru/yup-to-json-schema');\n return convertSchema(schema) as IJsonSchema;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'MODULE_NOT_FOUND') {\n throw new Error(\n '@sodaru/yup-to-json-schema is required to convert Yup schemas. Install it with: npm install @sodaru/yup-to-json-schema',\n );\n }\n throw new Error(`Failed to convert Yup schema: ${(error as Error).message}`);\n }\n }\n}\n","import type { IJsonSchema } from '../types';\nimport type { ISchemaAdapter } from './base.adapter';\n\n/**\n * Joi schema type definition\n */\ninterface IJoiSchema {\n describe: () => { type: string };\n}\n\n/**\n * Adapter for Joi schemas.\n * Uses joi-to-json for conversion.\n *\n * @see https://joi.dev/api/#isschemaschema-options\n */\nexport class JoiAdapter implements ISchemaAdapter<IJoiSchema> {\n canHandle(schema: unknown): schema is IJoiSchema {\n if (typeof schema !== 'object' || schema === null) return false;\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { isSchema } = require('joi');\n return isSchema(schema);\n } catch {\n // Joi not installed\n return false;\n }\n }\n\n toJsonSchema(schema: IJoiSchema): IJsonSchema {\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const joiToJson = require('joi-to-json');\n return joiToJson(schema) as IJsonSchema;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'MODULE_NOT_FOUND') {\n throw new Error(\n 'joi-to-json is required to convert Joi schemas. Install it with: npm install joi-to-json',\n );\n }\n throw new Error(`Failed to convert Joi schema: ${(error as Error).message}`);\n }\n }\n}\n","import type { IJsonSchema } from '../types';\nimport type { ISchemaAdapter } from './base.adapter';\n\n/**\n * Passthrough adapter for raw JSON Schema objects.\n * Transforms `nullable: true` to `type: [\"...\", \"null\"]` recursively.\n */\nexport class JsonSchemaAdapter implements ISchemaAdapter<IJsonSchema> {\n private static readonly VALID_JSON_SCHEMA_TYPES = [\n 'string',\n 'number',\n 'integer',\n 'boolean',\n 'object',\n 'array',\n 'null',\n ];\n\n canHandle(schema: unknown): schema is IJsonSchema {\n if (typeof schema !== 'object' || schema === null) {\n return false;\n }\n\n const obj = schema as Record<string, unknown>;\n\n // Check for valid JSON Schema type\n if ('type' in obj) {\n const type = obj.type;\n if (typeof type === 'string' && JsonSchemaAdapter.VALID_JSON_SCHEMA_TYPES.includes(type)) {\n return true;\n }\n if (\n Array.isArray(type) &&\n type.every((t) => JsonSchemaAdapter.VALID_JSON_SCHEMA_TYPES.includes(t))\n ) {\n return true;\n }\n }\n\n // Properties must be an object (not array or primitive)\n if (\n 'properties' in obj &&\n typeof obj.properties === 'object' &&\n obj.properties !== null &&\n !Array.isArray(obj.properties)\n ) {\n return true;\n }\n\n // Items must be an object (schema for array items)\n if (\n 'items' in obj &&\n typeof obj.items === 'object' &&\n obj.items !== null &&\n !Array.isArray(obj.items)\n ) {\n return true;\n }\n\n // Composition keywords with array values\n if ('anyOf' in obj && Array.isArray(obj.anyOf)) return true;\n if ('oneOf' in obj && Array.isArray(obj.oneOf)) return true;\n if ('allOf' in obj && Array.isArray(obj.allOf)) return true;\n\n // Enum with array values\n if ('enum' in obj && Array.isArray(obj.enum)) return true;\n\n return false;\n }\n\n toJsonSchema(schema: IJsonSchema): IJsonSchema {\n return this.transformNullable(schema);\n }\n\n /**\n * Recursively transform `nullable: true` to `type: [\"...\", \"null\"]`\n */\n private transformNullable(schema: IJsonSchema): IJsonSchema {\n const result: IJsonSchema = { ...schema };\n const schemaWithNullable = schema as IJsonSchema & { nullable?: boolean };\n\n // Handle nullable transformation\n if (schemaWithNullable.nullable === true && result.type) {\n if (typeof result.type === 'string') {\n result.type = [result.type, 'null'];\n } else if (Array.isArray(result.type) && !result.type.includes('null')) {\n result.type = [...result.type, 'null'];\n }\n // Remove nullable property (it's not standard JSON Schema)\n delete (result as IJsonSchema & { nullable?: boolean }).nullable;\n }\n\n // Recursively transform nested schemas\n if (result.properties) {\n result.properties = Object.fromEntries(\n Object.entries(result.properties).map(([key, value]) => [\n key,\n this.transformNullable(value),\n ]),\n );\n }\n\n if (result.items) {\n result.items = this.transformNullable(result.items);\n }\n\n if (result.additionalProperties && typeof result.additionalProperties === 'object') {\n result.additionalProperties = this.transformNullable(result.additionalProperties);\n }\n\n if (result.allOf) {\n result.allOf = result.allOf.map((s) => this.transformNullable(s));\n }\n\n if (result.anyOf) {\n result.anyOf = result.anyOf.map((s) => this.transformNullable(s));\n }\n\n if (result.oneOf) {\n result.oneOf = result.oneOf.map((s) => this.transformNullable(s));\n }\n\n if (result.not) {\n result.not = this.transformNullable(result.not);\n }\n\n return result;\n }\n}\n","import type { IJsonSchema } from './types';\nimport type { ISchemaAdapter } from './adapters/base.adapter';\nimport { ZodAdapter } from './adapters/zod.adapter';\nimport { YupAdapter } from './adapters/yup.adapter';\nimport { JoiAdapter } from './adapters/joi.adapter';\nimport { JsonSchemaAdapter } from './adapters/json-schema.adapter';\n\n/**\n * Schema type identifier\n */\nexport type TSchemaType = 'zod' | 'yup' | 'joi' | 'json-schema' | 'unknown';\n\n/**\n * Zod-like schema interface\n */\ninterface IZodLike {\n _def: { typeName: string };\n safeParse: unknown;\n}\n\n/**\n * Yup-like schema interface\n */\ninterface IYupLike {\n __isYupSchema__: true;\n}\n\n/**\n * Joi-like schema interface\n */\ninterface IJoiLike {\n describe: () => unknown;\n}\n\n/**\n * Supported schema input types.\n * Provides better type hints while maintaining flexibility.\n */\nexport type TSchemaInput =\n | IJsonSchema // Raw JSON Schema\n | IZodLike // Zod-like\n | IYupLike // Yup-like\n | IJoiLike // Joi-like\n | unknown; // Fallback for custom adapters\n\n/**\n * Schema resolver that converts various schema libraries to JSON Schema.\n * Supports Zod, Yup, Joi, and raw JSON Schema.\n */\nexport class SchemaResolver {\n private static adapters: ISchemaAdapter[] = [\n // Order matters: Zod → Yup → Joi → JsonSchema (fallback)\n new ZodAdapter(),\n new YupAdapter(),\n new JoiAdapter(),\n new JsonSchemaAdapter(),\n ];\n\n /**\n * Register a custom adapter.\n *\n * @param adapter - The adapter to register\n * @param position - Where to insert: 'first' adds at the beginning,\n * 'last' adds before JsonSchemaAdapter (fallback)\n *\n * @example\n * ```typescript\n * SchemaResolver.registerAdapter(new MyCustomAdapter(), 'first');\n * ```\n */\n static registerAdapter(adapter: ISchemaAdapter, position: 'first' | 'last' = 'first'): void {\n if (position === 'first') {\n this.adapters.unshift(adapter);\n } else {\n // Insert before JsonSchemaAdapter (last position)\n this.adapters.splice(-1, 0, adapter);\n }\n }\n\n /**\n * Reset adapters to default configuration.\n * Removes all custom adapters.\n */\n static resetAdapters(): void {\n this.adapters = [new ZodAdapter(), new YupAdapter(), new JoiAdapter(), new JsonSchemaAdapter()];\n }\n\n /**\n * Resolve a schema input to JSON Schema format.\n *\n * @param schema - Schema from Zod, Yup, Joi, or raw JSON Schema\n * @returns JSON Schema representation\n * @throws Error if schema type is not supported\n *\n * @example\n * ```typescript\n * // Zod\n * const zodSchema = z.object({ title: z.string() });\n * const jsonSchema = SchemaResolver.resolve(zodSchema);\n *\n * // Yup\n * const yupSchema = yup.object({ title: yup.string().required() });\n * const jsonSchema = SchemaResolver.resolve(yupSchema);\n *\n * // Joi\n * const joiSchema = Joi.object({ title: Joi.string() });\n * const jsonSchema = SchemaResolver.resolve(joiSchema);\n *\n * // Raw JSON Schema (passthrough)\n * const rawSchema = { type: 'object', properties: { title: { type: 'string' } } };\n * const jsonSchema = SchemaResolver.resolve(rawSchema);\n * ```\n */\n static resolve(schema: TSchemaInput): IJsonSchema {\n for (const adapter of this.adapters) {\n if (adapter.canHandle(schema)) {\n return adapter.toJsonSchema(schema);\n }\n }\n\n throw new Error(\n 'Unsupported schema type. Supported types: Zod, Yup, Joi, or raw JSON Schema object.',\n );\n }\n\n /**\n * Check if a schema is supported.\n *\n * @param schema - Schema to check\n * @returns true if the schema is supported\n */\n static isSupported(schema: unknown): boolean {\n return this.adapters.some((adapter) => adapter.canHandle(schema));\n }\n\n /**\n * Get the type of a schema.\n *\n * @param schema - Schema to identify\n * @returns Schema type identifier\n */\n static getSchemaType(schema: unknown): TSchemaType {\n const adapters = this.adapters;\n\n if (adapters[0].canHandle(schema)) {\n return 'zod';\n }\n if (adapters[1].canHandle(schema)) {\n return 'yup';\n }\n if (adapters[2].canHandle(schema)) {\n return 'joi';\n }\n if (adapters[3].canHandle(schema)) {\n return 'json-schema';\n }\n\n return 'unknown';\n }\n}\n","import type { HttpClient } from '../utils/http';\nimport type {\n ISynovaPrompt,\n ISynovaGetPromptOptions,\n ISynovaExecuteOptions,\n ISynovaExecuteResponse,\n} from '../types';\nimport { SchemaResolver } from '../schema/resolver';\nimport { ExecutionSynovaError } from '../errors';\n\nexport class PromptsResource {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Get a prompt by ID (returns version with 'latest' tag)\n */\n async get(promptId: string, options?: ISynovaGetPromptOptions): Promise<ISynovaPrompt> {\n if (options?.version) {\n return this.http.request<ISynovaPrompt>({\n method: 'GET',\n path: `/api/v1/prompts/${promptId}/versions/${options.version}`,\n });\n }\n\n const tag = options?.tag || 'latest';\n if (tag === 'latest') {\n return this.http.request<ISynovaPrompt>({\n method: 'GET',\n path: `/api/v1/prompts/${promptId}`,\n });\n }\n\n return this.http.request<ISynovaPrompt>({\n method: 'GET',\n path: `/api/v1/prompts/${promptId}/tags/${tag}`,\n });\n }\n\n /**\n * Execute a prompt with typed response using responseSchema\n *\n * @example\n * ```ts\n * // With Zod schema\n * const schema = z.object({ title: z.string() });\n * const result = await client.prompts.execute<z.infer<typeof schema>>('prm_abc123', {\n * provider: 'openai',\n * model: 'gpt-4o',\n * responseSchema: schema,\n * });\n * console.log(result.title); // Typed as string\n *\n * // With raw JSON Schema\n * const result = await client.prompts.execute<{ title: string }>('prm_abc123', {\n * provider: 'openai',\n * model: 'gpt-4o',\n * responseSchema: { type: 'object', properties: { title: { type: 'string' } } },\n * });\n * ```\n */\n execute<T>(\n promptId: string,\n options: ISynovaExecuteOptions & {\n responseSchema: NonNullable<ISynovaExecuteOptions['responseSchema']>;\n },\n ): Promise<T>;\n\n /**\n * Execute a prompt\n *\n * @example\n * ```ts\n * // Without responseSchema - returns ISynovaExecuteResponse\n * const result = await client.prompts.execute('prm_abc123', {\n * provider: 'openai',\n * model: 'gpt-4o',\n * });\n * if (result.type === 'message') {\n * console.log(result.content);\n * }\n * ```\n */\n execute(promptId: string, options: ISynovaExecuteOptions): Promise<ISynovaExecuteResponse>;\n\n async execute<T>(\n promptId: string,\n options: ISynovaExecuteOptions,\n ): Promise<T | ISynovaExecuteResponse> {\n const body: Record<string, unknown> = {\n provider: options.provider,\n model: options.model,\n };\n\n if (options.apiKey !== undefined) body.apiKey = options.apiKey;\n if (options.azureEndpoint !== undefined) body.azureEndpoint = options.azureEndpoint;\n if (options.variables !== undefined) body.variables = options.variables;\n if (options.messages !== undefined) body.messages = options.messages;\n if (options.tag !== undefined) body.tag = options.tag;\n if (options.version !== undefined) body.version = options.version;\n if (options.metadata !== undefined) body.metadata = options.metadata;\n if (options.parameters !== undefined) body.parameters = options.parameters;\n if (options.sessionId !== undefined) body.sessionId = options.sessionId;\n\n // Resolve schema if provided (supports Zod, Yup, Joi, or raw JSON Schema)\n if (options.responseSchema !== undefined) {\n body.responseSchema = SchemaResolver.resolve(options.responseSchema);\n }\n\n const response = await this.http.request<ISynovaExecuteResponse>({\n method: 'POST',\n path: `/api/v1/prompts/${promptId}/run`,\n body,\n });\n\n // Always throw on LLM error\n if (response.type === 'error' && response.error) {\n throw new ExecutionSynovaError(response.error);\n }\n\n // Return typed object when responseSchema is provided\n if (options.responseSchema !== undefined) {\n if (response.object === undefined) {\n throw new Error('Expected structured response but received undefined');\n }\n return response.object as T;\n }\n\n return response;\n }\n\n /**\n * Execute a prompt by tag with typed response\n */\n executeByTag<T>(\n promptId: string,\n tag: string,\n options: ISynovaExecuteOptions & {\n responseSchema: NonNullable<ISynovaExecuteOptions['responseSchema']>;\n },\n ): Promise<T>;\n\n /**\n * Execute a prompt by tag\n */\n executeByTag(\n promptId: string,\n tag: string,\n options: ISynovaExecuteOptions,\n ): Promise<ISynovaExecuteResponse>;\n\n async executeByTag<T>(\n promptId: string,\n tag: string,\n options: ISynovaExecuteOptions,\n ): Promise<T | ISynovaExecuteResponse> {\n return this.execute(promptId, { ...options, tag });\n }\n\n /**\n * Execute a prompt by version with typed response\n */\n executeByVersion<T>(\n promptId: string,\n version: string,\n options: ISynovaExecuteOptions & {\n responseSchema: NonNullable<ISynovaExecuteOptions['responseSchema']>;\n },\n ): Promise<T>;\n\n /**\n * Execute a prompt by version\n */\n executeByVersion(\n promptId: string,\n version: string,\n options: ISynovaExecuteOptions,\n ): Promise<ISynovaExecuteResponse>;\n\n async executeByVersion<T>(\n promptId: string,\n version: string,\n options: ISynovaExecuteOptions,\n ): Promise<T | ISynovaExecuteResponse> {\n return this.execute(promptId, { ...options, version });\n }\n}\n","import type { HttpClient } from '../utils/http';\nimport type { ISynovaModel, ISynovaModelsResponse, ISynovaListModelsOptions } from '../types';\n\ninterface IProviderModelsResponse {\n models: ISynovaModel[];\n}\n\nexport class ModelsResource {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * List all available models\n *\n * @param options - Optional filters\n * @returns List of providers with their models\n *\n * @example\n * ```ts\n * // Get all models\n * const { providers } = await client.models.list();\n *\n * // Filter by type\n * const imageModels = await client.models.list({ type: 'image' });\n *\n * // Filter by capability\n * const functionCallingModels = await client.models.list({\n * capability: 'function_calling',\n * });\n *\n * // Filter by provider\n * const openaiModels = await client.models.list({ provider: 'openai' });\n * ```\n */\n async list(options?: ISynovaListModelsOptions): Promise<ISynovaModelsResponse> {\n return this.http.request<ISynovaModelsResponse>({\n method: 'GET',\n path: '/api/v1/models',\n query: {\n type: options?.type,\n capability: options?.capability,\n provider: options?.provider,\n },\n });\n }\n\n /**\n * Get models for a specific provider\n *\n * @param provider - Provider ID (e.g., 'openai', 'anthropic')\n * @returns List of models for the provider\n *\n * @example\n * ```ts\n * const { models } = await client.models.getByProvider('openai');\n * ```\n */\n async getByProvider(provider: string): Promise<ISynovaModel[]> {\n const response = await this.http.request<IProviderModelsResponse>({\n method: 'GET',\n path: `/api/v1/models/${provider}`,\n });\n return response.models;\n }\n\n /**\n * Get a specific model\n *\n * @param provider - Provider ID\n * @param model - Model ID\n * @returns Model details\n *\n * @example\n * ```ts\n * const model = await client.models.get('openai', 'gpt-4o');\n * console.log(model.capabilities);\n * console.log(model.limits);\n * ```\n */\n async get(provider: string, model: string): Promise<ISynovaModel> {\n return this.http.request<ISynovaModel>({\n method: 'GET',\n path: `/api/v1/models/${provider}/${model}`,\n });\n }\n}\n","import type { HttpClient } from '../utils/http';\nimport type { ISynovaUploadResponse, ISynovaUploadOptions } from '../types';\n\nexport class FilesResource {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Upload files for use in prompt execution\n *\n * @param files - Array of File or Blob objects to upload\n * @param options - Upload options including projectId\n * @returns Upload response with file metadata\n *\n * @example\n * ```ts\n * // Upload files\n * const result = await client.files.upload(\n * [file1, file2],\n * { projectId: 'prj_abc123' }\n * );\n *\n * console.log('Uploaded files:', result.data);\n *\n * // Use uploaded file in prompt execution\n * const response = await client.prompts.execute('prm_abc123', {\n * provider: 'openai',\n * model: 'gpt-4o',\n * messages: [\n * {\n * role: 'user',\n * content: 'Describe this image',\n * files: [{ fileId: result.data[0].id }],\n * },\n * ],\n * });\n * ```\n */\n async upload(\n files: (File | Blob)[],\n options: ISynovaUploadOptions,\n ): Promise<ISynovaUploadResponse> {\n const formData = new FormData();\n\n for (const file of files) {\n formData.append('files', file);\n }\n\n formData.append('projectId', options.projectId);\n\n return this.http.upload<ISynovaUploadResponse>({\n path: '/api/v1/files/upload',\n formData,\n });\n }\n}\n","import type { HttpClient } from '../utils/http';\nimport type {\n ISynovaSpan,\n ISynovaCreateSpanOptions,\n ISynovaEndSpanOptions,\n TSynovaSpanType,\n} from '../types';\n\n/**\n * Options for wrapping a function with span tracking\n */\nexport interface ISynovaWrapOptions {\n /** Trace ID */\n traceId: string;\n /** Span type */\n type: TSynovaSpanType;\n /** Span name */\n name?: string;\n /** Parent span ID */\n parentSpanId?: string;\n /** Custom metadata */\n metadata?: Record<string, string>;\n}\n\n/**\n * Options for wrapping a tool function\n */\nexport interface ISynovaWrapToolOptions {\n /** Trace ID */\n traceId: string;\n /** Tool name */\n toolName: string;\n /** Parent span ID */\n parentSpanId?: string;\n /** Custom metadata */\n metadata?: Record<string, string>;\n}\n\n/**\n * Spans resource for observability\n *\n * @example\n * ```ts\n * // Manual: create and end span\n * const span = await client.spans.create('trc_123', {\n * type: 'tool',\n * toolName: 'fetch_weather',\n * toolArguments: { city: 'NYC' },\n * });\n * const result = await fetchWeather('NYC');\n * await client.spans.end(span.id, { status: 'completed', toolResult: result });\n *\n * // Wrapper: automatic span lifecycle\n * const weather = await client.spans.wrapTool(\n * { traceId: 'trc_123', toolName: 'fetch_weather' },\n * { city: 'NYC' },\n * (args) => fetchWeather(args.city),\n * );\n *\n * // Generic wrapper for custom spans\n * const result = await client.spans.wrap(\n * { traceId: 'trc_123', type: 'custom', name: 'validate' },\n * { input: data },\n * async () => validateData(data),\n * );\n * ```\n */\nexport class SpansResource {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Create a new span within a trace\n *\n * @param traceId - The trace ID to create span in\n * @param options - Span creation options\n * @returns Created span\n */\n async create(traceId: string, options: ISynovaCreateSpanOptions): Promise<ISynovaSpan> {\n const body: Record<string, unknown> = {\n type: options.type,\n };\n\n if (options.parentSpanId !== undefined) body.parentSpanId = options.parentSpanId;\n if (options.name !== undefined) body.name = options.name;\n if (options.input !== undefined) body.input = options.input;\n if (options.toolName !== undefined) body.toolName = options.toolName;\n if (options.toolArguments !== undefined) body.toolArguments = options.toolArguments;\n if (options.metadata !== undefined) body.metadata = options.metadata;\n\n return this.http.request<ISynovaSpan>({\n method: 'POST',\n path: `/api/v1/traces/${traceId}/spans`,\n body,\n });\n }\n\n /**\n * End/complete a span\n *\n * @param spanId - The span ID to end\n * @param options - Span end options\n * @returns Updated span\n */\n async end(spanId: string, options?: ISynovaEndSpanOptions): Promise<ISynovaSpan> {\n const body: Record<string, unknown> = {};\n\n if (options?.status !== undefined) body.status = options.status;\n if (options?.level !== undefined) body.level = options.level;\n if (options?.statusMessage !== undefined) body.statusMessage = options.statusMessage;\n if (options?.output !== undefined) body.output = options.output;\n if (options?.toolResult !== undefined) body.toolResult = options.toolResult;\n if (options?.durationMs !== undefined) body.durationMs = options.durationMs;\n\n return this.http.request<ISynovaSpan>({\n method: 'PATCH',\n path: `/api/v1/spans/${spanId}`,\n body,\n });\n }\n\n /**\n * Wrap an async function with automatic span tracking\n *\n * @param options - Span options (traceId, type, name, etc.)\n * @param input - Input data to record in span\n * @param fn - Async function to execute\n * @returns Result of the function\n *\n * @example\n * ```ts\n * const result = await client.spans.wrap(\n * { traceId: 'trc_123', type: 'retriever', name: 'vector_search' },\n * { query: 'how to...', topK: 5 },\n * async () => vectorDb.search(query),\n * );\n * ```\n */\n async wrap<T>(options: ISynovaWrapOptions, input: unknown, fn: () => Promise<T>): Promise<T> {\n const span = await this.create(options.traceId, {\n type: options.type,\n name: options.name,\n parentSpanId: options.parentSpanId,\n input,\n metadata: options.metadata,\n });\n\n try {\n const result = await fn();\n await this.end(span.id, {\n status: 'completed',\n output: result,\n });\n return result;\n } catch (error) {\n await this.end(span.id, {\n status: 'error',\n statusMessage: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n }\n\n /**\n * Wrap a tool function with automatic span tracking\n *\n * @param options - Tool span options (traceId, toolName, etc.)\n * @param args - Tool arguments to record\n * @param fn - Tool function to execute\n * @returns Result of the tool\n *\n * @example\n * ```ts\n * const weather = await client.spans.wrapTool(\n * { traceId: 'trc_123', toolName: 'fetch_weather', parentSpanId: 'spn_abc' },\n * { city: 'NYC' },\n * async (args) => fetchWeather(args.city),\n * );\n * ```\n */\n async wrapTool<TArgs extends Record<string, unknown>, TResult>(\n options: ISynovaWrapToolOptions,\n args: TArgs,\n fn: (args: TArgs) => Promise<TResult>,\n ): Promise<TResult> {\n const span = await this.create(options.traceId, {\n type: 'tool',\n toolName: options.toolName,\n toolArguments: args,\n parentSpanId: options.parentSpanId,\n metadata: options.metadata,\n });\n\n try {\n const result = await fn(args);\n await this.end(span.id, {\n status: 'completed',\n toolResult: result,\n });\n return result;\n } catch (error) {\n await this.end(span.id, {\n status: 'error',\n statusMessage: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n }\n}\n","import type { ISynovaConfig, ISynovaLogger } from './types';\nimport type { IRetryOptions } from './utils/http';\nimport { HttpClient } from './utils/http';\nimport { PromptsResource } from './resources/prompts';\nimport { ModelsResource } from './resources/models';\nimport { FilesResource } from './resources/files';\nimport { SpansResource } from './resources/spans';\n\nconst DEFAULT_BASE_URL = 'https://api.synova.cloud';\nconst DEFAULT_TIMEOUT = 30000;\n\nconst DEFAULT_RETRY: IRetryOptions = {\n maxRetries: 3,\n strategy: 'exponential',\n initialDelayMs: 1000,\n maxDelayMs: 30000,\n backoffMultiplier: 2,\n};\n\nconst DEFAULT_LOGGER: ISynovaLogger = {\n debug: (message, ...args) => console.debug(message, ...args),\n info: (message, ...args) => console.info(message, ...args),\n warn: (message, ...args) => console.warn(message, ...args),\n error: (messageOrError, ...args) => console.error(messageOrError, ...args),\n};\n\n/**\n * Synova Cloud SDK client\n *\n * @example\n * ```ts\n * import { SynovaCloudSdk } from '@synova-cloud/sdk';\n *\n * const client = new SynovaCloudSdk('your-api-key');\n *\n * // Get a prompt\n * const prompt = await client.prompts.get('prm_abc123');\n *\n * // Execute a prompt with direct API key\n * const result = await client.prompts.execute('prm_abc123', {\n * provider: 'openai',\n * model: 'gpt-4o',\n * apiKey: 'sk-...',\n * variables: { topic: 'TypeScript' },\n * });\n *\n * // Execute with Azure OpenAI\n * const azureResult = await client.prompts.execute('prm_abc123', {\n * provider: 'azure_openai',\n * model: 'gpt-4o',\n * apiKey: 'your-azure-key',\n * azureEndpoint: 'https://my-resource.openai.azure.com',\n * variables: { topic: 'TypeScript' },\n * });\n *\n * // List available models\n * const { providers } = await client.models.list();\n *\n * // Get models for a specific provider\n * const openaiModels = await client.models.getByProvider('openai');\n *\n * // With custom retry config\n * const clientWithRetry = new SynovaCloudSdk('your-api-key', {\n * retry: {\n * maxRetries: 5,\n * strategy: 'linear',\n * initialDelayMs: 500,\n * },\n * });\n * ```\n */\nexport class SynovaCloudSdk {\n readonly prompts: PromptsResource;\n readonly models: ModelsResource;\n readonly files: FilesResource;\n readonly spans: SpansResource;\n\n private readonly http: HttpClient;\n\n /**\n * Create a new Synova Cloud SDK client\n *\n * @param apiKey - Your Synova API key\n * @param config - Optional configuration\n */\n constructor(apiKey: string, config?: ISynovaConfig) {\n if (!apiKey) {\n throw new Error('API key is required');\n }\n\n this.http = new HttpClient({\n baseUrl: config?.baseUrl ?? DEFAULT_BASE_URL,\n apiKey,\n timeout: config?.timeout ?? DEFAULT_TIMEOUT,\n retry: {\n maxRetries: config?.retry?.maxRetries ?? DEFAULT_RETRY.maxRetries,\n strategy: config?.retry?.strategy ?? DEFAULT_RETRY.strategy,\n initialDelayMs: config?.retry?.initialDelayMs ?? DEFAULT_RETRY.initialDelayMs,\n maxDelayMs: config?.retry?.maxDelayMs ?? DEFAULT_RETRY.maxDelayMs,\n backoffMultiplier: config?.retry?.backoffMultiplier ?? DEFAULT_RETRY.backoffMultiplier,\n },\n debug: config?.debug ?? false,\n logger: config?.logger ?? DEFAULT_LOGGER,\n });\n\n this.prompts = new PromptsResource(this.http);\n this.models = new ModelsResource(this.http);\n this.files = new FilesResource(this.http);\n this.spans = new SpansResource(this.http);\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/errors/index.ts","../src/version.ts","../src/utils/http.ts","../src/schema/adapters/zod.adapter.ts","../src/schema/adapters/yup.adapter.ts","../src/schema/adapters/joi.adapter.ts","../src/schema/adapters/json-schema.adapter.ts","../src/schema/resolver.ts","../src/resources/prompts.ts","../src/resources/models.ts","../src/resources/files.ts","../src/resources/spans.ts","../src/client.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["import type { IApiErrorResponse, ISynovaExecutionError } from '../types';\n\n/**\n * Base error class for all Synova SDK errors\n */\nexport class SynovaError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'SynovaError';\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * Error thrown when API returns an error response.\n * Base class for all API-related errors.\n */\nexport class ApiSynovaError extends SynovaError {\n readonly code: string;\n readonly httpCode: number;\n readonly requestId: string;\n readonly timestamp: string;\n readonly path?: string;\n readonly method?: string;\n readonly details?: unknown;\n\n constructor(response: IApiErrorResponse) {\n super(response.message);\n this.name = 'ApiSynovaError';\n this.code = response.code;\n this.httpCode = response.httpCode;\n this.requestId = response.requestId;\n this.timestamp = response.timestamp;\n this.path = response.path;\n this.method = response.method;\n this.details = response.details;\n }\n}\n\n/**\n * Error thrown when authentication fails (401)\n */\nexport class AuthSynovaError extends ApiSynovaError {\n constructor(response: IApiErrorResponse) {\n super(response);\n this.name = 'AuthSynovaError';\n }\n}\n\n/**\n * Error thrown when resource is not found (404)\n */\nexport class NotFoundSynovaError extends ApiSynovaError {\n constructor(response: IApiErrorResponse) {\n super(response);\n this.name = 'NotFoundSynovaError';\n }\n}\n\n/**\n * Error thrown when rate limit is exceeded (429)\n */\nexport class RateLimitSynovaError extends ApiSynovaError {\n readonly retryAfterMs?: number;\n\n constructor(response: IApiErrorResponse, retryAfterMs?: number) {\n super(response);\n this.name = 'RateLimitSynovaError';\n this.retryAfterMs = retryAfterMs;\n }\n}\n\n/**\n * Error thrown when server returns 5xx error\n */\nexport class ServerSynovaError extends ApiSynovaError {\n readonly retryable: boolean = true;\n\n constructor(response: IApiErrorResponse) {\n super(response);\n this.name = 'ServerSynovaError';\n }\n}\n\n/**\n * Error thrown when request times out (client-side)\n */\nexport class TimeoutSynovaError extends SynovaError {\n readonly timeoutMs: number;\n\n constructor(timeoutMs: number) {\n super(`Request timed out after ${timeoutMs}ms`);\n this.name = 'TimeoutSynovaError';\n this.timeoutMs = timeoutMs;\n }\n}\n\n/**\n * Error thrown when network request fails (client-side)\n */\nexport class NetworkSynovaError extends SynovaError {\n readonly cause?: Error;\n\n constructor(message: string, cause?: Error) {\n super(message);\n this.name = 'NetworkSynovaError';\n this.cause = cause;\n }\n}\n\n/**\n * Error thrown when LLM execution fails (returned in response with type='error')\n */\nexport class ExecutionSynovaError extends SynovaError {\n readonly code: string;\n readonly provider?: string;\n readonly retryable: boolean;\n readonly retryAfterMs?: number;\n readonly details?: ISynovaExecutionError['details'];\n\n constructor(error: ISynovaExecutionError) {\n super(error.message);\n this.name = 'ExecutionSynovaError';\n this.code = error.code;\n this.provider = error.provider;\n this.retryable = error.retryable;\n this.retryAfterMs = error.retryAfterMs;\n this.details = error.details;\n }\n}\n","declare const __SDK_VERSION__: string;\n\nexport const SDK_VERSION = typeof __SDK_VERSION__ !== 'undefined' ? __SDK_VERSION__ : 'dev';\n","import type { IApiErrorResponse, ISynovaLogger, TSynovaRetryStrategy } from '../types';\nimport {\n ApiSynovaError,\n AuthSynovaError,\n NetworkSynovaError,\n NotFoundSynovaError,\n RateLimitSynovaError,\n ServerSynovaError,\n TimeoutSynovaError,\n} from '../errors';\nimport { SDK_VERSION } from '../version';\n\nexport interface IRetryOptions {\n maxRetries: number;\n strategy: TSynovaRetryStrategy;\n initialDelayMs: number;\n maxDelayMs: number;\n backoffMultiplier: number;\n}\n\nexport interface IHttpClientConfig {\n baseUrl: string;\n apiKey: string;\n timeout: number;\n retry: IRetryOptions;\n debug: boolean;\n logger: ISynovaLogger;\n}\n\nexport interface IRequestOptions {\n method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n path: string;\n body?: unknown;\n query?: Record<string, string | undefined>;\n}\n\nexport interface IUploadOptions {\n path: string;\n formData: FormData;\n}\n\nexport class HttpClient {\n private readonly config: IHttpClientConfig;\n\n constructor(config: IHttpClientConfig) {\n this.config = config;\n }\n\n async request<T>(options: IRequestOptions): Promise<T> {\n const url = this.buildUrl(options.path, options.query);\n const { maxRetries } = this.config.retry;\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n if (attempt > 0) {\n const delay = this.calculateRetryDelay(attempt, lastError);\n this.log(\n `Retry attempt ${attempt}/${maxRetries} after ${delay}ms (strategy: ${this.config.retry.strategy})`,\n );\n await this.sleep(delay);\n }\n\n return await this.makeRequest<T>(url, options);\n } catch (error) {\n lastError = error as Error;\n\n if (!this.isRetryable(error)) {\n throw error;\n }\n\n if (attempt === maxRetries) {\n throw error;\n }\n\n this.log(`Request failed, will retry: ${(error as Error).message}`);\n }\n }\n\n throw lastError;\n }\n\n async upload<T>(options: IUploadOptions): Promise<T> {\n const url = this.buildUrl(options.path);\n const { maxRetries } = this.config.retry;\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n if (attempt > 0) {\n const delay = this.calculateRetryDelay(attempt, lastError);\n this.log(\n `Retry attempt ${attempt}/${maxRetries} after ${delay}ms (strategy: ${this.config.retry.strategy})`,\n );\n await this.sleep(delay);\n }\n\n return await this.makeUploadRequest<T>(url, options.formData);\n } catch (error) {\n lastError = error as Error;\n\n if (!this.isRetryable(error)) {\n throw error;\n }\n\n if (attempt === maxRetries) {\n throw error;\n }\n\n this.log(`Upload failed, will retry: ${(error as Error).message}`);\n }\n }\n\n throw lastError;\n }\n\n private async makeRequest<T>(url: string, options: IRequestOptions): Promise<T> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\n\n this.log(`${options.method} ${url}`);\n\n try {\n const response = await fetch(url, {\n method: options.method,\n headers: {\n Authorization: `Bearer ${this.config.apiKey}`,\n 'Content-Type': 'application/json',\n 'User-Agent': `synova-cloud-sdk-node/${SDK_VERSION}`,\n },\n body: options.body ? JSON.stringify(options.body) : undefined,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n await this.handleErrorResponse(response);\n }\n\n const data = (await response.json()) as T;\n this.log(`Response: ${response.status}`);\n return data;\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof Error && error.name === 'AbortError') {\n throw new TimeoutSynovaError(this.config.timeout);\n }\n\n if (\n error instanceof ApiSynovaError ||\n error instanceof AuthSynovaError ||\n error instanceof NotFoundSynovaError ||\n error instanceof RateLimitSynovaError ||\n error instanceof ServerSynovaError\n ) {\n throw error;\n }\n\n throw new NetworkSynovaError(\n `Network request failed: ${(error as Error).message}`,\n error as Error,\n );\n }\n }\n\n private async makeUploadRequest<T>(url: string, formData: FormData): Promise<T> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\n\n this.log(`POST (upload) ${url}`);\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${this.config.apiKey}`,\n 'User-Agent': `synova-cloud-sdk-node/${SDK_VERSION}`,\n // Note: Content-Type is not set for FormData - browser/node sets it with boundary\n },\n body: formData,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n await this.handleErrorResponse(response);\n }\n\n const data = (await response.json()) as T;\n this.log(`Response: ${response.status}`);\n return data;\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof Error && error.name === 'AbortError') {\n throw new TimeoutSynovaError(this.config.timeout);\n }\n\n if (\n error instanceof ApiSynovaError ||\n error instanceof AuthSynovaError ||\n error instanceof NotFoundSynovaError ||\n error instanceof RateLimitSynovaError ||\n error instanceof ServerSynovaError\n ) {\n throw error;\n }\n\n throw new NetworkSynovaError(\n `Upload request failed: ${(error as Error).message}`,\n error as Error,\n );\n }\n }\n\n private async handleErrorResponse(response: Response): Promise<never> {\n const status = response.status;\n\n // Try to parse error body\n let errorBody: IApiErrorResponse | null = null;\n try {\n errorBody = (await response.json()) as IApiErrorResponse;\n } catch {\n // Ignore JSON parse errors\n }\n\n // Create default error body if parsing failed\n const defaultErrorBody: IApiErrorResponse = {\n code: 'UNKNOWN_ERROR',\n httpCode: status,\n message: errorBody?.message || `HTTP ${status}: ${response.statusText}`,\n requestId: errorBody?.requestId || 'unknown',\n timestamp: errorBody?.timestamp || new Date().toISOString(),\n path: errorBody?.path,\n method: errorBody?.method,\n details: errorBody?.details,\n };\n\n const body = errorBody || defaultErrorBody;\n\n if (status === 401) {\n throw new AuthSynovaError(body);\n }\n\n if (status === 404) {\n throw new NotFoundSynovaError(body);\n }\n\n if (status === 429) {\n const retryAfter = response.headers.get('Retry-After');\n const retryAfterMs = retryAfter ? parseInt(retryAfter, 10) * 1000 : undefined;\n throw new RateLimitSynovaError(body, retryAfterMs);\n }\n\n if (status >= 500) {\n throw new ServerSynovaError(body);\n }\n\n throw new ApiSynovaError(body);\n }\n\n private buildUrl(path: string, query?: Record<string, string | undefined>): string {\n const url = new URL(path, this.config.baseUrl);\n\n if (query) {\n for (const [key, value] of Object.entries(query)) {\n if (value !== undefined) {\n url.searchParams.set(key, value);\n }\n }\n }\n\n return url.toString();\n }\n\n private isRetryable(error: unknown): boolean {\n if (error instanceof RateLimitSynovaError) return true;\n if (error instanceof ServerSynovaError) return true;\n if (error instanceof NetworkSynovaError) return true;\n if (error instanceof TimeoutSynovaError) return true;\n return false;\n }\n\n private calculateRetryDelay(attempt: number, error: Error | null): number {\n const { strategy, initialDelayMs, maxDelayMs, backoffMultiplier } = this.config.retry;\n\n // Use Retry-After header if available (takes priority)\n if (error instanceof RateLimitSynovaError && error.retryAfterMs) {\n return Math.min(error.retryAfterMs, maxDelayMs);\n }\n\n let baseDelay: number;\n\n if (strategy === 'linear') {\n // Linear: initialDelay * attempt (1000, 2000, 3000, ...)\n baseDelay = initialDelayMs * attempt;\n } else {\n // Exponential: initialDelay * multiplier^(attempt-1) (1000, 2000, 4000, ...)\n baseDelay = initialDelayMs * Math.pow(backoffMultiplier, attempt - 1);\n }\n\n // Add jitter (±10%) to prevent thundering herd\n const jitter = baseDelay * 0.1 * (Math.random() * 2 - 1);\n const delay = baseDelay + jitter;\n\n return Math.min(Math.max(delay, 0), maxDelayMs);\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n private log(message: string): void {\n if (this.config.debug) {\n this.config.logger.debug(`[Synova SDK] ${message}`);\n }\n }\n}\n","import type { IJsonSchema } from '../types';\nimport type { ISchemaAdapter } from './base.adapter';\n\n/**\n * Zod schema type definition\n */\ninterface IZodSchema {\n _def: { typeName: string };\n safeParse: (data: unknown) => { success: boolean };\n}\n\n/**\n * Adapter for Zod schemas.\n * Uses zod-to-json-schema for conversion.\n */\nexport class ZodAdapter implements ISchemaAdapter<IZodSchema> {\n canHandle(schema: unknown): schema is IZodSchema {\n if (typeof schema !== 'object' || schema === null) return false;\n\n const s = schema as Partial<IZodSchema>;\n return (\n typeof s._def === 'object' &&\n s._def !== null &&\n typeof s._def.typeName === 'string' &&\n s._def.typeName.startsWith('Zod') &&\n typeof s.safeParse === 'function'\n );\n }\n\n toJsonSchema(schema: IZodSchema): IJsonSchema {\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { zodToJsonSchema } = require('zod-to-json-schema');\n const result = { ...zodToJsonSchema(schema, { $refStrategy: 'none' }) };\n delete result.$schema;\n return result as IJsonSchema;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'MODULE_NOT_FOUND') {\n throw new Error(\n 'zod-to-json-schema is required to convert Zod schemas. Install it with: npm install zod-to-json-schema',\n );\n }\n throw new Error(`Failed to convert Zod schema: ${(error as Error).message}`);\n }\n }\n}\n","import type { IJsonSchema } from '../types';\nimport type { ISchemaAdapter } from './base.adapter';\n\n/**\n * Yup schema type definition\n */\ninterface IYupSchema {\n __isYupSchema__: boolean;\n}\n\n/**\n * Adapter for Yup schemas.\n * Uses @sodaru/yup-to-json-schema for conversion.\n *\n * @see https://github.com/jquense/yup/blob/master/src/schema.ts\n */\nexport class YupAdapter implements ISchemaAdapter<IYupSchema> {\n canHandle(schema: unknown): schema is IYupSchema {\n if (typeof schema !== 'object' || schema === null) return false;\n return (schema as IYupSchema).__isYupSchema__ === true;\n }\n\n toJsonSchema(schema: IYupSchema): IJsonSchema {\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { convertSchema } = require('@sodaru/yup-to-json-schema');\n return convertSchema(schema) as IJsonSchema;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'MODULE_NOT_FOUND') {\n throw new Error(\n '@sodaru/yup-to-json-schema is required to convert Yup schemas. Install it with: npm install @sodaru/yup-to-json-schema',\n );\n }\n throw new Error(`Failed to convert Yup schema: ${(error as Error).message}`);\n }\n }\n}\n","import type { IJsonSchema } from '../types';\nimport type { ISchemaAdapter } from './base.adapter';\n\n/**\n * Joi schema type definition\n */\ninterface IJoiSchema {\n describe: () => { type: string };\n}\n\n/**\n * Adapter for Joi schemas.\n * Uses joi-to-json for conversion.\n *\n * @see https://joi.dev/api/#isschemaschema-options\n */\nexport class JoiAdapter implements ISchemaAdapter<IJoiSchema> {\n canHandle(schema: unknown): schema is IJoiSchema {\n if (typeof schema !== 'object' || schema === null) return false;\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { isSchema } = require('joi');\n return isSchema(schema);\n } catch {\n // Joi not installed\n return false;\n }\n }\n\n toJsonSchema(schema: IJoiSchema): IJsonSchema {\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const joiToJson = require('joi-to-json');\n return joiToJson(schema) as IJsonSchema;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'MODULE_NOT_FOUND') {\n throw new Error(\n 'joi-to-json is required to convert Joi schemas. Install it with: npm install joi-to-json',\n );\n }\n throw new Error(`Failed to convert Joi schema: ${(error as Error).message}`);\n }\n }\n}\n","import type { IJsonSchema } from '../types';\nimport type { ISchemaAdapter } from './base.adapter';\n\n/**\n * Passthrough adapter for raw JSON Schema objects.\n * Transforms `nullable: true` to `type: [\"...\", \"null\"]` recursively.\n */\nexport class JsonSchemaAdapter implements ISchemaAdapter<IJsonSchema> {\n private static readonly VALID_JSON_SCHEMA_TYPES = [\n 'string',\n 'number',\n 'integer',\n 'boolean',\n 'object',\n 'array',\n 'null',\n ];\n\n canHandle(schema: unknown): schema is IJsonSchema {\n if (typeof schema !== 'object' || schema === null) {\n return false;\n }\n\n const obj = schema as Record<string, unknown>;\n\n // Check for valid JSON Schema type\n if ('type' in obj) {\n const type = obj.type;\n if (typeof type === 'string' && JsonSchemaAdapter.VALID_JSON_SCHEMA_TYPES.includes(type)) {\n return true;\n }\n if (\n Array.isArray(type) &&\n type.every((t) => JsonSchemaAdapter.VALID_JSON_SCHEMA_TYPES.includes(t))\n ) {\n return true;\n }\n }\n\n // Properties must be an object (not array or primitive)\n if (\n 'properties' in obj &&\n typeof obj.properties === 'object' &&\n obj.properties !== null &&\n !Array.isArray(obj.properties)\n ) {\n return true;\n }\n\n // Items must be an object (schema for array items)\n if (\n 'items' in obj &&\n typeof obj.items === 'object' &&\n obj.items !== null &&\n !Array.isArray(obj.items)\n ) {\n return true;\n }\n\n // Composition keywords with array values\n if ('anyOf' in obj && Array.isArray(obj.anyOf)) return true;\n if ('oneOf' in obj && Array.isArray(obj.oneOf)) return true;\n if ('allOf' in obj && Array.isArray(obj.allOf)) return true;\n\n // Enum with array values\n if ('enum' in obj && Array.isArray(obj.enum)) return true;\n\n return false;\n }\n\n toJsonSchema(schema: IJsonSchema): IJsonSchema {\n return this.transformNullable(schema);\n }\n\n /**\n * Recursively transform `nullable: true` to `type: [\"...\", \"null\"]`\n */\n private transformNullable(schema: IJsonSchema): IJsonSchema {\n const result: IJsonSchema = { ...schema };\n const schemaWithNullable = schema as IJsonSchema & { nullable?: boolean };\n\n // Handle nullable transformation\n if (schemaWithNullable.nullable === true && result.type) {\n if (typeof result.type === 'string') {\n result.type = [result.type, 'null'];\n } else if (Array.isArray(result.type) && !result.type.includes('null')) {\n result.type = [...result.type, 'null'];\n }\n // Remove nullable property (it's not standard JSON Schema)\n delete (result as IJsonSchema & { nullable?: boolean }).nullable;\n }\n\n // Recursively transform nested schemas\n if (result.properties) {\n result.properties = Object.fromEntries(\n Object.entries(result.properties).map(([key, value]) => [\n key,\n this.transformNullable(value),\n ]),\n );\n }\n\n if (result.items) {\n result.items = this.transformNullable(result.items);\n }\n\n if (result.additionalProperties && typeof result.additionalProperties === 'object') {\n result.additionalProperties = this.transformNullable(result.additionalProperties);\n }\n\n if (result.allOf) {\n result.allOf = result.allOf.map((s) => this.transformNullable(s));\n }\n\n if (result.anyOf) {\n result.anyOf = result.anyOf.map((s) => this.transformNullable(s));\n }\n\n if (result.oneOf) {\n result.oneOf = result.oneOf.map((s) => this.transformNullable(s));\n }\n\n if (result.not) {\n result.not = this.transformNullable(result.not);\n }\n\n return result;\n }\n}\n","import type { IJsonSchema } from './types';\nimport type { ISchemaAdapter } from './adapters/base.adapter';\nimport { ZodAdapter } from './adapters/zod.adapter';\nimport { YupAdapter } from './adapters/yup.adapter';\nimport { JoiAdapter } from './adapters/joi.adapter';\nimport { JsonSchemaAdapter } from './adapters/json-schema.adapter';\n\n/**\n * Schema type identifier\n */\nexport type TSchemaType = 'zod' | 'yup' | 'joi' | 'json-schema' | 'unknown';\n\n/**\n * Zod-like schema interface\n */\ninterface IZodLike {\n _def: { typeName: string };\n safeParse: unknown;\n}\n\n/**\n * Yup-like schema interface\n */\ninterface IYupLike {\n __isYupSchema__: true;\n}\n\n/**\n * Joi-like schema interface\n */\ninterface IJoiLike {\n describe: () => unknown;\n}\n\n/**\n * Supported schema input types.\n * Provides better type hints while maintaining flexibility.\n */\nexport type TSchemaInput =\n | IJsonSchema // Raw JSON Schema\n | IZodLike // Zod-like\n | IYupLike // Yup-like\n | IJoiLike // Joi-like\n | unknown; // Fallback for custom adapters\n\n/**\n * Schema resolver that converts various schema libraries to JSON Schema.\n * Supports Zod, Yup, Joi, and raw JSON Schema.\n */\nexport class SchemaResolver {\n private static adapters: ISchemaAdapter[] = [\n // Order matters: Zod → Yup → Joi → JsonSchema (fallback)\n new ZodAdapter(),\n new YupAdapter(),\n new JoiAdapter(),\n new JsonSchemaAdapter(),\n ];\n\n /**\n * Register a custom adapter.\n *\n * @param adapter - The adapter to register\n * @param position - Where to insert: 'first' adds at the beginning,\n * 'last' adds before JsonSchemaAdapter (fallback)\n *\n * @example\n * ```typescript\n * SchemaResolver.registerAdapter(new MyCustomAdapter(), 'first');\n * ```\n */\n static registerAdapter(adapter: ISchemaAdapter, position: 'first' | 'last' = 'first'): void {\n if (position === 'first') {\n this.adapters.unshift(adapter);\n } else {\n // Insert before JsonSchemaAdapter (last position)\n this.adapters.splice(-1, 0, adapter);\n }\n }\n\n /**\n * Reset adapters to default configuration.\n * Removes all custom adapters.\n */\n static resetAdapters(): void {\n this.adapters = [new ZodAdapter(), new YupAdapter(), new JoiAdapter(), new JsonSchemaAdapter()];\n }\n\n /**\n * Resolve a schema input to JSON Schema format.\n *\n * @param schema - Schema from Zod, Yup, Joi, or raw JSON Schema\n * @returns JSON Schema representation\n * @throws Error if schema type is not supported\n *\n * @example\n * ```typescript\n * // Zod\n * const zodSchema = z.object({ title: z.string() });\n * const jsonSchema = SchemaResolver.resolve(zodSchema);\n *\n * // Yup\n * const yupSchema = yup.object({ title: yup.string().required() });\n * const jsonSchema = SchemaResolver.resolve(yupSchema);\n *\n * // Joi\n * const joiSchema = Joi.object({ title: Joi.string() });\n * const jsonSchema = SchemaResolver.resolve(joiSchema);\n *\n * // Raw JSON Schema (passthrough)\n * const rawSchema = { type: 'object', properties: { title: { type: 'string' } } };\n * const jsonSchema = SchemaResolver.resolve(rawSchema);\n * ```\n */\n static resolve(schema: TSchemaInput): IJsonSchema {\n for (const adapter of this.adapters) {\n if (adapter.canHandle(schema)) {\n return adapter.toJsonSchema(schema);\n }\n }\n\n throw new Error(\n 'Unsupported schema type. Supported types: Zod, Yup, Joi, or raw JSON Schema object.',\n );\n }\n\n /**\n * Check if a schema is supported.\n *\n * @param schema - Schema to check\n * @returns true if the schema is supported\n */\n static isSupported(schema: unknown): boolean {\n return this.adapters.some((adapter) => adapter.canHandle(schema));\n }\n\n /**\n * Get the type of a schema.\n *\n * @param schema - Schema to identify\n * @returns Schema type identifier\n */\n static getSchemaType(schema: unknown): TSchemaType {\n const adapters = this.adapters;\n\n if (adapters[0].canHandle(schema)) {\n return 'zod';\n }\n if (adapters[1].canHandle(schema)) {\n return 'yup';\n }\n if (adapters[2].canHandle(schema)) {\n return 'joi';\n }\n if (adapters[3].canHandle(schema)) {\n return 'json-schema';\n }\n\n return 'unknown';\n }\n}\n","import type { HttpClient } from '../utils/http';\nimport type {\n ISynovaPrompt,\n ISynovaGetPromptOptions,\n ISynovaExecuteOptions,\n ISynovaExecuteResponse,\n ISynovaTypedExecuteResponse,\n} from '../types';\nimport { SchemaResolver } from '../schema/resolver';\nimport { ExecutionSynovaError } from '../errors';\n\nexport class PromptsResource {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Get a prompt by ID (returns version with 'latest' tag)\n */\n async get(promptId: string, options?: ISynovaGetPromptOptions): Promise<ISynovaPrompt> {\n if (options?.version) {\n return this.http.request<ISynovaPrompt>({\n method: 'GET',\n path: `/api/v1/prompts/${promptId}/versions/${options.version}`,\n });\n }\n\n const tag = options?.tag || 'latest';\n if (tag === 'latest') {\n return this.http.request<ISynovaPrompt>({\n method: 'GET',\n path: `/api/v1/prompts/${promptId}`,\n });\n }\n\n return this.http.request<ISynovaPrompt>({\n method: 'GET',\n path: `/api/v1/prompts/${promptId}/tags/${tag}`,\n });\n }\n\n /**\n * Execute a prompt with typed response using responseSchema\n *\n * @example\n * ```ts\n * // With Zod schema - returns full response with typed object\n * const schema = z.object({ title: z.string() });\n * const result = await client.prompts.execute<z.infer<typeof schema>>('prm_abc123', {\n * provider: 'openai',\n * model: 'gpt-4o',\n * responseSchema: schema,\n * });\n * console.log(result.object.title); // Typed as string\n * console.log(result.executionUsage); // Token usage available\n *\n * // With raw JSON Schema\n * const result = await client.prompts.execute<{ title: string }>('prm_abc123', {\n * provider: 'openai',\n * model: 'gpt-4o',\n * responseSchema: { type: 'object', properties: { title: { type: 'string' } } },\n * });\n * console.log(result.object.title); // Typed\n * ```\n */\n execute<T>(\n promptId: string,\n options: ISynovaExecuteOptions & {\n responseSchema: NonNullable<ISynovaExecuteOptions['responseSchema']>;\n },\n ): Promise<ISynovaTypedExecuteResponse<T>>;\n\n /**\n * Execute a prompt\n *\n * @example\n * ```ts\n * // Without responseSchema - returns ISynovaExecuteResponse\n * const result = await client.prompts.execute('prm_abc123', {\n * provider: 'openai',\n * model: 'gpt-4o',\n * });\n * if (result.type === 'message') {\n * console.log(result.content);\n * }\n * ```\n */\n execute(promptId: string, options: ISynovaExecuteOptions): Promise<ISynovaExecuteResponse>;\n\n async execute<T>(\n promptId: string,\n options: ISynovaExecuteOptions,\n ): Promise<ISynovaTypedExecuteResponse<T> | ISynovaExecuteResponse> {\n const body: Record<string, unknown> = {\n provider: options.provider,\n model: options.model,\n };\n\n if (options.apiKey !== undefined) body.apiKey = options.apiKey;\n if (options.azureEndpoint !== undefined) body.azureEndpoint = options.azureEndpoint;\n if (options.variables !== undefined) body.variables = options.variables;\n if (options.messages !== undefined) body.messages = options.messages;\n if (options.tag !== undefined) body.tag = options.tag;\n if (options.version !== undefined) body.version = options.version;\n if (options.metadata !== undefined) body.metadata = options.metadata;\n if (options.parameters !== undefined) body.parameters = options.parameters;\n if (options.sessionId !== undefined) body.sessionId = options.sessionId;\n\n // Resolve schema if provided (supports Zod, Yup, Joi, or raw JSON Schema)\n if (options.responseSchema !== undefined) {\n body.responseSchema = SchemaResolver.resolve(options.responseSchema);\n }\n\n const response = await this.http.request<ISynovaExecuteResponse>({\n method: 'POST',\n path: `/api/v1/prompts/${promptId}/run`,\n body,\n });\n\n // Always throw on LLM error\n if (response.type === 'error' && response.error) {\n throw new ExecutionSynovaError(response.error);\n }\n\n // Return full response with typed object when responseSchema is provided\n if (options.responseSchema !== undefined) {\n if (response.object === undefined) {\n throw new Error('Expected structured response but received undefined');\n }\n return response as ISynovaTypedExecuteResponse<T>;\n }\n\n return response;\n }\n\n /**\n * Execute a prompt by tag with typed response\n */\n executeByTag<T>(\n promptId: string,\n tag: string,\n options: ISynovaExecuteOptions & {\n responseSchema: NonNullable<ISynovaExecuteOptions['responseSchema']>;\n },\n ): Promise<ISynovaTypedExecuteResponse<T>>;\n\n /**\n * Execute a prompt by tag\n */\n executeByTag(\n promptId: string,\n tag: string,\n options: ISynovaExecuteOptions,\n ): Promise<ISynovaExecuteResponse>;\n\n async executeByTag<T>(\n promptId: string,\n tag: string,\n options: ISynovaExecuteOptions,\n ): Promise<ISynovaTypedExecuteResponse<T> | ISynovaExecuteResponse> {\n return this.execute(promptId, { ...options, tag });\n }\n\n /**\n * Execute a prompt by version with typed response\n */\n executeByVersion<T>(\n promptId: string,\n version: string,\n options: ISynovaExecuteOptions & {\n responseSchema: NonNullable<ISynovaExecuteOptions['responseSchema']>;\n },\n ): Promise<ISynovaTypedExecuteResponse<T>>;\n\n /**\n * Execute a prompt by version\n */\n executeByVersion(\n promptId: string,\n version: string,\n options: ISynovaExecuteOptions,\n ): Promise<ISynovaExecuteResponse>;\n\n async executeByVersion<T>(\n promptId: string,\n version: string,\n options: ISynovaExecuteOptions,\n ): Promise<ISynovaTypedExecuteResponse<T> | ISynovaExecuteResponse> {\n return this.execute(promptId, { ...options, version });\n }\n}\n","import type { HttpClient } from '../utils/http';\nimport type { ISynovaModel, ISynovaModelsResponse, ISynovaListModelsOptions } from '../types';\n\ninterface IProviderModelsResponse {\n models: ISynovaModel[];\n}\n\nexport class ModelsResource {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * List all available models\n *\n * @param options - Optional filters\n * @returns List of providers with their models\n *\n * @example\n * ```ts\n * // Get all models\n * const { providers } = await client.models.list();\n *\n * // Filter by type\n * const imageModels = await client.models.list({ type: 'image' });\n *\n * // Filter by capability\n * const functionCallingModels = await client.models.list({\n * capability: 'function_calling',\n * });\n *\n * // Filter by provider\n * const openaiModels = await client.models.list({ provider: 'openai' });\n * ```\n */\n async list(options?: ISynovaListModelsOptions): Promise<ISynovaModelsResponse> {\n return this.http.request<ISynovaModelsResponse>({\n method: 'GET',\n path: '/api/v1/models',\n query: {\n type: options?.type,\n capability: options?.capability,\n provider: options?.provider,\n },\n });\n }\n\n /**\n * Get models for a specific provider\n *\n * @param provider - Provider ID (e.g., 'openai', 'anthropic')\n * @returns List of models for the provider\n *\n * @example\n * ```ts\n * const { models } = await client.models.getByProvider('openai');\n * ```\n */\n async getByProvider(provider: string): Promise<ISynovaModel[]> {\n const response = await this.http.request<IProviderModelsResponse>({\n method: 'GET',\n path: `/api/v1/models/${provider}`,\n });\n return response.models;\n }\n\n /**\n * Get a specific model\n *\n * @param provider - Provider ID\n * @param model - Model ID\n * @returns Model details\n *\n * @example\n * ```ts\n * const model = await client.models.get('openai', 'gpt-4o');\n * console.log(model.capabilities);\n * console.log(model.limits);\n * ```\n */\n async get(provider: string, model: string): Promise<ISynovaModel> {\n return this.http.request<ISynovaModel>({\n method: 'GET',\n path: `/api/v1/models/${provider}/${model}`,\n });\n }\n}\n","import type { HttpClient } from '../utils/http';\nimport type { ISynovaUploadResponse, ISynovaUploadOptions } from '../types';\n\nexport class FilesResource {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Upload files for use in prompt execution\n *\n * @param files - Array of File or Blob objects to upload\n * @param options - Upload options including projectId\n * @returns Upload response with file metadata\n *\n * @example\n * ```ts\n * // Upload files\n * const result = await client.files.upload(\n * [file1, file2],\n * { projectId: 'prj_abc123' }\n * );\n *\n * console.log('Uploaded files:', result.data);\n *\n * // Use uploaded file in prompt execution\n * const response = await client.prompts.execute('prm_abc123', {\n * provider: 'openai',\n * model: 'gpt-4o',\n * messages: [\n * {\n * role: 'user',\n * content: 'Describe this image',\n * files: [{ fileId: result.data[0].id }],\n * },\n * ],\n * });\n * ```\n */\n async upload(\n files: (File | Blob)[],\n options: ISynovaUploadOptions,\n ): Promise<ISynovaUploadResponse> {\n const formData = new FormData();\n\n for (const file of files) {\n formData.append('files', file);\n }\n\n formData.append('projectId', options.projectId);\n\n return this.http.upload<ISynovaUploadResponse>({\n path: '/api/v1/files/upload',\n formData,\n });\n }\n}\n","import type { HttpClient } from '../utils/http';\nimport type {\n ISynovaSpan,\n ISynovaCreateSpanOptions,\n ISynovaEndSpanOptions,\n TSynovaSpanType,\n} from '../types';\n\n/**\n * Options for wrapping a function with span tracking\n */\nexport interface ISynovaWrapOptions {\n /** Trace ID */\n traceId: string;\n /** Span type */\n type: TSynovaSpanType;\n /** Span name */\n name?: string;\n /** Parent span ID */\n parentSpanId?: string;\n /** Custom metadata */\n metadata?: Record<string, string>;\n}\n\n/**\n * Options for wrapping a tool function\n */\nexport interface ISynovaWrapToolOptions {\n /** Trace ID */\n traceId: string;\n /** Tool name */\n toolName: string;\n /** Parent span ID */\n parentSpanId?: string;\n /** Custom metadata */\n metadata?: Record<string, string>;\n}\n\n/**\n * Spans resource for observability\n *\n * @example\n * ```ts\n * // Manual: create and end span\n * const span = await client.spans.create('trc_123', {\n * type: 'tool',\n * toolName: 'fetch_weather',\n * toolArguments: { city: 'NYC' },\n * });\n * const result = await fetchWeather('NYC');\n * await client.spans.end(span.id, { status: 'completed', toolResult: result });\n *\n * // Wrapper: automatic span lifecycle\n * const weather = await client.spans.wrapTool(\n * { traceId: 'trc_123', toolName: 'fetch_weather' },\n * { city: 'NYC' },\n * (args) => fetchWeather(args.city),\n * );\n *\n * // Generic wrapper for custom spans\n * const result = await client.spans.wrap(\n * { traceId: 'trc_123', type: 'custom', name: 'validate' },\n * { input: data },\n * async () => validateData(data),\n * );\n * ```\n */\nexport class SpansResource {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Create a new span within a trace\n *\n * @param traceId - The trace ID to create span in\n * @param options - Span creation options\n * @returns Created span\n */\n async create(traceId: string, options: ISynovaCreateSpanOptions): Promise<ISynovaSpan> {\n const body: Record<string, unknown> = {\n type: options.type,\n };\n\n if (options.parentSpanId !== undefined) body.parentSpanId = options.parentSpanId;\n if (options.name !== undefined) body.name = options.name;\n if (options.input !== undefined) body.input = options.input;\n if (options.toolName !== undefined) body.toolName = options.toolName;\n if (options.toolArguments !== undefined) body.toolArguments = options.toolArguments;\n if (options.metadata !== undefined) body.metadata = options.metadata;\n\n return this.http.request<ISynovaSpan>({\n method: 'POST',\n path: `/api/v1/traces/${traceId}/spans`,\n body,\n });\n }\n\n /**\n * End/complete a span\n *\n * @param spanId - The span ID to end\n * @param options - Span end options\n * @returns Updated span\n */\n async end(spanId: string, options?: ISynovaEndSpanOptions): Promise<ISynovaSpan> {\n const body: Record<string, unknown> = {};\n\n if (options?.status !== undefined) body.status = options.status;\n if (options?.level !== undefined) body.level = options.level;\n if (options?.statusMessage !== undefined) body.statusMessage = options.statusMessage;\n if (options?.output !== undefined) body.output = options.output;\n if (options?.toolResult !== undefined) body.toolResult = options.toolResult;\n if (options?.durationMs !== undefined) body.durationMs = options.durationMs;\n\n return this.http.request<ISynovaSpan>({\n method: 'PATCH',\n path: `/api/v1/spans/${spanId}`,\n body,\n });\n }\n\n /**\n * Wrap an async function with automatic span tracking\n *\n * @param options - Span options (traceId, type, name, etc.)\n * @param input - Input data to record in span\n * @param fn - Async function to execute\n * @returns Result of the function\n *\n * @example\n * ```ts\n * const result = await client.spans.wrap(\n * { traceId: 'trc_123', type: 'retriever', name: 'vector_search' },\n * { query: 'how to...', topK: 5 },\n * async () => vectorDb.search(query),\n * );\n * ```\n */\n async wrap<T>(options: ISynovaWrapOptions, input: unknown, fn: () => Promise<T>): Promise<T> {\n const span = await this.create(options.traceId, {\n type: options.type,\n name: options.name,\n parentSpanId: options.parentSpanId,\n input,\n metadata: options.metadata,\n });\n\n try {\n const result = await fn();\n await this.end(span.id, {\n status: 'completed',\n output: result,\n });\n return result;\n } catch (error) {\n await this.end(span.id, {\n status: 'error',\n statusMessage: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n }\n\n /**\n * Wrap a tool function with automatic span tracking\n *\n * @param options - Tool span options (traceId, toolName, etc.)\n * @param args - Tool arguments to record\n * @param fn - Tool function to execute\n * @returns Result of the tool\n *\n * @example\n * ```ts\n * const weather = await client.spans.wrapTool(\n * { traceId: 'trc_123', toolName: 'fetch_weather', parentSpanId: 'spn_abc' },\n * { city: 'NYC' },\n * async (args) => fetchWeather(args.city),\n * );\n * ```\n */\n async wrapTool<TArgs extends Record<string, unknown>, TResult>(\n options: ISynovaWrapToolOptions,\n args: TArgs,\n fn: (args: TArgs) => Promise<TResult>,\n ): Promise<TResult> {\n const span = await this.create(options.traceId, {\n type: 'tool',\n toolName: options.toolName,\n toolArguments: args,\n parentSpanId: options.parentSpanId,\n metadata: options.metadata,\n });\n\n try {\n const result = await fn(args);\n await this.end(span.id, {\n status: 'completed',\n toolResult: result,\n });\n return result;\n } catch (error) {\n await this.end(span.id, {\n status: 'error',\n statusMessage: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n }\n}\n","import type { ISynovaConfig, ISynovaLogger } from './types';\nimport type { IRetryOptions } from './utils/http';\nimport { HttpClient } from './utils/http';\nimport { PromptsResource } from './resources/prompts';\nimport { ModelsResource } from './resources/models';\nimport { FilesResource } from './resources/files';\nimport { SpansResource } from './resources/spans';\n\nconst DEFAULT_BASE_URL = 'https://api.synova.cloud';\nconst DEFAULT_TIMEOUT = 30000;\n\nconst DEFAULT_RETRY: IRetryOptions = {\n maxRetries: 3,\n strategy: 'exponential',\n initialDelayMs: 1000,\n maxDelayMs: 30000,\n backoffMultiplier: 2,\n};\n\nconst DEFAULT_LOGGER: ISynovaLogger = {\n debug: (message, ...args) => console.debug(message, ...args),\n info: (message, ...args) => console.info(message, ...args),\n warn: (message, ...args) => console.warn(message, ...args),\n error: (messageOrError, ...args) => console.error(messageOrError, ...args),\n};\n\n/**\n * Synova Cloud SDK client\n *\n * @example\n * ```ts\n * import { SynovaCloudSdk } from '@synova-cloud/sdk';\n *\n * const client = new SynovaCloudSdk('your-api-key');\n *\n * // Get a prompt\n * const prompt = await client.prompts.get('prm_abc123');\n *\n * // Execute a prompt with direct API key\n * const result = await client.prompts.execute('prm_abc123', {\n * provider: 'openai',\n * model: 'gpt-4o',\n * apiKey: 'sk-...',\n * variables: { topic: 'TypeScript' },\n * });\n *\n * // Execute with Azure OpenAI\n * const azureResult = await client.prompts.execute('prm_abc123', {\n * provider: 'azure_openai',\n * model: 'gpt-4o',\n * apiKey: 'your-azure-key',\n * azureEndpoint: 'https://my-resource.openai.azure.com',\n * variables: { topic: 'TypeScript' },\n * });\n *\n * // List available models\n * const { providers } = await client.models.list();\n *\n * // Get models for a specific provider\n * const openaiModels = await client.models.getByProvider('openai');\n *\n * // With custom retry config\n * const clientWithRetry = new SynovaCloudSdk('your-api-key', {\n * retry: {\n * maxRetries: 5,\n * strategy: 'linear',\n * initialDelayMs: 500,\n * },\n * });\n * ```\n */\nexport class SynovaCloudSdk {\n readonly prompts: PromptsResource;\n readonly models: ModelsResource;\n readonly files: FilesResource;\n readonly spans: SpansResource;\n\n private readonly http: HttpClient;\n\n /**\n * Create a new Synova Cloud SDK client\n *\n * @param apiKey - Your Synova API key\n * @param config - Optional configuration\n */\n constructor(apiKey: string, config?: ISynovaConfig) {\n if (!apiKey) {\n throw new Error('API key is required');\n }\n\n this.http = new HttpClient({\n baseUrl: config?.baseUrl ?? DEFAULT_BASE_URL,\n apiKey,\n timeout: config?.timeout ?? DEFAULT_TIMEOUT,\n retry: {\n maxRetries: config?.retry?.maxRetries ?? DEFAULT_RETRY.maxRetries,\n strategy: config?.retry?.strategy ?? DEFAULT_RETRY.strategy,\n initialDelayMs: config?.retry?.initialDelayMs ?? DEFAULT_RETRY.initialDelayMs,\n maxDelayMs: config?.retry?.maxDelayMs ?? DEFAULT_RETRY.maxDelayMs,\n backoffMultiplier: config?.retry?.backoffMultiplier ?? DEFAULT_RETRY.backoffMultiplier,\n },\n debug: config?.debug ?? false,\n logger: config?.logger ?? DEFAULT_LOGGER,\n });\n\n this.prompts = new PromptsResource(this.http);\n this.models = new ModelsResource(this.http);\n this.files = new FilesResource(this.http);\n this.spans = new SpansResource(this.http);\n }\n}\n"]}
package/dist/index.d.cts CHANGED
@@ -350,6 +350,14 @@ interface ISynovaExecuteResponse {
350
350
  /** Span ID (for observability - individual call within trace) */
351
351
  spanId?: string;
352
352
  }
353
+ /**
354
+ * Typed execute response - returned when responseSchema is provided.
355
+ * Contains the typed object along with all metadata (usage, spans, etc.)
356
+ */
357
+ interface ISynovaTypedExecuteResponse<T> extends Omit<ISynovaExecuteResponse, 'object'> {
358
+ /** Typed structured output object */
359
+ object: T;
360
+ }
353
361
  interface ISynovaModelCapabilities {
354
362
  text_generation?: boolean;
355
363
  function_calling?: boolean;
@@ -561,14 +569,15 @@ declare class PromptsResource {
561
569
  *
562
570
  * @example
563
571
  * ```ts
564
- * // With Zod schema
572
+ * // With Zod schema - returns full response with typed object
565
573
  * const schema = z.object({ title: z.string() });
566
574
  * const result = await client.prompts.execute<z.infer<typeof schema>>('prm_abc123', {
567
575
  * provider: 'openai',
568
576
  * model: 'gpt-4o',
569
577
  * responseSchema: schema,
570
578
  * });
571
- * console.log(result.title); // Typed as string
579
+ * console.log(result.object.title); // Typed as string
580
+ * console.log(result.executionUsage); // Token usage available
572
581
  *
573
582
  * // With raw JSON Schema
574
583
  * const result = await client.prompts.execute<{ title: string }>('prm_abc123', {
@@ -576,11 +585,12 @@ declare class PromptsResource {
576
585
  * model: 'gpt-4o',
577
586
  * responseSchema: { type: 'object', properties: { title: { type: 'string' } } },
578
587
  * });
588
+ * console.log(result.object.title); // Typed
579
589
  * ```
580
590
  */
581
591
  execute<T>(promptId: string, options: ISynovaExecuteOptions & {
582
592
  responseSchema: NonNullable<ISynovaExecuteOptions['responseSchema']>;
583
- }): Promise<T>;
593
+ }): Promise<ISynovaTypedExecuteResponse<T>>;
584
594
  /**
585
595
  * Execute a prompt
586
596
  *
@@ -602,7 +612,7 @@ declare class PromptsResource {
602
612
  */
603
613
  executeByTag<T>(promptId: string, tag: string, options: ISynovaExecuteOptions & {
604
614
  responseSchema: NonNullable<ISynovaExecuteOptions['responseSchema']>;
605
- }): Promise<T>;
615
+ }): Promise<ISynovaTypedExecuteResponse<T>>;
606
616
  /**
607
617
  * Execute a prompt by tag
608
618
  */
@@ -612,7 +622,7 @@ declare class PromptsResource {
612
622
  */
613
623
  executeByVersion<T>(promptId: string, version: string, options: ISynovaExecuteOptions & {
614
624
  responseSchema: NonNullable<ISynovaExecuteOptions['responseSchema']>;
615
- }): Promise<T>;
625
+ }): Promise<ISynovaTypedExecuteResponse<T>>;
616
626
  /**
617
627
  * Execute a prompt by version
618
628
  */
@@ -1028,4 +1038,4 @@ declare class JoiAdapter implements ISchemaAdapter<IJoiSchema> {
1028
1038
  toJsonSchema(schema: IJoiSchema): IJsonSchema;
1029
1039
  }
1030
1040
 
1031
- export { ApiSynovaError, AuthSynovaError, ExecutionSynovaError, type IJsonSchema, type ISchemaAdapter, type ISynovaConfig, type ISynovaCreateSpanOptions, type ISynovaEndSpanOptions, type ISynovaExecuteOptions, type ISynovaExecuteResponse, type ISynovaExecutionError, type ISynovaExecutionErrorDetails, type ISynovaExecutionUsage, type ISynovaFileAttachment, type ISynovaFileThumbnails, type ISynovaGetPromptOptions, type ISynovaListModelsOptions, type ISynovaLogger, type ISynovaMessage, type ISynovaModel, type ISynovaModelCapabilities, type ISynovaModelLimits, type ISynovaModelPricing, type ISynovaModelsResponse, type ISynovaPrompt, type ISynovaPromptVariable, type ISynovaProvider, type ISynovaProviderResponse, type ISynovaRetryConfig, type ISynovaSpan, type ISynovaSpanData, type ISynovaToolCall, type ISynovaToolResult, type ISynovaUploadOptions, type ISynovaUploadResponse, type ISynovaUploadedFile, type ISynovaWrapOptions, type ISynovaWrapToolOptions, JoiAdapter, JsonSchemaAdapter, NetworkSynovaError, NotFoundSynovaError, RateLimitSynovaError, SchemaResolver, ServerSynovaError, SynovaCloudSdk, SynovaError, type TJsonSchemaFormat, type TJsonSchemaType, type TSchemaInput, type TSchemaType, type TSynovaMessageRole, type TSynovaModelType, type TSynovaResponseType, type TSynovaRetryStrategy, type TSynovaSpanLevel, type TSynovaSpanStatus, type TSynovaSpanType, type TSynovaUsageType, TimeoutSynovaError, YupAdapter, ZodAdapter };
1041
+ export { ApiSynovaError, AuthSynovaError, ExecutionSynovaError, type IJsonSchema, type ISchemaAdapter, type ISynovaConfig, type ISynovaCreateSpanOptions, type ISynovaEndSpanOptions, type ISynovaExecuteOptions, type ISynovaExecuteResponse, type ISynovaExecutionError, type ISynovaExecutionErrorDetails, type ISynovaExecutionUsage, type ISynovaFileAttachment, type ISynovaFileThumbnails, type ISynovaGetPromptOptions, type ISynovaListModelsOptions, type ISynovaLogger, type ISynovaMessage, type ISynovaModel, type ISynovaModelCapabilities, type ISynovaModelLimits, type ISynovaModelPricing, type ISynovaModelsResponse, type ISynovaPrompt, type ISynovaPromptVariable, type ISynovaProvider, type ISynovaProviderResponse, type ISynovaRetryConfig, type ISynovaSpan, type ISynovaSpanData, type ISynovaToolCall, type ISynovaToolResult, type ISynovaTypedExecuteResponse, type ISynovaUploadOptions, type ISynovaUploadResponse, type ISynovaUploadedFile, type ISynovaWrapOptions, type ISynovaWrapToolOptions, JoiAdapter, JsonSchemaAdapter, NetworkSynovaError, NotFoundSynovaError, RateLimitSynovaError, SchemaResolver, ServerSynovaError, SynovaCloudSdk, SynovaError, type TJsonSchemaFormat, type TJsonSchemaType, type TSchemaInput, type TSchemaType, type TSynovaMessageRole, type TSynovaModelType, type TSynovaResponseType, type TSynovaRetryStrategy, type TSynovaSpanLevel, type TSynovaSpanStatus, type TSynovaSpanType, type TSynovaUsageType, TimeoutSynovaError, YupAdapter, ZodAdapter };
package/dist/index.d.ts CHANGED
@@ -350,6 +350,14 @@ interface ISynovaExecuteResponse {
350
350
  /** Span ID (for observability - individual call within trace) */
351
351
  spanId?: string;
352
352
  }
353
+ /**
354
+ * Typed execute response - returned when responseSchema is provided.
355
+ * Contains the typed object along with all metadata (usage, spans, etc.)
356
+ */
357
+ interface ISynovaTypedExecuteResponse<T> extends Omit<ISynovaExecuteResponse, 'object'> {
358
+ /** Typed structured output object */
359
+ object: T;
360
+ }
353
361
  interface ISynovaModelCapabilities {
354
362
  text_generation?: boolean;
355
363
  function_calling?: boolean;
@@ -561,14 +569,15 @@ declare class PromptsResource {
561
569
  *
562
570
  * @example
563
571
  * ```ts
564
- * // With Zod schema
572
+ * // With Zod schema - returns full response with typed object
565
573
  * const schema = z.object({ title: z.string() });
566
574
  * const result = await client.prompts.execute<z.infer<typeof schema>>('prm_abc123', {
567
575
  * provider: 'openai',
568
576
  * model: 'gpt-4o',
569
577
  * responseSchema: schema,
570
578
  * });
571
- * console.log(result.title); // Typed as string
579
+ * console.log(result.object.title); // Typed as string
580
+ * console.log(result.executionUsage); // Token usage available
572
581
  *
573
582
  * // With raw JSON Schema
574
583
  * const result = await client.prompts.execute<{ title: string }>('prm_abc123', {
@@ -576,11 +585,12 @@ declare class PromptsResource {
576
585
  * model: 'gpt-4o',
577
586
  * responseSchema: { type: 'object', properties: { title: { type: 'string' } } },
578
587
  * });
588
+ * console.log(result.object.title); // Typed
579
589
  * ```
580
590
  */
581
591
  execute<T>(promptId: string, options: ISynovaExecuteOptions & {
582
592
  responseSchema: NonNullable<ISynovaExecuteOptions['responseSchema']>;
583
- }): Promise<T>;
593
+ }): Promise<ISynovaTypedExecuteResponse<T>>;
584
594
  /**
585
595
  * Execute a prompt
586
596
  *
@@ -602,7 +612,7 @@ declare class PromptsResource {
602
612
  */
603
613
  executeByTag<T>(promptId: string, tag: string, options: ISynovaExecuteOptions & {
604
614
  responseSchema: NonNullable<ISynovaExecuteOptions['responseSchema']>;
605
- }): Promise<T>;
615
+ }): Promise<ISynovaTypedExecuteResponse<T>>;
606
616
  /**
607
617
  * Execute a prompt by tag
608
618
  */
@@ -612,7 +622,7 @@ declare class PromptsResource {
612
622
  */
613
623
  executeByVersion<T>(promptId: string, version: string, options: ISynovaExecuteOptions & {
614
624
  responseSchema: NonNullable<ISynovaExecuteOptions['responseSchema']>;
615
- }): Promise<T>;
625
+ }): Promise<ISynovaTypedExecuteResponse<T>>;
616
626
  /**
617
627
  * Execute a prompt by version
618
628
  */
@@ -1028,4 +1038,4 @@ declare class JoiAdapter implements ISchemaAdapter<IJoiSchema> {
1028
1038
  toJsonSchema(schema: IJoiSchema): IJsonSchema;
1029
1039
  }
1030
1040
 
1031
- export { ApiSynovaError, AuthSynovaError, ExecutionSynovaError, type IJsonSchema, type ISchemaAdapter, type ISynovaConfig, type ISynovaCreateSpanOptions, type ISynovaEndSpanOptions, type ISynovaExecuteOptions, type ISynovaExecuteResponse, type ISynovaExecutionError, type ISynovaExecutionErrorDetails, type ISynovaExecutionUsage, type ISynovaFileAttachment, type ISynovaFileThumbnails, type ISynovaGetPromptOptions, type ISynovaListModelsOptions, type ISynovaLogger, type ISynovaMessage, type ISynovaModel, type ISynovaModelCapabilities, type ISynovaModelLimits, type ISynovaModelPricing, type ISynovaModelsResponse, type ISynovaPrompt, type ISynovaPromptVariable, type ISynovaProvider, type ISynovaProviderResponse, type ISynovaRetryConfig, type ISynovaSpan, type ISynovaSpanData, type ISynovaToolCall, type ISynovaToolResult, type ISynovaUploadOptions, type ISynovaUploadResponse, type ISynovaUploadedFile, type ISynovaWrapOptions, type ISynovaWrapToolOptions, JoiAdapter, JsonSchemaAdapter, NetworkSynovaError, NotFoundSynovaError, RateLimitSynovaError, SchemaResolver, ServerSynovaError, SynovaCloudSdk, SynovaError, type TJsonSchemaFormat, type TJsonSchemaType, type TSchemaInput, type TSchemaType, type TSynovaMessageRole, type TSynovaModelType, type TSynovaResponseType, type TSynovaRetryStrategy, type TSynovaSpanLevel, type TSynovaSpanStatus, type TSynovaSpanType, type TSynovaUsageType, TimeoutSynovaError, YupAdapter, ZodAdapter };
1041
+ export { ApiSynovaError, AuthSynovaError, ExecutionSynovaError, type IJsonSchema, type ISchemaAdapter, type ISynovaConfig, type ISynovaCreateSpanOptions, type ISynovaEndSpanOptions, type ISynovaExecuteOptions, type ISynovaExecuteResponse, type ISynovaExecutionError, type ISynovaExecutionErrorDetails, type ISynovaExecutionUsage, type ISynovaFileAttachment, type ISynovaFileThumbnails, type ISynovaGetPromptOptions, type ISynovaListModelsOptions, type ISynovaLogger, type ISynovaMessage, type ISynovaModel, type ISynovaModelCapabilities, type ISynovaModelLimits, type ISynovaModelPricing, type ISynovaModelsResponse, type ISynovaPrompt, type ISynovaPromptVariable, type ISynovaProvider, type ISynovaProviderResponse, type ISynovaRetryConfig, type ISynovaSpan, type ISynovaSpanData, type ISynovaToolCall, type ISynovaToolResult, type ISynovaTypedExecuteResponse, type ISynovaUploadOptions, type ISynovaUploadResponse, type ISynovaUploadedFile, type ISynovaWrapOptions, type ISynovaWrapToolOptions, JoiAdapter, JsonSchemaAdapter, NetworkSynovaError, NotFoundSynovaError, RateLimitSynovaError, SchemaResolver, ServerSynovaError, SynovaCloudSdk, SynovaError, type TJsonSchemaFormat, type TJsonSchemaType, type TSchemaInput, type TSchemaType, type TSynovaMessageRole, type TSynovaModelType, type TSynovaResponseType, type TSynovaRetryStrategy, type TSynovaSpanLevel, type TSynovaSpanStatus, type TSynovaSpanType, type TSynovaUsageType, TimeoutSynovaError, YupAdapter, ZodAdapter };
package/dist/index.js CHANGED
@@ -94,7 +94,7 @@ var ExecutionSynovaError = class extends SynovaError {
94
94
  };
95
95
 
96
96
  // src/version.ts
97
- var SDK_VERSION = "2.0.0" ;
97
+ var SDK_VERSION = "2.0.1" ;
98
98
 
99
99
  // src/utils/http.ts
100
100
  var HttpClient = class {
@@ -620,7 +620,7 @@ var PromptsResource = class {
620
620
  if (response.object === void 0) {
621
621
  throw new Error("Expected structured response but received undefined");
622
622
  }
623
- return response.object;
623
+ return response;
624
624
  }
625
625
  return response;
626
626
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors/index.ts","../src/version.ts","../src/utils/http.ts","../src/schema/adapters/zod.adapter.ts","../src/schema/adapters/yup.adapter.ts","../src/schema/adapters/joi.adapter.ts","../src/schema/adapters/json-schema.adapter.ts","../src/schema/resolver.ts","../src/resources/prompts.ts","../src/resources/models.ts","../src/resources/files.ts","../src/resources/spans.ts","../src/client.ts"],"names":[],"mappings":";;;;;;;;AAKO,IAAM,WAAA,GAAN,cAA0B,KAAA,CAAM;AAAA,EACrC,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,aAAA;AACZ,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,GAAA,CAAA,MAAA,CAAW,SAAS,CAAA;AAAA,EAClD;AACF;AAMO,IAAM,cAAA,GAAN,cAA6B,WAAA,CAAY;AAAA,EACrC,IAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EAET,YAAY,QAAA,EAA6B;AACvC,IAAA,KAAA,CAAM,SAAS,OAAO,CAAA;AACtB,IAAA,IAAA,CAAK,IAAA,GAAO,gBAAA;AACZ,IAAA,IAAA,CAAK,OAAO,QAAA,CAAS,IAAA;AACrB,IAAA,IAAA,CAAK,WAAW,QAAA,CAAS,QAAA;AACzB,IAAA,IAAA,CAAK,YAAY,QAAA,CAAS,SAAA;AAC1B,IAAA,IAAA,CAAK,YAAY,QAAA,CAAS,SAAA;AAC1B,IAAA,IAAA,CAAK,OAAO,QAAA,CAAS,IAAA;AACrB,IAAA,IAAA,CAAK,SAAS,QAAA,CAAS,MAAA;AACvB,IAAA,IAAA,CAAK,UAAU,QAAA,CAAS,OAAA;AAAA,EAC1B;AACF;AAKO,IAAM,eAAA,GAAN,cAA8B,cAAA,CAAe;AAAA,EAClD,YAAY,QAAA,EAA6B;AACvC,IAAA,KAAA,CAAM,QAAQ,CAAA;AACd,IAAA,IAAA,CAAK,IAAA,GAAO,iBAAA;AAAA,EACd;AACF;AAKO,IAAM,mBAAA,GAAN,cAAkC,cAAA,CAAe;AAAA,EACtD,YAAY,QAAA,EAA6B;AACvC,IAAA,KAAA,CAAM,QAAQ,CAAA;AACd,IAAA,IAAA,CAAK,IAAA,GAAO,qBAAA;AAAA,EACd;AACF;AAKO,IAAM,oBAAA,GAAN,cAAmC,cAAA,CAAe;AAAA,EAC9C,YAAA;AAAA,EAET,WAAA,CAAY,UAA6B,YAAA,EAAuB;AAC9D,IAAA,KAAA,CAAM,QAAQ,CAAA;AACd,IAAA,IAAA,CAAK,IAAA,GAAO,sBAAA;AACZ,IAAA,IAAA,CAAK,YAAA,GAAe,YAAA;AAAA,EACtB;AACF;AAKO,IAAM,iBAAA,GAAN,cAAgC,cAAA,CAAe;AAAA,EAC3C,SAAA,GAAqB,IAAA;AAAA,EAE9B,YAAY,QAAA,EAA6B;AACvC,IAAA,KAAA,CAAM,QAAQ,CAAA;AACd,IAAA,IAAA,CAAK,IAAA,GAAO,mBAAA;AAAA,EACd;AACF;AAKO,IAAM,kBAAA,GAAN,cAAiC,WAAA,CAAY;AAAA,EACzC,SAAA;AAAA,EAET,YAAY,SAAA,EAAmB;AAC7B,IAAA,KAAA,CAAM,CAAA,wBAAA,EAA2B,SAAS,CAAA,EAAA,CAAI,CAAA;AAC9C,IAAA,IAAA,CAAK,IAAA,GAAO,oBAAA;AACZ,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AAAA,EACnB;AACF;AAKO,IAAM,kBAAA,GAAN,cAAiC,WAAA,CAAY;AAAA,EACzC,KAAA;AAAA,EAET,WAAA,CAAY,SAAiB,KAAA,EAAe;AAC1C,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,oBAAA;AACZ,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACf;AACF;AAKO,IAAM,oBAAA,GAAN,cAAmC,WAAA,CAAY;AAAA,EAC3C,IAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,OAAA;AAAA,EAET,YAAY,KAAA,EAA8B;AACxC,IAAA,KAAA,CAAM,MAAM,OAAO,CAAA;AACnB,IAAA,IAAA,CAAK,IAAA,GAAO,sBAAA;AACZ,IAAA,IAAA,CAAK,OAAO,KAAA,CAAM,IAAA;AAClB,IAAA,IAAA,CAAK,WAAW,KAAA,CAAM,QAAA;AACtB,IAAA,IAAA,CAAK,YAAY,KAAA,CAAM,SAAA;AACvB,IAAA,IAAA,CAAK,eAAe,KAAA,CAAM,YAAA;AAC1B,IAAA,IAAA,CAAK,UAAU,KAAA,CAAM,OAAA;AAAA,EACvB;AACF;;;AC/HO,IAAM,WAAA,GAAuD,OAAA,CAAkB;;;ACuC/E,IAAM,aAAN,MAAiB;AAAA,EACL,MAAA;AAAA,EAEjB,YAAY,MAAA,EAA2B;AACrC,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA,EAEA,MAAM,QAAW,OAAA,EAAsC;AACrD,IAAA,MAAM,MAAM,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,IAAA,EAAM,QAAQ,KAAK,CAAA;AACrD,IAAA,MAAM,EAAE,UAAA,EAAW,GAAI,IAAA,CAAK,MAAA,CAAO,KAAA;AACnC,IAAA,IAAI,SAAA,GAA0B,IAAA;AAE9B,IAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,IAAW,UAAA,EAAY,OAAA,EAAA,EAAW;AACtD,MAAA,IAAI;AACF,QAAA,IAAI,UAAU,CAAA,EAAG;AACf,UAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,mBAAA,CAAoB,OAAA,EAAS,SAAS,CAAA;AACzD,UAAA,IAAA,CAAK,GAAA;AAAA,YACH,CAAA,cAAA,EAAiB,OAAO,CAAA,CAAA,EAAI,UAAU,CAAA,OAAA,EAAU,KAAK,CAAA,cAAA,EAAiB,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,QAAQ,CAAA,CAAA;AAAA,WAClG;AACA,UAAA,MAAM,IAAA,CAAK,MAAM,KAAK,CAAA;AAAA,QACxB;AAEA,QAAA,OAAO,MAAM,IAAA,CAAK,WAAA,CAAe,GAAA,EAAK,OAAO,CAAA;AAAA,MAC/C,SAAS,KAAA,EAAO;AACd,QAAA,SAAA,GAAY,KAAA;AAEZ,QAAA,IAAI,CAAC,IAAA,CAAK,WAAA,CAAY,KAAK,CAAA,EAAG;AAC5B,UAAA,MAAM,KAAA;AAAA,QACR;AAEA,QAAA,IAAI,YAAY,UAAA,EAAY;AAC1B,UAAA,MAAM,KAAA;AAAA,QACR;AAEA,QAAA,IAAA,CAAK,GAAA,CAAI,CAAA,4BAAA,EAAgC,KAAA,CAAgB,OAAO,CAAA,CAAE,CAAA;AAAA,MACpE;AAAA,IACF;AAEA,IAAA,MAAM,SAAA;AAAA,EACR;AAAA,EAEA,MAAM,OAAU,OAAA,EAAqC;AACnD,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,IAAI,CAAA;AACtC,IAAA,MAAM,EAAE,UAAA,EAAW,GAAI,IAAA,CAAK,MAAA,CAAO,KAAA;AACnC,IAAA,IAAI,SAAA,GAA0B,IAAA;AAE9B,IAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,IAAW,UAAA,EAAY,OAAA,EAAA,EAAW;AACtD,MAAA,IAAI;AACF,QAAA,IAAI,UAAU,CAAA,EAAG;AACf,UAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,mBAAA,CAAoB,OAAA,EAAS,SAAS,CAAA;AACzD,UAAA,IAAA,CAAK,GAAA;AAAA,YACH,CAAA,cAAA,EAAiB,OAAO,CAAA,CAAA,EAAI,UAAU,CAAA,OAAA,EAAU,KAAK,CAAA,cAAA,EAAiB,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,QAAQ,CAAA,CAAA;AAAA,WAClG;AACA,UAAA,MAAM,IAAA,CAAK,MAAM,KAAK,CAAA;AAAA,QACxB;AAEA,QAAA,OAAO,MAAM,IAAA,CAAK,iBAAA,CAAqB,GAAA,EAAK,QAAQ,QAAQ,CAAA;AAAA,MAC9D,SAAS,KAAA,EAAO;AACd,QAAA,SAAA,GAAY,KAAA;AAEZ,QAAA,IAAI,CAAC,IAAA,CAAK,WAAA,CAAY,KAAK,CAAA,EAAG;AAC5B,UAAA,MAAM,KAAA;AAAA,QACR;AAEA,QAAA,IAAI,YAAY,UAAA,EAAY;AAC1B,UAAA,MAAM,KAAA;AAAA,QACR;AAEA,QAAA,IAAA,CAAK,GAAA,CAAI,CAAA,2BAAA,EAA+B,KAAA,CAAgB,OAAO,CAAA,CAAE,CAAA;AAAA,MACnE;AAAA,IACF;AAEA,IAAA,MAAM,SAAA;AAAA,EACR;AAAA,EAEA,MAAc,WAAA,CAAe,GAAA,EAAa,OAAA,EAAsC;AAC9E,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,SAAA,GAAY,WAAW,MAAM,UAAA,CAAW,OAAM,EAAG,IAAA,CAAK,OAAO,OAAO,CAAA;AAE1E,IAAA,IAAA,CAAK,IAAI,CAAA,EAAG,OAAA,CAAQ,MAAM,CAAA,CAAA,EAAI,GAAG,CAAA,CAAE,CAAA;AAEnC,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,QAChC,QAAQ,OAAA,CAAQ,MAAA;AAAA,QAChB,OAAA,EAAS;AAAA,UACP,aAAA,EAAe,CAAA,OAAA,EAAU,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,CAAA;AAAA,UAC3C,cAAA,EAAgB,kBAAA;AAAA,UAChB,YAAA,EAAc,yBAAyB,WAAW,CAAA;AAAA,SACpD;AAAA,QACA,MAAM,OAAA,CAAQ,IAAA,GAAO,KAAK,SAAA,CAAU,OAAA,CAAQ,IAAI,CAAA,GAAI,KAAA,CAAA;AAAA,QACpD,QAAQ,UAAA,CAAW;AAAA,OACpB,CAAA;AAED,MAAA,YAAA,CAAa,SAAS,CAAA;AAEtB,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,IAAA,CAAK,oBAAoB,QAAQ,CAAA;AAAA,MACzC;AAEA,MAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,MAAA,IAAA,CAAK,GAAA,CAAI,CAAA,UAAA,EAAa,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AACvC,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,YAAA,CAAa,SAAS,CAAA;AAEtB,MAAA,IAAI,KAAA,YAAiB,KAAA,IAAS,KAAA,CAAM,IAAA,KAAS,YAAA,EAAc;AACzD,QAAA,MAAM,IAAI,kBAAA,CAAmB,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AAAA,MAClD;AAEA,MAAA,IACE,KAAA,YAAiB,kBACjB,KAAA,YAAiB,eAAA,IACjB,iBAAiB,mBAAA,IACjB,KAAA,YAAiB,oBAAA,IACjB,KAAA,YAAiB,iBAAA,EACjB;AACA,QAAA,MAAM,KAAA;AAAA,MACR;AAEA,MAAA,MAAM,IAAI,kBAAA;AAAA,QACR,CAAA,wBAAA,EAA4B,MAAgB,OAAO,CAAA,CAAA;AAAA,QACnD;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,iBAAA,CAAqB,GAAA,EAAa,QAAA,EAAgC;AAC9E,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,SAAA,GAAY,WAAW,MAAM,UAAA,CAAW,OAAM,EAAG,IAAA,CAAK,OAAO,OAAO,CAAA;AAE1E,IAAA,IAAA,CAAK,GAAA,CAAI,CAAA,cAAA,EAAiB,GAAG,CAAA,CAAE,CAAA;AAE/B,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,QAChC,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,aAAA,EAAe,CAAA,OAAA,EAAU,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,CAAA;AAAA,UAC3C,YAAA,EAAc,yBAAyB,WAAW,CAAA;AAAA;AAAA,SAEpD;AAAA,QACA,IAAA,EAAM,QAAA;AAAA,QACN,QAAQ,UAAA,CAAW;AAAA,OACpB,CAAA;AAED,MAAA,YAAA,CAAa,SAAS,CAAA;AAEtB,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,IAAA,CAAK,oBAAoB,QAAQ,CAAA;AAAA,MACzC;AAEA,MAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,MAAA,IAAA,CAAK,GAAA,CAAI,CAAA,UAAA,EAAa,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AACvC,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,YAAA,CAAa,SAAS,CAAA;AAEtB,MAAA,IAAI,KAAA,YAAiB,KAAA,IAAS,KAAA,CAAM,IAAA,KAAS,YAAA,EAAc;AACzD,QAAA,MAAM,IAAI,kBAAA,CAAmB,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AAAA,MAClD;AAEA,MAAA,IACE,KAAA,YAAiB,kBACjB,KAAA,YAAiB,eAAA,IACjB,iBAAiB,mBAAA,IACjB,KAAA,YAAiB,oBAAA,IACjB,KAAA,YAAiB,iBAAA,EACjB;AACA,QAAA,MAAM,KAAA;AAAA,MACR;AAEA,MAAA,MAAM,IAAI,kBAAA;AAAA,QACR,CAAA,uBAAA,EAA2B,MAAgB,OAAO,CAAA,CAAA;AAAA,QAClD;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,oBAAoB,QAAA,EAAoC;AACpE,IAAA,MAAM,SAAS,QAAA,CAAS,MAAA;AAGxB,IAAA,IAAI,SAAA,GAAsC,IAAA;AAC1C,IAAA,IAAI;AACF,MAAA,SAAA,GAAa,MAAM,SAAS,IAAA,EAAK;AAAA,IACnC,CAAA,CAAA,MAAQ;AAAA,IAER;AAGA,IAAA,MAAM,gBAAA,GAAsC;AAAA,MAC1C,IAAA,EAAM,eAAA;AAAA,MACN,QAAA,EAAU,MAAA;AAAA,MACV,SAAS,SAAA,EAAW,OAAA,IAAW,QAAQ,MAAM,CAAA,EAAA,EAAK,SAAS,UAAU,CAAA,CAAA;AAAA,MACrE,SAAA,EAAW,WAAW,SAAA,IAAa,SAAA;AAAA,MACnC,WAAW,SAAA,EAAW,SAAA,IAAA,iBAAa,IAAI,IAAA,IAAO,WAAA,EAAY;AAAA,MAC1D,MAAM,SAAA,EAAW,IAAA;AAAA,MACjB,QAAQ,SAAA,EAAW,MAAA;AAAA,MACnB,SAAS,SAAA,EAAW;AAAA,KACtB;AAEA,IAAA,MAAM,OAAO,SAAA,IAAa,gBAAA;AAE1B,IAAA,IAAI,WAAW,GAAA,EAAK;AAClB,MAAA,MAAM,IAAI,gBAAgB,IAAI,CAAA;AAAA,IAChC;AAEA,IAAA,IAAI,WAAW,GAAA,EAAK;AAClB,MAAA,MAAM,IAAI,oBAAoB,IAAI,CAAA;AAAA,IACpC;AAEA,IAAA,IAAI,WAAW,GAAA,EAAK;AAClB,MAAA,MAAM,UAAA,GAAa,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,aAAa,CAAA;AACrD,MAAA,MAAM,eAAe,UAAA,GAAa,QAAA,CAAS,UAAA,EAAY,EAAE,IAAI,GAAA,GAAO,MAAA;AACpE,MAAA,MAAM,IAAI,oBAAA,CAAqB,IAAA,EAAM,YAAY,CAAA;AAAA,IACnD;AAEA,IAAA,IAAI,UAAU,GAAA,EAAK;AACjB,MAAA,MAAM,IAAI,kBAAkB,IAAI,CAAA;AAAA,IAClC;AAEA,IAAA,MAAM,IAAI,eAAe,IAAI,CAAA;AAAA,EAC/B;AAAA,EAEQ,QAAA,CAAS,MAAc,KAAA,EAAoD;AACjF,IAAA,MAAM,MAAM,IAAI,GAAA,CAAI,IAAA,EAAM,IAAA,CAAK,OAAO,OAAO,CAAA;AAE7C,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAChD,QAAA,IAAI,UAAU,MAAA,EAAW;AACvB,UAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AAAA,QACjC;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,IAAI,QAAA,EAAS;AAAA,EACtB;AAAA,EAEQ,YAAY,KAAA,EAAyB;AAC3C,IAAA,IAAI,KAAA,YAAiB,sBAAsB,OAAO,IAAA;AAClD,IAAA,IAAI,KAAA,YAAiB,mBAAmB,OAAO,IAAA;AAC/C,IAAA,IAAI,KAAA,YAAiB,oBAAoB,OAAO,IAAA;AAChD,IAAA,IAAI,KAAA,YAAiB,oBAAoB,OAAO,IAAA;AAChD,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEQ,mBAAA,CAAoB,SAAiB,KAAA,EAA6B;AACxE,IAAA,MAAM,EAAE,QAAA,EAAU,cAAA,EAAgB,YAAY,iBAAA,EAAkB,GAAI,KAAK,MAAA,CAAO,KAAA;AAGhF,IAAA,IAAI,KAAA,YAAiB,oBAAA,IAAwB,KAAA,CAAM,YAAA,EAAc;AAC/D,MAAA,OAAO,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,YAAA,EAAc,UAAU,CAAA;AAAA,IAChD;AAEA,IAAA,IAAI,SAAA;AAEJ,IAAA,IAAI,aAAa,QAAA,EAAU;AAEzB,MAAA,SAAA,GAAY,cAAA,GAAiB,OAAA;AAAA,IAC/B,CAAA,MAAO;AAEL,MAAA,SAAA,GAAY,cAAA,GAAiB,IAAA,CAAK,GAAA,CAAI,iBAAA,EAAmB,UAAU,CAAC,CAAA;AAAA,IACtE;AAGA,IAAA,MAAM,SAAS,SAAA,GAAY,GAAA,IAAO,IAAA,CAAK,MAAA,KAAW,CAAA,GAAI,CAAA,CAAA;AACtD,IAAA,MAAM,QAAQ,SAAA,GAAY,MAAA;AAE1B,IAAA,OAAO,KAAK,GAAA,CAAI,IAAA,CAAK,IAAI,KAAA,EAAO,CAAC,GAAG,UAAU,CAAA;AAAA,EAChD;AAAA,EAEQ,MAAM,EAAA,EAA2B;AACvC,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AAAA,EACzD;AAAA,EAEQ,IAAI,OAAA,EAAuB;AACjC,IAAA,IAAI,IAAA,CAAK,OAAO,KAAA,EAAO;AACrB,MAAA,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,KAAA,CAAM,CAAA,aAAA,EAAgB,OAAO,CAAA,CAAE,CAAA;AAAA,IACpD;AAAA,EACF;AACF,CAAA;;;ACjTO,IAAM,aAAN,MAAuD;AAAA,EAC5D,UAAU,MAAA,EAAuC;AAC/C,IAAA,IAAI,OAAO,MAAA,KAAW,QAAA,IAAY,MAAA,KAAW,MAAM,OAAO,KAAA;AAE1D,IAAA,MAAM,CAAA,GAAI,MAAA;AACV,IAAA,OACE,OAAO,EAAE,IAAA,KAAS,QAAA,IAClB,EAAE,IAAA,KAAS,IAAA,IACX,OAAO,CAAA,CAAE,IAAA,CAAK,aAAa,QAAA,IAC3B,CAAA,CAAE,KAAK,QAAA,CAAS,UAAA,CAAW,KAAK,CAAA,IAChC,OAAO,EAAE,SAAA,KAAc,UAAA;AAAA,EAE3B;AAAA,EAEA,aAAa,MAAA,EAAiC;AAC5C,IAAA,IAAI;AAEF,MAAA,MAAM,EAAE,eAAA,EAAgB,GAAI,SAAA,CAAQ,oBAAoB,CAAA;AACxD,MAAA,MAAM,MAAA,GAAS,EAAE,GAAG,eAAA,CAAgB,QAAQ,EAAE,YAAA,EAAc,MAAA,EAAQ,CAAA,EAAE;AACtE,MAAA,OAAO,MAAA,CAAO,OAAA;AACd,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,IAAK,KAAA,CAAgC,SAAS,kBAAA,EAAoB;AAChE,QAAA,MAAM,IAAI,KAAA;AAAA,UACR;AAAA,SACF;AAAA,MACF;AACA,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,8BAAA,EAAkC,KAAA,CAAgB,OAAO,CAAA,CAAE,CAAA;AAAA,IAC7E;AAAA,EACF;AACF;;;AC7BO,IAAM,aAAN,MAAuD;AAAA,EAC5D,UAAU,MAAA,EAAuC;AAC/C,IAAA,IAAI,OAAO,MAAA,KAAW,QAAA,IAAY,MAAA,KAAW,MAAM,OAAO,KAAA;AAC1D,IAAA,OAAQ,OAAsB,eAAA,KAAoB,IAAA;AAAA,EACpD;AAAA,EAEA,aAAa,MAAA,EAAiC;AAC5C,IAAA,IAAI;AAEF,MAAA,MAAM,EAAE,aAAA,EAAc,GAAI,SAAA,CAAQ,4BAA4B,CAAA;AAC9D,MAAA,OAAO,cAAc,MAAM,CAAA;AAAA,IAC7B,SAAS,KAAA,EAAO;AACd,MAAA,IAAK,KAAA,CAAgC,SAAS,kBAAA,EAAoB;AAChE,QAAA,MAAM,IAAI,KAAA;AAAA,UACR;AAAA,SACF;AAAA,MACF;AACA,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,8BAAA,EAAkC,KAAA,CAAgB,OAAO,CAAA,CAAE,CAAA;AAAA,IAC7E;AAAA,EACF;AACF;;;ACpBO,IAAM,aAAN,MAAuD;AAAA,EAC5D,UAAU,MAAA,EAAuC;AAC/C,IAAA,IAAI,OAAO,MAAA,KAAW,QAAA,IAAY,MAAA,KAAW,MAAM,OAAO,KAAA;AAE1D,IAAA,IAAI;AAEF,MAAA,MAAM,EAAE,QAAA,EAAS,GAAI,SAAA,CAAQ,KAAK,CAAA;AAClC,MAAA,OAAO,SAAS,MAAM,CAAA;AAAA,IACxB,CAAA,CAAA,MAAQ;AAEN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,aAAa,MAAA,EAAiC;AAC5C,IAAA,IAAI;AAEF,MAAA,MAAM,SAAA,GAAY,UAAQ,aAAa,CAAA;AACvC,MAAA,OAAO,UAAU,MAAM,CAAA;AAAA,IACzB,SAAS,KAAA,EAAO;AACd,MAAA,IAAK,KAAA,CAAgC,SAAS,kBAAA,EAAoB;AAChE,QAAA,MAAM,IAAI,KAAA;AAAA,UACR;AAAA,SACF;AAAA,MACF;AACA,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,8BAAA,EAAkC,KAAA,CAAgB,OAAO,CAAA,CAAE,CAAA;AAAA,IAC7E;AAAA,EACF;AACF;;;ACrCO,IAAM,iBAAA,GAAN,MAAM,kBAAA,CAAyD;AAAA,EACpE,OAAwB,uBAAA,GAA0B;AAAA,IAChD,QAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA;AAAA,IACA,SAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF;AAAA,EAEA,UAAU,MAAA,EAAwC;AAChD,IAAA,IAAI,OAAO,MAAA,KAAW,QAAA,IAAY,MAAA,KAAW,IAAA,EAAM;AACjD,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,MAAM,GAAA,GAAM,MAAA;AAGZ,IAAA,IAAI,UAAU,GAAA,EAAK;AACjB,MAAA,MAAM,OAAO,GAAA,CAAI,IAAA;AACjB,MAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,mBAAkB,uBAAA,CAAwB,QAAA,CAAS,IAAI,CAAA,EAAG;AACxF,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,IACE,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,IAClB,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,KAAM,kBAAA,CAAkB,uBAAA,CAAwB,QAAA,CAAS,CAAC,CAAC,CAAA,EACvE;AACA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF;AAGA,IAAA,IACE,YAAA,IAAgB,GAAA,IAChB,OAAO,GAAA,CAAI,eAAe,QAAA,IAC1B,GAAA,CAAI,UAAA,KAAe,IAAA,IACnB,CAAC,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,UAAU,CAAA,EAC7B;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,IACE,OAAA,IAAW,GAAA,IACX,OAAO,GAAA,CAAI,UAAU,QAAA,IACrB,GAAA,CAAI,KAAA,KAAU,IAAA,IACd,CAAC,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAA,EACxB;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,IAAI,WAAW,GAAA,IAAO,KAAA,CAAM,QAAQ,GAAA,CAAI,KAAK,GAAG,OAAO,IAAA;AACvD,IAAA,IAAI,WAAW,GAAA,IAAO,KAAA,CAAM,QAAQ,GAAA,CAAI,KAAK,GAAG,OAAO,IAAA;AACvD,IAAA,IAAI,WAAW,GAAA,IAAO,KAAA,CAAM,QAAQ,GAAA,CAAI,KAAK,GAAG,OAAO,IAAA;AAGvD,IAAA,IAAI,UAAU,GAAA,IAAO,KAAA,CAAM,QAAQ,GAAA,CAAI,IAAI,GAAG,OAAO,IAAA;AAErD,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,aAAa,MAAA,EAAkC;AAC7C,IAAA,OAAO,IAAA,CAAK,kBAAkB,MAAM,CAAA;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkB,MAAA,EAAkC;AAC1D,IAAA,MAAM,MAAA,GAAsB,EAAE,GAAG,MAAA,EAAO;AACxC,IAAA,MAAM,kBAAA,GAAqB,MAAA;AAG3B,IAAA,IAAI,kBAAA,CAAmB,QAAA,KAAa,IAAA,IAAQ,MAAA,CAAO,IAAA,EAAM;AACvD,MAAA,IAAI,OAAO,MAAA,CAAO,IAAA,KAAS,QAAA,EAAU;AACnC,QAAA,MAAA,CAAO,IAAA,GAAO,CAAC,MAAA,CAAO,IAAA,EAAM,MAAM,CAAA;AAAA,MACpC,CAAA,MAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,IAAI,CAAA,IAAK,CAAC,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,EAAG;AACtE,QAAA,MAAA,CAAO,IAAA,GAAO,CAAC,GAAG,MAAA,CAAO,MAAM,MAAM,CAAA;AAAA,MACvC;AAEA,MAAA,OAAQ,MAAA,CAAgD,QAAA;AAAA,IAC1D;AAGA,IAAA,IAAI,OAAO,UAAA,EAAY;AACrB,MAAA,MAAA,CAAO,aAAa,MAAA,CAAO,WAAA;AAAA,QACzB,MAAA,CAAO,OAAA,CAAQ,MAAA,CAAO,UAAU,CAAA,CAAE,IAAI,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AAAA,UACtD,GAAA;AAAA,UACA,IAAA,CAAK,kBAAkB,KAAK;AAAA,SAC7B;AAAA,OACH;AAAA,IACF;AAEA,IAAA,IAAI,OAAO,KAAA,EAAO;AAChB,MAAA,MAAA,CAAO,KAAA,GAAQ,IAAA,CAAK,iBAAA,CAAkB,MAAA,CAAO,KAAK,CAAA;AAAA,IACpD;AAEA,IAAA,IAAI,MAAA,CAAO,oBAAA,IAAwB,OAAO,MAAA,CAAO,yBAAyB,QAAA,EAAU;AAClF,MAAA,MAAA,CAAO,oBAAA,GAAuB,IAAA,CAAK,iBAAA,CAAkB,MAAA,CAAO,oBAAoB,CAAA;AAAA,IAClF;AAEA,IAAA,IAAI,OAAO,KAAA,EAAO;AAChB,MAAA,MAAA,CAAO,KAAA,GAAQ,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,IAAA,CAAK,iBAAA,CAAkB,CAAC,CAAC,CAAA;AAAA,IAClE;AAEA,IAAA,IAAI,OAAO,KAAA,EAAO;AAChB,MAAA,MAAA,CAAO,KAAA,GAAQ,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,IAAA,CAAK,iBAAA,CAAkB,CAAC,CAAC,CAAA;AAAA,IAClE;AAEA,IAAA,IAAI,OAAO,KAAA,EAAO;AAChB,MAAA,MAAA,CAAO,KAAA,GAAQ,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,IAAA,CAAK,iBAAA,CAAkB,CAAC,CAAC,CAAA;AAAA,IAClE;AAEA,IAAA,IAAI,OAAO,GAAA,EAAK;AACd,MAAA,MAAA,CAAO,GAAA,GAAM,IAAA,CAAK,iBAAA,CAAkB,MAAA,CAAO,GAAG,CAAA;AAAA,IAChD;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AACF;;;AC/EO,IAAM,iBAAN,MAAqB;AAAA,EAC1B,OAAe,QAAA,GAA6B;AAAA;AAAA,IAE1C,IAAI,UAAA,EAAW;AAAA,IACf,IAAI,UAAA,EAAW;AAAA,IACf,IAAI,UAAA,EAAW;AAAA,IACf,IAAI,iBAAA;AAAkB,GACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,OAAO,eAAA,CAAgB,OAAA,EAAyB,QAAA,GAA6B,OAAA,EAAe;AAC1F,IAAA,IAAI,aAAa,OAAA,EAAS;AACxB,MAAA,IAAA,CAAK,QAAA,CAAS,QAAQ,OAAO,CAAA;AAAA,IAC/B,CAAA,MAAO;AAEL,MAAA,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,EAAA,EAAI,CAAA,EAAG,OAAO,CAAA;AAAA,IACrC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,aAAA,GAAsB;AAC3B,IAAA,IAAA,CAAK,QAAA,GAAW,CAAC,IAAI,UAAA,EAAW,EAAG,IAAI,UAAA,EAAW,EAAG,IAAI,UAAA,EAAW,EAAG,IAAI,mBAAmB,CAAA;AAAA,EAChG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA4BA,OAAO,QAAQ,MAAA,EAAmC;AAChD,IAAA,KAAA,MAAW,OAAA,IAAW,KAAK,QAAA,EAAU;AACnC,MAAA,IAAI,OAAA,CAAQ,SAAA,CAAU,MAAM,CAAA,EAAG;AAC7B,QAAA,OAAO,OAAA,CAAQ,aAAa,MAAM,CAAA;AAAA,MACpC;AAAA,IACF;AAEA,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,YAAY,MAAA,EAA0B;AAC3C,IAAA,OAAO,IAAA,CAAK,SAAS,IAAA,CAAK,CAAC,YAAY,OAAA,CAAQ,SAAA,CAAU,MAAM,CAAC,CAAA;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,cAAc,MAAA,EAA8B;AACjD,IAAA,MAAM,WAAW,IAAA,CAAK,QAAA;AAEtB,IAAA,IAAI,QAAA,CAAS,CAAC,CAAA,CAAE,SAAA,CAAU,MAAM,CAAA,EAAG;AACjC,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,IAAI,QAAA,CAAS,CAAC,CAAA,CAAE,SAAA,CAAU,MAAM,CAAA,EAAG;AACjC,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,IAAI,QAAA,CAAS,CAAC,CAAA,CAAE,SAAA,CAAU,MAAM,CAAA,EAAG;AACjC,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,IAAI,QAAA,CAAS,CAAC,CAAA,CAAE,SAAA,CAAU,MAAM,CAAA,EAAG;AACjC,MAAA,OAAO,aAAA;AAAA,IACT;AAEA,IAAA,OAAO,SAAA;AAAA,EACT;AACF;;;ACrJO,IAAM,kBAAN,MAAsB;AAAA,EAC3B,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA;AAAA;AAAA;AAAA,EAKhD,MAAM,GAAA,CAAI,QAAA,EAAkB,OAAA,EAA2D;AACrF,IAAA,IAAI,SAAS,OAAA,EAAS;AACpB,MAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAuB;AAAA,QACtC,MAAA,EAAQ,KAAA;AAAA,QACR,IAAA,EAAM,CAAA,gBAAA,EAAmB,QAAQ,CAAA,UAAA,EAAa,QAAQ,OAAO,CAAA;AAAA,OAC9D,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,GAAA,GAAM,SAAS,GAAA,IAAO,QAAA;AAC5B,IAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,MAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAuB;AAAA,QACtC,MAAA,EAAQ,KAAA;AAAA,QACR,IAAA,EAAM,mBAAmB,QAAQ,CAAA;AAAA,OAClC,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAuB;AAAA,MACtC,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM,CAAA,gBAAA,EAAmB,QAAQ,CAAA,MAAA,EAAS,GAAG,CAAA;AAAA,KAC9C,CAAA;AAAA,EACH;AAAA,EAgDA,MAAM,OAAA,CACJ,QAAA,EACA,OAAA,EACqC;AACrC,IAAA,MAAM,IAAA,GAAgC;AAAA,MACpC,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,OAAO,OAAA,CAAQ;AAAA,KACjB;AAEA,IAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,MAAA,EAAW,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AACxD,IAAA,IAAI,OAAA,CAAQ,aAAA,KAAkB,MAAA,EAAW,IAAA,CAAK,gBAAgB,OAAA,CAAQ,aAAA;AACtE,IAAA,IAAI,OAAA,CAAQ,SAAA,KAAc,MAAA,EAAW,IAAA,CAAK,YAAY,OAAA,CAAQ,SAAA;AAC9D,IAAA,IAAI,OAAA,CAAQ,QAAA,KAAa,MAAA,EAAW,IAAA,CAAK,WAAW,OAAA,CAAQ,QAAA;AAC5D,IAAA,IAAI,OAAA,CAAQ,GAAA,KAAQ,MAAA,EAAW,IAAA,CAAK,MAAM,OAAA,CAAQ,GAAA;AAClD,IAAA,IAAI,OAAA,CAAQ,OAAA,KAAY,MAAA,EAAW,IAAA,CAAK,UAAU,OAAA,CAAQ,OAAA;AAC1D,IAAA,IAAI,OAAA,CAAQ,QAAA,KAAa,MAAA,EAAW,IAAA,CAAK,WAAW,OAAA,CAAQ,QAAA;AAC5D,IAAA,IAAI,OAAA,CAAQ,UAAA,KAAe,MAAA,EAAW,IAAA,CAAK,aAAa,OAAA,CAAQ,UAAA;AAChE,IAAA,IAAI,OAAA,CAAQ,SAAA,KAAc,MAAA,EAAW,IAAA,CAAK,YAAY,OAAA,CAAQ,SAAA;AAG9D,IAAA,IAAI,OAAA,CAAQ,mBAAmB,MAAA,EAAW;AACxC,MAAA,IAAA,CAAK,cAAA,GAAiB,cAAA,CAAe,OAAA,CAAQ,OAAA,CAAQ,cAAc,CAAA;AAAA,IACrE;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,OAAA,CAAgC;AAAA,MAC/D,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,mBAAmB,QAAQ,CAAA,IAAA,CAAA;AAAA,MACjC;AAAA,KACD,CAAA;AAGD,IAAA,IAAI,QAAA,CAAS,IAAA,KAAS,OAAA,IAAW,QAAA,CAAS,KAAA,EAAO;AAC/C,MAAA,MAAM,IAAI,oBAAA,CAAqB,QAAA,CAAS,KAAK,CAAA;AAAA,IAC/C;AAGA,IAAA,IAAI,OAAA,CAAQ,mBAAmB,MAAA,EAAW;AACxC,MAAA,IAAI,QAAA,CAAS,WAAW,MAAA,EAAW;AACjC,QAAA,MAAM,IAAI,MAAM,qDAAqD,CAAA;AAAA,MACvE;AACA,MAAA,OAAO,QAAA,CAAS,MAAA;AAAA,IAClB;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAsBA,MAAM,YAAA,CACJ,QAAA,EACA,GAAA,EACA,OAAA,EACqC;AACrC,IAAA,OAAO,KAAK,OAAA,CAAQ,QAAA,EAAU,EAAE,GAAG,OAAA,EAAS,KAAK,CAAA;AAAA,EACnD;AAAA,EAsBA,MAAM,gBAAA,CACJ,QAAA,EACA,OAAA,EACA,OAAA,EACqC;AACrC,IAAA,OAAO,KAAK,OAAA,CAAQ,QAAA,EAAU,EAAE,GAAG,OAAA,EAAS,SAAS,CAAA;AAAA,EACvD;AACF,CAAA;;;AClLO,IAAM,iBAAN,MAAqB;AAAA,EAC1B,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAyBhD,MAAM,KAAK,OAAA,EAAoE;AAC7E,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAA+B;AAAA,MAC9C,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM,gBAAA;AAAA,MACN,KAAA,EAAO;AAAA,QACL,MAAM,OAAA,EAAS,IAAA;AAAA,QACf,YAAY,OAAA,EAAS,UAAA;AAAA,QACrB,UAAU,OAAA,EAAS;AAAA;AACrB,KACD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,cAAc,QAAA,EAA2C;AAC7D,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,OAAA,CAAiC;AAAA,MAChE,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM,kBAAkB,QAAQ,CAAA;AAAA,KACjC,CAAA;AACD,IAAA,OAAO,QAAA,CAAS,MAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,MAAM,GAAA,CAAI,QAAA,EAAkB,KAAA,EAAsC;AAChE,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAsB;AAAA,MACrC,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM,CAAA,eAAA,EAAkB,QAAQ,CAAA,CAAA,EAAI,KAAK,CAAA;AAAA,KAC1C,CAAA;AAAA,EACH;AACF,CAAA;;;ACjFO,IAAM,gBAAN,MAAoB;AAAA,EACzB,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiChD,MAAM,MAAA,CACJ,KAAA,EACA,OAAA,EACgC;AAChC,IAAA,MAAM,QAAA,GAAW,IAAI,QAAA,EAAS;AAE9B,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,QAAA,CAAS,MAAA,CAAO,SAAS,IAAI,CAAA;AAAA,IAC/B;AAEA,IAAA,QAAA,CAAS,MAAA,CAAO,WAAA,EAAa,OAAA,CAAQ,SAAS,CAAA;AAE9C,IAAA,OAAO,IAAA,CAAK,KAAK,MAAA,CAA8B;AAAA,MAC7C,IAAA,EAAM,sBAAA;AAAA,MACN;AAAA,KACD,CAAA;AAAA,EACH;AACF,CAAA;;;ACaO,IAAM,gBAAN,MAAoB;AAAA,EACzB,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAShD,MAAM,MAAA,CAAO,OAAA,EAAiB,OAAA,EAAyD;AACrF,IAAA,MAAM,IAAA,GAAgC;AAAA,MACpC,MAAM,OAAA,CAAQ;AAAA,KAChB;AAEA,IAAA,IAAI,OAAA,CAAQ,YAAA,KAAiB,MAAA,EAAW,IAAA,CAAK,eAAe,OAAA,CAAQ,YAAA;AACpE,IAAA,IAAI,OAAA,CAAQ,IAAA,KAAS,MAAA,EAAW,IAAA,CAAK,OAAO,OAAA,CAAQ,IAAA;AACpD,IAAA,IAAI,OAAA,CAAQ,KAAA,KAAU,MAAA,EAAW,IAAA,CAAK,QAAQ,OAAA,CAAQ,KAAA;AACtD,IAAA,IAAI,OAAA,CAAQ,QAAA,KAAa,MAAA,EAAW,IAAA,CAAK,WAAW,OAAA,CAAQ,QAAA;AAC5D,IAAA,IAAI,OAAA,CAAQ,aAAA,KAAkB,MAAA,EAAW,IAAA,CAAK,gBAAgB,OAAA,CAAQ,aAAA;AACtE,IAAA,IAAI,OAAA,CAAQ,QAAA,KAAa,MAAA,EAAW,IAAA,CAAK,WAAW,OAAA,CAAQ,QAAA;AAE5D,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAqB;AAAA,MACpC,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,kBAAkB,OAAO,CAAA,MAAA,CAAA;AAAA,MAC/B;AAAA,KACD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,GAAA,CAAI,MAAA,EAAgB,OAAA,EAAuD;AAC/E,IAAA,MAAM,OAAgC,EAAC;AAEvC,IAAA,IAAI,OAAA,EAAS,MAAA,KAAW,MAAA,EAAW,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AACzD,IAAA,IAAI,OAAA,EAAS,KAAA,KAAU,MAAA,EAAW,IAAA,CAAK,QAAQ,OAAA,CAAQ,KAAA;AACvD,IAAA,IAAI,OAAA,EAAS,aAAA,KAAkB,MAAA,EAAW,IAAA,CAAK,gBAAgB,OAAA,CAAQ,aAAA;AACvE,IAAA,IAAI,OAAA,EAAS,MAAA,KAAW,MAAA,EAAW,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AACzD,IAAA,IAAI,OAAA,EAAS,UAAA,KAAe,MAAA,EAAW,IAAA,CAAK,aAAa,OAAA,CAAQ,UAAA;AACjE,IAAA,IAAI,OAAA,EAAS,UAAA,KAAe,MAAA,EAAW,IAAA,CAAK,aAAa,OAAA,CAAQ,UAAA;AAEjE,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAqB;AAAA,MACpC,MAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAM,iBAAiB,MAAM,CAAA,CAAA;AAAA,MAC7B;AAAA,KACD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,MAAM,IAAA,CAAQ,OAAA,EAA6B,KAAA,EAAgB,EAAA,EAAkC;AAC3F,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,QAAQ,OAAA,EAAS;AAAA,MAC9C,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,cAAc,OAAA,CAAQ,YAAA;AAAA,MACtB,KAAA;AAAA,MACA,UAAU,OAAA,CAAQ;AAAA,KACnB,CAAA;AAED,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,EAAA,EAAG;AACxB,MAAA,MAAM,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,EAAA,EAAI;AAAA,QACtB,MAAA,EAAQ,WAAA;AAAA,QACR,MAAA,EAAQ;AAAA,OACT,CAAA;AACD,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,EAAA,EAAI;AAAA,QACtB,MAAA,EAAQ,OAAA;AAAA,QACR,eAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,OACrE,CAAA;AACD,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,MAAM,QAAA,CACJ,OAAA,EACA,IAAA,EACA,EAAA,EACkB;AAClB,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,QAAQ,OAAA,EAAS;AAAA,MAC9C,IAAA,EAAM,MAAA;AAAA,MACN,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,aAAA,EAAe,IAAA;AAAA,MACf,cAAc,OAAA,CAAQ,YAAA;AAAA,MACtB,UAAU,OAAA,CAAQ;AAAA,KACnB,CAAA;AAED,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,EAAA,CAAG,IAAI,CAAA;AAC5B,MAAA,MAAM,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,EAAA,EAAI;AAAA,QACtB,MAAA,EAAQ,WAAA;AAAA,QACR,UAAA,EAAY;AAAA,OACb,CAAA;AACD,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,EAAA,EAAI;AAAA,QACtB,MAAA,EAAQ,OAAA;AAAA,QACR,eAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,OACrE,CAAA;AACD,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AACF,CAAA;;;ACvMA,IAAM,gBAAA,GAAmB,0BAAA;AACzB,IAAM,eAAA,GAAkB,GAAA;AAExB,IAAM,aAAA,GAA+B;AAAA,EACnC,UAAA,EAAY,CAAA;AAAA,EACZ,QAAA,EAAU,aAAA;AAAA,EACV,cAAA,EAAgB,GAAA;AAAA,EAChB,UAAA,EAAY,GAAA;AAAA,EACZ,iBAAA,EAAmB;AACrB,CAAA;AAEA,IAAM,cAAA,GAAgC;AAAA,EACpC,KAAA,EAAO,CAAC,OAAA,EAAA,GAAY,IAAA,KAAS,QAAQ,KAAA,CAAM,OAAA,EAAS,GAAG,IAAI,CAAA;AAAA,EAC3D,IAAA,EAAM,CAAC,OAAA,EAAA,GAAY,IAAA,KAAS,QAAQ,IAAA,CAAK,OAAA,EAAS,GAAG,IAAI,CAAA;AAAA,EACzD,IAAA,EAAM,CAAC,OAAA,EAAA,GAAY,IAAA,KAAS,QAAQ,IAAA,CAAK,OAAA,EAAS,GAAG,IAAI,CAAA;AAAA,EACzD,KAAA,EAAO,CAAC,cAAA,EAAA,GAAmB,IAAA,KAAS,QAAQ,KAAA,CAAM,cAAA,EAAgB,GAAG,IAAI;AAC3E,CAAA;AA+CO,IAAM,iBAAN,MAAqB;AAAA,EACjB,OAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EAEQ,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQjB,WAAA,CAAY,QAAgB,MAAA,EAAwB;AAClD,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,MAAM,qBAAqB,CAAA;AAAA,IACvC;AAEA,IAAA,IAAA,CAAK,IAAA,GAAO,IAAI,UAAA,CAAW;AAAA,MACzB,OAAA,EAAS,QAAQ,OAAA,IAAW,gBAAA;AAAA,MAC5B,MAAA;AAAA,MACA,OAAA,EAAS,QAAQ,OAAA,IAAW,eAAA;AAAA,MAC5B,KAAA,EAAO;AAAA,QACL,UAAA,EAAY,MAAA,EAAQ,KAAA,EAAO,UAAA,IAAc,aAAA,CAAc,UAAA;AAAA,QACvD,QAAA,EAAU,MAAA,EAAQ,KAAA,EAAO,QAAA,IAAY,aAAA,CAAc,QAAA;AAAA,QACnD,cAAA,EAAgB,MAAA,EAAQ,KAAA,EAAO,cAAA,IAAkB,aAAA,CAAc,cAAA;AAAA,QAC/D,UAAA,EAAY,MAAA,EAAQ,KAAA,EAAO,UAAA,IAAc,aAAA,CAAc,UAAA;AAAA,QACvD,iBAAA,EAAmB,MAAA,EAAQ,KAAA,EAAO,iBAAA,IAAqB,aAAA,CAAc;AAAA,OACvE;AAAA,MACA,KAAA,EAAO,QAAQ,KAAA,IAAS,KAAA;AAAA,MACxB,MAAA,EAAQ,QAAQ,MAAA,IAAU;AAAA,KAC3B,CAAA;AAED,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA;AAC5C,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,cAAA,CAAe,IAAA,CAAK,IAAI,CAAA;AAC1C,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,aAAA,CAAc,IAAA,CAAK,IAAI,CAAA;AACxC,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,aAAA,CAAc,IAAA,CAAK,IAAI,CAAA;AAAA,EAC1C;AACF","file":"index.js","sourcesContent":["import type { IApiErrorResponse, ISynovaExecutionError } from '../types';\n\n/**\n * Base error class for all Synova SDK errors\n */\nexport class SynovaError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'SynovaError';\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * Error thrown when API returns an error response.\n * Base class for all API-related errors.\n */\nexport class ApiSynovaError extends SynovaError {\n readonly code: string;\n readonly httpCode: number;\n readonly requestId: string;\n readonly timestamp: string;\n readonly path?: string;\n readonly method?: string;\n readonly details?: unknown;\n\n constructor(response: IApiErrorResponse) {\n super(response.message);\n this.name = 'ApiSynovaError';\n this.code = response.code;\n this.httpCode = response.httpCode;\n this.requestId = response.requestId;\n this.timestamp = response.timestamp;\n this.path = response.path;\n this.method = response.method;\n this.details = response.details;\n }\n}\n\n/**\n * Error thrown when authentication fails (401)\n */\nexport class AuthSynovaError extends ApiSynovaError {\n constructor(response: IApiErrorResponse) {\n super(response);\n this.name = 'AuthSynovaError';\n }\n}\n\n/**\n * Error thrown when resource is not found (404)\n */\nexport class NotFoundSynovaError extends ApiSynovaError {\n constructor(response: IApiErrorResponse) {\n super(response);\n this.name = 'NotFoundSynovaError';\n }\n}\n\n/**\n * Error thrown when rate limit is exceeded (429)\n */\nexport class RateLimitSynovaError extends ApiSynovaError {\n readonly retryAfterMs?: number;\n\n constructor(response: IApiErrorResponse, retryAfterMs?: number) {\n super(response);\n this.name = 'RateLimitSynovaError';\n this.retryAfterMs = retryAfterMs;\n }\n}\n\n/**\n * Error thrown when server returns 5xx error\n */\nexport class ServerSynovaError extends ApiSynovaError {\n readonly retryable: boolean = true;\n\n constructor(response: IApiErrorResponse) {\n super(response);\n this.name = 'ServerSynovaError';\n }\n}\n\n/**\n * Error thrown when request times out (client-side)\n */\nexport class TimeoutSynovaError extends SynovaError {\n readonly timeoutMs: number;\n\n constructor(timeoutMs: number) {\n super(`Request timed out after ${timeoutMs}ms`);\n this.name = 'TimeoutSynovaError';\n this.timeoutMs = timeoutMs;\n }\n}\n\n/**\n * Error thrown when network request fails (client-side)\n */\nexport class NetworkSynovaError extends SynovaError {\n readonly cause?: Error;\n\n constructor(message: string, cause?: Error) {\n super(message);\n this.name = 'NetworkSynovaError';\n this.cause = cause;\n }\n}\n\n/**\n * Error thrown when LLM execution fails (returned in response with type='error')\n */\nexport class ExecutionSynovaError extends SynovaError {\n readonly code: string;\n readonly provider?: string;\n readonly retryable: boolean;\n readonly retryAfterMs?: number;\n readonly details?: ISynovaExecutionError['details'];\n\n constructor(error: ISynovaExecutionError) {\n super(error.message);\n this.name = 'ExecutionSynovaError';\n this.code = error.code;\n this.provider = error.provider;\n this.retryable = error.retryable;\n this.retryAfterMs = error.retryAfterMs;\n this.details = error.details;\n }\n}\n","declare const __SDK_VERSION__: string;\n\nexport const SDK_VERSION = typeof __SDK_VERSION__ !== 'undefined' ? __SDK_VERSION__ : 'dev';\n","import type { IApiErrorResponse, ISynovaLogger, TSynovaRetryStrategy } from '../types';\nimport {\n ApiSynovaError,\n AuthSynovaError,\n NetworkSynovaError,\n NotFoundSynovaError,\n RateLimitSynovaError,\n ServerSynovaError,\n TimeoutSynovaError,\n} from '../errors';\nimport { SDK_VERSION } from '../version';\n\nexport interface IRetryOptions {\n maxRetries: number;\n strategy: TSynovaRetryStrategy;\n initialDelayMs: number;\n maxDelayMs: number;\n backoffMultiplier: number;\n}\n\nexport interface IHttpClientConfig {\n baseUrl: string;\n apiKey: string;\n timeout: number;\n retry: IRetryOptions;\n debug: boolean;\n logger: ISynovaLogger;\n}\n\nexport interface IRequestOptions {\n method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n path: string;\n body?: unknown;\n query?: Record<string, string | undefined>;\n}\n\nexport interface IUploadOptions {\n path: string;\n formData: FormData;\n}\n\nexport class HttpClient {\n private readonly config: IHttpClientConfig;\n\n constructor(config: IHttpClientConfig) {\n this.config = config;\n }\n\n async request<T>(options: IRequestOptions): Promise<T> {\n const url = this.buildUrl(options.path, options.query);\n const { maxRetries } = this.config.retry;\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n if (attempt > 0) {\n const delay = this.calculateRetryDelay(attempt, lastError);\n this.log(\n `Retry attempt ${attempt}/${maxRetries} after ${delay}ms (strategy: ${this.config.retry.strategy})`,\n );\n await this.sleep(delay);\n }\n\n return await this.makeRequest<T>(url, options);\n } catch (error) {\n lastError = error as Error;\n\n if (!this.isRetryable(error)) {\n throw error;\n }\n\n if (attempt === maxRetries) {\n throw error;\n }\n\n this.log(`Request failed, will retry: ${(error as Error).message}`);\n }\n }\n\n throw lastError;\n }\n\n async upload<T>(options: IUploadOptions): Promise<T> {\n const url = this.buildUrl(options.path);\n const { maxRetries } = this.config.retry;\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n if (attempt > 0) {\n const delay = this.calculateRetryDelay(attempt, lastError);\n this.log(\n `Retry attempt ${attempt}/${maxRetries} after ${delay}ms (strategy: ${this.config.retry.strategy})`,\n );\n await this.sleep(delay);\n }\n\n return await this.makeUploadRequest<T>(url, options.formData);\n } catch (error) {\n lastError = error as Error;\n\n if (!this.isRetryable(error)) {\n throw error;\n }\n\n if (attempt === maxRetries) {\n throw error;\n }\n\n this.log(`Upload failed, will retry: ${(error as Error).message}`);\n }\n }\n\n throw lastError;\n }\n\n private async makeRequest<T>(url: string, options: IRequestOptions): Promise<T> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\n\n this.log(`${options.method} ${url}`);\n\n try {\n const response = await fetch(url, {\n method: options.method,\n headers: {\n Authorization: `Bearer ${this.config.apiKey}`,\n 'Content-Type': 'application/json',\n 'User-Agent': `synova-cloud-sdk-node/${SDK_VERSION}`,\n },\n body: options.body ? JSON.stringify(options.body) : undefined,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n await this.handleErrorResponse(response);\n }\n\n const data = (await response.json()) as T;\n this.log(`Response: ${response.status}`);\n return data;\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof Error && error.name === 'AbortError') {\n throw new TimeoutSynovaError(this.config.timeout);\n }\n\n if (\n error instanceof ApiSynovaError ||\n error instanceof AuthSynovaError ||\n error instanceof NotFoundSynovaError ||\n error instanceof RateLimitSynovaError ||\n error instanceof ServerSynovaError\n ) {\n throw error;\n }\n\n throw new NetworkSynovaError(\n `Network request failed: ${(error as Error).message}`,\n error as Error,\n );\n }\n }\n\n private async makeUploadRequest<T>(url: string, formData: FormData): Promise<T> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\n\n this.log(`POST (upload) ${url}`);\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${this.config.apiKey}`,\n 'User-Agent': `synova-cloud-sdk-node/${SDK_VERSION}`,\n // Note: Content-Type is not set for FormData - browser/node sets it with boundary\n },\n body: formData,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n await this.handleErrorResponse(response);\n }\n\n const data = (await response.json()) as T;\n this.log(`Response: ${response.status}`);\n return data;\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof Error && error.name === 'AbortError') {\n throw new TimeoutSynovaError(this.config.timeout);\n }\n\n if (\n error instanceof ApiSynovaError ||\n error instanceof AuthSynovaError ||\n error instanceof NotFoundSynovaError ||\n error instanceof RateLimitSynovaError ||\n error instanceof ServerSynovaError\n ) {\n throw error;\n }\n\n throw new NetworkSynovaError(\n `Upload request failed: ${(error as Error).message}`,\n error as Error,\n );\n }\n }\n\n private async handleErrorResponse(response: Response): Promise<never> {\n const status = response.status;\n\n // Try to parse error body\n let errorBody: IApiErrorResponse | null = null;\n try {\n errorBody = (await response.json()) as IApiErrorResponse;\n } catch {\n // Ignore JSON parse errors\n }\n\n // Create default error body if parsing failed\n const defaultErrorBody: IApiErrorResponse = {\n code: 'UNKNOWN_ERROR',\n httpCode: status,\n message: errorBody?.message || `HTTP ${status}: ${response.statusText}`,\n requestId: errorBody?.requestId || 'unknown',\n timestamp: errorBody?.timestamp || new Date().toISOString(),\n path: errorBody?.path,\n method: errorBody?.method,\n details: errorBody?.details,\n };\n\n const body = errorBody || defaultErrorBody;\n\n if (status === 401) {\n throw new AuthSynovaError(body);\n }\n\n if (status === 404) {\n throw new NotFoundSynovaError(body);\n }\n\n if (status === 429) {\n const retryAfter = response.headers.get('Retry-After');\n const retryAfterMs = retryAfter ? parseInt(retryAfter, 10) * 1000 : undefined;\n throw new RateLimitSynovaError(body, retryAfterMs);\n }\n\n if (status >= 500) {\n throw new ServerSynovaError(body);\n }\n\n throw new ApiSynovaError(body);\n }\n\n private buildUrl(path: string, query?: Record<string, string | undefined>): string {\n const url = new URL(path, this.config.baseUrl);\n\n if (query) {\n for (const [key, value] of Object.entries(query)) {\n if (value !== undefined) {\n url.searchParams.set(key, value);\n }\n }\n }\n\n return url.toString();\n }\n\n private isRetryable(error: unknown): boolean {\n if (error instanceof RateLimitSynovaError) return true;\n if (error instanceof ServerSynovaError) return true;\n if (error instanceof NetworkSynovaError) return true;\n if (error instanceof TimeoutSynovaError) return true;\n return false;\n }\n\n private calculateRetryDelay(attempt: number, error: Error | null): number {\n const { strategy, initialDelayMs, maxDelayMs, backoffMultiplier } = this.config.retry;\n\n // Use Retry-After header if available (takes priority)\n if (error instanceof RateLimitSynovaError && error.retryAfterMs) {\n return Math.min(error.retryAfterMs, maxDelayMs);\n }\n\n let baseDelay: number;\n\n if (strategy === 'linear') {\n // Linear: initialDelay * attempt (1000, 2000, 3000, ...)\n baseDelay = initialDelayMs * attempt;\n } else {\n // Exponential: initialDelay * multiplier^(attempt-1) (1000, 2000, 4000, ...)\n baseDelay = initialDelayMs * Math.pow(backoffMultiplier, attempt - 1);\n }\n\n // Add jitter (±10%) to prevent thundering herd\n const jitter = baseDelay * 0.1 * (Math.random() * 2 - 1);\n const delay = baseDelay + jitter;\n\n return Math.min(Math.max(delay, 0), maxDelayMs);\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n private log(message: string): void {\n if (this.config.debug) {\n this.config.logger.debug(`[Synova SDK] ${message}`);\n }\n }\n}\n","import type { IJsonSchema } from '../types';\nimport type { ISchemaAdapter } from './base.adapter';\n\n/**\n * Zod schema type definition\n */\ninterface IZodSchema {\n _def: { typeName: string };\n safeParse: (data: unknown) => { success: boolean };\n}\n\n/**\n * Adapter for Zod schemas.\n * Uses zod-to-json-schema for conversion.\n */\nexport class ZodAdapter implements ISchemaAdapter<IZodSchema> {\n canHandle(schema: unknown): schema is IZodSchema {\n if (typeof schema !== 'object' || schema === null) return false;\n\n const s = schema as Partial<IZodSchema>;\n return (\n typeof s._def === 'object' &&\n s._def !== null &&\n typeof s._def.typeName === 'string' &&\n s._def.typeName.startsWith('Zod') &&\n typeof s.safeParse === 'function'\n );\n }\n\n toJsonSchema(schema: IZodSchema): IJsonSchema {\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { zodToJsonSchema } = require('zod-to-json-schema');\n const result = { ...zodToJsonSchema(schema, { $refStrategy: 'none' }) };\n delete result.$schema;\n return result as IJsonSchema;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'MODULE_NOT_FOUND') {\n throw new Error(\n 'zod-to-json-schema is required to convert Zod schemas. Install it with: npm install zod-to-json-schema',\n );\n }\n throw new Error(`Failed to convert Zod schema: ${(error as Error).message}`);\n }\n }\n}\n","import type { IJsonSchema } from '../types';\nimport type { ISchemaAdapter } from './base.adapter';\n\n/**\n * Yup schema type definition\n */\ninterface IYupSchema {\n __isYupSchema__: boolean;\n}\n\n/**\n * Adapter for Yup schemas.\n * Uses @sodaru/yup-to-json-schema for conversion.\n *\n * @see https://github.com/jquense/yup/blob/master/src/schema.ts\n */\nexport class YupAdapter implements ISchemaAdapter<IYupSchema> {\n canHandle(schema: unknown): schema is IYupSchema {\n if (typeof schema !== 'object' || schema === null) return false;\n return (schema as IYupSchema).__isYupSchema__ === true;\n }\n\n toJsonSchema(schema: IYupSchema): IJsonSchema {\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { convertSchema } = require('@sodaru/yup-to-json-schema');\n return convertSchema(schema) as IJsonSchema;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'MODULE_NOT_FOUND') {\n throw new Error(\n '@sodaru/yup-to-json-schema is required to convert Yup schemas. Install it with: npm install @sodaru/yup-to-json-schema',\n );\n }\n throw new Error(`Failed to convert Yup schema: ${(error as Error).message}`);\n }\n }\n}\n","import type { IJsonSchema } from '../types';\nimport type { ISchemaAdapter } from './base.adapter';\n\n/**\n * Joi schema type definition\n */\ninterface IJoiSchema {\n describe: () => { type: string };\n}\n\n/**\n * Adapter for Joi schemas.\n * Uses joi-to-json for conversion.\n *\n * @see https://joi.dev/api/#isschemaschema-options\n */\nexport class JoiAdapter implements ISchemaAdapter<IJoiSchema> {\n canHandle(schema: unknown): schema is IJoiSchema {\n if (typeof schema !== 'object' || schema === null) return false;\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { isSchema } = require('joi');\n return isSchema(schema);\n } catch {\n // Joi not installed\n return false;\n }\n }\n\n toJsonSchema(schema: IJoiSchema): IJsonSchema {\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const joiToJson = require('joi-to-json');\n return joiToJson(schema) as IJsonSchema;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'MODULE_NOT_FOUND') {\n throw new Error(\n 'joi-to-json is required to convert Joi schemas. Install it with: npm install joi-to-json',\n );\n }\n throw new Error(`Failed to convert Joi schema: ${(error as Error).message}`);\n }\n }\n}\n","import type { IJsonSchema } from '../types';\nimport type { ISchemaAdapter } from './base.adapter';\n\n/**\n * Passthrough adapter for raw JSON Schema objects.\n * Transforms `nullable: true` to `type: [\"...\", \"null\"]` recursively.\n */\nexport class JsonSchemaAdapter implements ISchemaAdapter<IJsonSchema> {\n private static readonly VALID_JSON_SCHEMA_TYPES = [\n 'string',\n 'number',\n 'integer',\n 'boolean',\n 'object',\n 'array',\n 'null',\n ];\n\n canHandle(schema: unknown): schema is IJsonSchema {\n if (typeof schema !== 'object' || schema === null) {\n return false;\n }\n\n const obj = schema as Record<string, unknown>;\n\n // Check for valid JSON Schema type\n if ('type' in obj) {\n const type = obj.type;\n if (typeof type === 'string' && JsonSchemaAdapter.VALID_JSON_SCHEMA_TYPES.includes(type)) {\n return true;\n }\n if (\n Array.isArray(type) &&\n type.every((t) => JsonSchemaAdapter.VALID_JSON_SCHEMA_TYPES.includes(t))\n ) {\n return true;\n }\n }\n\n // Properties must be an object (not array or primitive)\n if (\n 'properties' in obj &&\n typeof obj.properties === 'object' &&\n obj.properties !== null &&\n !Array.isArray(obj.properties)\n ) {\n return true;\n }\n\n // Items must be an object (schema for array items)\n if (\n 'items' in obj &&\n typeof obj.items === 'object' &&\n obj.items !== null &&\n !Array.isArray(obj.items)\n ) {\n return true;\n }\n\n // Composition keywords with array values\n if ('anyOf' in obj && Array.isArray(obj.anyOf)) return true;\n if ('oneOf' in obj && Array.isArray(obj.oneOf)) return true;\n if ('allOf' in obj && Array.isArray(obj.allOf)) return true;\n\n // Enum with array values\n if ('enum' in obj && Array.isArray(obj.enum)) return true;\n\n return false;\n }\n\n toJsonSchema(schema: IJsonSchema): IJsonSchema {\n return this.transformNullable(schema);\n }\n\n /**\n * Recursively transform `nullable: true` to `type: [\"...\", \"null\"]`\n */\n private transformNullable(schema: IJsonSchema): IJsonSchema {\n const result: IJsonSchema = { ...schema };\n const schemaWithNullable = schema as IJsonSchema & { nullable?: boolean };\n\n // Handle nullable transformation\n if (schemaWithNullable.nullable === true && result.type) {\n if (typeof result.type === 'string') {\n result.type = [result.type, 'null'];\n } else if (Array.isArray(result.type) && !result.type.includes('null')) {\n result.type = [...result.type, 'null'];\n }\n // Remove nullable property (it's not standard JSON Schema)\n delete (result as IJsonSchema & { nullable?: boolean }).nullable;\n }\n\n // Recursively transform nested schemas\n if (result.properties) {\n result.properties = Object.fromEntries(\n Object.entries(result.properties).map(([key, value]) => [\n key,\n this.transformNullable(value),\n ]),\n );\n }\n\n if (result.items) {\n result.items = this.transformNullable(result.items);\n }\n\n if (result.additionalProperties && typeof result.additionalProperties === 'object') {\n result.additionalProperties = this.transformNullable(result.additionalProperties);\n }\n\n if (result.allOf) {\n result.allOf = result.allOf.map((s) => this.transformNullable(s));\n }\n\n if (result.anyOf) {\n result.anyOf = result.anyOf.map((s) => this.transformNullable(s));\n }\n\n if (result.oneOf) {\n result.oneOf = result.oneOf.map((s) => this.transformNullable(s));\n }\n\n if (result.not) {\n result.not = this.transformNullable(result.not);\n }\n\n return result;\n }\n}\n","import type { IJsonSchema } from './types';\nimport type { ISchemaAdapter } from './adapters/base.adapter';\nimport { ZodAdapter } from './adapters/zod.adapter';\nimport { YupAdapter } from './adapters/yup.adapter';\nimport { JoiAdapter } from './adapters/joi.adapter';\nimport { JsonSchemaAdapter } from './adapters/json-schema.adapter';\n\n/**\n * Schema type identifier\n */\nexport type TSchemaType = 'zod' | 'yup' | 'joi' | 'json-schema' | 'unknown';\n\n/**\n * Zod-like schema interface\n */\ninterface IZodLike {\n _def: { typeName: string };\n safeParse: unknown;\n}\n\n/**\n * Yup-like schema interface\n */\ninterface IYupLike {\n __isYupSchema__: true;\n}\n\n/**\n * Joi-like schema interface\n */\ninterface IJoiLike {\n describe: () => unknown;\n}\n\n/**\n * Supported schema input types.\n * Provides better type hints while maintaining flexibility.\n */\nexport type TSchemaInput =\n | IJsonSchema // Raw JSON Schema\n | IZodLike // Zod-like\n | IYupLike // Yup-like\n | IJoiLike // Joi-like\n | unknown; // Fallback for custom adapters\n\n/**\n * Schema resolver that converts various schema libraries to JSON Schema.\n * Supports Zod, Yup, Joi, and raw JSON Schema.\n */\nexport class SchemaResolver {\n private static adapters: ISchemaAdapter[] = [\n // Order matters: Zod → Yup → Joi → JsonSchema (fallback)\n new ZodAdapter(),\n new YupAdapter(),\n new JoiAdapter(),\n new JsonSchemaAdapter(),\n ];\n\n /**\n * Register a custom adapter.\n *\n * @param adapter - The adapter to register\n * @param position - Where to insert: 'first' adds at the beginning,\n * 'last' adds before JsonSchemaAdapter (fallback)\n *\n * @example\n * ```typescript\n * SchemaResolver.registerAdapter(new MyCustomAdapter(), 'first');\n * ```\n */\n static registerAdapter(adapter: ISchemaAdapter, position: 'first' | 'last' = 'first'): void {\n if (position === 'first') {\n this.adapters.unshift(adapter);\n } else {\n // Insert before JsonSchemaAdapter (last position)\n this.adapters.splice(-1, 0, adapter);\n }\n }\n\n /**\n * Reset adapters to default configuration.\n * Removes all custom adapters.\n */\n static resetAdapters(): void {\n this.adapters = [new ZodAdapter(), new YupAdapter(), new JoiAdapter(), new JsonSchemaAdapter()];\n }\n\n /**\n * Resolve a schema input to JSON Schema format.\n *\n * @param schema - Schema from Zod, Yup, Joi, or raw JSON Schema\n * @returns JSON Schema representation\n * @throws Error if schema type is not supported\n *\n * @example\n * ```typescript\n * // Zod\n * const zodSchema = z.object({ title: z.string() });\n * const jsonSchema = SchemaResolver.resolve(zodSchema);\n *\n * // Yup\n * const yupSchema = yup.object({ title: yup.string().required() });\n * const jsonSchema = SchemaResolver.resolve(yupSchema);\n *\n * // Joi\n * const joiSchema = Joi.object({ title: Joi.string() });\n * const jsonSchema = SchemaResolver.resolve(joiSchema);\n *\n * // Raw JSON Schema (passthrough)\n * const rawSchema = { type: 'object', properties: { title: { type: 'string' } } };\n * const jsonSchema = SchemaResolver.resolve(rawSchema);\n * ```\n */\n static resolve(schema: TSchemaInput): IJsonSchema {\n for (const adapter of this.adapters) {\n if (adapter.canHandle(schema)) {\n return adapter.toJsonSchema(schema);\n }\n }\n\n throw new Error(\n 'Unsupported schema type. Supported types: Zod, Yup, Joi, or raw JSON Schema object.',\n );\n }\n\n /**\n * Check if a schema is supported.\n *\n * @param schema - Schema to check\n * @returns true if the schema is supported\n */\n static isSupported(schema: unknown): boolean {\n return this.adapters.some((adapter) => adapter.canHandle(schema));\n }\n\n /**\n * Get the type of a schema.\n *\n * @param schema - Schema to identify\n * @returns Schema type identifier\n */\n static getSchemaType(schema: unknown): TSchemaType {\n const adapters = this.adapters;\n\n if (adapters[0].canHandle(schema)) {\n return 'zod';\n }\n if (adapters[1].canHandle(schema)) {\n return 'yup';\n }\n if (adapters[2].canHandle(schema)) {\n return 'joi';\n }\n if (adapters[3].canHandle(schema)) {\n return 'json-schema';\n }\n\n return 'unknown';\n }\n}\n","import type { HttpClient } from '../utils/http';\nimport type {\n ISynovaPrompt,\n ISynovaGetPromptOptions,\n ISynovaExecuteOptions,\n ISynovaExecuteResponse,\n} from '../types';\nimport { SchemaResolver } from '../schema/resolver';\nimport { ExecutionSynovaError } from '../errors';\n\nexport class PromptsResource {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Get a prompt by ID (returns version with 'latest' tag)\n */\n async get(promptId: string, options?: ISynovaGetPromptOptions): Promise<ISynovaPrompt> {\n if (options?.version) {\n return this.http.request<ISynovaPrompt>({\n method: 'GET',\n path: `/api/v1/prompts/${promptId}/versions/${options.version}`,\n });\n }\n\n const tag = options?.tag || 'latest';\n if (tag === 'latest') {\n return this.http.request<ISynovaPrompt>({\n method: 'GET',\n path: `/api/v1/prompts/${promptId}`,\n });\n }\n\n return this.http.request<ISynovaPrompt>({\n method: 'GET',\n path: `/api/v1/prompts/${promptId}/tags/${tag}`,\n });\n }\n\n /**\n * Execute a prompt with typed response using responseSchema\n *\n * @example\n * ```ts\n * // With Zod schema\n * const schema = z.object({ title: z.string() });\n * const result = await client.prompts.execute<z.infer<typeof schema>>('prm_abc123', {\n * provider: 'openai',\n * model: 'gpt-4o',\n * responseSchema: schema,\n * });\n * console.log(result.title); // Typed as string\n *\n * // With raw JSON Schema\n * const result = await client.prompts.execute<{ title: string }>('prm_abc123', {\n * provider: 'openai',\n * model: 'gpt-4o',\n * responseSchema: { type: 'object', properties: { title: { type: 'string' } } },\n * });\n * ```\n */\n execute<T>(\n promptId: string,\n options: ISynovaExecuteOptions & {\n responseSchema: NonNullable<ISynovaExecuteOptions['responseSchema']>;\n },\n ): Promise<T>;\n\n /**\n * Execute a prompt\n *\n * @example\n * ```ts\n * // Without responseSchema - returns ISynovaExecuteResponse\n * const result = await client.prompts.execute('prm_abc123', {\n * provider: 'openai',\n * model: 'gpt-4o',\n * });\n * if (result.type === 'message') {\n * console.log(result.content);\n * }\n * ```\n */\n execute(promptId: string, options: ISynovaExecuteOptions): Promise<ISynovaExecuteResponse>;\n\n async execute<T>(\n promptId: string,\n options: ISynovaExecuteOptions,\n ): Promise<T | ISynovaExecuteResponse> {\n const body: Record<string, unknown> = {\n provider: options.provider,\n model: options.model,\n };\n\n if (options.apiKey !== undefined) body.apiKey = options.apiKey;\n if (options.azureEndpoint !== undefined) body.azureEndpoint = options.azureEndpoint;\n if (options.variables !== undefined) body.variables = options.variables;\n if (options.messages !== undefined) body.messages = options.messages;\n if (options.tag !== undefined) body.tag = options.tag;\n if (options.version !== undefined) body.version = options.version;\n if (options.metadata !== undefined) body.metadata = options.metadata;\n if (options.parameters !== undefined) body.parameters = options.parameters;\n if (options.sessionId !== undefined) body.sessionId = options.sessionId;\n\n // Resolve schema if provided (supports Zod, Yup, Joi, or raw JSON Schema)\n if (options.responseSchema !== undefined) {\n body.responseSchema = SchemaResolver.resolve(options.responseSchema);\n }\n\n const response = await this.http.request<ISynovaExecuteResponse>({\n method: 'POST',\n path: `/api/v1/prompts/${promptId}/run`,\n body,\n });\n\n // Always throw on LLM error\n if (response.type === 'error' && response.error) {\n throw new ExecutionSynovaError(response.error);\n }\n\n // Return typed object when responseSchema is provided\n if (options.responseSchema !== undefined) {\n if (response.object === undefined) {\n throw new Error('Expected structured response but received undefined');\n }\n return response.object as T;\n }\n\n return response;\n }\n\n /**\n * Execute a prompt by tag with typed response\n */\n executeByTag<T>(\n promptId: string,\n tag: string,\n options: ISynovaExecuteOptions & {\n responseSchema: NonNullable<ISynovaExecuteOptions['responseSchema']>;\n },\n ): Promise<T>;\n\n /**\n * Execute a prompt by tag\n */\n executeByTag(\n promptId: string,\n tag: string,\n options: ISynovaExecuteOptions,\n ): Promise<ISynovaExecuteResponse>;\n\n async executeByTag<T>(\n promptId: string,\n tag: string,\n options: ISynovaExecuteOptions,\n ): Promise<T | ISynovaExecuteResponse> {\n return this.execute(promptId, { ...options, tag });\n }\n\n /**\n * Execute a prompt by version with typed response\n */\n executeByVersion<T>(\n promptId: string,\n version: string,\n options: ISynovaExecuteOptions & {\n responseSchema: NonNullable<ISynovaExecuteOptions['responseSchema']>;\n },\n ): Promise<T>;\n\n /**\n * Execute a prompt by version\n */\n executeByVersion(\n promptId: string,\n version: string,\n options: ISynovaExecuteOptions,\n ): Promise<ISynovaExecuteResponse>;\n\n async executeByVersion<T>(\n promptId: string,\n version: string,\n options: ISynovaExecuteOptions,\n ): Promise<T | ISynovaExecuteResponse> {\n return this.execute(promptId, { ...options, version });\n }\n}\n","import type { HttpClient } from '../utils/http';\nimport type { ISynovaModel, ISynovaModelsResponse, ISynovaListModelsOptions } from '../types';\n\ninterface IProviderModelsResponse {\n models: ISynovaModel[];\n}\n\nexport class ModelsResource {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * List all available models\n *\n * @param options - Optional filters\n * @returns List of providers with their models\n *\n * @example\n * ```ts\n * // Get all models\n * const { providers } = await client.models.list();\n *\n * // Filter by type\n * const imageModels = await client.models.list({ type: 'image' });\n *\n * // Filter by capability\n * const functionCallingModels = await client.models.list({\n * capability: 'function_calling',\n * });\n *\n * // Filter by provider\n * const openaiModels = await client.models.list({ provider: 'openai' });\n * ```\n */\n async list(options?: ISynovaListModelsOptions): Promise<ISynovaModelsResponse> {\n return this.http.request<ISynovaModelsResponse>({\n method: 'GET',\n path: '/api/v1/models',\n query: {\n type: options?.type,\n capability: options?.capability,\n provider: options?.provider,\n },\n });\n }\n\n /**\n * Get models for a specific provider\n *\n * @param provider - Provider ID (e.g., 'openai', 'anthropic')\n * @returns List of models for the provider\n *\n * @example\n * ```ts\n * const { models } = await client.models.getByProvider('openai');\n * ```\n */\n async getByProvider(provider: string): Promise<ISynovaModel[]> {\n const response = await this.http.request<IProviderModelsResponse>({\n method: 'GET',\n path: `/api/v1/models/${provider}`,\n });\n return response.models;\n }\n\n /**\n * Get a specific model\n *\n * @param provider - Provider ID\n * @param model - Model ID\n * @returns Model details\n *\n * @example\n * ```ts\n * const model = await client.models.get('openai', 'gpt-4o');\n * console.log(model.capabilities);\n * console.log(model.limits);\n * ```\n */\n async get(provider: string, model: string): Promise<ISynovaModel> {\n return this.http.request<ISynovaModel>({\n method: 'GET',\n path: `/api/v1/models/${provider}/${model}`,\n });\n }\n}\n","import type { HttpClient } from '../utils/http';\nimport type { ISynovaUploadResponse, ISynovaUploadOptions } from '../types';\n\nexport class FilesResource {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Upload files for use in prompt execution\n *\n * @param files - Array of File or Blob objects to upload\n * @param options - Upload options including projectId\n * @returns Upload response with file metadata\n *\n * @example\n * ```ts\n * // Upload files\n * const result = await client.files.upload(\n * [file1, file2],\n * { projectId: 'prj_abc123' }\n * );\n *\n * console.log('Uploaded files:', result.data);\n *\n * // Use uploaded file in prompt execution\n * const response = await client.prompts.execute('prm_abc123', {\n * provider: 'openai',\n * model: 'gpt-4o',\n * messages: [\n * {\n * role: 'user',\n * content: 'Describe this image',\n * files: [{ fileId: result.data[0].id }],\n * },\n * ],\n * });\n * ```\n */\n async upload(\n files: (File | Blob)[],\n options: ISynovaUploadOptions,\n ): Promise<ISynovaUploadResponse> {\n const formData = new FormData();\n\n for (const file of files) {\n formData.append('files', file);\n }\n\n formData.append('projectId', options.projectId);\n\n return this.http.upload<ISynovaUploadResponse>({\n path: '/api/v1/files/upload',\n formData,\n });\n }\n}\n","import type { HttpClient } from '../utils/http';\nimport type {\n ISynovaSpan,\n ISynovaCreateSpanOptions,\n ISynovaEndSpanOptions,\n TSynovaSpanType,\n} from '../types';\n\n/**\n * Options for wrapping a function with span tracking\n */\nexport interface ISynovaWrapOptions {\n /** Trace ID */\n traceId: string;\n /** Span type */\n type: TSynovaSpanType;\n /** Span name */\n name?: string;\n /** Parent span ID */\n parentSpanId?: string;\n /** Custom metadata */\n metadata?: Record<string, string>;\n}\n\n/**\n * Options for wrapping a tool function\n */\nexport interface ISynovaWrapToolOptions {\n /** Trace ID */\n traceId: string;\n /** Tool name */\n toolName: string;\n /** Parent span ID */\n parentSpanId?: string;\n /** Custom metadata */\n metadata?: Record<string, string>;\n}\n\n/**\n * Spans resource for observability\n *\n * @example\n * ```ts\n * // Manual: create and end span\n * const span = await client.spans.create('trc_123', {\n * type: 'tool',\n * toolName: 'fetch_weather',\n * toolArguments: { city: 'NYC' },\n * });\n * const result = await fetchWeather('NYC');\n * await client.spans.end(span.id, { status: 'completed', toolResult: result });\n *\n * // Wrapper: automatic span lifecycle\n * const weather = await client.spans.wrapTool(\n * { traceId: 'trc_123', toolName: 'fetch_weather' },\n * { city: 'NYC' },\n * (args) => fetchWeather(args.city),\n * );\n *\n * // Generic wrapper for custom spans\n * const result = await client.spans.wrap(\n * { traceId: 'trc_123', type: 'custom', name: 'validate' },\n * { input: data },\n * async () => validateData(data),\n * );\n * ```\n */\nexport class SpansResource {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Create a new span within a trace\n *\n * @param traceId - The trace ID to create span in\n * @param options - Span creation options\n * @returns Created span\n */\n async create(traceId: string, options: ISynovaCreateSpanOptions): Promise<ISynovaSpan> {\n const body: Record<string, unknown> = {\n type: options.type,\n };\n\n if (options.parentSpanId !== undefined) body.parentSpanId = options.parentSpanId;\n if (options.name !== undefined) body.name = options.name;\n if (options.input !== undefined) body.input = options.input;\n if (options.toolName !== undefined) body.toolName = options.toolName;\n if (options.toolArguments !== undefined) body.toolArguments = options.toolArguments;\n if (options.metadata !== undefined) body.metadata = options.metadata;\n\n return this.http.request<ISynovaSpan>({\n method: 'POST',\n path: `/api/v1/traces/${traceId}/spans`,\n body,\n });\n }\n\n /**\n * End/complete a span\n *\n * @param spanId - The span ID to end\n * @param options - Span end options\n * @returns Updated span\n */\n async end(spanId: string, options?: ISynovaEndSpanOptions): Promise<ISynovaSpan> {\n const body: Record<string, unknown> = {};\n\n if (options?.status !== undefined) body.status = options.status;\n if (options?.level !== undefined) body.level = options.level;\n if (options?.statusMessage !== undefined) body.statusMessage = options.statusMessage;\n if (options?.output !== undefined) body.output = options.output;\n if (options?.toolResult !== undefined) body.toolResult = options.toolResult;\n if (options?.durationMs !== undefined) body.durationMs = options.durationMs;\n\n return this.http.request<ISynovaSpan>({\n method: 'PATCH',\n path: `/api/v1/spans/${spanId}`,\n body,\n });\n }\n\n /**\n * Wrap an async function with automatic span tracking\n *\n * @param options - Span options (traceId, type, name, etc.)\n * @param input - Input data to record in span\n * @param fn - Async function to execute\n * @returns Result of the function\n *\n * @example\n * ```ts\n * const result = await client.spans.wrap(\n * { traceId: 'trc_123', type: 'retriever', name: 'vector_search' },\n * { query: 'how to...', topK: 5 },\n * async () => vectorDb.search(query),\n * );\n * ```\n */\n async wrap<T>(options: ISynovaWrapOptions, input: unknown, fn: () => Promise<T>): Promise<T> {\n const span = await this.create(options.traceId, {\n type: options.type,\n name: options.name,\n parentSpanId: options.parentSpanId,\n input,\n metadata: options.metadata,\n });\n\n try {\n const result = await fn();\n await this.end(span.id, {\n status: 'completed',\n output: result,\n });\n return result;\n } catch (error) {\n await this.end(span.id, {\n status: 'error',\n statusMessage: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n }\n\n /**\n * Wrap a tool function with automatic span tracking\n *\n * @param options - Tool span options (traceId, toolName, etc.)\n * @param args - Tool arguments to record\n * @param fn - Tool function to execute\n * @returns Result of the tool\n *\n * @example\n * ```ts\n * const weather = await client.spans.wrapTool(\n * { traceId: 'trc_123', toolName: 'fetch_weather', parentSpanId: 'spn_abc' },\n * { city: 'NYC' },\n * async (args) => fetchWeather(args.city),\n * );\n * ```\n */\n async wrapTool<TArgs extends Record<string, unknown>, TResult>(\n options: ISynovaWrapToolOptions,\n args: TArgs,\n fn: (args: TArgs) => Promise<TResult>,\n ): Promise<TResult> {\n const span = await this.create(options.traceId, {\n type: 'tool',\n toolName: options.toolName,\n toolArguments: args,\n parentSpanId: options.parentSpanId,\n metadata: options.metadata,\n });\n\n try {\n const result = await fn(args);\n await this.end(span.id, {\n status: 'completed',\n toolResult: result,\n });\n return result;\n } catch (error) {\n await this.end(span.id, {\n status: 'error',\n statusMessage: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n }\n}\n","import type { ISynovaConfig, ISynovaLogger } from './types';\nimport type { IRetryOptions } from './utils/http';\nimport { HttpClient } from './utils/http';\nimport { PromptsResource } from './resources/prompts';\nimport { ModelsResource } from './resources/models';\nimport { FilesResource } from './resources/files';\nimport { SpansResource } from './resources/spans';\n\nconst DEFAULT_BASE_URL = 'https://api.synova.cloud';\nconst DEFAULT_TIMEOUT = 30000;\n\nconst DEFAULT_RETRY: IRetryOptions = {\n maxRetries: 3,\n strategy: 'exponential',\n initialDelayMs: 1000,\n maxDelayMs: 30000,\n backoffMultiplier: 2,\n};\n\nconst DEFAULT_LOGGER: ISynovaLogger = {\n debug: (message, ...args) => console.debug(message, ...args),\n info: (message, ...args) => console.info(message, ...args),\n warn: (message, ...args) => console.warn(message, ...args),\n error: (messageOrError, ...args) => console.error(messageOrError, ...args),\n};\n\n/**\n * Synova Cloud SDK client\n *\n * @example\n * ```ts\n * import { SynovaCloudSdk } from '@synova-cloud/sdk';\n *\n * const client = new SynovaCloudSdk('your-api-key');\n *\n * // Get a prompt\n * const prompt = await client.prompts.get('prm_abc123');\n *\n * // Execute a prompt with direct API key\n * const result = await client.prompts.execute('prm_abc123', {\n * provider: 'openai',\n * model: 'gpt-4o',\n * apiKey: 'sk-...',\n * variables: { topic: 'TypeScript' },\n * });\n *\n * // Execute with Azure OpenAI\n * const azureResult = await client.prompts.execute('prm_abc123', {\n * provider: 'azure_openai',\n * model: 'gpt-4o',\n * apiKey: 'your-azure-key',\n * azureEndpoint: 'https://my-resource.openai.azure.com',\n * variables: { topic: 'TypeScript' },\n * });\n *\n * // List available models\n * const { providers } = await client.models.list();\n *\n * // Get models for a specific provider\n * const openaiModels = await client.models.getByProvider('openai');\n *\n * // With custom retry config\n * const clientWithRetry = new SynovaCloudSdk('your-api-key', {\n * retry: {\n * maxRetries: 5,\n * strategy: 'linear',\n * initialDelayMs: 500,\n * },\n * });\n * ```\n */\nexport class SynovaCloudSdk {\n readonly prompts: PromptsResource;\n readonly models: ModelsResource;\n readonly files: FilesResource;\n readonly spans: SpansResource;\n\n private readonly http: HttpClient;\n\n /**\n * Create a new Synova Cloud SDK client\n *\n * @param apiKey - Your Synova API key\n * @param config - Optional configuration\n */\n constructor(apiKey: string, config?: ISynovaConfig) {\n if (!apiKey) {\n throw new Error('API key is required');\n }\n\n this.http = new HttpClient({\n baseUrl: config?.baseUrl ?? DEFAULT_BASE_URL,\n apiKey,\n timeout: config?.timeout ?? DEFAULT_TIMEOUT,\n retry: {\n maxRetries: config?.retry?.maxRetries ?? DEFAULT_RETRY.maxRetries,\n strategy: config?.retry?.strategy ?? DEFAULT_RETRY.strategy,\n initialDelayMs: config?.retry?.initialDelayMs ?? DEFAULT_RETRY.initialDelayMs,\n maxDelayMs: config?.retry?.maxDelayMs ?? DEFAULT_RETRY.maxDelayMs,\n backoffMultiplier: config?.retry?.backoffMultiplier ?? DEFAULT_RETRY.backoffMultiplier,\n },\n debug: config?.debug ?? false,\n logger: config?.logger ?? DEFAULT_LOGGER,\n });\n\n this.prompts = new PromptsResource(this.http);\n this.models = new ModelsResource(this.http);\n this.files = new FilesResource(this.http);\n this.spans = new SpansResource(this.http);\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/errors/index.ts","../src/version.ts","../src/utils/http.ts","../src/schema/adapters/zod.adapter.ts","../src/schema/adapters/yup.adapter.ts","../src/schema/adapters/joi.adapter.ts","../src/schema/adapters/json-schema.adapter.ts","../src/schema/resolver.ts","../src/resources/prompts.ts","../src/resources/models.ts","../src/resources/files.ts","../src/resources/spans.ts","../src/client.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type { IApiErrorResponse, ISynovaExecutionError } from '../types';\n\n/**\n * Base error class for all Synova SDK errors\n */\nexport class SynovaError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'SynovaError';\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * Error thrown when API returns an error response.\n * Base class for all API-related errors.\n */\nexport class ApiSynovaError extends SynovaError {\n readonly code: string;\n readonly httpCode: number;\n readonly requestId: string;\n readonly timestamp: string;\n readonly path?: string;\n readonly method?: string;\n readonly details?: unknown;\n\n constructor(response: IApiErrorResponse) {\n super(response.message);\n this.name = 'ApiSynovaError';\n this.code = response.code;\n this.httpCode = response.httpCode;\n this.requestId = response.requestId;\n this.timestamp = response.timestamp;\n this.path = response.path;\n this.method = response.method;\n this.details = response.details;\n }\n}\n\n/**\n * Error thrown when authentication fails (401)\n */\nexport class AuthSynovaError extends ApiSynovaError {\n constructor(response: IApiErrorResponse) {\n super(response);\n this.name = 'AuthSynovaError';\n }\n}\n\n/**\n * Error thrown when resource is not found (404)\n */\nexport class NotFoundSynovaError extends ApiSynovaError {\n constructor(response: IApiErrorResponse) {\n super(response);\n this.name = 'NotFoundSynovaError';\n }\n}\n\n/**\n * Error thrown when rate limit is exceeded (429)\n */\nexport class RateLimitSynovaError extends ApiSynovaError {\n readonly retryAfterMs?: number;\n\n constructor(response: IApiErrorResponse, retryAfterMs?: number) {\n super(response);\n this.name = 'RateLimitSynovaError';\n this.retryAfterMs = retryAfterMs;\n }\n}\n\n/**\n * Error thrown when server returns 5xx error\n */\nexport class ServerSynovaError extends ApiSynovaError {\n readonly retryable: boolean = true;\n\n constructor(response: IApiErrorResponse) {\n super(response);\n this.name = 'ServerSynovaError';\n }\n}\n\n/**\n * Error thrown when request times out (client-side)\n */\nexport class TimeoutSynovaError extends SynovaError {\n readonly timeoutMs: number;\n\n constructor(timeoutMs: number) {\n super(`Request timed out after ${timeoutMs}ms`);\n this.name = 'TimeoutSynovaError';\n this.timeoutMs = timeoutMs;\n }\n}\n\n/**\n * Error thrown when network request fails (client-side)\n */\nexport class NetworkSynovaError extends SynovaError {\n readonly cause?: Error;\n\n constructor(message: string, cause?: Error) {\n super(message);\n this.name = 'NetworkSynovaError';\n this.cause = cause;\n }\n}\n\n/**\n * Error thrown when LLM execution fails (returned in response with type='error')\n */\nexport class ExecutionSynovaError extends SynovaError {\n readonly code: string;\n readonly provider?: string;\n readonly retryable: boolean;\n readonly retryAfterMs?: number;\n readonly details?: ISynovaExecutionError['details'];\n\n constructor(error: ISynovaExecutionError) {\n super(error.message);\n this.name = 'ExecutionSynovaError';\n this.code = error.code;\n this.provider = error.provider;\n this.retryable = error.retryable;\n this.retryAfterMs = error.retryAfterMs;\n this.details = error.details;\n }\n}\n","declare const __SDK_VERSION__: string;\n\nexport const SDK_VERSION = typeof __SDK_VERSION__ !== 'undefined' ? __SDK_VERSION__ : 'dev';\n","import type { IApiErrorResponse, ISynovaLogger, TSynovaRetryStrategy } from '../types';\nimport {\n ApiSynovaError,\n AuthSynovaError,\n NetworkSynovaError,\n NotFoundSynovaError,\n RateLimitSynovaError,\n ServerSynovaError,\n TimeoutSynovaError,\n} from '../errors';\nimport { SDK_VERSION } from '../version';\n\nexport interface IRetryOptions {\n maxRetries: number;\n strategy: TSynovaRetryStrategy;\n initialDelayMs: number;\n maxDelayMs: number;\n backoffMultiplier: number;\n}\n\nexport interface IHttpClientConfig {\n baseUrl: string;\n apiKey: string;\n timeout: number;\n retry: IRetryOptions;\n debug: boolean;\n logger: ISynovaLogger;\n}\n\nexport interface IRequestOptions {\n method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n path: string;\n body?: unknown;\n query?: Record<string, string | undefined>;\n}\n\nexport interface IUploadOptions {\n path: string;\n formData: FormData;\n}\n\nexport class HttpClient {\n private readonly config: IHttpClientConfig;\n\n constructor(config: IHttpClientConfig) {\n this.config = config;\n }\n\n async request<T>(options: IRequestOptions): Promise<T> {\n const url = this.buildUrl(options.path, options.query);\n const { maxRetries } = this.config.retry;\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n if (attempt > 0) {\n const delay = this.calculateRetryDelay(attempt, lastError);\n this.log(\n `Retry attempt ${attempt}/${maxRetries} after ${delay}ms (strategy: ${this.config.retry.strategy})`,\n );\n await this.sleep(delay);\n }\n\n return await this.makeRequest<T>(url, options);\n } catch (error) {\n lastError = error as Error;\n\n if (!this.isRetryable(error)) {\n throw error;\n }\n\n if (attempt === maxRetries) {\n throw error;\n }\n\n this.log(`Request failed, will retry: ${(error as Error).message}`);\n }\n }\n\n throw lastError;\n }\n\n async upload<T>(options: IUploadOptions): Promise<T> {\n const url = this.buildUrl(options.path);\n const { maxRetries } = this.config.retry;\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n if (attempt > 0) {\n const delay = this.calculateRetryDelay(attempt, lastError);\n this.log(\n `Retry attempt ${attempt}/${maxRetries} after ${delay}ms (strategy: ${this.config.retry.strategy})`,\n );\n await this.sleep(delay);\n }\n\n return await this.makeUploadRequest<T>(url, options.formData);\n } catch (error) {\n lastError = error as Error;\n\n if (!this.isRetryable(error)) {\n throw error;\n }\n\n if (attempt === maxRetries) {\n throw error;\n }\n\n this.log(`Upload failed, will retry: ${(error as Error).message}`);\n }\n }\n\n throw lastError;\n }\n\n private async makeRequest<T>(url: string, options: IRequestOptions): Promise<T> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\n\n this.log(`${options.method} ${url}`);\n\n try {\n const response = await fetch(url, {\n method: options.method,\n headers: {\n Authorization: `Bearer ${this.config.apiKey}`,\n 'Content-Type': 'application/json',\n 'User-Agent': `synova-cloud-sdk-node/${SDK_VERSION}`,\n },\n body: options.body ? JSON.stringify(options.body) : undefined,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n await this.handleErrorResponse(response);\n }\n\n const data = (await response.json()) as T;\n this.log(`Response: ${response.status}`);\n return data;\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof Error && error.name === 'AbortError') {\n throw new TimeoutSynovaError(this.config.timeout);\n }\n\n if (\n error instanceof ApiSynovaError ||\n error instanceof AuthSynovaError ||\n error instanceof NotFoundSynovaError ||\n error instanceof RateLimitSynovaError ||\n error instanceof ServerSynovaError\n ) {\n throw error;\n }\n\n throw new NetworkSynovaError(\n `Network request failed: ${(error as Error).message}`,\n error as Error,\n );\n }\n }\n\n private async makeUploadRequest<T>(url: string, formData: FormData): Promise<T> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\n\n this.log(`POST (upload) ${url}`);\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${this.config.apiKey}`,\n 'User-Agent': `synova-cloud-sdk-node/${SDK_VERSION}`,\n // Note: Content-Type is not set for FormData - browser/node sets it with boundary\n },\n body: formData,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n await this.handleErrorResponse(response);\n }\n\n const data = (await response.json()) as T;\n this.log(`Response: ${response.status}`);\n return data;\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof Error && error.name === 'AbortError') {\n throw new TimeoutSynovaError(this.config.timeout);\n }\n\n if (\n error instanceof ApiSynovaError ||\n error instanceof AuthSynovaError ||\n error instanceof NotFoundSynovaError ||\n error instanceof RateLimitSynovaError ||\n error instanceof ServerSynovaError\n ) {\n throw error;\n }\n\n throw new NetworkSynovaError(\n `Upload request failed: ${(error as Error).message}`,\n error as Error,\n );\n }\n }\n\n private async handleErrorResponse(response: Response): Promise<never> {\n const status = response.status;\n\n // Try to parse error body\n let errorBody: IApiErrorResponse | null = null;\n try {\n errorBody = (await response.json()) as IApiErrorResponse;\n } catch {\n // Ignore JSON parse errors\n }\n\n // Create default error body if parsing failed\n const defaultErrorBody: IApiErrorResponse = {\n code: 'UNKNOWN_ERROR',\n httpCode: status,\n message: errorBody?.message || `HTTP ${status}: ${response.statusText}`,\n requestId: errorBody?.requestId || 'unknown',\n timestamp: errorBody?.timestamp || new Date().toISOString(),\n path: errorBody?.path,\n method: errorBody?.method,\n details: errorBody?.details,\n };\n\n const body = errorBody || defaultErrorBody;\n\n if (status === 401) {\n throw new AuthSynovaError(body);\n }\n\n if (status === 404) {\n throw new NotFoundSynovaError(body);\n }\n\n if (status === 429) {\n const retryAfter = response.headers.get('Retry-After');\n const retryAfterMs = retryAfter ? parseInt(retryAfter, 10) * 1000 : undefined;\n throw new RateLimitSynovaError(body, retryAfterMs);\n }\n\n if (status >= 500) {\n throw new ServerSynovaError(body);\n }\n\n throw new ApiSynovaError(body);\n }\n\n private buildUrl(path: string, query?: Record<string, string | undefined>): string {\n const url = new URL(path, this.config.baseUrl);\n\n if (query) {\n for (const [key, value] of Object.entries(query)) {\n if (value !== undefined) {\n url.searchParams.set(key, value);\n }\n }\n }\n\n return url.toString();\n }\n\n private isRetryable(error: unknown): boolean {\n if (error instanceof RateLimitSynovaError) return true;\n if (error instanceof ServerSynovaError) return true;\n if (error instanceof NetworkSynovaError) return true;\n if (error instanceof TimeoutSynovaError) return true;\n return false;\n }\n\n private calculateRetryDelay(attempt: number, error: Error | null): number {\n const { strategy, initialDelayMs, maxDelayMs, backoffMultiplier } = this.config.retry;\n\n // Use Retry-After header if available (takes priority)\n if (error instanceof RateLimitSynovaError && error.retryAfterMs) {\n return Math.min(error.retryAfterMs, maxDelayMs);\n }\n\n let baseDelay: number;\n\n if (strategy === 'linear') {\n // Linear: initialDelay * attempt (1000, 2000, 3000, ...)\n baseDelay = initialDelayMs * attempt;\n } else {\n // Exponential: initialDelay * multiplier^(attempt-1) (1000, 2000, 4000, ...)\n baseDelay = initialDelayMs * Math.pow(backoffMultiplier, attempt - 1);\n }\n\n // Add jitter (±10%) to prevent thundering herd\n const jitter = baseDelay * 0.1 * (Math.random() * 2 - 1);\n const delay = baseDelay + jitter;\n\n return Math.min(Math.max(delay, 0), maxDelayMs);\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n private log(message: string): void {\n if (this.config.debug) {\n this.config.logger.debug(`[Synova SDK] ${message}`);\n }\n }\n}\n","import type { IJsonSchema } from '../types';\nimport type { ISchemaAdapter } from './base.adapter';\n\n/**\n * Zod schema type definition\n */\ninterface IZodSchema {\n _def: { typeName: string };\n safeParse: (data: unknown) => { success: boolean };\n}\n\n/**\n * Adapter for Zod schemas.\n * Uses zod-to-json-schema for conversion.\n */\nexport class ZodAdapter implements ISchemaAdapter<IZodSchema> {\n canHandle(schema: unknown): schema is IZodSchema {\n if (typeof schema !== 'object' || schema === null) return false;\n\n const s = schema as Partial<IZodSchema>;\n return (\n typeof s._def === 'object' &&\n s._def !== null &&\n typeof s._def.typeName === 'string' &&\n s._def.typeName.startsWith('Zod') &&\n typeof s.safeParse === 'function'\n );\n }\n\n toJsonSchema(schema: IZodSchema): IJsonSchema {\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { zodToJsonSchema } = require('zod-to-json-schema');\n const result = { ...zodToJsonSchema(schema, { $refStrategy: 'none' }) };\n delete result.$schema;\n return result as IJsonSchema;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'MODULE_NOT_FOUND') {\n throw new Error(\n 'zod-to-json-schema is required to convert Zod schemas. Install it with: npm install zod-to-json-schema',\n );\n }\n throw new Error(`Failed to convert Zod schema: ${(error as Error).message}`);\n }\n }\n}\n","import type { IJsonSchema } from '../types';\nimport type { ISchemaAdapter } from './base.adapter';\n\n/**\n * Yup schema type definition\n */\ninterface IYupSchema {\n __isYupSchema__: boolean;\n}\n\n/**\n * Adapter for Yup schemas.\n * Uses @sodaru/yup-to-json-schema for conversion.\n *\n * @see https://github.com/jquense/yup/blob/master/src/schema.ts\n */\nexport class YupAdapter implements ISchemaAdapter<IYupSchema> {\n canHandle(schema: unknown): schema is IYupSchema {\n if (typeof schema !== 'object' || schema === null) return false;\n return (schema as IYupSchema).__isYupSchema__ === true;\n }\n\n toJsonSchema(schema: IYupSchema): IJsonSchema {\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { convertSchema } = require('@sodaru/yup-to-json-schema');\n return convertSchema(schema) as IJsonSchema;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'MODULE_NOT_FOUND') {\n throw new Error(\n '@sodaru/yup-to-json-schema is required to convert Yup schemas. Install it with: npm install @sodaru/yup-to-json-schema',\n );\n }\n throw new Error(`Failed to convert Yup schema: ${(error as Error).message}`);\n }\n }\n}\n","import type { IJsonSchema } from '../types';\nimport type { ISchemaAdapter } from './base.adapter';\n\n/**\n * Joi schema type definition\n */\ninterface IJoiSchema {\n describe: () => { type: string };\n}\n\n/**\n * Adapter for Joi schemas.\n * Uses joi-to-json for conversion.\n *\n * @see https://joi.dev/api/#isschemaschema-options\n */\nexport class JoiAdapter implements ISchemaAdapter<IJoiSchema> {\n canHandle(schema: unknown): schema is IJoiSchema {\n if (typeof schema !== 'object' || schema === null) return false;\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { isSchema } = require('joi');\n return isSchema(schema);\n } catch {\n // Joi not installed\n return false;\n }\n }\n\n toJsonSchema(schema: IJoiSchema): IJsonSchema {\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const joiToJson = require('joi-to-json');\n return joiToJson(schema) as IJsonSchema;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'MODULE_NOT_FOUND') {\n throw new Error(\n 'joi-to-json is required to convert Joi schemas. Install it with: npm install joi-to-json',\n );\n }\n throw new Error(`Failed to convert Joi schema: ${(error as Error).message}`);\n }\n }\n}\n","import type { IJsonSchema } from '../types';\nimport type { ISchemaAdapter } from './base.adapter';\n\n/**\n * Passthrough adapter for raw JSON Schema objects.\n * Transforms `nullable: true` to `type: [\"...\", \"null\"]` recursively.\n */\nexport class JsonSchemaAdapter implements ISchemaAdapter<IJsonSchema> {\n private static readonly VALID_JSON_SCHEMA_TYPES = [\n 'string',\n 'number',\n 'integer',\n 'boolean',\n 'object',\n 'array',\n 'null',\n ];\n\n canHandle(schema: unknown): schema is IJsonSchema {\n if (typeof schema !== 'object' || schema === null) {\n return false;\n }\n\n const obj = schema as Record<string, unknown>;\n\n // Check for valid JSON Schema type\n if ('type' in obj) {\n const type = obj.type;\n if (typeof type === 'string' && JsonSchemaAdapter.VALID_JSON_SCHEMA_TYPES.includes(type)) {\n return true;\n }\n if (\n Array.isArray(type) &&\n type.every((t) => JsonSchemaAdapter.VALID_JSON_SCHEMA_TYPES.includes(t))\n ) {\n return true;\n }\n }\n\n // Properties must be an object (not array or primitive)\n if (\n 'properties' in obj &&\n typeof obj.properties === 'object' &&\n obj.properties !== null &&\n !Array.isArray(obj.properties)\n ) {\n return true;\n }\n\n // Items must be an object (schema for array items)\n if (\n 'items' in obj &&\n typeof obj.items === 'object' &&\n obj.items !== null &&\n !Array.isArray(obj.items)\n ) {\n return true;\n }\n\n // Composition keywords with array values\n if ('anyOf' in obj && Array.isArray(obj.anyOf)) return true;\n if ('oneOf' in obj && Array.isArray(obj.oneOf)) return true;\n if ('allOf' in obj && Array.isArray(obj.allOf)) return true;\n\n // Enum with array values\n if ('enum' in obj && Array.isArray(obj.enum)) return true;\n\n return false;\n }\n\n toJsonSchema(schema: IJsonSchema): IJsonSchema {\n return this.transformNullable(schema);\n }\n\n /**\n * Recursively transform `nullable: true` to `type: [\"...\", \"null\"]`\n */\n private transformNullable(schema: IJsonSchema): IJsonSchema {\n const result: IJsonSchema = { ...schema };\n const schemaWithNullable = schema as IJsonSchema & { nullable?: boolean };\n\n // Handle nullable transformation\n if (schemaWithNullable.nullable === true && result.type) {\n if (typeof result.type === 'string') {\n result.type = [result.type, 'null'];\n } else if (Array.isArray(result.type) && !result.type.includes('null')) {\n result.type = [...result.type, 'null'];\n }\n // Remove nullable property (it's not standard JSON Schema)\n delete (result as IJsonSchema & { nullable?: boolean }).nullable;\n }\n\n // Recursively transform nested schemas\n if (result.properties) {\n result.properties = Object.fromEntries(\n Object.entries(result.properties).map(([key, value]) => [\n key,\n this.transformNullable(value),\n ]),\n );\n }\n\n if (result.items) {\n result.items = this.transformNullable(result.items);\n }\n\n if (result.additionalProperties && typeof result.additionalProperties === 'object') {\n result.additionalProperties = this.transformNullable(result.additionalProperties);\n }\n\n if (result.allOf) {\n result.allOf = result.allOf.map((s) => this.transformNullable(s));\n }\n\n if (result.anyOf) {\n result.anyOf = result.anyOf.map((s) => this.transformNullable(s));\n }\n\n if (result.oneOf) {\n result.oneOf = result.oneOf.map((s) => this.transformNullable(s));\n }\n\n if (result.not) {\n result.not = this.transformNullable(result.not);\n }\n\n return result;\n }\n}\n","import type { IJsonSchema } from './types';\nimport type { ISchemaAdapter } from './adapters/base.adapter';\nimport { ZodAdapter } from './adapters/zod.adapter';\nimport { YupAdapter } from './adapters/yup.adapter';\nimport { JoiAdapter } from './adapters/joi.adapter';\nimport { JsonSchemaAdapter } from './adapters/json-schema.adapter';\n\n/**\n * Schema type identifier\n */\nexport type TSchemaType = 'zod' | 'yup' | 'joi' | 'json-schema' | 'unknown';\n\n/**\n * Zod-like schema interface\n */\ninterface IZodLike {\n _def: { typeName: string };\n safeParse: unknown;\n}\n\n/**\n * Yup-like schema interface\n */\ninterface IYupLike {\n __isYupSchema__: true;\n}\n\n/**\n * Joi-like schema interface\n */\ninterface IJoiLike {\n describe: () => unknown;\n}\n\n/**\n * Supported schema input types.\n * Provides better type hints while maintaining flexibility.\n */\nexport type TSchemaInput =\n | IJsonSchema // Raw JSON Schema\n | IZodLike // Zod-like\n | IYupLike // Yup-like\n | IJoiLike // Joi-like\n | unknown; // Fallback for custom adapters\n\n/**\n * Schema resolver that converts various schema libraries to JSON Schema.\n * Supports Zod, Yup, Joi, and raw JSON Schema.\n */\nexport class SchemaResolver {\n private static adapters: ISchemaAdapter[] = [\n // Order matters: Zod → Yup → Joi → JsonSchema (fallback)\n new ZodAdapter(),\n new YupAdapter(),\n new JoiAdapter(),\n new JsonSchemaAdapter(),\n ];\n\n /**\n * Register a custom adapter.\n *\n * @param adapter - The adapter to register\n * @param position - Where to insert: 'first' adds at the beginning,\n * 'last' adds before JsonSchemaAdapter (fallback)\n *\n * @example\n * ```typescript\n * SchemaResolver.registerAdapter(new MyCustomAdapter(), 'first');\n * ```\n */\n static registerAdapter(adapter: ISchemaAdapter, position: 'first' | 'last' = 'first'): void {\n if (position === 'first') {\n this.adapters.unshift(adapter);\n } else {\n // Insert before JsonSchemaAdapter (last position)\n this.adapters.splice(-1, 0, adapter);\n }\n }\n\n /**\n * Reset adapters to default configuration.\n * Removes all custom adapters.\n */\n static resetAdapters(): void {\n this.adapters = [new ZodAdapter(), new YupAdapter(), new JoiAdapter(), new JsonSchemaAdapter()];\n }\n\n /**\n * Resolve a schema input to JSON Schema format.\n *\n * @param schema - Schema from Zod, Yup, Joi, or raw JSON Schema\n * @returns JSON Schema representation\n * @throws Error if schema type is not supported\n *\n * @example\n * ```typescript\n * // Zod\n * const zodSchema = z.object({ title: z.string() });\n * const jsonSchema = SchemaResolver.resolve(zodSchema);\n *\n * // Yup\n * const yupSchema = yup.object({ title: yup.string().required() });\n * const jsonSchema = SchemaResolver.resolve(yupSchema);\n *\n * // Joi\n * const joiSchema = Joi.object({ title: Joi.string() });\n * const jsonSchema = SchemaResolver.resolve(joiSchema);\n *\n * // Raw JSON Schema (passthrough)\n * const rawSchema = { type: 'object', properties: { title: { type: 'string' } } };\n * const jsonSchema = SchemaResolver.resolve(rawSchema);\n * ```\n */\n static resolve(schema: TSchemaInput): IJsonSchema {\n for (const adapter of this.adapters) {\n if (adapter.canHandle(schema)) {\n return adapter.toJsonSchema(schema);\n }\n }\n\n throw new Error(\n 'Unsupported schema type. Supported types: Zod, Yup, Joi, or raw JSON Schema object.',\n );\n }\n\n /**\n * Check if a schema is supported.\n *\n * @param schema - Schema to check\n * @returns true if the schema is supported\n */\n static isSupported(schema: unknown): boolean {\n return this.adapters.some((adapter) => adapter.canHandle(schema));\n }\n\n /**\n * Get the type of a schema.\n *\n * @param schema - Schema to identify\n * @returns Schema type identifier\n */\n static getSchemaType(schema: unknown): TSchemaType {\n const adapters = this.adapters;\n\n if (adapters[0].canHandle(schema)) {\n return 'zod';\n }\n if (adapters[1].canHandle(schema)) {\n return 'yup';\n }\n if (adapters[2].canHandle(schema)) {\n return 'joi';\n }\n if (adapters[3].canHandle(schema)) {\n return 'json-schema';\n }\n\n return 'unknown';\n }\n}\n","import type { HttpClient } from '../utils/http';\nimport type {\n ISynovaPrompt,\n ISynovaGetPromptOptions,\n ISynovaExecuteOptions,\n ISynovaExecuteResponse,\n ISynovaTypedExecuteResponse,\n} from '../types';\nimport { SchemaResolver } from '../schema/resolver';\nimport { ExecutionSynovaError } from '../errors';\n\nexport class PromptsResource {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Get a prompt by ID (returns version with 'latest' tag)\n */\n async get(promptId: string, options?: ISynovaGetPromptOptions): Promise<ISynovaPrompt> {\n if (options?.version) {\n return this.http.request<ISynovaPrompt>({\n method: 'GET',\n path: `/api/v1/prompts/${promptId}/versions/${options.version}`,\n });\n }\n\n const tag = options?.tag || 'latest';\n if (tag === 'latest') {\n return this.http.request<ISynovaPrompt>({\n method: 'GET',\n path: `/api/v1/prompts/${promptId}`,\n });\n }\n\n return this.http.request<ISynovaPrompt>({\n method: 'GET',\n path: `/api/v1/prompts/${promptId}/tags/${tag}`,\n });\n }\n\n /**\n * Execute a prompt with typed response using responseSchema\n *\n * @example\n * ```ts\n * // With Zod schema - returns full response with typed object\n * const schema = z.object({ title: z.string() });\n * const result = await client.prompts.execute<z.infer<typeof schema>>('prm_abc123', {\n * provider: 'openai',\n * model: 'gpt-4o',\n * responseSchema: schema,\n * });\n * console.log(result.object.title); // Typed as string\n * console.log(result.executionUsage); // Token usage available\n *\n * // With raw JSON Schema\n * const result = await client.prompts.execute<{ title: string }>('prm_abc123', {\n * provider: 'openai',\n * model: 'gpt-4o',\n * responseSchema: { type: 'object', properties: { title: { type: 'string' } } },\n * });\n * console.log(result.object.title); // Typed\n * ```\n */\n execute<T>(\n promptId: string,\n options: ISynovaExecuteOptions & {\n responseSchema: NonNullable<ISynovaExecuteOptions['responseSchema']>;\n },\n ): Promise<ISynovaTypedExecuteResponse<T>>;\n\n /**\n * Execute a prompt\n *\n * @example\n * ```ts\n * // Without responseSchema - returns ISynovaExecuteResponse\n * const result = await client.prompts.execute('prm_abc123', {\n * provider: 'openai',\n * model: 'gpt-4o',\n * });\n * if (result.type === 'message') {\n * console.log(result.content);\n * }\n * ```\n */\n execute(promptId: string, options: ISynovaExecuteOptions): Promise<ISynovaExecuteResponse>;\n\n async execute<T>(\n promptId: string,\n options: ISynovaExecuteOptions,\n ): Promise<ISynovaTypedExecuteResponse<T> | ISynovaExecuteResponse> {\n const body: Record<string, unknown> = {\n provider: options.provider,\n model: options.model,\n };\n\n if (options.apiKey !== undefined) body.apiKey = options.apiKey;\n if (options.azureEndpoint !== undefined) body.azureEndpoint = options.azureEndpoint;\n if (options.variables !== undefined) body.variables = options.variables;\n if (options.messages !== undefined) body.messages = options.messages;\n if (options.tag !== undefined) body.tag = options.tag;\n if (options.version !== undefined) body.version = options.version;\n if (options.metadata !== undefined) body.metadata = options.metadata;\n if (options.parameters !== undefined) body.parameters = options.parameters;\n if (options.sessionId !== undefined) body.sessionId = options.sessionId;\n\n // Resolve schema if provided (supports Zod, Yup, Joi, or raw JSON Schema)\n if (options.responseSchema !== undefined) {\n body.responseSchema = SchemaResolver.resolve(options.responseSchema);\n }\n\n const response = await this.http.request<ISynovaExecuteResponse>({\n method: 'POST',\n path: `/api/v1/prompts/${promptId}/run`,\n body,\n });\n\n // Always throw on LLM error\n if (response.type === 'error' && response.error) {\n throw new ExecutionSynovaError(response.error);\n }\n\n // Return full response with typed object when responseSchema is provided\n if (options.responseSchema !== undefined) {\n if (response.object === undefined) {\n throw new Error('Expected structured response but received undefined');\n }\n return response as ISynovaTypedExecuteResponse<T>;\n }\n\n return response;\n }\n\n /**\n * Execute a prompt by tag with typed response\n */\n executeByTag<T>(\n promptId: string,\n tag: string,\n options: ISynovaExecuteOptions & {\n responseSchema: NonNullable<ISynovaExecuteOptions['responseSchema']>;\n },\n ): Promise<ISynovaTypedExecuteResponse<T>>;\n\n /**\n * Execute a prompt by tag\n */\n executeByTag(\n promptId: string,\n tag: string,\n options: ISynovaExecuteOptions,\n ): Promise<ISynovaExecuteResponse>;\n\n async executeByTag<T>(\n promptId: string,\n tag: string,\n options: ISynovaExecuteOptions,\n ): Promise<ISynovaTypedExecuteResponse<T> | ISynovaExecuteResponse> {\n return this.execute(promptId, { ...options, tag });\n }\n\n /**\n * Execute a prompt by version with typed response\n */\n executeByVersion<T>(\n promptId: string,\n version: string,\n options: ISynovaExecuteOptions & {\n responseSchema: NonNullable<ISynovaExecuteOptions['responseSchema']>;\n },\n ): Promise<ISynovaTypedExecuteResponse<T>>;\n\n /**\n * Execute a prompt by version\n */\n executeByVersion(\n promptId: string,\n version: string,\n options: ISynovaExecuteOptions,\n ): Promise<ISynovaExecuteResponse>;\n\n async executeByVersion<T>(\n promptId: string,\n version: string,\n options: ISynovaExecuteOptions,\n ): Promise<ISynovaTypedExecuteResponse<T> | ISynovaExecuteResponse> {\n return this.execute(promptId, { ...options, version });\n }\n}\n","import type { HttpClient } from '../utils/http';\nimport type { ISynovaModel, ISynovaModelsResponse, ISynovaListModelsOptions } from '../types';\n\ninterface IProviderModelsResponse {\n models: ISynovaModel[];\n}\n\nexport class ModelsResource {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * List all available models\n *\n * @param options - Optional filters\n * @returns List of providers with their models\n *\n * @example\n * ```ts\n * // Get all models\n * const { providers } = await client.models.list();\n *\n * // Filter by type\n * const imageModels = await client.models.list({ type: 'image' });\n *\n * // Filter by capability\n * const functionCallingModels = await client.models.list({\n * capability: 'function_calling',\n * });\n *\n * // Filter by provider\n * const openaiModels = await client.models.list({ provider: 'openai' });\n * ```\n */\n async list(options?: ISynovaListModelsOptions): Promise<ISynovaModelsResponse> {\n return this.http.request<ISynovaModelsResponse>({\n method: 'GET',\n path: '/api/v1/models',\n query: {\n type: options?.type,\n capability: options?.capability,\n provider: options?.provider,\n },\n });\n }\n\n /**\n * Get models for a specific provider\n *\n * @param provider - Provider ID (e.g., 'openai', 'anthropic')\n * @returns List of models for the provider\n *\n * @example\n * ```ts\n * const { models } = await client.models.getByProvider('openai');\n * ```\n */\n async getByProvider(provider: string): Promise<ISynovaModel[]> {\n const response = await this.http.request<IProviderModelsResponse>({\n method: 'GET',\n path: `/api/v1/models/${provider}`,\n });\n return response.models;\n }\n\n /**\n * Get a specific model\n *\n * @param provider - Provider ID\n * @param model - Model ID\n * @returns Model details\n *\n * @example\n * ```ts\n * const model = await client.models.get('openai', 'gpt-4o');\n * console.log(model.capabilities);\n * console.log(model.limits);\n * ```\n */\n async get(provider: string, model: string): Promise<ISynovaModel> {\n return this.http.request<ISynovaModel>({\n method: 'GET',\n path: `/api/v1/models/${provider}/${model}`,\n });\n }\n}\n","import type { HttpClient } from '../utils/http';\nimport type { ISynovaUploadResponse, ISynovaUploadOptions } from '../types';\n\nexport class FilesResource {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Upload files for use in prompt execution\n *\n * @param files - Array of File or Blob objects to upload\n * @param options - Upload options including projectId\n * @returns Upload response with file metadata\n *\n * @example\n * ```ts\n * // Upload files\n * const result = await client.files.upload(\n * [file1, file2],\n * { projectId: 'prj_abc123' }\n * );\n *\n * console.log('Uploaded files:', result.data);\n *\n * // Use uploaded file in prompt execution\n * const response = await client.prompts.execute('prm_abc123', {\n * provider: 'openai',\n * model: 'gpt-4o',\n * messages: [\n * {\n * role: 'user',\n * content: 'Describe this image',\n * files: [{ fileId: result.data[0].id }],\n * },\n * ],\n * });\n * ```\n */\n async upload(\n files: (File | Blob)[],\n options: ISynovaUploadOptions,\n ): Promise<ISynovaUploadResponse> {\n const formData = new FormData();\n\n for (const file of files) {\n formData.append('files', file);\n }\n\n formData.append('projectId', options.projectId);\n\n return this.http.upload<ISynovaUploadResponse>({\n path: '/api/v1/files/upload',\n formData,\n });\n }\n}\n","import type { HttpClient } from '../utils/http';\nimport type {\n ISynovaSpan,\n ISynovaCreateSpanOptions,\n ISynovaEndSpanOptions,\n TSynovaSpanType,\n} from '../types';\n\n/**\n * Options for wrapping a function with span tracking\n */\nexport interface ISynovaWrapOptions {\n /** Trace ID */\n traceId: string;\n /** Span type */\n type: TSynovaSpanType;\n /** Span name */\n name?: string;\n /** Parent span ID */\n parentSpanId?: string;\n /** Custom metadata */\n metadata?: Record<string, string>;\n}\n\n/**\n * Options for wrapping a tool function\n */\nexport interface ISynovaWrapToolOptions {\n /** Trace ID */\n traceId: string;\n /** Tool name */\n toolName: string;\n /** Parent span ID */\n parentSpanId?: string;\n /** Custom metadata */\n metadata?: Record<string, string>;\n}\n\n/**\n * Spans resource for observability\n *\n * @example\n * ```ts\n * // Manual: create and end span\n * const span = await client.spans.create('trc_123', {\n * type: 'tool',\n * toolName: 'fetch_weather',\n * toolArguments: { city: 'NYC' },\n * });\n * const result = await fetchWeather('NYC');\n * await client.spans.end(span.id, { status: 'completed', toolResult: result });\n *\n * // Wrapper: automatic span lifecycle\n * const weather = await client.spans.wrapTool(\n * { traceId: 'trc_123', toolName: 'fetch_weather' },\n * { city: 'NYC' },\n * (args) => fetchWeather(args.city),\n * );\n *\n * // Generic wrapper for custom spans\n * const result = await client.spans.wrap(\n * { traceId: 'trc_123', type: 'custom', name: 'validate' },\n * { input: data },\n * async () => validateData(data),\n * );\n * ```\n */\nexport class SpansResource {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Create a new span within a trace\n *\n * @param traceId - The trace ID to create span in\n * @param options - Span creation options\n * @returns Created span\n */\n async create(traceId: string, options: ISynovaCreateSpanOptions): Promise<ISynovaSpan> {\n const body: Record<string, unknown> = {\n type: options.type,\n };\n\n if (options.parentSpanId !== undefined) body.parentSpanId = options.parentSpanId;\n if (options.name !== undefined) body.name = options.name;\n if (options.input !== undefined) body.input = options.input;\n if (options.toolName !== undefined) body.toolName = options.toolName;\n if (options.toolArguments !== undefined) body.toolArguments = options.toolArguments;\n if (options.metadata !== undefined) body.metadata = options.metadata;\n\n return this.http.request<ISynovaSpan>({\n method: 'POST',\n path: `/api/v1/traces/${traceId}/spans`,\n body,\n });\n }\n\n /**\n * End/complete a span\n *\n * @param spanId - The span ID to end\n * @param options - Span end options\n * @returns Updated span\n */\n async end(spanId: string, options?: ISynovaEndSpanOptions): Promise<ISynovaSpan> {\n const body: Record<string, unknown> = {};\n\n if (options?.status !== undefined) body.status = options.status;\n if (options?.level !== undefined) body.level = options.level;\n if (options?.statusMessage !== undefined) body.statusMessage = options.statusMessage;\n if (options?.output !== undefined) body.output = options.output;\n if (options?.toolResult !== undefined) body.toolResult = options.toolResult;\n if (options?.durationMs !== undefined) body.durationMs = options.durationMs;\n\n return this.http.request<ISynovaSpan>({\n method: 'PATCH',\n path: `/api/v1/spans/${spanId}`,\n body,\n });\n }\n\n /**\n * Wrap an async function with automatic span tracking\n *\n * @param options - Span options (traceId, type, name, etc.)\n * @param input - Input data to record in span\n * @param fn - Async function to execute\n * @returns Result of the function\n *\n * @example\n * ```ts\n * const result = await client.spans.wrap(\n * { traceId: 'trc_123', type: 'retriever', name: 'vector_search' },\n * { query: 'how to...', topK: 5 },\n * async () => vectorDb.search(query),\n * );\n * ```\n */\n async wrap<T>(options: ISynovaWrapOptions, input: unknown, fn: () => Promise<T>): Promise<T> {\n const span = await this.create(options.traceId, {\n type: options.type,\n name: options.name,\n parentSpanId: options.parentSpanId,\n input,\n metadata: options.metadata,\n });\n\n try {\n const result = await fn();\n await this.end(span.id, {\n status: 'completed',\n output: result,\n });\n return result;\n } catch (error) {\n await this.end(span.id, {\n status: 'error',\n statusMessage: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n }\n\n /**\n * Wrap a tool function with automatic span tracking\n *\n * @param options - Tool span options (traceId, toolName, etc.)\n * @param args - Tool arguments to record\n * @param fn - Tool function to execute\n * @returns Result of the tool\n *\n * @example\n * ```ts\n * const weather = await client.spans.wrapTool(\n * { traceId: 'trc_123', toolName: 'fetch_weather', parentSpanId: 'spn_abc' },\n * { city: 'NYC' },\n * async (args) => fetchWeather(args.city),\n * );\n * ```\n */\n async wrapTool<TArgs extends Record<string, unknown>, TResult>(\n options: ISynovaWrapToolOptions,\n args: TArgs,\n fn: (args: TArgs) => Promise<TResult>,\n ): Promise<TResult> {\n const span = await this.create(options.traceId, {\n type: 'tool',\n toolName: options.toolName,\n toolArguments: args,\n parentSpanId: options.parentSpanId,\n metadata: options.metadata,\n });\n\n try {\n const result = await fn(args);\n await this.end(span.id, {\n status: 'completed',\n toolResult: result,\n });\n return result;\n } catch (error) {\n await this.end(span.id, {\n status: 'error',\n statusMessage: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n }\n}\n","import type { ISynovaConfig, ISynovaLogger } from './types';\nimport type { IRetryOptions } from './utils/http';\nimport { HttpClient } from './utils/http';\nimport { PromptsResource } from './resources/prompts';\nimport { ModelsResource } from './resources/models';\nimport { FilesResource } from './resources/files';\nimport { SpansResource } from './resources/spans';\n\nconst DEFAULT_BASE_URL = 'https://api.synova.cloud';\nconst DEFAULT_TIMEOUT = 30000;\n\nconst DEFAULT_RETRY: IRetryOptions = {\n maxRetries: 3,\n strategy: 'exponential',\n initialDelayMs: 1000,\n maxDelayMs: 30000,\n backoffMultiplier: 2,\n};\n\nconst DEFAULT_LOGGER: ISynovaLogger = {\n debug: (message, ...args) => console.debug(message, ...args),\n info: (message, ...args) => console.info(message, ...args),\n warn: (message, ...args) => console.warn(message, ...args),\n error: (messageOrError, ...args) => console.error(messageOrError, ...args),\n};\n\n/**\n * Synova Cloud SDK client\n *\n * @example\n * ```ts\n * import { SynovaCloudSdk } from '@synova-cloud/sdk';\n *\n * const client = new SynovaCloudSdk('your-api-key');\n *\n * // Get a prompt\n * const prompt = await client.prompts.get('prm_abc123');\n *\n * // Execute a prompt with direct API key\n * const result = await client.prompts.execute('prm_abc123', {\n * provider: 'openai',\n * model: 'gpt-4o',\n * apiKey: 'sk-...',\n * variables: { topic: 'TypeScript' },\n * });\n *\n * // Execute with Azure OpenAI\n * const azureResult = await client.prompts.execute('prm_abc123', {\n * provider: 'azure_openai',\n * model: 'gpt-4o',\n * apiKey: 'your-azure-key',\n * azureEndpoint: 'https://my-resource.openai.azure.com',\n * variables: { topic: 'TypeScript' },\n * });\n *\n * // List available models\n * const { providers } = await client.models.list();\n *\n * // Get models for a specific provider\n * const openaiModels = await client.models.getByProvider('openai');\n *\n * // With custom retry config\n * const clientWithRetry = new SynovaCloudSdk('your-api-key', {\n * retry: {\n * maxRetries: 5,\n * strategy: 'linear',\n * initialDelayMs: 500,\n * },\n * });\n * ```\n */\nexport class SynovaCloudSdk {\n readonly prompts: PromptsResource;\n readonly models: ModelsResource;\n readonly files: FilesResource;\n readonly spans: SpansResource;\n\n private readonly http: HttpClient;\n\n /**\n * Create a new Synova Cloud SDK client\n *\n * @param apiKey - Your Synova API key\n * @param config - Optional configuration\n */\n constructor(apiKey: string, config?: ISynovaConfig) {\n if (!apiKey) {\n throw new Error('API key is required');\n }\n\n this.http = new HttpClient({\n baseUrl: config?.baseUrl ?? DEFAULT_BASE_URL,\n apiKey,\n timeout: config?.timeout ?? DEFAULT_TIMEOUT,\n retry: {\n maxRetries: config?.retry?.maxRetries ?? DEFAULT_RETRY.maxRetries,\n strategy: config?.retry?.strategy ?? DEFAULT_RETRY.strategy,\n initialDelayMs: config?.retry?.initialDelayMs ?? DEFAULT_RETRY.initialDelayMs,\n maxDelayMs: config?.retry?.maxDelayMs ?? DEFAULT_RETRY.maxDelayMs,\n backoffMultiplier: config?.retry?.backoffMultiplier ?? DEFAULT_RETRY.backoffMultiplier,\n },\n debug: config?.debug ?? false,\n logger: config?.logger ?? DEFAULT_LOGGER,\n });\n\n this.prompts = new PromptsResource(this.http);\n this.models = new ModelsResource(this.http);\n this.files = new FilesResource(this.http);\n this.spans = new SpansResource(this.http);\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@synova-cloud/sdk",
3
- "version": "2.0.0",
3
+ "version": "2.0.1",
4
4
  "description": "Official Node.js SDK for Synova Cloud API",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",