@tanstack/ai-worldlabs 0.0.0 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +42 -2
  3. package/dist/esm/adapters/world.d.ts +38 -0
  4. package/dist/esm/adapters/world.js +314 -0
  5. package/dist/esm/adapters/world.js.map +1 -0
  6. package/dist/esm/byok.d.ts +1 -0
  7. package/dist/esm/byok.js +11 -0
  8. package/dist/esm/byok.js.map +1 -0
  9. package/dist/esm/generated/client/client.gen.d.ts +2 -0
  10. package/dist/esm/generated/client/client.gen.js +174 -0
  11. package/dist/esm/generated/client/client.gen.js.map +1 -0
  12. package/dist/esm/generated/client/index.d.ts +10 -0
  13. package/dist/esm/generated/client/index.js +5 -0
  14. package/dist/esm/generated/client/types.gen.d.ts +120 -0
  15. package/dist/esm/generated/client/utils.gen.d.ts +37 -0
  16. package/dist/esm/generated/client/utils.gen.js +177 -0
  17. package/dist/esm/generated/client/utils.gen.js.map +1 -0
  18. package/dist/esm/generated/client.d.ts +1 -0
  19. package/dist/esm/generated/client.gen.d.ts +12 -0
  20. package/dist/esm/generated/client.gen.js +9 -0
  21. package/dist/esm/generated/client.gen.js.map +1 -0
  22. package/dist/esm/generated/client.js +5 -0
  23. package/dist/esm/generated/core/auth.gen.d.ts +25 -0
  24. package/dist/esm/generated/core/auth.gen.js +12 -0
  25. package/dist/esm/generated/core/auth.gen.js.map +1 -0
  26. package/dist/esm/generated/core/bodySerializer.gen.d.ts +25 -0
  27. package/dist/esm/generated/core/bodySerializer.gen.js +6 -0
  28. package/dist/esm/generated/core/bodySerializer.gen.js.map +1 -0
  29. package/dist/esm/generated/core/params.gen.d.ts +43 -0
  30. package/dist/esm/generated/core/params.gen.js +9 -0
  31. package/dist/esm/generated/core/params.gen.js.map +1 -0
  32. package/dist/esm/generated/core/pathSerializer.gen.d.ts +33 -0
  33. package/dist/esm/generated/core/pathSerializer.gen.js +82 -0
  34. package/dist/esm/generated/core/pathSerializer.gen.js.map +1 -0
  35. package/dist/esm/generated/core/queryKeySerializer.gen.d.ts +18 -0
  36. package/dist/esm/generated/core/serverSentEvents.gen.d.ts +71 -0
  37. package/dist/esm/generated/core/serverSentEvents.gen.js +96 -0
  38. package/dist/esm/generated/core/serverSentEvents.gen.js.map +1 -0
  39. package/dist/esm/generated/core/types.gen.d.ts +83 -0
  40. package/dist/esm/generated/core/utils.gen.d.ts +19 -0
  41. package/dist/esm/generated/core/utils.gen.js +78 -0
  42. package/dist/esm/generated/core/utils.gen.js.map +1 -0
  43. package/dist/esm/generated/index.d.ts +2 -0
  44. package/dist/esm/generated/sdk.gen.d.ts +275 -0
  45. package/dist/esm/generated/sdk.gen.js +79 -0
  46. package/dist/esm/generated/sdk.gen.js.map +1 -0
  47. package/dist/esm/generated/types.gen.d.ts +1610 -0
  48. package/dist/esm/index.d.ts +5 -0
  49. package/dist/esm/index.js +4 -0
  50. package/dist/esm/model-meta.d.ts +63 -0
  51. package/dist/esm/model-meta.js +17 -0
  52. package/dist/esm/model-meta.js.map +1 -0
  53. package/dist/esm/utils/client.d.ts +16 -0
  54. package/dist/esm/utils/client.js +35 -0
  55. package/dist/esm/utils/client.js.map +1 -0
  56. package/package.json +54 -6
  57. package/src/adapters/world.ts +535 -0
  58. package/src/byok.ts +7 -0
  59. package/src/generated/client/client.gen.ts +301 -0
  60. package/src/generated/client/index.ts +27 -0
  61. package/src/generated/client/types.gen.ts +247 -0
  62. package/src/generated/client/utils.gen.ts +332 -0
  63. package/src/generated/client.gen.ts +26 -0
  64. package/src/generated/client.ts +3 -0
  65. package/src/generated/core/auth.gen.ts +48 -0
  66. package/src/generated/core/bodySerializer.gen.ts +96 -0
  67. package/src/generated/core/params.gen.ts +186 -0
  68. package/src/generated/core/pathSerializer.gen.ts +186 -0
  69. package/src/generated/core/queryKeySerializer.gen.ts +139 -0
  70. package/src/generated/core/serverSentEvents.gen.ts +265 -0
  71. package/src/generated/core/types.gen.ts +124 -0
  72. package/src/generated/core/utils.gen.ts +146 -0
  73. package/src/generated/index.ts +113 -0
  74. package/src/generated/sdk.gen.ts +531 -0
  75. package/src/generated/types.gen.ts +1767 -0
  76. package/src/index.ts +20 -0
  77. package/src/model-meta.ts +79 -0
  78. package/src/utils/client.ts +50 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Tanner Linsley
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.
package/README.md CHANGED
@@ -1,5 +1,45 @@
1
+ <div align="center">
2
+ <picture>
3
+ <source
4
+ media="(prefers-color-scheme: dark)"
5
+ srcset="https://tanstack.com/api/readme/ai.png?theme=dark"
6
+ />
7
+ <source
8
+ media="(prefers-color-scheme: light)"
9
+ srcset="https://tanstack.com/api/readme/ai.png"
10
+ />
11
+ <img
12
+ src="https://tanstack.com/api/readme/ai.png"
13
+ alt="TanStack AI"
14
+ width="900"
15
+ />
16
+ </picture>
17
+ </div>
18
+
19
+ <br />
20
+
1
21
  # @tanstack/ai-worldlabs
2
22
 
