@nodaro/sdk 2.44.0 → 2.45.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-ETX3TLNB.cjs → chunk-22P4X3N5.cjs} +16 -5
- package/dist/chunk-22P4X3N5.cjs.map +1 -0
- package/dist/{chunk-RETNLKOC.js → chunk-33HT46A3.js} +2 -2
- package/dist/{chunk-RETNLKOC.js.map → chunk-33HT46A3.js.map} +1 -1
- package/dist/{chunk-DAGJLS7W.js → chunk-3Y5TV37H.js} +3 -3
- package/dist/{chunk-DAGJLS7W.js.map → chunk-3Y5TV37H.js.map} +1 -1
- package/dist/{chunk-2VJOHJUZ.cjs → chunk-5IXZLQNT.cjs} +2 -2
- package/dist/chunk-5IXZLQNT.cjs.map +1 -0
- package/dist/{chunk-IGMWFEFB.js → chunk-5MOJSYHI.js} +2 -2
- package/dist/chunk-5MOJSYHI.js.map +1 -0
- package/dist/{chunk-FQNCIP6K.js → chunk-7LODCIQK.js} +2 -2
- package/dist/chunk-7LODCIQK.js.map +1 -0
- package/dist/{chunk-3ZZWCHF5.cjs → chunk-A7HOOWKS.cjs} +22 -22
- package/dist/{chunk-3ZZWCHF5.cjs.map → chunk-A7HOOWKS.cjs.map} +1 -1
- package/dist/{chunk-DQAYIVVS.js → chunk-BQAW4RX2.js} +16 -5
- package/dist/chunk-BQAW4RX2.js.map +1 -0
- package/dist/{chunk-4UPVE662.js → chunk-CKHCSZCV.js} +2 -2
- package/dist/chunk-CKHCSZCV.js.map +1 -0
- package/dist/{chunk-PQ7OKM3E.cjs → chunk-FIMBPKIH.cjs} +2 -2
- package/dist/chunk-FIMBPKIH.cjs.map +1 -0
- package/dist/{chunk-YSZM3N7Q.js → chunk-HPXE3NZW.js} +2 -2
- package/dist/{chunk-YSZM3N7Q.js.map → chunk-HPXE3NZW.js.map} +1 -1
- package/dist/{chunk-QHXLMCBR.cjs → chunk-J6FHBQ4Z.cjs} +2 -2
- package/dist/chunk-J6FHBQ4Z.cjs.map +1 -0
- package/dist/{chunk-ZWPDWFN2.js → chunk-JB4GVP4Q.js} +2 -2
- package/dist/chunk-JB4GVP4Q.js.map +1 -0
- package/dist/{chunk-OIYMTGYN.cjs → chunk-JOXZ4ZIF.cjs} +2 -2
- package/dist/chunk-JOXZ4ZIF.cjs.map +1 -0
- package/dist/{chunk-FHVNTS4E.cjs → chunk-KMNSPC72.cjs} +2 -2
- package/dist/{chunk-FHVNTS4E.cjs.map → chunk-KMNSPC72.cjs.map} +1 -1
- package/dist/{chunk-ILG5DHQQ.js → chunk-M7VSFZMV.js} +2 -2
- package/dist/chunk-M7VSFZMV.js.map +1 -0
- package/dist/{chunk-Z7UZ3FD3.js → chunk-RBX3QTKB.js} +2 -2
- package/dist/{chunk-Z7UZ3FD3.js.map → chunk-RBX3QTKB.js.map} +1 -1
- package/dist/{chunk-6PI3CI7P.js → chunk-RQY2WJD3.js} +12 -12
- package/dist/{chunk-6PI3CI7P.js.map → chunk-RQY2WJD3.js.map} +1 -1
- package/dist/{chunk-7XOK277W.cjs → chunk-SF2CMKWA.cjs} +2 -2
- package/dist/{chunk-7XOK277W.cjs.map → chunk-SF2CMKWA.cjs.map} +1 -1
- package/dist/{chunk-EK672FFM.cjs → chunk-UIBYZNDR.cjs} +2 -2
- package/dist/chunk-UIBYZNDR.cjs.map +1 -0
- package/dist/{chunk-MPQQC45L.cjs → chunk-WFWZBYBS.cjs} +3 -3
- package/dist/{chunk-MPQQC45L.cjs.map → chunk-WFWZBYBS.cjs.map} +1 -1
- package/dist/{chunk-VYEGCEZ3.cjs → chunk-WUM6CWTE.cjs} +2 -2
- package/dist/{chunk-VYEGCEZ3.cjs.map → chunk-WUM6CWTE.cjs.map} +1 -1
- package/dist/entries/apps.cjs +2 -2
- package/dist/entries/apps.d.cts +1 -1
- package/dist/entries/apps.d.ts +1 -1
- package/dist/entries/apps.js +1 -1
- package/dist/entries/characters.d.cts +1 -1
- package/dist/entries/characters.d.ts +1 -1
- package/dist/entries/client.cjs +16 -16
- package/dist/entries/client.d.cts +1 -1
- package/dist/entries/client.d.ts +1 -1
- package/dist/entries/client.js +11 -11
- package/dist/entries/core.cjs +5 -5
- package/dist/entries/core.js +1 -1
- package/dist/entries/creatures.d.cts +1 -1
- package/dist/entries/creatures.d.ts +1 -1
- package/dist/entries/credits.cjs +2 -2
- package/dist/entries/credits.d.cts +2 -2
- package/dist/entries/credits.d.ts +2 -2
- package/dist/entries/credits.js +1 -1
- package/dist/entries/edit.cjs +6 -6
- package/dist/entries/edit.d.cts +1 -1
- package/dist/entries/edit.d.ts +1 -1
- package/dist/entries/edit.js +1 -1
- package/dist/entries/locations.d.cts +1 -1
- package/dist/entries/locations.d.ts +1 -1
- package/dist/entries/media.cjs +2 -2
- package/dist/entries/media.d.cts +14 -3
- package/dist/entries/media.d.ts +14 -3
- package/dist/entries/media.js +1 -1
- package/dist/entries/nodes.cjs +2 -2
- package/dist/entries/nodes.d.cts +1 -1
- package/dist/entries/nodes.d.ts +1 -1
- package/dist/entries/nodes.js +1 -1
- package/dist/entries/objects.d.cts +1 -1
- package/dist/entries/objects.d.ts +1 -1
- package/dist/entries/scene3d.d.cts +2 -2
- package/dist/entries/scene3d.d.ts +2 -2
- package/dist/entries/templates.cjs +2 -2
- package/dist/entries/templates.d.cts +1 -1
- package/dist/entries/templates.d.ts +1 -1
- package/dist/entries/templates.js +1 -1
- package/dist/entries/trends.cjs +2 -2
- package/dist/entries/trends.d.cts +56 -7
- package/dist/entries/trends.d.ts +56 -7
- package/dist/entries/trends.js +1 -1
- package/dist/entries/tutorials.cjs +2 -2
- package/dist/entries/tutorials.d.cts +1 -1
- package/dist/entries/tutorials.d.ts +1 -1
- package/dist/entries/tutorials.js +1 -1
- package/dist/entries/workflows.cjs +2 -2
- package/dist/entries/workflows.d.cts +11 -4
- package/dist/entries/workflows.d.ts +11 -4
- package/dist/entries/workflows.js +1 -1
- package/dist/index.cjs +30 -30
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +11 -11
- package/dist/{nodes-B4ZEqx2V.d.ts → nodes-MThDit8l.d.ts} +1 -1
- package/dist/{nodes-DzBGNOUV.d.cts → nodes-Szl6HrZ_.d.cts} +1 -1
- package/package.json +3 -3
- package/dist/chunk-2VJOHJUZ.cjs.map +0 -1
- package/dist/chunk-4UPVE662.js.map +0 -1
- package/dist/chunk-DQAYIVVS.js.map +0 -1
- package/dist/chunk-EK672FFM.cjs.map +0 -1
- package/dist/chunk-ETX3TLNB.cjs.map +0 -1
- package/dist/chunk-FQNCIP6K.js.map +0 -1
- package/dist/chunk-IGMWFEFB.js.map +0 -1
- package/dist/chunk-ILG5DHQQ.js.map +0 -1
- package/dist/chunk-OIYMTGYN.cjs.map +0 -1
- package/dist/chunk-PQ7OKM3E.cjs.map +0 -1
- package/dist/chunk-QHXLMCBR.cjs.map +0 -1
- package/dist/chunk-ZWPDWFN2.js.map +0 -1
package/dist/index.cjs
CHANGED
|
@@ -51,19 +51,19 @@ require('./chunk-IS26FJO7.cjs');
|
|
|
51
51
|
require('./chunk-RQSGS7ZK.cjs');
|
|
52
52
|
require('./chunk-43NO4SGC.cjs');
|
|
53
53
|
require('./chunk-JOX5BJ6K.cjs');
|
|
54
|
-
var
|
|
54
|
+
var chunkA7HOOWKS_cjs = require('./chunk-A7HOOWKS.cjs');
|
|
55
55
|
var chunkW5VHATSR_cjs = require('./chunk-W5VHATSR.cjs');
|
|
56
56
|
var chunkR63TTR35_cjs = require('./chunk-R63TTR35.cjs');
|
|
57
57
|
var chunk3B47IHB3_cjs = require('./chunk-3B47IHB3.cjs');
|
|
58
|
-
var
|
|
58
|
+
var chunkWUM6CWTE_cjs = require('./chunk-WUM6CWTE.cjs');
|
|
59
59
|
var chunkLKH5M44B_cjs = require('./chunk-LKH5M44B.cjs');
|
|
60
60
|
var chunkYDRXBRW2_cjs = require('./chunk-YDRXBRW2.cjs');
|
|
61
61
|
var chunkPEMLIAPZ_cjs = require('./chunk-PEMLIAPZ.cjs');
|
|
62
62
|
var chunkMBFUMWI5_cjs = require('./chunk-MBFUMWI5.cjs');
|
|
63
63
|
var chunkNKH2UFSD_cjs = require('./chunk-NKH2UFSD.cjs');
|
|
64
|
-
var
|
|
65
|
-
var
|
|
66
|
-
var
|
|
64
|
+
var chunkUIBYZNDR_cjs = require('./chunk-UIBYZNDR.cjs');
|
|
65
|
+
var chunkJ6FHBQ4Z_cjs = require('./chunk-J6FHBQ4Z.cjs');
|
|
66
|
+
var chunkKMNSPC72_cjs = require('./chunk-KMNSPC72.cjs');
|
|
67
67
|
var chunkJTOEHQQJ_cjs = require('./chunk-JTOEHQQJ.cjs');
|
|
68
68
|
var chunkNBVARNVA_cjs = require('./chunk-NBVARNVA.cjs');
|
|
69
69
|
var chunk7YHIFCJ4_cjs = require('./chunk-7YHIFCJ4.cjs');
|
|
@@ -73,15 +73,15 @@ var chunkTCLNSVYA_cjs = require('./chunk-TCLNSVYA.cjs');
|
|
|
73
73
|
var chunkKXEWTYS4_cjs = require('./chunk-KXEWTYS4.cjs');
|
|
74
74
|
var chunkGB6C5OEZ_cjs = require('./chunk-GB6C5OEZ.cjs');
|
|
75
75
|
var chunkSYVNY3AH_cjs = require('./chunk-SYVNY3AH.cjs');
|
|
76
|
-
var
|
|
76
|
+
var chunk22P4X3N5_cjs = require('./chunk-22P4X3N5.cjs');
|
|
77
77
|
var chunk7QOCWJKD_cjs = require('./chunk-7QOCWJKD.cjs');
|
|
78
78
|
var chunkZCWKX4V6_cjs = require('./chunk-ZCWKX4V6.cjs');
|
|
79
79
|
var chunk34PU2DAT_cjs = require('./chunk-34PU2DAT.cjs');
|
|
80
|
-
var
|
|
80
|
+
var chunk5IXZLQNT_cjs = require('./chunk-5IXZLQNT.cjs');
|
|
81
81
|
var chunkGVIFLUYZ_cjs = require('./chunk-GVIFLUYZ.cjs');
|
|
82
82
|
var chunkCR5E2SF3_cjs = require('./chunk-CR5E2SF3.cjs');
|
|
83
83
|
var chunkJ5LGGCAS_cjs = require('./chunk-J5LGGCAS.cjs');
|
|
84
|
-
var
|
|
84
|
+
var chunkSF2CMKWA_cjs = require('./chunk-SF2CMKWA.cjs');
|
|
85
85
|
var chunkSBV5MWEL_cjs = require('./chunk-SBV5MWEL.cjs');
|
|
86
86
|
var chunkWUKIJJG2_cjs = require('./chunk-WUKIJJG2.cjs');
|
|
87
87
|
var chunk34JMD6ZO_cjs = require('./chunk-34JMD6ZO.cjs');
|
|
@@ -93,12 +93,12 @@ var chunk43FVH6LJ_cjs = require('./chunk-43FVH6LJ.cjs');
|
|
|
93
93
|
var chunkYFS2LMG4_cjs = require('./chunk-YFS2LMG4.cjs');
|
|
94
94
|
var chunkOSMKIRKI_cjs = require('./chunk-OSMKIRKI.cjs');
|
|
95
95
|
require('./chunk-FRQJNGJS.cjs');
|
|
96
|
-
var
|
|
96
|
+
var chunkWFWZBYBS_cjs = require('./chunk-WFWZBYBS.cjs');
|
|
97
97
|
var chunkFM2KM5TY_cjs = require('./chunk-FM2KM5TY.cjs');
|
|
98
98
|
var chunkHGCVWOGK_cjs = require('./chunk-HGCVWOGK.cjs');
|
|
99
|
-
var
|
|
99
|
+
var chunkFIMBPKIH_cjs = require('./chunk-FIMBPKIH.cjs');
|
|
100
100
|
var chunkA3S55XGF_cjs = require('./chunk-A3S55XGF.cjs');
|
|
101
|
-
var
|
|
101
|
+
var chunkJOXZ4ZIF_cjs = require('./chunk-JOXZ4ZIF.cjs');
|
|
102
102
|
var chunkGA4LZZKQ_cjs = require('./chunk-GA4LZZKQ.cjs');
|
|
103
103
|
var chunkNGKODS3J_cjs = require('./chunk-NGKODS3J.cjs');
|
|
104
104
|
var chunk55ZX6TE3_cjs = require('./chunk-55ZX6TE3.cjs');
|
|
@@ -141,11 +141,11 @@ Object.defineProperty(exports, "unwrapEditPlanOutput", {
|
|
|
141
141
|
});
|
|
142
142
|
Object.defineProperty(exports, "NodaroClient", {
|
|
143
143
|
enumerable: true,
|
|
144
|
-
get: function () { return
|
|
144
|
+
get: function () { return chunkA7HOOWKS_cjs.NodaroClient; }
|
|
145
145
|
});
|
|
146
146
|
Object.defineProperty(exports, "createClient", {
|
|
147
147
|
enumerable: true,
|
|
148
|
-
get: function () { return
|
|
148
|
+
get: function () { return chunkA7HOOWKS_cjs.createClient; }
|
|
149
149
|
});
|
|
150
150
|
Object.defineProperty(exports, "VideoProResource", {
|
|
151
151
|
enumerable: true,
|
|
@@ -161,7 +161,7 @@ Object.defineProperty(exports, "WebhooksResource", {
|
|
|
161
161
|
});
|
|
162
162
|
Object.defineProperty(exports, "WorkflowsResource", {
|
|
163
163
|
enumerable: true,
|
|
164
|
-
get: function () { return
|
|
164
|
+
get: function () { return chunkWUM6CWTE_cjs.WorkflowsResource; }
|
|
165
165
|
});
|
|
166
166
|
Object.defineProperty(exports, "WorkspacesResource", {
|
|
167
167
|
enumerable: true,
|
|
@@ -197,15 +197,15 @@ Object.defineProperty(exports, "isStudioGenerateEstimate", {
|
|
|
197
197
|
});
|
|
198
198
|
Object.defineProperty(exports, "TemplatesResource", {
|
|
199
199
|
enumerable: true,
|
|
200
|
-
get: function () { return
|
|
200
|
+
get: function () { return chunkUIBYZNDR_cjs.TemplatesResource; }
|
|
201
201
|
});
|
|
202
202
|
Object.defineProperty(exports, "TrendsResource", {
|
|
203
203
|
enumerable: true,
|
|
204
|
-
get: function () { return
|
|
204
|
+
get: function () { return chunkJ6FHBQ4Z_cjs.TrendsResource; }
|
|
205
205
|
});
|
|
206
206
|
Object.defineProperty(exports, "TutorialsResource", {
|
|
207
207
|
enumerable: true,
|
|
208
|
-
get: function () { return
|
|
208
|
+
get: function () { return chunkKMNSPC72_cjs.TutorialsResource; }
|
|
209
209
|
});
|
|
210
210
|
Object.defineProperty(exports, "UploadsResource", {
|
|
211
211
|
enumerable: true,
|
|
@@ -253,7 +253,7 @@ Object.defineProperty(exports, "SavedPostsResource", {
|
|
|
253
253
|
});
|
|
254
254
|
Object.defineProperty(exports, "MediaResource", {
|
|
255
255
|
enumerable: true,
|
|
256
|
-
get: function () { return
|
|
256
|
+
get: function () { return chunk22P4X3N5_cjs.MediaResource; }
|
|
257
257
|
});
|
|
258
258
|
Object.defineProperty(exports, "ModelsResource", {
|
|
259
259
|
enumerable: true,
|
|
@@ -277,7 +277,7 @@ Object.defineProperty(exports, "PresetsResource", {
|
|
|
277
277
|
});
|
|
278
278
|
Object.defineProperty(exports, "NodesResource", {
|
|
279
279
|
enumerable: true,
|
|
280
|
-
get: function () { return
|
|
280
|
+
get: function () { return chunk5IXZLQNT_cjs.NodesResource; }
|
|
281
281
|
});
|
|
282
282
|
Object.defineProperty(exports, "OAuthResource", {
|
|
283
283
|
enumerable: true,
|
|
@@ -309,23 +309,23 @@ Object.defineProperty(exports, "OrganizationsResource", {
|
|
|
309
309
|
});
|
|
310
310
|
Object.defineProperty(exports, "CLIP_PACK_MAX_TARGET_SEC", {
|
|
311
311
|
enumerable: true,
|
|
312
|
-
get: function () { return
|
|
312
|
+
get: function () { return chunkSF2CMKWA_cjs.CLIP_PACK_MAX_TARGET_SEC; }
|
|
313
313
|
});
|
|
314
314
|
Object.defineProperty(exports, "CLIP_PACK_MIN_TARGET_SEC", {
|
|
315
315
|
enumerable: true,
|
|
316
|
-
get: function () { return
|
|
316
|
+
get: function () { return chunkSF2CMKWA_cjs.CLIP_PACK_MIN_TARGET_SEC; }
|
|
317
317
|
});
|
|
318
318
|
Object.defineProperty(exports, "EditResource", {
|
|
319
319
|
enumerable: true,
|
|
320
|
-
get: function () { return
|
|
320
|
+
get: function () { return chunkSF2CMKWA_cjs.EditResource; }
|
|
321
321
|
});
|
|
322
322
|
Object.defineProperty(exports, "TRAILER_FORMATS", {
|
|
323
323
|
enumerable: true,
|
|
324
|
-
get: function () { return
|
|
324
|
+
get: function () { return chunkSF2CMKWA_cjs.TRAILER_FORMATS; }
|
|
325
325
|
});
|
|
326
326
|
Object.defineProperty(exports, "USE_CASE_NODE_TYPES", {
|
|
327
327
|
enumerable: true,
|
|
328
|
-
get: function () { return
|
|
328
|
+
get: function () { return chunkSF2CMKWA_cjs.USE_CASE_NODE_TYPES; }
|
|
329
329
|
});
|
|
330
330
|
Object.defineProperty(exports, "ExecutionsResource", {
|
|
331
331
|
enumerable: true,
|
|
@@ -389,19 +389,19 @@ Object.defineProperty(exports, "CopilotResource", {
|
|
|
389
389
|
});
|
|
390
390
|
Object.defineProperty(exports, "CallbackAuth", {
|
|
391
391
|
enumerable: true,
|
|
392
|
-
get: function () { return
|
|
392
|
+
get: function () { return chunkWFWZBYBS_cjs.CallbackAuth; }
|
|
393
393
|
});
|
|
394
394
|
Object.defineProperty(exports, "NodaroClientCore", {
|
|
395
395
|
enumerable: true,
|
|
396
|
-
get: function () { return
|
|
396
|
+
get: function () { return chunkWFWZBYBS_cjs.NodaroClientCore; }
|
|
397
397
|
});
|
|
398
398
|
Object.defineProperty(exports, "StaticTokenAuth", {
|
|
399
399
|
enumerable: true,
|
|
400
|
-
get: function () { return
|
|
400
|
+
get: function () { return chunkWFWZBYBS_cjs.StaticTokenAuth; }
|
|
401
401
|
});
|
|
402
402
|
Object.defineProperty(exports, "supabaseAuth", {
|
|
403
403
|
enumerable: true,
|
|
404
|
-
get: function () { return
|
|
404
|
+
get: function () { return chunkWFWZBYBS_cjs.supabaseAuth; }
|
|
405
405
|
});
|
|
406
406
|
Object.defineProperty(exports, "AlreadyRunningError", {
|
|
407
407
|
enumerable: true,
|
|
@@ -517,7 +517,7 @@ Object.defineProperty(exports, "CreaturesResource", {
|
|
|
517
517
|
});
|
|
518
518
|
Object.defineProperty(exports, "CreditsResource", {
|
|
519
519
|
enumerable: true,
|
|
520
|
-
get: function () { return
|
|
520
|
+
get: function () { return chunkFIMBPKIH_cjs.CreditsResource; }
|
|
521
521
|
});
|
|
522
522
|
Object.defineProperty(exports, "DeveloperAppsResource", {
|
|
523
523
|
enumerable: true,
|
|
@@ -525,7 +525,7 @@ Object.defineProperty(exports, "DeveloperAppsResource", {
|
|
|
525
525
|
});
|
|
526
526
|
Object.defineProperty(exports, "AppsResource", {
|
|
527
527
|
enumerable: true,
|
|
528
|
-
get: function () { return
|
|
528
|
+
get: function () { return chunkJOXZ4ZIF_cjs.AppsResource; }
|
|
529
529
|
});
|
|
530
530
|
Object.defineProperty(exports, "AudioResource", {
|
|
531
531
|
enumerable: true,
|
package/dist/index.d.cts
CHANGED
|
@@ -31,7 +31,7 @@ export { CreateNodePresetGroupInput, CreateNodePresetInput, FactoryPresetEntry,
|
|
|
31
31
|
export { ConnectedReference, DescribedReference, GenericEdge, GenericNode } from '@nodaro/shared/types';
|
|
32
32
|
export { VideoCharacterReference, VideoCharacterVoice } from '@nodaro/shared/video';
|
|
33
33
|
export { AudioFxPreset, GenerateMaskOutput, GenerateMaskRequest, VideoDepthColormap, VideoDepthModelSize, VideoDepthProvider, VideoDepthResolution } from '@nodaro/shared/media';
|
|
34
|
-
export { A as AssembleNarratedVideoParams, B as BatchJobOutcome, E as EditImageCommonParams, a as EditImageFromTaskParams, b as EditImageFromUrlParams, c as EditImageParams, d as EditScene3DParams, G as GenerateImageBatchGroup, e as GenerateImageBatchOutput, f as GenerateImageBatchResult, g as GenerateImageParams, h as GenerateMaskJobOutput, i as GenerateMaskParams, j as GenerateScene3DParams, k as GenerateVideoParams, l as GenerationSessionParams, I as ImageJobStarted, m as ImageToImageParams, J as JobOutputImage, N as NodeCategory, n as NodeCreditRate, o as NodeDescriptor, p as NodeInputField, q as NodeInputSchema, r as NodeJobOutput, s as NodeQuote, t as NodesResource, O as OutputType, P as Pro3DRenderJobOutput, u as Pro3DRenderParams, v as Pro3DRenderQuote, w as Pro3DRenderRunOptions, x as Pro3DRenderRunParams, Q as QuoteAdjustment, y as QuoteWarning, R as ReferenceCaptionParams, z as RenderScene3DParams, C as RetainedScene3DEditParams, D as RetainedScene3DEditResult, F as RunAndWaitOptions, H as RunManyResult, K as RunNodeAdjustment, L as RunNodeOptions, M as RunNodeResult, S as RunNodeWarning, T as SCENE3D_DELIVERY_ASSET_USAGE, U as Scene3DAuthoringEngine, V as Scene3DCapabilities, W as Scene3DDelivery, X as Scene3DDeliveryAsset, Y as Scene3DDeliveryAssetKind, Z as Scene3DJobOutput, _ as SocialSearchJobOutput, $ as SplitImageParams, a0 as SplitImageResult, a1 as SplitImageTile, a2 as StructuredReferenceParams, a3 as Subject, a4 as TextToSpeechParams, a5 as TextToVideoParams, a6 as VideoDepthParams, a7 as VideoToVideoParams, a8 as VideoUpscaleParams } from './nodes-
|
|
34
|
+
export { A as AssembleNarratedVideoParams, B as BatchJobOutcome, E as EditImageCommonParams, a as EditImageFromTaskParams, b as EditImageFromUrlParams, c as EditImageParams, d as EditScene3DParams, G as GenerateImageBatchGroup, e as GenerateImageBatchOutput, f as GenerateImageBatchResult, g as GenerateImageParams, h as GenerateMaskJobOutput, i as GenerateMaskParams, j as GenerateScene3DParams, k as GenerateVideoParams, l as GenerationSessionParams, I as ImageJobStarted, m as ImageToImageParams, J as JobOutputImage, N as NodeCategory, n as NodeCreditRate, o as NodeDescriptor, p as NodeInputField, q as NodeInputSchema, r as NodeJobOutput, s as NodeQuote, t as NodesResource, O as OutputType, P as Pro3DRenderJobOutput, u as Pro3DRenderParams, v as Pro3DRenderQuote, w as Pro3DRenderRunOptions, x as Pro3DRenderRunParams, Q as QuoteAdjustment, y as QuoteWarning, R as ReferenceCaptionParams, z as RenderScene3DParams, C as RetainedScene3DEditParams, D as RetainedScene3DEditResult, F as RunAndWaitOptions, H as RunManyResult, K as RunNodeAdjustment, L as RunNodeOptions, M as RunNodeResult, S as RunNodeWarning, T as SCENE3D_DELIVERY_ASSET_USAGE, U as Scene3DAuthoringEngine, V as Scene3DCapabilities, W as Scene3DDelivery, X as Scene3DDeliveryAsset, Y as Scene3DDeliveryAssetKind, Z as Scene3DJobOutput, _ as SocialSearchJobOutput, $ as SplitImageParams, a0 as SplitImageResult, a1 as SplitImageTile, a2 as StructuredReferenceParams, a3 as Subject, a4 as TextToSpeechParams, a5 as TextToVideoParams, a6 as VideoDepthParams, a7 as VideoToVideoParams, a8 as VideoUpscaleParams } from './nodes-Szl6HrZ_.cjs';
|
|
35
35
|
export { TopazUpscaleFactor } from '@nodaro/shared/credits';
|
|
36
36
|
export { CHARACTER_ASPECT_DEFAULTS, CHARACTER_ASPECT_OPTIONS, CHARACTER_STYLES, OBJECT_ASPECT_DEFAULTS as CREATURE_ASPECT_DEFAULTS, OBJECT_ASPECT_OPTIONS as CREATURE_ASPECT_OPTIONS, CREATURE_ATTACH_COLUMNS, CharacterAspectRatio, ObjectAspectRatio as CreatureAspectRatio, CreatureAttachColumn, EntityStyle, ImageToImageAttachColumn, LOCATION_ASSET_TYPES, LOCATION_ATTACH_COLUMNS, LocationAssetType, LocationAttachColumn, OBJECT_ASPECT_DEFAULTS, OBJECT_ASPECT_OPTIONS, OBJECT_ASSET_TYPES, OBJECT_ATTACH_COLUMNS, ObjectAspectRatio, ObjectAssetType, ObjectAttachColumn, SURROUND_DIRECTIONS, SurroundDirection } from '@nodaro/shared/entities';
|
|
37
37
|
export { AccessTokenResponse, ExchangeCodeInput, OAuthAppInfo, OAuthResource } from './entries/oauth.cjs';
|
|
@@ -53,7 +53,7 @@ export { CreateSessionInput, GenerationSession, ListSessionItemsParams, ListSess
|
|
|
53
53
|
export { CreateShotInput, Shot, ShotEntityRef, ShotMode, ShotsResource, UpdateShotInput } from './entries/shots.cjs';
|
|
54
54
|
export { StudioDocumentJson, StudioEditInput, StudioGenerationReply, StudioKeyframeAcceptanceInput, StudioKeyframeGenerationInput, StudioKeyframeRecord, StudioProductionCapabilities, StudioProductionRecord, StudioProductionReply, StudioResource, StudioShotGenerationInput } from './entries/studio.cjs';
|
|
55
55
|
export { BrowseTemplatesParams, BrowseTemplatesResult, CloneTemplateParams, CloneTemplateResult, Template, TemplateBrowseCard, TemplateSort, TemplatesResource } from './entries/templates.cjs';
|
|
56
|
-
export { ListTrendRunsParams, ListTrendsParams, TrendCard, TrendChipKey, TrendChips, TrendChoice, TrendDetail, TrendDetailSlot, TrendEngine, TrendEstimate, TrendExample, TrendPage, TrendResolution, TrendRun, TrendRunDisplaySlot, TrendRunOptions, TrendRunRequest, TrendRunSlot, TrendSlotKind, TrendTag, TrendsResource } from './entries/trends.cjs';
|
|
56
|
+
export { ListTrendRunsParams, ListTrendsParams, TrendCard, TrendChipKey, TrendChips, TrendChoice, TrendDetail, TrendDetailSlot, TrendEngine, TrendEstimate, TrendExample, TrendOriginal, TrendPage, TrendResolution, TrendRun, TrendRunDisplaySlot, TrendRunOptions, TrendRunRequest, TrendRunSlot, TrendSlotKind, TrendTag, TrendsResource } from './entries/trends.cjs';
|
|
57
57
|
export { TutorialCategory, TutorialFlowItem, TutorialVideoItem, TutorialsResource } from './entries/tutorials.cjs';
|
|
58
58
|
export { UploadJsonResult, UploadResult, UploadsResource } from './entries/uploads.cjs';
|
|
59
59
|
export { ContinueVideoProResult, StopVideoProResult, VideoProResource } from './entries/video-pro.cjs';
|
package/dist/index.d.ts
CHANGED
|
@@ -31,7 +31,7 @@ export { CreateNodePresetGroupInput, CreateNodePresetInput, FactoryPresetEntry,
|
|
|
31
31
|
export { ConnectedReference, DescribedReference, GenericEdge, GenericNode } from '@nodaro/shared/types';
|
|
32
32
|
export { VideoCharacterReference, VideoCharacterVoice } from '@nodaro/shared/video';
|
|
33
33
|
export { AudioFxPreset, GenerateMaskOutput, GenerateMaskRequest, VideoDepthColormap, VideoDepthModelSize, VideoDepthProvider, VideoDepthResolution } from '@nodaro/shared/media';
|
|
34
|
-
export { A as AssembleNarratedVideoParams, B as BatchJobOutcome, E as EditImageCommonParams, a as EditImageFromTaskParams, b as EditImageFromUrlParams, c as EditImageParams, d as EditScene3DParams, G as GenerateImageBatchGroup, e as GenerateImageBatchOutput, f as GenerateImageBatchResult, g as GenerateImageParams, h as GenerateMaskJobOutput, i as GenerateMaskParams, j as GenerateScene3DParams, k as GenerateVideoParams, l as GenerationSessionParams, I as ImageJobStarted, m as ImageToImageParams, J as JobOutputImage, N as NodeCategory, n as NodeCreditRate, o as NodeDescriptor, p as NodeInputField, q as NodeInputSchema, r as NodeJobOutput, s as NodeQuote, t as NodesResource, O as OutputType, P as Pro3DRenderJobOutput, u as Pro3DRenderParams, v as Pro3DRenderQuote, w as Pro3DRenderRunOptions, x as Pro3DRenderRunParams, Q as QuoteAdjustment, y as QuoteWarning, R as ReferenceCaptionParams, z as RenderScene3DParams, C as RetainedScene3DEditParams, D as RetainedScene3DEditResult, F as RunAndWaitOptions, H as RunManyResult, K as RunNodeAdjustment, L as RunNodeOptions, M as RunNodeResult, S as RunNodeWarning, T as SCENE3D_DELIVERY_ASSET_USAGE, U as Scene3DAuthoringEngine, V as Scene3DCapabilities, W as Scene3DDelivery, X as Scene3DDeliveryAsset, Y as Scene3DDeliveryAssetKind, Z as Scene3DJobOutput, _ as SocialSearchJobOutput, $ as SplitImageParams, a0 as SplitImageResult, a1 as SplitImageTile, a2 as StructuredReferenceParams, a3 as Subject, a4 as TextToSpeechParams, a5 as TextToVideoParams, a6 as VideoDepthParams, a7 as VideoToVideoParams, a8 as VideoUpscaleParams } from './nodes-
|
|
34
|
+
export { A as AssembleNarratedVideoParams, B as BatchJobOutcome, E as EditImageCommonParams, a as EditImageFromTaskParams, b as EditImageFromUrlParams, c as EditImageParams, d as EditScene3DParams, G as GenerateImageBatchGroup, e as GenerateImageBatchOutput, f as GenerateImageBatchResult, g as GenerateImageParams, h as GenerateMaskJobOutput, i as GenerateMaskParams, j as GenerateScene3DParams, k as GenerateVideoParams, l as GenerationSessionParams, I as ImageJobStarted, m as ImageToImageParams, J as JobOutputImage, N as NodeCategory, n as NodeCreditRate, o as NodeDescriptor, p as NodeInputField, q as NodeInputSchema, r as NodeJobOutput, s as NodeQuote, t as NodesResource, O as OutputType, P as Pro3DRenderJobOutput, u as Pro3DRenderParams, v as Pro3DRenderQuote, w as Pro3DRenderRunOptions, x as Pro3DRenderRunParams, Q as QuoteAdjustment, y as QuoteWarning, R as ReferenceCaptionParams, z as RenderScene3DParams, C as RetainedScene3DEditParams, D as RetainedScene3DEditResult, F as RunAndWaitOptions, H as RunManyResult, K as RunNodeAdjustment, L as RunNodeOptions, M as RunNodeResult, S as RunNodeWarning, T as SCENE3D_DELIVERY_ASSET_USAGE, U as Scene3DAuthoringEngine, V as Scene3DCapabilities, W as Scene3DDelivery, X as Scene3DDeliveryAsset, Y as Scene3DDeliveryAssetKind, Z as Scene3DJobOutput, _ as SocialSearchJobOutput, $ as SplitImageParams, a0 as SplitImageResult, a1 as SplitImageTile, a2 as StructuredReferenceParams, a3 as Subject, a4 as TextToSpeechParams, a5 as TextToVideoParams, a6 as VideoDepthParams, a7 as VideoToVideoParams, a8 as VideoUpscaleParams } from './nodes-MThDit8l.js';
|
|
35
35
|
export { TopazUpscaleFactor } from '@nodaro/shared/credits';
|
|
36
36
|
export { CHARACTER_ASPECT_DEFAULTS, CHARACTER_ASPECT_OPTIONS, CHARACTER_STYLES, OBJECT_ASPECT_DEFAULTS as CREATURE_ASPECT_DEFAULTS, OBJECT_ASPECT_OPTIONS as CREATURE_ASPECT_OPTIONS, CREATURE_ATTACH_COLUMNS, CharacterAspectRatio, ObjectAspectRatio as CreatureAspectRatio, CreatureAttachColumn, EntityStyle, ImageToImageAttachColumn, LOCATION_ASSET_TYPES, LOCATION_ATTACH_COLUMNS, LocationAssetType, LocationAttachColumn, OBJECT_ASPECT_DEFAULTS, OBJECT_ASPECT_OPTIONS, OBJECT_ASSET_TYPES, OBJECT_ATTACH_COLUMNS, ObjectAspectRatio, ObjectAssetType, ObjectAttachColumn, SURROUND_DIRECTIONS, SurroundDirection } from '@nodaro/shared/entities';
|
|
37
37
|
export { AccessTokenResponse, ExchangeCodeInput, OAuthAppInfo, OAuthResource } from './entries/oauth.js';
|
|
@@ -53,7 +53,7 @@ export { CreateSessionInput, GenerationSession, ListSessionItemsParams, ListSess
|
|
|
53
53
|
export { CreateShotInput, Shot, ShotEntityRef, ShotMode, ShotsResource, UpdateShotInput } from './entries/shots.js';
|
|
54
54
|
export { StudioDocumentJson, StudioEditInput, StudioGenerationReply, StudioKeyframeAcceptanceInput, StudioKeyframeGenerationInput, StudioKeyframeRecord, StudioProductionCapabilities, StudioProductionRecord, StudioProductionReply, StudioResource, StudioShotGenerationInput } from './entries/studio.js';
|
|
55
55
|
export { BrowseTemplatesParams, BrowseTemplatesResult, CloneTemplateParams, CloneTemplateResult, Template, TemplateBrowseCard, TemplateSort, TemplatesResource } from './entries/templates.js';
|
|
56
|
-
export { ListTrendRunsParams, ListTrendsParams, TrendCard, TrendChipKey, TrendChips, TrendChoice, TrendDetail, TrendDetailSlot, TrendEngine, TrendEstimate, TrendExample, TrendPage, TrendResolution, TrendRun, TrendRunDisplaySlot, TrendRunOptions, TrendRunRequest, TrendRunSlot, TrendSlotKind, TrendTag, TrendsResource } from './entries/trends.js';
|
|
56
|
+
export { ListTrendRunsParams, ListTrendsParams, TrendCard, TrendChipKey, TrendChips, TrendChoice, TrendDetail, TrendDetailSlot, TrendEngine, TrendEstimate, TrendExample, TrendOriginal, TrendPage, TrendResolution, TrendRun, TrendRunDisplaySlot, TrendRunOptions, TrendRunRequest, TrendRunSlot, TrendSlotKind, TrendTag, TrendsResource } from './entries/trends.js';
|
|
57
57
|
export { TutorialCategory, TutorialFlowItem, TutorialVideoItem, TutorialsResource } from './entries/tutorials.js';
|
|
58
58
|
export { UploadJsonResult, UploadResult, UploadsResource } from './entries/uploads.js';
|
|
59
59
|
export { ContinueVideoProResult, StopVideoProResult, VideoProResource } from './entries/video-pro.js';
|
package/dist/index.js
CHANGED
|
@@ -49,19 +49,19 @@ import './chunk-M6Y5TOYE.js';
|
|
|
49
49
|
import './chunk-KARJ7P7Y.js';
|
|
50
50
|
import './chunk-SUCHGNYT.js';
|
|
51
51
|
import './chunk-SLPD47SR.js';
|
|
52
|
-
export { NodaroClient, createClient } from './chunk-
|
|
52
|
+
export { NodaroClient, createClient } from './chunk-RQY2WJD3.js';
|
|
53
53
|
export { VideoProResource } from './chunk-ERLXU47J.js';
|
|
54
54
|
export { VoicesResource } from './chunk-T7N7DFQJ.js';
|
|
55
55
|
export { WebhooksResource } from './chunk-YN6CBIIB.js';
|
|
56
|
-
export { WorkflowsResource } from './chunk-
|
|
56
|
+
export { WorkflowsResource } from './chunk-33HT46A3.js';
|
|
57
57
|
export { WorkspacesResource } from './chunk-Z5GLY4R3.js';
|
|
58
58
|
export { SCENE3D_DELIVERY_ASSET_USAGE, Scene3DResource } from './chunk-NNHWH7ER.js';
|
|
59
59
|
export { SessionsResource } from './chunk-Y6VDCZPB.js';
|
|
60
60
|
export { ShotsResource } from './chunk-WVFAQBS7.js';
|
|
61
61
|
export { StudioProductionsResource, StudioResource, isStudioGenerateEstimate } from './chunk-AUKHMT53.js';
|
|
62
|
-
export { TemplatesResource } from './chunk-
|
|
63
|
-
export { TrendsResource } from './chunk-
|
|
64
|
-
export { TutorialsResource } from './chunk-
|
|
62
|
+
export { TemplatesResource } from './chunk-M7VSFZMV.js';
|
|
63
|
+
export { TrendsResource } from './chunk-CKHCSZCV.js';
|
|
64
|
+
export { TutorialsResource } from './chunk-HPXE3NZW.js';
|
|
65
65
|
export { UploadsResource } from './chunk-WY4QRJZW.js';
|
|
66
66
|
export { PALETTE_DIRECTION_PREFIX, PalettesResource, paletteDirectionId } from './chunk-WEQWU2IC.js';
|
|
67
67
|
export { PickerCatalogsResource } from './chunk-KFZOJBI5.js';
|
|
@@ -71,15 +71,15 @@ export { PromptHelperResource } from './chunk-OIPPTBW4.js';
|
|
|
71
71
|
export { RecastResource } from './chunk-AJVSMNPZ.js';
|
|
72
72
|
export { ReduceResource } from './chunk-IHKIYVZQ.js';
|
|
73
73
|
export { SavedPostsResource } from './chunk-NCCBS6GU.js';
|
|
74
|
-
export { MediaResource } from './chunk-
|
|
74
|
+
export { MediaResource } from './chunk-BQAW4RX2.js';
|
|
75
75
|
export { ModelsResource } from './chunk-Y6V6CBY5.js';
|
|
76
76
|
export { MOODBOARD_DIRECTION_PREFIX, MoodboardsResource, moodboardDirectionId } from './chunk-YVU2M7MI.js';
|
|
77
77
|
export { PresetsResource } from './chunk-JTAW54UM.js';
|
|
78
|
-
export { NodesResource } from './chunk-
|
|
78
|
+
export { NodesResource } from './chunk-JB4GVP4Q.js';
|
|
79
79
|
export { OAuthResource } from './chunk-Z7LGWNI7.js';
|
|
80
80
|
export { OBJECT_ASPECT_DEFAULTS, OBJECT_ASPECT_OPTIONS, OBJECT_ASSET_TYPES, OBJECT_ATTACH_COLUMNS, ObjectsResource } from './chunk-7LSFG2AF.js';
|
|
81
81
|
export { OrganizationsResource } from './chunk-ALSLZG3U.js';
|
|
82
|
-
export { CLIP_PACK_MAX_TARGET_SEC, CLIP_PACK_MIN_TARGET_SEC, EditResource, TRAILER_FORMATS, USE_CASE_NODE_TYPES } from './chunk-
|
|
82
|
+
export { CLIP_PACK_MAX_TARGET_SEC, CLIP_PACK_MIN_TARGET_SEC, EditResource, TRAILER_FORMATS, USE_CASE_NODE_TYPES } from './chunk-RBX3QTKB.js';
|
|
83
83
|
export { ExecutionsResource, OUTPUT_BEARING_NODE_STATUSES, nodeStateMayCarryOutput } from './chunk-Z3ZKFI2M.js';
|
|
84
84
|
export { GalleryResource } from './chunk-JDEZHITT.js';
|
|
85
85
|
export { JobsResource } from './chunk-6MQ2LTJZ.js';
|
|
@@ -91,12 +91,12 @@ export { CommunityResource } from './chunk-SFB4YLCS.js';
|
|
|
91
91
|
export { CompetitorsResource } from './chunk-BU5A6K4C.js';
|
|
92
92
|
export { CopilotResource } from './chunk-D2ILCSOQ.js';
|
|
93
93
|
import './chunk-7CUWAVWB.js';
|
|
94
|
-
export { CallbackAuth, NodaroClientCore, StaticTokenAuth, supabaseAuth } from './chunk-
|
|
94
|
+
export { CallbackAuth, NodaroClientCore, StaticTokenAuth, supabaseAuth } from './chunk-3Y5TV37H.js';
|
|
95
95
|
export { AlreadyRunningError, AppRunVersionChangedError, CREDIT_CAP_CODES, ContinuationPreviewPendingError, ContinuationRefusedError, CreditCapExceededError, ForbiddenError, InsufficientCreditsError, JobAbortedError, JobBlockedError, JobFailedError, JobHeldError, JobTimeoutError, NodaroError, NotFoundError, RateLimitedError, StorageExceededError, StudioOpError, StudioPreviewAppliedError, StudioPreviewUnavailable, UnauthorizedError, WorkflowConflictError, throwFromResponse } from './chunk-L6T44A3G.js';
|
|
96
96
|
export { OBJECT_ASPECT_DEFAULTS as CREATURE_ASPECT_DEFAULTS, OBJECT_ASPECT_OPTIONS as CREATURE_ASPECT_OPTIONS, CREATURE_ASSET_TYPES, CREATURE_ATTACH_COLUMNS, CreaturesResource } from './chunk-CK3AMMSC.js';
|
|
97
|
-
export { CreditsResource } from './chunk-
|
|
97
|
+
export { CreditsResource } from './chunk-5MOJSYHI.js';
|
|
98
98
|
export { DeveloperAppsResource } from './chunk-65E3JBFZ.js';
|
|
99
|
-
export { AppsResource } from './chunk-
|
|
99
|
+
export { AppsResource } from './chunk-7LODCIQK.js';
|
|
100
100
|
export { AudioResource } from './chunk-3QFTP5P5.js';
|
|
101
101
|
export { BillingResource } from './chunk-J4WFSKY6.js';
|
|
102
102
|
export { CastSwapResource } from './chunk-HKDIIFG2.js';
|
|
@@ -631,7 +631,7 @@ interface NodeDescriptor {
|
|
|
631
631
|
* it is meaningful on Cloud only). */
|
|
632
632
|
creditCost?: number | string;
|
|
633
633
|
/** `creditCost` is an ESTIMATE: a metered LLM node's typical call on its
|
|
634
|
-
* default model, charged its actual usage after the run (shown
|
|
634
|
+
* default model, charged its actual usage after the run (shown `≈N`).
|
|
635
635
|
* Absent for a fixed price, and under the tier-pricing rollback. A metered
|
|
636
636
|
* LLM node whose default model has no price yet lists `creditCost:
|
|
637
637
|
* "unpriced"` (a run on it is refused `llm_model_unpriced`). */
|
|
@@ -631,7 +631,7 @@ interface NodeDescriptor {
|
|
|
631
631
|
* it is meaningful on Cloud only). */
|
|
632
632
|
creditCost?: number | string;
|
|
633
633
|
/** `creditCost` is an ESTIMATE: a metered LLM node's typical call on its
|
|
634
|
-
* default model, charged its actual usage after the run (shown
|
|
634
|
+
* default model, charged its actual usage after the run (shown `≈N`).
|
|
635
635
|
* Absent for a fixed price, and under the tier-pricing rollback. A metered
|
|
636
636
|
* LLM node whose default model has no price yet lists `creditCost:
|
|
637
637
|
* "unpriced"` (a run on it is refused `llm_model_unpriced`). */
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nodaro/sdk",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.45.1",
|
|
4
4
|
"description": "Typed REST client for the Nodaro API — workflows, jobs, executions, apps, characters, and more.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -307,8 +307,8 @@
|
|
|
307
307
|
"test:watch": "vitest"
|
|
308
308
|
},
|
|
309
309
|
"dependencies": {
|
|
310
|
-
"@nodaro/shared": "^3.
|
|
311
|
-
"@nodaro/prompts": "^1.42.
|
|
310
|
+
"@nodaro/shared": "^3.43.0",
|
|
311
|
+
"@nodaro/prompts": "^1.42.1"
|
|
312
312
|
},
|
|
313
313
|
"peerDependencies": {
|
|
314
314
|
"@fingerprintjs/fingerprintjs": "^5.2.0",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/resources/nodes.ts"],"names":["JobAbortedError","NodaroError","NotFoundError","JobFailedError","nodeRunRoute","NODE_TYPES_WITHOUT_RUN_ROUTE","SOCIAL_POST_NODE_PLATFORM","NODE_RUN_ROUTES","JobHeldError","JobTimeoutError"],"mappings":"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","file":"chunk-2VJOHJUZ.cjs","sourcesContent":["import type { GenerateScene3DParams, EditScene3DParams, RenderScene3DParams, Scene3DJobOutput, Pro3DRenderRunParams, Pro3DRenderJobOutput } from \"./scene3d-types.js\"\nimport type { ImageToImageParams, EditImageParams, SplitImageParams, SplitImageResult, GenerateMaskParams, GenerateMaskJobOutput, ImageJobStarted } from \"./nodes-image-params.js\"\nimport type { VideoToVideoParams, NodeQuote } from \"./nodes-video-params.js\"\nimport type { NodaroClientCore } from \"../core.js\"\nimport type { JobStatusResult, JobsResource } from \"./jobs.js\"\nimport { JobAbortedError, JobFailedError, JobHeldError, JobTimeoutError, NodaroError, NotFoundError } from \"../errors.js\"\nimport { NODE_RUN_ROUTES, NODE_TYPES_WITHOUT_RUN_ROUTE, nodeRunRoute } from \"@nodaro/shared/nodes\"\nimport {\n SOCIAL_POST_NODE_PLATFORM,\n type SocialPost,\n type SocialPlatform,\n type SocialSearchMode,\n type SocialSearchParams\n} from \"@nodaro/shared/social\"\nimport type { ConnectedReference, DescribedReference } from \"@nodaro/shared/types\"\nimport type { VideoCharacterReference } from \"@nodaro/shared/video\"\nimport type { ModelInputAdjustment } from \"@nodaro/shared/model-catalog\"\nimport type { VideoDepthProvider, VideoDepthModelSize, VideoDepthColormap, VideoDepthResolution } from \"@nodaro/shared/media\"\nimport type { DirectionFields, SubjectFields } from \"@nodaro/prompts/prompt-builder\"\n\nexport type NodeCategory =\n | \"input\"\n | \"parameter\"\n | \"ai-image\"\n | \"ai-video\"\n | \"ai-audio\"\n | \"ai-text\"\n | \"processing\"\n | \"composition\"\n | \"trigger\"\n | \"output\"\n | \"control\"\n | \"entity\"\n | \"utility\"\n\nexport type OutputType = \"text\" | \"image\" | \"video\" | \"audio\" | \"data\" | \"none\"\n\n/**\n * Field shape inside a node's `inputSchema.fields[]`. Mirrors\n * `backend/src/lib/node-registry.ts`.\n */\nexport interface NodeInputField {\n key: string\n type: string\n required?: boolean\n options?: string[]\n}\n\nexport interface NodeInputSchema {\n fields: NodeInputField[]\n}\n\n/**\n * A per-unit price on a node descriptor. A run of N units is charged\n * `ceil(N × creditsPerUnit)`, rounded up once — so `GET /v1/credits/model-cost`\n * for `identifier` (one unit, rounded up: the least a run pays) times N can come\n * to more. `<identifier>:<N>u` is the exact price of N units; for a whole run\n * use `POST /v1/credits/estimate-workflow`.\n */\nexport interface NodeCreditRate {\n /** The price id the rate is read from. */\n identifier: string\n /** What one unit is, as a token (`\"1000-frames\"`: one started block of 1,000 sampled frames). */\n unit: string\n /** The credits one unit adds to a run's total — exact, not rounded. */\n creditsPerUnit: number\n /** The fewest units a run is charged for. */\n minUnits: number\n /** `\"ceil-run-total\"`: the run's total is rounded up to a whole credit once, never per unit. */\n rounding: \"ceil-run-total\"\n /** The rule in words. */\n note: string\n}\n\n/**\n * Node descriptor returned by `GET /v1/nodes` and `GET /v1/nodes/:type`.\n * Mirrors `backend/src/lib/node-registry.ts#NodeDescriptor`.\n */\nexport interface NodeDescriptor {\n type: string\n label: string\n category: NodeCategory\n description: string\n outputType: OutputType\n /** The credits a run is charged, the figure on the node's Run button.\n * Number when fixed, string range like \"10-80\" when model-dependent.\n * Undefined when the node is free — or on editions\n * without a credit system (community/business omit the field entirely;\n * it is meaningful on Cloud only). */\n creditCost?: number | string\n /** `creditCost` is an ESTIMATE: a metered LLM node's typical call on its\n * default model, charged its actual usage after the run (shown `~N`).\n * Absent for a fixed price, and under the tier-pricing rollback. A metered\n * LLM node whose default model has no price yet lists `creditCost:\n * \"unpriced\"` (a run on it is refused `llm_model_unpriced`). */\n estimate?: true\n /** A node charged per unit of its own measure (its `creditCost` is a word\n * such as `\"per-1000-frames\"`): the charged price of one unit and how a run\n * rounds. Cloud only, like `creditCost`. */\n creditRate?: NodeCreditRate\n /** Input fields the node exposes for user override (subset of full config). */\n inputSchema?: NodeInputSchema\n /** For AI nodes: list of provider IDs supported. */\n providers?: string[]\n /** Capability flags such as \"supports-reference-image\" or \"supports-end-frame\". */\n capabilities?: string[]\n /** Hard duration ceiling in seconds (e.g. Generate Video Pro's env-configured cap). */\n maxDurationSec?: number\n /** Providers whose segment-duration menu is sparse (off-menu values snap to the nearest entry). */\n sparseProviders?: string[]\n /** Per-provider resolution tiers, e.g. `{ \"minimax-h3\": [\"2K\", \"768P\"] }`. */\n providerResolutions?: Record<string, string[]>\n /** Per-provider map of display resolution → the literal wire value the API expects. */\n providerResolutionWire?: Record<string, Record<string, string>>\n /** Generate Video Pro: the deployed engine accepts the `soundtrack` input (original-audio replay). */\n soundtrack?: boolean\n}\n\n/**\n * Result of a direct node execution. Most node types return `{ jobId }` and\n * are processed asynchronously by a worker — the caller polls\n * `client.jobs.get(jobId)` until status is `completed`/`failed`.\n *\n * Some node types (`meta-ads-scrape`, for one) answer synchronously and\n * return their full result body. The shape is route-specific; consumers\n * should branch on the presence of `jobId`.\n */\n/**\n * One parameter the server corrected because the chosen model does not accept\n * the value you sent (e.g. `gpt-image-2` has no 3:2 aspect ratio). The run\n * proceeds with the corrected value rather than failing — this is how you find\n * out what it actually used.\n *\n * Re-exports `@nodaro/shared`'s `ModelInputAdjustment` — the same shape the\n * server's `normalizeModelInput` / `resolveNormalizedImageGen` populate — under\n * the SDK's naming convention, rather than declaring a second copy of the\n * fields.\n */\nexport type RunNodeAdjustment = ModelInputAdjustment\n\n/**\n * WHO is in the shot, as picker-catalog option ids — the `subject` field of\n * `generate-image` (and `text-to-video`). The platform writes the wording from\n * the ids you send; you never write prompt text for the subject. It composes\n * with `prompt`: the subject clauses are folded in right after your prompt and\n * ahead of any `direction`.\n *\n * A flat map of field → id(s):\n * - **Keys** are the platform's own picker field names — every Person field\n * (`type`, `age`, `ethnicity`, `hairBase`, `lipState`, …), every Styling\n * field (`makeup`, `jewelry`, `outerwear`, …), and the prop keys `heldProp`,\n * `material` and `animal`. They and their ids come from the picker catalogs:\n * `pickerCatalogs.get(\"person\")` / `get(\"styling\")` list each dimension's\n * `field` with its `options[].id`; `get(\"held-prop\")`, `get(\"material\")` and\n * `get(\"animal\")` write their `options[].id` to the catalog's `valueField`.\n * - **Values** are one id or a list of ids. Ids past a dimension's own cap are\n * dropped, not rejected.\n * - **One number:** `customAge` (years, rounded and clamped to 0–120), read only\n * when `age` is `\"age-custom\"`. A number on any other key does nothing.\n * - **Bounds** (without `presetId`): at most 128 keys, 64 characters per key,\n * 8 ids per key and 100 characters per id — a map over any of them is a 400\n * `validation_error`. Unknown keys and unknown ids within them are skipped,\n * and the job's `input_data.subject` records the ids that were used.\n * - **With `presetId`** your `subject` replaces the preset's own and is folded\n * into the preset's prompt, as `direction` and `structured` are: an over-long\n * key, id or list is dropped rather than rejected, and `input_data` does not\n * record the subject.\n *\n * Same type as `@nodaro/prompts`' `SubjectFields`, under the SDK's name.\n */\nexport type Subject = SubjectFields\n\n/**\n * Something you asked for that the run did not send, with why — e.g.\n * `moodboard_images_not_sent`: some of a `moodboard:<id>` direction's images\n * did not fit the model's reference limit after your own references. The run\n * goes ahead; the same warnings are kept on the job's `input_data.warnings`.\n */\nexport interface RunNodeWarning {\n code: string\n message: string\n}\n\nexport type RunNodeResult =\n | { jobId: string; usageLogId?: string; adjustments?: RunNodeAdjustment[]; warnings?: RunNodeWarning[]; [k: string]: unknown }\n | Record<string, unknown>\n\n/**\n * Structured references — the editor's wired-reference shape — shared by\n * `generate-image` and `generate-video`. The route assembles them server-side\n * into per-ref `@image_N` directives and resolves `{image:N}` prompt tokens, so\n * a direct SDK run binds inline references exactly like the canvas. Pass the\n * same `ConnectedReference[]` the editor builds; the route dedupes + caps them\n * to the provider's image-reference limit.\n */\nexport interface StructuredReferenceParams {\n /** Wired references assembled server-side (deduped + capped per provider). */\n connectedReferences?: ConnectedReference[]\n /**\n * References you can NAME and DESCRIBE but have no media for — a cast role no\n * entity is bound to yet, a character that exists only in the script. They\n * carry no url, so nothing is attached and no `@image_N` seat is used: each\n * becomes a `<Name> — <description>.` line, and a name left in the prompt\n * prose reaches the model as a real, described subject. Up to 10.\n */\n describedReferences?: DescribedReference[]\n /** Reorder the assembled reference list by stable ref ids; renumbers `@image_N`. */\n referenceOrder?: string[]\n}\n\n/**\n * Captions for a node's video / audio rail references — INDEX-ALIGNED with\n * `referenceVideoUrls` / `referenceAudioUrls`, so `referenceVideoCaptions[0]`\n * describes `referenceVideoUrls[0]`. Each renders as `@video_N: <caption>.` /\n * `@audio_N: <caption>.` in the assembled prompt and is bounded by the number of\n * rail references that actually ship, so a caption can never bind a slot the\n * payload dropped. A blank entry is a hole in the alignment, not a line.\n */\nexport interface ReferenceCaptionParams {\n referenceVideoCaptions?: string[]\n referenceAudioCaptions?: string[]\n}\n\n/**\n * Typed request body for `nodes.run(\"text-to-speech\", …)` / `runAndWait`.\n * Common fields are typed; any other route field passes through.\n */\nexport interface TextToSpeechParams extends GenerationSessionParams {\n text: string\n /** A premade voice NAME (Rachel, George, …) or a library / custom voice id. */\n voice?: string\n voiceType?: \"premade\" | \"custom\" | \"library\"\n /** `elevenlabs-v4` (the default), `elevenlabs-v3`, `elevenlabs-v4-turbo`, `elevenlabs-turbo`, `elevenlabs-multilingual`. */\n provider?: string\n stability?: number\n similarityBoost?: number\n style?: number\n speed?: number\n languageCode?: string\n /**\n * Continuity across clips: the line spoken just BEFORE this one in the finished piece\n * (the previous clip's text). Context, not spoken — a model that stitches (v4, Turbo, Multilingual; not v3) carries the\n * intonation across the cut; others ignore it. Up to 1,000 characters (a 400 above, on a model that stitches).\n */\n previousText?: string\n /** The line spoken just AFTER this one. Same rule as `previousText`. */\n nextText?: string\n [k: string]: unknown\n}\n\n/**\n * Fields every job-creating request accepts beside its own params, on any\n * route: the platform stamps them on the job it creates. Typed on every\n * generation params type.\n */\nexport interface GenerationSessionParams {\n /** A session from `client.sessions.create()` — the job is born in it and\n * shows in its feed. Must be one of yours (404 otherwise). */\n sessionId?: string\n /** Your app's slug (`create-image`, …): stored on the job, and what\n * `jobs.list({ origin })` filters on. Lowercase letters, digits, dashes. */\n origin?: string\n}\n\n/**\n * Typed request body for `nodes.run(\"generate-image\", …)` / `runAndWait`.\n * Common fields are typed; any other route field passes through via the index\n * signature (the route Zod-validates the full body).\n *\n * `count` above 1 or `models` makes several jobs in one call: the answer is a\n * {@link GenerateImageBatchResult}, and {@link NodesResource.runBatchAndWait}\n * (not `runAndWait`) waits for it.\n */\nexport interface GenerateImageParams extends StructuredReferenceParams, GenerationSessionParams {\n prompt?: string\n /**\n * Apply a node preset (a factory id like `\"generate-image/cinematic-still\"`, from\n * `presets.listFactory(\"generate-image\")`, or one of yours) exactly as the editor does:\n * its prompt and pre/post text, placeholder defaults, style, negative prompt and\n * levers. Fields you pass override it; your `prompt` is wrapped in its pre/post text.\n */\n presetId?: string\n /** Values for the preset's placeholders that have no default, e.g. `{ BRAND: \"Acme\" }`.\n * Without them such a preset answers 400 `preset_variables_required`, naming them. */\n presetVariables?: Record<string, string>\n /** The prompt as your user typed it, when `prompt` is a version your app\n * expanded (filled-in fields, resolved references). Stored on the job as\n * `input_data.userPrompt` to show what the user wrote; never sent to the\n * model. Defaults to `prompt`. */\n userPrompt?: string\n /** Pre & post text wrapped around `prompt` (a preset's words), joined the\n * same way every AI prompt node joins them. */\n promptPrefix?: string\n promptSuffix?: string\n provider?: string\n /** How many images to make, 1–4 — each its own job, one image each, under\n * its own Idempotency-Key (`<key>:<i>`). With `models`, per model. */\n count?: number\n /** 2–4 distinct image model ids: the same request runs on each, instead of\n * `provider`. models × count is at most 8. With `presetId`, the preset is\n * applied once per model. */\n models?: string[]\n /** With `count`, image i gets `seed + i` — one seed would draw the same image every time. */\n seed?: number\n /** Flat reference image URLs — appended after `connectedReferences`. */\n referenceImageUrls?: string[]\n negativePrompt?: string\n /**\n * Cinematic direction as catalog IDS — the route renders the wording. Two\n * keys also take one of YOUR saved resources:\n * - `colorLook: \"palette:<id>\"` (`paletteDirectionId(id)`) — the palette's\n * colours, each by an everyday name and its hex, go into the prompt;\n * - `style: \"moodboard:<id>\"` (`moodboardDirectionId(id)`) — the moodboard's\n * description goes into the prompt and its images go to the model as style\n * references, after your own references and up to the model's reference\n * limit (the answer's `warnings` says when some did not fit). Its images\n * are references, so on models priced per reference the run costs what is\n * sent.\n * A malformed one answers 400; one that is not yours (or was deleted) 404\n * `direction_not_found`. The job keeps the id, so a re-run resolves it again.\n * Not combinable with `presetId` yet (400 `validation_error`).\n */\n direction?: DirectionFields\n /**\n * WHO is in the shot — person, styling and props as picker-catalog ids\n * ({@link Subject}). The platform writes the wording and folds it in after\n * `prompt`, ahead of `direction`. With `presetId`, it replaces the preset's own\n * and is folded into the preset's prompt (over-long values dropped, not 400).\n */\n subject?: Subject\n /**\n * The image to edit. Alone, the run is image-to-image on it (a text-to-image\n * model runs as its image-to-image sibling); with `maskUrl`, an inpaint.\n */\n baseImageUrl?: string\n /**\n * Inpaint mask — white = the area to change, black = keep (what\n * `generate-mask` writes). Needs a base: `baseImageUrl`, else the first\n * `referenceImageUrls` entry. Works on EVERY image model: the result's masked\n * area is composited back over the base, so everything outside the mask is\n * the base's own pixels. On the models whose `IMAGE_MASK_MODE` is `\"prompt\"`\n * (`@nodaro/shared`) the masked area's position is also described in the\n * prompt; the rest rely on the composite alone. (A model that takes the mask\n * itself is on `image-to-image` — `I2I_MASK_SUPPORT`.)\n */\n maskUrl?: string\n /** 0–1: how far the result may move from the base (taken by the models in `I2I_STRENGTH_SUPPORT`). */\n strength?: number\n /** 0–20: prompt adherence (taken by the models in `GUIDANCE_SCALE_SUPPORT`). */\n guidanceScale?: number\n [k: string]: unknown\n}\n\n/** One model's share of a generate-image batch. */\nexport interface GenerateImageBatchGroup {\n /** The model id as requested. */\n model: string\n jobIds: string[]\n /** Credits held for this model's images; absent where nothing is charged. */\n credits?: number\n /** Parameters corrected for this model, as on a single call. */\n adjustments?: RunNodeAdjustment[]\n /** Something asked for that was not sent on this model (e.g. a moodboard past its reference limit), as on a single call. */\n warnings?: RunNodeWarning[]\n}\n\n/**\n * What `nodes.run(\"generate-image\", …)` answers when `count` is above 1 or\n * `models` is set: every job, grouped by model. The whole batch was checked\n * against the balance and created, charged and queued together — or not at\n * all (`InsufficientCreditsError`'s `required` is then the batch's total).\n */\nexport interface GenerateImageBatchResult {\n /** The first job — so code reading the single-image answer keeps working. */\n jobId: string\n /** Every job: model by model, then image by image. */\n jobIds: string[]\n /** On every job of the batch as `input_data.batchId`; `jobs.list({ batchId })` lists them. */\n batchId: string\n groups: GenerateImageBatchGroup[]\n /** The groups' credits summed; absent where nothing is charged. */\n totalCredits?: number\n /** Every job already existed and this request charged nothing: a repeat of an earlier request with the same Idempotency-Key. */\n deduped?: true\n}\n\n/**\n * One job of a batch once {@link NodesResource.runBatchAndWait} stops waiting\n * for it: its output, or the typed error that ended the wait — a\n * `JobFailedError` (failed or cancelled), `JobHeldError` (held for review) or\n * `JobTimeoutError`. One job's error never discards the others' images.\n */\nexport type BatchJobOutcome =\n | { readonly jobId: string; readonly model: string; readonly status: \"completed\"; readonly output: NodeJobOutput }\n | { readonly jobId: string; readonly model: string; readonly status: \"error\"; readonly error: NodaroError }\n\n/** What {@link NodesResource.runBatchAndWait} resolves. */\nexport interface GenerateImageBatchOutput {\n /** The submit's answer: the ids, the groups, the credits. */\n readonly batch: GenerateImageBatchResult\n /** Every job, in `batch.jobIds` order. */\n readonly results: readonly BatchJobOutcome[]\n}\n\n/**\n * Typed request body for `nodes.run(\"generate-video\", …)` / `runAndWait`.\n * Common fields are typed; any other route field passes through.\n */\nexport interface GenerateVideoParams extends StructuredReferenceParams, ReferenceCaptionParams, GenerationSessionParams {\n prompt?: string\n provider?: string\n /** Start-frame image (image-to-video). */\n imageUrl?: string\n /** Closing frame, paired with `imageUrl` on models that support one. */\n endFrameUrl?: string\n referenceImageUrls?: string[]\n referenceVideoUrls?: string[]\n referenceAudioUrls?: string[]\n /**\n * Identity inputs that keep a real person's face — a portrait + description\n * per person. Only models with a dedicated character channel take them; any\n * other model answers `400`. Distinct from `referenceImageUrls`, which a\n * multimodal model treats as loose context. Adds no credit charge.\n *\n * - Gemini Omni (`gemini-omni-video`, `gemini-omni-flash`): up to 3. Cannot be\n * combined with a start frame (`imageUrl`); each character uses 1 of the\n * model's 7 input units (2 with a `bodyImageUrl`). Give a character a\n * `voice` to pin one voice persona (a Gemini preset + optional description /\n * example line) across clips — up to 3 distinct voices a request.\n * - Kling 4.0 (`kling-4`): up to 7 named subjects, written in the prompt as\n * `@Name`. A subject takes 2–4 images — the portrait, then `bodyImageUrl` /\n * `extraImageUrls`; one with a single image is sent as a reference image.\n * Counts toward the model's 15 materials. No `voice` (send a recorded\n * voice as `referenceAudioUrls`).\n */\n characterReferences?: VideoCharacterReference[]\n /** Kling 4.0 (`kling-4`): keep the reference videos' own sound instead of\n * generating new sound. Ignored without a reference video and by every\n * other model. */\n keepOriginalSound?: boolean\n /** How a start/end frame is reshaped before the model sees it. Default\n * `\"resolution\"`: resize it to the pixel size that model actually renders,\n * which is what stops the provider reshaping it mid-clip. `\"ratio\"` corrects\n * only the aspect; `\"original\"` sends it untouched. */\n frameFit?: \"original\" | \"ratio\" | \"resolution\"\n /** Whether the frame travels as a real start frame or as a reference image\n * bound in the prompt as the opening frame. Default `\"auto\"`, which picks per\n * model. Ignored by models that take no reference images. */\n frameDelivery?: \"auto\" | \"frame\" | \"reference\"\n /** Seedance Draft (`seedance-2-5` only; ignored elsewhere): render a 480p\n * DRAFT — it costs the same as a 480p run and any `resolution` is replaced\n * by 480p. Finalize the take you like with `nodes.run(\"video-upscale\",\n * { provider: \"seedance-2-5-hd\", sourceJobId })`: the same take, frame for\n * frame, at 1080p. Drafts are kept about 7 days. */\n draft?: boolean\n [k: string]: unknown\n}\n\n/**\n * Typed request body for `nodes.run(\"text-to-video\", …)` / `runAndWait` — the\n * PROMPT-ONLY video lane (`POST /v1/text-to-video`).\n *\n * Which lane takes what: `text-to-video` renders from text (plus optional\n * references) and `prompt` is REQUIRED; frames belong to `generate-video`\n * alone, which is the image-to-video lane (`imageUrl` start frame, `endFrameUrl`\n * closing frame) and where a prompt is optional. A model with no text-to-video\n * mode answers this lane with a `400 image_required` naming itself.\n *\n * Common fields are typed; any other route field passes through.\n */\nexport interface TextToVideoParams extends StructuredReferenceParams, ReferenceCaptionParams, GenerationSessionParams {\n prompt: string\n provider?: string\n duration?: number\n /** Native audio toggle, on the models that render sound. */\n sound?: boolean\n negativePrompt?: string\n aspectRatio?: string\n resolution?: string\n seed?: number\n referenceImageUrls?: string[]\n referenceVideoUrls?: string[]\n referenceAudioUrls?: string[]\n /** Identity inputs that keep a real person's face — see {@link GenerateVideoParams.characterReferences}. */\n characterReferences?: VideoCharacterReference[]\n /** Kling 4.0 (`kling-4`): keep the reference videos' own sound — see {@link GenerateVideoParams.keepOriginalSound}. */\n keepOriginalSound?: boolean\n /** Cinematic direction as catalog IDS — the route renders the wording. */\n direction?: DirectionFields\n /** WHO is in the shot as picker-catalog ids ({@link Subject}), folded ahead of the direction clauses. */\n subject?: Subject\n /** Seedance Draft (`seedance-2-5` only; ignored elsewhere): render a 480p\n * DRAFT — it costs the same as a 480p run and any `resolution` is replaced\n * by 480p. Finalize the take you like with `nodes.run(\"video-upscale\",\n * { provider: \"seedance-2-5-hd\", sourceJobId })`: the same take, frame for\n * frame, at 1080p. Drafts are kept about 7 days. */\n draft?: boolean\n /** Absent / `true`: a copyright refusal is retried once with a reworded\n * prompt. `false` = a copyright refusal fails the job instead of retrying\n * once with a reworded prompt. */\n contentPolicyRewrite?: boolean\n [k: string]: unknown\n}\n\n/**\n * Typed request body for `nodes.run(\"video-upscale\", …)` / `runAndWait`.\n *\n * - `topaz` (default): upscale any `videoUrl` by `upscaleFactor`.\n * - `veo-1080p` / `veo-4k`: re-render a VEO generation by its `taskId`.\n * - `seedance-2-5-hd`: finalize a Seedance 2.5 DRAFT (a `draft: true` run) —\n * the same take re-rendered at 1080p at the draft's own length. Name the\n * draft by `sourceJobId` (its job id) or `taskId` (its providerTaskId). The\n * price comes from the draft (its length, and whether it used a reference\n * video), never from this body. A foreign, unfinished or non-draft source is\n * refused with a 4xx before anything is charged.\n *\n * Any other route field passes through.\n */\nexport interface VideoUpscaleParams extends GenerationSessionParams {\n provider?: \"topaz\" | \"veo-1080p\" | \"veo-4k\" | \"seedance-2-5-hd\"\n videoUrl?: string\n upscaleFactor?: \"1\" | \"2\" | \"4\"\n taskId?: string\n sourceJobId?: string\n [k: string]: unknown\n}\n\n/**\n * Typed request body for `nodes.run(\"assemble-narrated-video\", …)` / `runAndWait`.\n * Assembles blocks of video with audio narration into a single composed video.\n */\nexport interface AssembleNarratedVideoParams extends GenerationSessionParams {\n blocks: { videoUrl: string; audioUrl?: string }[]\n voiceVolume?: number\n clipAudioVolume?: number\n maxSlowdown?: number\n trimStartFrames?: number\n trimEndFrames?: number\n [k: string]: unknown\n}\n\n/**\n * Typed request body for `nodes.run(\"video-depth\", …)` / `runAndWait` — turns a\n * video into a depth video (`POST /v1/video-depth`, near is bright, far is\n * dark). The completed job writes `videoUrl` (MP4) and `thumbnailUrl`.\n *\n * Two providers: `video-depth-anything` (the default, temporally consistent)\n * honours every lever below; `depth-anything-frames` (Depth Anything per\n * frame) takes `modelSize` and `colormap` only, and renders only `grayscale` /\n * `inferno`. A lever the chosen provider does not take is dropped and a\n * colormap it cannot render becomes `grayscale` — coerced, never rejected (a\n * value outside the vocabularies below is still a `400 validation_error`).\n *\n * The clip is measured before any credits are reserved. Too long answers\n * `400 video_too_long` (`video-depth-anything`: more than 2,400 frames or\n * 300 s; `depth-anything-frames`: more than 80 s); a clip that cannot be read\n * answers `400 video_unreadable`; a provider the deployment has turned off\n * answers `403 model_not_available`.\n *\n * Common fields are typed; any other route field passes through.\n */\nexport interface VideoDepthParams extends GenerationSessionParams {\n /** The source video — a public http(s) URL. */\n videoUrl: string\n /** Default `video-depth-anything`. */\n provider?: VideoDepthProvider\n /** `small` / `base` / `large` (the default) — larger is more detailed and slower. */\n modelSize?: VideoDepthModelSize\n /** Default `grayscale`. `depth-anything-frames` renders only `grayscale` / `inferno`. */\n colormap?: VideoDepthColormap\n /** `video-depth-anything` only. Default `auto`. */\n resolution?: VideoDepthResolution\n /** `video-depth-anything` only: render the original and the depth next to each other. */\n sideBySide?: boolean\n [k: string]: unknown\n}\n\n/**\n * The `output_data` shape a finalized generation job writes. Every async\n * generation node persists one (or more) of these media URLs to\n * `jobs.output_data` on completion — `generate-image` → `imageUrl`,\n * `generate-video` / `combine-videos` / `merge-video-audio` / `video-upscale` /\n * `video-depth` → `videoUrl` (+ `thumbnailUrl`), `text-to-speech` / `generate-music` →\n * `audioUrl` (a `text-to-speech` run with `withTimestamps: true` on a model\n * that returns timings, and every `text-to-dialogue` run on one, also carries\n * `transcript`). Resolved by {@link NodesResource.runAndWait}. Extra fields may be\n * present, so the index signature is open.\n */\n/**\n * The completed `social-search` job's `output_data`: EVERY post the search\n * found, in the order it asked for (Social Search, Nodaro Cloud). Picking the\n * posts a workflow passes on is an editor step; a direct caller gets them all.\n */\nexport interface SocialSearchJobOutput extends NodeJobOutput {\n readonly json: readonly SocialPost[]\n readonly platform: SocialPlatform\n readonly mode: SocialSearchMode\n readonly query: string\n /** Non-fatal notes (\"only part of the results could be loaded\"). */\n readonly warnings?: readonly string[]\n}\n\nexport interface NodeJobOutput {\n /** `text-to-speech` / `generate-music` / audio nodes write here. For\n * `audio-separation` this is the primary stem (vocals). */\n readonly audioUrl?: string\n /** `audio-separation` (Demucs) per-stem URLs. `vocalUrl`/`instrumentalUrl`\n * in vocal/instrumental mode; the rest in full-stems mode. */\n readonly vocalUrl?: string\n readonly instrumentalUrl?: string\n readonly drumsUrl?: string\n readonly bassUrl?: string\n readonly otherUrl?: string\n readonly guitarUrl?: string\n readonly pianoUrl?: string\n /** `generate-video` / `combine-videos` / `merge-video-audio` / `video-upscale` / `video-depth` write here. */\n readonly videoUrl?: string\n /** `generate-image` / `edit-image` / `extract-frame` write here. */\n readonly imageUrl?: string\n /** Every image, when the job made more than one; `imageUrl` is the first. */\n readonly imageUrls?: readonly string[]\n /**\n * The output's pixel size. On an image job: the size of `imageUrl` as it is\n * stored — what you download, a free-tier watermark included — with EXIF\n * orientation applied, so the size a browser shows. Lay a grid tile out\n * before the image loads, or show and sort by size.\n *\n * Present on image jobs completed after this release (and on the jobs that\n * always recorded it: image overlay, video overlay, video mask, mask\n * composite). Absent when the size could not be read — never half a size.\n */\n readonly width?: number\n readonly height?: number\n /**\n * Beside `imageUrls`: each image with its pixel size, index-aligned\n * (`images[i]` is `imageUrls[i]`). Present on image jobs completed after\n * this release when at least one size was read; an entry whose size could\n * not be read has its `url` and no `width` / `height`.\n */\n readonly images?: readonly JobOutputImage[]\n /** Poster frame for video outputs. */\n readonly thumbnailUrl?: string\n readonly [k: string]: unknown\n}\n\n/** One image of a job that made several — see {@link NodeJobOutput.images}. */\nexport interface JobOutputImage {\n readonly url: string\n /** Pixel size as stored, EXIF orientation applied. Absent when it could not be read. */\n readonly width?: number\n readonly height?: number\n}\n\n/** Options for {@link NodesResource.runAndWait} and {@link NodesResource.runMany}. */\nexport interface RunAndWaitOptions {\n /**\n * Abort the run/poll loop. Aborting (or passing an already-aborted signal)\n * stops polling and rejects with {@link JobAbortedError}, whose `jobId`\n * names the job once it was submitted. Aborting stops the WAITING only: the\n * job keeps running and is charged, unless {@link cancelOnAbort} is set.\n */\n readonly signal?: AbortSignal\n /**\n * Also cancel the job when `signal` aborts after it was submitted\n * (`POST /v1/jobs/:id/cancel`, which refunds its credit hold — except a\n * metered LLM job whose call has started: it answers `inFlight: true`,\n * finishes, and is charged what it used). Best effort:\n * a failed cancel still rejects with the {@link JobAbortedError}. Default\n * `false` — aborting only stops waiting.\n */\n readonly cancelOnAbort?: boolean\n /** Called with each lean status the poll loop observes (running → terminal). */\n readonly onProgress?: (status: JobStatusResult) => void\n /** Poll interval in ms. Default 2000. */\n readonly pollMs?: number\n /** Wall-clock cap before giving up, in ms. Default ~15 min (900_000). */\n readonly maxMs?: number\n /**\n * `Idempotency-Key` for the submit half. Reuse the same value when retrying a\n * call that timed out, so the run is not started or charged twice. Omitted →\n * no key, which is the historical behaviour for every node that does not\n * require one.\n */\n readonly idempotencyKey?: string\n}\n\n/** Per-call transport controls for {@link NodesResource.run}. */\nexport interface RunNodeOptions {\n /** `Idempotency-Key` header. See {@link RunAndWaitOptions.idempotencyKey}. */\n readonly idempotencyKey?: string\n}\n\n/** One settled result from {@link NodesResource.runMany}. */\nexport interface RunManyResult {\n readonly jobId: string\n readonly output: NodeJobOutput\n}\n\n// Terminal statuses (poll loop stops on these) are handled explicitly in\n// `pollJob`: `completed` resolves output_data, `failed`/`cancelled` throw a\n// JobFailedError — matching studio's `completed | failed | cancelled` set.\nconst DEFAULT_POLL_MS = 2000\n/** Safety cap so a stuck job can't poll forever (~15 min at 2s). */\nconst DEFAULT_MAX_MS = 15 * 60 * 1000\n\nconst sleep = (ms: number, signal?: AbortSignal): Promise<void> =>\n new Promise<void>((resolve, reject) => {\n if (signal?.aborted) {\n reject(new JobAbortedError())\n return\n }\n const timer = setTimeout(() => {\n signal?.removeEventListener(\"abort\", onAbort)\n resolve()\n }, ms)\n function onAbort() {\n clearTimeout(timer)\n reject(new JobAbortedError())\n }\n signal?.addEventListener(\"abort\", onAbort, { once: true })\n })\n\n/** The error for a node type that cannot be run on its own. */\nfunction notRunnable(type: string, why: string): NodaroError {\n return new NodaroError(`Node type \"${type}\" has no route of its own to run it directly: ${why}.`, \"node_not_runnable\", 0)\n}\n\n/** A 404 for the route itself (the server has no such path), not for a missing resource. */\nconst isRouteNotFound = (err: unknown): boolean => err instanceof NotFoundError && /^Route\\b.*\\bnot found\\b/i.test(err.message)\n\n/** Pull a `{ jobId }` off a run result, or throw a labelled JobFailedError. */\nfunction extractJobId(result: RunNodeResult, label: string): string {\n if (result && typeof result === \"object\" && \"jobId\" in result) {\n const jobId = (result as { jobId: unknown }).jobId\n if (typeof jobId === \"string\") return jobId\n }\n // No jobId means the node ran inline/synchronously (meta-ads-scrape, etc.) or\n // the route shape changed — runAndWait is for async jobs, so this is an error.\n throw new JobFailedError(`${label} did not return a jobId`, \"\")\n}\n\n/** Whether a generate-image request makes several jobs: `count` above 1, or `models`. */\nfunction isImageBatchRequest(type: string, params: Record<string, unknown>): boolean {\n if (type !== \"generate-image\") return false\n return (typeof params.count === \"number\" && params.count > 1) || Array.isArray(params.models)\n}\n\n/** The job ids of a batch answer (several jobs from one call), or null for a single job. */\nfunction batchJobIds(result: RunNodeResult): string[] | null {\n const ids = (result as { jobIds?: unknown } | null)?.jobIds\n return Array.isArray(ids) && ids.every((id) => typeof id === \"string\") ? (ids as string[]) : null\n}\n\n/** A wait-for-one-job method asked to wait for a batch. */\nfunction batchRefusal(detail: string): NodaroError {\n return new NodaroError(\n `${detail}: this waits for one job — use nodes.runBatchAndWait() for a batch (count above 1, or models).`,\n \"batch_requires_run_batch_and_wait\",\n 0,\n )\n}\n\n/** The batch answer of a generate-image call, checked, or null. */\nfunction batchResultOf(result: RunNodeResult): GenerateImageBatchResult | null {\n const r = result as Partial<GenerateImageBatchResult> | null\n if (!r || typeof r.batchId !== \"string\" || !batchJobIds(result) || !Array.isArray(r.groups)) return null\n return r as GenerateImageBatchResult\n}\n\nexport class NodesResource {\n /** Runs poll through `jobs`, so the client must carry that resource too. */\n constructor(private client: NodaroClientCore & { readonly jobs: JobsResource }) {}\n\n /** List all known node descriptors. Server caches publicly for 5 minutes. */\n list(): Promise<{ data: NodeDescriptor[] }> {\n return this.client.request(\"GET\", \"/v1/nodes\")\n }\n\n /** Get a single node descriptor by type slug (e.g. \"generate-image\"). */\n get(type: string): Promise<{ data: NodeDescriptor }> {\n return this.client.request(\"GET\", `/v1/nodes/${encodeURIComponent(type)}`)\n }\n\n /**\n * Run a single node directly without wrapping it in a workflow. Posts\n * `params` as the request body to the node's API route. Most use\n * `POST /v1/<type>`; the rest are listed in `NODE_RUN_ROUTES` (exported by\n * `@nodaro/shared`): scene authoring uses `/v1/3d-scene/generate|edit`,\n * `llm-chat` uses `/v1/llm-chat/generate`, the Suno nodes `/v1/suno/…`, the\n * social post nodes `/v1/social/publish` (a per-platform node fills in its\n * `platform` when you leave it out), and render-video with a planType uses\n * `/v1/render-video/plan`.\n *\n * A node type with no route of its own (`NODE_TYPES_WITHOUT_RUN_ROUTE`, e.g.\n * `modify-image`, which runs through `image-to-image`) rejects with a\n * {@link NodaroError} of code `node_not_runnable` naming what to run\n * instead, without calling the API. A type that runs only inside a workflow\n * (an input, trigger, utility or parameter node such as `upload-image`)\n * rejects the same way once the API answers that it has no such route; a\n * 404 about a missing resource stays a `NotFoundError`.\n *\n * This is the SDK equivalent of the MCP server's verb tools — and the\n * path the Nodaro CLI uses for `nodaro nodes run <type>`.\n *\n * Most node types are async: the response includes `{ jobId }` and the\n * actual generation runs on a worker. Poll `client.jobs.get(jobId)` until\n * completed. Synchronous node types (`meta-ads-scrape`, etc.) return their\n * full result without a `jobId` field.\n *\n * @param type Node type slug — must match an entry in the registry\n * returned by `list()` (e.g. \"generate-image\").\n * @param params Request body. Field names must match the node's\n * `inputSchema` (see `get(type).inputSchema`).\n */\n run(type: \"generate-3d-scene\", params: GenerateScene3DParams): Promise<RunNodeResult>\n run(type: \"edit-3d-scene\", params: EditScene3DParams): Promise<RunNodeResult>\n run(type: \"render-video\", params: RenderScene3DParams): Promise<RunNodeResult>\n run(type: \"pro-3d-render\", params: Pro3DRenderRunParams, options?: RunNodeOptions): Promise<RunNodeResult>\n run(type: \"generate-image\", params: GenerateImageParams & ({ count: 2 | 3 | 4 } | { models: string[] }), options?: RunNodeOptions): Promise<GenerateImageBatchResult>\n run(type: \"generate-image\", params?: GenerateImageParams, options?: RunNodeOptions): Promise<RunNodeResult>\n run(type: \"text-to-speech\", params: TextToSpeechParams): Promise<RunNodeResult>\n run(type: \"generate-video\", params?: GenerateVideoParams, options?: RunNodeOptions): Promise<RunNodeResult>\n run(type: \"text-to-video\", params: TextToVideoParams, options?: RunNodeOptions): Promise<RunNodeResult>\n run(type: \"video-to-video\", params: VideoToVideoParams, options?: RunNodeOptions): Promise<RunNodeResult>\n run(type: \"video-upscale\", params: VideoUpscaleParams, options?: RunNodeOptions): Promise<RunNodeResult>\n run(type: \"assemble-narrated-video\", params?: AssembleNarratedVideoParams, options?: RunNodeOptions): Promise<RunNodeResult>\n run(type: \"social-search\", params: SocialSearchParams, options?: RunNodeOptions): Promise<RunNodeResult>\n run(type: \"video-depth\", params: VideoDepthParams, options?: RunNodeOptions): Promise<RunNodeResult>\n run(type: \"image-to-image\", params: ImageToImageParams, options?: RunNodeOptions): Promise<ImageJobStarted>\n run(type: \"edit-image\", params: EditImageParams, options?: RunNodeOptions): Promise<ImageJobStarted>\n run(type: \"generate-mask\", params: GenerateMaskParams, options?: RunNodeOptions): Promise<ImageJobStarted>\n /** Synchronous and free: answers the tiles, no job. */\n run(type: \"split-image\", params: SplitImageParams, options?: RunNodeOptions): Promise<SplitImageResult>\n run(type: string, params?: Record<string, unknown>, options?: RunNodeOptions): Promise<RunNodeResult>\n run(type: string, params: Record<string, unknown> = {}, options: RunNodeOptions = {}): Promise<RunNodeResult | GenerateImageBatchResult> {\n // The route comes from the table the platform's workflow engine uses\n // too; only render-video's plan route depends on the body.\n const route = type === \"render-video\" && typeof params.planType === \"string\" ? \"/v1/render-video/plan\" : nodeRunRoute(type)\n if (!route) return Promise.reject(notRunnable(type, NODE_TYPES_WITHOUT_RUN_ROUTE[type]!))\n // A per-platform social node publishes through the shared route, which\n // needs the platform the node type stands for.\n const platform = SOCIAL_POST_NODE_PLATFORM[type]\n const body = platform && params.platform === undefined ? { ...params, platform } : params\n // Only a type on the `/v1/<type>` convention is relabelled: a listed\n // route that 404s means a platform that predates it, not a node that\n // cannot run.\n const conventional = !Object.prototype.hasOwnProperty.call(NODE_RUN_ROUTES, type)\n return this.client\n .request<RunNodeResult>(\"POST\", route, {\n body,\n // Transport-level retry safety, opt-in per call. The platform reads the\n // standard header, so a caller that reuses a key on a retry gets the\n // same run back instead of a second charge.\n ...(options.idempotencyKey ? { headers: { \"Idempotency-Key\": options.idempotencyKey } } : {}),\n })\n .catch((err: unknown) => {\n if (conventional && isRouteNotFound(err)) throw notRunnable(type, \"it runs only inside a workflow (client.workflows.run)\")\n throw err\n })\n }\n\n /**\n * The price of a run before it starts (`POST /v1/quote`). Send exactly the\n * body you would send to {@link run}: the platform prices it with the same\n * code the run route reserves with — validation, measuring reference clips,\n * the price id and the credit amount — but starts nothing and charges\n * nothing.\n *\n * `reserve` is what the run will hold when it starts; `expected`, when\n * present, is what it should actually cost (a Seedance edit renders the\n * source clip's length). A run settles to what was generated, never above\n * `reserve`. Rejects with the same `400` the run would answer for an\n * invalid body. Typed for the video lanes; any other node type takes its\n * run body as-is.\n *\n * @param type Node type slug, as for {@link run}.\n * @param params The run body.\n */\n quote(type: \"text-to-video\", params: TextToVideoParams): Promise<NodeQuote>\n quote(type: \"generate-video\", params: GenerateVideoParams): Promise<NodeQuote>\n quote(type: \"video-to-video\", params: VideoToVideoParams): Promise<NodeQuote>\n /** A Seedance 2.5 draft's 1080p finalize (`seedance-2-5-hd`) is priced from\n * the draft itself, including the clips it was made with. */\n quote(type: \"video-upscale\", params: VideoUpscaleParams): Promise<NodeQuote>\n quote(type: string, params?: Record<string, unknown>): Promise<NodeQuote>\n async quote(type: string, params: Record<string, unknown> = {}): Promise<NodeQuote> {\n const res = await this.client.request<{ data: NodeQuote }>(\"POST\", \"/v1/quote\", { body: { type, params } })\n return res.data\n }\n\n /**\n * Run a single async node to completion: {@link run} it, extract the\n * `{ jobId }`, then client-poll `jobs.getStatus(jobId)` every `pollMs`\n * (default 2000) until a terminal status, up to `maxMs` (default ~15 min).\n *\n * Resolves the job's typed `output_data` ({@link NodeJobOutput}) on\n * `completed`. Throws (all typed, catchable by `instanceof`):\n * - {@link InsufficientCreditsError} / {@link StorageExceededError} etc. —\n * surfaced by the underlying {@link run} on 402/413/… before any poll.\n * - {@link JobFailedError} — terminal `failed`/`cancelled` (carries the\n * job's `error_message` + `jobId`).\n * - {@link JobTimeoutError} — `maxMs` deadline exceeded before terminal.\n * - {@link JobAbortedError} — `signal` fired (or was already aborted);\n * polling stops immediately.\n * - {@link JobHeldError} — the job entered `pending_review` on a deployment\n * that registers a job policy. Ends the poll on the FIRST held tick (that\n * status waits on a human, not on the job) and does NOT cancel it.\n * - {@link JobBlockedError} — a 422 from {@link run} before any poll: the\n * deployment's job policy refused the request outright.\n *\n * Polling is fully client-side (no server function blocks) — the same model\n * thin clients use, lifted out of their hand-rolled run→poll loops.\n *\n * @param type Node type slug (e.g. \"generate-video\"). See {@link run}.\n * @param params Request body — field names match the node's `inputSchema`.\n * @param opts `signal` / `onProgress` / `pollMs` / `maxMs`.\n */\n runAndWait(type: \"generate-3d-scene\", params: GenerateScene3DParams, options?: RunAndWaitOptions): Promise<Scene3DJobOutput>\n runAndWait(type: \"edit-3d-scene\", params: EditScene3DParams, options?: RunAndWaitOptions): Promise<Scene3DJobOutput>\n runAndWait(type: \"render-video\", params: RenderScene3DParams, options?: RunAndWaitOptions): Promise<NodeJobOutput>\n runAndWait(type: \"pro-3d-render\", params: Pro3DRenderRunParams, options?: RunAndWaitOptions): Promise<Pro3DRenderJobOutput>\n runAndWait(type: \"generate-image\", params?: GenerateImageParams, opts?: RunAndWaitOptions): Promise<NodeJobOutput>\n runAndWait(type: \"text-to-speech\", params: TextToSpeechParams, opts?: RunAndWaitOptions): Promise<NodeJobOutput>\n runAndWait(type: \"generate-video\", params?: GenerateVideoParams, opts?: RunAndWaitOptions): Promise<NodeJobOutput>\n runAndWait(type: \"text-to-video\", params: TextToVideoParams, opts?: RunAndWaitOptions): Promise<NodeJobOutput>\n runAndWait(type: \"video-to-video\", params: VideoToVideoParams, opts?: RunAndWaitOptions): Promise<NodeJobOutput>\n runAndWait(type: \"video-upscale\", params: VideoUpscaleParams, opts?: RunAndWaitOptions): Promise<NodeJobOutput>\n runAndWait(type: \"assemble-narrated-video\", params?: AssembleNarratedVideoParams, opts?: RunAndWaitOptions): Promise<NodeJobOutput>\n runAndWait(type: \"social-search\", params: SocialSearchParams, opts?: RunAndWaitOptions): Promise<SocialSearchJobOutput>\n runAndWait(type: \"video-depth\", params: VideoDepthParams, opts?: RunAndWaitOptions): Promise<NodeJobOutput>\n runAndWait(type: \"image-to-image\", params: ImageToImageParams, opts?: RunAndWaitOptions): Promise<NodeJobOutput>\n runAndWait(type: \"edit-image\", params: EditImageParams, opts?: RunAndWaitOptions): Promise<NodeJobOutput>\n runAndWait(type: \"generate-mask\", params: GenerateMaskParams, opts?: RunAndWaitOptions): Promise<GenerateMaskJobOutput>\n runAndWait<T extends string>(type: T, params?: Record<string, unknown>, opts?: RunAndWaitOptions): Promise<T extends \"pro-3d-render\" ? Pro3DRenderJobOutput : T extends \"generate-3d-scene\" | \"edit-3d-scene\" ? Scene3DJobOutput : T extends \"generate-mask\" ? GenerateMaskJobOutput : NodeJobOutput>\n async runAndWait(\n type: string,\n params: Record<string, unknown> = {},\n opts: RunAndWaitOptions = {},\n ): Promise<NodeJobOutput> {\n if (opts.signal?.aborted) throw new JobAbortedError()\n // A batch would be waited on as its first job alone — refused before\n // anything is submitted or charged.\n if (isImageBatchRequest(type, params)) throw batchRefusal(`${type} with count above 1 or models makes several jobs`)\n const result = await this.run(type, params, { idempotencyKey: opts.idempotencyKey })\n const ids = batchJobIds(result)\n if (ids && ids.length > 1) throw batchRefusal(`${type} started ${ids.length} jobs (${ids.join(\", \")}), which keep running`)\n const jobId = extractJobId(result, type)\n return this.pollJob(jobId, type, opts)\n }\n\n /**\n * Run a generate-image BATCH — `count` above 1 and/or `models` — to the end:\n * submit it once ({@link run}, with your `idempotencyKey` if any), then wait\n * for every job at once, each the way {@link runAndWait} waits.\n *\n * Resolves `{ batch, results }`: the submit's answer\n * ({@link GenerateImageBatchResult} — ids, groups by model, credits) and one\n * {@link BatchJobOutcome} per job, in `batch.jobIds` order — its output, or the\n * typed error that ended the wait for it. One image failing never discards the\n * others. Rejects only before any job exists (the submit's own errors, e.g.\n * `InsufficientCreditsError` with the batch total as `required`), and on\n * `signal` ({@link JobAbortedError}; `cancelOnAbort` cancels every job).\n *\n * A request for one image is refused before anything is sent (code\n * `not_a_batch`) — wait for it with {@link runAndWait}.\n */\n async runBatchAndWait(\n type: \"generate-image\",\n params: GenerateImageParams,\n opts: RunAndWaitOptions = {},\n ): Promise<GenerateImageBatchOutput> {\n if (opts.signal?.aborted) throw new JobAbortedError()\n if (!isImageBatchRequest(type, params)) {\n throw new NodaroError(\n \"runBatchAndWait waits for a batch — count above 1, or models; wait for one image with nodes.runAndWait().\",\n \"not_a_batch\",\n 0,\n )\n }\n const result = await this.run(type, params, { idempotencyKey: opts.idempotencyKey })\n const batch = batchResultOf(result)\n if (!batch) throw new JobFailedError(`${type} did not answer with a batch`, \"\")\n const modelOf = new Map(batch.groups.flatMap((group) => group.jobIds.map((id) => [id, group.model] as const)))\n const results = await Promise.all(\n batch.jobIds.map(async (jobId): Promise<BatchJobOutcome> => {\n const model = modelOf.get(jobId) ?? \"\"\n try {\n return { jobId, model, status: \"completed\", output: await this.pollJob(jobId, type, opts) }\n } catch (err) {\n if (err instanceof JobAbortedError || !(err instanceof NodaroError)) throw err\n return { jobId, model, status: \"error\", error: err }\n }\n }),\n )\n return { batch, results }\n }\n\n /**\n * Fan out N async runs of the same node `type` to completion concurrently —\n * the candidate-grid path (generate N stills/clips in parallel). Each runs\n * via {@link runAndWait}; resolves once ALL settle, to an array of\n * `{ jobId, output }` in input order. Rejects (and the rejection wins) if any\n * single run rejects — same typed errors as {@link runAndWait}, including\n * {@link JobHeldError} when one candidate is held for review while the\n * others complete. A shared `signal` aborts the whole batch.\n *\n * @param type Node type slug, applied to every entry.\n * @param paramsList One request body per candidate.\n * @param opts Shared `signal` / `cancelOnAbort` / `onProgress` / `pollMs` / `maxMs`.\n */\n async runMany(\n type: string,\n paramsList: Record<string, unknown>[],\n opts: RunAndWaitOptions = {},\n ): Promise<RunManyResult[]> {\n if (opts.signal?.aborted) throw new JobAbortedError()\n // Each entry is waited on as one job: a batch entry is refused up front.\n if (paramsList.some((params) => isImageBatchRequest(type, params))) {\n throw batchRefusal(`a ${type} entry with count above 1 or models makes several jobs`)\n }\n return Promise.all(\n paramsList.map(async (params) => {\n if (opts.signal?.aborted) throw new JobAbortedError()\n const result = await this.run(type, params)\n const jobId = extractJobId(result, type)\n const output = await this.pollJob(jobId, type, opts)\n return { jobId, output }\n }),\n )\n }\n\n /** {@link pollUntilSettled}, plus what an abort does to the job: it keeps\n * running unless `cancelOnAbort` asks to cancel it too, and the rejection\n * always names it (an abort landing mid-sleep carries no id of its own). */\n private async pollJob(\n jobId: string,\n label: string,\n opts: RunAndWaitOptions,\n ): Promise<NodeJobOutput> {\n try {\n return await this.pollUntilSettled(jobId, label, opts)\n } catch (err) {\n if (!(err instanceof JobAbortedError)) throw err\n if (opts.cancelOnAbort) await this.client.jobs.cancel(jobId).catch(() => undefined)\n throw err.jobId ? err : new JobAbortedError(err.message, jobId)\n }\n }\n\n /** Poll an already-kicked job id until it stops moving; resolve output_data\n * or throw. Two non-terminal statuses end the loop: an abort, and\n * `pending_review` (a job policy held the output for a human — see\n * {@link JobHeldError}). */\n private async pollUntilSettled(\n jobId: string,\n label: string,\n opts: RunAndWaitOptions,\n ): Promise<NodeJobOutput> {\n const pollMs = opts.pollMs ?? DEFAULT_POLL_MS\n const maxMs = opts.maxMs ?? DEFAULT_MAX_MS\n const deadline = Date.now() + maxMs\n for (;;) {\n if (opts.signal?.aborted) throw new JobAbortedError(undefined, jobId)\n const { data } = await this.client.jobs.getStatus(jobId)\n opts.onProgress?.(data)\n if (data.status === \"completed\") {\n return (data.output_data ?? {}) as NodeJobOutput\n }\n if (data.status === \"failed\" || data.status === \"cancelled\") {\n throw new JobFailedError(\n data.error_message ?? `${label} ${data.status}`,\n jobId,\n data.status,\n )\n }\n // `pending_review` is in-flight but PARKED ON A HUMAN — it does not\n // progress on its own, so continuing the loop would burn `maxMs` (15 min\n // by default) and then report a `JobTimeoutError` that misdescribes what\n // happened. End here instead, without cancelling: the output exists, the\n // reservation stays reserved, and a reviewer resolves it.\n if (data.status === \"pending_review\") {\n throw new JobHeldError(`${label} is awaiting review`, jobId)\n }\n if (Date.now() > deadline) {\n throw new JobTimeoutError(`${label} timed out`, jobId, maxMs)\n }\n await sleep(pollMs, opts.signal)\n }\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/resources/trends.ts"],"names":[],"mappings":"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","file":"chunk-4UPVE662.js","sourcesContent":["import type { NodaroClientCore } from \"../core.js\"\nimport type { CastSwapEngine } from \"./cast-swap.js\"\n\n/**\n * Trends — ready-made Cast Swap recipes. A trend is a short clip with slots\n * (the people, pets, products and place you can replace); fill its slots with\n * your own pictures and run it to get the clip back with them in it.\n *\n * Cloud edition only: `/v1/trends` 404s on self-hosted installs. Only\n * published trends exist here: a draft, unpublished or unknown slug is a 404\n * on every route. `\"runs\"` and `\"tags\"` are never slugs (`/v1/trends/runs` is\n * the run list, `/v1/trends/tags` the tag list): the slug methods throw a\n * `TypeError` for them before any request. `run()` answers 202 with a job id; follow it with\n * `client.jobs.get(jobId)` / `client.jobs.getStatus(jobId)` like any other\n * job, or read it back as a trend run with `getRun(jobId)` / `runs()`.\n *\n * Repeats: pass `{ idempotencyKey }` to `run()` and it is sent as the\n * `Idempotency-Key` header. A repeat with the same key answers with the first\n * run's `jobId`; nothing new is started or charged.\n *\n * Refusals (thrown as a `NodaroError` subclass; body `{ error: { code, message } }`):\n * - 400 `validation_error` (the body, a query, or a bad `cursor`);\n * `estimate()` / `run()` only, before anything is charged:\n * `missing_slot` (a required slot without pictures, or an optional one\n * left empty that the chosen example has no pictures for), `unknown_slot`,\n * `invalid_choice` (a chip the slot's kind does not take),\n * `chip_not_offered` (a chip of the kind that the slot's\n * {@link TrendDetailSlot.chips} does not list: the trend fixes it),\n * `example_out_of_range` (`example` names none, or an optional slot is left\n * empty and the trend has no example to fill it), `preview_unavailable` (the trend offers no\n * preview), `invalid_slot_mention` (a `{slot:<key>}` in `details` naming no\n * slot), `prompt_too_long` (shorten `details`), `draft_unsupported`\n * (`draft: true` on a trend whose `engine` has no draft: Kling 4),\n * `resolution_unsupported` (a `resolution` not in the trend's\n * `resolutions`), `too_many_images` (a Kling 4 trend's run would send more\n * than 10 pictures: send fewer per slot). The slot errors carry the\n * slot's key as `slot` (in `NodaroError.details`), and `chip_not_offered`\n * the chip as `chip` too.\n * - 401 `unauthorized`.\n * - 404 `not_found`: the trend is not published (every method), or `run()`'s\n * `sessionId` is not a session you may use.\n * - 502 `engine_error` (`estimate()` / `run()`).\n * - 503 `engine_unsupported` (this platform version cannot run trends yet),\n * `trend_unavailable` (`estimate()` / `run()`), `not_available` (this\n * server has no trend catalog yet).\n * - `estimate()` / `run()` answer the video engine's refusals with the trend\n * routes' OWN codes and fixed messages — never the engine's text or\n * `issues`: 400 `trend_run_rejected` (the inputs could not run), or\n * `clip_out_of_range` / `preview_out_of_range` / `video_unreadable` (this\n * trend's clip), `unsafe_url` (a picture is not a public http(s) address),\n * `raw_reference_token` (`details` holds `{image:` / `{video:` /\n * `{audio:`); 402 `insufficient_credits` (or a workspace cap) as given;\n * 413 `storage_limit_exceeded`; 422 `job_blocked` (the job policy\n * blocked it); 429 `rate_limited`; 503 `engine_unsupported`,\n * `estimate_unavailable`; 502 `engine_error` for anything else. `run()`\n * also answers 400 `validation_error` for an `idempotencyKey` outside\n * 8–200 characters.\n */\n\n/** `/v1/trends/runs` is the run list and `/v1/trends/tags` the tag list, so neither can be a trend's slug. */\nconst RESERVED_SLUGS: Readonly<Record<string, string>> = {\n runs: \"the run list; use runs()\",\n tags: \"the tag list; use tags()\",\n}\n\nfunction trendPath(slug: string, rest = \"\"): string {\n if (Object.hasOwn(RESERVED_SLUGS, slug)) {\n throw new TypeError(`\"${slug}\" is not a trend slug (it is reserved for ${RESERVED_SLUGS[slug]})`)\n }\n return `/v1/trends/${encodeURIComponent(slug)}${rest}`\n}\n\n/** What a slot holds. */\nexport type TrendSlotKind = \"person\" | \"location\" | \"product\" | \"pet\"\n\n/** A chip: make this trait anew from your pictures (`\"new\"`), or keep the clip's (`\"original\"`). */\nexport type TrendChoice = \"new\" | \"original\"\n\n/**\n * The chips a slot can take, by its kind: a person `body` / `outfit` / `hair`,\n * a pet `body` / `coat`, a product `shape` / `finish`, a location none.\n */\nexport interface TrendChips {\n body?: TrendChoice\n outfit?: TrendChoice\n hair?: TrendChoice\n coat?: TrendChoice\n shape?: TrendChoice\n finish?: TrendChoice\n}\n\n/** A chip's name: `body`, `outfit`, `hair`, `coat`, `shape` or `finish`. */\nexport type TrendChipKey = keyof TrendChips\n\nexport type TrendResolution = \"480p\" | \"720p\" | \"1080p\"\n\n/**\n * The video engine a trend runs on ({@link CastSwapEngine}): the trend\n * chooses it, never the person running it.\n */\nexport type TrendEngine = CastSwapEngine\n\n/** A trend in the catalog (`list()`). Text is in the resolved locale. */\nexport interface TrendCard {\n id: string\n slug: string\n name: string\n description?: string\n tags: string[]\n /** e.g. `\"trending\"`, `\"new\"`. */\n badges: string[]\n /** The trend's first example (never the clip it recasts). */\n cover: { videoUrl: string; posterUrl?: string; width: number; height: number }\n /** How many slots of each kind the trend has. */\n needs: Record<TrendSlotKind, number>\n /** The length of a full run, in seconds. */\n durationSec: number\n isFavorite: boolean\n}\n\n/** One slot of a trend: what it asks you for. */\nexport interface TrendDetailSlot {\n /** The key to fill in {@link TrendRunRequest.slots}, and to mention in `details` as `{slot:<key>}`. */\n key: string\n label: string\n kind: TrendSlotKind\n /** A required slot needs pictures; an optional one left empty takes the chosen example's. */\n required: boolean\n hint?: string\n /**\n * The chips you may set on this slot, in its kind's order; `[]` = none (show\n * no chips row). A chip of the kind that is not listed is fixed by the\n * trend: sending it is refused with `400 chip_not_offered`.\n */\n chips: TrendChipKey[]\n /** The starting value of the chips in {@link chips} (only those). */\n defaults?: TrendChips\n}\n\n/** A finished run shown on a trend's page, with the pictures it used per slot. */\nexport interface TrendExample {\n videoUrl: string\n posterUrl?: string\n width: number\n height: number\n /** Slot key → the pictures this example used for it. */\n slots: Record<string, string[]>\n}\n\n/** A trend's page (`get()`). */\nexport interface TrendDetail extends TrendCard {\n /** The published version this page shows. */\n version: number\n /** `4` when the trend offers a 4-second preview run, else `null`. */\n previewSec: 4 | null\n /** The video engine every run of this trend uses. Absent (an older server) = `\"seedance-2-5\"`. */\n engine?: TrendEngine\n /**\n * The resolutions a run may ask for, the default first. Seedance 2.5:\n * `[\"480p\", \"720p\", \"1080p\"]`, where 480p is a draft (show it as one);\n * Kling 4: `[\"720p\", \"1080p\"]`, no draft. Offer exactly these.\n */\n resolutions: TrendResolution[]\n slots: TrendDetailSlot[]\n examples: TrendExample[]\n}\n\n/** What you put in one slot of a run: 1–3 pictures, and the chips the slot offers ({@link TrendDetailSlot.chips}). */\nexport interface TrendRunSlot extends TrendChips {\n images?: string[]\n}\n\n/** The body of `estimate()` and `run()`. */\nexport interface TrendRunRequest {\n /**\n * Slot key → what you put in it. Every required slot needs pictures; an\n * optional slot left out takes the chosen example's. 1–3 pictures per slot.\n */\n slots: Record<string, TrendRunSlot>\n /** 1-based example whose pictures fill the optional slots you leave empty. Default 1. */\n example?: number\n /** Your own words, at most 1,000 characters. Mention a slot as `{slot:<key>}`. */\n details?: string\n /** `true` runs a 4-second preview (only when the trend's `previewSec` is `4`). */\n preview?: boolean\n /**\n * One of the trend's {@link TrendDetail.resolutions}; default its first\n * (`\"480p\"` on Seedance 2.5, `\"720p\"` on Kling 4). Another answers 400\n * `resolution_unsupported`.\n */\n resolution?: TrendResolution\n /**\n * A draft run, only at 480p on a Seedance 2.5 trend. Default `true` at\n * 480p. `true` on a Kling 4 trend answers 400 `draft_unsupported`.\n */\n draft?: boolean\n /**\n * A generation session of yours. Accepted (and checked: one you may not use\n * is a 404), but not yet applied: trend runs are not filed into sessions yet.\n */\n sessionId?: string\n /** Accepted, but not used by the run today. */\n projectId?: string\n /**\n * A full run's own preview: the `jobId` of a completed preview run of this\n * trend that you started. When the trend masks faces only as needed and that\n * preview needed it, the full run masks them from the start (the quote\n * includes it). Any other job is ignored, without an error. Must be a uuid\n * (else 400 `validation_error`).\n */\n previewJobId?: string\n /**\n * `run()`: your client app's slug (e.g. `\"tools\"`: lowercase letters,\n * digits and `-`, 1–40 characters, starting with a letter or digit), as on\n * any job: the run's job carries it as `input_data.origin`, so\n * `client.jobs.list({ origin })` finds it. Not a slug is a 400\n * `validation_error`; without it the run has no origin. `estimate()`\n * ignores it.\n */\n origin?: string\n}\n\n/** What a run would cost, in credits (`estimate()`). */\nexport interface TrendEstimate {\n /** The charge the run is expected to come to. */\n expectedCredits: number\n /** What is reserved when the run starts; the run is charged what it actually costs. */\n holdCredits: number\n /**\n * The parts of the quote, by name. With `maskingCredits`, `masking` is\n * listed here too but is not part of `holdCredits` or `expectedCredits`.\n */\n breakdown: Record<string, number>\n /**\n * Only for a trend that masks faces only as needed: the extra credits\n * charged if the video model refuses the clip and the run is retried with\n * the faces masked. Not included in `expectedCredits` or `holdCredits`.\n */\n maskingCredits?: number\n}\n\n/** Per-call options for {@link TrendsResource.run}. */\nexport interface TrendRunOptions {\n /**\n * Sent as the `Idempotency-Key` header, unchanged (an empty string sends no\n * header). The server takes 8–200 characters and answers 400 for any other\n * length. Reuse it when retrying the same run.\n */\n idempotencyKey?: string\n}\n\n/** One slot of a past run, as it was run. Labels are English. */\nexport interface TrendRunDisplaySlot extends TrendChips {\n key: string\n label: string\n kind: TrendSlotKind\n images: string[]\n /** `true` when the slot was left empty and the example's pictures filled it. */\n fromExample: boolean\n}\n\n/**\n * One of your trend runs (`runs()`, `getRun()`). Stays readable after the\n * trend moves on or is unpublished.\n *\n * A Full Quality version of a draft is a run of its own, with its own status,\n * result and charge: `fullQualityOf` names the draft it was made from, and it\n * stays listed after that draft is deleted.\n */\nexport interface TrendRun {\n jobId: string\n status: string\n progress: number | null\n /**\n * Why a failed or cancelled run did not finish; `null` otherwise. `code` is\n * `safety-block` or `policy-block` when the job was blocked, `credits` when\n * it ran out of credits partway (it was refunded: ask the person to top up,\n * then run it again), else `cancelled` or `failed`. `message` is the same\n * fixed sentence for every code — branch on `code`, not on the text.\n */\n error: { code?: string; message: string } | null\n createdAt: string\n completedAt: string | null\n /** The trend and version it ran (name in English). */\n trend: { id: string; slug: string; version: number; name: string }\n /** The 1-based example used for empty optional slots. */\n example: number\n slots: TrendRunDisplaySlot[]\n details?: string\n preview: boolean\n resolution: string\n draft: boolean\n /** The video engine the run was made on. Absent (an older server) = `\"seedance-2-5\"`. */\n engine?: TrendEngine\n /** The result, once completed. */\n videoUrl: string | null\n posterUrl: string | null\n creditsCharged: number | null\n /** A Full Quality version: the job id of the run (a draft, or a Kling 4 720p run) it was made from. `null` for any other run. */\n fullQualityOf: string | null\n /**\n * A draft's (or Kling 4 720p run's) newest Full Quality try, if one was started: a pointer only,\n * to know an upgrade exists and how it is going. Its video and charge are on\n * that run, listed on its own (its `fullQualityOf` is this run's `jobId`) —\n * read it there (`getRun(fullQuality.jobId)`). Older tries of the draft (a\n * failed or cancelled one tried again) are not listed by `runs()`;\n * `getRun()` still reads one by its id.\n */\n fullQuality: { jobId: string; status: string } | null\n /**\n * Until when a completed run can be redone in Full Quality — a Seedance 2.5\n * draft (the same take at 1080p) or a Kling 4 run at 720p (a new take at\n * 1080p); `null` otherwise.\n */\n fullQualityUntil: string | null\n}\n\nexport interface ListTrendsParams {\n /** Search text. */\n q?: string\n tag?: string\n /** `true` lists only your favorites. */\n favorites?: boolean\n /** A platform language for names and descriptions; default your profile's, then English. */\n locale?: string\n /** The previous page's `next`. */\n cursor?: string\n /** Page size, 1–60 (server default 30). */\n limit?: number\n}\n\nexport interface ListTrendRunsParams {\n /** Only runs of this trend (its slug). */\n trend?: string\n /** The previous page's `next`. */\n cursor?: string\n /** Page size, 1–60 (server default 30). */\n limit?: number\n}\n\n/** A tag in use on the published catalog (`tags()`). */\nexport interface TrendTag {\n /** The tag itself: pass it as `list({ tag })`. */\n tag: string\n /** The tag's label in the resolved locale; the tag itself when it has none. */\n label: string\n /** How many published trends carry it. */\n count: number\n}\n\nexport interface TrendPage<T> {\n data: T[]\n /** Pass back as `cursor` for the next page; `null` on the last one. */\n next: string | null\n}\n\nexport class TrendsResource {\n constructor(private client: NodaroClientCore) {}\n\n /** The published catalog in its curated order (`GET /v1/trends`), a page at a time. */\n list(params: ListTrendsParams = {}): Promise<TrendPage<TrendCard>> {\n const query: Record<string, string> = {}\n if (params.q) query.q = params.q\n if (params.tag) query.tag = params.tag\n if (params.favorites) query.favorites = \"1\"\n if (params.locale) query.locale = params.locale\n if (params.cursor) query.cursor = params.cursor\n if (params.limit !== undefined) query.limit = String(params.limit)\n return this.client.request(\"GET\", \"/v1/trends\", { query })\n }\n\n /** A published trend's page (`GET /v1/trends/:slug`). */\n async get(slug: string, params: { locale?: string } = {}): Promise<TrendDetail> {\n const query: Record<string, string> = {}\n if (params.locale) query.locale = params.locale\n const res = await this.client.request<{ data: TrendDetail }>(\"GET\", trendPath(slug), { query })\n return res.data\n }\n\n /** Quote a run before starting it (`POST /v1/trends/:slug/estimate`); spends nothing. */\n async estimate(slug: string, request: TrendRunRequest): Promise<TrendEstimate> {\n const res = await this.client.request<{ data: TrendEstimate }>(\n \"POST\",\n trendPath(slug, \"/estimate\"),\n { body: request },\n )\n return res.data\n }\n\n /**\n * Start a run (`POST /v1/trends/:slug/runs`, 202). Returns the job to follow.\n * With `options.idempotencyKey` (sent as the `Idempotency-Key` header) a\n * repeat with the same key answers with the first run's `jobId`.\n */\n async run(slug: string, request: TrendRunRequest, options?: TrendRunOptions): Promise<{ jobId: string }> {\n const res = await this.client.request<{ data: { jobId: string } }>(\n \"POST\",\n trendPath(slug, \"/runs\"),\n {\n body: request,\n ...(options?.idempotencyKey ? { headers: { \"Idempotency-Key\": options.idempotencyKey } } : {}),\n },\n )\n return res.data\n }\n\n /**\n * Your trend runs, newest first (`GET /v1/trends/runs`). A Full Quality\n * version of a draft is listed as its own run (`fullQualityOf`).\n */\n runs(params: ListTrendRunsParams = {}): Promise<TrendPage<TrendRun>> {\n const query: Record<string, string> = {}\n if (params.trend) query.trend = params.trend\n if (params.cursor) query.cursor = params.cursor\n if (params.limit !== undefined) query.limit = String(params.limit)\n return this.client.request(\"GET\", \"/v1/trends/runs\", { query })\n }\n\n /**\n * One of your trend runs by its job id (`GET /v1/trends/runs/:jobId`), in\n * the same shape as `runs()`. A job that is not your own trend run is a\n * `NotFoundError`.\n */\n async getRun(jobId: string): Promise<TrendRun> {\n const res = await this.client.request<{ data: TrendRun }>(\"GET\", `/v1/trends/runs/${encodeURIComponent(jobId)}`)\n return res.data\n }\n\n /**\n * The tags in use on the published catalog, each with its label in the\n * resolved locale (`GET /v1/trends/tags`), most used first.\n */\n async tags(params: { locale?: string } = {}): Promise<TrendTag[]> {\n const query: Record<string, string> = {}\n if (params.locale) query.locale = params.locale\n const res = await this.client.request<{ data: TrendTag[] }>(\"GET\", \"/v1/trends/tags\", { query })\n return res.data\n }\n\n /** Add a trend to your favorites (`PUT /v1/trends/:slug/favorite`). */\n async favorite(slug: string): Promise<void> {\n await this.client.request<void>(\"PUT\", trendPath(slug, \"/favorite\"))\n }\n\n /** Remove a trend from your favorites (`DELETE /v1/trends/:slug/favorite`). */\n async unfavorite(slug: string): Promise<void> {\n await this.client.request<void>(\"DELETE\", trendPath(slug, \"/favorite\"))\n }\n}\n"]}
|