@tchavi/sdk 0.1.1 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/dist/index.cjs +28 -36
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +0 -4
- package/dist/index.d.ts +0 -4
- package/dist/index.js +28 -36
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -36,7 +36,7 @@ console.log(response.choices[0].message.content);
|
|
|
36
36
|
console.log('Credits used:', response.tchavi.credits_used);
|
|
37
37
|
```
|
|
38
38
|
|
|
39
|
-
Get your API key from the [Tchavi dashboard](https://
|
|
39
|
+
Get your API key from the [Tchavi dashboard](https://tchavi.com/api-keys).
|
|
40
40
|
|
|
41
41
|
---
|
|
42
42
|
|
|
@@ -225,7 +225,7 @@ const client = new Tchavi({
|
|
|
225
225
|
password: 'my-password', // (requires email)
|
|
226
226
|
|
|
227
227
|
// Optional:
|
|
228
|
-
baseURL: 'https://tchavi.com', // Default:
|
|
228
|
+
baseURL: 'https://tchavi.com', // Default: https://tchavi.com/api
|
|
229
229
|
maxRetries: 2, // Retries on 429/502/503. Default: 2
|
|
230
230
|
timeout: 60_000, // Request timeout in ms. Default: 60000
|
|
231
231
|
});
|
|
@@ -236,7 +236,7 @@ const client = new Tchavi({
|
|
|
236
236
|
| `apiKey` | `string` | — | API key (`sk-tch-...`) for proxy auth |
|
|
237
237
|
| `email` | `string` | — | Email for JWT auth |
|
|
238
238
|
| `password` | `string` | — | Password for JWT auth |
|
|
239
|
-
| `baseURL` | `string` | `
|
|
239
|
+
| `baseURL` | `string` | `https://tchavi.com/api` | API base URL (set to your production URL in deployed apps) |
|
|
240
240
|
| `maxRetries` | `number` | `2` | Max retries on transient errors |
|
|
241
241
|
| `timeout` | `number` | `60000` | Request timeout (ms) |
|
|
242
242
|
|
package/dist/index.cjs
CHANGED
|
@@ -90,7 +90,7 @@ var AuthStrategy = class {
|
|
|
90
90
|
}
|
|
91
91
|
};
|
|
92
92
|
|
|
93
|
-
// src/errors
|
|
93
|
+
// src/errors.ts
|
|
94
94
|
var TchaviError = class extends Error {
|
|
95
95
|
constructor(message) {
|
|
96
96
|
super(message);
|
|
@@ -98,41 +98,6 @@ var TchaviError = class extends Error {
|
|
|
98
98
|
Object.setPrototypeOf(this, new.target.prototype);
|
|
99
99
|
}
|
|
100
100
|
};
|
|
101
|
-
|
|
102
|
-
// src/errors/TchaviAuthenticationError.ts
|
|
103
|
-
var TchaviAuthenticationError = class extends TchaviAPIError {
|
|
104
|
-
constructor(response, headers = {}) {
|
|
105
|
-
super(response, headers);
|
|
106
|
-
this.name = "TchaviAuthenticationError";
|
|
107
|
-
Object.setPrototypeOf(this, new.target.prototype);
|
|
108
|
-
}
|
|
109
|
-
};
|
|
110
|
-
|
|
111
|
-
// src/errors/TchaviRateLimitError.ts
|
|
112
|
-
var TchaviRateLimitError = class extends TchaviAPIError {
|
|
113
|
-
retryAfter;
|
|
114
|
-
constructor(response, headers = {}) {
|
|
115
|
-
super(response, headers);
|
|
116
|
-
this.name = "TchaviRateLimitError";
|
|
117
|
-
const details = response.details;
|
|
118
|
-
this.retryAfter = details?.retry_after ?? (headers["retry-after"] ? parseInt(headers["retry-after"], 10) : null);
|
|
119
|
-
Object.setPrototypeOf(this, new.target.prototype);
|
|
120
|
-
}
|
|
121
|
-
};
|
|
122
|
-
|
|
123
|
-
// src/errors/TchaviInsufficientCreditsError.ts
|
|
124
|
-
var TchaviInsufficientCreditsError = class extends TchaviAPIError {
|
|
125
|
-
creditsRemaining;
|
|
126
|
-
constructor(response, headers = {}) {
|
|
127
|
-
super(response, headers);
|
|
128
|
-
this.name = "TchaviInsufficientCreditsError";
|
|
129
|
-
const details = response.details;
|
|
130
|
-
this.creditsRemaining = details?.credits_remaining ?? 0;
|
|
131
|
-
Object.setPrototypeOf(this, new.target.prototype);
|
|
132
|
-
}
|
|
133
|
-
};
|
|
134
|
-
|
|
135
|
-
// src/errors/TchaviAPIError.ts
|
|
136
101
|
var TchaviAPIError = class _TchaviAPIError extends TchaviError {
|
|
137
102
|
statusCode;
|
|
138
103
|
errorCode;
|
|
@@ -163,6 +128,33 @@ var TchaviAPIError = class _TchaviAPIError extends TchaviError {
|
|
|
163
128
|
}
|
|
164
129
|
}
|
|
165
130
|
};
|
|
131
|
+
var TchaviAuthenticationError = class extends TchaviAPIError {
|
|
132
|
+
constructor(response, headers = {}) {
|
|
133
|
+
super(response, headers);
|
|
134
|
+
this.name = "TchaviAuthenticationError";
|
|
135
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
var TchaviRateLimitError = class extends TchaviAPIError {
|
|
139
|
+
retryAfter;
|
|
140
|
+
constructor(response, headers = {}) {
|
|
141
|
+
super(response, headers);
|
|
142
|
+
this.name = "TchaviRateLimitError";
|
|
143
|
+
const details = response.details;
|
|
144
|
+
this.retryAfter = details?.retry_after ?? (headers["retry-after"] ? parseInt(headers["retry-after"], 10) : null);
|
|
145
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
146
|
+
}
|
|
147
|
+
};
|
|
148
|
+
var TchaviInsufficientCreditsError = class extends TchaviAPIError {
|
|
149
|
+
creditsRemaining;
|
|
150
|
+
constructor(response, headers = {}) {
|
|
151
|
+
super(response, headers);
|
|
152
|
+
this.name = "TchaviInsufficientCreditsError";
|
|
153
|
+
const details = response.details;
|
|
154
|
+
this.creditsRemaining = details?.credits_remaining ?? 0;
|
|
155
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
156
|
+
}
|
|
157
|
+
};
|
|
166
158
|
|
|
167
159
|
// src/core/http-client.ts
|
|
168
160
|
var RETRYABLE_STATUS = /* @__PURE__ */ new Set([429, 502, 503]);
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/auth.ts","../src/errors/TchaviError.ts","../src/errors/TchaviAuthenticationError.ts","../src/errors/TchaviRateLimitError.ts","../src/errors/TchaviInsufficientCreditsError.ts","../src/errors/TchaviAPIError.ts","../src/core/http-client.ts","../src/core/streaming.ts","../src/resources/chat/completions.ts","../src/resources/chat/index.ts","../src/resources/embeddings.ts","../src/resources/images/generations.ts","../src/resources/images/index.ts","../src/resources/credits.ts","../src/resources/api-keys.ts","../src/resources/usage.ts","../src/resources/models.ts","../src/resources/payments.ts","../src/resources/auth-resource.ts","../src/resources/users.ts","../src/tchavi.ts","../src/index.ts"],"names":["body"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { TchaviClientOptions } from '../types/common.js';\n\nexport type AuthMode = 'api-key' | 'jwt';\n\n/**\n * AuthStrategy holds and refreshes credentials.\n * - API key mode: static header, no state\n * - JWT mode: logs in lazily, stores the access token in memory,\n * refreshes via /auth/refresh cookie when the token expires\n */\nexport class AuthStrategy {\n private mode: AuthMode;\n private apiKey?: string;\n private accessToken?: string;\n private tokenExpiresAt?: number;\n private baseURL: string;\n private email?: string;\n private password?: string;\n\n constructor(options: TchaviClientOptions) {\n this.baseURL = options.baseURL ?? 'http://localhost:3001';\n if (options.apiKey) {\n this.mode = 'api-key';\n this.apiKey = options.apiKey;\n } else if (options.email && options.password) {\n this.mode = 'jwt';\n this.email = options.email;\n this.password = options.password;\n } else {\n throw new Error(\n 'TchaviClientOptions must provide either `apiKey` or both `email` and `password`.',\n );\n }\n }\n\n /**\n * Returns the Authorization header value for the current request.\n * For JWT mode, lazily logs in and refreshes the token as needed.\n */\n async getAuthHeader(): Promise<string> {\n if (this.mode === 'api-key') {\n return `Bearer ${this.apiKey}`;\n }\n\n if (!this.accessToken || this.isTokenExpired()) {\n await this.loginOrRefresh();\n }\n\n return `Bearer ${this.accessToken}`;\n }\n\n /** Store a token (e.g. after explicit login() call from AuthResource) */\n setAccessToken(token: string, expiresInSeconds = 900): void {\n this.accessToken = token;\n this.tokenExpiresAt = Date.now() + (expiresInSeconds - 30) * 1000;\n }\n\n getMode(): AuthMode {\n return this.mode;\n }\n\n private isTokenExpired(): boolean {\n if (!this.tokenExpiresAt) return true;\n return Date.now() >= this.tokenExpiresAt;\n }\n\n private async loginOrRefresh(): Promise<void> {\n const refreshed = await this.tryRefresh();\n if (!refreshed) {\n await this.loginWithPassword();\n }\n }\n\n private async tryRefresh(): Promise<boolean> {\n try {\n const resp = await fetch(`${this.baseURL}/auth/refresh`, {\n method: 'POST',\n credentials: 'include',\n headers: { 'Content-Type': 'application/json' },\n });\n if (!resp.ok) return false;\n const body = (await resp.json()) as { accessToken: string };\n this.setAccessToken(body.accessToken);\n return true;\n } catch {\n return false;\n }\n }\n\n private async loginWithPassword(): Promise<void> {\n const resp = await fetch(`${this.baseURL}/auth/login`, {\n method: 'POST',\n credentials: 'include',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ email: this.email, password: this.password }),\n });\n\n if (!resp.ok) {\n const body = (await resp.json().catch(() => ({}))) as Record<string, unknown>;\n throw new Error(\n `Tchavi auth failed: ${(body['message'] as string | undefined) ?? resp.statusText}`,\n );\n }\n\n const body = (await resp.json()) as { accessToken: string };\n this.setAccessToken(body.accessToken);\n }\n}\n","/**\n * Base error for all Tchavi SDK errors.\n * Catches both network-level and API-level failures.\n */\nexport class TchaviError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'TchaviError';\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","import { TchaviAPIError } from './TchaviAPIError.js';\nimport type { TchaviErrorResponse } from '../types/common.js';\n\n/** Thrown when the gateway returns 401 (invalid/missing API key or JWT) */\nexport class TchaviAuthenticationError extends TchaviAPIError {\n constructor(response: TchaviErrorResponse, headers: Record<string, string> = {}) {\n super(response, headers);\n this.name = 'TchaviAuthenticationError';\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","import { TchaviAPIError } from './TchaviAPIError.js';\nimport type { TchaviErrorResponse } from '../types/common.js';\n\n/** Thrown on 429. `retryAfter` is in seconds if provided by the server. */\nexport class TchaviRateLimitError extends TchaviAPIError {\n readonly retryAfter: number | null;\n\n constructor(response: TchaviErrorResponse, headers: Record<string, string> = {}) {\n super(response, headers);\n this.name = 'TchaviRateLimitError';\n const details = response.details as Record<string, unknown> | undefined;\n this.retryAfter =\n (details?.retry_after as number | undefined) ??\n (headers['retry-after'] ? parseInt(headers['retry-after'], 10) : null);\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","import { TchaviAPIError } from './TchaviAPIError.js';\nimport type { TchaviErrorResponse } from '../types/common.js';\n\n/** Thrown on 402. `creditsRemaining` reflects your current balance. */\nexport class TchaviInsufficientCreditsError extends TchaviAPIError {\n readonly creditsRemaining: number;\n\n constructor(response: TchaviErrorResponse, headers: Record<string, string> = {}) {\n super(response, headers);\n this.name = 'TchaviInsufficientCreditsError';\n const details = response.details as Record<string, unknown> | undefined;\n this.creditsRemaining = (details?.credits_remaining as number | undefined) ?? 0;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","import { TchaviError } from './TchaviError.js';\nimport type { TchaviErrorResponse } from '../types/common.js';\n\n/**\n * An error returned by the Tchavi API as a JSON response.\n * Maps directly to the server's { error, message, statusCode } shape.\n */\nexport class TchaviAPIError extends TchaviError {\n readonly statusCode: number;\n readonly errorCode: string;\n readonly details?: unknown;\n readonly headers: Record<string, string>;\n\n constructor(response: TchaviErrorResponse, headers: Record<string, string> = {}) {\n super(response.message);\n this.name = 'TchaviAPIError';\n this.statusCode = response.statusCode;\n this.errorCode = response.error;\n this.details = response.details;\n this.headers = headers;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n\n /**\n * Factory: inspect the raw response and construct the most specific subclass.\n */\n static fromResponse(\n response: TchaviErrorResponse,\n headers: Record<string, string>,\n ): TchaviAPIError {\n switch (response.statusCode) {\n case 401:\n return new TchaviAuthenticationError(response, headers);\n case 402:\n return new TchaviInsufficientCreditsError(response, headers);\n case 429:\n return new TchaviRateLimitError(response, headers);\n default:\n return new TchaviAPIError(response, headers);\n }\n }\n}\n\n// Imported at EOF to avoid circular dependency: subclasses extend TchaviAPIError\n// which is defined above, so they must be imported after the class declaration.\nimport { TchaviAuthenticationError } from './TchaviAuthenticationError.js';\nimport { TchaviRateLimitError } from './TchaviRateLimitError.js';\nimport { TchaviInsufficientCreditsError } from './TchaviInsufficientCreditsError.js';\n","import { TchaviAPIError } from '../errors/TchaviAPIError.js';\nimport { TchaviError } from '../errors/TchaviError.js';\nimport type { AuthStrategy } from './auth.js';\nimport type { TchaviErrorResponse } from '../types/common.js';\n\nexport interface RequestOptions {\n method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n path: string;\n body?: unknown;\n query?: Record<string, string | number | boolean | undefined>;\n /** Skip auth header (used for public endpoints) */\n skipAuth?: boolean;\n /** Override timeout for this specific request */\n timeout?: number;\n}\n\nconst RETRYABLE_STATUS = new Set([429, 502, 503]);\n\n/**\n * Core HTTP client. All resource classes use this.\n *\n * Handles:\n * - Auth header injection\n * - Query string serialization\n * - JSON body serialization\n * - Non-2xx error mapping to typed error classes\n * - Exponential backoff with jitter for retryable responses\n * - AbortController-based timeouts\n */\nexport class HttpClient {\n private baseURL: string;\n private maxRetries: number;\n private defaultTimeout: number;\n private auth: AuthStrategy;\n\n constructor(auth: AuthStrategy, baseURL: string, maxRetries: number, timeout: number) {\n this.auth = auth;\n this.baseURL = baseURL.replace(/\\/$/, '');\n this.maxRetries = maxRetries;\n this.defaultTimeout = timeout;\n }\n\n async request<T>(options: RequestOptions): Promise<T> {\n const response = await this.requestRaw(options);\n return response.json() as Promise<T>;\n }\n\n /**\n * Returns the raw Response — used for streaming so callers can pipe the body.\n */\n async requestRaw(options: RequestOptions): Promise<Response> {\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= this.maxRetries; attempt++) {\n if (attempt > 0) {\n await this.sleep(this.backoffMs(attempt));\n }\n\n const controller = new AbortController();\n const timeout = options.timeout ?? this.defaultTimeout;\n const timerId = setTimeout(() => controller.abort(), timeout);\n\n try {\n const url = this.buildURL(options.path, options.query);\n const authHeader = options.skipAuth ? undefined : await this.auth.getAuthHeader();\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n if (authHeader) {\n headers['Authorization'] = authHeader;\n }\n\n const fetchOptions: RequestInit = {\n method: options.method ?? 'GET',\n headers,\n signal: controller.signal,\n credentials: 'include',\n };\n\n if (options.body !== undefined) {\n fetchOptions.body = JSON.stringify(options.body);\n }\n\n const response = await fetch(url, fetchOptions);\n clearTimeout(timerId);\n\n if (response.ok) {\n return response;\n }\n\n if (RETRYABLE_STATUS.has(response.status) && attempt < this.maxRetries) {\n const retryAfter = response.headers.get('Retry-After');\n if (retryAfter) {\n const seconds = parseInt(retryAfter, 10);\n if (!Number.isNaN(seconds) && seconds > 0) {\n await this.sleep(seconds * 1000);\n }\n }\n lastError = new TchaviError(`HTTP ${response.status} ${response.statusText}`);\n continue;\n }\n\n let errorBody: TchaviErrorResponse;\n try {\n errorBody = (await response.json()) as TchaviErrorResponse;\n } catch {\n errorBody = {\n error: 'unknown_error',\n message: response.statusText,\n statusCode: response.status,\n };\n }\n\n const headersObj: Record<string, string> = {};\n response.headers.forEach((value, key) => {\n headersObj[key] = value;\n });\n\n throw TchaviAPIError.fromResponse(errorBody, headersObj);\n } catch (err) {\n clearTimeout(timerId);\n if (err instanceof TchaviAPIError) throw err;\n\n if ((err as Error).name === 'AbortError') {\n throw new TchaviError(`Request timed out after ${timeout}ms`);\n }\n\n lastError = err;\n if (attempt === this.maxRetries) {\n throw new TchaviError(`Network error: ${(err as Error).message}`);\n }\n }\n }\n\n throw new TchaviError(`Request failed after ${this.maxRetries} retries: ${String(lastError)}`);\n }\n\n private buildURL(\n path: string,\n query?: Record<string, string | number | boolean | undefined>,\n ): string {\n const url = new URL(`${this.baseURL}${path}`);\n if (query) {\n for (const [key, value] of Object.entries(query)) {\n if (value !== undefined) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n return url.toString();\n }\n\n /** Exponential backoff with full jitter */\n private backoffMs(attempt: number): number {\n const base = 500;\n const cap = 10_000;\n const ceiling = Math.min(cap, base * Math.pow(2, attempt));\n return Math.random() * ceiling;\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n","import { TchaviError } from '../errors/TchaviError.js';\nimport type { TchaviMeta } from '../types/common.js';\nimport type { StreamEvent } from '../types/streaming.js';\n\n/** Maximum SSE buffer size (1 MB) to prevent OOM from broken servers. */\nconst MAX_BUFFER_SIZE = 1_048_576;\n\n/**\n * Parses a ReadableStream<Uint8Array> SSE response from Tchavi into\n * an AsyncIterable of typed StreamEvent<T> objects.\n *\n * Protocol:\n * Standard chunks: \"data: {...json...}\\n\\n\"\n * Done marker: \"data: [DONE]\\n\\n\"\n * Tchavi metadata: \"event: tchavi\\ndata: {...json...}\\n\\n\"\n */\nexport async function* parseStream<T>(\n body: ReadableStream<Uint8Array>,\n): AsyncGenerator<StreamEvent<T>> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n\n if (buffer.length > MAX_BUFFER_SIZE) {\n throw new TchaviError(\n `SSE buffer exceeded ${MAX_BUFFER_SIZE} bytes — possible malformed stream`,\n );\n }\n\n const events = buffer.split('\\n\\n');\n buffer = events.pop() ?? '';\n\n for (const rawEvent of events) {\n const lines = rawEvent.split('\\n');\n let eventType: string | undefined;\n let dataLine: string | undefined;\n\n for (const line of lines) {\n if (line.startsWith('event: ')) {\n eventType = line.slice(7).trim();\n } else if (line.startsWith('data: ')) {\n dataLine = line.slice(6).trim();\n }\n }\n\n if (!dataLine) continue;\n\n if (dataLine === '[DONE]') {\n yield { type: 'done' };\n return;\n }\n\n if (eventType === 'tchavi') {\n try {\n const meta = JSON.parse(dataLine) as TchaviMeta;\n yield { type: 'tchavi', data: meta };\n } catch {\n // Malformed tchavi event — skip\n }\n continue;\n }\n\n try {\n const parsed = JSON.parse(dataLine) as T;\n yield { type: 'data', data: parsed };\n } catch {\n // Non-JSON data line — skip\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\n/**\n * Wraps an SSE ReadableStream as an AsyncIterable<T>.\n * Stores the final Tchavi metadata so it can be accessed after iteration.\n *\n * @example\n * ```ts\n * const stream = await client.chat.completions.create({ ..., stream: true });\n * for await (const chunk of stream) {\n * process.stdout.write(chunk.choices[0]?.delta?.content ?? '');\n * }\n * console.log('Credits used:', stream.finalMeta()?.credits_used);\n * ```\n */\nexport class TchaviStream<T> implements AsyncIterable<T> {\n private body: ReadableStream<Uint8Array>;\n private _tchaviMeta: TchaviMeta | null = null;\n\n constructor(body: ReadableStream<Uint8Array>) {\n this.body = body;\n }\n\n [Symbol.asyncIterator](): AsyncIterator<T> {\n return this._consume();\n }\n\n private async *_consume(): AsyncGenerator<T> {\n try {\n for await (const event of parseStream<T>(this.body)) {\n if (event.type === 'data') {\n yield event.data;\n } else if (event.type === 'tchavi') {\n this._tchaviMeta = event.data;\n }\n }\n } finally {\n // Release stream resources if iteration is abandoned early (e.g. break)\n this.body.cancel().catch(() => {});\n }\n }\n\n /** Returns Tchavi credit metadata once the stream is fully consumed. */\n finalMeta(): TchaviMeta | null {\n return this._tchaviMeta;\n }\n}\n","import type { HttpClient } from '../../core/http-client.js';\nimport { TchaviStream } from '../../core/streaming.js';\nimport { TchaviError } from '../../errors/TchaviError.js';\nimport type {\n ChatCompletionCreateParamsNonStreaming,\n ChatCompletionCreateParamsStreaming,\n ChatCompletionCreateParams,\n ChatCompletion,\n ChatCompletionChunk,\n} from '../../types/chat.js';\n\nexport class Completions {\n constructor(private http: HttpClient) {}\n\n create(params: ChatCompletionCreateParamsNonStreaming): Promise<ChatCompletion>;\n create(params: ChatCompletionCreateParamsStreaming): Promise<TchaviStream<ChatCompletionChunk>>;\n async create(\n params: ChatCompletionCreateParams,\n ): Promise<ChatCompletion | TchaviStream<ChatCompletionChunk>> {\n if (params.stream === true) {\n const response = await this.http.requestRaw({\n method: 'POST',\n path: '/v1/chat/completions',\n body: params,\n timeout: 120_000,\n });\n\n if (!response.body) {\n throw new TchaviError('Streaming response has no body');\n }\n\n return new TchaviStream<ChatCompletionChunk>(response.body);\n }\n\n return this.http.request<ChatCompletion>({\n method: 'POST',\n path: '/v1/chat/completions',\n body: params,\n });\n }\n}\n","import type { HttpClient } from '../../core/http-client.js';\nimport { Completions } from './completions.js';\n\nexport class Chat {\n readonly completions: Completions;\n\n constructor(http: HttpClient) {\n this.completions = new Completions(http);\n }\n}\n","import type { HttpClient } from '../core/http-client.js';\nimport type { EmbeddingCreateParams, EmbeddingsResponse } from '../types/embeddings.js';\n\nexport class Embeddings {\n constructor(private http: HttpClient) {}\n\n create(params: EmbeddingCreateParams): Promise<EmbeddingsResponse> {\n return this.http.request({\n method: 'POST',\n path: '/v1/embeddings',\n body: params,\n });\n }\n}\n","import type { HttpClient } from '../../core/http-client.js';\nimport type { ImageGenerationParams, ImagesResponse } from '../../types/images.js';\n\nexport class Generations {\n constructor(private http: HttpClient) {}\n\n create(params: ImageGenerationParams): Promise<ImagesResponse> {\n return this.http.request({\n method: 'POST',\n path: '/v1/images/generations',\n body: params,\n });\n }\n}\n","import type { HttpClient } from '../../core/http-client.js';\nimport { Generations } from './generations.js';\n\nexport class Images {\n readonly generations: Generations;\n\n constructor(http: HttpClient) {\n this.generations = new Generations(http);\n }\n}\n","import type { HttpClient } from '../core/http-client.js';\nimport type { CreditBalance, CreditPack } from '../types/credits.js';\n\nexport class Credits {\n constructor(private http: HttpClient) {}\n\n getBalance(): Promise<CreditBalance> {\n return this.http.request({ path: '/credits/balance' });\n }\n\n listPacks(): Promise<CreditPack[]> {\n return this.http.request({ path: '/credits/packs', skipAuth: true });\n }\n}\n","import type { HttpClient } from '../core/http-client.js';\nimport type {\n ApiKey,\n ApiKeyWithSecret,\n CreateApiKeyParams,\n UpdateApiKeyParams,\n} from '../types/api-keys.js';\n\nexport class ApiKeys {\n constructor(private http: HttpClient) {}\n\n list(): Promise<ApiKey[]> {\n return this.http.request({ path: '/api-keys' });\n }\n\n create(params: CreateApiKeyParams = {}): Promise<ApiKeyWithSecret> {\n return this.http.request({ method: 'POST', path: '/api-keys', body: params });\n }\n\n retrieve(id: string): Promise<ApiKey> {\n return this.http.request({ path: `/api-keys/${id}` });\n }\n\n update(id: string, params: UpdateApiKeyParams): Promise<ApiKey> {\n return this.http.request({ method: 'PUT', path: `/api-keys/${id}`, body: params });\n }\n\n delete(id: string): Promise<{ message: string }> {\n return this.http.request({ method: 'DELETE', path: `/api-keys/${id}` });\n }\n}\n","import type { HttpClient } from '../core/http-client.js';\nimport type { UsageStats, UsageLog, GetStatsParams, GetHistoryParams } from '../types/usage.js';\nimport type { PaginatedResponse } from '../types/common.js';\n\nexport class Usage {\n constructor(private http: HttpClient) {}\n\n getStats(params: GetStatsParams = {}): Promise<UsageStats> {\n return this.http.request({\n path: '/usage/stats',\n query: params as Record<string, string>,\n });\n }\n\n getHistory(params: GetHistoryParams = {}): Promise<PaginatedResponse<UsageLog>> {\n return this.http.request({\n path: '/usage/history',\n query: params as Record<string, string | number>,\n });\n }\n}\n","import type { HttpClient } from '../core/http-client.js';\nimport type { ModelTierConfig } from '../types/models.js';\n\nexport class Models {\n constructor(private http: HttpClient) {}\n\n /** Lists all active model tiers. Pass `all: true` to include inactive ones (admin only). */\n list(params: { all?: boolean } = {}): Promise<ModelTierConfig[]> {\n return this.http.request({\n path: '/model-tiers',\n query: params.all ? { all: 'true' } : undefined,\n skipAuth: true,\n });\n }\n}\n","import type { HttpClient } from '../core/http-client.js';\nimport type { Payment, InitiatePaymentParams, PaymentInitiateResponse } from '../types/payments.js';\nimport type { PaginatedResponse } from '../types/common.js';\n\nexport class Payments {\n constructor(private http: HttpClient) {}\n\n initiate(params: InitiatePaymentParams): Promise<PaymentInitiateResponse> {\n return this.http.request({ method: 'POST', path: '/payments/initiate', body: params });\n }\n\n getStatus(id: string): Promise<Payment> {\n return this.http.request({ path: `/payments/status/${id}` });\n }\n\n getHistory(params: { page?: number; limit?: number } = {}): Promise<PaginatedResponse<Payment>> {\n return this.http.request({\n path: '/payments/history',\n query: params as Record<string, number>,\n });\n }\n}\n","import type { HttpClient } from '../core/http-client.js';\nimport type { AuthStrategy } from '../core/auth.js';\nimport type { RegisterParams, LoginResponse, User } from '../types/auth.js';\n\nexport class AuthResource {\n constructor(\n private http: HttpClient,\n private authStrategy: AuthStrategy,\n ) {}\n\n async login(email: string, password: string): Promise<LoginResponse> {\n const result = await this.http.request<LoginResponse>({\n method: 'POST',\n path: '/auth/login',\n body: { email, password },\n skipAuth: true,\n });\n this.authStrategy.setAccessToken(result.accessToken);\n return result;\n }\n\n register(params: RegisterParams): Promise<{ message: string; user: User }> {\n return this.http.request({\n method: 'POST',\n path: '/auth/register',\n body: params,\n skipAuth: true,\n });\n }\n\n logout(): Promise<{ message: string }> {\n return this.http.request({ method: 'POST', path: '/auth/logout' });\n }\n}\n","import type { HttpClient } from '../core/http-client.js';\nimport type { User, UpdateUserParams } from '../types/auth.js';\n\nexport class Users {\n constructor(private http: HttpClient) {}\n\n me(): Promise<User> {\n return this.http.request({ path: '/users/me' });\n }\n\n update(params: UpdateUserParams): Promise<User> {\n return this.http.request({ method: 'PUT', path: '/users/me', body: params });\n }\n}\n","import { AuthStrategy } from './core/auth.js';\nimport { HttpClient } from './core/http-client.js';\nimport { Chat } from './resources/chat/index.js';\nimport { Embeddings } from './resources/embeddings.js';\nimport { Images } from './resources/images/index.js';\nimport { Credits } from './resources/credits.js';\nimport { ApiKeys } from './resources/api-keys.js';\nimport { Usage } from './resources/usage.js';\nimport { Models } from './resources/models.js';\nimport { Payments } from './resources/payments.js';\nimport { AuthResource } from './resources/auth-resource.js';\nimport { Users } from './resources/users.js';\nimport type { TchaviClientOptions } from './types/common.js';\n\nconst DEFAULT_BASE_URL = 'http://localhost:3001';\nconst DEFAULT_MAX_RETRIES = 2;\nconst DEFAULT_TIMEOUT = 60_000;\n\n/**\n * Main Tchavi client. Mirrors the OpenAI SDK's resource-based API.\n *\n * @example API key mode (proxy endpoints):\n * ```ts\n * import Tchavi from '@tchavi/sdk';\n *\n * const client = new Tchavi({ apiKey: 'sk-tch-...' });\n *\n * const completion = await client.chat.completions.create({\n * model: 'gpt-4o-mini',\n * messages: [{ role: 'user', content: 'Hello' }],\n * });\n * console.log(completion.choices[0].message.content);\n * console.log(completion.tchavi.credits_used);\n * ```\n *\n * @example JWT mode (account management):\n * ```ts\n * const client = new Tchavi({ email: 'me@example.com', password: 'S3cret!' });\n * const balance = await client.credits.getBalance();\n * const keys = await client.apiKeys.list();\n * ```\n *\n * @example Streaming:\n * ```ts\n * const stream = await client.chat.completions.create({\n * model: 'gpt-4o',\n * messages: [{ role: 'user', content: 'Tell me a story' }],\n * stream: true,\n * });\n * for await (const chunk of stream) {\n * process.stdout.write(chunk.choices[0]?.delta?.content ?? '');\n * }\n * console.log('\\nCredits used:', stream.finalMeta()?.credits_used);\n * ```\n */\nexport class Tchavi {\n readonly chat: Chat;\n readonly embeddings: Embeddings;\n readonly images: Images;\n readonly credits: Credits;\n readonly apiKeys: ApiKeys;\n readonly usage: Usage;\n readonly models: Models;\n readonly payments: Payments;\n readonly auth: AuthResource;\n readonly users: Users;\n\n constructor(options: TchaviClientOptions) {\n const baseURL = options.baseURL ?? DEFAULT_BASE_URL;\n const maxRetries = options.maxRetries ?? DEFAULT_MAX_RETRIES;\n const timeout = options.timeout ?? DEFAULT_TIMEOUT;\n\n const authStrategy = new AuthStrategy(options);\n const http = new HttpClient(authStrategy, baseURL, maxRetries, timeout);\n\n this.chat = new Chat(http);\n this.embeddings = new Embeddings(http);\n this.images = new Images(http);\n this.credits = new Credits(http);\n this.apiKeys = new ApiKeys(http);\n this.usage = new Usage(http);\n this.models = new Models(http);\n this.payments = new Payments(http);\n this.auth = new AuthResource(http, authStrategy);\n this.users = new Users(http);\n }\n}\n","import { Tchavi } from './tchavi.js';\nexport default Tchavi;\nexport { Tchavi };\nexport { TchaviStream } from './core/streaming.js';\n\nexport {\n TchaviError,\n TchaviAPIError,\n TchaviAuthenticationError,\n TchaviRateLimitError,\n TchaviInsufficientCreditsError,\n} from './errors/index.js';\n\nexport type * from './types/index.js';\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/auth.ts","../src/errors.ts","../src/core/http-client.ts","../src/core/streaming.ts","../src/resources/chat/completions.ts","../src/resources/chat/index.ts","../src/resources/embeddings.ts","../src/resources/images/generations.ts","../src/resources/images/index.ts","../src/resources/credits.ts","../src/resources/api-keys.ts","../src/resources/usage.ts","../src/resources/models.ts","../src/resources/payments.ts","../src/resources/auth-resource.ts","../src/resources/users.ts","../src/tchavi.ts","../src/index.ts"],"names":["body"],"mappings":";;;;;AAUO,IAAM,eAAN,MAAmB;AAAA,EAChB,IAAA;AAAA,EACA,MAAA;AAAA,EACA,WAAA;AAAA,EACA,cAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EAER,YAAY,OAAA,EAA8B;AACxC,IAAA,IAAA,CAAK,OAAA,GAAU,QAAQ,OAAA,IAAW,uBAAA;AAClC,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,IAAA,CAAK,IAAA,GAAO,SAAA;AACZ,MAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AAAA,IACxB,CAAA,MAAA,IAAW,OAAA,CAAQ,KAAA,IAAS,OAAA,CAAQ,QAAA,EAAU;AAC5C,MAAA,IAAA,CAAK,IAAA,GAAO,KAAA;AACZ,MAAA,IAAA,CAAK,QAAQ,OAAA,CAAQ,KAAA;AACrB,MAAA,IAAA,CAAK,WAAW,OAAA,CAAQ,QAAA;AAAA,IAC1B,CAAA,MAAO;AACL,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,aAAA,GAAiC;AACrC,IAAA,IAAI,IAAA,CAAK,SAAS,SAAA,EAAW;AAC3B,MAAA,OAAO,CAAA,OAAA,EAAU,KAAK,MAAM,CAAA,CAAA;AAAA,IAC9B;AAEA,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,gBAAe,EAAG;AAC9C,MAAA,MAAM,KAAK,cAAA,EAAe;AAAA,IAC5B;AAEA,IAAA,OAAO,CAAA,OAAA,EAAU,KAAK,WAAW,CAAA,CAAA;AAAA,EACnC;AAAA;AAAA,EAGA,cAAA,CAAe,KAAA,EAAe,gBAAA,GAAmB,GAAA,EAAW;AAC1D,IAAA,IAAA,CAAK,WAAA,GAAc,KAAA;AACnB,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAA,CAAK,GAAA,EAAI,GAAA,CAAK,mBAAmB,EAAA,IAAM,GAAA;AAAA,EAC/D;AAAA,EAEA,OAAA,GAAoB;AAClB,IAAA,OAAO,IAAA,CAAK,IAAA;AAAA,EACd;AAAA,EAEQ,cAAA,GAA0B;AAChC,IAAA,IAAI,CAAC,IAAA,CAAK,cAAA,EAAgB,OAAO,IAAA;AACjC,IAAA,OAAO,IAAA,CAAK,GAAA,EAAI,IAAK,IAAA,CAAK,cAAA;AAAA,EAC5B;AAAA,EAEA,MAAc,cAAA,GAAgC;AAC5C,IAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,UAAA,EAAW;AACxC,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,MAAM,KAAK,iBAAA,EAAkB;AAAA,IAC/B;AAAA,EACF;AAAA,EAEA,MAAc,UAAA,GAA+B;AAC3C,IAAA,IAAI;AACF,MAAA,MAAM,OAAO,MAAM,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,aAAA,CAAA,EAAiB;AAAA,QACvD,MAAA,EAAQ,MAAA;AAAA,QACR,WAAA,EAAa,SAAA;AAAA,QACb,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA;AAAmB,OAC/C,CAAA;AACD,MAAA,IAAI,CAAC,IAAA,CAAK,EAAA,EAAI,OAAO,KAAA;AACrB,MAAA,MAAM,IAAA,GAAQ,MAAM,IAAA,CAAK,IAAA,EAAK;AAC9B,MAAA,IAAA,CAAK,cAAA,CAAe,KAAK,WAAW,CAAA;AACpC,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAc,iBAAA,GAAmC;AAC/C,IAAA,MAAM,OAAO,MAAM,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,WAAA,CAAA,EAAe;AAAA,MACrD,MAAA,EAAQ,MAAA;AAAA,MACR,WAAA,EAAa,SAAA;AAAA,MACb,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,MAC9C,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,KAAA,EAAO,KAAK,KAAA,EAAO,QAAA,EAAU,IAAA,CAAK,QAAA,EAAU;AAAA,KACpE,CAAA;AAED,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI;AACZ,MAAA,MAAMA,KAAAA,GAAQ,MAAM,IAAA,CAAK,IAAA,GAAO,KAAA,CAAM,OAAO,EAAC,CAAE,CAAA;AAChD,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,oBAAA,EAAwBA,KAAAA,CAAK,SAAS,CAAA,IAA4B,KAAK,UAAU,CAAA;AAAA,OACnF;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,GAAQ,MAAM,IAAA,CAAK,IAAA,EAAK;AAC9B,IAAA,IAAA,CAAK,cAAA,CAAe,KAAK,WAAW,CAAA;AAAA,EACtC;AACF,CAAA;;;ACrGO,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,MAAM,eAAA,SAAuB,WAAA,CAAY;AAAA,EACrC,UAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EAET,WAAA,CAAY,QAAA,EAA+B,OAAA,GAAkC,EAAC,EAAG;AAC/E,IAAA,KAAA,CAAM,SAAS,OAAO,CAAA;AACtB,IAAA,IAAA,CAAK,IAAA,GAAO,gBAAA;AACZ,IAAA,IAAA,CAAK,aAAa,QAAA,CAAS,UAAA;AAC3B,IAAA,IAAA,CAAK,YAAY,QAAA,CAAS,KAAA;AAC1B,IAAA,IAAA,CAAK,UAAU,QAAA,CAAS,OAAA;AACxB,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,GAAA,CAAA,MAAA,CAAW,SAAS,CAAA;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,YAAA,CACL,QAAA,EACA,OAAA,EACgB;AAChB,IAAA,QAAQ,SAAS,UAAA;AAAY,MAC3B,KAAK,GAAA;AACH,QAAA,OAAO,IAAI,yBAAA,CAA0B,QAAA,EAAU,OAAO,CAAA;AAAA,MACxD,KAAK,GAAA;AACH,QAAA,OAAO,IAAI,8BAAA,CAA+B,QAAA,EAAU,OAAO,CAAA;AAAA,MAC7D,KAAK,GAAA;AACH,QAAA,OAAO,IAAI,oBAAA,CAAqB,QAAA,EAAU,OAAO,CAAA;AAAA,MACnD;AACE,QAAA,OAAO,IAAI,eAAA,CAAe,QAAA,EAAU,OAAO,CAAA;AAAA;AAC/C,EACF;AACF;AAGO,IAAM,yBAAA,GAAN,cAAwC,cAAA,CAAe;AAAA,EAC5D,WAAA,CAAY,QAAA,EAA+B,OAAA,GAAkC,EAAC,EAAG;AAC/E,IAAA,KAAA,CAAM,UAAU,OAAO,CAAA;AACvB,IAAA,IAAA,CAAK,IAAA,GAAO,2BAAA;AACZ,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,GAAA,CAAA,MAAA,CAAW,SAAS,CAAA;AAAA,EAClD;AACF;AAGO,IAAM,oBAAA,GAAN,cAAmC,cAAA,CAAe;AAAA,EAC9C,UAAA;AAAA,EAET,WAAA,CAAY,QAAA,EAA+B,OAAA,GAAkC,EAAC,EAAG;AAC/E,IAAA,KAAA,CAAM,UAAU,OAAO,CAAA;AACvB,IAAA,IAAA,CAAK,IAAA,GAAO,sBAAA;AACZ,IAAA,MAAM,UAAU,QAAA,CAAS,OAAA;AACzB,IAAA,IAAA,CAAK,UAAA,GACF,OAAA,EAAS,WAAA,KACT,OAAA,CAAQ,aAAa,CAAA,GAAI,QAAA,CAAS,OAAA,CAAQ,aAAa,CAAA,EAAG,EAAE,CAAA,GAAI,IAAA,CAAA;AACnE,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,GAAA,CAAA,MAAA,CAAW,SAAS,CAAA;AAAA,EAClD;AACF;AAGO,IAAM,8BAAA,GAAN,cAA6C,cAAA,CAAe;AAAA,EACxD,gBAAA;AAAA,EAET,WAAA,CAAY,QAAA,EAA+B,OAAA,GAAkC,EAAC,EAAG;AAC/E,IAAA,KAAA,CAAM,UAAU,OAAO,CAAA;AACvB,IAAA,IAAA,CAAK,IAAA,GAAO,gCAAA;AACZ,IAAA,MAAM,UAAU,QAAA,CAAS,OAAA;AACzB,IAAA,IAAA,CAAK,gBAAA,GAAoB,SAAS,iBAAA,IAA4C,CAAA;AAC9E,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,GAAA,CAAA,MAAA,CAAW,SAAS,CAAA;AAAA,EAClD;AACF;;;AC1EA,IAAM,mCAAmB,IAAI,GAAA,CAAI,CAAC,GAAA,EAAK,GAAA,EAAK,GAAG,CAAC,CAAA;AAazC,IAAM,aAAN,MAAiB;AAAA,EACd,OAAA;AAAA,EACA,UAAA;AAAA,EACA,cAAA;AAAA,EACA,IAAA;AAAA,EAER,WAAA,CAAY,IAAA,EAAoB,OAAA,EAAiB,UAAA,EAAoB,OAAA,EAAiB;AACpF,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AACxC,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAClB,IAAA,IAAA,CAAK,cAAA,GAAiB,OAAA;AAAA,EACxB;AAAA,EAEA,MAAM,QAAW,OAAA,EAAqC;AACpD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,UAAA,CAAW,OAAO,CAAA;AAC9C,IAAA,OAAO,SAAS,IAAA,EAAK;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,OAAA,EAA4C;AAC3D,IAAA,IAAI,SAAA;AAEJ,IAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,IAAW,IAAA,CAAK,YAAY,OAAA,EAAA,EAAW;AAC3D,MAAA,IAAI,UAAU,CAAA,EAAG;AACf,QAAA,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,OAAO,CAAC,CAAA;AAAA,MAC1C;AAEA,MAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,MAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,IAAW,IAAA,CAAK,cAAA;AACxC,MAAA,MAAM,UAAU,UAAA,CAAW,MAAM,UAAA,CAAW,KAAA,IAAS,OAAO,CAAA;AAE5D,MAAA,IAAI;AACF,QAAA,MAAM,MAAM,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,IAAA,EAAM,QAAQ,KAAK,CAAA;AACrD,QAAA,MAAM,aAAa,OAAA,CAAQ,QAAA,GAAW,SAAY,MAAM,IAAA,CAAK,KAAK,aAAA,EAAc;AAEhF,QAAA,MAAM,OAAA,GAAkC;AAAA,UACtC,cAAA,EAAgB;AAAA,SAClB;AACA,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,OAAA,CAAQ,eAAe,CAAA,GAAI,UAAA;AAAA,QAC7B;AAEA,QAAA,MAAM,YAAA,GAA4B;AAAA,UAChC,MAAA,EAAQ,QAAQ,MAAA,IAAU,KAAA;AAAA,UAC1B,OAAA;AAAA,UACA,QAAQ,UAAA,CAAW,MAAA;AAAA,UACnB,WAAA,EAAa;AAAA,SACf;AAEA,QAAA,IAAI,OAAA,CAAQ,SAAS,KAAA,CAAA,EAAW;AAC9B,UAAA,YAAA,CAAa,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,IAAI,CAAA;AAAA,QACjD;AAEA,QAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK,YAAY,CAAA;AAC9C,QAAA,YAAA,CAAa,OAAO,CAAA;AAEpB,QAAA,IAAI,SAAS,EAAA,EAAI;AACf,UAAA,OAAO,QAAA;AAAA,QACT;AAEA,QAAA,IAAI,iBAAiB,GAAA,CAAI,QAAA,CAAS,MAAM,CAAA,IAAK,OAAA,GAAU,KAAK,UAAA,EAAY;AACtE,UAAA,MAAM,UAAA,GAAa,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,aAAa,CAAA;AACrD,UAAA,IAAI,UAAA,EAAY;AACd,YAAA,MAAM,OAAA,GAAU,QAAA,CAAS,UAAA,EAAY,EAAE,CAAA;AACvC,YAAA,IAAI,CAAC,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA,IAAK,UAAU,CAAA,EAAG;AACzC,cAAA,MAAM,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,GAAI,CAAA;AAAA,YACjC;AAAA,UACF;AACA,UAAA,SAAA,GAAY,IAAI,YAAY,CAAA,KAAA,EAAQ,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAC5E,UAAA;AAAA,QACF;AAEA,QAAA,IAAI,SAAA;AACJ,QAAA,IAAI;AACF,UAAA,SAAA,GAAa,MAAM,SAAS,IAAA,EAAK;AAAA,QACnC,CAAA,CAAA,MAAQ;AACN,UAAA,SAAA,GAAY;AAAA,YACV,KAAA,EAAO,eAAA;AAAA,YACP,SAAS,QAAA,CAAS,UAAA;AAAA,YAClB,YAAY,QAAA,CAAS;AAAA,WACvB;AAAA,QACF;AAEA,QAAA,MAAM,aAAqC,EAAC;AAC5C,QAAA,QAAA,CAAS,OAAA,CAAQ,OAAA,CAAQ,CAAC,KAAA,EAAO,GAAA,KAAQ;AACvC,UAAA,UAAA,CAAW,GAAG,CAAA,GAAI,KAAA;AAAA,QACpB,CAAC,CAAA;AAED,QAAA,MAAM,cAAA,CAAe,YAAA,CAAa,SAAA,EAAW,UAAU,CAAA;AAAA,MACzD,SAAS,GAAA,EAAK;AACZ,QAAA,YAAA,CAAa,OAAO,CAAA;AACpB,QAAA,IAAI,GAAA,YAAe,gBAAgB,MAAM,GAAA;AAEzC,QAAA,IAAK,GAAA,CAAc,SAAS,YAAA,EAAc;AACxC,UAAA,MAAM,IAAI,WAAA,CAAY,CAAA,wBAAA,EAA2B,OAAO,CAAA,EAAA,CAAI,CAAA;AAAA,QAC9D;AAEA,QAAA,SAAA,GAAY,GAAA;AACZ,QAAA,IAAI,OAAA,KAAY,KAAK,UAAA,EAAY;AAC/B,UAAA,MAAM,IAAI,WAAA,CAAY,CAAA,eAAA,EAAmB,GAAA,CAAc,OAAO,CAAA,CAAE,CAAA;AAAA,QAClE;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAM,IAAI,YAAY,CAAA,qBAAA,EAAwB,IAAA,CAAK,UAAU,CAAA,UAAA,EAAa,MAAA,CAAO,SAAS,CAAC,CAAA,CAAE,CAAA;AAAA,EAC/F;AAAA,EAEQ,QAAA,CACN,MACA,KAAA,EACQ;AACR,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,CAAA,EAAG,KAAK,OAAO,CAAA,EAAG,IAAI,CAAA,CAAE,CAAA;AAC5C,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,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,QACzC;AAAA,MACF;AAAA,IACF;AACA,IAAA,OAAO,IAAI,QAAA,EAAS;AAAA,EACtB;AAAA;AAAA,EAGQ,UAAU,OAAA,EAAyB;AACzC,IAAA,MAAM,IAAA,GAAO,GAAA;AACb,IAAA,MAAM,GAAA,GAAM,GAAA;AACZ,IAAA,MAAM,OAAA,GAAU,KAAK,GAAA,CAAI,GAAA,EAAK,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAO,CAAC,CAAA;AACzD,IAAA,OAAO,IAAA,CAAK,QAAO,GAAI,OAAA;AAAA,EACzB;AAAA,EAEQ,MAAM,EAAA,EAA2B;AACvC,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AAAA,EACzD;AACF,CAAA;;;AC9JA,IAAM,eAAA,GAAkB,OAAA;AAWxB,gBAAuB,YACrB,IAAA,EACgC;AAChC,EAAA,MAAM,MAAA,GAAS,KAAK,SAAA,EAAU;AAC9B,EAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,EAAA,IAAI,MAAA,GAAS,EAAA;AAEb,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,EAAM;AACX,MAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,OAAO,IAAA,EAAK;AAC1C,MAAA,IAAI,IAAA,EAAM;AAEV,MAAA,MAAA,IAAU,QAAQ,MAAA,CAAO,KAAA,EAAO,EAAE,MAAA,EAAQ,MAAM,CAAA;AAEhD,MAAA,IAAI,MAAA,CAAO,SAAS,eAAA,EAAiB;AACnC,QAAA,MAAM,IAAI,WAAA;AAAA,UACR,uBAAuB,eAAe,CAAA,uCAAA;AAAA,SACxC;AAAA,MACF;AAEA,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA;AAClC,MAAA,MAAA,GAAS,MAAA,CAAO,KAAI,IAAK,EAAA;AAEzB,MAAA,KAAA,MAAW,YAAY,MAAA,EAAQ;AAC7B,QAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA;AACjC,QAAA,IAAI,SAAA;AACJ,QAAA,IAAI,QAAA;AAEJ,QAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,UAAA,IAAI,IAAA,CAAK,UAAA,CAAW,SAAS,CAAA,EAAG;AAC9B,YAAA,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA,EAAK;AAAA,UACjC,CAAA,MAAA,IAAW,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,EAAG;AACpC,YAAA,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA,EAAK;AAAA,UAChC;AAAA,QACF;AAEA,QAAA,IAAI,CAAC,QAAA,EAAU;AAEf,QAAA,IAAI,aAAa,QAAA,EAAU;AACzB,UAAA,MAAM,EAAE,MAAM,MAAA,EAAO;AACrB,UAAA;AAAA,QACF;AAEA,QAAA,IAAI,cAAc,QAAA,EAAU;AAC1B,UAAA,IAAI;AACF,YAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA;AAChC,YAAA,MAAM,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,IAAA,EAAK;AAAA,UACrC,CAAA,CAAA,MAAQ;AAAA,UAER;AACA,UAAA;AAAA,QACF;AAEA,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA;AAClC,UAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAO;AAAA,QACrC,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAA,SAAE;AACA,IAAA,MAAA,CAAO,WAAA,EAAY;AAAA,EACrB;AACF;AAeO,IAAM,eAAN,MAAkD;AAAA,EAC/C,IAAA;AAAA,EACA,WAAA,GAAiC,IAAA;AAAA,EAEzC,YAAY,IAAA,EAAkC;AAC5C,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,EACd;AAAA,EAEA,CAAC,MAAA,CAAO,aAAa,CAAA,GAAsB;AACzC,IAAA,OAAO,KAAK,QAAA,EAAS;AAAA,EACvB;AAAA,EAEA,OAAe,QAAA,GAA8B;AAC3C,IAAA,IAAI;AACF,MAAA,WAAA,MAAiB,KAAA,IAAS,WAAA,CAAe,IAAA,CAAK,IAAI,CAAA,EAAG;AACnD,QAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAQ;AACzB,UAAA,MAAM,KAAA,CAAM,IAAA;AAAA,QACd,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,QAAA,EAAU;AAClC,UAAA,IAAA,CAAK,cAAc,KAAA,CAAM,IAAA;AAAA,QAC3B;AAAA,MACF;AAAA,IACF,CAAA,SAAE;AAEA,MAAA,IAAA,CAAK,IAAA,CAAK,MAAA,EAAO,CAAE,KAAA,CAAM,MAAM;AAAA,MAAC,CAAC,CAAA;AAAA,IACnC;AAAA,EACF;AAAA;AAAA,EAGA,SAAA,GAA+B;AAC7B,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EACd;AACF;;;ACnHO,IAAM,cAAN,MAAkB;AAAA,EACvB,YAAoB,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAIvC,MAAM,OACJ,MAAA,EAC6D;AAC7D,IAAA,IAAI,MAAA,CAAO,WAAW,IAAA,EAAM;AAC1B,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW;AAAA,QAC1C,MAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAM,sBAAA;AAAA,QACN,IAAA,EAAM,MAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACV,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,IAAA,EAAM;AAClB,QAAA,MAAM,IAAI,YAAY,gCAAgC,CAAA;AAAA,MACxD;AAEA,MAAA,OAAO,IAAI,YAAA,CAAkC,QAAA,CAAS,IAAI,CAAA;AAAA,IAC5D;AAEA,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAwB;AAAA,MACvC,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,sBAAA;AAAA,MACN,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AACF,CAAA;;;ACrCO,IAAM,OAAN,MAAW;AAAA,EACP,WAAA;AAAA,EAET,YAAY,IAAA,EAAkB;AAC5B,IAAA,IAAA,CAAK,WAAA,GAAc,IAAI,WAAA,CAAY,IAAI,CAAA;AAAA,EACzC;AACF,CAAA;;;ACNO,IAAM,aAAN,MAAiB;AAAA,EACtB,YAAoB,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAEvC,OAAO,MAAA,EAA4D;AACjE,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAQ;AAAA,MACvB,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,gBAAA;AAAA,MACN,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AACF,CAAA;;;ACVO,IAAM,cAAN,MAAkB;AAAA,EACvB,YAAoB,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAEvC,OAAO,MAAA,EAAwD;AAC7D,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAQ;AAAA,MACvB,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,wBAAA;AAAA,MACN,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AACF,CAAA;;;ACVO,IAAM,SAAN,MAAa;AAAA,EACT,WAAA;AAAA,EAET,YAAY,IAAA,EAAkB;AAC5B,IAAA,IAAA,CAAK,WAAA,GAAc,IAAI,WAAA,CAAY,IAAI,CAAA;AAAA,EACzC;AACF,CAAA;;;ACNO,IAAM,UAAN,MAAc;AAAA,EACnB,YAAoB,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAEvC,UAAA,GAAqC;AACnC,IAAA,OAAO,KAAK,IAAA,CAAK,OAAA,CAAQ,EAAE,IAAA,EAAM,oBAAoB,CAAA;AAAA,EACvD;AAAA,EAEA,SAAA,GAAmC;AACjC,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAQ,EAAE,MAAM,gBAAA,EAAkB,QAAA,EAAU,MAAM,CAAA;AAAA,EACrE;AACF,CAAA;;;ACLO,IAAM,UAAN,MAAc;AAAA,EACnB,YAAoB,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAEvC,IAAA,GAA0B;AACxB,IAAA,OAAO,KAAK,IAAA,CAAK,OAAA,CAAQ,EAAE,IAAA,EAAM,aAAa,CAAA;AAAA,EAChD;AAAA,EAEA,MAAA,CAAO,MAAA,GAA6B,EAAC,EAA8B;AACjE,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,EAAE,MAAA,EAAQ,QAAQ,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,MAAA,EAAQ,CAAA;AAAA,EAC9E;AAAA,EAEA,SAAS,EAAA,EAA6B;AACpC,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAQ,EAAE,MAAM,CAAA,UAAA,EAAa,EAAE,IAAI,CAAA;AAAA,EACtD;AAAA,EAEA,MAAA,CAAO,IAAY,MAAA,EAA6C;AAC9D,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,CAAA,UAAA,EAAa,EAAE,CAAA,CAAA,EAAI,IAAA,EAAM,MAAA,EAAQ,CAAA;AAAA,EACnF;AAAA,EAEA,OAAO,EAAA,EAA0C;AAC/C,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,EAAE,MAAA,EAAQ,UAAU,IAAA,EAAM,CAAA,UAAA,EAAa,EAAE,CAAA,CAAA,EAAI,CAAA;AAAA,EACxE;AACF,CAAA;;;AC1BO,IAAM,QAAN,MAAY;AAAA,EACjB,YAAoB,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAEvC,QAAA,CAAS,MAAA,GAAyB,EAAC,EAAwB;AACzD,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAQ;AAAA,MACvB,IAAA,EAAM,cAAA;AAAA,MACN,KAAA,EAAO;AAAA,KACR,CAAA;AAAA,EACH;AAAA,EAEA,UAAA,CAAW,MAAA,GAA2B,EAAC,EAAyC;AAC9E,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAQ;AAAA,MACvB,IAAA,EAAM,gBAAA;AAAA,MACN,KAAA,EAAO;AAAA,KACR,CAAA;AAAA,EACH;AACF,CAAA;;;ACjBO,IAAM,SAAN,MAAa;AAAA,EAClB,YAAoB,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA;AAAA,EAGvC,IAAA,CAAK,MAAA,GAA4B,EAAC,EAA+B;AAC/D,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAQ;AAAA,MACvB,IAAA,EAAM,cAAA;AAAA,MACN,OAAO,MAAA,CAAO,GAAA,GAAM,EAAE,GAAA,EAAK,QAAO,GAAI,MAAA;AAAA,MACtC,QAAA,EAAU;AAAA,KACX,CAAA;AAAA,EACH;AACF,CAAA;;;ACVO,IAAM,WAAN,MAAe;AAAA,EACpB,YAAoB,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAEvC,SAAS,MAAA,EAAiE;AACxE,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,EAAE,MAAA,EAAQ,QAAQ,IAAA,EAAM,oBAAA,EAAsB,IAAA,EAAM,MAAA,EAAQ,CAAA;AAAA,EACvF;AAAA,EAEA,UAAU,EAAA,EAA8B;AACtC,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAQ,EAAE,MAAM,CAAA,iBAAA,EAAoB,EAAE,IAAI,CAAA;AAAA,EAC7D;AAAA,EAEA,UAAA,CAAW,MAAA,GAA4C,EAAC,EAAwC;AAC9F,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAQ;AAAA,MACvB,IAAA,EAAM,mBAAA;AAAA,MACN,KAAA,EAAO;AAAA,KACR,CAAA;AAAA,EACH;AACF,CAAA;;;ACjBO,IAAM,eAAN,MAAmB;AAAA,EACxB,WAAA,CACU,MACA,YAAA,EACR;AAFQ,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AAAA,EACP;AAAA,EAEH,MAAM,KAAA,CAAM,KAAA,EAAe,QAAA,EAA0C;AACnE,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,IAAA,CAAK,OAAA,CAAuB;AAAA,MACpD,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,aAAA;AAAA,MACN,IAAA,EAAM,EAAE,KAAA,EAAO,QAAA,EAAS;AAAA,MACxB,QAAA,EAAU;AAAA,KACX,CAAA;AACD,IAAA,IAAA,CAAK,YAAA,CAAa,cAAA,CAAe,MAAA,CAAO,WAAW,CAAA;AACnD,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,SAAS,MAAA,EAAkE;AACzE,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAQ;AAAA,MACvB,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,gBAAA;AAAA,MACN,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU;AAAA,KACX,CAAA;AAAA,EACH;AAAA,EAEA,MAAA,GAAuC;AACrC,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAQ,EAAE,QAAQ,MAAA,EAAQ,IAAA,EAAM,gBAAgB,CAAA;AAAA,EACnE;AACF,CAAA;;;AC9BO,IAAM,QAAN,MAAY;AAAA,EACjB,YAAoB,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAEvC,EAAA,GAAoB;AAClB,IAAA,OAAO,KAAK,IAAA,CAAK,OAAA,CAAQ,EAAE,IAAA,EAAM,aAAa,CAAA;AAAA,EAChD;AAAA,EAEA,OAAO,MAAA,EAAyC;AAC9C,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,EAAE,MAAA,EAAQ,OAAO,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,MAAA,EAAQ,CAAA;AAAA,EAC7E;AACF,CAAA;;;ACCA,IAAM,gBAAA,GAAmB,uBAAA;AACzB,IAAM,mBAAA,GAAsB,CAAA;AAC5B,IAAM,eAAA,GAAkB,GAAA;AAuCjB,IAAM,SAAN,MAAa;AAAA,EACT,IAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EAET,YAAY,OAAA,EAA8B;AACxC,IAAA,MAAM,OAAA,GAAU,QAAQ,OAAA,IAAW,gBAAA;AACnC,IAAA,MAAM,UAAA,GAAa,QAAQ,UAAA,IAAc,mBAAA;AACzC,IAAA,MAAM,OAAA,GAAU,QAAQ,OAAA,IAAW,eAAA;AAEnC,IAAA,MAAM,YAAA,GAAe,IAAI,YAAA,CAAa,OAAO,CAAA;AAC7C,IAAA,MAAM,OAAO,IAAI,UAAA,CAAW,YAAA,EAAc,OAAA,EAAS,YAAY,OAAO,CAAA;AAEtE,IAAA,IAAA,CAAK,IAAA,GAAO,IAAI,IAAA,CAAK,IAAI,CAAA;AACzB,IAAA,IAAA,CAAK,UAAA,GAAa,IAAI,UAAA,CAAW,IAAI,CAAA;AACrC,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,MAAA,CAAO,IAAI,CAAA;AAC7B,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,OAAA,CAAQ,IAAI,CAAA;AAC/B,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,OAAA,CAAQ,IAAI,CAAA;AAC/B,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,KAAA,CAAM,IAAI,CAAA;AAC3B,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,MAAA,CAAO,IAAI,CAAA;AAC7B,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,QAAA,CAAS,IAAI,CAAA;AACjC,IAAA,IAAA,CAAK,IAAA,GAAO,IAAI,YAAA,CAAa,IAAA,EAAM,YAAY,CAAA;AAC/C,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,KAAA,CAAM,IAAI,CAAA;AAAA,EAC7B;AACF;;;ACrFA,IAAO,aAAA,GAAQ","file":"index.cjs","sourcesContent":["import type { TchaviClientOptions } from '../types/common.js';\n\nexport type AuthMode = 'api-key' | 'jwt';\n\n/**\n * AuthStrategy holds and refreshes credentials.\n * - API key mode: static header, no state\n * - JWT mode: logs in lazily, stores the access token in memory,\n * refreshes via /auth/refresh cookie when the token expires\n */\nexport class AuthStrategy {\n private mode: AuthMode;\n private apiKey?: string;\n private accessToken?: string;\n private tokenExpiresAt?: number;\n private baseURL: string;\n private email?: string;\n private password?: string;\n\n constructor(options: TchaviClientOptions) {\n this.baseURL = options.baseURL ?? 'http://localhost:3001';\n if (options.apiKey) {\n this.mode = 'api-key';\n this.apiKey = options.apiKey;\n } else if (options.email && options.password) {\n this.mode = 'jwt';\n this.email = options.email;\n this.password = options.password;\n } else {\n throw new Error(\n 'TchaviClientOptions must provide either `apiKey` or both `email` and `password`.',\n );\n }\n }\n\n /**\n * Returns the Authorization header value for the current request.\n * For JWT mode, lazily logs in and refreshes the token as needed.\n */\n async getAuthHeader(): Promise<string> {\n if (this.mode === 'api-key') {\n return `Bearer ${this.apiKey}`;\n }\n\n if (!this.accessToken || this.isTokenExpired()) {\n await this.loginOrRefresh();\n }\n\n return `Bearer ${this.accessToken}`;\n }\n\n /** Store a token (e.g. after explicit login() call from AuthResource) */\n setAccessToken(token: string, expiresInSeconds = 900): void {\n this.accessToken = token;\n this.tokenExpiresAt = Date.now() + (expiresInSeconds - 30) * 1000;\n }\n\n getMode(): AuthMode {\n return this.mode;\n }\n\n private isTokenExpired(): boolean {\n if (!this.tokenExpiresAt) return true;\n return Date.now() >= this.tokenExpiresAt;\n }\n\n private async loginOrRefresh(): Promise<void> {\n const refreshed = await this.tryRefresh();\n if (!refreshed) {\n await this.loginWithPassword();\n }\n }\n\n private async tryRefresh(): Promise<boolean> {\n try {\n const resp = await fetch(`${this.baseURL}/auth/refresh`, {\n method: 'POST',\n credentials: 'include',\n headers: { 'Content-Type': 'application/json' },\n });\n if (!resp.ok) return false;\n const body = (await resp.json()) as { accessToken: string };\n this.setAccessToken(body.accessToken);\n return true;\n } catch {\n return false;\n }\n }\n\n private async loginWithPassword(): Promise<void> {\n const resp = await fetch(`${this.baseURL}/auth/login`, {\n method: 'POST',\n credentials: 'include',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ email: this.email, password: this.password }),\n });\n\n if (!resp.ok) {\n const body = (await resp.json().catch(() => ({}))) as Record<string, unknown>;\n throw new Error(\n `Tchavi auth failed: ${(body['message'] as string | undefined) ?? resp.statusText}`,\n );\n }\n\n const body = (await resp.json()) as { accessToken: string };\n this.setAccessToken(body.accessToken);\n }\n}\n","import type { TchaviErrorResponse } from './types/common.js';\n\n/**\n * Base error for all Tchavi SDK errors.\n * Catches both network-level and API-level failures.\n */\nexport class TchaviError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'TchaviError';\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * An error returned by the Tchavi API as a JSON response.\n * Maps directly to the server's { error, message, statusCode } shape.\n */\nexport class TchaviAPIError extends TchaviError {\n readonly statusCode: number;\n readonly errorCode: string;\n readonly details?: unknown;\n readonly headers: Record<string, string>;\n\n constructor(response: TchaviErrorResponse, headers: Record<string, string> = {}) {\n super(response.message);\n this.name = 'TchaviAPIError';\n this.statusCode = response.statusCode;\n this.errorCode = response.error;\n this.details = response.details;\n this.headers = headers;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n\n /**\n * Factory: inspect the raw response and construct the most specific subclass.\n */\n static fromResponse(\n response: TchaviErrorResponse,\n headers: Record<string, string>,\n ): TchaviAPIError {\n switch (response.statusCode) {\n case 401:\n return new TchaviAuthenticationError(response, headers);\n case 402:\n return new TchaviInsufficientCreditsError(response, headers);\n case 429:\n return new TchaviRateLimitError(response, headers);\n default:\n return new TchaviAPIError(response, headers);\n }\n }\n}\n\n/** Thrown when the gateway returns 401 (invalid/missing API key or JWT) */\nexport class TchaviAuthenticationError extends TchaviAPIError {\n constructor(response: TchaviErrorResponse, headers: Record<string, string> = {}) {\n super(response, headers);\n this.name = 'TchaviAuthenticationError';\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** Thrown on 429. `retryAfter` is in seconds if provided by the server. */\nexport class TchaviRateLimitError extends TchaviAPIError {\n readonly retryAfter: number | null;\n\n constructor(response: TchaviErrorResponse, headers: Record<string, string> = {}) {\n super(response, headers);\n this.name = 'TchaviRateLimitError';\n const details = response.details as Record<string, unknown> | undefined;\n this.retryAfter =\n (details?.retry_after as number | undefined) ??\n (headers['retry-after'] ? parseInt(headers['retry-after'], 10) : null);\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** Thrown on 402. `creditsRemaining` reflects your current balance. */\nexport class TchaviInsufficientCreditsError extends TchaviAPIError {\n readonly creditsRemaining: number;\n\n constructor(response: TchaviErrorResponse, headers: Record<string, string> = {}) {\n super(response, headers);\n this.name = 'TchaviInsufficientCreditsError';\n const details = response.details as Record<string, unknown> | undefined;\n this.creditsRemaining = (details?.credits_remaining as number | undefined) ?? 0;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","import { TchaviAPIError, TchaviError } from '../errors.js';\nimport type { AuthStrategy } from './auth.js';\nimport type { TchaviErrorResponse } from '../types/common.js';\n\nexport interface RequestOptions {\n method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n path: string;\n body?: unknown;\n query?: Record<string, string | number | boolean | undefined>;\n /** Skip auth header (used for public endpoints) */\n skipAuth?: boolean;\n /** Override timeout for this specific request */\n timeout?: number;\n}\n\nconst RETRYABLE_STATUS = new Set([429, 502, 503]);\n\n/**\n * Core HTTP client. All resource classes use this.\n *\n * Handles:\n * - Auth header injection\n * - Query string serialization\n * - JSON body serialization\n * - Non-2xx error mapping to typed error classes\n * - Exponential backoff with jitter for retryable responses\n * - AbortController-based timeouts\n */\nexport class HttpClient {\n private baseURL: string;\n private maxRetries: number;\n private defaultTimeout: number;\n private auth: AuthStrategy;\n\n constructor(auth: AuthStrategy, baseURL: string, maxRetries: number, timeout: number) {\n this.auth = auth;\n this.baseURL = baseURL.replace(/\\/$/, '');\n this.maxRetries = maxRetries;\n this.defaultTimeout = timeout;\n }\n\n async request<T>(options: RequestOptions): Promise<T> {\n const response = await this.requestRaw(options);\n return response.json() as Promise<T>;\n }\n\n /**\n * Returns the raw Response — used for streaming so callers can pipe the body.\n */\n async requestRaw(options: RequestOptions): Promise<Response> {\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= this.maxRetries; attempt++) {\n if (attempt > 0) {\n await this.sleep(this.backoffMs(attempt));\n }\n\n const controller = new AbortController();\n const timeout = options.timeout ?? this.defaultTimeout;\n const timerId = setTimeout(() => controller.abort(), timeout);\n\n try {\n const url = this.buildURL(options.path, options.query);\n const authHeader = options.skipAuth ? undefined : await this.auth.getAuthHeader();\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n if (authHeader) {\n headers['Authorization'] = authHeader;\n }\n\n const fetchOptions: RequestInit = {\n method: options.method ?? 'GET',\n headers,\n signal: controller.signal,\n credentials: 'include',\n };\n\n if (options.body !== undefined) {\n fetchOptions.body = JSON.stringify(options.body);\n }\n\n const response = await fetch(url, fetchOptions);\n clearTimeout(timerId);\n\n if (response.ok) {\n return response;\n }\n\n if (RETRYABLE_STATUS.has(response.status) && attempt < this.maxRetries) {\n const retryAfter = response.headers.get('Retry-After');\n if (retryAfter) {\n const seconds = parseInt(retryAfter, 10);\n if (!Number.isNaN(seconds) && seconds > 0) {\n await this.sleep(seconds * 1000);\n }\n }\n lastError = new TchaviError(`HTTP ${response.status} ${response.statusText}`);\n continue;\n }\n\n let errorBody: TchaviErrorResponse;\n try {\n errorBody = (await response.json()) as TchaviErrorResponse;\n } catch {\n errorBody = {\n error: 'unknown_error',\n message: response.statusText,\n statusCode: response.status,\n };\n }\n\n const headersObj: Record<string, string> = {};\n response.headers.forEach((value, key) => {\n headersObj[key] = value;\n });\n\n throw TchaviAPIError.fromResponse(errorBody, headersObj);\n } catch (err) {\n clearTimeout(timerId);\n if (err instanceof TchaviAPIError) throw err;\n\n if ((err as Error).name === 'AbortError') {\n throw new TchaviError(`Request timed out after ${timeout}ms`);\n }\n\n lastError = err;\n if (attempt === this.maxRetries) {\n throw new TchaviError(`Network error: ${(err as Error).message}`);\n }\n }\n }\n\n throw new TchaviError(`Request failed after ${this.maxRetries} retries: ${String(lastError)}`);\n }\n\n private buildURL(\n path: string,\n query?: Record<string, string | number | boolean | undefined>,\n ): string {\n const url = new URL(`${this.baseURL}${path}`);\n if (query) {\n for (const [key, value] of Object.entries(query)) {\n if (value !== undefined) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n return url.toString();\n }\n\n /** Exponential backoff with full jitter */\n private backoffMs(attempt: number): number {\n const base = 500;\n const cap = 10_000;\n const ceiling = Math.min(cap, base * Math.pow(2, attempt));\n return Math.random() * ceiling;\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n","import { TchaviError } from '../errors.js';\nimport type { TchaviMeta } from '../types/common.js';\nimport type { StreamEvent } from '../types/streaming.js';\n\n/** Maximum SSE buffer size (1 MB) to prevent OOM from broken servers. */\nconst MAX_BUFFER_SIZE = 1_048_576;\n\n/**\n * Parses a ReadableStream<Uint8Array> SSE response from Tchavi into\n * an AsyncIterable of typed StreamEvent<T> objects.\n *\n * Protocol:\n * Standard chunks: \"data: {...json...}\\n\\n\"\n * Done marker: \"data: [DONE]\\n\\n\"\n * Tchavi metadata: \"event: tchavi\\ndata: {...json...}\\n\\n\"\n */\nexport async function* parseStream<T>(\n body: ReadableStream<Uint8Array>,\n): AsyncGenerator<StreamEvent<T>> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n\n if (buffer.length > MAX_BUFFER_SIZE) {\n throw new TchaviError(\n `SSE buffer exceeded ${MAX_BUFFER_SIZE} bytes — possible malformed stream`,\n );\n }\n\n const events = buffer.split('\\n\\n');\n buffer = events.pop() ?? '';\n\n for (const rawEvent of events) {\n const lines = rawEvent.split('\\n');\n let eventType: string | undefined;\n let dataLine: string | undefined;\n\n for (const line of lines) {\n if (line.startsWith('event: ')) {\n eventType = line.slice(7).trim();\n } else if (line.startsWith('data: ')) {\n dataLine = line.slice(6).trim();\n }\n }\n\n if (!dataLine) continue;\n\n if (dataLine === '[DONE]') {\n yield { type: 'done' };\n return;\n }\n\n if (eventType === 'tchavi') {\n try {\n const meta = JSON.parse(dataLine) as TchaviMeta;\n yield { type: 'tchavi', data: meta };\n } catch {\n // Malformed tchavi event — skip\n }\n continue;\n }\n\n try {\n const parsed = JSON.parse(dataLine) as T;\n yield { type: 'data', data: parsed };\n } catch {\n // Non-JSON data line — skip\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\n/**\n * Wraps an SSE ReadableStream as an AsyncIterable<T>.\n * Stores the final Tchavi metadata so it can be accessed after iteration.\n *\n * @example\n * ```ts\n * const stream = await client.chat.completions.create({ ..., stream: true });\n * for await (const chunk of stream) {\n * process.stdout.write(chunk.choices[0]?.delta?.content ?? '');\n * }\n * console.log('Credits used:', stream.finalMeta()?.credits_used);\n * ```\n */\nexport class TchaviStream<T> implements AsyncIterable<T> {\n private body: ReadableStream<Uint8Array>;\n private _tchaviMeta: TchaviMeta | null = null;\n\n constructor(body: ReadableStream<Uint8Array>) {\n this.body = body;\n }\n\n [Symbol.asyncIterator](): AsyncIterator<T> {\n return this._consume();\n }\n\n private async *_consume(): AsyncGenerator<T> {\n try {\n for await (const event of parseStream<T>(this.body)) {\n if (event.type === 'data') {\n yield event.data;\n } else if (event.type === 'tchavi') {\n this._tchaviMeta = event.data;\n }\n }\n } finally {\n // Release stream resources if iteration is abandoned early (e.g. break)\n this.body.cancel().catch(() => {});\n }\n }\n\n /** Returns Tchavi credit metadata once the stream is fully consumed. */\n finalMeta(): TchaviMeta | null {\n return this._tchaviMeta;\n }\n}\n","import type { HttpClient } from '../../core/http-client.js';\nimport { TchaviStream } from '../../core/streaming.js';\nimport { TchaviError } from '../../errors.js';\nimport type {\n ChatCompletionCreateParamsNonStreaming,\n ChatCompletionCreateParamsStreaming,\n ChatCompletionCreateParams,\n ChatCompletion,\n ChatCompletionChunk,\n} from '../../types/chat.js';\n\nexport class Completions {\n constructor(private http: HttpClient) {}\n\n create(params: ChatCompletionCreateParamsNonStreaming): Promise<ChatCompletion>;\n create(params: ChatCompletionCreateParamsStreaming): Promise<TchaviStream<ChatCompletionChunk>>;\n async create(\n params: ChatCompletionCreateParams,\n ): Promise<ChatCompletion | TchaviStream<ChatCompletionChunk>> {\n if (params.stream === true) {\n const response = await this.http.requestRaw({\n method: 'POST',\n path: '/v1/chat/completions',\n body: params,\n timeout: 120_000,\n });\n\n if (!response.body) {\n throw new TchaviError('Streaming response has no body');\n }\n\n return new TchaviStream<ChatCompletionChunk>(response.body);\n }\n\n return this.http.request<ChatCompletion>({\n method: 'POST',\n path: '/v1/chat/completions',\n body: params,\n });\n }\n}\n","import type { HttpClient } from '../../core/http-client.js';\nimport { Completions } from './completions.js';\n\nexport class Chat {\n readonly completions: Completions;\n\n constructor(http: HttpClient) {\n this.completions = new Completions(http);\n }\n}\n","import type { HttpClient } from '../core/http-client.js';\nimport type { EmbeddingCreateParams, EmbeddingsResponse } from '../types/embeddings.js';\n\nexport class Embeddings {\n constructor(private http: HttpClient) {}\n\n create(params: EmbeddingCreateParams): Promise<EmbeddingsResponse> {\n return this.http.request({\n method: 'POST',\n path: '/v1/embeddings',\n body: params,\n });\n }\n}\n","import type { HttpClient } from '../../core/http-client.js';\nimport type { ImageGenerationParams, ImagesResponse } from '../../types/images.js';\n\nexport class Generations {\n constructor(private http: HttpClient) {}\n\n create(params: ImageGenerationParams): Promise<ImagesResponse> {\n return this.http.request({\n method: 'POST',\n path: '/v1/images/generations',\n body: params,\n });\n }\n}\n","import type { HttpClient } from '../../core/http-client.js';\nimport { Generations } from './generations.js';\n\nexport class Images {\n readonly generations: Generations;\n\n constructor(http: HttpClient) {\n this.generations = new Generations(http);\n }\n}\n","import type { HttpClient } from '../core/http-client.js';\nimport type { CreditBalance, CreditPack } from '../types/credits.js';\n\nexport class Credits {\n constructor(private http: HttpClient) {}\n\n getBalance(): Promise<CreditBalance> {\n return this.http.request({ path: '/credits/balance' });\n }\n\n listPacks(): Promise<CreditPack[]> {\n return this.http.request({ path: '/credits/packs', skipAuth: true });\n }\n}\n","import type { HttpClient } from '../core/http-client.js';\nimport type {\n ApiKey,\n ApiKeyWithSecret,\n CreateApiKeyParams,\n UpdateApiKeyParams,\n} from '../types/api-keys.js';\n\nexport class ApiKeys {\n constructor(private http: HttpClient) {}\n\n list(): Promise<ApiKey[]> {\n return this.http.request({ path: '/api-keys' });\n }\n\n create(params: CreateApiKeyParams = {}): Promise<ApiKeyWithSecret> {\n return this.http.request({ method: 'POST', path: '/api-keys', body: params });\n }\n\n retrieve(id: string): Promise<ApiKey> {\n return this.http.request({ path: `/api-keys/${id}` });\n }\n\n update(id: string, params: UpdateApiKeyParams): Promise<ApiKey> {\n return this.http.request({ method: 'PUT', path: `/api-keys/${id}`, body: params });\n }\n\n delete(id: string): Promise<{ message: string }> {\n return this.http.request({ method: 'DELETE', path: `/api-keys/${id}` });\n }\n}\n","import type { HttpClient } from '../core/http-client.js';\nimport type { UsageStats, UsageLog, GetStatsParams, GetHistoryParams } from '../types/usage.js';\nimport type { PaginatedResponse } from '../types/common.js';\n\nexport class Usage {\n constructor(private http: HttpClient) {}\n\n getStats(params: GetStatsParams = {}): Promise<UsageStats> {\n return this.http.request({\n path: '/usage/stats',\n query: params as Record<string, string>,\n });\n }\n\n getHistory(params: GetHistoryParams = {}): Promise<PaginatedResponse<UsageLog>> {\n return this.http.request({\n path: '/usage/history',\n query: params as Record<string, string | number>,\n });\n }\n}\n","import type { HttpClient } from '../core/http-client.js';\nimport type { ModelTierConfig } from '../types/models.js';\n\nexport class Models {\n constructor(private http: HttpClient) {}\n\n /** Lists all active model tiers. Pass `all: true` to include inactive ones (admin only). */\n list(params: { all?: boolean } = {}): Promise<ModelTierConfig[]> {\n return this.http.request({\n path: '/model-tiers',\n query: params.all ? { all: 'true' } : undefined,\n skipAuth: true,\n });\n }\n}\n","import type { HttpClient } from '../core/http-client.js';\nimport type { Payment, InitiatePaymentParams, PaymentInitiateResponse } from '../types/payments.js';\nimport type { PaginatedResponse } from '../types/common.js';\n\nexport class Payments {\n constructor(private http: HttpClient) {}\n\n initiate(params: InitiatePaymentParams): Promise<PaymentInitiateResponse> {\n return this.http.request({ method: 'POST', path: '/payments/initiate', body: params });\n }\n\n getStatus(id: string): Promise<Payment> {\n return this.http.request({ path: `/payments/status/${id}` });\n }\n\n getHistory(params: { page?: number; limit?: number } = {}): Promise<PaginatedResponse<Payment>> {\n return this.http.request({\n path: '/payments/history',\n query: params as Record<string, number>,\n });\n }\n}\n","import type { HttpClient } from '../core/http-client.js';\nimport type { AuthStrategy } from '../core/auth.js';\nimport type { RegisterParams, LoginResponse, User } from '../types/auth.js';\n\nexport class AuthResource {\n constructor(\n private http: HttpClient,\n private authStrategy: AuthStrategy,\n ) {}\n\n async login(email: string, password: string): Promise<LoginResponse> {\n const result = await this.http.request<LoginResponse>({\n method: 'POST',\n path: '/auth/login',\n body: { email, password },\n skipAuth: true,\n });\n this.authStrategy.setAccessToken(result.accessToken);\n return result;\n }\n\n register(params: RegisterParams): Promise<{ message: string; user: User }> {\n return this.http.request({\n method: 'POST',\n path: '/auth/register',\n body: params,\n skipAuth: true,\n });\n }\n\n logout(): Promise<{ message: string }> {\n return this.http.request({ method: 'POST', path: '/auth/logout' });\n }\n}\n","import type { HttpClient } from '../core/http-client.js';\nimport type { User, UpdateUserParams } from '../types/auth.js';\n\nexport class Users {\n constructor(private http: HttpClient) {}\n\n me(): Promise<User> {\n return this.http.request({ path: '/users/me' });\n }\n\n update(params: UpdateUserParams): Promise<User> {\n return this.http.request({ method: 'PUT', path: '/users/me', body: params });\n }\n}\n","import { AuthStrategy } from './core/auth.js';\nimport { HttpClient } from './core/http-client.js';\nimport { Chat } from './resources/chat/index.js';\nimport { Embeddings } from './resources/embeddings.js';\nimport { Images } from './resources/images/index.js';\nimport { Credits } from './resources/credits.js';\nimport { ApiKeys } from './resources/api-keys.js';\nimport { Usage } from './resources/usage.js';\nimport { Models } from './resources/models.js';\nimport { Payments } from './resources/payments.js';\nimport { AuthResource } from './resources/auth-resource.js';\nimport { Users } from './resources/users.js';\nimport type { TchaviClientOptions } from './types/common.js';\n\nconst DEFAULT_BASE_URL = 'http://localhost:3001';\nconst DEFAULT_MAX_RETRIES = 2;\nconst DEFAULT_TIMEOUT = 60_000;\n\n/**\n * Main Tchavi client. Mirrors the OpenAI SDK's resource-based API.\n *\n * @example API key mode (proxy endpoints):\n * ```ts\n * import Tchavi from '@tchavi/sdk';\n *\n * const client = new Tchavi({ apiKey: 'sk-tch-...' });\n *\n * const completion = await client.chat.completions.create({\n * model: 'gpt-4o-mini',\n * messages: [{ role: 'user', content: 'Hello' }],\n * });\n * console.log(completion.choices[0].message.content);\n * console.log(completion.tchavi.credits_used);\n * ```\n *\n * @example JWT mode (account management):\n * ```ts\n * const client = new Tchavi({ email: 'me@example.com', password: 'S3cret!' });\n * const balance = await client.credits.getBalance();\n * const keys = await client.apiKeys.list();\n * ```\n *\n * @example Streaming:\n * ```ts\n * const stream = await client.chat.completions.create({\n * model: 'gpt-4o',\n * messages: [{ role: 'user', content: 'Tell me a story' }],\n * stream: true,\n * });\n * for await (const chunk of stream) {\n * process.stdout.write(chunk.choices[0]?.delta?.content ?? '');\n * }\n * console.log('\\nCredits used:', stream.finalMeta()?.credits_used);\n * ```\n */\nexport class Tchavi {\n readonly chat: Chat;\n readonly embeddings: Embeddings;\n readonly images: Images;\n readonly credits: Credits;\n readonly apiKeys: ApiKeys;\n readonly usage: Usage;\n readonly models: Models;\n readonly payments: Payments;\n readonly auth: AuthResource;\n readonly users: Users;\n\n constructor(options: TchaviClientOptions) {\n const baseURL = options.baseURL ?? DEFAULT_BASE_URL;\n const maxRetries = options.maxRetries ?? DEFAULT_MAX_RETRIES;\n const timeout = options.timeout ?? DEFAULT_TIMEOUT;\n\n const authStrategy = new AuthStrategy(options);\n const http = new HttpClient(authStrategy, baseURL, maxRetries, timeout);\n\n this.chat = new Chat(http);\n this.embeddings = new Embeddings(http);\n this.images = new Images(http);\n this.credits = new Credits(http);\n this.apiKeys = new ApiKeys(http);\n this.usage = new Usage(http);\n this.models = new Models(http);\n this.payments = new Payments(http);\n this.auth = new AuthResource(http, authStrategy);\n this.users = new Users(http);\n }\n}\n","import { Tchavi } from './tchavi.js';\nexport default Tchavi;\nexport { Tchavi };\nexport { TchaviStream } from './core/streaming.js';\n\nexport {\n TchaviError,\n TchaviAPIError,\n TchaviAuthenticationError,\n TchaviRateLimitError,\n TchaviInsufficientCreditsError,\n} from './errors.js';\n\nexport type * from './types/index.js';\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -598,7 +598,6 @@ declare class Tchavi {
|
|
|
598
598
|
declare class TchaviError extends Error {
|
|
599
599
|
constructor(message: string);
|
|
600
600
|
}
|
|
601
|
-
|
|
602
601
|
/**
|
|
603
602
|
* An error returned by the Tchavi API as a JSON response.
|
|
604
603
|
* Maps directly to the server's { error, message, statusCode } shape.
|
|
@@ -614,18 +613,15 @@ declare class TchaviAPIError extends TchaviError {
|
|
|
614
613
|
*/
|
|
615
614
|
static fromResponse(response: TchaviErrorResponse, headers: Record<string, string>): TchaviAPIError;
|
|
616
615
|
}
|
|
617
|
-
|
|
618
616
|
/** Thrown when the gateway returns 401 (invalid/missing API key or JWT) */
|
|
619
617
|
declare class TchaviAuthenticationError extends TchaviAPIError {
|
|
620
618
|
constructor(response: TchaviErrorResponse, headers?: Record<string, string>);
|
|
621
619
|
}
|
|
622
|
-
|
|
623
620
|
/** Thrown on 429. `retryAfter` is in seconds if provided by the server. */
|
|
624
621
|
declare class TchaviRateLimitError extends TchaviAPIError {
|
|
625
622
|
readonly retryAfter: number | null;
|
|
626
623
|
constructor(response: TchaviErrorResponse, headers?: Record<string, string>);
|
|
627
624
|
}
|
|
628
|
-
|
|
629
625
|
/** Thrown on 402. `creditsRemaining` reflects your current balance. */
|
|
630
626
|
declare class TchaviInsufficientCreditsError extends TchaviAPIError {
|
|
631
627
|
readonly creditsRemaining: number;
|
package/dist/index.d.ts
CHANGED
|
@@ -598,7 +598,6 @@ declare class Tchavi {
|
|
|
598
598
|
declare class TchaviError extends Error {
|
|
599
599
|
constructor(message: string);
|
|
600
600
|
}
|
|
601
|
-
|
|
602
601
|
/**
|
|
603
602
|
* An error returned by the Tchavi API as a JSON response.
|
|
604
603
|
* Maps directly to the server's { error, message, statusCode } shape.
|
|
@@ -614,18 +613,15 @@ declare class TchaviAPIError extends TchaviError {
|
|
|
614
613
|
*/
|
|
615
614
|
static fromResponse(response: TchaviErrorResponse, headers: Record<string, string>): TchaviAPIError;
|
|
616
615
|
}
|
|
617
|
-
|
|
618
616
|
/** Thrown when the gateway returns 401 (invalid/missing API key or JWT) */
|
|
619
617
|
declare class TchaviAuthenticationError extends TchaviAPIError {
|
|
620
618
|
constructor(response: TchaviErrorResponse, headers?: Record<string, string>);
|
|
621
619
|
}
|
|
622
|
-
|
|
623
620
|
/** Thrown on 429. `retryAfter` is in seconds if provided by the server. */
|
|
624
621
|
declare class TchaviRateLimitError extends TchaviAPIError {
|
|
625
622
|
readonly retryAfter: number | null;
|
|
626
623
|
constructor(response: TchaviErrorResponse, headers?: Record<string, string>);
|
|
627
624
|
}
|
|
628
|
-
|
|
629
625
|
/** Thrown on 402. `creditsRemaining` reflects your current balance. */
|
|
630
626
|
declare class TchaviInsufficientCreditsError extends TchaviAPIError {
|
|
631
627
|
readonly creditsRemaining: number;
|
package/dist/index.js
CHANGED
|
@@ -86,7 +86,7 @@ var AuthStrategy = class {
|
|
|
86
86
|
}
|
|
87
87
|
};
|
|
88
88
|
|
|
89
|
-
// src/errors
|
|
89
|
+
// src/errors.ts
|
|
90
90
|
var TchaviError = class extends Error {
|
|
91
91
|
constructor(message) {
|
|
92
92
|
super(message);
|
|
@@ -94,41 +94,6 @@ var TchaviError = class extends Error {
|
|
|
94
94
|
Object.setPrototypeOf(this, new.target.prototype);
|
|
95
95
|
}
|
|
96
96
|
};
|
|
97
|
-
|
|
98
|
-
// src/errors/TchaviAuthenticationError.ts
|
|
99
|
-
var TchaviAuthenticationError = class extends TchaviAPIError {
|
|
100
|
-
constructor(response, headers = {}) {
|
|
101
|
-
super(response, headers);
|
|
102
|
-
this.name = "TchaviAuthenticationError";
|
|
103
|
-
Object.setPrototypeOf(this, new.target.prototype);
|
|
104
|
-
}
|
|
105
|
-
};
|
|
106
|
-
|
|
107
|
-
// src/errors/TchaviRateLimitError.ts
|
|
108
|
-
var TchaviRateLimitError = class extends TchaviAPIError {
|
|
109
|
-
retryAfter;
|
|
110
|
-
constructor(response, headers = {}) {
|
|
111
|
-
super(response, headers);
|
|
112
|
-
this.name = "TchaviRateLimitError";
|
|
113
|
-
const details = response.details;
|
|
114
|
-
this.retryAfter = details?.retry_after ?? (headers["retry-after"] ? parseInt(headers["retry-after"], 10) : null);
|
|
115
|
-
Object.setPrototypeOf(this, new.target.prototype);
|
|
116
|
-
}
|
|
117
|
-
};
|
|
118
|
-
|
|
119
|
-
// src/errors/TchaviInsufficientCreditsError.ts
|
|
120
|
-
var TchaviInsufficientCreditsError = class extends TchaviAPIError {
|
|
121
|
-
creditsRemaining;
|
|
122
|
-
constructor(response, headers = {}) {
|
|
123
|
-
super(response, headers);
|
|
124
|
-
this.name = "TchaviInsufficientCreditsError";
|
|
125
|
-
const details = response.details;
|
|
126
|
-
this.creditsRemaining = details?.credits_remaining ?? 0;
|
|
127
|
-
Object.setPrototypeOf(this, new.target.prototype);
|
|
128
|
-
}
|
|
129
|
-
};
|
|
130
|
-
|
|
131
|
-
// src/errors/TchaviAPIError.ts
|
|
132
97
|
var TchaviAPIError = class _TchaviAPIError extends TchaviError {
|
|
133
98
|
statusCode;
|
|
134
99
|
errorCode;
|
|
@@ -159,6 +124,33 @@ var TchaviAPIError = class _TchaviAPIError extends TchaviError {
|
|
|
159
124
|
}
|
|
160
125
|
}
|
|
161
126
|
};
|
|
127
|
+
var TchaviAuthenticationError = class extends TchaviAPIError {
|
|
128
|
+
constructor(response, headers = {}) {
|
|
129
|
+
super(response, headers);
|
|
130
|
+
this.name = "TchaviAuthenticationError";
|
|
131
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
var TchaviRateLimitError = class extends TchaviAPIError {
|
|
135
|
+
retryAfter;
|
|
136
|
+
constructor(response, headers = {}) {
|
|
137
|
+
super(response, headers);
|
|
138
|
+
this.name = "TchaviRateLimitError";
|
|
139
|
+
const details = response.details;
|
|
140
|
+
this.retryAfter = details?.retry_after ?? (headers["retry-after"] ? parseInt(headers["retry-after"], 10) : null);
|
|
141
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
142
|
+
}
|
|
143
|
+
};
|
|
144
|
+
var TchaviInsufficientCreditsError = class extends TchaviAPIError {
|
|
145
|
+
creditsRemaining;
|
|
146
|
+
constructor(response, headers = {}) {
|
|
147
|
+
super(response, headers);
|
|
148
|
+
this.name = "TchaviInsufficientCreditsError";
|
|
149
|
+
const details = response.details;
|
|
150
|
+
this.creditsRemaining = details?.credits_remaining ?? 0;
|
|
151
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
152
|
+
}
|
|
153
|
+
};
|
|
162
154
|
|
|
163
155
|
// src/core/http-client.ts
|
|
164
156
|
var RETRYABLE_STATUS = /* @__PURE__ */ new Set([429, 502, 503]);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/auth.ts","../src/errors/TchaviError.ts","../src/errors/TchaviAuthenticationError.ts","../src/errors/TchaviRateLimitError.ts","../src/errors/TchaviInsufficientCreditsError.ts","../src/errors/TchaviAPIError.ts","../src/core/http-client.ts","../src/core/streaming.ts","../src/resources/chat/completions.ts","../src/resources/chat/index.ts","../src/resources/embeddings.ts","../src/resources/images/generations.ts","../src/resources/images/index.ts","../src/resources/credits.ts","../src/resources/api-keys.ts","../src/resources/usage.ts","../src/resources/models.ts","../src/resources/payments.ts","../src/resources/auth-resource.ts","../src/resources/users.ts","../src/tchavi.ts","../src/index.ts"],"names":["body"],"mappings":"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","file":"index.js","sourcesContent":["import type { TchaviClientOptions } from '../types/common.js';\n\nexport type AuthMode = 'api-key' | 'jwt';\n\n/**\n * AuthStrategy holds and refreshes credentials.\n * - API key mode: static header, no state\n * - JWT mode: logs in lazily, stores the access token in memory,\n * refreshes via /auth/refresh cookie when the token expires\n */\nexport class AuthStrategy {\n private mode: AuthMode;\n private apiKey?: string;\n private accessToken?: string;\n private tokenExpiresAt?: number;\n private baseURL: string;\n private email?: string;\n private password?: string;\n\n constructor(options: TchaviClientOptions) {\n this.baseURL = options.baseURL ?? 'http://localhost:3001';\n if (options.apiKey) {\n this.mode = 'api-key';\n this.apiKey = options.apiKey;\n } else if (options.email && options.password) {\n this.mode = 'jwt';\n this.email = options.email;\n this.password = options.password;\n } else {\n throw new Error(\n 'TchaviClientOptions must provide either `apiKey` or both `email` and `password`.',\n );\n }\n }\n\n /**\n * Returns the Authorization header value for the current request.\n * For JWT mode, lazily logs in and refreshes the token as needed.\n */\n async getAuthHeader(): Promise<string> {\n if (this.mode === 'api-key') {\n return `Bearer ${this.apiKey}`;\n }\n\n if (!this.accessToken || this.isTokenExpired()) {\n await this.loginOrRefresh();\n }\n\n return `Bearer ${this.accessToken}`;\n }\n\n /** Store a token (e.g. after explicit login() call from AuthResource) */\n setAccessToken(token: string, expiresInSeconds = 900): void {\n this.accessToken = token;\n this.tokenExpiresAt = Date.now() + (expiresInSeconds - 30) * 1000;\n }\n\n getMode(): AuthMode {\n return this.mode;\n }\n\n private isTokenExpired(): boolean {\n if (!this.tokenExpiresAt) return true;\n return Date.now() >= this.tokenExpiresAt;\n }\n\n private async loginOrRefresh(): Promise<void> {\n const refreshed = await this.tryRefresh();\n if (!refreshed) {\n await this.loginWithPassword();\n }\n }\n\n private async tryRefresh(): Promise<boolean> {\n try {\n const resp = await fetch(`${this.baseURL}/auth/refresh`, {\n method: 'POST',\n credentials: 'include',\n headers: { 'Content-Type': 'application/json' },\n });\n if (!resp.ok) return false;\n const body = (await resp.json()) as { accessToken: string };\n this.setAccessToken(body.accessToken);\n return true;\n } catch {\n return false;\n }\n }\n\n private async loginWithPassword(): Promise<void> {\n const resp = await fetch(`${this.baseURL}/auth/login`, {\n method: 'POST',\n credentials: 'include',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ email: this.email, password: this.password }),\n });\n\n if (!resp.ok) {\n const body = (await resp.json().catch(() => ({}))) as Record<string, unknown>;\n throw new Error(\n `Tchavi auth failed: ${(body['message'] as string | undefined) ?? resp.statusText}`,\n );\n }\n\n const body = (await resp.json()) as { accessToken: string };\n this.setAccessToken(body.accessToken);\n }\n}\n","/**\n * Base error for all Tchavi SDK errors.\n * Catches both network-level and API-level failures.\n */\nexport class TchaviError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'TchaviError';\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","import { TchaviAPIError } from './TchaviAPIError.js';\nimport type { TchaviErrorResponse } from '../types/common.js';\n\n/** Thrown when the gateway returns 401 (invalid/missing API key or JWT) */\nexport class TchaviAuthenticationError extends TchaviAPIError {\n constructor(response: TchaviErrorResponse, headers: Record<string, string> = {}) {\n super(response, headers);\n this.name = 'TchaviAuthenticationError';\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","import { TchaviAPIError } from './TchaviAPIError.js';\nimport type { TchaviErrorResponse } from '../types/common.js';\n\n/** Thrown on 429. `retryAfter` is in seconds if provided by the server. */\nexport class TchaviRateLimitError extends TchaviAPIError {\n readonly retryAfter: number | null;\n\n constructor(response: TchaviErrorResponse, headers: Record<string, string> = {}) {\n super(response, headers);\n this.name = 'TchaviRateLimitError';\n const details = response.details as Record<string, unknown> | undefined;\n this.retryAfter =\n (details?.retry_after as number | undefined) ??\n (headers['retry-after'] ? parseInt(headers['retry-after'], 10) : null);\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","import { TchaviAPIError } from './TchaviAPIError.js';\nimport type { TchaviErrorResponse } from '../types/common.js';\n\n/** Thrown on 402. `creditsRemaining` reflects your current balance. */\nexport class TchaviInsufficientCreditsError extends TchaviAPIError {\n readonly creditsRemaining: number;\n\n constructor(response: TchaviErrorResponse, headers: Record<string, string> = {}) {\n super(response, headers);\n this.name = 'TchaviInsufficientCreditsError';\n const details = response.details as Record<string, unknown> | undefined;\n this.creditsRemaining = (details?.credits_remaining as number | undefined) ?? 0;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","import { TchaviError } from './TchaviError.js';\nimport type { TchaviErrorResponse } from '../types/common.js';\n\n/**\n * An error returned by the Tchavi API as a JSON response.\n * Maps directly to the server's { error, message, statusCode } shape.\n */\nexport class TchaviAPIError extends TchaviError {\n readonly statusCode: number;\n readonly errorCode: string;\n readonly details?: unknown;\n readonly headers: Record<string, string>;\n\n constructor(response: TchaviErrorResponse, headers: Record<string, string> = {}) {\n super(response.message);\n this.name = 'TchaviAPIError';\n this.statusCode = response.statusCode;\n this.errorCode = response.error;\n this.details = response.details;\n this.headers = headers;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n\n /**\n * Factory: inspect the raw response and construct the most specific subclass.\n */\n static fromResponse(\n response: TchaviErrorResponse,\n headers: Record<string, string>,\n ): TchaviAPIError {\n switch (response.statusCode) {\n case 401:\n return new TchaviAuthenticationError(response, headers);\n case 402:\n return new TchaviInsufficientCreditsError(response, headers);\n case 429:\n return new TchaviRateLimitError(response, headers);\n default:\n return new TchaviAPIError(response, headers);\n }\n }\n}\n\n// Imported at EOF to avoid circular dependency: subclasses extend TchaviAPIError\n// which is defined above, so they must be imported after the class declaration.\nimport { TchaviAuthenticationError } from './TchaviAuthenticationError.js';\nimport { TchaviRateLimitError } from './TchaviRateLimitError.js';\nimport { TchaviInsufficientCreditsError } from './TchaviInsufficientCreditsError.js';\n","import { TchaviAPIError } from '../errors/TchaviAPIError.js';\nimport { TchaviError } from '../errors/TchaviError.js';\nimport type { AuthStrategy } from './auth.js';\nimport type { TchaviErrorResponse } from '../types/common.js';\n\nexport interface RequestOptions {\n method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n path: string;\n body?: unknown;\n query?: Record<string, string | number | boolean | undefined>;\n /** Skip auth header (used for public endpoints) */\n skipAuth?: boolean;\n /** Override timeout for this specific request */\n timeout?: number;\n}\n\nconst RETRYABLE_STATUS = new Set([429, 502, 503]);\n\n/**\n * Core HTTP client. All resource classes use this.\n *\n * Handles:\n * - Auth header injection\n * - Query string serialization\n * - JSON body serialization\n * - Non-2xx error mapping to typed error classes\n * - Exponential backoff with jitter for retryable responses\n * - AbortController-based timeouts\n */\nexport class HttpClient {\n private baseURL: string;\n private maxRetries: number;\n private defaultTimeout: number;\n private auth: AuthStrategy;\n\n constructor(auth: AuthStrategy, baseURL: string, maxRetries: number, timeout: number) {\n this.auth = auth;\n this.baseURL = baseURL.replace(/\\/$/, '');\n this.maxRetries = maxRetries;\n this.defaultTimeout = timeout;\n }\n\n async request<T>(options: RequestOptions): Promise<T> {\n const response = await this.requestRaw(options);\n return response.json() as Promise<T>;\n }\n\n /**\n * Returns the raw Response — used for streaming so callers can pipe the body.\n */\n async requestRaw(options: RequestOptions): Promise<Response> {\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= this.maxRetries; attempt++) {\n if (attempt > 0) {\n await this.sleep(this.backoffMs(attempt));\n }\n\n const controller = new AbortController();\n const timeout = options.timeout ?? this.defaultTimeout;\n const timerId = setTimeout(() => controller.abort(), timeout);\n\n try {\n const url = this.buildURL(options.path, options.query);\n const authHeader = options.skipAuth ? undefined : await this.auth.getAuthHeader();\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n if (authHeader) {\n headers['Authorization'] = authHeader;\n }\n\n const fetchOptions: RequestInit = {\n method: options.method ?? 'GET',\n headers,\n signal: controller.signal,\n credentials: 'include',\n };\n\n if (options.body !== undefined) {\n fetchOptions.body = JSON.stringify(options.body);\n }\n\n const response = await fetch(url, fetchOptions);\n clearTimeout(timerId);\n\n if (response.ok) {\n return response;\n }\n\n if (RETRYABLE_STATUS.has(response.status) && attempt < this.maxRetries) {\n const retryAfter = response.headers.get('Retry-After');\n if (retryAfter) {\n const seconds = parseInt(retryAfter, 10);\n if (!Number.isNaN(seconds) && seconds > 0) {\n await this.sleep(seconds * 1000);\n }\n }\n lastError = new TchaviError(`HTTP ${response.status} ${response.statusText}`);\n continue;\n }\n\n let errorBody: TchaviErrorResponse;\n try {\n errorBody = (await response.json()) as TchaviErrorResponse;\n } catch {\n errorBody = {\n error: 'unknown_error',\n message: response.statusText,\n statusCode: response.status,\n };\n }\n\n const headersObj: Record<string, string> = {};\n response.headers.forEach((value, key) => {\n headersObj[key] = value;\n });\n\n throw TchaviAPIError.fromResponse(errorBody, headersObj);\n } catch (err) {\n clearTimeout(timerId);\n if (err instanceof TchaviAPIError) throw err;\n\n if ((err as Error).name === 'AbortError') {\n throw new TchaviError(`Request timed out after ${timeout}ms`);\n }\n\n lastError = err;\n if (attempt === this.maxRetries) {\n throw new TchaviError(`Network error: ${(err as Error).message}`);\n }\n }\n }\n\n throw new TchaviError(`Request failed after ${this.maxRetries} retries: ${String(lastError)}`);\n }\n\n private buildURL(\n path: string,\n query?: Record<string, string | number | boolean | undefined>,\n ): string {\n const url = new URL(`${this.baseURL}${path}`);\n if (query) {\n for (const [key, value] of Object.entries(query)) {\n if (value !== undefined) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n return url.toString();\n }\n\n /** Exponential backoff with full jitter */\n private backoffMs(attempt: number): number {\n const base = 500;\n const cap = 10_000;\n const ceiling = Math.min(cap, base * Math.pow(2, attempt));\n return Math.random() * ceiling;\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n","import { TchaviError } from '../errors/TchaviError.js';\nimport type { TchaviMeta } from '../types/common.js';\nimport type { StreamEvent } from '../types/streaming.js';\n\n/** Maximum SSE buffer size (1 MB) to prevent OOM from broken servers. */\nconst MAX_BUFFER_SIZE = 1_048_576;\n\n/**\n * Parses a ReadableStream<Uint8Array> SSE response from Tchavi into\n * an AsyncIterable of typed StreamEvent<T> objects.\n *\n * Protocol:\n * Standard chunks: \"data: {...json...}\\n\\n\"\n * Done marker: \"data: [DONE]\\n\\n\"\n * Tchavi metadata: \"event: tchavi\\ndata: {...json...}\\n\\n\"\n */\nexport async function* parseStream<T>(\n body: ReadableStream<Uint8Array>,\n): AsyncGenerator<StreamEvent<T>> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n\n if (buffer.length > MAX_BUFFER_SIZE) {\n throw new TchaviError(\n `SSE buffer exceeded ${MAX_BUFFER_SIZE} bytes — possible malformed stream`,\n );\n }\n\n const events = buffer.split('\\n\\n');\n buffer = events.pop() ?? '';\n\n for (const rawEvent of events) {\n const lines = rawEvent.split('\\n');\n let eventType: string | undefined;\n let dataLine: string | undefined;\n\n for (const line of lines) {\n if (line.startsWith('event: ')) {\n eventType = line.slice(7).trim();\n } else if (line.startsWith('data: ')) {\n dataLine = line.slice(6).trim();\n }\n }\n\n if (!dataLine) continue;\n\n if (dataLine === '[DONE]') {\n yield { type: 'done' };\n return;\n }\n\n if (eventType === 'tchavi') {\n try {\n const meta = JSON.parse(dataLine) as TchaviMeta;\n yield { type: 'tchavi', data: meta };\n } catch {\n // Malformed tchavi event — skip\n }\n continue;\n }\n\n try {\n const parsed = JSON.parse(dataLine) as T;\n yield { type: 'data', data: parsed };\n } catch {\n // Non-JSON data line — skip\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\n/**\n * Wraps an SSE ReadableStream as an AsyncIterable<T>.\n * Stores the final Tchavi metadata so it can be accessed after iteration.\n *\n * @example\n * ```ts\n * const stream = await client.chat.completions.create({ ..., stream: true });\n * for await (const chunk of stream) {\n * process.stdout.write(chunk.choices[0]?.delta?.content ?? '');\n * }\n * console.log('Credits used:', stream.finalMeta()?.credits_used);\n * ```\n */\nexport class TchaviStream<T> implements AsyncIterable<T> {\n private body: ReadableStream<Uint8Array>;\n private _tchaviMeta: TchaviMeta | null = null;\n\n constructor(body: ReadableStream<Uint8Array>) {\n this.body = body;\n }\n\n [Symbol.asyncIterator](): AsyncIterator<T> {\n return this._consume();\n }\n\n private async *_consume(): AsyncGenerator<T> {\n try {\n for await (const event of parseStream<T>(this.body)) {\n if (event.type === 'data') {\n yield event.data;\n } else if (event.type === 'tchavi') {\n this._tchaviMeta = event.data;\n }\n }\n } finally {\n // Release stream resources if iteration is abandoned early (e.g. break)\n this.body.cancel().catch(() => {});\n }\n }\n\n /** Returns Tchavi credit metadata once the stream is fully consumed. */\n finalMeta(): TchaviMeta | null {\n return this._tchaviMeta;\n }\n}\n","import type { HttpClient } from '../../core/http-client.js';\nimport { TchaviStream } from '../../core/streaming.js';\nimport { TchaviError } from '../../errors/TchaviError.js';\nimport type {\n ChatCompletionCreateParamsNonStreaming,\n ChatCompletionCreateParamsStreaming,\n ChatCompletionCreateParams,\n ChatCompletion,\n ChatCompletionChunk,\n} from '../../types/chat.js';\n\nexport class Completions {\n constructor(private http: HttpClient) {}\n\n create(params: ChatCompletionCreateParamsNonStreaming): Promise<ChatCompletion>;\n create(params: ChatCompletionCreateParamsStreaming): Promise<TchaviStream<ChatCompletionChunk>>;\n async create(\n params: ChatCompletionCreateParams,\n ): Promise<ChatCompletion | TchaviStream<ChatCompletionChunk>> {\n if (params.stream === true) {\n const response = await this.http.requestRaw({\n method: 'POST',\n path: '/v1/chat/completions',\n body: params,\n timeout: 120_000,\n });\n\n if (!response.body) {\n throw new TchaviError('Streaming response has no body');\n }\n\n return new TchaviStream<ChatCompletionChunk>(response.body);\n }\n\n return this.http.request<ChatCompletion>({\n method: 'POST',\n path: '/v1/chat/completions',\n body: params,\n });\n }\n}\n","import type { HttpClient } from '../../core/http-client.js';\nimport { Completions } from './completions.js';\n\nexport class Chat {\n readonly completions: Completions;\n\n constructor(http: HttpClient) {\n this.completions = new Completions(http);\n }\n}\n","import type { HttpClient } from '../core/http-client.js';\nimport type { EmbeddingCreateParams, EmbeddingsResponse } from '../types/embeddings.js';\n\nexport class Embeddings {\n constructor(private http: HttpClient) {}\n\n create(params: EmbeddingCreateParams): Promise<EmbeddingsResponse> {\n return this.http.request({\n method: 'POST',\n path: '/v1/embeddings',\n body: params,\n });\n }\n}\n","import type { HttpClient } from '../../core/http-client.js';\nimport type { ImageGenerationParams, ImagesResponse } from '../../types/images.js';\n\nexport class Generations {\n constructor(private http: HttpClient) {}\n\n create(params: ImageGenerationParams): Promise<ImagesResponse> {\n return this.http.request({\n method: 'POST',\n path: '/v1/images/generations',\n body: params,\n });\n }\n}\n","import type { HttpClient } from '../../core/http-client.js';\nimport { Generations } from './generations.js';\n\nexport class Images {\n readonly generations: Generations;\n\n constructor(http: HttpClient) {\n this.generations = new Generations(http);\n }\n}\n","import type { HttpClient } from '../core/http-client.js';\nimport type { CreditBalance, CreditPack } from '../types/credits.js';\n\nexport class Credits {\n constructor(private http: HttpClient) {}\n\n getBalance(): Promise<CreditBalance> {\n return this.http.request({ path: '/credits/balance' });\n }\n\n listPacks(): Promise<CreditPack[]> {\n return this.http.request({ path: '/credits/packs', skipAuth: true });\n }\n}\n","import type { HttpClient } from '../core/http-client.js';\nimport type {\n ApiKey,\n ApiKeyWithSecret,\n CreateApiKeyParams,\n UpdateApiKeyParams,\n} from '../types/api-keys.js';\n\nexport class ApiKeys {\n constructor(private http: HttpClient) {}\n\n list(): Promise<ApiKey[]> {\n return this.http.request({ path: '/api-keys' });\n }\n\n create(params: CreateApiKeyParams = {}): Promise<ApiKeyWithSecret> {\n return this.http.request({ method: 'POST', path: '/api-keys', body: params });\n }\n\n retrieve(id: string): Promise<ApiKey> {\n return this.http.request({ path: `/api-keys/${id}` });\n }\n\n update(id: string, params: UpdateApiKeyParams): Promise<ApiKey> {\n return this.http.request({ method: 'PUT', path: `/api-keys/${id}`, body: params });\n }\n\n delete(id: string): Promise<{ message: string }> {\n return this.http.request({ method: 'DELETE', path: `/api-keys/${id}` });\n }\n}\n","import type { HttpClient } from '../core/http-client.js';\nimport type { UsageStats, UsageLog, GetStatsParams, GetHistoryParams } from '../types/usage.js';\nimport type { PaginatedResponse } from '../types/common.js';\n\nexport class Usage {\n constructor(private http: HttpClient) {}\n\n getStats(params: GetStatsParams = {}): Promise<UsageStats> {\n return this.http.request({\n path: '/usage/stats',\n query: params as Record<string, string>,\n });\n }\n\n getHistory(params: GetHistoryParams = {}): Promise<PaginatedResponse<UsageLog>> {\n return this.http.request({\n path: '/usage/history',\n query: params as Record<string, string | number>,\n });\n }\n}\n","import type { HttpClient } from '../core/http-client.js';\nimport type { ModelTierConfig } from '../types/models.js';\n\nexport class Models {\n constructor(private http: HttpClient) {}\n\n /** Lists all active model tiers. Pass `all: true` to include inactive ones (admin only). */\n list(params: { all?: boolean } = {}): Promise<ModelTierConfig[]> {\n return this.http.request({\n path: '/model-tiers',\n query: params.all ? { all: 'true' } : undefined,\n skipAuth: true,\n });\n }\n}\n","import type { HttpClient } from '../core/http-client.js';\nimport type { Payment, InitiatePaymentParams, PaymentInitiateResponse } from '../types/payments.js';\nimport type { PaginatedResponse } from '../types/common.js';\n\nexport class Payments {\n constructor(private http: HttpClient) {}\n\n initiate(params: InitiatePaymentParams): Promise<PaymentInitiateResponse> {\n return this.http.request({ method: 'POST', path: '/payments/initiate', body: params });\n }\n\n getStatus(id: string): Promise<Payment> {\n return this.http.request({ path: `/payments/status/${id}` });\n }\n\n getHistory(params: { page?: number; limit?: number } = {}): Promise<PaginatedResponse<Payment>> {\n return this.http.request({\n path: '/payments/history',\n query: params as Record<string, number>,\n });\n }\n}\n","import type { HttpClient } from '../core/http-client.js';\nimport type { AuthStrategy } from '../core/auth.js';\nimport type { RegisterParams, LoginResponse, User } from '../types/auth.js';\n\nexport class AuthResource {\n constructor(\n private http: HttpClient,\n private authStrategy: AuthStrategy,\n ) {}\n\n async login(email: string, password: string): Promise<LoginResponse> {\n const result = await this.http.request<LoginResponse>({\n method: 'POST',\n path: '/auth/login',\n body: { email, password },\n skipAuth: true,\n });\n this.authStrategy.setAccessToken(result.accessToken);\n return result;\n }\n\n register(params: RegisterParams): Promise<{ message: string; user: User }> {\n return this.http.request({\n method: 'POST',\n path: '/auth/register',\n body: params,\n skipAuth: true,\n });\n }\n\n logout(): Promise<{ message: string }> {\n return this.http.request({ method: 'POST', path: '/auth/logout' });\n }\n}\n","import type { HttpClient } from '../core/http-client.js';\nimport type { User, UpdateUserParams } from '../types/auth.js';\n\nexport class Users {\n constructor(private http: HttpClient) {}\n\n me(): Promise<User> {\n return this.http.request({ path: '/users/me' });\n }\n\n update(params: UpdateUserParams): Promise<User> {\n return this.http.request({ method: 'PUT', path: '/users/me', body: params });\n }\n}\n","import { AuthStrategy } from './core/auth.js';\nimport { HttpClient } from './core/http-client.js';\nimport { Chat } from './resources/chat/index.js';\nimport { Embeddings } from './resources/embeddings.js';\nimport { Images } from './resources/images/index.js';\nimport { Credits } from './resources/credits.js';\nimport { ApiKeys } from './resources/api-keys.js';\nimport { Usage } from './resources/usage.js';\nimport { Models } from './resources/models.js';\nimport { Payments } from './resources/payments.js';\nimport { AuthResource } from './resources/auth-resource.js';\nimport { Users } from './resources/users.js';\nimport type { TchaviClientOptions } from './types/common.js';\n\nconst DEFAULT_BASE_URL = 'http://localhost:3001';\nconst DEFAULT_MAX_RETRIES = 2;\nconst DEFAULT_TIMEOUT = 60_000;\n\n/**\n * Main Tchavi client. Mirrors the OpenAI SDK's resource-based API.\n *\n * @example API key mode (proxy endpoints):\n * ```ts\n * import Tchavi from '@tchavi/sdk';\n *\n * const client = new Tchavi({ apiKey: 'sk-tch-...' });\n *\n * const completion = await client.chat.completions.create({\n * model: 'gpt-4o-mini',\n * messages: [{ role: 'user', content: 'Hello' }],\n * });\n * console.log(completion.choices[0].message.content);\n * console.log(completion.tchavi.credits_used);\n * ```\n *\n * @example JWT mode (account management):\n * ```ts\n * const client = new Tchavi({ email: 'me@example.com', password: 'S3cret!' });\n * const balance = await client.credits.getBalance();\n * const keys = await client.apiKeys.list();\n * ```\n *\n * @example Streaming:\n * ```ts\n * const stream = await client.chat.completions.create({\n * model: 'gpt-4o',\n * messages: [{ role: 'user', content: 'Tell me a story' }],\n * stream: true,\n * });\n * for await (const chunk of stream) {\n * process.stdout.write(chunk.choices[0]?.delta?.content ?? '');\n * }\n * console.log('\\nCredits used:', stream.finalMeta()?.credits_used);\n * ```\n */\nexport class Tchavi {\n readonly chat: Chat;\n readonly embeddings: Embeddings;\n readonly images: Images;\n readonly credits: Credits;\n readonly apiKeys: ApiKeys;\n readonly usage: Usage;\n readonly models: Models;\n readonly payments: Payments;\n readonly auth: AuthResource;\n readonly users: Users;\n\n constructor(options: TchaviClientOptions) {\n const baseURL = options.baseURL ?? DEFAULT_BASE_URL;\n const maxRetries = options.maxRetries ?? DEFAULT_MAX_RETRIES;\n const timeout = options.timeout ?? DEFAULT_TIMEOUT;\n\n const authStrategy = new AuthStrategy(options);\n const http = new HttpClient(authStrategy, baseURL, maxRetries, timeout);\n\n this.chat = new Chat(http);\n this.embeddings = new Embeddings(http);\n this.images = new Images(http);\n this.credits = new Credits(http);\n this.apiKeys = new ApiKeys(http);\n this.usage = new Usage(http);\n this.models = new Models(http);\n this.payments = new Payments(http);\n this.auth = new AuthResource(http, authStrategy);\n this.users = new Users(http);\n }\n}\n","import { Tchavi } from './tchavi.js';\nexport default Tchavi;\nexport { Tchavi };\nexport { TchaviStream } from './core/streaming.js';\n\nexport {\n TchaviError,\n TchaviAPIError,\n TchaviAuthenticationError,\n TchaviRateLimitError,\n TchaviInsufficientCreditsError,\n} from './errors/index.js';\n\nexport type * from './types/index.js';\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/auth.ts","../src/errors.ts","../src/core/http-client.ts","../src/core/streaming.ts","../src/resources/chat/completions.ts","../src/resources/chat/index.ts","../src/resources/embeddings.ts","../src/resources/images/generations.ts","../src/resources/images/index.ts","../src/resources/credits.ts","../src/resources/api-keys.ts","../src/resources/usage.ts","../src/resources/models.ts","../src/resources/payments.ts","../src/resources/auth-resource.ts","../src/resources/users.ts","../src/tchavi.ts","../src/index.ts"],"names":["body"],"mappings":"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","file":"index.js","sourcesContent":["import type { TchaviClientOptions } from '../types/common.js';\n\nexport type AuthMode = 'api-key' | 'jwt';\n\n/**\n * AuthStrategy holds and refreshes credentials.\n * - API key mode: static header, no state\n * - JWT mode: logs in lazily, stores the access token in memory,\n * refreshes via /auth/refresh cookie when the token expires\n */\nexport class AuthStrategy {\n private mode: AuthMode;\n private apiKey?: string;\n private accessToken?: string;\n private tokenExpiresAt?: number;\n private baseURL: string;\n private email?: string;\n private password?: string;\n\n constructor(options: TchaviClientOptions) {\n this.baseURL = options.baseURL ?? 'http://localhost:3001';\n if (options.apiKey) {\n this.mode = 'api-key';\n this.apiKey = options.apiKey;\n } else if (options.email && options.password) {\n this.mode = 'jwt';\n this.email = options.email;\n this.password = options.password;\n } else {\n throw new Error(\n 'TchaviClientOptions must provide either `apiKey` or both `email` and `password`.',\n );\n }\n }\n\n /**\n * Returns the Authorization header value for the current request.\n * For JWT mode, lazily logs in and refreshes the token as needed.\n */\n async getAuthHeader(): Promise<string> {\n if (this.mode === 'api-key') {\n return `Bearer ${this.apiKey}`;\n }\n\n if (!this.accessToken || this.isTokenExpired()) {\n await this.loginOrRefresh();\n }\n\n return `Bearer ${this.accessToken}`;\n }\n\n /** Store a token (e.g. after explicit login() call from AuthResource) */\n setAccessToken(token: string, expiresInSeconds = 900): void {\n this.accessToken = token;\n this.tokenExpiresAt = Date.now() + (expiresInSeconds - 30) * 1000;\n }\n\n getMode(): AuthMode {\n return this.mode;\n }\n\n private isTokenExpired(): boolean {\n if (!this.tokenExpiresAt) return true;\n return Date.now() >= this.tokenExpiresAt;\n }\n\n private async loginOrRefresh(): Promise<void> {\n const refreshed = await this.tryRefresh();\n if (!refreshed) {\n await this.loginWithPassword();\n }\n }\n\n private async tryRefresh(): Promise<boolean> {\n try {\n const resp = await fetch(`${this.baseURL}/auth/refresh`, {\n method: 'POST',\n credentials: 'include',\n headers: { 'Content-Type': 'application/json' },\n });\n if (!resp.ok) return false;\n const body = (await resp.json()) as { accessToken: string };\n this.setAccessToken(body.accessToken);\n return true;\n } catch {\n return false;\n }\n }\n\n private async loginWithPassword(): Promise<void> {\n const resp = await fetch(`${this.baseURL}/auth/login`, {\n method: 'POST',\n credentials: 'include',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ email: this.email, password: this.password }),\n });\n\n if (!resp.ok) {\n const body = (await resp.json().catch(() => ({}))) as Record<string, unknown>;\n throw new Error(\n `Tchavi auth failed: ${(body['message'] as string | undefined) ?? resp.statusText}`,\n );\n }\n\n const body = (await resp.json()) as { accessToken: string };\n this.setAccessToken(body.accessToken);\n }\n}\n","import type { TchaviErrorResponse } from './types/common.js';\n\n/**\n * Base error for all Tchavi SDK errors.\n * Catches both network-level and API-level failures.\n */\nexport class TchaviError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'TchaviError';\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * An error returned by the Tchavi API as a JSON response.\n * Maps directly to the server's { error, message, statusCode } shape.\n */\nexport class TchaviAPIError extends TchaviError {\n readonly statusCode: number;\n readonly errorCode: string;\n readonly details?: unknown;\n readonly headers: Record<string, string>;\n\n constructor(response: TchaviErrorResponse, headers: Record<string, string> = {}) {\n super(response.message);\n this.name = 'TchaviAPIError';\n this.statusCode = response.statusCode;\n this.errorCode = response.error;\n this.details = response.details;\n this.headers = headers;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n\n /**\n * Factory: inspect the raw response and construct the most specific subclass.\n */\n static fromResponse(\n response: TchaviErrorResponse,\n headers: Record<string, string>,\n ): TchaviAPIError {\n switch (response.statusCode) {\n case 401:\n return new TchaviAuthenticationError(response, headers);\n case 402:\n return new TchaviInsufficientCreditsError(response, headers);\n case 429:\n return new TchaviRateLimitError(response, headers);\n default:\n return new TchaviAPIError(response, headers);\n }\n }\n}\n\n/** Thrown when the gateway returns 401 (invalid/missing API key or JWT) */\nexport class TchaviAuthenticationError extends TchaviAPIError {\n constructor(response: TchaviErrorResponse, headers: Record<string, string> = {}) {\n super(response, headers);\n this.name = 'TchaviAuthenticationError';\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** Thrown on 429. `retryAfter` is in seconds if provided by the server. */\nexport class TchaviRateLimitError extends TchaviAPIError {\n readonly retryAfter: number | null;\n\n constructor(response: TchaviErrorResponse, headers: Record<string, string> = {}) {\n super(response, headers);\n this.name = 'TchaviRateLimitError';\n const details = response.details as Record<string, unknown> | undefined;\n this.retryAfter =\n (details?.retry_after as number | undefined) ??\n (headers['retry-after'] ? parseInt(headers['retry-after'], 10) : null);\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** Thrown on 402. `creditsRemaining` reflects your current balance. */\nexport class TchaviInsufficientCreditsError extends TchaviAPIError {\n readonly creditsRemaining: number;\n\n constructor(response: TchaviErrorResponse, headers: Record<string, string> = {}) {\n super(response, headers);\n this.name = 'TchaviInsufficientCreditsError';\n const details = response.details as Record<string, unknown> | undefined;\n this.creditsRemaining = (details?.credits_remaining as number | undefined) ?? 0;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","import { TchaviAPIError, TchaviError } from '../errors.js';\nimport type { AuthStrategy } from './auth.js';\nimport type { TchaviErrorResponse } from '../types/common.js';\n\nexport interface RequestOptions {\n method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n path: string;\n body?: unknown;\n query?: Record<string, string | number | boolean | undefined>;\n /** Skip auth header (used for public endpoints) */\n skipAuth?: boolean;\n /** Override timeout for this specific request */\n timeout?: number;\n}\n\nconst RETRYABLE_STATUS = new Set([429, 502, 503]);\n\n/**\n * Core HTTP client. All resource classes use this.\n *\n * Handles:\n * - Auth header injection\n * - Query string serialization\n * - JSON body serialization\n * - Non-2xx error mapping to typed error classes\n * - Exponential backoff with jitter for retryable responses\n * - AbortController-based timeouts\n */\nexport class HttpClient {\n private baseURL: string;\n private maxRetries: number;\n private defaultTimeout: number;\n private auth: AuthStrategy;\n\n constructor(auth: AuthStrategy, baseURL: string, maxRetries: number, timeout: number) {\n this.auth = auth;\n this.baseURL = baseURL.replace(/\\/$/, '');\n this.maxRetries = maxRetries;\n this.defaultTimeout = timeout;\n }\n\n async request<T>(options: RequestOptions): Promise<T> {\n const response = await this.requestRaw(options);\n return response.json() as Promise<T>;\n }\n\n /**\n * Returns the raw Response — used for streaming so callers can pipe the body.\n */\n async requestRaw(options: RequestOptions): Promise<Response> {\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= this.maxRetries; attempt++) {\n if (attempt > 0) {\n await this.sleep(this.backoffMs(attempt));\n }\n\n const controller = new AbortController();\n const timeout = options.timeout ?? this.defaultTimeout;\n const timerId = setTimeout(() => controller.abort(), timeout);\n\n try {\n const url = this.buildURL(options.path, options.query);\n const authHeader = options.skipAuth ? undefined : await this.auth.getAuthHeader();\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n if (authHeader) {\n headers['Authorization'] = authHeader;\n }\n\n const fetchOptions: RequestInit = {\n method: options.method ?? 'GET',\n headers,\n signal: controller.signal,\n credentials: 'include',\n };\n\n if (options.body !== undefined) {\n fetchOptions.body = JSON.stringify(options.body);\n }\n\n const response = await fetch(url, fetchOptions);\n clearTimeout(timerId);\n\n if (response.ok) {\n return response;\n }\n\n if (RETRYABLE_STATUS.has(response.status) && attempt < this.maxRetries) {\n const retryAfter = response.headers.get('Retry-After');\n if (retryAfter) {\n const seconds = parseInt(retryAfter, 10);\n if (!Number.isNaN(seconds) && seconds > 0) {\n await this.sleep(seconds * 1000);\n }\n }\n lastError = new TchaviError(`HTTP ${response.status} ${response.statusText}`);\n continue;\n }\n\n let errorBody: TchaviErrorResponse;\n try {\n errorBody = (await response.json()) as TchaviErrorResponse;\n } catch {\n errorBody = {\n error: 'unknown_error',\n message: response.statusText,\n statusCode: response.status,\n };\n }\n\n const headersObj: Record<string, string> = {};\n response.headers.forEach((value, key) => {\n headersObj[key] = value;\n });\n\n throw TchaviAPIError.fromResponse(errorBody, headersObj);\n } catch (err) {\n clearTimeout(timerId);\n if (err instanceof TchaviAPIError) throw err;\n\n if ((err as Error).name === 'AbortError') {\n throw new TchaviError(`Request timed out after ${timeout}ms`);\n }\n\n lastError = err;\n if (attempt === this.maxRetries) {\n throw new TchaviError(`Network error: ${(err as Error).message}`);\n }\n }\n }\n\n throw new TchaviError(`Request failed after ${this.maxRetries} retries: ${String(lastError)}`);\n }\n\n private buildURL(\n path: string,\n query?: Record<string, string | number | boolean | undefined>,\n ): string {\n const url = new URL(`${this.baseURL}${path}`);\n if (query) {\n for (const [key, value] of Object.entries(query)) {\n if (value !== undefined) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n return url.toString();\n }\n\n /** Exponential backoff with full jitter */\n private backoffMs(attempt: number): number {\n const base = 500;\n const cap = 10_000;\n const ceiling = Math.min(cap, base * Math.pow(2, attempt));\n return Math.random() * ceiling;\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n","import { TchaviError } from '../errors.js';\nimport type { TchaviMeta } from '../types/common.js';\nimport type { StreamEvent } from '../types/streaming.js';\n\n/** Maximum SSE buffer size (1 MB) to prevent OOM from broken servers. */\nconst MAX_BUFFER_SIZE = 1_048_576;\n\n/**\n * Parses a ReadableStream<Uint8Array> SSE response from Tchavi into\n * an AsyncIterable of typed StreamEvent<T> objects.\n *\n * Protocol:\n * Standard chunks: \"data: {...json...}\\n\\n\"\n * Done marker: \"data: [DONE]\\n\\n\"\n * Tchavi metadata: \"event: tchavi\\ndata: {...json...}\\n\\n\"\n */\nexport async function* parseStream<T>(\n body: ReadableStream<Uint8Array>,\n): AsyncGenerator<StreamEvent<T>> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n\n if (buffer.length > MAX_BUFFER_SIZE) {\n throw new TchaviError(\n `SSE buffer exceeded ${MAX_BUFFER_SIZE} bytes — possible malformed stream`,\n );\n }\n\n const events = buffer.split('\\n\\n');\n buffer = events.pop() ?? '';\n\n for (const rawEvent of events) {\n const lines = rawEvent.split('\\n');\n let eventType: string | undefined;\n let dataLine: string | undefined;\n\n for (const line of lines) {\n if (line.startsWith('event: ')) {\n eventType = line.slice(7).trim();\n } else if (line.startsWith('data: ')) {\n dataLine = line.slice(6).trim();\n }\n }\n\n if (!dataLine) continue;\n\n if (dataLine === '[DONE]') {\n yield { type: 'done' };\n return;\n }\n\n if (eventType === 'tchavi') {\n try {\n const meta = JSON.parse(dataLine) as TchaviMeta;\n yield { type: 'tchavi', data: meta };\n } catch {\n // Malformed tchavi event — skip\n }\n continue;\n }\n\n try {\n const parsed = JSON.parse(dataLine) as T;\n yield { type: 'data', data: parsed };\n } catch {\n // Non-JSON data line — skip\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\n/**\n * Wraps an SSE ReadableStream as an AsyncIterable<T>.\n * Stores the final Tchavi metadata so it can be accessed after iteration.\n *\n * @example\n * ```ts\n * const stream = await client.chat.completions.create({ ..., stream: true });\n * for await (const chunk of stream) {\n * process.stdout.write(chunk.choices[0]?.delta?.content ?? '');\n * }\n * console.log('Credits used:', stream.finalMeta()?.credits_used);\n * ```\n */\nexport class TchaviStream<T> implements AsyncIterable<T> {\n private body: ReadableStream<Uint8Array>;\n private _tchaviMeta: TchaviMeta | null = null;\n\n constructor(body: ReadableStream<Uint8Array>) {\n this.body = body;\n }\n\n [Symbol.asyncIterator](): AsyncIterator<T> {\n return this._consume();\n }\n\n private async *_consume(): AsyncGenerator<T> {\n try {\n for await (const event of parseStream<T>(this.body)) {\n if (event.type === 'data') {\n yield event.data;\n } else if (event.type === 'tchavi') {\n this._tchaviMeta = event.data;\n }\n }\n } finally {\n // Release stream resources if iteration is abandoned early (e.g. break)\n this.body.cancel().catch(() => {});\n }\n }\n\n /** Returns Tchavi credit metadata once the stream is fully consumed. */\n finalMeta(): TchaviMeta | null {\n return this._tchaviMeta;\n }\n}\n","import type { HttpClient } from '../../core/http-client.js';\nimport { TchaviStream } from '../../core/streaming.js';\nimport { TchaviError } from '../../errors.js';\nimport type {\n ChatCompletionCreateParamsNonStreaming,\n ChatCompletionCreateParamsStreaming,\n ChatCompletionCreateParams,\n ChatCompletion,\n ChatCompletionChunk,\n} from '../../types/chat.js';\n\nexport class Completions {\n constructor(private http: HttpClient) {}\n\n create(params: ChatCompletionCreateParamsNonStreaming): Promise<ChatCompletion>;\n create(params: ChatCompletionCreateParamsStreaming): Promise<TchaviStream<ChatCompletionChunk>>;\n async create(\n params: ChatCompletionCreateParams,\n ): Promise<ChatCompletion | TchaviStream<ChatCompletionChunk>> {\n if (params.stream === true) {\n const response = await this.http.requestRaw({\n method: 'POST',\n path: '/v1/chat/completions',\n body: params,\n timeout: 120_000,\n });\n\n if (!response.body) {\n throw new TchaviError('Streaming response has no body');\n }\n\n return new TchaviStream<ChatCompletionChunk>(response.body);\n }\n\n return this.http.request<ChatCompletion>({\n method: 'POST',\n path: '/v1/chat/completions',\n body: params,\n });\n }\n}\n","import type { HttpClient } from '../../core/http-client.js';\nimport { Completions } from './completions.js';\n\nexport class Chat {\n readonly completions: Completions;\n\n constructor(http: HttpClient) {\n this.completions = new Completions(http);\n }\n}\n","import type { HttpClient } from '../core/http-client.js';\nimport type { EmbeddingCreateParams, EmbeddingsResponse } from '../types/embeddings.js';\n\nexport class Embeddings {\n constructor(private http: HttpClient) {}\n\n create(params: EmbeddingCreateParams): Promise<EmbeddingsResponse> {\n return this.http.request({\n method: 'POST',\n path: '/v1/embeddings',\n body: params,\n });\n }\n}\n","import type { HttpClient } from '../../core/http-client.js';\nimport type { ImageGenerationParams, ImagesResponse } from '../../types/images.js';\n\nexport class Generations {\n constructor(private http: HttpClient) {}\n\n create(params: ImageGenerationParams): Promise<ImagesResponse> {\n return this.http.request({\n method: 'POST',\n path: '/v1/images/generations',\n body: params,\n });\n }\n}\n","import type { HttpClient } from '../../core/http-client.js';\nimport { Generations } from './generations.js';\n\nexport class Images {\n readonly generations: Generations;\n\n constructor(http: HttpClient) {\n this.generations = new Generations(http);\n }\n}\n","import type { HttpClient } from '../core/http-client.js';\nimport type { CreditBalance, CreditPack } from '../types/credits.js';\n\nexport class Credits {\n constructor(private http: HttpClient) {}\n\n getBalance(): Promise<CreditBalance> {\n return this.http.request({ path: '/credits/balance' });\n }\n\n listPacks(): Promise<CreditPack[]> {\n return this.http.request({ path: '/credits/packs', skipAuth: true });\n }\n}\n","import type { HttpClient } from '../core/http-client.js';\nimport type {\n ApiKey,\n ApiKeyWithSecret,\n CreateApiKeyParams,\n UpdateApiKeyParams,\n} from '../types/api-keys.js';\n\nexport class ApiKeys {\n constructor(private http: HttpClient) {}\n\n list(): Promise<ApiKey[]> {\n return this.http.request({ path: '/api-keys' });\n }\n\n create(params: CreateApiKeyParams = {}): Promise<ApiKeyWithSecret> {\n return this.http.request({ method: 'POST', path: '/api-keys', body: params });\n }\n\n retrieve(id: string): Promise<ApiKey> {\n return this.http.request({ path: `/api-keys/${id}` });\n }\n\n update(id: string, params: UpdateApiKeyParams): Promise<ApiKey> {\n return this.http.request({ method: 'PUT', path: `/api-keys/${id}`, body: params });\n }\n\n delete(id: string): Promise<{ message: string }> {\n return this.http.request({ method: 'DELETE', path: `/api-keys/${id}` });\n }\n}\n","import type { HttpClient } from '../core/http-client.js';\nimport type { UsageStats, UsageLog, GetStatsParams, GetHistoryParams } from '../types/usage.js';\nimport type { PaginatedResponse } from '../types/common.js';\n\nexport class Usage {\n constructor(private http: HttpClient) {}\n\n getStats(params: GetStatsParams = {}): Promise<UsageStats> {\n return this.http.request({\n path: '/usage/stats',\n query: params as Record<string, string>,\n });\n }\n\n getHistory(params: GetHistoryParams = {}): Promise<PaginatedResponse<UsageLog>> {\n return this.http.request({\n path: '/usage/history',\n query: params as Record<string, string | number>,\n });\n }\n}\n","import type { HttpClient } from '../core/http-client.js';\nimport type { ModelTierConfig } from '../types/models.js';\n\nexport class Models {\n constructor(private http: HttpClient) {}\n\n /** Lists all active model tiers. Pass `all: true` to include inactive ones (admin only). */\n list(params: { all?: boolean } = {}): Promise<ModelTierConfig[]> {\n return this.http.request({\n path: '/model-tiers',\n query: params.all ? { all: 'true' } : undefined,\n skipAuth: true,\n });\n }\n}\n","import type { HttpClient } from '../core/http-client.js';\nimport type { Payment, InitiatePaymentParams, PaymentInitiateResponse } from '../types/payments.js';\nimport type { PaginatedResponse } from '../types/common.js';\n\nexport class Payments {\n constructor(private http: HttpClient) {}\n\n initiate(params: InitiatePaymentParams): Promise<PaymentInitiateResponse> {\n return this.http.request({ method: 'POST', path: '/payments/initiate', body: params });\n }\n\n getStatus(id: string): Promise<Payment> {\n return this.http.request({ path: `/payments/status/${id}` });\n }\n\n getHistory(params: { page?: number; limit?: number } = {}): Promise<PaginatedResponse<Payment>> {\n return this.http.request({\n path: '/payments/history',\n query: params as Record<string, number>,\n });\n }\n}\n","import type { HttpClient } from '../core/http-client.js';\nimport type { AuthStrategy } from '../core/auth.js';\nimport type { RegisterParams, LoginResponse, User } from '../types/auth.js';\n\nexport class AuthResource {\n constructor(\n private http: HttpClient,\n private authStrategy: AuthStrategy,\n ) {}\n\n async login(email: string, password: string): Promise<LoginResponse> {\n const result = await this.http.request<LoginResponse>({\n method: 'POST',\n path: '/auth/login',\n body: { email, password },\n skipAuth: true,\n });\n this.authStrategy.setAccessToken(result.accessToken);\n return result;\n }\n\n register(params: RegisterParams): Promise<{ message: string; user: User }> {\n return this.http.request({\n method: 'POST',\n path: '/auth/register',\n body: params,\n skipAuth: true,\n });\n }\n\n logout(): Promise<{ message: string }> {\n return this.http.request({ method: 'POST', path: '/auth/logout' });\n }\n}\n","import type { HttpClient } from '../core/http-client.js';\nimport type { User, UpdateUserParams } from '../types/auth.js';\n\nexport class Users {\n constructor(private http: HttpClient) {}\n\n me(): Promise<User> {\n return this.http.request({ path: '/users/me' });\n }\n\n update(params: UpdateUserParams): Promise<User> {\n return this.http.request({ method: 'PUT', path: '/users/me', body: params });\n }\n}\n","import { AuthStrategy } from './core/auth.js';\nimport { HttpClient } from './core/http-client.js';\nimport { Chat } from './resources/chat/index.js';\nimport { Embeddings } from './resources/embeddings.js';\nimport { Images } from './resources/images/index.js';\nimport { Credits } from './resources/credits.js';\nimport { ApiKeys } from './resources/api-keys.js';\nimport { Usage } from './resources/usage.js';\nimport { Models } from './resources/models.js';\nimport { Payments } from './resources/payments.js';\nimport { AuthResource } from './resources/auth-resource.js';\nimport { Users } from './resources/users.js';\nimport type { TchaviClientOptions } from './types/common.js';\n\nconst DEFAULT_BASE_URL = 'http://localhost:3001';\nconst DEFAULT_MAX_RETRIES = 2;\nconst DEFAULT_TIMEOUT = 60_000;\n\n/**\n * Main Tchavi client. Mirrors the OpenAI SDK's resource-based API.\n *\n * @example API key mode (proxy endpoints):\n * ```ts\n * import Tchavi from '@tchavi/sdk';\n *\n * const client = new Tchavi({ apiKey: 'sk-tch-...' });\n *\n * const completion = await client.chat.completions.create({\n * model: 'gpt-4o-mini',\n * messages: [{ role: 'user', content: 'Hello' }],\n * });\n * console.log(completion.choices[0].message.content);\n * console.log(completion.tchavi.credits_used);\n * ```\n *\n * @example JWT mode (account management):\n * ```ts\n * const client = new Tchavi({ email: 'me@example.com', password: 'S3cret!' });\n * const balance = await client.credits.getBalance();\n * const keys = await client.apiKeys.list();\n * ```\n *\n * @example Streaming:\n * ```ts\n * const stream = await client.chat.completions.create({\n * model: 'gpt-4o',\n * messages: [{ role: 'user', content: 'Tell me a story' }],\n * stream: true,\n * });\n * for await (const chunk of stream) {\n * process.stdout.write(chunk.choices[0]?.delta?.content ?? '');\n * }\n * console.log('\\nCredits used:', stream.finalMeta()?.credits_used);\n * ```\n */\nexport class Tchavi {\n readonly chat: Chat;\n readonly embeddings: Embeddings;\n readonly images: Images;\n readonly credits: Credits;\n readonly apiKeys: ApiKeys;\n readonly usage: Usage;\n readonly models: Models;\n readonly payments: Payments;\n readonly auth: AuthResource;\n readonly users: Users;\n\n constructor(options: TchaviClientOptions) {\n const baseURL = options.baseURL ?? DEFAULT_BASE_URL;\n const maxRetries = options.maxRetries ?? DEFAULT_MAX_RETRIES;\n const timeout = options.timeout ?? DEFAULT_TIMEOUT;\n\n const authStrategy = new AuthStrategy(options);\n const http = new HttpClient(authStrategy, baseURL, maxRetries, timeout);\n\n this.chat = new Chat(http);\n this.embeddings = new Embeddings(http);\n this.images = new Images(http);\n this.credits = new Credits(http);\n this.apiKeys = new ApiKeys(http);\n this.usage = new Usage(http);\n this.models = new Models(http);\n this.payments = new Payments(http);\n this.auth = new AuthResource(http, authStrategy);\n this.users = new Users(http);\n }\n}\n","import { Tchavi } from './tchavi.js';\nexport default Tchavi;\nexport { Tchavi };\nexport { TchaviStream } from './core/streaming.js';\n\nexport {\n TchaviError,\n TchaviAPIError,\n TchaviAuthenticationError,\n TchaviRateLimitError,\n TchaviInsufficientCreditsError,\n} from './errors.js';\n\nexport type * from './types/index.js';\n"]}
|