3
- This version is a placeholder. It reserves the package name so trusted publishing can be set up. It contains no code.
23
+ World Labs adapter for TanStack AI world generation (Marble).
24
+
25
+ ## Installation
26
+
27
+ ```bash
28
+ npm install @tanstack/ai-worldlabs @tanstack/ai
29
+ ```
30
+
31
+ ## Usage
32
+
33
+ ```typescript
34
+ import { generateWorld } from '@tanstack/ai'
35
+ import { worldlabsWorld } from '@tanstack/ai-worldlabs'
36
+
37
+ const world = await generateWorld({
38
+ adapter: worldlabsWorld('marble-1.1'),
39
+ prompt: 'A mystical forest with glowing mushrooms',
40
+ })
41
+
42
+ // world.url is the Marble viewer URL. world.assets is optional splat/mesh links.
43
+ ```
4
44
 
5
- The first real release comes from the TanStack AI release workflow: https://github.com/TanStack/ai
45
+ Set `WORLDLABS_API_KEY`, or pass `apiKey` in the adapter config. See the [World Labs adapter docs](https://tanstack.com/ai/latest/docs/adapters/worldlabs).
@@ -0,0 +1,38 @@
1
+ import { BaseWorldAdapter } from '@tanstack/ai/adapters';
2
+ import { WorldGenerationOptions, WorldGenerationResult } from '@tanstack/ai';
3
+ import { WorldLabsWorldModel, WorldLabsWorldProviderOptions } from '../model-meta.js';
4
+ import { WorldLabsClientConfig } from '../utils/client.js';
5
+ export type { WorldLabsClientConfig };
6
+ /**
7
+ * World Labs Marble adapter. Starts a world generation job and, by default,
8
+ * polls until the world is ready. `modelOptions.wait === false` returns
9
+ * `operationId` at once. A later `generateWorld` call cannot resume that id.
10
+ *
11
+ * @example
12
+ * ```ts
13
+ * import { generateWorld } from '@tanstack/ai'
14
+ * import { worldlabsWorld } from '@tanstack/ai-worldlabs'
15
+ *
16
+ * const world = await generateWorld({
17
+ * adapter: worldlabsWorld('marble-1.1'),
18
+ * prompt: 'A mystical forest with glowing mushrooms',
19
+ * })
20
+ * ```
21
+ */
22
+ export declare class WorldLabsWorldAdapter<TModel extends WorldLabsWorldModel> extends BaseWorldAdapter<TModel, WorldLabsWorldProviderOptions> {
23
+ readonly name: "worldlabs";
24
+ private readonly client;
25
+ constructor(model: TModel, config?: WorldLabsClientConfig);
26
+ createWorld(options: WorldGenerationOptions<WorldLabsWorldProviderOptions>): Promise<WorldGenerationResult>;
27
+ private startGeneration;
28
+ private pollUntilDone;
29
+ }
30
+ /**
31
+ * Create a World Labs world adapter. Reads `WORLDLABS_API_KEY` when `apiKey`
32
+ * is omitted.
33
+ */
34
+ export declare function worldlabsWorld<TModel extends WorldLabsWorldModel>(model: TModel, config?: WorldLabsClientConfig): WorldLabsWorldAdapter<TModel>;
35
+ /**
36
+ * Create a World Labs world adapter with an explicit API key.
37
+ */
38
+ export declare function createWorldLabsWorld<TModel extends WorldLabsWorldModel>(model: TModel, apiKey: string, config?: Omit<WorldLabsClientConfig, 'apiKey'>): WorldLabsWorldAdapter<TModel>;
@@ -0,0 +1,314 @@
1
+ import { generateWorldMarbleV1WorldsGeneratePost, getOperationMarbleV1OperationsOperationIdGet } from "../generated/sdk.gen.js";
2
+ import { createWorldLabsClient, getWorldLabsApiKeyFromEnv } from "../utils/client.js";
3
+ import { BaseWorldAdapter } from "@tanstack/ai/adapters";
4
+ //#region src/adapters/world.ts
5
+ var DEFAULT_POLL_INTERVAL_MS = 2e3;
6
+ /**
7
+ * World Labs Marble adapter. Starts a world generation job and, by default,
8
+ * polls until the world is ready. `modelOptions.wait === false` returns
9
+ * `operationId` at once. A later `generateWorld` call cannot resume that id.
10
+ *
11
+ * @example
12
+ * ```ts
13
+ * import { generateWorld } from '@tanstack/ai'
14
+ * import { worldlabsWorld } from '@tanstack/ai-worldlabs'
15
+ *
16
+ * const world = await generateWorld({
17
+ * adapter: worldlabsWorld('marble-1.1'),
18
+ * prompt: 'A mystical forest with glowing mushrooms',
19
+ * })
20
+ * ```
21
+ */
22
+ var WorldLabsWorldAdapter = class extends BaseWorldAdapter {
23
+ name = "worldlabs";
24
+ client;
25
+ constructor(model, config = {}) {
26
+ super(model, {});
27
+ this.client = createWorldLabsClient(config).client;
28
+ }
29
+ async createWorld(options) {
30
+ const { logger, prompt, abortSignal, modelOptions } = options;
31
+ logger.request(`activity=generateWorld provider=worldlabs model=${this.model}`, {
32
+ provider: "worldlabs",
33
+ model: this.model
34
+ });
35
+ try {
36
+ const started = await this.startGeneration({
37
+ prompt,
38
+ modelOptions,
39
+ abortSignal
40
+ });
41
+ requireOperationId(started);
42
+ if (started.done || started.error) return logWorldResult(logger, this.model, completedResult({
43
+ prompt,
44
+ model: this.model,
45
+ operation: started
46
+ }));
47
+ if (modelOptions?.wait === false) return logWorldResult(logger, this.model, pendingResult({
48
+ prompt,
49
+ model: this.model,
50
+ operation: started
51
+ }));
52
+ const finished = await this.pollUntilDone({
53
+ operationId: started.operation_id,
54
+ abortSignal,
55
+ pollIntervalMs: modelOptions?.pollIntervalMs
56
+ });
57
+ return logWorldResult(logger, this.model, completedResult({
58
+ prompt,
59
+ model: this.model,
60
+ operation: finished
61
+ }));
62
+ } catch (error) {
63
+ if (!isAbortError(error)) logger.errors("worldlabs.createWorld failed", {
64
+ error,
65
+ source: "worldlabs.createWorld"
66
+ });
67
+ throw error;
68
+ }
69
+ }
70
+ async startGeneration(args) {
71
+ const body = {
72
+ model: this.model,
73
+ world_prompt: buildWorldPrompt(args.prompt, args.modelOptions)
74
+ };
75
+ if (args.modelOptions?.displayName !== void 0) body.display_name = args.modelOptions.displayName;
76
+ if (args.modelOptions?.seed !== void 0) body.seed = args.modelOptions.seed;
77
+ if (args.modelOptions?.tags !== void 0) body.tags = args.modelOptions.tags;
78
+ if (args.modelOptions?.permission !== void 0) body.permission = args.modelOptions.permission;
79
+ const result = await generateWorldMarbleV1WorldsGeneratePost({
80
+ client: this.client,
81
+ body,
82
+ ...args.abortSignal ? { signal: args.abortSignal } : {}
83
+ });
84
+ if (result.error || !result.data) throw worldLabsRequestError("World Labs generate request failed", result.response, result.error);
85
+ return result.data;
86
+ }
87
+ async pollUntilDone(args) {
88
+ const interval = args.pollIntervalMs && args.pollIntervalMs > 0 ? args.pollIntervalMs : DEFAULT_POLL_INTERVAL_MS;
89
+ for (;;) {
90
+ await sleep(interval, args.abortSignal);
91
+ const result = await getOperationMarbleV1OperationsOperationIdGet({
92
+ client: this.client,
93
+ path: { operation_id: args.operationId },
94
+ ...args.abortSignal ? { signal: args.abortSignal } : {}
95
+ });
96
+ if (result.error || !result.data) throw worldLabsRequestError("World Labs operation poll failed", result.response, result.error);
97
+ if (typeof result.data.done !== "boolean") throw new Error(`World Labs operation ${args.operationId} returned an invalid poll payload.`);
98
+ if (result.data.done) return result.data;
99
+ }
100
+ }
101
+ };
102
+ /**
103
+ * Create a World Labs world adapter. Reads `WORLDLABS_API_KEY` when `apiKey`
104
+ * is omitted.
105
+ */
106
+ function worldlabsWorld(model, config) {
107
+ return createWorldLabsWorld(model, config?.apiKey ?? getWorldLabsApiKeyFromEnv(), config);
108
+ }
109
+ /**
110
+ * Create a World Labs world adapter with an explicit API key.
111
+ */
112
+ function createWorldLabsWorld(model, apiKey, config) {
113
+ return new WorldLabsWorldAdapter(model, {
114
+ ...config,
115
+ apiKey
116
+ });
117
+ }
118
+ function buildWorldPrompt(prompt, options) {
119
+ if ([
120
+ options?.image,
121
+ options?.images,
122
+ options?.video
123
+ ].filter(Boolean).length > 1) throw new Error("World Labs: pass only one of modelOptions.image, modelOptions.images, or modelOptions.video.");
124
+ const textPrompt = prompt.trim().length > 0 ? prompt : void 0;
125
+ const shared = {
126
+ ...textPrompt !== void 0 ? { text_prompt: textPrompt } : {},
127
+ ...options?.disableRecaption !== void 0 ? { disable_recaption: options.disableRecaption } : {}
128
+ };
129
+ if (options?.image) return {
130
+ type: "image",
131
+ image_prompt: toContentRef(options.image),
132
+ ...shared,
133
+ ...options.isPano !== void 0 ? { is_pano: options.isPano } : {}
134
+ };
135
+ if (options?.images) return {
136
+ type: "multi-image",
137
+ multi_image_prompt: options.images.map((image) => ({
138
+ content: toContentRef(image),
139
+ ...image.azimuth !== void 0 ? { azimuth: image.azimuth } : {}
140
+ })),
141
+ ...shared
142
+ };
143
+ if (options?.video) return {
144
+ type: "video",
145
+ video_prompt: toContentRef(options.video),
146
+ ...shared
147
+ };
148
+ return {
149
+ type: "text",
150
+ text_prompt: prompt,
151
+ ...options?.disableRecaption !== void 0 ? { disable_recaption: options.disableRecaption } : {}
152
+ };
153
+ }
154
+ function toContentRef(ref) {
155
+ if ([
156
+ ref.uri,
157
+ ref.mediaAssetId,
158
+ ref.dataBase64
159
+ ].filter((value) => typeof value === "string" && value.length > 0).length !== 1) throw new Error("World Labs media ref needs exactly one of uri, mediaAssetId, or dataBase64.");
160
+ if (ref.uri) return {
161
+ source: "uri",
162
+ uri: ref.uri
163
+ };
164
+ if (ref.mediaAssetId) return {
165
+ source: "media_asset",
166
+ media_asset_id: ref.mediaAssetId
167
+ };
168
+ if (!ref.dataBase64) throw new Error("World Labs media ref needs exactly one of uri, mediaAssetId, or dataBase64.");
169
+ return {
170
+ source: "data_base64",
171
+ data_base64: ref.dataBase64,
172
+ ...ref.extension !== void 0 ? { extension: ref.extension } : {}
173
+ };
174
+ }
175
+ function pendingResult(args) {
176
+ const expiresAt = expiresAtMs(args.operation.expires_at);
177
+ return {
178
+ id: args.operation.operation_id,
179
+ model: args.model,
180
+ prompt: args.prompt,
181
+ status: "waiting",
182
+ operationId: args.operation.operation_id,
183
+ worldId: worldIdFromMetadata(args.operation.metadata),
184
+ ...expiresAt !== void 0 ? { expiresAt } : {}
185
+ };
186
+ }
187
+ function completedResult(args) {
188
+ if (args.operation.error) {
189
+ const raw = args.operation.error.message?.trim();
190
+ const code = args.operation.error.code;
191
+ throw new Error(raw || `World Labs operation failed${code != null ? ` (code ${code})` : ""}`);
192
+ }
193
+ const world = worldFromResponse(args.operation.response);
194
+ if (!world) throw new Error(`World Labs operation ${args.operation.operation_id} completed without a world.`);
195
+ const assets = mapAssets(world.assets);
196
+ const expiresAt = expiresAtMs(args.operation.expires_at);
197
+ return {
198
+ id: world.world_id,
199
+ model: world.model ?? args.model,
200
+ prompt: args.prompt,
201
+ status: "ready",
202
+ url: world.world_marble_url,
203
+ worldId: world.world_id,
204
+ operationId: args.operation.operation_id,
205
+ ...assets ? { assets } : {},
206
+ ...expiresAt !== void 0 ? { expiresAt } : {}
207
+ };
208
+ }
209
+ function worldFromResponse(response) {
210
+ if (!response || typeof response !== "object") return void 0;
211
+ if (!("world_id" in response) || !("world_marble_url" in response)) return;
212
+ const worldId = response.world_id;
213
+ const url = response.world_marble_url;
214
+ if (typeof worldId !== "string" || worldId.length === 0) return void 0;
215
+ if (typeof url !== "string" || url.length === 0) return void 0;
216
+ return response;
217
+ }
218
+ function requireOperationId(data) {
219
+ if (typeof data.operation_id !== "string" || data.operation_id.length === 0) throw new Error("World Labs generate request failed: missing operation_id");
220
+ }
221
+ function logWorldResult(logger, model, result) {
222
+ logger.output(`activity=generateWorld provider=worldlabs model=${model}`, {
223
+ model,
224
+ status: result.status
225
+ });
226
+ return result;
227
+ }
228
+ function isAbortError(error) {
229
+ return error instanceof Error && (error.name === "AbortError" || error.message === "The operation was aborted");
230
+ }
231
+ function worldIdFromMetadata(metadata) {
232
+ if (!metadata || typeof metadata !== "object") return void 0;
233
+ const worldId = metadata.world_id;
234
+ return typeof worldId === "string" && worldId.length > 0 ? worldId : void 0;
235
+ }
236
+ function nonEmpty(value) {
237
+ return Object.keys(value).length > 0 ? value : void 0;
238
+ }
239
+ function mapAssets(assets) {
240
+ if (!assets) return void 0;
241
+ const splats = mapSplatAssets(assets.splats);
242
+ const mesh = mapMeshAssets(assets.mesh);
243
+ return nonEmpty({
244
+ ...assets.caption ? { caption: assets.caption } : {},
245
+ ...assets.thumbnail_url ? { thumbnailUrl: assets.thumbnail_url } : {},
246
+ ...splats ? { splats } : {},
247
+ ...mesh ? { mesh } : {},
248
+ ...assets.imagery?.pano_url ? { imagery: { panoUrl: assets.imagery.pano_url } } : {}
249
+ });
250
+ }
251
+ function mapSplatAssets(splats) {
252
+ if (!splats) return void 0;
253
+ return nonEmpty({
254
+ ...splats.spz_urls && Object.keys(splats.spz_urls).length > 0 ? { spzUrls: splats.spz_urls } : {},
255
+ ...splats.semantics_metadata?.metric_scale_factor != null ? { metricScaleFactor: splats.semantics_metadata.metric_scale_factor } : {},
256
+ ...splats.semantics_metadata?.ground_plane_offset != null ? { groundPlaneOffset: splats.semantics_metadata.ground_plane_offset } : {}
257
+ });
258
+ }
259
+ function mapMeshAssets(mesh) {
260
+ if (!mesh) return void 0;
261
+ return nonEmpty({
262
+ ...mesh.collider_mesh_url ? { colliderMeshUrl: mesh.collider_mesh_url } : {},
263
+ ...mesh.hq_mesh_url ? { hqMeshUrl: mesh.hq_mesh_url } : {},
264
+ ...mesh.full_res_mesh_url ? { fullResMeshUrl: mesh.full_res_mesh_url } : {}
265
+ });
266
+ }
267
+ function expiresAtMs(value) {
268
+ if (!value) return void 0;
269
+ const parsed = Date.parse(value);
270
+ return Number.isFinite(parsed) ? parsed : void 0;
271
+ }
272
+ function worldLabsRequestError(prefix, response, error) {
273
+ const status = response ? `${response.status}${response.statusText ? ` ${response.statusText}` : ""}` : void 0;
274
+ const detail = errorDetail(error);
275
+ return /* @__PURE__ */ new Error(`${prefix}${status ? ` (${status})` : ""}${detail ? `: ${detail}` : ""}`);
276
+ }
277
+ function errorDetail(error) {
278
+ if (typeof error === "string" && error.length > 0) return error;
279
+ if (typeof error === "object" && error !== null) {
280
+ const record = error;
281
+ if (typeof record.detail === "string" && record.detail.length > 0) return record.detail;
282
+ if (typeof record.message === "string" && record.message.length > 0) return record.message;
283
+ try {
284
+ return JSON.stringify(error);
285
+ } catch {
286
+ return;
287
+ }
288
+ }
289
+ }
290
+ function sleep(ms, signal) {
291
+ if (!signal) return new Promise((resolve) => setTimeout(resolve, ms));
292
+ if (signal.aborted) return Promise.reject(abortError(signal));
293
+ return new Promise((resolve, reject) => {
294
+ const timer = setTimeout(() => {
295
+ signal.removeEventListener("abort", onAbort);
296
+ resolve();
297
+ }, ms);
298
+ const onAbort = () => {
299
+ clearTimeout(timer);
300
+ reject(abortError(signal));
301
+ };
302
+ signal.addEventListener("abort", onAbort, { once: true });
303
+ });
304
+ }
305
+ function abortError(signal) {
306
+ if (signal?.reason instanceof Error) return signal.reason;
307
+ const error = /* @__PURE__ */ new Error("The operation was aborted");
308
+ error.name = "AbortError";
309
+ return error;
310
+ }
311
+ //#endregion
312
+ export { WorldLabsWorldAdapter, createWorldLabsWorld, worldlabsWorld };
313
+
314
+ //# sourceMappingURL=world.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"world.js","names":[],"sources":["../../../src/adapters/world.ts"],"sourcesContent":["import { BaseWorldAdapter } from '@tanstack/ai/adapters'\nimport {\n generateWorldMarbleV1WorldsGeneratePost,\n getOperationMarbleV1OperationsOperationIdGet,\n} from '../generated/sdk.gen'\nimport {\n createWorldLabsClient,\n getWorldLabsApiKeyFromEnv,\n} from '../utils/client'\nimport type {\n WorldGenerationAssets,\n WorldGenerationOptions,\n WorldGenerationResult,\n} from '@tanstack/ai'\nimport type { Client } from '../generated/client'\nimport type {\n GenerateWorldResponse,\n GetOperationResponseUnionWorldPanoDepthToRgbResultExportWorldResult,\n World,\n WorldsGenerateRequest,\n} from '../generated/types.gen'\nimport type {\n WorldLabsMediaRef,\n WorldLabsWorldModel,\n WorldLabsWorldProviderOptions,\n} from '../model-meta'\nimport type { WorldLabsClientConfig } from '../utils/client'\n\nexport type { WorldLabsClientConfig }\n\ntype WorldOperation =\n | GenerateWorldResponse\n | GetOperationResponseUnionWorldPanoDepthToRgbResultExportWorldResult\n\nconst DEFAULT_POLL_INTERVAL_MS = 2_000\n\n/**\n * World Labs Marble adapter. Starts a world generation job and, by default,\n * polls until the world is ready. `modelOptions.wait === false` returns\n * `operationId` at once. A later `generateWorld` call cannot resume that id.\n *\n * @example\n * ```ts\n * import { generateWorld } from '@tanstack/ai'\n * import { worldlabsWorld } from '@tanstack/ai-worldlabs'\n *\n * const world = await generateWorld({\n * adapter: worldlabsWorld('marble-1.1'),\n * prompt: 'A mystical forest with glowing mushrooms',\n * })\n * ```\n */\nexport class WorldLabsWorldAdapter<\n TModel extends WorldLabsWorldModel,\n> extends BaseWorldAdapter<TModel, WorldLabsWorldProviderOptions> {\n readonly name = 'worldlabs' as const\n private readonly client: Client\n\n constructor(model: TModel, config: WorldLabsClientConfig = {}) {\n super(model, {})\n this.client = createWorldLabsClient(config).client\n }\n\n async createWorld(\n options: WorldGenerationOptions<WorldLabsWorldProviderOptions>,\n ): Promise<WorldGenerationResult> {\n const { logger, prompt, abortSignal, modelOptions } = options\n\n logger.request(\n `activity=generateWorld provider=worldlabs model=${this.model}`,\n { provider: 'worldlabs', model: this.model },\n )\n\n try {\n const started = await this.startGeneration({\n prompt,\n modelOptions,\n abortSignal,\n })\n requireOperationId(started)\n\n if (started.done || started.error) {\n return logWorldResult(\n logger,\n this.model,\n completedResult({\n prompt,\n model: this.model,\n operation: started,\n }),\n )\n }\n\n if (modelOptions?.wait === false) {\n return logWorldResult(\n logger,\n this.model,\n pendingResult({\n prompt,\n model: this.model,\n operation: started,\n }),\n )\n }\n\n const finished = await this.pollUntilDone({\n operationId: started.operation_id,\n abortSignal,\n pollIntervalMs: modelOptions?.pollIntervalMs,\n })\n return logWorldResult(\n logger,\n this.model,\n completedResult({\n prompt,\n model: this.model,\n operation: finished,\n }),\n )\n } catch (error) {\n if (!isAbortError(error)) {\n logger.errors('worldlabs.createWorld failed', {\n error,\n source: 'worldlabs.createWorld',\n })\n }\n throw error\n }\n }\n\n private async startGeneration(args: {\n prompt: string\n modelOptions?: WorldLabsWorldProviderOptions\n abortSignal?: AbortSignal\n }): Promise<GenerateWorldResponse> {\n const body: WorldsGenerateRequest = {\n model: this.model,\n world_prompt: buildWorldPrompt(args.prompt, args.modelOptions),\n }\n if (args.modelOptions?.displayName !== undefined) {\n body.display_name = args.modelOptions.displayName\n }\n if (args.modelOptions?.seed !== undefined) {\n body.seed = args.modelOptions.seed\n }\n if (args.modelOptions?.tags !== undefined) {\n body.tags = args.modelOptions.tags\n }\n if (args.modelOptions?.permission !== undefined) {\n body.permission = args.modelOptions.permission\n }\n\n const result = await generateWorldMarbleV1WorldsGeneratePost({\n client: this.client,\n body,\n ...(args.abortSignal ? { signal: args.abortSignal } : {}),\n })\n\n if (result.error || !result.data) {\n throw worldLabsRequestError(\n 'World Labs generate request failed',\n result.response,\n result.error,\n )\n }\n\n return result.data\n }\n\n private async pollUntilDone(args: {\n operationId: string\n abortSignal?: AbortSignal\n pollIntervalMs?: number\n }): Promise<WorldOperation> {\n const interval =\n args.pollIntervalMs && args.pollIntervalMs > 0\n ? args.pollIntervalMs\n : DEFAULT_POLL_INTERVAL_MS\n\n for (;;) {\n await sleep(interval, args.abortSignal)\n const result = await getOperationMarbleV1OperationsOperationIdGet({\n client: this.client,\n path: { operation_id: args.operationId },\n ...(args.abortSignal ? { signal: args.abortSignal } : {}),\n })\n\n if (result.error || !result.data) {\n throw worldLabsRequestError(\n 'World Labs operation poll failed',\n result.response,\n result.error,\n )\n }\n\n if (typeof result.data.done !== 'boolean') {\n throw new Error(\n `World Labs operation ${args.operationId} returned an invalid poll payload.`,\n )\n }\n\n if (result.data.done) {\n return result.data\n }\n }\n }\n}\n\n/**\n * Create a World Labs world adapter. Reads `WORLDLABS_API_KEY` when `apiKey`\n * is omitted.\n */\nexport function worldlabsWorld<TModel extends WorldLabsWorldModel>(\n model: TModel,\n config?: WorldLabsClientConfig,\n): WorldLabsWorldAdapter<TModel> {\n const apiKey = config?.apiKey ?? getWorldLabsApiKeyFromEnv()\n return createWorldLabsWorld(model, apiKey, config)\n}\n\n/**\n * Create a World Labs world adapter with an explicit API key.\n */\nexport function createWorldLabsWorld<TModel extends WorldLabsWorldModel>(\n model: TModel,\n apiKey: string,\n config?: Omit<WorldLabsClientConfig, 'apiKey'>,\n): WorldLabsWorldAdapter<TModel> {\n return new WorldLabsWorldAdapter(model, { ...config, apiKey })\n}\n\nfunction buildWorldPrompt(\n prompt: string,\n options?: WorldLabsWorldProviderOptions,\n): WorldsGenerateRequest['world_prompt'] {\n if (\n [options?.image, options?.images, options?.video].filter(Boolean).length > 1\n ) {\n throw new Error(\n 'World Labs: pass only one of modelOptions.image, modelOptions.images, or modelOptions.video.',\n )\n }\n\n const textPrompt = prompt.trim().length > 0 ? prompt : undefined\n const shared = {\n ...(textPrompt !== undefined ? { text_prompt: textPrompt } : {}),\n ...(options?.disableRecaption !== undefined\n ? { disable_recaption: options.disableRecaption }\n : {}),\n }\n\n if (options?.image) {\n return {\n type: 'image',\n image_prompt: toContentRef(options.image),\n ...shared,\n ...(options.isPano !== undefined ? { is_pano: options.isPano } : {}),\n }\n }\n\n if (options?.images) {\n return {\n type: 'multi-image',\n multi_image_prompt: options.images.map((image) => ({\n content: toContentRef(image),\n ...(image.azimuth !== undefined ? { azimuth: image.azimuth } : {}),\n })),\n ...shared,\n }\n }\n\n if (options?.video) {\n return {\n type: 'video',\n video_prompt: toContentRef(options.video),\n ...shared,\n }\n }\n\n return {\n type: 'text',\n text_prompt: prompt,\n ...(options?.disableRecaption !== undefined\n ? { disable_recaption: options.disableRecaption }\n : {}),\n }\n}\n\nfunction toContentRef(\n ref: WorldLabsMediaRef,\n):\n | { source: 'uri'; uri: string }\n | { source: 'media_asset'; media_asset_id: string }\n | { source: 'data_base64'; data_base64: string; extension?: string } {\n const fields = [ref.uri, ref.mediaAssetId, ref.dataBase64].filter(\n (value) => typeof value === 'string' && value.length > 0,\n )\n if (fields.length !== 1) {\n throw new Error(\n 'World Labs media ref needs exactly one of uri, mediaAssetId, or dataBase64.',\n )\n }\n if (ref.uri) return { source: 'uri', uri: ref.uri }\n if (ref.mediaAssetId) {\n return { source: 'media_asset', media_asset_id: ref.mediaAssetId }\n }\n if (!ref.dataBase64) {\n throw new Error(\n 'World Labs media ref needs exactly one of uri, mediaAssetId, or dataBase64.',\n )\n }\n return {\n source: 'data_base64',\n data_base64: ref.dataBase64,\n ...(ref.extension !== undefined ? { extension: ref.extension } : {}),\n }\n}\n\nfunction pendingResult(args: {\n prompt: string\n model: string\n operation: GenerateWorldResponse\n}): WorldGenerationResult {\n const expiresAt = expiresAtMs(args.operation.expires_at)\n return {\n id: args.operation.operation_id,\n model: args.model,\n prompt: args.prompt,\n status: 'waiting',\n operationId: args.operation.operation_id,\n worldId: worldIdFromMetadata(args.operation.metadata),\n ...(expiresAt !== undefined ? { expiresAt } : {}),\n }\n}\n\nfunction completedResult(args: {\n prompt: string\n model: string\n operation: WorldOperation\n}): WorldGenerationResult {\n if (args.operation.error) {\n const raw = args.operation.error.message?.trim()\n const code = args.operation.error.code\n throw new Error(\n raw ||\n `World Labs operation failed${code != null ? ` (code ${code})` : ''}`,\n )\n }\n\n const world = worldFromResponse(args.operation.response)\n if (!world) {\n throw new Error(\n `World Labs operation ${args.operation.operation_id} completed without a world.`,\n )\n }\n\n const assets = mapAssets(world.assets)\n const expiresAt = expiresAtMs(args.operation.expires_at)\n return {\n id: world.world_id,\n model: world.model ?? args.model,\n prompt: args.prompt,\n status: 'ready',\n url: world.world_marble_url,\n worldId: world.world_id,\n operationId: args.operation.operation_id,\n ...(assets ? { assets } : {}),\n ...(expiresAt !== undefined ? { expiresAt } : {}),\n }\n}\n\nfunction worldFromResponse(\n response: WorldOperation['response'],\n): World | undefined {\n if (!response || typeof response !== 'object') return undefined\n if (!('world_id' in response) || !('world_marble_url' in response)) {\n return undefined\n }\n const worldId = response.world_id\n const url = response.world_marble_url\n if (typeof worldId !== 'string' || worldId.length === 0) return undefined\n if (typeof url !== 'string' || url.length === 0) return undefined\n return response as World\n}\n\nfunction requireOperationId(data: GenerateWorldResponse): void {\n if (typeof data.operation_id !== 'string' || data.operation_id.length === 0) {\n throw new Error('World Labs generate request failed: missing operation_id')\n }\n}\n\nfunction logWorldResult(\n logger: WorldGenerationOptions['logger'],\n model: string,\n result: WorldGenerationResult,\n): WorldGenerationResult {\n logger.output(`activity=generateWorld provider=worldlabs model=${model}`, {\n model,\n status: result.status,\n })\n return result\n}\n\nfunction isAbortError(error: unknown): boolean {\n return (\n error instanceof Error &&\n (error.name === 'AbortError' ||\n error.message === 'The operation was aborted')\n )\n}\n\nfunction worldIdFromMetadata(\n metadata: GenerateWorldResponse['metadata'],\n): string | undefined {\n if (!metadata || typeof metadata !== 'object') return undefined\n const worldId = metadata.world_id\n return typeof worldId === 'string' && worldId.length > 0 ? worldId : undefined\n}\n\nfunction nonEmpty<T extends object>(value: T): T | undefined {\n return Object.keys(value).length > 0 ? value : undefined\n}\n\nfunction mapAssets(assets: World['assets']): WorldGenerationAssets | undefined {\n if (!assets) return undefined\n const splats = mapSplatAssets(assets.splats)\n const mesh = mapMeshAssets(assets.mesh)\n return nonEmpty({\n ...(assets.caption ? { caption: assets.caption } : {}),\n ...(assets.thumbnail_url ? { thumbnailUrl: assets.thumbnail_url } : {}),\n ...(splats ? { splats } : {}),\n ...(mesh ? { mesh } : {}),\n ...(assets.imagery?.pano_url\n ? { imagery: { panoUrl: assets.imagery.pano_url } }\n : {}),\n })\n}\n\nfunction mapSplatAssets(\n splats: NonNullable<World['assets']>['splats'],\n): WorldGenerationAssets['splats'] | undefined {\n if (!splats) return undefined\n return nonEmpty({\n ...(splats.spz_urls && Object.keys(splats.spz_urls).length > 0\n ? { spzUrls: splats.spz_urls }\n : {}),\n ...(splats.semantics_metadata?.metric_scale_factor != null\n ? { metricScaleFactor: splats.semantics_metadata.metric_scale_factor }\n : {}),\n ...(splats.semantics_metadata?.ground_plane_offset != null\n ? { groundPlaneOffset: splats.semantics_metadata.ground_plane_offset }\n : {}),\n })\n}\n\nfunction mapMeshAssets(\n mesh: NonNullable<World['assets']>['mesh'],\n): WorldGenerationAssets['mesh'] | undefined {\n if (!mesh) return undefined\n return nonEmpty({\n ...(mesh.collider_mesh_url\n ? { colliderMeshUrl: mesh.collider_mesh_url }\n : {}),\n ...(mesh.hq_mesh_url ? { hqMeshUrl: mesh.hq_mesh_url } : {}),\n ...(mesh.full_res_mesh_url\n ? { fullResMeshUrl: mesh.full_res_mesh_url }\n : {}),\n })\n}\n\nfunction expiresAtMs(value: string | null | undefined): number | undefined {\n if (!value) return undefined\n const parsed = Date.parse(value)\n return Number.isFinite(parsed) ? parsed : undefined\n}\n\nfunction worldLabsRequestError(\n prefix: string,\n response: Response | undefined,\n error: unknown,\n): Error {\n const status = response\n ? `${response.status}${response.statusText ? ` ${response.statusText}` : ''}`\n : undefined\n const detail = errorDetail(error)\n return new Error(\n `${prefix}${status ? ` (${status})` : ''}${detail ? `: ${detail}` : ''}`,\n )\n}\n\nfunction errorDetail(error: unknown): string | undefined {\n if (typeof error === 'string' && error.length > 0) return error\n if (typeof error === 'object' && error !== null) {\n const record = error as { detail?: unknown; message?: unknown }\n if (typeof record.detail === 'string' && record.detail.length > 0) {\n return record.detail\n }\n if (typeof record.message === 'string' && record.message.length > 0) {\n return record.message\n }\n try {\n return JSON.stringify(error)\n } catch {\n return undefined\n }\n }\n return undefined\n}\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n if (!signal) {\n return new Promise((resolve) => setTimeout(resolve, ms))\n }\n if (signal.aborted) {\n return Promise.reject(abortError(signal))\n }\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n signal.removeEventListener('abort', onAbort)\n resolve()\n }, ms)\n const onAbort = () => {\n clearTimeout(timer)\n reject(abortError(signal))\n }\n signal.addEventListener('abort', onAbort, { once: true })\n })\n}\n\nfunction abortError(signal?: AbortSignal): Error {\n if (signal?.reason instanceof Error) return signal.reason\n const error = new Error('The operation was aborted')\n error.name = 'AbortError'\n return error\n}\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare const worldlabsByok: import('@tanstack/ai/byok').ByokProvider<"worldlabs">;
@@ -0,0 +1,11 @@
1
+ import { defineByokProvider } from "@tanstack/ai/byok";
2
+ //#region src/byok.ts
3
+ var worldlabsByok = defineByokProvider({
4
+ id: "worldlabs",
5
+ label: "World Labs",
6
+ env: "WORLDLABS_API_KEY"
7
+ });
8
+ //#endregion
9
+ export { worldlabsByok };
10
+
11
+ //# sourceMappingURL=byok.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"byok.js","names":[],"sources":["../../src/byok.ts"],"sourcesContent":["import { defineByokProvider } from '@tanstack/ai/byok'\n\nexport const worldlabsByok = defineByokProvider({\n id: 'worldlabs',\n label: 'World Labs',\n env: 'WORLDLABS_API_KEY',\n})\n"],"mappings":";;AAEA,IAAa,gBAAgB,mBAAmB;CAC9C,IAAI;CACJ,OAAO;CACP,KAAK;AACP,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { Client, Config } from './types.gen';
2
+ export declare const createClient: (config?: Config) => Client;
@@ -0,0 +1,174 @@
1
+ import { createSseClient } from "../core/serverSentEvents.gen.js";
2
+ import { getValidRequestBody } from "../core/utils.gen.js";
3
+ import { buildUrl, createConfig, createInterceptors, getParseAs, mergeConfigs, mergeHeaders, setAuthParams } from "./utils.gen.js";
4
+ //#region src/generated/client/client.gen.ts
5
+ var createClient = (config = {}) => {
6
+ let _config = mergeConfigs(createConfig(), config);
7
+ const getConfig = () => ({ ..._config });
8
+ const setConfig = (config) => {
9
+ _config = mergeConfigs(_config, config);
10
+ return getConfig();
11
+ };
12
+ const interceptors = createInterceptors();
13
+ const beforeRequest = async (options) => {
14
+ const opts = {
15
+ ..._config,
16
+ ...options,
17
+ fetch: options.fetch ?? _config.fetch ?? globalThis.fetch,
18
+ headers: mergeHeaders(_config.headers, options.headers),
19
+ serializedBody: void 0
20
+ };
21
+ if (opts.security) await setAuthParams(opts);
22
+ if (opts.requestValidator) await opts.requestValidator(opts);
23
+ if (opts.body !== void 0 && opts.bodySerializer) opts.serializedBody = opts.bodySerializer(opts.body);
24
+ if (opts.body === void 0 || opts.serializedBody === "") opts.headers.delete("Content-Type");
25
+ const resolvedOpts = opts;
26
+ return {
27
+ opts: resolvedOpts,
28
+ url: buildUrl(resolvedOpts)
29
+ };
30
+ };
31
+ const request = async (options) => {
32
+ const throwOnError = options.throwOnError ?? _config.throwOnError;
33
+ const responseStyle = options.responseStyle ?? _config.responseStyle;
34
+ let request;
35
+ let response;
36
+ try {
37
+ const { opts, url } = await beforeRequest(options);
38
+ const requestInit = {
39
+ redirect: "follow",
40
+ ...opts,
41
+ body: getValidRequestBody(opts)
42
+ };
43
+ request = new Request(url, requestInit);
44
+ for (const fn of interceptors.request.fns) if (fn) request = await fn(request, opts);
45
+ const _fetch = opts.fetch;
46
+ response = await _fetch(request);
47
+ for (const fn of interceptors.response.fns) if (fn) response = await fn(response, request, opts);
48
+ const result = {
49
+ request,
50
+ response
51
+ };
52
+ if (response.ok) {
53
+ const parseAs = (opts.parseAs === "auto" ? getParseAs(response.headers.get("Content-Type")) : opts.parseAs) ?? "json";
54
+ if (response.status === 204 || response.headers.get("Content-Length") === "0") {
55
+ let emptyData;
56
+ switch (parseAs) {
57
+ case "arrayBuffer":
58
+ case "blob":
59
+ case "text":
60
+ emptyData = await response[parseAs]();
61
+ break;
62
+ case "formData":
63
+ emptyData = new FormData();
64
+ break;
65
+ case "stream":
66
+ emptyData = response.body;
67
+ break;
68
+ default: emptyData = {};
69
+ }
70
+ return opts.responseStyle === "data" ? emptyData : {
71
+ data: emptyData,
72
+ ...result
73
+ };
74
+ }
75
+ let data;
76
+ switch (parseAs) {
77
+ case "arrayBuffer":
78
+ case "blob":
79
+ case "formData":
80
+ case "text":
81
+ data = await response[parseAs]();
82
+ break;
83
+ case "json": {
84
+ const text = await response.text();
85
+ data = text ? JSON.parse(text) : {};
86
+ break;
87
+ }
88
+ case "stream": return opts.responseStyle === "data" ? response.body : {
89
+ data: response.body,
90
+ ...result
91
+ };
92
+ }
93
+ if (parseAs === "json") {
94
+ if (opts.responseValidator) await opts.responseValidator(data);
95
+ if (opts.responseTransformer) data = await opts.responseTransformer(data);
96
+ }
97
+ return opts.responseStyle === "data" ? data : {
98
+ data,
99
+ ...result
100
+ };
101
+ }
102
+ const textError = await response.text();
103
+ let jsonError;
104
+ try {
105
+ jsonError = JSON.parse(textError);
106
+ } catch {}
107
+ throw jsonError ?? textError;
108
+ } catch (error) {
109
+ let finalError = error;
110
+ for (const fn of interceptors.error.fns) if (fn) finalError = await fn(finalError, response, request, options);
111
+ finalError = finalError || {};
112
+ if (throwOnError) throw finalError;
113
+ return responseStyle === "data" ? void 0 : {
114
+ error: finalError,
115
+ request,
116
+ response
117
+ };
118
+ }
119
+ };
120
+ const makeMethodFn = (method) => (options) => request({
121
+ ...options,
122
+ method
123
+ });
124
+ const makeSseFn = (method) => async (options) => {
125
+ const { opts, url } = await beforeRequest(options);
126
+ return createSseClient({
127
+ ...opts,
128
+ body: opts.body,
129
+ method,
130
+ onRequest: async (url, init) => {
131
+ let request = new Request(url, init);
132
+ for (const fn of interceptors.request.fns) if (fn) request = await fn(request, opts);
133
+ return request;
134
+ },
135
+ serializedBody: getValidRequestBody(opts),
136
+ url
137
+ });
138
+ };
139
+ const _buildUrl = (options) => buildUrl({
140
+ ..._config,
141
+ ...options
142
+ });
143
+ return {
144
+ buildUrl: _buildUrl,
145
+ connect: makeMethodFn("CONNECT"),
146
+ delete: makeMethodFn("DELETE"),
147
+ get: makeMethodFn("GET"),
148
+ getConfig,
149
+ head: makeMethodFn("HEAD"),
150
+ interceptors,
151
+ options: makeMethodFn("OPTIONS"),
152
+ patch: makeMethodFn("PATCH"),
153
+ post: makeMethodFn("POST"),
154
+ put: makeMethodFn("PUT"),
155
+ request,
156
+ setConfig,
157
+ sse: {
158
+ connect: makeSseFn("CONNECT"),
159
+ delete: makeSseFn("DELETE"),
160
+ get: makeSseFn("GET"),
161
+ head: makeSseFn("HEAD"),
162
+ options: makeSseFn("OPTIONS"),
163
+ patch: makeSseFn("PATCH"),
164
+ post: makeSseFn("POST"),
165
+ put: makeSseFn("PUT"),
166
+ trace: makeSseFn("TRACE")
167
+ },
168
+ trace: makeMethodFn("TRACE")
169
+ };
170
+ };
171
+ //#endregion
172
+ export { createClient };
173
+
174
+ //# sourceMappingURL=client.gen.js.map