@maroonedsoftware/rhapsode-sdk 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Marooned Software
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,5 @@
1
+ export * from './public/public.client.js';
2
+ export * from './rhapsode.sdk.js';
3
+ export * from './rhapsode/types/index.js';
4
+ export * from './sdk-options.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/generated/index.ts"],"names":[],"mappings":"AACA,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,kBAAkB,CAAC"}
@@ -0,0 +1,197 @@
1
+ import type { SdkFetch } from '../sdk-options.js';
2
+ import type { Capabilities, CatalogEntry, CoreHealth, EngineSpeakRequest, EngineSummary, ErrorBody, InstallJob, PullRequest, Voice } from '../rhapsode/types/rhapsode.types.js';
3
+ export declare class PublicClient {
4
+ private fetch;
5
+ constructor(fetch: SdkFetch);
6
+ /** @description The core's own. It answers while every worker is down and never blocks on one, because a */
7
+ health(): Promise<CoreHealth>;
8
+ /** @description Every declared engine, whether or not it is running. Never spawns one: this is the list an */
9
+ engines(): Promise<EngineSummary[]>;
10
+ engineCapabilities(engine: string): Promise<{
11
+ status: 200;
12
+ contentType: 'application/json';
13
+ data: Capabilities;
14
+ } | {
15
+ status: 404;
16
+ contentType: 'application/json';
17
+ data: ErrorBody;
18
+ } | {
19
+ status: 503;
20
+ contentType: 'application/json';
21
+ data: ErrorBody;
22
+ }>;
23
+ engineVoices(engine: string): Promise<{
24
+ status: 200;
25
+ contentType: 'application/json';
26
+ data: Voice[];
27
+ } | {
28
+ status: 404;
29
+ contentType: 'application/json';
30
+ data: ErrorBody;
31
+ }>;
32
+ /** @description Management, like § 10: it writes a file on the box. Streamed to the worker, capped at 25 MB. */
33
+ createVoice(engine: string, body: FormData): Promise<{
34
+ status: 201;
35
+ contentType: 'application/json';
36
+ data: Voice;
37
+ } | {
38
+ status: 400;
39
+ contentType: 'application/json';
40
+ data: ErrorBody;
41
+ } | {
42
+ status: 403;
43
+ contentType: 'application/json';
44
+ data: ErrorBody;
45
+ } | {
46
+ status: 404;
47
+ contentType: 'application/json';
48
+ data: ErrorBody;
49
+ } | {
50
+ status: 422;
51
+ contentType: 'application/json';
52
+ data: ErrorBody;
53
+ }>;
54
+ deleteVoice(engine: string, voice: string): Promise<{
55
+ status: 204;
56
+ } | {
57
+ status: 400;
58
+ contentType: 'application/json';
59
+ data: ErrorBody;
60
+ } | {
61
+ status: 403;
62
+ contentType: 'application/json';
63
+ data: ErrorBody;
64
+ } | {
65
+ status: 404;
66
+ contentType: 'application/json';
67
+ data: ErrorBody;
68
+ } | {
69
+ status: 422;
70
+ contentType: 'application/json';
71
+ data: ErrorBody;
72
+ }>;
73
+ voicePreview(engine: string, voice: string): Promise<{
74
+ status: 200;
75
+ contentType: 'audio/wav';
76
+ data: Blob;
77
+ } | {
78
+ status: 404;
79
+ contentType: 'application/json';
80
+ data: ErrorBody;
81
+ }>;
82
+ /** @description The one endpoint that matters. Cues the effective variant does not claim are stripped */
83
+ speak(body: EngineSpeakRequest): Promise<{
84
+ status: 200;
85
+ contentType: 'audio/wav' | 'audio/mpeg' | 'audio/opus' | 'audio/flac' | 'audio/l16';
86
+ data: Blob;
87
+ } | {
88
+ status: 400;
89
+ contentType: 'application/json';
90
+ data: ErrorBody;
91
+ } | {
92
+ status: 404;
93
+ contentType: 'application/json';
94
+ data: ErrorBody;
95
+ } | {
96
+ status: 422;
97
+ contentType: 'application/json';
98
+ data: ErrorBody;
99
+ } | {
100
+ status: 429;
101
+ contentType: 'application/json';
102
+ data: ErrorBody;
103
+ } | {
104
+ status: 503;
105
+ contentType: 'application/json';
106
+ data: ErrorBody;
107
+ }>;
108
+ /** @description Open to every caller: it only reads, and its licences are what § 4 promises before install. */
109
+ catalog(): Promise<CatalogEntry[]>;
110
+ /** @description Only an engine this API installed. One the operator configured is theirs to remove. */
111
+ uninstallEngine(engine: string): Promise<{
112
+ status: 204;
113
+ } | {
114
+ status: 403;
115
+ contentType: 'application/json';
116
+ data: ErrorBody;
117
+ } | {
118
+ status: 404;
119
+ contentType: 'application/json';
120
+ data: ErrorBody;
121
+ } | {
122
+ status: 409;
123
+ contentType: 'application/json';
124
+ data: ErrorBody;
125
+ }>;
126
+ installEngine(engine: string): Promise<{
127
+ status: 202;
128
+ contentType: 'application/json';
129
+ data: InstallJob;
130
+ } | {
131
+ status: 403;
132
+ contentType: 'application/json';
133
+ data: ErrorBody;
134
+ } | {
135
+ status: 404;
136
+ contentType: 'application/json';
137
+ data: ErrorBody;
138
+ } | {
139
+ status: 409;
140
+ contentType: 'application/json';
141
+ data: ErrorBody;
142
+ }>;
143
+ pullEngine(engine: string, body: PullRequest): Promise<{
144
+ status: 202;
145
+ contentType: 'application/json';
146
+ data: InstallJob;
147
+ } | {
148
+ status: 403;
149
+ contentType: 'application/json';
150
+ data: ErrorBody;
151
+ } | {
152
+ status: 404;
153
+ contentType: 'application/json';
154
+ data: ErrorBody;
155
+ } | {
156
+ status: 409;
157
+ contentType: 'application/json';
158
+ data: ErrorBody;
159
+ }>;
160
+ installJobs(): Promise<{
161
+ status: 200;
162
+ contentType: 'application/json';
163
+ data: InstallJob[];
164
+ } | {
165
+ status: 403;
166
+ contentType: 'application/json';
167
+ data: ErrorBody;
168
+ }>;
169
+ installJob(job: string): Promise<{
170
+ status: 200;
171
+ contentType: 'application/json';
172
+ data: InstallJob;
173
+ } | {
174
+ status: 403;
175
+ contentType: 'application/json';
176
+ data: ErrorBody;
177
+ } | {
178
+ status: 404;
179
+ contentType: 'application/json';
180
+ data: ErrorBody;
181
+ }>;
182
+ /** @description Server-sent events, each frame's data a FeedEvent. Hand-written, like /speak: ContractKit */
183
+ installJobEvents(job: string): Promise<{
184
+ status: 200;
185
+ contentType: 'text/event-stream';
186
+ data: string;
187
+ } | {
188
+ status: 403;
189
+ contentType: 'application/json';
190
+ data: ErrorBody;
191
+ } | {
192
+ status: 404;
193
+ contentType: 'application/json';
194
+ data: ErrorBody;
195
+ }>;
196
+ }
197
+ //# sourceMappingURL=public.client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public.client.d.ts","sourceRoot":"","sources":["../../../src/generated/public/public.client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export * from './rhapsode.types.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/generated/rhapsode/types/index.ts"],"names":[],"mappings":"AACA,cAAc,qBAAqB,CAAC"}
@@ -0,0 +1,304 @@
1
+ import type { JsonValue } from '../../sdk-options.js';
2
+ /**
3
+ * generated from [Dial](../../../../../../contracts/rhapsode.types.ck#L15)
4
+ */
5
+ export interface Dial {
6
+ /** Inclusive. */
7
+ min: number;
8
+ /** Inclusive. */
9
+ max: number;
10
+ /** What the engine uses when the request says nothing. */
11
+ default: number;
12
+ }
13
+ /**
14
+ * generated from [Cloning](../../../../../../contracts/rhapsode.types.ck#L32)
15
+ */
16
+ export interface Cloning {
17
+ supported: boolean;
18
+ /** [min, max] of usable reference audio. */
19
+ referenceSeconds?: number[];
20
+ formats?: string[];
21
+ }
22
+ /**
23
+ * generated from [Streaming](../../../../../../contracts/rhapsode.types.ck#L38)
24
+ */
25
+ export interface Streaming {
26
+ supported: boolean;
27
+ granularity?: 'chunk' | 'sentence';
28
+ }
29
+ /**
30
+ * generated from [NativeFormat](../../../../../../contracts/rhapsode.types.ck#L43)
31
+ */
32
+ export interface NativeFormat {
33
+ /** v1 accepts pcm_s16le and nothing else. */
34
+ encoding: string;
35
+ sampleRate: number;
36
+ channels: number;
37
+ }
38
+ /**
39
+ * generated from [EngineIdentity](../../../../../../contracts/rhapsode.types.ck#L59)
40
+ */
41
+ export interface EngineIdentity {
42
+ id: string;
43
+ displayName: string;
44
+ adapterVersion: string;
45
+ upstreamVersion?: string;
46
+ }
47
+ /**
48
+ * Code and weights separately, because the weights licence is the one package metadata never reveals
49
+ * and the one that decides whether a commercial user may ship. A scanner reads the package, reports
50
+ * the code licence, and is wrong in the way that matters.
51
+ * generated from [License](../../../../../../contracts/rhapsode.types.ck#L69)
52
+ */
53
+ export interface License {
54
+ code: string;
55
+ weights: string;
56
+ weightsCommercialUse: boolean;
57
+ notes?: string;
58
+ }
59
+ /**
60
+ * generated from [Device](../../../../../../contracts/rhapsode.types.ck#L76)
61
+ */
62
+ export interface Device {
63
+ type: 'cuda' | 'rocm' | 'mps' | 'cpu';
64
+ name: string;
65
+ vramBytes?: number;
66
+ }
67
+ /**
68
+ * generated from [Voice](../../../../../../contracts/rhapsode.types.ck#L96)
69
+ */
70
+ export interface Voice {
71
+ id: string;
72
+ label: string;
73
+ description?: string;
74
+ /** Opaque. Changes whenever the rendering would. Never parse it. */
75
+ spec: string;
76
+ tags?: string[];
77
+ /** Worker-scoped; the core rewrites it on the way out. */
78
+ previewUrl?: string;
79
+ }
80
+ /**
81
+ * generated from [CreateVoiceForm](../../../../../../contracts/rhapsode.types.ck#L105)
82
+ */
83
+ export interface CreateVoiceForm {
84
+ id: string;
85
+ label?: string;
86
+ reference: Blob;
87
+ }
88
+ /**
89
+ * generated from [SpeakRequest](../../../../../../contracts/rhapsode.types.ck#L115)
90
+ */
91
+ export interface SpeakRequest {
92
+ text: string;
93
+ voice?: string;
94
+ /** Absent means whatever is loaded. */
95
+ variant?: string;
96
+ format?: 'wav' | 'mp3' | 'opus' | 'flac' | 'pcm';
97
+ /** From the effective variant's `languages`. */
98
+ language?: string;
99
+ /** Closed, and deliberately has no word for "ordinary". */
100
+ delivery?: 'hushed' | 'frantic';
101
+ /** Validated against the effective variant's dials. */
102
+ params?: Record<string, number>;
103
+ seed?: number;
104
+ stream?: boolean;
105
+ }
106
+ /**
107
+ * generated from [LoadRequest](../../../../../../contracts/rhapsode.types.ck#L131)
108
+ */
109
+ export interface LoadRequest {
110
+ variant?: string;
111
+ }
112
+ /**
113
+ * Required, unlike a load's: there is no "whatever is loaded" to fall back on for weights that are
114
+ * not loaded yet. protocol.md § 8.
115
+ * generated from [FetchRequest](../../../../../../contracts/rhapsode.types.ck#L137)
116
+ */
117
+ export interface FetchRequest {
118
+ variant: string;
119
+ }
120
+ /**
121
+ * `retryable` is a field rather than something the client infers from the status, because the
122
+ * distinction that matters is between "this request was wrong" and "this request was fine and the
123
+ * server was not". A caller that conflates them either retries a permanent failure forever or
124
+ * discards work that would have succeeded on the next pass.
125
+ * generated from [ErrorDetail](../../../../../../contracts/rhapsode.types.ck#L149)
126
+ */
127
+ export interface ErrorDetail {
128
+ /**
129
+ * A closed set that § 9 grows at the end. A reader that meets a code from a newer contract must
130
+ * not lose the envelope over it: `message` and `retryable` are the two fields that decide what
131
+ * the caller does next, and they parse fine. The core falls back to `internal` for the code and
132
+ * keeps the rest, rather than reporting a parse failure in place of the real error.
133
+ */
134
+ code: 'bad_request' | 'unknown_engine' | 'unknown_voice' | 'unsupported' | 'model_unavailable' | 'oom' | 'overloaded' | 'internal' | 'forbidden' | 'conflict';
135
+ message: string;
136
+ retryable: boolean;
137
+ }
138
+ /**
139
+ * generated from [WorkerHealth](../../../../../../contracts/rhapsode.types.ck#L167)
140
+ */
141
+ export interface WorkerHealth {
142
+ process: 'up' | 'draining';
143
+ model: 'unloaded' | 'loading' | 'loaded' | 'unloading';
144
+ variant?: string;
145
+ device?: string;
146
+ vramBytes?: number;
147
+ }
148
+ /**
149
+ * generated from [ResidencySummary](../../../../../../contracts/rhapsode.types.ck#L186)
150
+ */
151
+ export interface ResidencySummary {
152
+ resident: number;
153
+ max: number;
154
+ waiting: number;
155
+ /** Named, because a wait at maxResidentModels 1 looks exactly like a hang. */
156
+ blockedBy?: string;
157
+ }
158
+ /**
159
+ * generated from [PullRequest](../../../../../../contracts/rhapsode.types.ck#L229)
160
+ */
161
+ export interface PullRequest {
162
+ /** Absent means the engine's default variant. */
163
+ variant?: string;
164
+ }
165
+ /**
166
+ * One event on a job's stream, `GET /installs/{job}/events`. The shape is ServerKit's server feed,
167
+ * declared here so a client can parse it without depending on ServerKit.
168
+ * generated from [FeedProgress](../../../../../../contracts/rhapsode.types.ck#L235)
169
+ */
170
+ export interface FeedProgress {
171
+ /** The job's step. */
172
+ phase: string;
173
+ index: number;
174
+ total: number;
175
+ status: 'running' | 'done' | 'failed';
176
+ }
177
+ /**
178
+ * What one build of an engine can perform. Capabilities depend on which build is loaded, which is
179
+ * the whole reason this document has two levels: chatterbox `turbo` performs the paralinguistic
180
+ * tags and discards the dials, while `original` is the other way round.
181
+ * generated from [Variant](../../../../../../contracts/rhapsode.types.ck#L24)
182
+ */
183
+ export interface Variant {
184
+ /** A subset of the standard vocabulary, § 5. */
185
+ cues: string[];
186
+ /** Ditto. Not an enum: § 9 forbids failing on an unknown one. */
187
+ deliveries: string[];
188
+ /** Engine-specific numbers, named by the adapter. */
189
+ dials: Record<string, Dial>;
190
+ languages?: string[];
191
+ /** Overrides the engine's own ceiling for this build. */
192
+ maxCharacters?: number;
193
+ }
194
+ /**
195
+ * generated from [EngineSummary](../../../../../../contracts/rhapsode.types.ck#L175)
196
+ */
197
+ export interface EngineSummary {
198
+ id: string;
199
+ displayName: string;
200
+ license: License;
201
+ process: 'down' | 'starting' | 'up' | 'draining' | 'failed';
202
+ model: 'unloaded' | 'loading' | 'loaded' | 'unloading';
203
+ variant?: string;
204
+ lastError?: string;
205
+ restarts: number;
206
+ }
207
+ /**
208
+ * What exists, installed or not. `/engines` is what this box has; this is what it could have, with
209
+ * both licences, because the weights licence is only worth reading before the install.
210
+ * generated from [CatalogEntry](../../../../../../contracts/rhapsode.types.ck#L206)
211
+ */
212
+ export interface CatalogEntry {
213
+ id: string;
214
+ displayName: string;
215
+ license: License;
216
+ /** The Python distribution the installer installs. */
217
+ package: string;
218
+ defaultVariant?: string;
219
+ installed: 'no' | 'installing' | 'yes';
220
+ /** Installed through the API, so removable by it. */
221
+ managed: boolean;
222
+ }
223
+ /**
224
+ * generated from [EngineSpeakRequest](../../../../../../contracts/rhapsode.types.ck#L127)
225
+ */
226
+ export interface EngineSpeakRequest extends SpeakRequest {
227
+ engine: string;
228
+ }
229
+ /**
230
+ * generated from [ErrorBody](../../../../../../contracts/rhapsode.types.ck#L159)
231
+ */
232
+ export interface ErrorBody {
233
+ error: ErrorDetail;
234
+ }
235
+ /**
236
+ * generated from [InstallJob](../../../../../../contracts/rhapsode.types.ck#L216)
237
+ */
238
+ export interface InstallJob {
239
+ id: string;
240
+ engine: string;
241
+ kind: 'install' | 'pull';
242
+ /** For a pull: the variant being fetched. */
243
+ variant?: string;
244
+ state: 'queued' | 'running' | 'succeeded' | 'failed';
245
+ step?: 'venv' | 'packages' | 'verify' | 'register' | 'weights';
246
+ /** ISO 8601, UTC. */
247
+ createdAt: string;
248
+ startedAt?: string;
249
+ finishedAt?: string;
250
+ /** Present exactly when `state` is `failed`. */
251
+ error?: ErrorDetail;
252
+ }
253
+ /**
254
+ * generated from [FeedEvent](../../../../../../contracts/rhapsode.types.ck#L242)
255
+ */
256
+ export interface FeedEvent {
257
+ /** The Last-Event-ID resume key. */
258
+ id: number;
259
+ ts: string;
260
+ source: string;
261
+ level: 'debug' | 'info' | 'warn' | 'error';
262
+ kind: 'progress' | 'status' | 'log' | 'error' | 'heartbeat';
263
+ message?: string;
264
+ /** The job id. */
265
+ correlationId?: string;
266
+ progress?: FeedProgress;
267
+ data?: JsonValue;
268
+ }
269
+ /**
270
+ * The resident build, and everything true only while it is resident. Absent from the capability
271
+ * document entirely when nothing is loaded, because a worker in up(unloaded) has nothing to
272
+ * describe and an invented answer is worse than no answer.
273
+ * generated from [CurrentVariant](../../../../../../contracts/rhapsode.types.ck#L52)
274
+ */
275
+ export interface CurrentVariant extends Variant {
276
+ variant: string;
277
+ cloning: Cloning;
278
+ streaming: Streaming;
279
+ nativeFormat: NativeFormat;
280
+ }
281
+ /**
282
+ * generated from [CoreHealth](../../../../../../contracts/rhapsode.types.ck#L193)
283
+ */
284
+ export interface CoreHealth {
285
+ contract: number;
286
+ status: 'ok' | 'degraded';
287
+ engines: EngineSummary[];
288
+ residency: ResidencySummary;
289
+ }
290
+ /**
291
+ * generated from [Capabilities](../../../../../../contracts/rhapsode.types.ck#L82)
292
+ */
293
+ export interface Capabilities {
294
+ /** The contract major this worker settled on. § 9. */
295
+ contract: number;
296
+ engine: EngineIdentity;
297
+ license: License;
298
+ device: Device;
299
+ current?: CurrentVariant;
300
+ variants: Record<string, Variant>;
301
+ /** What this worker can actually encode, here and now. */
302
+ formats: string[];
303
+ }
304
+ //# sourceMappingURL=rhapsode.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rhapsode.types.d.ts","sourceRoot":"","sources":["../../../../src/generated/rhapsode/types/rhapsode.types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { SdkOptions } from './sdk-options.js';
2
+ import { PublicClient } from './public/public.client.js';
3
+ export declare class RhapsodeSdk {
4
+ readonly public: PublicClient;
5
+ constructor(options: SdkOptions);
6
+ }
7
+ //# sourceMappingURL=rhapsode.sdk.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rhapsode.sdk.d.ts","sourceRoot":"","sources":["../../src/generated/rhapsode.sdk.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD,qBAAa,WAAW;IACpB,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;gBAElB,OAAO,EAAE,UAAU;CAIlC"}
@@ -0,0 +1,45 @@
1
+ export declare class SdkError<TBody = unknown> extends Error {
2
+ readonly status: number;
3
+ readonly statusText: string;
4
+ readonly body: TBody;
5
+ readonly headers: Headers;
6
+ constructor(status: number, statusText: string, body: TBody, headers: Headers);
7
+ }
8
+ export interface SdkRequestInit extends RequestInit {
9
+ /**
10
+ * Statuses this operation declares as values rather than errors — a 304 from
11
+ * conditional-GET middleware, or an error status the service returns deliberately.
12
+ * Anything else at or above 400 still throws SdkError.
13
+ */
14
+ expectStatuses?: number[];
15
+ }
16
+ export type SdkFetch = (url: string, init: SdkRequestInit) => Promise<Response>;
17
+ export interface SdkOptions {
18
+ baseUrl: string;
19
+ headers?: Record<string, string> | (() => Record<string, string> | Promise<Record<string, string>>);
20
+ fetch?: SdkFetch;
21
+ /** Called once per request to produce a unique X-Request-ID header value */
22
+ requestIdFactory?: () => string;
23
+ }
24
+ export declare const bigIntReplacer: (_: string, value: any) => any;
25
+ export declare const bigIntReviver: (_: string, value: any) => any;
26
+ export type JsonValue = string | number | boolean | null | JsonValue[] | {
27
+ [key: string]: JsonValue;
28
+ };
29
+ export declare function readContentType(res: Response): string;
30
+ export declare function createSdkFetch(options: SdkOptions): SdkFetch;
31
+ export declare function buildQueryString(query: object | undefined): string;
32
+ export declare function buildHeaders(headers: object | undefined): Record<string, string>;
33
+ export declare function parseBigIntHeader(name: string, value: string): bigint;
34
+ /**
35
+ * Read a JSON response body.
36
+ *
37
+ * No reviver: `bigIntReviver` matches any string of the form `123n` anywhere in the
38
+ * document, so a contract with no bigint field would still have a legitimate string like
39
+ * "123n" silently turned into a BigInt. Clients whose contracts do use bigint import
40
+ * `parseJsonWithBigInt` under this name instead.
41
+ */
42
+ export declare function parseJson<T>(res: Response): Promise<T>;
43
+ /** `parseJson` for contracts that declare a bigint, applying the `123n` reviver. */
44
+ export declare function parseJsonWithBigInt<T>(res: Response): Promise<T>;
45
+ //# sourceMappingURL=sdk-options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdk-options.d.ts","sourceRoot":"","sources":["../../src/generated/sdk-options.ts"],"names":[],"mappings":"AAAA,qBAAa,QAAQ,CAAC,KAAK,GAAG,OAAO,CAAE,SAAQ,KAAK;aAE5B,MAAM,EAAE,MAAM;aACd,UAAU,EAAE,MAAM;aAClB,IAAI,EAAE,KAAK;aACX,OAAO,EAAE,OAAO;gBAHhB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,KAAK,EACX,OAAO,EAAE,OAAO;CAKvC;AAED,MAAM,WAAW,cAAe,SAAQ,WAAW;IAC/C;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC7B;AAED,MAAM,MAAM,QAAQ,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;AAEhF,MAAM,WAAW,UAAU;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IACpG,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,4EAA4E;IAC5E,gBAAgB,CAAC,EAAE,MAAM,MAAM,CAAC;CACnC;AAED,eAAO,MAAM,cAAc,GAAI,GAAG,MAAM,EAAE,OAAO,GAAG,KAAG,GAKtD,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,GAAG,MAAM,EAAE,OAAO,GAAG,KAAG,GAKrD,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,EAAE,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AAEtG,wBAAgB,eAAe,CAAC,GAAG,EAAE,QAAQ,GAAG,MAAM,CAErD;AAYD,wBAAgB,cAAc,CAAC,OAAO,EAAE,UAAU,GAAG,QAAQ,CAoB5D;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAYlE;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAShF;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAGrE;AAED;;;;;;;GAOG;AACH,wBAAsB,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,CAE5D;AAED,oFAAoF;AACpF,wBAAsB,mBAAmB,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,CAEtE"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * A typed client for the rhapsode public API.
3
+ *
4
+ * Everything under `generated/` is written by `pnpm codegen` from `contracts/rhapsode.public.ck`
5
+ * and committed, so a client of this package never runs a generator. It depends on nothing, because
6
+ * it is what a browser app or another service adopts to talk to a rhapsode, and anything it pulled
7
+ * in would come along.
8
+ *
9
+ * One operation it cannot serve is `installJobEvents`: the generated method reads the whole body,
10
+ * and a job's event stream does not end on its own. Read it with an `EventSource` on
11
+ * `/installs/{job}/events` instead. protocol.md § 10.
12
+ */
13
+ export * from './generated/index.js';
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,cAAc,sBAAsB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,571 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
+
4
+ // src/generated/sdk-options.ts
5
+ var SdkError = class extends Error {
6
+ static {
7
+ __name(this, "SdkError");
8
+ }
9
+ status;
10
+ statusText;
11
+ body;
12
+ headers;
13
+ constructor(status, statusText, body, headers) {
14
+ super(`${status} ${statusText}`), this.status = status, this.statusText = statusText, this.body = body, this.headers = headers;
15
+ this.name = "SdkError";
16
+ }
17
+ };
18
+ var bigIntReplacer = /* @__PURE__ */ __name((_, value) => {
19
+ if (typeof value === "bigint") {
20
+ return value.toString() + "n";
21
+ }
22
+ return value;
23
+ }, "bigIntReplacer");
24
+ var bigIntReviver = /* @__PURE__ */ __name((_, value) => {
25
+ if (typeof value === "string" && /^-?\d+n$/.test(value)) {
26
+ return BigInt(value.slice(0, -1));
27
+ }
28
+ return value;
29
+ }, "bigIntReviver");
30
+ function readContentType(res) {
31
+ return res.headers.get("content-type")?.split(";")[0]?.trim() ?? "";
32
+ }
33
+ __name(readContentType, "readContentType");
34
+ function randomRequestId() {
35
+ if (typeof crypto.randomUUID === "function") return crypto.randomUUID();
36
+ const bytes = crypto.getRandomValues(new Uint8Array(16));
37
+ bytes[6] = bytes[6] & 15 | 64;
38
+ bytes[8] = bytes[8] & 63 | 128;
39
+ const hex = Array.from(bytes, (b) => b.toString(16).padStart(2, "0")).join("");
40
+ return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;
41
+ }
42
+ __name(randomRequestId, "randomRequestId");
43
+ function createSdkFetch(options) {
44
+ const getRequestId = options.requestIdFactory ?? randomRequestId;
45
+ return async (url, init) => {
46
+ const baseHeaders = typeof options.headers === "function" ? await options.headers() : options.headers ?? {};
47
+ const res = await fetch(`${options.baseUrl}${url}`, {
48
+ ...init,
49
+ headers: {
50
+ ...baseHeaders,
51
+ "X-Request-ID": getRequestId(),
52
+ ...init.headers
53
+ }
54
+ });
55
+ if (!res.ok && !(init.expectStatuses ?? []).includes(res.status)) {
56
+ const text = await res.text();
57
+ let body;
58
+ try {
59
+ body = JSON.parse(text);
60
+ } catch {
61
+ body = text;
62
+ }
63
+ throw new SdkError(res.status, res.statusText, body, res.headers);
64
+ }
65
+ return res;
66
+ };
67
+ }
68
+ __name(createSdkFetch, "createSdkFetch");
69
+ function buildQueryString(query) {
70
+ const searchParams = new URLSearchParams();
71
+ if (query) {
72
+ for (const [k, v] of Object.entries(query)) {
73
+ if (v === void 0 || v === null) continue;
74
+ if (Array.isArray(v)) {
75
+ for (const item of v) searchParams.append(k, String(item));
76
+ } else searchParams.set(k, String(v));
77
+ }
78
+ }
79
+ const qs = searchParams.toString();
80
+ return qs ? `?${qs}` : "";
81
+ }
82
+ __name(buildQueryString, "buildQueryString");
83
+ function buildHeaders(headers) {
84
+ const out = {};
85
+ if (headers) {
86
+ for (const [k, v] of Object.entries(headers)) {
87
+ if (v === void 0 || v === null) continue;
88
+ out[k] = Array.isArray(v) ? v.map(String).join(", ") : String(v);
89
+ }
90
+ }
91
+ return out;
92
+ }
93
+ __name(buildHeaders, "buildHeaders");
94
+ function parseBigIntHeader(name, value) {
95
+ if (/^-?\d+n?$/.test(value)) return BigInt(value.replace(/n$/, ""));
96
+ throw new Error(`Response header '${name}' is not a bigint: ${JSON.stringify(value)}`);
97
+ }
98
+ __name(parseBigIntHeader, "parseBigIntHeader");
99
+ async function parseJson(res) {
100
+ return JSON.parse(await res.text());
101
+ }
102
+ __name(parseJson, "parseJson");
103
+ async function parseJsonWithBigInt(res) {
104
+ return JSON.parse(await res.text(), bigIntReviver);
105
+ }
106
+ __name(parseJsonWithBigInt, "parseJsonWithBigInt");
107
+
108
+ // src/generated/public/public.client.ts
109
+ var PublicClient = class {
110
+ static {
111
+ __name(this, "PublicClient");
112
+ }
113
+ fetch;
114
+ constructor(fetch2) {
115
+ this.fetch = fetch2;
116
+ }
117
+ /** @description The core's own. It answers while every worker is down and never blocks on one, because a */
118
+ async health() {
119
+ const result = await this.fetch(`/health`, {
120
+ method: "GET"
121
+ });
122
+ return await parseJson(result);
123
+ }
124
+ /** @description Every declared engine, whether or not it is running. Never spawns one: this is the list an */
125
+ async engines() {
126
+ const result = await this.fetch(`/engines`, {
127
+ method: "GET"
128
+ });
129
+ return await parseJson(result);
130
+ }
131
+ async engineCapabilities(engine) {
132
+ const result = await this.fetch(`/engines/${encodeURIComponent(engine)}/capabilities`, {
133
+ method: "GET",
134
+ expectStatuses: [
135
+ 404,
136
+ 503
137
+ ]
138
+ });
139
+ switch (result.status) {
140
+ case 404:
141
+ return {
142
+ status: 404,
143
+ contentType: "application/json",
144
+ data: await parseJson(result)
145
+ };
146
+ case 503:
147
+ return {
148
+ status: 503,
149
+ contentType: "application/json",
150
+ data: await parseJson(result)
151
+ };
152
+ default:
153
+ return {
154
+ status: 200,
155
+ contentType: "application/json",
156
+ data: await parseJson(result)
157
+ };
158
+ }
159
+ }
160
+ async engineVoices(engine) {
161
+ const result = await this.fetch(`/engines/${encodeURIComponent(engine)}/voices`, {
162
+ method: "GET",
163
+ expectStatuses: [
164
+ 404
165
+ ]
166
+ });
167
+ switch (result.status) {
168
+ case 404:
169
+ return {
170
+ status: 404,
171
+ contentType: "application/json",
172
+ data: await parseJson(result)
173
+ };
174
+ default:
175
+ return {
176
+ status: 200,
177
+ contentType: "application/json",
178
+ data: await parseJson(result)
179
+ };
180
+ }
181
+ }
182
+ /** @description Management, like § 10: it writes a file on the box. Streamed to the worker, capped at 25 MB. */
183
+ async createVoice(engine, body) {
184
+ const result = await this.fetch(`/engines/${encodeURIComponent(engine)}/voices`, {
185
+ method: "POST",
186
+ body,
187
+ expectStatuses: [
188
+ 400,
189
+ 403,
190
+ 404,
191
+ 422
192
+ ]
193
+ });
194
+ switch (result.status) {
195
+ case 400:
196
+ return {
197
+ status: 400,
198
+ contentType: "application/json",
199
+ data: await parseJson(result)
200
+ };
201
+ case 403:
202
+ return {
203
+ status: 403,
204
+ contentType: "application/json",
205
+ data: await parseJson(result)
206
+ };
207
+ case 404:
208
+ return {
209
+ status: 404,
210
+ contentType: "application/json",
211
+ data: await parseJson(result)
212
+ };
213
+ case 422:
214
+ return {
215
+ status: 422,
216
+ contentType: "application/json",
217
+ data: await parseJson(result)
218
+ };
219
+ default:
220
+ return {
221
+ status: 201,
222
+ contentType: "application/json",
223
+ data: await parseJson(result)
224
+ };
225
+ }
226
+ }
227
+ async deleteVoice(engine, voice) {
228
+ const result = await this.fetch(`/engines/${encodeURIComponent(engine)}/voices/${encodeURIComponent(voice)}`, {
229
+ method: "DELETE",
230
+ expectStatuses: [
231
+ 400,
232
+ 403,
233
+ 404,
234
+ 422
235
+ ]
236
+ });
237
+ switch (result.status) {
238
+ case 400:
239
+ return {
240
+ status: 400,
241
+ contentType: "application/json",
242
+ data: await parseJson(result)
243
+ };
244
+ case 403:
245
+ return {
246
+ status: 403,
247
+ contentType: "application/json",
248
+ data: await parseJson(result)
249
+ };
250
+ case 404:
251
+ return {
252
+ status: 404,
253
+ contentType: "application/json",
254
+ data: await parseJson(result)
255
+ };
256
+ case 422:
257
+ return {
258
+ status: 422,
259
+ contentType: "application/json",
260
+ data: await parseJson(result)
261
+ };
262
+ default:
263
+ return {
264
+ status: 204
265
+ };
266
+ }
267
+ }
268
+ async voicePreview(engine, voice) {
269
+ const result = await this.fetch(`/engines/${encodeURIComponent(engine)}/voices/${encodeURIComponent(voice)}/preview`, {
270
+ method: "GET",
271
+ expectStatuses: [
272
+ 404
273
+ ]
274
+ });
275
+ switch (result.status) {
276
+ case 404:
277
+ return {
278
+ status: 404,
279
+ contentType: "application/json",
280
+ data: await parseJson(result)
281
+ };
282
+ default:
283
+ return {
284
+ status: 200,
285
+ contentType: "audio/wav",
286
+ data: await result.blob()
287
+ };
288
+ }
289
+ }
290
+ /** @description The one endpoint that matters. Cues the effective variant does not claim are stripped */
291
+ async speak(body) {
292
+ const result = await this.fetch(`/speak`, {
293
+ method: "POST",
294
+ headers: {
295
+ "Content-Type": "application/json"
296
+ },
297
+ body: JSON.stringify(body, bigIntReplacer),
298
+ expectStatuses: [
299
+ 400,
300
+ 404,
301
+ 422,
302
+ 429,
303
+ 503
304
+ ]
305
+ });
306
+ switch (result.status) {
307
+ case 400:
308
+ return {
309
+ status: 400,
310
+ contentType: "application/json",
311
+ data: await parseJson(result)
312
+ };
313
+ case 404:
314
+ return {
315
+ status: 404,
316
+ contentType: "application/json",
317
+ data: await parseJson(result)
318
+ };
319
+ case 422:
320
+ return {
321
+ status: 422,
322
+ contentType: "application/json",
323
+ data: await parseJson(result)
324
+ };
325
+ case 429:
326
+ return {
327
+ status: 429,
328
+ contentType: "application/json",
329
+ data: await parseJson(result)
330
+ };
331
+ case 503:
332
+ return {
333
+ status: 503,
334
+ contentType: "application/json",
335
+ data: await parseJson(result)
336
+ };
337
+ default:
338
+ return {
339
+ status: 200,
340
+ contentType: readContentType(result),
341
+ data: await result.blob()
342
+ };
343
+ }
344
+ }
345
+ /** @description Open to every caller: it only reads, and its licences are what § 4 promises before install. */
346
+ async catalog() {
347
+ const result = await this.fetch(`/catalog`, {
348
+ method: "GET"
349
+ });
350
+ return await parseJson(result);
351
+ }
352
+ /** @description Only an engine this API installed. One the operator configured is theirs to remove. */
353
+ async uninstallEngine(engine) {
354
+ const result = await this.fetch(`/engines/${encodeURIComponent(engine)}`, {
355
+ method: "DELETE",
356
+ expectStatuses: [
357
+ 403,
358
+ 404,
359
+ 409
360
+ ]
361
+ });
362
+ switch (result.status) {
363
+ case 403:
364
+ return {
365
+ status: 403,
366
+ contentType: "application/json",
367
+ data: await parseJson(result)
368
+ };
369
+ case 404:
370
+ return {
371
+ status: 404,
372
+ contentType: "application/json",
373
+ data: await parseJson(result)
374
+ };
375
+ case 409:
376
+ return {
377
+ status: 409,
378
+ contentType: "application/json",
379
+ data: await parseJson(result)
380
+ };
381
+ default:
382
+ return {
383
+ status: 204
384
+ };
385
+ }
386
+ }
387
+ async installEngine(engine) {
388
+ const result = await this.fetch(`/engines/${encodeURIComponent(engine)}/install`, {
389
+ method: "POST",
390
+ expectStatuses: [
391
+ 403,
392
+ 404,
393
+ 409
394
+ ]
395
+ });
396
+ switch (result.status) {
397
+ case 403:
398
+ return {
399
+ status: 403,
400
+ contentType: "application/json",
401
+ data: await parseJson(result)
402
+ };
403
+ case 404:
404
+ return {
405
+ status: 404,
406
+ contentType: "application/json",
407
+ data: await parseJson(result)
408
+ };
409
+ case 409:
410
+ return {
411
+ status: 409,
412
+ contentType: "application/json",
413
+ data: await parseJson(result)
414
+ };
415
+ default:
416
+ return {
417
+ status: 202,
418
+ contentType: "application/json",
419
+ data: await parseJson(result)
420
+ };
421
+ }
422
+ }
423
+ async pullEngine(engine, body) {
424
+ const result = await this.fetch(`/engines/${encodeURIComponent(engine)}/pull`, {
425
+ method: "POST",
426
+ headers: {
427
+ "Content-Type": "application/json"
428
+ },
429
+ body: JSON.stringify(body, bigIntReplacer),
430
+ expectStatuses: [
431
+ 403,
432
+ 404,
433
+ 409
434
+ ]
435
+ });
436
+ switch (result.status) {
437
+ case 403:
438
+ return {
439
+ status: 403,
440
+ contentType: "application/json",
441
+ data: await parseJson(result)
442
+ };
443
+ case 404:
444
+ return {
445
+ status: 404,
446
+ contentType: "application/json",
447
+ data: await parseJson(result)
448
+ };
449
+ case 409:
450
+ return {
451
+ status: 409,
452
+ contentType: "application/json",
453
+ data: await parseJson(result)
454
+ };
455
+ default:
456
+ return {
457
+ status: 202,
458
+ contentType: "application/json",
459
+ data: await parseJson(result)
460
+ };
461
+ }
462
+ }
463
+ async installJobs() {
464
+ const result = await this.fetch(`/installs`, {
465
+ method: "GET",
466
+ expectStatuses: [
467
+ 403
468
+ ]
469
+ });
470
+ switch (result.status) {
471
+ case 403:
472
+ return {
473
+ status: 403,
474
+ contentType: "application/json",
475
+ data: await parseJson(result)
476
+ };
477
+ default:
478
+ return {
479
+ status: 200,
480
+ contentType: "application/json",
481
+ data: await parseJson(result)
482
+ };
483
+ }
484
+ }
485
+ async installJob(job) {
486
+ const result = await this.fetch(`/installs/${encodeURIComponent(job)}`, {
487
+ method: "GET",
488
+ expectStatuses: [
489
+ 403,
490
+ 404
491
+ ]
492
+ });
493
+ switch (result.status) {
494
+ case 403:
495
+ return {
496
+ status: 403,
497
+ contentType: "application/json",
498
+ data: await parseJson(result)
499
+ };
500
+ case 404:
501
+ return {
502
+ status: 404,
503
+ contentType: "application/json",
504
+ data: await parseJson(result)
505
+ };
506
+ default:
507
+ return {
508
+ status: 200,
509
+ contentType: "application/json",
510
+ data: await parseJson(result)
511
+ };
512
+ }
513
+ }
514
+ /** @description Server-sent events, each frame's data a FeedEvent. Hand-written, like /speak: ContractKit */
515
+ async installJobEvents(job) {
516
+ const result = await this.fetch(`/installs/${encodeURIComponent(job)}/events`, {
517
+ method: "GET",
518
+ expectStatuses: [
519
+ 403,
520
+ 404
521
+ ]
522
+ });
523
+ switch (result.status) {
524
+ case 403:
525
+ return {
526
+ status: 403,
527
+ contentType: "application/json",
528
+ data: await parseJson(result)
529
+ };
530
+ case 404:
531
+ return {
532
+ status: 404,
533
+ contentType: "application/json",
534
+ data: await parseJson(result)
535
+ };
536
+ default:
537
+ return {
538
+ status: 200,
539
+ contentType: "text/event-stream",
540
+ data: await result.text()
541
+ };
542
+ }
543
+ }
544
+ };
545
+
546
+ // src/generated/rhapsode.sdk.ts
547
+ var RhapsodeSdk = class {
548
+ static {
549
+ __name(this, "RhapsodeSdk");
550
+ }
551
+ public;
552
+ constructor(options) {
553
+ const sdkFetch = options.fetch ?? createSdkFetch(options);
554
+ this.public = new PublicClient(sdkFetch);
555
+ }
556
+ };
557
+ export {
558
+ PublicClient,
559
+ RhapsodeSdk,
560
+ SdkError,
561
+ bigIntReplacer,
562
+ bigIntReviver,
563
+ buildHeaders,
564
+ buildQueryString,
565
+ createSdkFetch,
566
+ parseBigIntHeader,
567
+ parseJson,
568
+ parseJsonWithBigInt,
569
+ readContentType
570
+ };
571
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/generated/sdk-options.ts","../src/generated/public/public.client.ts","../src/generated/rhapsode.sdk.ts"],"sourcesContent":["export class SdkError<TBody = unknown> extends Error {\n constructor(\n public readonly status: number,\n public readonly statusText: string,\n public readonly body: TBody,\n public readonly headers: Headers,\n ) {\n super(`${status} ${statusText}`);\n this.name = 'SdkError';\n }\n}\n\nexport interface SdkRequestInit extends RequestInit {\n /**\n * Statuses this operation declares as values rather than errors — a 304 from\n * conditional-GET middleware, or an error status the service returns deliberately.\n * Anything else at or above 400 still throws SdkError.\n */\n expectStatuses?: number[];\n}\n\nexport type SdkFetch = (url: string, init: SdkRequestInit) => Promise<Response>;\n\nexport interface SdkOptions {\n baseUrl: string;\n headers?: Record<string, string> | (() => Record<string, string> | Promise<Record<string, string>>);\n fetch?: SdkFetch;\n /** Called once per request to produce a unique X-Request-ID header value */\n requestIdFactory?: () => string;\n}\n\nexport const bigIntReplacer = (_: string, value: any): any => {\n if (typeof value === 'bigint') {\n return value.toString() + 'n';\n }\n return value;\n};\n\nexport const bigIntReviver = (_: string, value: any): any => {\n if (typeof value === 'string' && /^-?\\d+n$/.test(value)) {\n return BigInt(value.slice(0, -1));\n }\n return value;\n};\n\nexport type JsonValue = string | number | boolean | null | JsonValue[] | { [key: string]: JsonValue };\n\nexport function readContentType(res: Response): string {\n return res.headers.get('content-type')?.split(';')[0]?.trim() ?? '';\n}\n\n/** A v4 UUID. `crypto.randomUUID` exists only in a secure context, so plain HTTP builds one by hand. */\nfunction randomRequestId(): string {\n if (typeof crypto.randomUUID === 'function') return crypto.randomUUID();\n const bytes = crypto.getRandomValues(new Uint8Array(16));\n bytes[6] = (bytes[6]! & 0x0f) | 0x40;\n bytes[8] = (bytes[8]! & 0x3f) | 0x80;\n const hex = Array.from(bytes, b => b.toString(16).padStart(2, '0')).join('');\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n}\n\nexport function createSdkFetch(options: SdkOptions): SdkFetch {\n const getRequestId = options.requestIdFactory ?? randomRequestId;\n return async (url: string, init: SdkRequestInit): Promise<Response> => {\n const baseHeaders = typeof options.headers === 'function' ? await options.headers() : (options.headers ?? {});\n const res = await fetch(`${options.baseUrl}${url}`, {\n ...init,\n headers: { ...baseHeaders, 'X-Request-ID': getRequestId(), ...(init.headers as Record<string, string>) },\n });\n if (!res.ok && !(init.expectStatuses ?? []).includes(res.status)) {\n const text = await res.text();\n let body: unknown;\n try {\n body = JSON.parse(text);\n } catch {\n body = text;\n }\n throw new SdkError(res.status, res.statusText, body, res.headers);\n }\n return res;\n };\n}\n\nexport function buildQueryString(query: object | undefined): string {\n const searchParams = new URLSearchParams();\n if (query) {\n for (const [k, v] of Object.entries(query)) {\n if (v === undefined || v === null) continue;\n if (Array.isArray(v)) {\n for (const item of v) searchParams.append(k, String(item));\n } else searchParams.set(k, String(v));\n }\n }\n const qs = searchParams.toString();\n return qs ? `?${qs}` : '';\n}\n\nexport function buildHeaders(headers: object | undefined): Record<string, string> {\n const out: Record<string, string> = {};\n if (headers) {\n for (const [k, v] of Object.entries(headers)) {\n if (v === undefined || v === null) continue;\n out[k] = Array.isArray(v) ? v.map(String).join(', ') : String(v);\n }\n }\n return out;\n}\n\nexport function parseBigIntHeader(name: string, value: string): bigint {\n if (/^-?\\d+n?$/.test(value)) return BigInt(value.replace(/n$/, ''));\n throw new Error(`Response header '${name}' is not a bigint: ${JSON.stringify(value)}`);\n}\n\n/**\n * Read a JSON response body.\n *\n * No reviver: `bigIntReviver` matches any string of the form `123n` anywhere in the\n * document, so a contract with no bigint field would still have a legitimate string like\n * \"123n\" silently turned into a BigInt. Clients whose contracts do use bigint import\n * `parseJsonWithBigInt` under this name instead.\n */\nexport async function parseJson<T>(res: Response): Promise<T> {\n return JSON.parse(await res.text()) as T;\n}\n\n/** `parseJson` for contracts that declare a bigint, applying the `123n` reviver. */\nexport async function parseJsonWithBigInt<T>(res: Response): Promise<T> {\n return JSON.parse(await res.text(), bigIntReviver) as T;\n}\n","import type { SdkFetch } from '../sdk-options.js';\nimport { bigIntReplacer, parseJson, readContentType } from '../sdk-options.js';\nimport type {\n Capabilities,\n CatalogEntry,\n CoreHealth,\n EngineSpeakRequest,\n EngineSummary,\n ErrorBody,\n InstallJob,\n PullRequest,\n Voice,\n} from '../rhapsode/types/rhapsode.types.js';\n\nexport class PublicClient {\n constructor(private fetch: SdkFetch) {}\n\n /** @description The core's own. It answers while every worker is down and never blocks on one, because a */\n async health(): Promise<CoreHealth> {\n const result = await this.fetch(`/health`, { method: 'GET' });\n return await parseJson<CoreHealth>(result);\n }\n\n /** @description Every declared engine, whether or not it is running. Never spawns one: this is the list an */\n async engines(): Promise<EngineSummary[]> {\n const result = await this.fetch(`/engines`, { method: 'GET' });\n return await parseJson<EngineSummary[]>(result);\n }\n\n async engineCapabilities(\n engine: string,\n ): Promise<\n | { status: 200; contentType: 'application/json'; data: Capabilities }\n | { status: 404; contentType: 'application/json'; data: ErrorBody }\n | { status: 503; contentType: 'application/json'; data: ErrorBody }\n > {\n const result = await this.fetch(`/engines/${encodeURIComponent(engine)}/capabilities`, {\n method: 'GET',\n expectStatuses: [404, 503],\n });\n switch (result.status) {\n case 404:\n return { status: 404, contentType: 'application/json', data: await parseJson<ErrorBody>(result) };\n case 503:\n return { status: 503, contentType: 'application/json', data: await parseJson<ErrorBody>(result) };\n default:\n return { status: 200, contentType: 'application/json', data: await parseJson<Capabilities>(result) };\n }\n }\n\n async engineVoices(\n engine: string,\n ): Promise<{ status: 200; contentType: 'application/json'; data: Voice[] } | { status: 404; contentType: 'application/json'; data: ErrorBody }> {\n const result = await this.fetch(`/engines/${encodeURIComponent(engine)}/voices`, {\n method: 'GET',\n expectStatuses: [404],\n });\n switch (result.status) {\n case 404:\n return { status: 404, contentType: 'application/json', data: await parseJson<ErrorBody>(result) };\n default:\n return { status: 200, contentType: 'application/json', data: await parseJson<Voice[]>(result) };\n }\n }\n\n /** @description Management, like § 10: it writes a file on the box. Streamed to the worker, capped at 25 MB. */\n async createVoice(\n engine: string,\n body: FormData,\n ): Promise<\n | { status: 201; contentType: 'application/json'; data: Voice }\n | { status: 400; contentType: 'application/json'; data: ErrorBody }\n | { status: 403; contentType: 'application/json'; data: ErrorBody }\n | { status: 404; contentType: 'application/json'; data: ErrorBody }\n | { status: 422; contentType: 'application/json'; data: ErrorBody }\n > {\n const result = await this.fetch(`/engines/${encodeURIComponent(engine)}/voices`, {\n method: 'POST',\n body: body,\n expectStatuses: [400, 403, 404, 422],\n });\n switch (result.status) {\n case 400:\n return { status: 400, contentType: 'application/json', data: await parseJson<ErrorBody>(result) };\n case 403:\n return { status: 403, contentType: 'application/json', data: await parseJson<ErrorBody>(result) };\n case 404:\n return { status: 404, contentType: 'application/json', data: await parseJson<ErrorBody>(result) };\n case 422:\n return { status: 422, contentType: 'application/json', data: await parseJson<ErrorBody>(result) };\n default:\n return { status: 201, contentType: 'application/json', data: await parseJson<Voice>(result) };\n }\n }\n\n async deleteVoice(\n engine: string,\n voice: string,\n ): Promise<\n | { status: 204 }\n | { status: 400; contentType: 'application/json'; data: ErrorBody }\n | { status: 403; contentType: 'application/json'; data: ErrorBody }\n | { status: 404; contentType: 'application/json'; data: ErrorBody }\n | { status: 422; contentType: 'application/json'; data: ErrorBody }\n > {\n const result = await this.fetch(`/engines/${encodeURIComponent(engine)}/voices/${encodeURIComponent(voice)}`, {\n method: 'DELETE',\n expectStatuses: [400, 403, 404, 422],\n });\n switch (result.status) {\n case 400:\n return { status: 400, contentType: 'application/json', data: await parseJson<ErrorBody>(result) };\n case 403:\n return { status: 403, contentType: 'application/json', data: await parseJson<ErrorBody>(result) };\n case 404:\n return { status: 404, contentType: 'application/json', data: await parseJson<ErrorBody>(result) };\n case 422:\n return { status: 422, contentType: 'application/json', data: await parseJson<ErrorBody>(result) };\n default:\n return { status: 204 };\n }\n }\n\n async voicePreview(\n engine: string,\n voice: string,\n ): Promise<{ status: 200; contentType: 'audio/wav'; data: Blob } | { status: 404; contentType: 'application/json'; data: ErrorBody }> {\n const result = await this.fetch(`/engines/${encodeURIComponent(engine)}/voices/${encodeURIComponent(voice)}/preview`, {\n method: 'GET',\n expectStatuses: [404],\n });\n switch (result.status) {\n case 404:\n return { status: 404, contentType: 'application/json', data: await parseJson<ErrorBody>(result) };\n default:\n return { status: 200, contentType: 'audio/wav', data: await result.blob() };\n }\n }\n\n /** @description The one endpoint that matters. Cues the effective variant does not claim are stripped */\n async speak(\n body: EngineSpeakRequest,\n ): Promise<\n | { status: 200; contentType: 'audio/wav' | 'audio/mpeg' | 'audio/opus' | 'audio/flac' | 'audio/l16'; data: Blob }\n | { status: 400; contentType: 'application/json'; data: ErrorBody }\n | { status: 404; contentType: 'application/json'; data: ErrorBody }\n | { status: 422; contentType: 'application/json'; data: ErrorBody }\n | { status: 429; contentType: 'application/json'; data: ErrorBody }\n | { status: 503; contentType: 'application/json'; data: ErrorBody }\n > {\n const result = await this.fetch(`/speak`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body, bigIntReplacer),\n expectStatuses: [400, 404, 422, 429, 503],\n });\n switch (result.status) {\n case 400:\n return { status: 400, contentType: 'application/json', data: await parseJson<ErrorBody>(result) };\n case 404:\n return { status: 404, contentType: 'application/json', data: await parseJson<ErrorBody>(result) };\n case 422:\n return { status: 422, contentType: 'application/json', data: await parseJson<ErrorBody>(result) };\n case 429:\n return { status: 429, contentType: 'application/json', data: await parseJson<ErrorBody>(result) };\n case 503:\n return { status: 503, contentType: 'application/json', data: await parseJson<ErrorBody>(result) };\n default:\n return {\n status: 200,\n contentType: readContentType(result) as 'audio/wav' | 'audio/mpeg' | 'audio/opus' | 'audio/flac' | 'audio/l16',\n data: await result.blob(),\n };\n }\n }\n\n /** @description Open to every caller: it only reads, and its licences are what § 4 promises before install. */\n async catalog(): Promise<CatalogEntry[]> {\n const result = await this.fetch(`/catalog`, { method: 'GET' });\n return await parseJson<CatalogEntry[]>(result);\n }\n\n /** @description Only an engine this API installed. One the operator configured is theirs to remove. */\n async uninstallEngine(\n engine: string,\n ): Promise<\n | { status: 204 }\n | { status: 403; contentType: 'application/json'; data: ErrorBody }\n | { status: 404; contentType: 'application/json'; data: ErrorBody }\n | { status: 409; contentType: 'application/json'; data: ErrorBody }\n > {\n const result = await this.fetch(`/engines/${encodeURIComponent(engine)}`, {\n method: 'DELETE',\n expectStatuses: [403, 404, 409],\n });\n switch (result.status) {\n case 403:\n return { status: 403, contentType: 'application/json', data: await parseJson<ErrorBody>(result) };\n case 404:\n return { status: 404, contentType: 'application/json', data: await parseJson<ErrorBody>(result) };\n case 409:\n return { status: 409, contentType: 'application/json', data: await parseJson<ErrorBody>(result) };\n default:\n return { status: 204 };\n }\n }\n\n async installEngine(\n engine: string,\n ): Promise<\n | { status: 202; contentType: 'application/json'; data: InstallJob }\n | { status: 403; contentType: 'application/json'; data: ErrorBody }\n | { status: 404; contentType: 'application/json'; data: ErrorBody }\n | { status: 409; contentType: 'application/json'; data: ErrorBody }\n > {\n const result = await this.fetch(`/engines/${encodeURIComponent(engine)}/install`, {\n method: 'POST',\n expectStatuses: [403, 404, 409],\n });\n switch (result.status) {\n case 403:\n return { status: 403, contentType: 'application/json', data: await parseJson<ErrorBody>(result) };\n case 404:\n return { status: 404, contentType: 'application/json', data: await parseJson<ErrorBody>(result) };\n case 409:\n return { status: 409, contentType: 'application/json', data: await parseJson<ErrorBody>(result) };\n default:\n return { status: 202, contentType: 'application/json', data: await parseJson<InstallJob>(result) };\n }\n }\n\n async pullEngine(\n engine: string,\n body: PullRequest,\n ): Promise<\n | { status: 202; contentType: 'application/json'; data: InstallJob }\n | { status: 403; contentType: 'application/json'; data: ErrorBody }\n | { status: 404; contentType: 'application/json'; data: ErrorBody }\n | { status: 409; contentType: 'application/json'; data: ErrorBody }\n > {\n const result = await this.fetch(`/engines/${encodeURIComponent(engine)}/pull`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body, bigIntReplacer),\n expectStatuses: [403, 404, 409],\n });\n switch (result.status) {\n case 403:\n return { status: 403, contentType: 'application/json', data: await parseJson<ErrorBody>(result) };\n case 404:\n return { status: 404, contentType: 'application/json', data: await parseJson<ErrorBody>(result) };\n case 409:\n return { status: 409, contentType: 'application/json', data: await parseJson<ErrorBody>(result) };\n default:\n return { status: 202, contentType: 'application/json', data: await parseJson<InstallJob>(result) };\n }\n }\n\n async installJobs(): Promise<\n { status: 200; contentType: 'application/json'; data: InstallJob[] } | { status: 403; contentType: 'application/json'; data: ErrorBody }\n > {\n const result = await this.fetch(`/installs`, {\n method: 'GET',\n expectStatuses: [403],\n });\n switch (result.status) {\n case 403:\n return { status: 403, contentType: 'application/json', data: await parseJson<ErrorBody>(result) };\n default:\n return { status: 200, contentType: 'application/json', data: await parseJson<InstallJob[]>(result) };\n }\n }\n\n async installJob(\n job: string,\n ): Promise<\n | { status: 200; contentType: 'application/json'; data: InstallJob }\n | { status: 403; contentType: 'application/json'; data: ErrorBody }\n | { status: 404; contentType: 'application/json'; data: ErrorBody }\n > {\n const result = await this.fetch(`/installs/${encodeURIComponent(job)}`, {\n method: 'GET',\n expectStatuses: [403, 404],\n });\n switch (result.status) {\n case 403:\n return { status: 403, contentType: 'application/json', data: await parseJson<ErrorBody>(result) };\n case 404:\n return { status: 404, contentType: 'application/json', data: await parseJson<ErrorBody>(result) };\n default:\n return { status: 200, contentType: 'application/json', data: await parseJson<InstallJob>(result) };\n }\n }\n\n /** @description Server-sent events, each frame's data a FeedEvent. Hand-written, like /speak: ContractKit */\n async installJobEvents(\n job: string,\n ): Promise<\n | { status: 200; contentType: 'text/event-stream'; data: string }\n | { status: 403; contentType: 'application/json'; data: ErrorBody }\n | { status: 404; contentType: 'application/json'; data: ErrorBody }\n > {\n const result = await this.fetch(`/installs/${encodeURIComponent(job)}/events`, {\n method: 'GET',\n expectStatuses: [403, 404],\n });\n switch (result.status) {\n case 403:\n return { status: 403, contentType: 'application/json', data: await parseJson<ErrorBody>(result) };\n case 404:\n return { status: 404, contentType: 'application/json', data: await parseJson<ErrorBody>(result) };\n default:\n return { status: 200, contentType: 'text/event-stream', data: await result.text() };\n }\n }\n}\n","import type { SdkOptions } from './sdk-options.js';\nimport { createSdkFetch } from './sdk-options.js';\nimport { PublicClient } from './public/public.client.js';\n\nexport class RhapsodeSdk {\n readonly public: PublicClient;\n\n constructor(options: SdkOptions) {\n const sdkFetch = options.fetch ?? createSdkFetch(options);\n this.public = new PublicClient(sdkFetch);\n }\n}\n"],"mappings":";;;;AAAO,IAAMA,WAAN,cAAwCC,MAAAA;EAA/C,OAA+CA;;;;;;;EAC3C,YACoBC,QACAC,YACAC,MACAC,SAClB;AACE,UAAM,GAAGH,MAAAA,IAAUC,UAAAA,EAAY,GAAA,KALfD,SAAAA,QAAAA,KACAC,aAAAA,YAAAA,KACAC,OAAAA,MAAAA,KACAC,UAAAA;AAGhB,SAAKC,OAAO;EAChB;AACJ;AAqBO,IAAMC,iBAAiB,wBAACC,GAAWC,UAAAA;AACtC,MAAI,OAAOA,UAAU,UAAU;AAC3B,WAAOA,MAAMC,SAAQ,IAAK;EAC9B;AACA,SAAOD;AACX,GAL8B;AAOvB,IAAME,gBAAgB,wBAACH,GAAWC,UAAAA;AACrC,MAAI,OAAOA,UAAU,YAAY,WAAWG,KAAKH,KAAAA,GAAQ;AACrD,WAAOI,OAAOJ,MAAMK,MAAM,GAAG,EAAC,CAAA;EAClC;AACA,SAAOL;AACX,GAL6B;AAStB,SAASM,gBAAgBC,KAAa;AACzC,SAAOA,IAAIX,QAAQY,IAAI,cAAA,GAAiBC,MAAM,GAAA,EAAK,CAAA,GAAIC,KAAAA,KAAU;AACrE;AAFgBJ;AAKhB,SAASK,kBAAAA;AACL,MAAI,OAAOC,OAAOC,eAAe,WAAY,QAAOD,OAAOC,WAAU;AACrE,QAAMC,QAAQF,OAAOG,gBAAgB,IAAIC,WAAW,EAAA,CAAA;AACpDF,QAAM,CAAA,IAAMA,MAAM,CAAA,IAAM,KAAQ;AAChCA,QAAM,CAAA,IAAMA,MAAM,CAAA,IAAM,KAAQ;AAChC,QAAMG,MAAMC,MAAMC,KAAKL,OAAOM,CAAAA,MAAKA,EAAEnB,SAAS,EAAA,EAAIoB,SAAS,GAAG,GAAA,CAAA,EAAMC,KAAK,EAAA;AACzE,SAAO,GAAGL,IAAIZ,MAAM,GAAG,CAAA,CAAA,IAAMY,IAAIZ,MAAM,GAAG,EAAA,CAAA,IAAOY,IAAIZ,MAAM,IAAI,EAAA,CAAA,IAAOY,IAAIZ,MAAM,IAAI,EAAA,CAAA,IAAOY,IAAIZ,MAAM,EAAA,CAAA;AACzG;AAPSM;AASF,SAASY,eAAeC,SAAmB;AAC9C,QAAMC,eAAeD,QAAQE,oBAAoBf;AACjD,SAAO,OAAOgB,KAAaC,SAAAA;AACvB,UAAMC,cAAc,OAAOL,QAAQ5B,YAAY,aAAa,MAAM4B,QAAQ5B,QAAO,IAAM4B,QAAQ5B,WAAW,CAAC;AAC3G,UAAMW,MAAM,MAAMuB,MAAM,GAAGN,QAAQO,OAAO,GAAGJ,GAAAA,IAAO;MAChD,GAAGC;MACHhC,SAAS;QAAE,GAAGiC;QAAa,gBAAgBJ,aAAAA;QAAgB,GAAIG,KAAKhC;MAAmC;IAC3G,CAAA;AACA,QAAI,CAACW,IAAIyB,MAAM,EAAEJ,KAAKK,kBAAkB,CAAA,GAAIC,SAAS3B,IAAId,MAAM,GAAG;AAC9D,YAAM0C,OAAO,MAAM5B,IAAI4B,KAAI;AAC3B,UAAIxC;AACJ,UAAI;AACAA,eAAOyC,KAAKC,MAAMF,IAAAA;MACtB,QAAQ;AACJxC,eAAOwC;MACX;AACA,YAAM,IAAI5C,SAASgB,IAAId,QAAQc,IAAIb,YAAYC,MAAMY,IAAIX,OAAO;IACpE;AACA,WAAOW;EACX;AACJ;AApBgBgB;AAsBT,SAASe,iBAAiBC,OAAyB;AACtD,QAAMC,eAAe,IAAIC,gBAAAA;AACzB,MAAIF,OAAO;AACP,eAAW,CAACG,GAAGC,CAAAA,KAAMC,OAAOC,QAAQN,KAAAA,GAAQ;AACxC,UAAII,MAAMG,UAAaH,MAAM,KAAM;AACnC,UAAIzB,MAAM6B,QAAQJ,CAAAA,GAAI;AAClB,mBAAWK,QAAQL,EAAGH,cAAaS,OAAOP,GAAGQ,OAAOF,IAAAA,CAAAA;MACxD,MAAOR,cAAaW,IAAIT,GAAGQ,OAAOP,CAAAA,CAAAA;IACtC;EACJ;AACA,QAAMS,KAAKZ,aAAavC,SAAQ;AAChC,SAAOmD,KAAK,IAAIA,EAAAA,KAAO;AAC3B;AAZgBd;AAcT,SAASe,aAAazD,SAA2B;AACpD,QAAM0D,MAA8B,CAAC;AACrC,MAAI1D,SAAS;AACT,eAAW,CAAC8C,GAAGC,CAAAA,KAAMC,OAAOC,QAAQjD,OAAAA,GAAU;AAC1C,UAAI+C,MAAMG,UAAaH,MAAM,KAAM;AACnCW,UAAIZ,CAAAA,IAAKxB,MAAM6B,QAAQJ,CAAAA,IAAKA,EAAEY,IAAIL,MAAAA,EAAQ5B,KAAK,IAAA,IAAQ4B,OAAOP,CAAAA;IAClE;EACJ;AACA,SAAOW;AACX;AATgBD;AAWT,SAASG,kBAAkB3D,MAAcG,OAAa;AACzD,MAAI,YAAYG,KAAKH,KAAAA,EAAQ,QAAOI,OAAOJ,MAAMyD,QAAQ,MAAM,EAAA,CAAA;AAC/D,QAAM,IAAIjE,MAAM,oBAAoBK,IAAAA,sBAA0BuC,KAAKsB,UAAU1D,KAAAA,CAAAA,EAAQ;AACzF;AAHgBwD;AAahB,eAAsBG,UAAapD,KAAa;AAC5C,SAAO6B,KAAKC,MAAM,MAAM9B,IAAI4B,KAAI,CAAA;AACpC;AAFsBwB;AAKtB,eAAsBC,oBAAuBrD,KAAa;AACtD,SAAO6B,KAAKC,MAAM,MAAM9B,IAAI4B,KAAI,GAAIjC,aAAAA;AACxC;AAFsB0D;;;AChHf,IAAMC,eAAN,MAAMA;EAbb,OAaaA;;;;EACT,YAAoBC,QAAiB;SAAjBA,QAAAA;EAAkB;;EAGtC,MAAMC,SAA8B;AAChC,UAAMC,SAAS,MAAM,KAAKF,MAAM,WAAW;MAAEG,QAAQ;IAAM,CAAA;AAC3D,WAAO,MAAMC,UAAsBF,MAAAA;EACvC;;EAGA,MAAMG,UAAoC;AACtC,UAAMH,SAAS,MAAM,KAAKF,MAAM,YAAY;MAAEG,QAAQ;IAAM,CAAA;AAC5D,WAAO,MAAMC,UAA2BF,MAAAA;EAC5C;EAEA,MAAMI,mBACFC,QAKF;AACE,UAAML,SAAS,MAAM,KAAKF,MAAM,YAAYQ,mBAAmBD,MAAAA,CAAAA,iBAAwB;MACnFJ,QAAQ;MACRM,gBAAgB;QAAC;QAAK;;IAC1B,CAAA;AACA,YAAQP,OAAOQ,QAAM;MACjB,KAAK;AACD,eAAO;UAAEA,QAAQ;UAAKC,aAAa;UAAoBC,MAAM,MAAMR,UAAqBF,MAAAA;QAAQ;MACpG,KAAK;AACD,eAAO;UAAEQ,QAAQ;UAAKC,aAAa;UAAoBC,MAAM,MAAMR,UAAqBF,MAAAA;QAAQ;MACpG;AACI,eAAO;UAAEQ,QAAQ;UAAKC,aAAa;UAAoBC,MAAM,MAAMR,UAAwBF,MAAAA;QAAQ;IAC3G;EACJ;EAEA,MAAMW,aACFN,QAC4I;AAC5I,UAAML,SAAS,MAAM,KAAKF,MAAM,YAAYQ,mBAAmBD,MAAAA,CAAAA,WAAkB;MAC7EJ,QAAQ;MACRM,gBAAgB;QAAC;;IACrB,CAAA;AACA,YAAQP,OAAOQ,QAAM;MACjB,KAAK;AACD,eAAO;UAAEA,QAAQ;UAAKC,aAAa;UAAoBC,MAAM,MAAMR,UAAqBF,MAAAA;QAAQ;MACpG;AACI,eAAO;UAAEQ,QAAQ;UAAKC,aAAa;UAAoBC,MAAM,MAAMR,UAAmBF,MAAAA;QAAQ;IACtG;EACJ;;EAGA,MAAMY,YACFP,QACAQ,MAOF;AACE,UAAMb,SAAS,MAAM,KAAKF,MAAM,YAAYQ,mBAAmBD,MAAAA,CAAAA,WAAkB;MAC7EJ,QAAQ;MACRY;MACAN,gBAAgB;QAAC;QAAK;QAAK;QAAK;;IACpC,CAAA;AACA,YAAQP,OAAOQ,QAAM;MACjB,KAAK;AACD,eAAO;UAAEA,QAAQ;UAAKC,aAAa;UAAoBC,MAAM,MAAMR,UAAqBF,MAAAA;QAAQ;MACpG,KAAK;AACD,eAAO;UAAEQ,QAAQ;UAAKC,aAAa;UAAoBC,MAAM,MAAMR,UAAqBF,MAAAA;QAAQ;MACpG,KAAK;AACD,eAAO;UAAEQ,QAAQ;UAAKC,aAAa;UAAoBC,MAAM,MAAMR,UAAqBF,MAAAA;QAAQ;MACpG,KAAK;AACD,eAAO;UAAEQ,QAAQ;UAAKC,aAAa;UAAoBC,MAAM,MAAMR,UAAqBF,MAAAA;QAAQ;MACpG;AACI,eAAO;UAAEQ,QAAQ;UAAKC,aAAa;UAAoBC,MAAM,MAAMR,UAAiBF,MAAAA;QAAQ;IACpG;EACJ;EAEA,MAAMc,YACFT,QACAU,OAOF;AACE,UAAMf,SAAS,MAAM,KAAKF,MAAM,YAAYQ,mBAAmBD,MAAAA,CAAAA,WAAkBC,mBAAmBS,KAAAA,CAAAA,IAAU;MAC1Gd,QAAQ;MACRM,gBAAgB;QAAC;QAAK;QAAK;QAAK;;IACpC,CAAA;AACA,YAAQP,OAAOQ,QAAM;MACjB,KAAK;AACD,eAAO;UAAEA,QAAQ;UAAKC,aAAa;UAAoBC,MAAM,MAAMR,UAAqBF,MAAAA;QAAQ;MACpG,KAAK;AACD,eAAO;UAAEQ,QAAQ;UAAKC,aAAa;UAAoBC,MAAM,MAAMR,UAAqBF,MAAAA;QAAQ;MACpG,KAAK;AACD,eAAO;UAAEQ,QAAQ;UAAKC,aAAa;UAAoBC,MAAM,MAAMR,UAAqBF,MAAAA;QAAQ;MACpG,KAAK;AACD,eAAO;UAAEQ,QAAQ;UAAKC,aAAa;UAAoBC,MAAM,MAAMR,UAAqBF,MAAAA;QAAQ;MACpG;AACI,eAAO;UAAEQ,QAAQ;QAAI;IAC7B;EACJ;EAEA,MAAMQ,aACFX,QACAU,OACkI;AAClI,UAAMf,SAAS,MAAM,KAAKF,MAAM,YAAYQ,mBAAmBD,MAAAA,CAAAA,WAAkBC,mBAAmBS,KAAAA,CAAAA,YAAkB;MAClHd,QAAQ;MACRM,gBAAgB;QAAC;;IACrB,CAAA;AACA,YAAQP,OAAOQ,QAAM;MACjB,KAAK;AACD,eAAO;UAAEA,QAAQ;UAAKC,aAAa;UAAoBC,MAAM,MAAMR,UAAqBF,MAAAA;QAAQ;MACpG;AACI,eAAO;UAAEQ,QAAQ;UAAKC,aAAa;UAAaC,MAAM,MAAMV,OAAOiB,KAAI;QAAG;IAClF;EACJ;;EAGA,MAAMC,MACFL,MAQF;AACE,UAAMb,SAAS,MAAM,KAAKF,MAAM,UAAU;MACtCG,QAAQ;MACRkB,SAAS;QAAE,gBAAgB;MAAmB;MAC9CN,MAAMO,KAAKC,UAAUR,MAAMS,cAAAA;MAC3Bf,gBAAgB;QAAC;QAAK;QAAK;QAAK;QAAK;;IACzC,CAAA;AACA,YAAQP,OAAOQ,QAAM;MACjB,KAAK;AACD,eAAO;UAAEA,QAAQ;UAAKC,aAAa;UAAoBC,MAAM,MAAMR,UAAqBF,MAAAA;QAAQ;MACpG,KAAK;AACD,eAAO;UAAEQ,QAAQ;UAAKC,aAAa;UAAoBC,MAAM,MAAMR,UAAqBF,MAAAA;QAAQ;MACpG,KAAK;AACD,eAAO;UAAEQ,QAAQ;UAAKC,aAAa;UAAoBC,MAAM,MAAMR,UAAqBF,MAAAA;QAAQ;MACpG,KAAK;AACD,eAAO;UAAEQ,QAAQ;UAAKC,aAAa;UAAoBC,MAAM,MAAMR,UAAqBF,MAAAA;QAAQ;MACpG,KAAK;AACD,eAAO;UAAEQ,QAAQ;UAAKC,aAAa;UAAoBC,MAAM,MAAMR,UAAqBF,MAAAA;QAAQ;MACpG;AACI,eAAO;UACHQ,QAAQ;UACRC,aAAac,gBAAgBvB,MAAAA;UAC7BU,MAAM,MAAMV,OAAOiB,KAAI;QAC3B;IACR;EACJ;;EAGA,MAAMO,UAAmC;AACrC,UAAMxB,SAAS,MAAM,KAAKF,MAAM,YAAY;MAAEG,QAAQ;IAAM,CAAA;AAC5D,WAAO,MAAMC,UAA0BF,MAAAA;EAC3C;;EAGA,MAAMyB,gBACFpB,QAMF;AACE,UAAML,SAAS,MAAM,KAAKF,MAAM,YAAYQ,mBAAmBD,MAAAA,CAAAA,IAAW;MACtEJ,QAAQ;MACRM,gBAAgB;QAAC;QAAK;QAAK;;IAC/B,CAAA;AACA,YAAQP,OAAOQ,QAAM;MACjB,KAAK;AACD,eAAO;UAAEA,QAAQ;UAAKC,aAAa;UAAoBC,MAAM,MAAMR,UAAqBF,MAAAA;QAAQ;MACpG,KAAK;AACD,eAAO;UAAEQ,QAAQ;UAAKC,aAAa;UAAoBC,MAAM,MAAMR,UAAqBF,MAAAA;QAAQ;MACpG,KAAK;AACD,eAAO;UAAEQ,QAAQ;UAAKC,aAAa;UAAoBC,MAAM,MAAMR,UAAqBF,MAAAA;QAAQ;MACpG;AACI,eAAO;UAAEQ,QAAQ;QAAI;IAC7B;EACJ;EAEA,MAAMkB,cACFrB,QAMF;AACE,UAAML,SAAS,MAAM,KAAKF,MAAM,YAAYQ,mBAAmBD,MAAAA,CAAAA,YAAmB;MAC9EJ,QAAQ;MACRM,gBAAgB;QAAC;QAAK;QAAK;;IAC/B,CAAA;AACA,YAAQP,OAAOQ,QAAM;MACjB,KAAK;AACD,eAAO;UAAEA,QAAQ;UAAKC,aAAa;UAAoBC,MAAM,MAAMR,UAAqBF,MAAAA;QAAQ;MACpG,KAAK;AACD,eAAO;UAAEQ,QAAQ;UAAKC,aAAa;UAAoBC,MAAM,MAAMR,UAAqBF,MAAAA;QAAQ;MACpG,KAAK;AACD,eAAO;UAAEQ,QAAQ;UAAKC,aAAa;UAAoBC,MAAM,MAAMR,UAAqBF,MAAAA;QAAQ;MACpG;AACI,eAAO;UAAEQ,QAAQ;UAAKC,aAAa;UAAoBC,MAAM,MAAMR,UAAsBF,MAAAA;QAAQ;IACzG;EACJ;EAEA,MAAM2B,WACFtB,QACAQ,MAMF;AACE,UAAMb,SAAS,MAAM,KAAKF,MAAM,YAAYQ,mBAAmBD,MAAAA,CAAAA,SAAgB;MAC3EJ,QAAQ;MACRkB,SAAS;QAAE,gBAAgB;MAAmB;MAC9CN,MAAMO,KAAKC,UAAUR,MAAMS,cAAAA;MAC3Bf,gBAAgB;QAAC;QAAK;QAAK;;IAC/B,CAAA;AACA,YAAQP,OAAOQ,QAAM;MACjB,KAAK;AACD,eAAO;UAAEA,QAAQ;UAAKC,aAAa;UAAoBC,MAAM,MAAMR,UAAqBF,MAAAA;QAAQ;MACpG,KAAK;AACD,eAAO;UAAEQ,QAAQ;UAAKC,aAAa;UAAoBC,MAAM,MAAMR,UAAqBF,MAAAA;QAAQ;MACpG,KAAK;AACD,eAAO;UAAEQ,QAAQ;UAAKC,aAAa;UAAoBC,MAAM,MAAMR,UAAqBF,MAAAA;QAAQ;MACpG;AACI,eAAO;UAAEQ,QAAQ;UAAKC,aAAa;UAAoBC,MAAM,MAAMR,UAAsBF,MAAAA;QAAQ;IACzG;EACJ;EAEA,MAAM4B,cAEJ;AACE,UAAM5B,SAAS,MAAM,KAAKF,MAAM,aAAa;MACzCG,QAAQ;MACRM,gBAAgB;QAAC;;IACrB,CAAA;AACA,YAAQP,OAAOQ,QAAM;MACjB,KAAK;AACD,eAAO;UAAEA,QAAQ;UAAKC,aAAa;UAAoBC,MAAM,MAAMR,UAAqBF,MAAAA;QAAQ;MACpG;AACI,eAAO;UAAEQ,QAAQ;UAAKC,aAAa;UAAoBC,MAAM,MAAMR,UAAwBF,MAAAA;QAAQ;IAC3G;EACJ;EAEA,MAAM6B,WACFC,KAKF;AACE,UAAM9B,SAAS,MAAM,KAAKF,MAAM,aAAaQ,mBAAmBwB,GAAAA,CAAAA,IAAQ;MACpE7B,QAAQ;MACRM,gBAAgB;QAAC;QAAK;;IAC1B,CAAA;AACA,YAAQP,OAAOQ,QAAM;MACjB,KAAK;AACD,eAAO;UAAEA,QAAQ;UAAKC,aAAa;UAAoBC,MAAM,MAAMR,UAAqBF,MAAAA;QAAQ;MACpG,KAAK;AACD,eAAO;UAAEQ,QAAQ;UAAKC,aAAa;UAAoBC,MAAM,MAAMR,UAAqBF,MAAAA;QAAQ;MACpG;AACI,eAAO;UAAEQ,QAAQ;UAAKC,aAAa;UAAoBC,MAAM,MAAMR,UAAsBF,MAAAA;QAAQ;IACzG;EACJ;;EAGA,MAAM+B,iBACFD,KAKF;AACE,UAAM9B,SAAS,MAAM,KAAKF,MAAM,aAAaQ,mBAAmBwB,GAAAA,CAAAA,WAAe;MAC3E7B,QAAQ;MACRM,gBAAgB;QAAC;QAAK;;IAC1B,CAAA;AACA,YAAQP,OAAOQ,QAAM;MACjB,KAAK;AACD,eAAO;UAAEA,QAAQ;UAAKC,aAAa;UAAoBC,MAAM,MAAMR,UAAqBF,MAAAA;QAAQ;MACpG,KAAK;AACD,eAAO;UAAEQ,QAAQ;UAAKC,aAAa;UAAoBC,MAAM,MAAMR,UAAqBF,MAAAA;QAAQ;MACpG;AACI,eAAO;UAAEQ,QAAQ;UAAKC,aAAa;UAAqBC,MAAM,MAAMV,OAAOgC,KAAI;QAAG;IAC1F;EACJ;AACJ;;;ACvTO,IAAMC,cAAN,MAAMA;EAHb,OAGaA;;;EACAC;EAET,YAAYC,SAAqB;AAC7B,UAAMC,WAAWD,QAAQE,SAASC,eAAeH,OAAAA;AACjD,SAAKD,SAAS,IAAIK,aAAaH,QAAAA;EACnC;AACJ;","names":["SdkError","Error","status","statusText","body","headers","name","bigIntReplacer","_","value","toString","bigIntReviver","test","BigInt","slice","readContentType","res","get","split","trim","randomRequestId","crypto","randomUUID","bytes","getRandomValues","Uint8Array","hex","Array","from","b","padStart","join","createSdkFetch","options","getRequestId","requestIdFactory","url","init","baseHeaders","fetch","baseUrl","ok","expectStatuses","includes","text","JSON","parse","buildQueryString","query","searchParams","URLSearchParams","k","v","Object","entries","undefined","isArray","item","append","String","set","qs","buildHeaders","out","map","parseBigIntHeader","replace","stringify","parseJson","parseJsonWithBigInt","PublicClient","fetch","health","result","method","parseJson","engines","engineCapabilities","engine","encodeURIComponent","expectStatuses","status","contentType","data","engineVoices","createVoice","body","deleteVoice","voice","voicePreview","blob","speak","headers","JSON","stringify","bigIntReplacer","readContentType","catalog","uninstallEngine","installEngine","pullEngine","installJobs","installJob","job","installJobEvents","text","RhapsodeSdk","public","options","sdkFetch","fetch","createSdkFetch","PublicClient"]}
package/package.json ADDED
@@ -0,0 +1,37 @@
1
+ {
2
+ "name": "@maroonedsoftware/rhapsode-sdk",
3
+ "version": "0.1.1",
4
+ "description": "A typed client for the rhapsode public API, generated from contracts/.",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "default": "./dist/index.js"
13
+ }
14
+ },
15
+ "license": "MIT",
16
+ "files": [
17
+ "dist/**",
18
+ "LICENSE"
19
+ ],
20
+ "devDependencies": {
21
+ "@repo/config-eslint": "0.0.0",
22
+ "@repo/config-typescript": "0.0.0",
23
+ "@rhapsode/core": "0.1.1",
24
+ "vitest": "^5.0.0"
25
+ },
26
+ "publishConfig": {
27
+ "access": "public"
28
+ },
29
+ "scripts": {
30
+ "build": "tsup src/index.ts --format esm --sourcemap && tsc --emitDeclarationOnly --declaration",
31
+ "build:ci": "eslint --max-warnings=0 && pnpm run build",
32
+ "lint": "eslint --fix",
33
+ "format": "prettier --write . --ignore-path ../../.prettierignore",
34
+ "test": "vitest run",
35
+ "typecheck": "tsc --noEmit"
36
+ }
37
+ }