@perstack/api-client 0.0.34 → 0.0.36

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js ADDED
@@ -0,0 +1,957 @@
1
+ import { z } from 'zod';
2
+
3
+ // src/fetcher.ts
4
+ var DEFAULT_BASE_URL = "https://api.perstack.ai";
5
+ var DEFAULT_TIMEOUT = 3e4;
6
+ function createAbortError() {
7
+ return {
8
+ code: 0,
9
+ message: "Request aborted",
10
+ aborted: true
11
+ };
12
+ }
13
+ function createNetworkError(error) {
14
+ return {
15
+ code: 0,
16
+ message: error instanceof Error ? error.message : "Network error",
17
+ reason: error
18
+ };
19
+ }
20
+ function createHttpError(status, statusText, body) {
21
+ if (typeof body === "object" && body !== null) {
22
+ const errorBody = body;
23
+ return {
24
+ code: status,
25
+ message: errorBody.error ?? statusText,
26
+ reason: errorBody.reason
27
+ };
28
+ }
29
+ return {
30
+ code: status,
31
+ message: statusText
32
+ };
33
+ }
34
+ function createValidationError(error) {
35
+ return {
36
+ code: 0,
37
+ message: "Response validation failed",
38
+ reason: error
39
+ };
40
+ }
41
+ function createFetcher(config) {
42
+ const baseUrl = config?.baseUrl ?? DEFAULT_BASE_URL;
43
+ const timeout = config?.timeout ?? DEFAULT_TIMEOUT;
44
+ const apiKey = config?.apiKey;
45
+ function buildUrl(path) {
46
+ return `${baseUrl}${path}`;
47
+ }
48
+ function buildHeaders(additionalHeaders) {
49
+ const headers = {
50
+ "Content-Type": "application/json",
51
+ ...additionalHeaders
52
+ };
53
+ if (apiKey) {
54
+ headers.Authorization = `Bearer ${apiKey}`;
55
+ }
56
+ return headers;
57
+ }
58
+ function createTimeoutSignal(externalSignal) {
59
+ const controller = new AbortController();
60
+ const timeoutId = setTimeout(() => controller.abort(), timeout);
61
+ if (externalSignal) {
62
+ if (externalSignal.aborted) {
63
+ controller.abort();
64
+ } else {
65
+ externalSignal.addEventListener("abort", () => controller.abort());
66
+ }
67
+ }
68
+ return {
69
+ signal: controller.signal,
70
+ cleanup: () => clearTimeout(timeoutId)
71
+ };
72
+ }
73
+ async function request(method, path, schema, body, options) {
74
+ const { signal, cleanup } = createTimeoutSignal(options?.signal);
75
+ try {
76
+ const response = await fetch(buildUrl(path), {
77
+ method,
78
+ headers: buildHeaders(),
79
+ body: body ? JSON.stringify(body) : void 0,
80
+ signal
81
+ });
82
+ if (!response.ok) {
83
+ let errorBody;
84
+ try {
85
+ errorBody = await response.json();
86
+ } catch {
87
+ errorBody = void 0;
88
+ }
89
+ return {
90
+ ok: false,
91
+ error: createHttpError(response.status, response.statusText, errorBody)
92
+ };
93
+ }
94
+ const json = await response.json();
95
+ const parsed = schema.safeParse(json);
96
+ if (!parsed.success) {
97
+ return { ok: false, error: createValidationError(parsed.error) };
98
+ }
99
+ return { ok: true, data: parsed.data };
100
+ } catch (error) {
101
+ if (error instanceof Error && error.name === "AbortError") {
102
+ return { ok: false, error: createAbortError() };
103
+ }
104
+ return { ok: false, error: createNetworkError(error) };
105
+ } finally {
106
+ cleanup();
107
+ }
108
+ }
109
+ async function requestBlob(path, options) {
110
+ const { signal, cleanup } = createTimeoutSignal(options?.signal);
111
+ try {
112
+ const response = await fetch(buildUrl(path), {
113
+ method: "GET",
114
+ headers: buildHeaders(),
115
+ signal
116
+ });
117
+ if (!response.ok) {
118
+ let errorBody;
119
+ try {
120
+ errorBody = await response.json();
121
+ } catch {
122
+ errorBody = void 0;
123
+ }
124
+ return {
125
+ ok: false,
126
+ error: createHttpError(response.status, response.statusText, errorBody)
127
+ };
128
+ }
129
+ const blob = await response.blob();
130
+ return { ok: true, data: blob };
131
+ } catch (error) {
132
+ if (error instanceof Error && error.name === "AbortError") {
133
+ return { ok: false, error: createAbortError() };
134
+ }
135
+ return { ok: false, error: createNetworkError(error) };
136
+ } finally {
137
+ cleanup();
138
+ }
139
+ }
140
+ return {
141
+ get: (path, schema, options) => request("GET", path, schema, void 0, options),
142
+ post: (path, body, schema, options) => request("POST", path, schema, body, options),
143
+ delete: (path, schema, options) => request("DELETE", path, schema, void 0, options),
144
+ getBlob: (path, options) => requestBlob(path, options)
145
+ };
146
+ }
147
+ var registryExpertStatusSchema = z.enum(["available", "deprecated", "disabled"]);
148
+ var ownerSchema = z.object({
149
+ name: z.string().optional(),
150
+ organizationId: z.string(),
151
+ createdAt: z.string().transform((s) => new Date(s))
152
+ });
153
+ var registryExpertSchema = z.object({
154
+ type: z.literal("registryExpert"),
155
+ id: z.string(),
156
+ key: z.string(),
157
+ name: z.string(),
158
+ minRuntimeVersion: z.literal("v1.0"),
159
+ description: z.string(),
160
+ owner: ownerSchema,
161
+ createdAt: z.string().transform((s) => new Date(s)),
162
+ updatedAt: z.string().transform((s) => new Date(s)),
163
+ version: z.string(),
164
+ status: registryExpertStatusSchema,
165
+ instruction: z.string(),
166
+ skills: z.record(z.string(), z.unknown()).transform((s) => s),
167
+ delegates: z.array(z.string()),
168
+ tags: z.array(z.string())
169
+ });
170
+ var expertDigestSchema = z.object({
171
+ type: z.literal("expertDigest"),
172
+ id: z.string(),
173
+ key: z.string(),
174
+ name: z.string(),
175
+ minRuntimeVersion: z.literal("v1.0"),
176
+ description: z.string(),
177
+ owner: ownerSchema,
178
+ createdAt: z.string().transform((s) => new Date(s)),
179
+ updatedAt: z.string().transform((s) => new Date(s)),
180
+ version: z.string().optional(),
181
+ tags: z.array(z.string())
182
+ });
183
+ var getExpertResponseSchema = z.object({
184
+ data: z.object({
185
+ expert: registryExpertSchema
186
+ })
187
+ });
188
+ var listExpertsResponseSchema = z.object({
189
+ data: z.object({
190
+ experts: z.array(registryExpertSchema)
191
+ }),
192
+ meta: z.object({
193
+ total: z.number(),
194
+ take: z.number(),
195
+ skip: z.number()
196
+ })
197
+ });
198
+ var createExpertResponseSchema = z.object({
199
+ data: z.object({
200
+ expert: registryExpertSchema
201
+ })
202
+ });
203
+ var updateExpertResponseSchema = z.object({
204
+ data: z.object({
205
+ expert: registryExpertSchema
206
+ })
207
+ });
208
+ var deleteExpertResponseSchema = z.object({});
209
+ var getExpertVersionsResponseSchema = z.object({
210
+ data: z.object({
211
+ versions: z.array(expertDigestSchema),
212
+ latest: z.string()
213
+ }),
214
+ meta: z.object({
215
+ total: z.number()
216
+ })
217
+ });
218
+
219
+ // src/registry/experts.ts
220
+ function createRegistryExpertsApi(fetcher) {
221
+ return {
222
+ async get(key, options) {
223
+ const result = await fetcher.get(
224
+ `/api/registry/v1/experts/${encodeURIComponent(key)}`,
225
+ getExpertResponseSchema,
226
+ options
227
+ );
228
+ if (!result.ok) return result;
229
+ return { ok: true, data: result.data.data.expert };
230
+ },
231
+ async list(params, options) {
232
+ const searchParams = new URLSearchParams();
233
+ if (params?.organizationId) searchParams.set("organizationId", params.organizationId);
234
+ if (params?.filter) searchParams.set("filter", params.filter);
235
+ if (params?.sort) searchParams.set("sort", params.sort);
236
+ if (params?.order) searchParams.set("order", params.order);
237
+ if (params?.take !== void 0) searchParams.set("take", params.take.toString());
238
+ if (params?.skip !== void 0) searchParams.set("skip", params.skip.toString());
239
+ const query = searchParams.toString();
240
+ const path = `/api/registry/v1/experts/${query ? `?${query}` : ""}`;
241
+ const result = await fetcher.get(path, listExpertsResponseSchema, options);
242
+ if (!result.ok) return result;
243
+ return {
244
+ ok: true,
245
+ data: {
246
+ data: result.data.data.experts,
247
+ meta: result.data.meta
248
+ }
249
+ };
250
+ },
251
+ async create(input, options) {
252
+ const result = await fetcher.post(
253
+ "/api/registry/v1/experts/",
254
+ input,
255
+ createExpertResponseSchema,
256
+ options
257
+ );
258
+ if (!result.ok) return result;
259
+ return { ok: true, data: result.data.data.expert };
260
+ },
261
+ async update(key, input, options) {
262
+ const result = await fetcher.post(
263
+ `/api/registry/v1/experts/${encodeURIComponent(key)}`,
264
+ input,
265
+ updateExpertResponseSchema,
266
+ options
267
+ );
268
+ if (!result.ok) return result;
269
+ return { ok: true, data: result.data.data.expert };
270
+ },
271
+ async delete(key, options) {
272
+ const result = await fetcher.delete(
273
+ `/api/registry/v1/experts/${encodeURIComponent(key)}`,
274
+ deleteExpertResponseSchema,
275
+ options
276
+ );
277
+ if (!result.ok) return result;
278
+ return { ok: true, data: void 0 };
279
+ },
280
+ async getVersions(key, options) {
281
+ const result = await fetcher.get(
282
+ `/api/registry/v1/experts/${encodeURIComponent(key)}/versions`,
283
+ getExpertVersionsResponseSchema,
284
+ options
285
+ );
286
+ if (!result.ok) return result;
287
+ return {
288
+ ok: true,
289
+ data: {
290
+ versions: result.data.data.versions,
291
+ latest: result.data.data.latest,
292
+ total: result.data.meta.total
293
+ }
294
+ };
295
+ }
296
+ };
297
+ }
298
+
299
+ // src/utils.ts
300
+ async function blobToBase64(blob) {
301
+ const buffer = await blob.arrayBuffer();
302
+ const bytes = new Uint8Array(buffer);
303
+ let binary = "";
304
+ for (let i = 0; i < bytes.byteLength; i++) {
305
+ binary += String.fromCharCode(bytes[i]);
306
+ }
307
+ return btoa(binary);
308
+ }
309
+ var applicationSchema = z.object({
310
+ id: z.string(),
311
+ name: z.string()
312
+ });
313
+ var ownerSchema2 = z.object({
314
+ name: z.string().optional(),
315
+ organizationId: z.string(),
316
+ createdAt: z.string().transform((s) => new Date(s))
317
+ });
318
+ var studioExpertSchema = z.object({
319
+ type: z.literal("studioExpert"),
320
+ id: z.string(),
321
+ key: z.string(),
322
+ name: z.string(),
323
+ minRuntimeVersion: z.literal("v1.0"),
324
+ description: z.string(),
325
+ owner: ownerSchema2,
326
+ createdAt: z.string().transform((s) => new Date(s)),
327
+ updatedAt: z.string().transform((s) => new Date(s)),
328
+ instruction: z.string(),
329
+ skills: z.record(z.string(), z.unknown()).transform((s) => s),
330
+ delegates: z.array(z.string()),
331
+ forkFrom: z.string().optional(),
332
+ application: applicationSchema
333
+ });
334
+ var expertDigestSchema2 = z.object({
335
+ type: z.literal("expertDigest"),
336
+ id: z.string(),
337
+ key: z.string(),
338
+ name: z.string(),
339
+ minRuntimeVersion: z.literal("v1.0"),
340
+ description: z.string(),
341
+ owner: ownerSchema2,
342
+ createdAt: z.string().transform((s) => new Date(s)),
343
+ updatedAt: z.string().transform((s) => new Date(s)),
344
+ version: z.string().optional(),
345
+ tags: z.array(z.string())
346
+ });
347
+ var getStudioExpertResponseSchema = z.object({
348
+ data: z.object({
349
+ expert: studioExpertSchema
350
+ })
351
+ });
352
+ var listStudioExpertsResponseSchema = z.object({
353
+ data: z.object({
354
+ experts: z.array(expertDigestSchema2)
355
+ }),
356
+ meta: z.object({
357
+ total: z.number(),
358
+ take: z.number(),
359
+ skip: z.number()
360
+ })
361
+ });
362
+ var createStudioExpertResponseSchema = z.object({
363
+ data: z.object({
364
+ expert: studioExpertSchema
365
+ })
366
+ });
367
+ var updateStudioExpertResponseSchema = z.object({
368
+ data: z.object({
369
+ expert: studioExpertSchema
370
+ })
371
+ });
372
+ var deleteStudioExpertResponseSchema = z.object({});
373
+ var expertJobStatusSchema = z.enum([
374
+ "queued",
375
+ "processing",
376
+ "completed",
377
+ "requestInteractiveToolResult",
378
+ "requestDelegateResult",
379
+ "exceededMaxSteps",
380
+ "failed",
381
+ "canceling",
382
+ "canceled",
383
+ "expired"
384
+ ]);
385
+ var expertJobSchema = z.object({
386
+ id: z.string(),
387
+ expertKey: z.string(),
388
+ status: expertJobStatusSchema,
389
+ query: z.string().optional(),
390
+ createdAt: z.string().transform((s) => new Date(s)),
391
+ updatedAt: z.string().transform((s) => new Date(s)),
392
+ startedAt: z.string().transform((s) => new Date(s)).optional(),
393
+ completedAt: z.string().transform((s) => new Date(s)).optional()
394
+ });
395
+ var getExpertJobResponseSchema = z.object({
396
+ data: z.object({
397
+ expertJob: expertJobSchema
398
+ })
399
+ });
400
+ var listExpertJobsResponseSchema = z.object({
401
+ data: z.object({
402
+ expertJobs: z.array(expertJobSchema)
403
+ }),
404
+ meta: z.object({
405
+ total: z.number(),
406
+ take: z.number(),
407
+ skip: z.number()
408
+ })
409
+ });
410
+ var startExpertJobResponseSchema = z.object({
411
+ data: z.object({
412
+ expertJob: expertJobSchema
413
+ })
414
+ });
415
+ var continueExpertJobResponseSchema = z.object({
416
+ data: z.object({
417
+ expertJob: expertJobSchema
418
+ })
419
+ });
420
+ var updateExpertJobResponseSchema = z.object({
421
+ data: z.object({
422
+ expertJob: expertJobSchema
423
+ })
424
+ });
425
+ var checkpointSchema = z.object({
426
+ id: z.string(),
427
+ expertJobId: z.string(),
428
+ sequence: z.number(),
429
+ createdAt: z.string().transform((s) => new Date(s))
430
+ });
431
+ var getCheckpointResponseSchema = z.object({
432
+ data: z.object({
433
+ checkpoint: checkpointSchema
434
+ })
435
+ });
436
+ var listCheckpointsResponseSchema = z.object({
437
+ data: z.object({
438
+ checkpoints: z.array(checkpointSchema)
439
+ }),
440
+ meta: z.object({
441
+ total: z.number(),
442
+ take: z.number(),
443
+ skip: z.number()
444
+ })
445
+ });
446
+ var createCheckpointResponseSchema = z.object({
447
+ data: z.object({
448
+ checkpoint: checkpointSchema
449
+ })
450
+ });
451
+ var workspaceInstanceSchema = z.object({
452
+ id: z.string(),
453
+ expertJobId: z.string(),
454
+ createdAt: z.string().transform((s) => new Date(s))
455
+ });
456
+ var getWorkspaceInstanceResponseSchema = z.object({
457
+ data: z.object({
458
+ workspaceInstance: workspaceInstanceSchema
459
+ })
460
+ });
461
+ var workspaceItemSchema = z.object({
462
+ id: z.string(),
463
+ path: z.string(),
464
+ type: z.enum(["file", "directory"]),
465
+ size: z.number().optional(),
466
+ createdAt: z.string().transform((s) => new Date(s)),
467
+ updatedAt: z.string().transform((s) => new Date(s))
468
+ });
469
+ var getWorkspaceItemResponseSchema = z.object({
470
+ data: z.object({
471
+ item: workspaceItemSchema
472
+ })
473
+ });
474
+ var listWorkspaceItemsResponseSchema = z.object({
475
+ data: z.object({
476
+ workspaceItems: z.array(workspaceItemSchema)
477
+ }),
478
+ meta: z.object({
479
+ total: z.number(),
480
+ take: z.number(),
481
+ skip: z.number()
482
+ })
483
+ });
484
+ var createWorkspaceItemResponseSchema = z.object({
485
+ data: z.object({
486
+ item: workspaceItemSchema
487
+ })
488
+ });
489
+ var updateWorkspaceItemResponseSchema = z.object({
490
+ data: z.object({
491
+ item: workspaceItemSchema
492
+ })
493
+ });
494
+ var deleteWorkspaceItemResponseSchema = z.object({});
495
+ var findWorkspaceItemsResponseSchema = z.object({
496
+ data: z.object({
497
+ workspaceItems: z.array(workspaceItemSchema)
498
+ })
499
+ });
500
+ var workspaceSchema = z.object({
501
+ id: z.string(),
502
+ applicationId: z.string(),
503
+ createdAt: z.string().transform((s) => new Date(s)),
504
+ updatedAt: z.string().transform((s) => new Date(s))
505
+ });
506
+ var getWorkspaceResponseSchema = z.object({
507
+ data: z.object({
508
+ workspace: workspaceSchema
509
+ })
510
+ });
511
+ var workspaceVariableSchema = z.object({
512
+ name: z.string(),
513
+ value: z.string()
514
+ });
515
+ var workspaceSecretSchema = z.object({
516
+ name: z.string()
517
+ });
518
+ var createWorkspaceVariableResponseSchema = z.object({
519
+ data: z.object({
520
+ variable: workspaceVariableSchema
521
+ })
522
+ });
523
+ var updateWorkspaceVariableResponseSchema = z.object({
524
+ data: z.object({
525
+ variable: workspaceVariableSchema
526
+ })
527
+ });
528
+ var deleteWorkspaceVariableResponseSchema = z.object({});
529
+ var createWorkspaceSecretResponseSchema = z.object({
530
+ data: z.object({
531
+ secret: workspaceSecretSchema
532
+ })
533
+ });
534
+ var deleteWorkspaceSecretResponseSchema = z.object({});
535
+
536
+ // src/studio/expert-jobs.ts
537
+ function createStudioExpertJobsApi(fetcher) {
538
+ return {
539
+ async get(id, options) {
540
+ const result = await fetcher.get(
541
+ `/api/studio/v1/expert_jobs/${encodeURIComponent(id)}`,
542
+ getExpertJobResponseSchema,
543
+ options
544
+ );
545
+ if (!result.ok) return result;
546
+ return { ok: true, data: result.data.data.expertJob };
547
+ },
548
+ async list(params, options) {
549
+ const searchParams = new URLSearchParams();
550
+ searchParams.set("applicationId", params.applicationId);
551
+ if (params.filter) searchParams.set("filter", params.filter);
552
+ if (params.sort) searchParams.set("sort", params.sort);
553
+ if (params.order) searchParams.set("order", params.order);
554
+ if (params.take !== void 0) searchParams.set("take", params.take.toString());
555
+ if (params.skip !== void 0) searchParams.set("skip", params.skip.toString());
556
+ const path = `/api/studio/v1/expert_jobs/?${searchParams.toString()}`;
557
+ const result = await fetcher.get(path, listExpertJobsResponseSchema, options);
558
+ if (!result.ok) return result;
559
+ return {
560
+ ok: true,
561
+ data: {
562
+ data: result.data.data.expertJobs,
563
+ meta: result.data.meta
564
+ }
565
+ };
566
+ },
567
+ async start(input, options) {
568
+ const result = await fetcher.post(
569
+ "/api/studio/v1/expert_jobs/",
570
+ input,
571
+ startExpertJobResponseSchema,
572
+ options
573
+ );
574
+ if (!result.ok) return result;
575
+ return { ok: true, data: result.data.data.expertJob };
576
+ },
577
+ async continue(id, input, options) {
578
+ const result = await fetcher.post(
579
+ `/api/studio/v1/expert_jobs/${encodeURIComponent(id)}/continue`,
580
+ input,
581
+ continueExpertJobResponseSchema,
582
+ options
583
+ );
584
+ if (!result.ok) return result;
585
+ return { ok: true, data: result.data.data.expertJob };
586
+ },
587
+ async update(id, input, options) {
588
+ const result = await fetcher.post(
589
+ `/api/studio/v1/expert_jobs/${encodeURIComponent(id)}`,
590
+ input,
591
+ updateExpertJobResponseSchema,
592
+ options
593
+ );
594
+ if (!result.ok) return result;
595
+ return { ok: true, data: result.data.data.expertJob };
596
+ },
597
+ checkpoints: createCheckpointsApi(fetcher),
598
+ workspaceInstance: createWorkspaceInstanceApi(fetcher)
599
+ };
600
+ }
601
+ function createCheckpointsApi(fetcher) {
602
+ return {
603
+ async get(jobId, checkpointId, options) {
604
+ const result = await fetcher.get(
605
+ `/api/studio/v1/expert_jobs/${encodeURIComponent(jobId)}/checkpoints/${encodeURIComponent(checkpointId)}`,
606
+ getCheckpointResponseSchema,
607
+ options
608
+ );
609
+ if (!result.ok) return result;
610
+ return { ok: true, data: result.data.data.checkpoint };
611
+ },
612
+ async list(jobId, params, options) {
613
+ const searchParams = new URLSearchParams();
614
+ if (params?.take !== void 0) searchParams.set("take", params.take.toString());
615
+ if (params?.skip !== void 0) searchParams.set("skip", params.skip.toString());
616
+ if (params?.sort) searchParams.set("sort", params.sort);
617
+ if (params?.order) searchParams.set("order", params.order);
618
+ const query = searchParams.toString();
619
+ const path = `/api/studio/v1/expert_jobs/${encodeURIComponent(jobId)}/checkpoints/${query ? `?${query}` : ""}`;
620
+ const result = await fetcher.get(path, listCheckpointsResponseSchema, options);
621
+ if (!result.ok) return result;
622
+ return {
623
+ ok: true,
624
+ data: {
625
+ data: result.data.data.checkpoints,
626
+ meta: result.data.meta
627
+ }
628
+ };
629
+ },
630
+ async create(jobId, options) {
631
+ const result = await fetcher.post(
632
+ `/api/studio/v1/expert_jobs/${encodeURIComponent(jobId)}/checkpoints/`,
633
+ {},
634
+ createCheckpointResponseSchema,
635
+ options
636
+ );
637
+ if (!result.ok) return result;
638
+ return { ok: true, data: result.data.data.checkpoint };
639
+ }
640
+ };
641
+ }
642
+ function createWorkspaceInstanceApi(fetcher) {
643
+ return {
644
+ async get(jobId, options) {
645
+ const result = await fetcher.get(
646
+ `/api/studio/v1/expert_jobs/${encodeURIComponent(jobId)}/workspace_instance/`,
647
+ getWorkspaceInstanceResponseSchema,
648
+ options
649
+ );
650
+ if (!result.ok) return result;
651
+ return { ok: true, data: result.data.data.workspaceInstance };
652
+ },
653
+ items: createWorkspaceInstanceItemsApi(fetcher)
654
+ };
655
+ }
656
+ function createWorkspaceInstanceItemsApi(fetcher) {
657
+ return {
658
+ async get(jobId, itemId, options) {
659
+ const result = await fetcher.get(
660
+ `/api/studio/v1/expert_jobs/${encodeURIComponent(jobId)}/workspace_instance/items/${encodeURIComponent(itemId)}`,
661
+ getWorkspaceItemResponseSchema,
662
+ options
663
+ );
664
+ if (!result.ok) return result;
665
+ return { ok: true, data: result.data.data.item };
666
+ },
667
+ async list(jobId, params, options) {
668
+ const searchParams = new URLSearchParams();
669
+ if (params?.take !== void 0) searchParams.set("take", params.take.toString());
670
+ if (params?.skip !== void 0) searchParams.set("skip", params.skip.toString());
671
+ if (params?.path) searchParams.set("path", params.path);
672
+ const query = searchParams.toString();
673
+ const path = `/api/studio/v1/expert_jobs/${encodeURIComponent(jobId)}/workspace_instance/items/${query ? `?${query}` : ""}`;
674
+ const result = await fetcher.get(path, listWorkspaceItemsResponseSchema, options);
675
+ if (!result.ok) return result;
676
+ return {
677
+ ok: true,
678
+ data: {
679
+ data: result.data.data.workspaceItems,
680
+ meta: result.data.meta
681
+ }
682
+ };
683
+ },
684
+ async create(jobId, itemPath, content, options) {
685
+ const result = await fetcher.post(
686
+ `/api/studio/v1/expert_jobs/${encodeURIComponent(jobId)}/workspace_instance/items/`,
687
+ { path: itemPath, content: await blobToBase64(content) },
688
+ createWorkspaceItemResponseSchema,
689
+ options
690
+ );
691
+ if (!result.ok) return result;
692
+ return { ok: true, data: result.data.data.item };
693
+ },
694
+ async update(jobId, itemId, content, options) {
695
+ const result = await fetcher.post(
696
+ `/api/studio/v1/expert_jobs/${encodeURIComponent(jobId)}/workspace_instance/items/${encodeURIComponent(itemId)}`,
697
+ { content: await blobToBase64(content) },
698
+ updateWorkspaceItemResponseSchema,
699
+ options
700
+ );
701
+ if (!result.ok) return result;
702
+ return { ok: true, data: result.data.data.item };
703
+ },
704
+ async delete(jobId, itemId, options) {
705
+ const result = await fetcher.delete(
706
+ `/api/studio/v1/expert_jobs/${encodeURIComponent(jobId)}/workspace_instance/items/${encodeURIComponent(itemId)}`,
707
+ deleteWorkspaceItemResponseSchema,
708
+ options
709
+ );
710
+ if (!result.ok) return result;
711
+ return { ok: true, data: void 0 };
712
+ },
713
+ async download(jobId, itemId, options) {
714
+ return fetcher.getBlob(
715
+ `/api/studio/v1/expert_jobs/${encodeURIComponent(jobId)}/workspace_instance/items/${encodeURIComponent(itemId)}/download`,
716
+ options
717
+ );
718
+ },
719
+ async find(jobId, pathPattern, options) {
720
+ const searchParams = new URLSearchParams();
721
+ searchParams.set("path", pathPattern);
722
+ const path = `/api/studio/v1/expert_jobs/${encodeURIComponent(jobId)}/workspace_instance/items/find?${searchParams.toString()}`;
723
+ const result = await fetcher.get(path, findWorkspaceItemsResponseSchema, options);
724
+ if (!result.ok) return result;
725
+ return { ok: true, data: result.data.data.workspaceItems };
726
+ }
727
+ };
728
+ }
729
+
730
+ // src/studio/experts.ts
731
+ function createStudioExpertsApi(fetcher) {
732
+ return {
733
+ async get(key, options) {
734
+ const result = await fetcher.get(
735
+ `/api/studio/v1/experts/${encodeURIComponent(key)}`,
736
+ getStudioExpertResponseSchema,
737
+ options
738
+ );
739
+ if (!result.ok) return result;
740
+ return { ok: true, data: result.data.data.expert };
741
+ },
742
+ async list(params, options) {
743
+ const searchParams = new URLSearchParams();
744
+ searchParams.set("applicationId", params.applicationId);
745
+ if (params.filter) searchParams.set("filter", params.filter);
746
+ if (params.sort) searchParams.set("sort", params.sort);
747
+ if (params.order) searchParams.set("order", params.order);
748
+ if (params.take !== void 0) searchParams.set("take", params.take.toString());
749
+ if (params.skip !== void 0) searchParams.set("skip", params.skip.toString());
750
+ const path = `/api/studio/v1/experts/?${searchParams.toString()}`;
751
+ const result = await fetcher.get(path, listStudioExpertsResponseSchema, options);
752
+ if (!result.ok) return result;
753
+ return {
754
+ ok: true,
755
+ data: {
756
+ data: result.data.data.experts,
757
+ meta: result.data.meta
758
+ }
759
+ };
760
+ },
761
+ async create(input, options) {
762
+ const result = await fetcher.post(
763
+ "/api/studio/v1/experts/",
764
+ input,
765
+ createStudioExpertResponseSchema,
766
+ options
767
+ );
768
+ if (!result.ok) return result;
769
+ return { ok: true, data: result.data.data.expert };
770
+ },
771
+ async update(key, input, options) {
772
+ const result = await fetcher.post(
773
+ `/api/studio/v1/experts/${encodeURIComponent(key)}`,
774
+ input,
775
+ updateStudioExpertResponseSchema,
776
+ options
777
+ );
778
+ if (!result.ok) return result;
779
+ return { ok: true, data: result.data.data.expert };
780
+ },
781
+ async delete(key, options) {
782
+ const result = await fetcher.delete(
783
+ `/api/studio/v1/experts/${encodeURIComponent(key)}`,
784
+ deleteStudioExpertResponseSchema,
785
+ options
786
+ );
787
+ if (!result.ok) return result;
788
+ return { ok: true, data: void 0 };
789
+ }
790
+ };
791
+ }
792
+
793
+ // src/studio/workspace.ts
794
+ function createStudioWorkspaceApi(fetcher) {
795
+ return {
796
+ async get(options) {
797
+ const result = await fetcher.get(
798
+ "/api/studio/v1/workspace/",
799
+ getWorkspaceResponseSchema,
800
+ options
801
+ );
802
+ if (!result.ok) return result;
803
+ return { ok: true, data: result.data.data.workspace };
804
+ },
805
+ items: createWorkspaceItemsApi(fetcher),
806
+ variables: createWorkspaceVariablesApi(fetcher),
807
+ secrets: createWorkspaceSecretsApi(fetcher)
808
+ };
809
+ }
810
+ function createWorkspaceItemsApi(fetcher) {
811
+ return {
812
+ async get(itemId, options) {
813
+ const result = await fetcher.get(
814
+ `/api/studio/v1/workspace/items/${encodeURIComponent(itemId)}`,
815
+ getWorkspaceItemResponseSchema,
816
+ options
817
+ );
818
+ if (!result.ok) return result;
819
+ return { ok: true, data: result.data.data.item };
820
+ },
821
+ async list(params, options) {
822
+ const searchParams = new URLSearchParams();
823
+ if (params?.take !== void 0) searchParams.set("take", params.take.toString());
824
+ if (params?.skip !== void 0) searchParams.set("skip", params.skip.toString());
825
+ if (params?.path) searchParams.set("path", params.path);
826
+ const query = searchParams.toString();
827
+ const path = `/api/studio/v1/workspace/items/${query ? `?${query}` : ""}`;
828
+ const result = await fetcher.get(path, listWorkspaceItemsResponseSchema, options);
829
+ if (!result.ok) return result;
830
+ return {
831
+ ok: true,
832
+ data: {
833
+ data: result.data.data.workspaceItems,
834
+ meta: result.data.meta
835
+ }
836
+ };
837
+ },
838
+ async create(itemPath, content, options) {
839
+ const result = await fetcher.post(
840
+ "/api/studio/v1/workspace/items/",
841
+ { path: itemPath, content: await blobToBase64(content) },
842
+ createWorkspaceItemResponseSchema,
843
+ options
844
+ );
845
+ if (!result.ok) return result;
846
+ return { ok: true, data: result.data.data.item };
847
+ },
848
+ async update(itemId, content, options) {
849
+ const result = await fetcher.post(
850
+ `/api/studio/v1/workspace/items/${encodeURIComponent(itemId)}`,
851
+ { content: await blobToBase64(content) },
852
+ updateWorkspaceItemResponseSchema,
853
+ options
854
+ );
855
+ if (!result.ok) return result;
856
+ return { ok: true, data: result.data.data.item };
857
+ },
858
+ async delete(itemId, options) {
859
+ const result = await fetcher.delete(
860
+ `/api/studio/v1/workspace/items/${encodeURIComponent(itemId)}`,
861
+ deleteWorkspaceItemResponseSchema,
862
+ options
863
+ );
864
+ if (!result.ok) return result;
865
+ return { ok: true, data: void 0 };
866
+ },
867
+ async download(itemId, options) {
868
+ return fetcher.getBlob(
869
+ `/api/studio/v1/workspace/items/${encodeURIComponent(itemId)}/download`,
870
+ options
871
+ );
872
+ },
873
+ async find(pathPattern, options) {
874
+ const searchParams = new URLSearchParams();
875
+ searchParams.set("path", pathPattern);
876
+ const path = `/api/studio/v1/workspace/items/find?${searchParams.toString()}`;
877
+ const result = await fetcher.get(path, findWorkspaceItemsResponseSchema, options);
878
+ if (!result.ok) return result;
879
+ return { ok: true, data: result.data.data.workspaceItems };
880
+ }
881
+ };
882
+ }
883
+ function createWorkspaceVariablesApi(fetcher) {
884
+ return {
885
+ async create(input, options) {
886
+ const result = await fetcher.post(
887
+ "/api/studio/v1/workspace/variables/",
888
+ input,
889
+ createWorkspaceVariableResponseSchema,
890
+ options
891
+ );
892
+ if (!result.ok) return result;
893
+ return { ok: true, data: result.data.data.variable };
894
+ },
895
+ async update(name, input, options) {
896
+ const result = await fetcher.post(
897
+ `/api/studio/v1/workspace/variables/${encodeURIComponent(name)}`,
898
+ input,
899
+ updateWorkspaceVariableResponseSchema,
900
+ options
901
+ );
902
+ if (!result.ok) return result;
903
+ return { ok: true, data: result.data.data.variable };
904
+ },
905
+ async delete(name, options) {
906
+ const result = await fetcher.delete(
907
+ `/api/studio/v1/workspace/variables/${encodeURIComponent(name)}`,
908
+ deleteWorkspaceVariableResponseSchema,
909
+ options
910
+ );
911
+ if (!result.ok) return result;
912
+ return { ok: true, data: void 0 };
913
+ }
914
+ };
915
+ }
916
+ function createWorkspaceSecretsApi(fetcher) {
917
+ return {
918
+ async create(input, options) {
919
+ const result = await fetcher.post(
920
+ "/api/studio/v1/workspace/secrets/",
921
+ input,
922
+ createWorkspaceSecretResponseSchema,
923
+ options
924
+ );
925
+ if (!result.ok) return result;
926
+ return { ok: true, data: result.data.data.secret };
927
+ },
928
+ async delete(name, options) {
929
+ const result = await fetcher.delete(
930
+ `/api/studio/v1/workspace/secrets/${encodeURIComponent(name)}`,
931
+ deleteWorkspaceSecretResponseSchema,
932
+ options
933
+ );
934
+ if (!result.ok) return result;
935
+ return { ok: true, data: void 0 };
936
+ }
937
+ };
938
+ }
939
+
940
+ // src/client.ts
941
+ function createApiClient(config) {
942
+ const fetcher = createFetcher(config);
943
+ return {
944
+ registry: {
945
+ experts: createRegistryExpertsApi(fetcher)
946
+ },
947
+ studio: {
948
+ experts: createStudioExpertsApi(fetcher),
949
+ expertJobs: createStudioExpertJobsApi(fetcher),
950
+ workspace: createStudioWorkspaceApi(fetcher)
951
+ }
952
+ };
953
+ }
954
+
955
+ export { createApiClient, createFetcher, createRegistryExpertsApi, createStudioExpertJobsApi, createStudioExpertsApi, createStudioWorkspaceApi };
956
+ //# sourceMappingURL=index.js.map
957
+ //# sourceMappingURL=index.js.map