@nodaro/shared 3.8.0 → 3.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/dist/index.cjs +325 -63
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.d.cts +806 -41
  4. package/dist/index.d.ts +806 -41
  5. package/dist/index.js +295 -64
  6. package/dist/index.js.map +1 -1
  7. package/package.json +1 -1
  8. package/src/__tests__/credit-identifiers.test.ts +51 -1
  9. package/src/__tests__/gvp-supported-providers.test.ts +20 -3
  10. package/src/__tests__/model-catalog-sections.test.ts +59 -0
  11. package/src/__tests__/model-tree.test.ts +5 -2
  12. package/src/__tests__/parameter-node-value.test.ts +35 -0
  13. package/src/__tests__/pricing-default-duration.test.ts +45 -0
  14. package/src/__tests__/prompt-length-limits.test.ts +4 -0
  15. package/src/__tests__/scene3d-delivery-review.test.ts +512 -0
  16. package/src/__tests__/suno-credit-type.test.ts +46 -0
  17. package/src/__tests__/template-categories.test.ts +45 -0
  18. package/src/__tests__/video-ref-limits.test.ts +11 -2
  19. package/src/credit-identifiers.ts +64 -14
  20. package/src/i18n/camera-motions.ar.ts +5 -5
  21. package/src/i18n/camera-motions.de.ts +5 -5
  22. package/src/i18n/camera-motions.es.ts +5 -5
  23. package/src/i18n/camera-motions.fr.ts +5 -5
  24. package/src/i18n/camera-motions.he.ts +5 -5
  25. package/src/i18n/camera-motions.hi.ts +5 -5
  26. package/src/i18n/camera-motions.ja.ts +5 -5
  27. package/src/i18n/camera-motions.ko.ts +5 -5
  28. package/src/i18n/camera-motions.pt-BR.ts +5 -5
  29. package/src/i18n/camera-motions.ru.ts +5 -5
  30. package/src/i18n/camera-motions.zh-CN.ts +5 -5
  31. package/src/i18n/character-motion.ar.ts +1031 -0
  32. package/src/i18n/character-motion.de.ts +1031 -0
  33. package/src/i18n/character-motion.es.ts +1031 -0
  34. package/src/i18n/character-motion.fr.ts +1031 -0
  35. package/src/i18n/character-motion.he.ts +1031 -0
  36. package/src/i18n/character-motion.hi.ts +1031 -0
  37. package/src/i18n/character-motion.ja.ts +1031 -0
  38. package/src/i18n/character-motion.ko.ts +1031 -0
  39. package/src/i18n/character-motion.pt-BR.ts +1031 -0
  40. package/src/i18n/character-motion.ru.ts +1031 -0
  41. package/src/i18n/character-motion.zh-CN.ts +1031 -0
  42. package/src/i18n/types.ts +1 -0
  43. package/src/index.ts +28 -0
  44. package/src/model-catalog.ts +88 -35
  45. package/src/model-constants.ts +118 -24
  46. package/src/node-execution-state.ts +95 -0
  47. package/src/parameter-node-value.ts +33 -0
  48. package/src/presentation-utils.ts +1 -0
  49. package/src/pro-3d-render.ts +159 -0
  50. package/src/scene3d-delivery-notes.ts +490 -0
  51. package/src/scene3d-v2-plan.ts +8 -2
  52. package/src/smart-cut-windows.ts +15 -10
  53. package/src/template-categories.ts +67 -0
package/dist/index.cjs CHANGED
@@ -61,7 +61,7 @@ var MODEL_RECOMMENDATIONS = [
61
61
  { intent: "best cinematic video", modelIds: ["veo3", "kling-3.0", "seedance-2"], note: "VEO 3.1 Quality for premium narrative; Kling 3.0 for music-synced motion; Seedance 2 for reference-driven consistency." },
62
62
  { intent: "cheap batch video clips", modelIds: ["veo3.1", "wan-turbo", "bytedance-lite"], note: "VEO 3.1 Fast is the best price/quality balance with native audio." },
63
63
  { intent: "video with start + end frame", modelIds: ["veo3", "veo3.1", "kling-turbo", "minimax", "hailuo-standard", "seedance-2"], note: "All listed support an end frame; VEO uses imageUrls[start, end]." },
64
- { intent: "music / song generation", modelIds: ["suno-v5", "suno"], note: "Suno v5 has better vocal quality at the same price." },
64
+ { intent: "music / song generation", modelIds: ["suno-v6", "suno-v6_wild", "suno-v6_mini", "suno-v5_5"], note: "V6 is the default flagship; V6 Wild for bolder, less predictable results; V6 Mini when speed matters; v5.5 / v5 / v4 keep their own character. Same price." },
65
65
  { intent: "voice over / narration", modelIds: ["elevenlabs-v3", "elevenlabs-turbo"], note: "v3 supports [audio tags] for emotion; Turbo is cheaper for plain narration." },
66
66
  { intent: "lip-sync a portrait to audio", modelIds: ["kling-avatar-pro", "kling-avatar", "infinitalk"], note: "Pro for best mouth shape; InfiniTalk for resolution control." },
67
67
  { intent: "transcription / captions", modelIds: ["elevenlabs-stt"], note: "Word-level timestamps available." },
@@ -601,23 +601,8 @@ var IMAGE_MODELS = {
601
601
  { identifier: "ideogram-remix:QUALITY", credits: 60, note: "best quality" }
602
602
  ]
603
603
  },
604
- "ideogram-reframe": {
605
- id: "ideogram-reframe",
606
- kind: "image",
607
- modes: ["edit"],
608
- family: "Ideogram",
609
- label: "Ideogram Reframe",
610
- series: "Ideogram",
611
- description: "Outpaint / reframe to a new aspect ratio while preserving subject.",
612
- useCases: ["outpaint", "reframe"],
613
- features: ["reference-image"],
614
- aspectRatios: IDEOGRAM_RATIOS,
615
- pricing: [
616
- { identifier: "ideogram-reframe", credits: 18, note: "BALANCED default" },
617
- { identifier: "ideogram-reframe:TURBO", credits: 18, note: "fastest" },
618
- { identifier: "ideogram-reframe:QUALITY", credits: 18, note: "best quality" }
619
- ]
620
- },
604
+ // `ideogram-reframe` was retired 2026-09-15 — KIE's `ideogram/v3-reframe`
605
+ // fails every task upstream (#1331); see IDEOGRAM_PROVIDERS in model-constants.
621
606
  // ── Google Imagen ──
622
607
  "imagen4": {
623
608
  id: "imagen4",
@@ -1069,9 +1054,17 @@ var VIDEO_MODELS = {
1069
1054
  family: "Google",
1070
1055
  label: "VEO 3.1 Quality",
1071
1056
  series: "VEO",
1072
- description: "Google VEO 3.1 Quality \u2014 premium cinematic video. 4/6/8s clips, optional end frame, native audio. Flat per-generation pricing across durations.",
1057
+ description: "Google VEO 3.1 Quality \u2014 premium cinematic video. 4/6/8s clips, optional end frame, native audio. No reference-to-video mode (Fast/Lite only). Flat per-generation pricing across durations.",
1073
1058
  useCases: ["cinematic", "premium", "narrative"],
1074
- features: ["end-frame", "audio", "reference-image"],
1059
+ // NO "reference-image": KIE serves REFERENCE_2_VIDEO on the Fast and Lite
1060
+ // SKUs only. Its own words, on a production job (2026-09-04, app-reports
1061
+ // lane G): "Reference to video only supports the Veo Fast model and Veo
1062
+ // Lite model." Until 2026-09-15 this entry claimed the feature, so the
1063
+ // editor offered the reference handles, the adapter sent
1064
+ // generationType: "REFERENCE_2_VIDEO", and the call came back 422 every
1065
+ // time — after credits were reserved. `veo3.1` (KIE `veo3_fast`) and
1066
+ // `veo3_lite` DO serve it and keep the flag.
1067
+ features: ["end-frame", "audio"],
1075
1068
  durations: [4, 6, 8],
1076
1069
  aspectRatios: VIDEO_RATIOS_HV,
1077
1070
  // 720p (default) + 1080p inline. 4K generates the base at 1080p then chains
@@ -2028,7 +2021,7 @@ var VIDEO_MODELS = {
2028
2021
  id: "omnihuman-1-5",
2029
2022
  kind: "video",
2030
2023
  modes: ["lip-sync"],
2031
- family: "ByteDance",
2024
+ family: "Bytedance",
2032
2025
  label: "OmniHuman 1.5",
2033
2026
  series: "OmniHuman",
2034
2027
  description: "Premium prompt-directed talking avatar from a still image + audio. 720p / 1080p, up to 60s. People, pets, anime.",
@@ -2287,17 +2280,8 @@ var AUDIO_MODELS = {
2287
2280
  pricing: [{ identifier: "elevenlabs-dialogue", credits: 25, note: "per 1K chars" }]
2288
2281
  },
2289
2282
  // ── ElevenLabs voice utilities ──
2290
- "voice-clone": {
2291
- id: "voice-clone",
2292
- kind: "audio",
2293
- modes: ["voice-clone"],
2294
- family: "ElevenLabs",
2295
- label: "Voice Clone (Instant)",
2296
- series: "ElevenLabs",
2297
- description: "Clone a voice from a short reference clip. Instant clone via direct ElevenLabs API.",
2298
- useCases: ["voice-clone", "personalization"],
2299
- pricing: [{ identifier: "voice-clone", credits: 50 }]
2300
- },
2283
+ // (voice cloning was retired platform-wide on 2026-09-15 — no catalog entry,
2284
+ // no price, no MCP tool; existing clones still resolve as TTS voice ids.)
2301
2285
  "elevenlabs-voice-design": {
2302
2286
  id: "elevenlabs-voice-design",
2303
2287
  kind: "audio",
@@ -2353,6 +2337,17 @@ var AUDIO_MODELS = {
2353
2337
  useCases: ["dubbing", "multilingual"],
2354
2338
  pricing: [{ identifier: "elevenlabs-dubbing", credits: 40, note: "per minute of the dubbed span (min 1)" }]
2355
2339
  },
2340
+ "elevenlabs-dubbing-v2": {
2341
+ id: "elevenlabs-dubbing-v2",
2342
+ kind: "audio",
2343
+ modes: ["dubbing"],
2344
+ family: "ElevenLabs",
2345
+ label: "ElevenLabs Dubbing v2",
2346
+ series: "ElevenLabs",
2347
+ description: "Translate + dub audio or a whole video into a new language \u2014 video in, dubbed video out. Async.",
2348
+ useCases: ["dubbing", "multilingual"],
2349
+ pricing: [{ identifier: "elevenlabs-dubbing-v2", credits: 1100, note: "per minute of the dubbed span (min 1)" }]
2350
+ },
2356
2351
  "elevenlabs-forced-alignment": {
2357
2352
  id: "elevenlabs-forced-alignment",
2358
2353
  kind: "audio",
@@ -2397,7 +2392,7 @@ var AUDIO_MODELS = {
2397
2392
  label: "Suno v5",
2398
2393
  series: "Suno",
2399
2394
  dataValue: "V5",
2400
- description: "Newer Suno v5 \u2014 better vocal quality, more genres. Same price as v4.",
2395
+ description: "Suno v5 \u2014 better vocal quality than v4, more genres. Same price.",
2401
2396
  useCases: ["music", "song", "vocals", "premium"],
2402
2397
  pricing: [{ identifier: "suno-v5", credits: 30, note: "per generation" }]
2403
2398
  },
@@ -2409,10 +2404,46 @@ var AUDIO_MODELS = {
2409
2404
  label: "Suno v5.5",
2410
2405
  series: "Suno",
2411
2406
  dataValue: "V5_5",
2412
- description: "Suno v5.5 \u2014 latest model with improved audio quality and expressiveness.",
2407
+ description: "Suno v5.5 \u2014 improved audio quality and expressiveness over v5.",
2408
+ useCases: ["music", "song", "vocals", "premium"],
2409
+ pricing: [{ identifier: "suno-v5_5", credits: 30, note: "per generation" }]
2410
+ },
2411
+ "suno-v6": {
2412
+ id: "suno-v6",
2413
+ kind: "audio",
2414
+ modes: ["music"],
2415
+ family: "Suno",
2416
+ label: "Suno V6",
2417
+ series: "Suno",
2418
+ dataValue: "V6",
2419
+ description: "Suno V6 \u2014 greater musical expression with more natural vocals and richer details. The flagship and the default.",
2413
2420
  useCases: ["music", "song", "vocals", "premium"],
2414
- pricing: [{ identifier: "suno-v5_5", credits: 30, note: "per generation" }],
2421
+ pricing: [{ identifier: "suno-v6", credits: 30, note: "per generation" }],
2415
2422
  featured: true
2423
+ },
2424
+ "suno-v6_wild": {
2425
+ id: "suno-v6_wild",
2426
+ kind: "audio",
2427
+ modes: ["music"],
2428
+ family: "Suno",
2429
+ label: "Suno V6 Wild",
2430
+ series: "Suno",
2431
+ dataValue: "V6_WILD",
2432
+ description: "Suno V6 Wild \u2014 pushes creative boundaries for bolder, more distinctive musical expression; more varied, less predictable results.",
2433
+ useCases: ["music", "song", "vocals", "experimental"],
2434
+ pricing: [{ identifier: "suno-v6_wild", credits: 30, note: "per generation" }]
2435
+ },
2436
+ "suno-v6_mini": {
2437
+ id: "suno-v6_mini",
2438
+ kind: "audio",
2439
+ modes: ["music"],
2440
+ family: "Suno",
2441
+ label: "Suno V6 Mini",
2442
+ series: "Suno",
2443
+ dataValue: "V6_MINI",
2444
+ description: "Suno V6 Mini \u2014 lightweight and fast, balancing quality and speed for effortless creation.",
2445
+ useCases: ["music", "song", "vocals", "fast"],
2446
+ pricing: [{ identifier: "suno-v6_mini", credits: 30, note: "per generation" }]
2416
2447
  }
2417
2448
  };
2418
2449
  var MODEL_CATALOG = {
@@ -2439,6 +2470,10 @@ function groupByFamily(entries) {
2439
2470
  }
2440
2471
  return Array.from(groups.entries()).map(([family, models]) => ({ family, models }));
2441
2472
  }
2473
+ var MODEL_KINDS = ["image", "video", "audio"];
2474
+ function groupByKindAndFamily(entries) {
2475
+ return MODEL_KINDS.map((kind) => ({ kind, families: groupByFamily(entries.filter((m) => m.kind === kind)) })).filter((section) => section.families.length > 0);
2476
+ }
2442
2477
  function getModel(id) {
2443
2478
  return MODEL_CATALOG[id];
2444
2479
  }
@@ -2879,16 +2914,23 @@ var MAX_IMAGE_PROMPT_CHARS_BY_PROVIDER = {
2879
2914
  // docs.kie.ai/market/seedream-5-lite-image-to-image (NB: t2i sibling is 1000)
2880
2915
  "qwen": 3e3,
2881
2916
  // docs.kie.ai/market/qwen/text-to-image
2882
- "qwen-edit": 2e3
2917
+ "qwen-edit": 2e3,
2883
2918
  // docs.kie.ai/market/qwen/image-edit
2919
+ // Z-Image is the SHORTEST of the family — "maxLength: 1000" in its schema
2920
+ // (docs.kie.ai/market/z-image/z-image, re-fetched 2026-09-15). It was listed
2921
+ // below as "verified == 5000", which is how three production runs on
2922
+ // 2026-09-07 sent a workflow-assembled prompt straight into KIE's
2923
+ // `{"code":500,"msg":"The text length cannot exceed the maximum limit"}`.
2924
+ "z-image": 1e3
2925
+ // docs.kie.ai/market/z-image/z-image
2884
2926
  // verified == 5000 default (no entry needed): imagen4(-fast/-ultra), nano-banana,
2885
2927
  // nano-banana-edit, flux, flux-flex, gpt-image-2, ideogram-v3/-edit/-remix,
2886
- // z-image, grok, qwen-i2i, seedream-5-pro, seedream-5-pro-i2i
2928
+ // grok, qwen-i2i, seedream-5-pro, seedream-5-pro-i2i
2887
2929
  // (docs.kie.ai/market/seedream/5-pro-text-to-image + 5-pro-image-to-image).
2888
2930
  // grok-i2i: doc states 390000 (78× its t2i sibling) — treated as a KIE schema
2889
2931
  // typo and left at the 5000 default per the sanity-cap decision.
2890
2932
  // UNVERIFIED (no limit stated in schema) → 5000 default: flux-kontext(-max)
2891
- // gpt-image, gpt-image-i2i, flux-i2i, flux-pro-i2i, ideogram-reframe.
2933
+ // gpt-image, gpt-image-i2i, flux-i2i, flux-pro-i2i.
2892
2934
  };
2893
2935
  function getMaxImagePromptChars(provider) {
2894
2936
  return provider && MAX_IMAGE_PROMPT_CHARS_BY_PROVIDER[provider] || IMAGE_PROMPT_MAX;
@@ -3082,7 +3124,6 @@ var MODELS_WITH_REFERENCE_IMAGE_SUPPORT = /* @__PURE__ */ new Set([
3082
3124
  "flux-kontext-max",
3083
3125
  "ideogram-edit",
3084
3126
  "ideogram-remix",
3085
- "ideogram-reframe",
3086
3127
  "qwen-i2i",
3087
3128
  "qwen-edit",
3088
3129
  "seedream-edit",
@@ -3143,7 +3184,6 @@ var REF_IMAGE_MAX_LIMITS = {
3143
3184
  "flux-kontext-max": 1,
3144
3185
  "ideogram-edit": 1,
3145
3186
  "ideogram-remix": 1,
3146
- "ideogram-reframe": 1,
3147
3187
  "qwen-i2i": 1,
3148
3188
  "qwen-edit": 1,
3149
3189
  "grok-i2i": 1,
@@ -3188,7 +3228,6 @@ var VARIABLE_PRICING_MODELS = {
3188
3228
  "topaz-image-upscale": "resolution",
3189
3229
  "ideogram-edit": "rendering-speed",
3190
3230
  "ideogram-remix": "rendering-speed",
3191
- "ideogram-reframe": "rendering-speed",
3192
3231
  "ideogram-v3": "rendering-speed",
3193
3232
  "wan-2.7": "resolution",
3194
3233
  "wan-2.7-pro": "resolution"
@@ -3206,7 +3245,7 @@ var RESOLUTION_2K_4K_TIERED_PROVIDERS = /* @__PURE__ */ new Set([
3206
3245
  "wan-2.7",
3207
3246
  "wan-2.7-pro"
3208
3247
  ]);
3209
- var IDEOGRAM_PROVIDERS = /* @__PURE__ */ new Set(["ideogram-edit", "ideogram-remix", "ideogram-reframe", "ideogram-v3"]);
3248
+ var IDEOGRAM_PROVIDERS = /* @__PURE__ */ new Set(["ideogram-edit", "ideogram-remix", "ideogram-v3"]);
3210
3249
  var IMAGE_GEN_PROVIDERS = [
3211
3250
  "nano-banana",
3212
3251
  "flux",
@@ -3253,7 +3292,6 @@ var IMAGE_I2I_PROVIDERS = [
3253
3292
  "grok-2-i2i",
3254
3293
  "ideogram-edit",
3255
3294
  "ideogram-remix",
3256
- "ideogram-reframe",
3257
3295
  "qwen-i2i",
3258
3296
  "qwen-edit",
3259
3297
  "seedream-edit",
@@ -3586,15 +3624,25 @@ var QA_CHECK_PROVIDERS = [
3586
3624
  "claude",
3587
3625
  "gpt"
3588
3626
  ];
3589
- var SUNO_MODELS = [
3590
- "V4",
3591
- "V4_5",
3627
+ var SUNO_ACTIVE_MODELS = ["V6", "V6_WILD", "V6_MINI"];
3628
+ var SUNO_LEGACY_MODELS = [
3629
+ "V5_5",
3630
+ "V5",
3592
3631
  "V4_5PLUS",
3593
3632
  "V4_5ALL",
3594
- "V5",
3595
- "V5_5"
3633
+ "V4_5",
3634
+ "V4"
3596
3635
  ];
3597
- var SUNO_ADD_TRACK_MODELS = ["V4_5PLUS", "V5", "V5_5"];
3636
+ var SUNO_MODELS = [...SUNO_ACTIVE_MODELS, ...SUNO_LEGACY_MODELS];
3637
+ var DEFAULT_SUNO_MODEL = "V6";
3638
+ function isLegacySunoModel(model) {
3639
+ return SUNO_LEGACY_MODELS.includes(model ?? "");
3640
+ }
3641
+ var SUNO_DURATION_MODELS = new Set(SUNO_ACTIVE_MODELS);
3642
+ function sunoModelHonoursDuration(model) {
3643
+ return SUNO_DURATION_MODELS.has(model ?? "");
3644
+ }
3645
+ var SUNO_ADD_TRACK_MODELS = [...SUNO_ACTIVE_MODELS, "V4_5PLUS", "V5", "V5_5"];
3598
3646
  var VOICE_DESIGN_MODELS = [
3599
3647
  "eleven_ttv_v3",
3600
3648
  "eleven_multilingual_ttv_v2"
@@ -3637,7 +3685,6 @@ var I2I_STRENGTH_SUPPORT = {
3637
3685
  };
3638
3686
  var SEED_SUPPORT = /* @__PURE__ */ new Set([
3639
3687
  "ideogram-remix",
3640
- "ideogram-reframe",
3641
3688
  "ideogram-v3",
3642
3689
  "qwen",
3643
3690
  "qwen-i2i",
@@ -3653,7 +3700,6 @@ var SEED_SUPPORT = /* @__PURE__ */ new Set([
3653
3700
  ]);
3654
3701
  var RENDERING_SPEED_SUPPORT = /* @__PURE__ */ new Set([
3655
3702
  "ideogram-remix",
3656
- "ideogram-reframe",
3657
3703
  "ideogram-v3"
3658
3704
  ]);
3659
3705
  var GUIDANCE_SCALE_SUPPORT = {
@@ -3914,8 +3960,13 @@ var VIDEO_REF_LIMITS_BY_PROVIDER = {
3914
3960
  // backend kie/models.ts maxRefImages: 7
3915
3961
  "happyhorse-ref2v": { images: 9 },
3916
3962
  // backend kie/models.ts maxRefImages: 9
3917
- // VEO 3.x — REFERENCE_2_VIDEO path caps refs at 3 (kie/video.ts slice(0, 3)).
3918
- "veo3": { images: 3 },
3963
+ // VEO 3.x — REFERENCE_2_VIDEO path caps refs at 3 (kie/video.ts slices to
3964
+ // this number). `veo3` (VEO 3.1 QUALITY) is deliberately ABSENT: KIE serves
3965
+ // reference-to-video on the Fast and Lite SKUs only and rejects it on
3966
+ // Quality with "Reference to video only supports the Veo Fast model and Veo
3967
+ // Lite model." (production, 2026-09-04). Absent ⇒ 0 ⇒ the handle dims, the
3968
+ // `connectedReferences` assembly strips image tokens, and kie/video.ts never
3969
+ // flips a Quality call to REFERENCE_2_VIDEO.
3919
3970
  "veo3.1": { images: 3 },
3920
3971
  "veo3_lite": { images: 3 }
3921
3972
  // NOTE: wan-i2v / hailuo-2.3[-pro] / bytedance-pro[-fast] / grok-imagine-video-1.5
@@ -4143,8 +4194,23 @@ var VIDEO_VARIABLE_PRICING = {
4143
4194
  "wan-3-prime": "duration+resolution"
4144
4195
  };
4145
4196
  var PRICING_DEFAULT_DURATION_SEC = {
4146
- "minimax-h3": 6
4197
+ "minimax-h3": 6,
4198
+ // KIE renders 8s when `duration` is omitted (kie/models.ts extraParams), and
4199
+ // Seedance 2.5 prices one tier per second across 4–30s, so the 5s fallback
4200
+ // billed a 5s tier against an 8s render — and under-reserved every
4201
+ // reference-video run's output seconds by three (#1397).
4202
+ "seedance-2-5": 8,
4203
+ // Same shape: KIE renders 8s by default and the ladder is priced per second,
4204
+ // so the 5s fallback billed a 5s tier against an 8s render (caught by the
4205
+ // render-default ↔ priced-tier invariant in
4206
+ // backend/src/providers/__tests__/pricing-default-duration-sync.test.ts).
4207
+ "grok-imagine-video-1.5": 8
4147
4208
  };
4209
+ function pricedOutputDurationSec(provider, requested) {
4210
+ const fallback = PRICING_DEFAULT_DURATION_SEC[provider] ?? 5;
4211
+ const parsed = typeof requested === "string" ? parseInt(requested, 10) : requested;
4212
+ return parsed === void 0 || Number.isNaN(parsed) ? fallback : parsed;
4213
+ }
4148
4214
  var PRICING_DEFAULT_RESOLUTION = {
4149
4215
  // KIE renders 720p when `resolution` is omitted (kie/models.ts extraParams).
4150
4216
  "seedance-2-5": "720p",
@@ -4836,10 +4902,16 @@ function expandExtraRefsToConnectedReferences(extras, lookupCharacterContext) {
4836
4902
  }
4837
4903
 
4838
4904
  // src/credit-identifiers.ts
4905
+ function flux2MegapixelTier(model, resolution) {
4906
+ const bare = (v) => v.replace(/\s*MP$/i, "").trim();
4907
+ const raw = typeof resolution === "string" ? bare(resolution) : "";
4908
+ if (raw === "") return "1";
4909
+ const tier = FLUX2_RES_MP.find((t2) => Number(t2) === Number(raw));
4910
+ return tier ?? bare(defaultResolutionFor(model) ?? "1 MP");
4911
+ }
4839
4912
  function buildCreditModelIdentifier(provider, quality, resolution, renderingSpeed, targetResolution, referenceImageCount) {
4840
4913
  if (isFlux2Model(provider)) {
4841
- const mp = (resolution ?? "1 MP").replace(/\s*MP$/i, "").trim();
4842
- return `${provider}:${mp}MP:${Math.min(referenceImageCount ?? 0, 8)}ref`;
4914
+ return `${provider}:${flux2MegapixelTier(provider, resolution)}MP:${Math.min(referenceImageCount ?? 0, 8)}ref`;
4843
4915
  }
4844
4916
  if (HIGH_QUALITY_PROVIDERS.has(provider) && quality === "high") {
4845
4917
  return `${provider}:high`;
@@ -4945,9 +5017,7 @@ function buildVideoCreditModelIdentifier(provider, duration, sound, nodeType, mo
4945
5017
  if (!DURATION_PRICED_PROVIDERS.has(effectiveProvider)) {
4946
5018
  return effectiveProvider;
4947
5019
  }
4948
- const durationFallback = PRICING_DEFAULT_DURATION_SEC[effectiveProvider] ?? 5;
4949
- const parsed = typeof duration === "string" ? parseInt(duration, 10) : duration ?? durationFallback;
4950
- const durationSec = Number.isNaN(parsed) ? durationFallback : parsed;
5020
+ const durationSec = pricedOutputDurationSec(effectiveProvider, duration);
4951
5021
  const tiers = VIDEO_DURATION_TIERS[effectiveProvider];
4952
5022
  if (!tiers) return effectiveProvider;
4953
5023
  const tier = tiers.find((t2) => durationSec <= t2.maxSeconds) ?? tiers[tiers.length - 1];
@@ -5028,10 +5098,15 @@ function sunoCreditType(model, operation) {
5028
5098
  if (!SUNO_VERSION_PRICED_OPERATIONS.includes(operation)) {
5029
5099
  return operation;
5030
5100
  }
5031
- if (model === "V5_5") return "suno-v5_5";
5032
- if (model === "V5") return "suno-v5";
5033
- return operation;
5101
+ return model && SUNO_VERSION_CREDIT_KEYS[model] || operation;
5034
5102
  }
5103
+ var SUNO_VERSION_CREDIT_KEYS = {
5104
+ V6: "suno-v6",
5105
+ V6_WILD: "suno-v6_wild",
5106
+ V6_MINI: "suno-v6_mini",
5107
+ V5_5: "suno-v5_5",
5108
+ V5: "suno-v5"
5109
+ };
5035
5110
 
5036
5111
  // src/credit-estimators/video-utils.ts
5037
5112
  var VIDEO_UTIL_PRICING = {
@@ -5662,6 +5737,7 @@ var INPUT_FIELD_MAP = {
5662
5737
  "post-process-effects": { key: "postProcess", type: "select" },
5663
5738
  "action-fx": { key: "actionFx", type: "select" },
5664
5739
  "character-fx": { key: "characterFx", type: "select" },
5740
+ "character-motion": { key: "characterMotion", type: "select" },
5665
5741
  "transition": { key: "transition", type: "select" },
5666
5742
  "loop-subject": { key: "loopSubject", type: "select" },
5667
5743
  // --- Multi-dimension pickers: representative (first) field. Overriding only
@@ -8140,6 +8216,7 @@ var PARAMETER_NODE_TYPES = /* @__PURE__ */ new Set([
8140
8216
  "post-process-effects",
8141
8217
  "action-fx",
8142
8218
  "character-fx",
8219
+ "character-motion",
8143
8220
  "transition",
8144
8221
  "loop-subject",
8145
8222
  "scene-count",
@@ -8157,6 +8234,17 @@ var HINT_EXEMPT_PARAMETER_TYPES = /* @__PURE__ */ new Set([
8157
8234
  "duration",
8158
8235
  "aspect-ratio"
8159
8236
  ]);
8237
+ var VIDEO_ONLY_PARAMETER_NODE_TYPES = /* @__PURE__ */ new Set([
8238
+ "camera-motion",
8239
+ "temporal",
8240
+ "transition",
8241
+ "character-fx",
8242
+ "character-motion"
8243
+ ]);
8244
+ var EXECUTION_GRAPH_COMPOSED_PARAMETER_TYPES = /* @__PURE__ */ new Set([
8245
+ "camera-motion",
8246
+ "character-motion"
8247
+ ]);
8160
8248
  var registeredPersonPackFields = [];
8161
8249
  function setRegisteredPersonPackFields(fields) {
8162
8250
  registeredPersonPackFields = [...fields];
@@ -8199,6 +8287,8 @@ function getParameterValue(data, nodeType) {
8199
8287
  return trim(data.actionFx);
8200
8288
  case "character-fx":
8201
8289
  return trim(data.characterFx);
8290
+ case "character-motion":
8291
+ return trim(data.characterMotion);
8202
8292
  case "transition":
8203
8293
  return trim(data.transition);
8204
8294
  case "style":
@@ -13336,6 +13426,12 @@ var VOICE_CHANGER_MODEL_IDS = VOICE_CHANGER_MODELS.map(
13336
13426
  );
13337
13427
  var DEFAULT_VOICE_CHANGER_MODEL = "eleven_multilingual_sts_v2";
13338
13428
 
13429
+ // src/node-execution-state.ts
13430
+ var OUTPUT_BEARING_NODE_STATUSES = /* @__PURE__ */ new Set(["completed", "failed"]);
13431
+ function nodeStateMayCarryOutput(status) {
13432
+ return status !== void 0 && OUTPUT_BEARING_NODE_STATUSES.has(status);
13433
+ }
13434
+
13339
13435
  // src/normalize-node-params.ts
13340
13436
  var MODEL_PARAM_NODE_TYPES = /* @__PURE__ */ new Set([
13341
13437
  "generate-image",
@@ -13983,6 +14079,45 @@ function buildBoardPrompt(templateId, ctx) {
13983
14079
  return tpl.build(ctx);
13984
14080
  }
13985
14081
 
14082
+ // src/template-categories.ts
14083
+ var TEMPLATE_CATEGORIES = [
14084
+ "product-imagery",
14085
+ "static-ads",
14086
+ "user-generated-content",
14087
+ "video-ads",
14088
+ "brand-assets",
14089
+ "automations",
14090
+ "campaign-concepts",
14091
+ "social-creatives"
14092
+ ];
14093
+ var DEFAULT_TEMPLATE_CATEGORY = "automations";
14094
+ var LEGACY_TEMPLATE_CATEGORIES = {
14095
+ "image-generation": "product-imagery",
14096
+ "video-production": "video-ads",
14097
+ "audio-music": "social-creatives",
14098
+ "content-writing": "campaign-concepts",
14099
+ "social-media": "social-creatives",
14100
+ "data-processing": "automations",
14101
+ "multi-step": "automations",
14102
+ other: "automations"
14103
+ };
14104
+ var CURRENT = new Set(TEMPLATE_CATEGORIES);
14105
+ function isTemplateCategory(value) {
14106
+ return typeof value === "string" && CURRENT.has(value);
14107
+ }
14108
+ function resolveTemplateCategory(value) {
14109
+ if (value == null) return void 0;
14110
+ if (isTemplateCategory(value)) return value;
14111
+ return LEGACY_TEMPLATE_CATEGORIES[value];
14112
+ }
14113
+ function normalizeTemplateCategory(value) {
14114
+ return resolveTemplateCategory(value) ?? DEFAULT_TEMPLATE_CATEGORY;
14115
+ }
14116
+ function templateCategoryStoredValues(category) {
14117
+ const legacy = Object.keys(LEGACY_TEMPLATE_CATEGORIES).filter((value) => LEGACY_TEMPLATE_CATEGORIES[value] === category);
14118
+ return [category, ...legacy];
14119
+ }
14120
+
13986
14121
  // src/model-tree.ts
13987
14122
  var ENUM_TARGETS = [
13988
14123
  [IMAGE_GEN_PROVIDERS, "generate-image"],
@@ -16786,6 +16921,56 @@ function parseScene3DCameraTrackJson(text) {
16786
16921
  }
16787
16922
  return { ok: true, value: parsed.data };
16788
16923
  }
16924
+
16925
+ // src/scene3d-delivery-notes.ts
16926
+ var SCENE3D_AUTHORING_ASSUMPTION_CODE = "SCENE_AUTHORING_ASSUMPTION";
16927
+ var SCENE3D_REVIEW_REFUSED_CODE = "SCENE_REVIEW_REFUSED";
16928
+ var SCENE3D_REVIEW_UNAVAILABLE_CODE = "SCENE_REVIEW_UNAVAILABLE";
16929
+ var SCENE3D_REMEDY_AUTO_APPLIED_CODE = "REMEDY_AUTO_APPLIED";
16930
+ var SCENE3D_ASSERTION_RESTORED_CODE = "ASSERTION_RESTORED";
16931
+ var SCENE3D_REVIEW_UNAVAILABLE_REASONS = ["provider", "unusable"];
16932
+ function isScene3DReviewUnavailableReason(value) {
16933
+ return SCENE3D_REVIEW_UNAVAILABLE_REASONS.includes(value);
16934
+ }
16935
+ function scene3DReviewVerdictOf(output) {
16936
+ const review = output?.metadata?.review;
16937
+ if (typeof review !== "object" || review === null) return void 0;
16938
+ const candidate = review;
16939
+ if (candidate.verdict !== "refused" && candidate.verdict !== "unavailable") return void 0;
16940
+ const objections = (Array.isArray(candidate.objections) ? candidate.objections : []).flatMap((entry) => {
16941
+ if (typeof entry !== "object" || entry === null) return [];
16942
+ const objection = entry;
16943
+ if (typeof objection.what !== "string" || !objection.what) return [];
16944
+ const frames = (Array.isArray(objection.frames) ? objection.frames : []).filter((frame) => Number.isSafeInteger(frame) && frame >= 0);
16945
+ return [{
16946
+ category: typeof objection.category === "string" && objection.category ? objection.category : "unsupported",
16947
+ what: objection.what,
16948
+ ...typeof objection.correction === "string" && objection.correction ? { correction: objection.correction } : {},
16949
+ frames
16950
+ }];
16951
+ });
16952
+ const findings = {
16953
+ objections,
16954
+ ...typeof candidate.observed === "string" && candidate.observed ? { observed: candidate.observed } : {}
16955
+ };
16956
+ if (candidate.verdict === "refused") return { verdict: "refused", ...findings };
16957
+ const attempts = typeof candidate.attempts === "number" && Number.isSafeInteger(candidate.attempts) && candidate.attempts > 0 ? candidate.attempts : 1;
16958
+ const reason = isScene3DReviewUnavailableReason(candidate.reason) ? candidate.reason : "provider";
16959
+ return { verdict: "unavailable", reason, attempts, ...findings };
16960
+ }
16961
+ function scene3DReviewNote(verdict) {
16962
+ if (verdict.verdict === "unavailable") {
16963
+ const asked = verdict.attempts === 1 ? "one attempt" : `${verdict.attempts} attempts`;
16964
+ const partial = verdict.objections.length ? ` Part of the review did answer first, and its ${verdict.objections.length === 1 ? "one finding is" : `${verdict.objections.length} findings are`} listed \u2014 but they are not the whole verdict.` : "";
16965
+ const missing = verdict.reason === "unusable" ? `returned no usable verdict in ${asked}` : `did not reach its provider in ${asked}`;
16966
+ return `The scene built and every mandatory assertion passed, but the visual review ${missing}; it was delivered unreviewed.${partial}`;
16967
+ }
16968
+ const count = verdict.objections.length;
16969
+ if (!count) {
16970
+ return "The visual review refused this scene without naming anything to change; it was delivered anyway because every mandatory assertion passed.";
16971
+ }
16972
+ return `The visual review refused this scene on ${count === 1 ? "one finding" : `${count} findings`}; it was delivered anyway because every mandatory assertion passed.`;
16973
+ }
16789
16974
  var scene3DInputAssetSchema = zod.z.object({
16790
16975
  id: zod.z.string().regex(/^[A-Za-z0-9][A-Za-z0-9_.:-]{0,63}$/),
16791
16976
  revisionId: zod.z.uuid(),
@@ -16856,6 +17041,26 @@ var pro3DRenderQuoteSchema = zod.z.object({
16856
17041
  function isPro3DRenderQuote(value) {
16857
17042
  return pro3DRenderQuoteSchema.safeParse(value).success;
16858
17043
  }
17044
+ var pro3DRenderReviewFindingsShape = {
17045
+ objections: zod.z.array(
17046
+ zod.z.object({
17047
+ category: zod.z.string(),
17048
+ what: zod.z.string(),
17049
+ correction: zod.z.string().optional(),
17050
+ frames: zod.z.array(zod.z.number().int().min(0)).default([])
17051
+ }).passthrough()
17052
+ ),
17053
+ observed: zod.z.string().optional()
17054
+ };
17055
+ var pro3DRenderReviewVerdictSchema = zod.z.union([
17056
+ zod.z.object({ verdict: zod.z.literal("refused"), ...pro3DRenderReviewFindingsShape }).passthrough(),
17057
+ zod.z.object({
17058
+ verdict: zod.z.literal("unavailable"),
17059
+ reason: zod.z.enum(SCENE3D_REVIEW_UNAVAILABLE_REASONS).catch("provider"),
17060
+ attempts: zod.z.number().int().min(1).catch(1),
17061
+ ...pro3DRenderReviewFindingsShape
17062
+ }).passthrough()
17063
+ ]);
16859
17064
  var pro3DRenderShotStillSchema = zod.z.object({
16860
17065
  shotIndex: zod.z.number().int().min(0),
16861
17066
  frame: zod.z.number().int().min(0),
@@ -16886,8 +17091,34 @@ var pro3DRenderJobOutputSchema = zod.z.object({
16886
17091
  height: zod.z.number().int().positive(),
16887
17092
  fps: zod.z.number().positive(),
16888
17093
  frames: zod.z.number().int().positive(),
16889
- duration: zod.z.number().positive()
17094
+ duration: zod.z.number().positive(),
17095
+ summary: zod.z.string().optional(),
17096
+ /**
17097
+ * Degrades to absent rather than refusing the RESULT, which is the whole lesson of the
17098
+ * verdict this round added. A narrow `verdict` here did not merely mis-read an unreviewed
17099
+ * delivery — it failed `isPro3DRenderJobOutput` for the entire job, blanking a real,
17100
+ * paid, playable MP4 over an advisory field. A verdict a future engine invents must cost
17101
+ * at most itself; the `SCENE_REVIEW_*` entry in `validation.warnings[]` still arrives
17102
+ * either way, because that array has no code enum.
17103
+ */
17104
+ review: pro3DRenderReviewVerdictSchema.optional().catch(void 0)
16890
17105
  }).passthrough(),
17106
+ repairPasses: zod.z.number().int().min(0).optional(),
17107
+ admissionRetries: zod.z.number().int().min(0).optional(),
17108
+ mechanicalPasses: zod.z.number().int().min(0).optional(),
17109
+ // Tolerant like the review verdict above, and for the same reason: this rides a result that
17110
+ // already has a real MP4, so a malformed entry must never blank a video the platform rendered
17111
+ // and charged for. The identity fields are required because an entry without them names
17112
+ // nothing; `value` is unknown because a restored assertion holds whatever it holds.
17113
+ restoredAssertions: zod.z.array(
17114
+ zod.z.object({
17115
+ op: zod.z.string(),
17116
+ path: zod.z.string(),
17117
+ value: zod.z.unknown().optional(),
17118
+ assertionId: zod.z.string(),
17119
+ reason: zod.z.string()
17120
+ }).passthrough()
17121
+ ).optional(),
16891
17122
  changeSummary: zod.z.string().optional()
16892
17123
  }).passthrough();
16893
17124
  function isPro3DRenderJobOutput(value) {
@@ -17359,6 +17590,8 @@ exports.DEFAULT_OVERLAY_TEXT = DEFAULT_OVERLAY_TEXT;
17359
17590
  exports.DEFAULT_PANEL_COUNT = DEFAULT_PANEL_COUNT;
17360
17591
  exports.DEFAULT_REF_IMAGE_MAX = DEFAULT_REF_IMAGE_MAX;
17361
17592
  exports.DEFAULT_SECTIONS = DEFAULT_SECTIONS;
17593
+ exports.DEFAULT_SUNO_MODEL = DEFAULT_SUNO_MODEL;
17594
+ exports.DEFAULT_TEMPLATE_CATEGORY = DEFAULT_TEMPLATE_CATEGORY;
17362
17595
  exports.DEFAULT_USAGE_MODE = DEFAULT_USAGE_MODE;
17363
17596
  exports.DEFAULT_VIDEO_ANALYSIS_MODEL = DEFAULT_VIDEO_ANALYSIS_MODEL;
17364
17597
  exports.DEFAULT_VIDEO_ANALYSIS_TIER = DEFAULT_VIDEO_ANALYSIS_TIER;
@@ -17387,6 +17620,7 @@ exports.ENTITY_TABLE = ENTITY_TABLE;
17387
17620
  exports.ENTITY_TOOL_RETRY_CAP = ENTITY_TOOL_RETRY_CAP;
17388
17621
  exports.ENTITY_TYPES = ENTITY_TYPES;
17389
17622
  exports.EXECUTION_DATA_KEYS = EXECUTION_DATA_KEYS;
17623
+ exports.EXECUTION_GRAPH_COMPOSED_PARAMETER_TYPES = EXECUTION_GRAPH_COMPOSED_PARAMETER_TYPES;
17390
17624
  exports.EXTEND_VIDEO_PROVIDERS = EXTEND_VIDEO_PROVIDERS;
17391
17625
  exports.EntityMetadataSchema = EntityMetadataSchema;
17392
17626
  exports.EntityRejectInputSchema = EntityRejectInputSchema;
@@ -17461,6 +17695,7 @@ exports.KEYFRAME_CREDITS_PER_SHOT = KEYFRAME_CREDITS_PER_SHOT;
17461
17695
  exports.KINETIC_CAPTION_STYLES = KINETIC_CAPTION_STYLES;
17462
17696
  exports.LANGUAGES = LANGUAGES;
17463
17697
  exports.LEGACY_LOTTIE_HOST_REMAP = LEGACY_LOTTIE_HOST_REMAP;
17698
+ exports.LEGACY_TEMPLATE_CATEGORIES = LEGACY_TEMPLATE_CATEGORIES;
17464
17699
  exports.LIP_SYNC_DURATION_BUCKETS = LIP_SYNC_DURATION_BUCKETS;
17465
17700
  exports.LIP_SYNC_MAX_AUDIO_SECONDS = LIP_SYNC_MAX_AUDIO_SECONDS;
17466
17701
  exports.LIP_SYNC_PROVIDERS = LIP_SYNC_PROVIDERS;
@@ -17500,6 +17735,7 @@ exports.MINIMAX_H3_DEFAULT_RESOLUTION = MINIMAX_H3_DEFAULT_RESOLUTION;
17500
17735
  exports.MINIMAX_H3_PROVIDERS = MINIMAX_H3_PROVIDERS;
17501
17736
  exports.MODELS_WITH_REFERENCE_IMAGE_SUPPORT = MODELS_WITH_REFERENCE_IMAGE_SUPPORT;
17502
17737
  exports.MODEL_CATALOG = MODEL_CATALOG;
17738
+ exports.MODEL_KINDS = MODEL_KINDS;
17503
17739
  exports.MODEL_PARAM_NODE_TYPES = MODEL_PARAM_NODE_TYPES;
17504
17740
  exports.MODEL_RECOMMENDATIONS = MODEL_RECOMMENDATIONS;
17505
17741
  exports.MODIFY_IMAGE_PROVIDERS = MODIFY_IMAGE_PROVIDERS;
@@ -17532,6 +17768,7 @@ exports.ORG_ERROR_CODES = ORG_ERROR_CODES;
17532
17768
  exports.ORG_KINDS = ORG_KINDS;
17533
17769
  exports.ORG_ROLES = ORG_ROLES;
17534
17770
  exports.ORG_STATUSES = ORG_STATUSES;
17771
+ exports.OUTPUT_BEARING_NODE_STATUSES = OUTPUT_BEARING_NODE_STATUSES;
17535
17772
  exports.OUTPUT_FIELD_MAP = OUTPUT_FIELD_MAP;
17536
17773
  exports.OUTPUT_FORMATS = OUTPUT_FORMATS;
17537
17774
  exports.OVERLAY_ANCHORS = OVERLAY_ANCHORS;
@@ -17624,9 +17861,11 @@ exports.REPEATABLE_NODE_TYPES = REPEATABLE_NODE_TYPES;
17624
17861
  exports.REPEAT_PLACEHOLDER = REPEAT_PLACEHOLDER;
17625
17862
  exports.REPLICATE_LIP_SYNC_PROVIDERS = REPLICATE_LIP_SYNC_PROVIDERS;
17626
17863
  exports.RESERVED_TEMPLATE_VARS = RESERVED_TEMPLATE_VARS;
17864
+ exports.SCENE3D_ASSERTION_RESTORED_CODE = SCENE3D_ASSERTION_RESTORED_CODE;
17627
17865
  exports.SCENE3D_ASSET_KINDS = SCENE3D_ASSET_KINDS;
17628
17866
  exports.SCENE3D_ASSET_ROLES = SCENE3D_ASSET_ROLES;
17629
17867
  exports.SCENE3D_ASSET_ROLE_KINDS = SCENE3D_ASSET_ROLE_KINDS;
17868
+ exports.SCENE3D_AUTHORING_ASSUMPTION_CODE = SCENE3D_AUTHORING_ASSUMPTION_CODE;
17630
17869
  exports.SCENE3D_AUTHORING_ENGINES = SCENE3D_AUTHORING_ENGINES;
17631
17870
  exports.SCENE3D_BASIC_ENGINE = SCENE3D_BASIC_ENGINE;
17632
17871
  exports.SCENE3D_BASIC_SCHEMA_VERSION = SCENE3D_BASIC_SCHEMA_VERSION;
@@ -17651,11 +17890,15 @@ exports.SCENE3D_PLAN_FIELD = SCENE3D_PLAN_FIELD;
17651
17890
  exports.SCENE3D_PLAN_TYPE = SCENE3D_PLAN_TYPE;
17652
17891
  exports.SCENE3D_PRIMITIVES = SCENE3D_PRIMITIVES;
17653
17892
  exports.SCENE3D_PRIMITIVE_MATERIAL_ROLE = SCENE3D_PRIMITIVE_MATERIAL_ROLE;
17893
+ exports.SCENE3D_REMEDY_AUTO_APPLIED_CODE = SCENE3D_REMEDY_AUTO_APPLIED_CODE;
17654
17894
  exports.SCENE3D_RENDERER_ASSET_KINDS = SCENE3D_RENDERER_ASSET_KINDS;
17655
17895
  exports.SCENE3D_RENDER_BASE_MAX_PX = SCENE3D_RENDER_BASE_MAX_PX;
17656
17896
  exports.SCENE3D_RENDER_TIERS = SCENE3D_RENDER_TIERS;
17657
17897
  exports.SCENE3D_RENDER_TIER_MULTIPLIERS = SCENE3D_RENDER_TIER_MULTIPLIERS;
17658
17898
  exports.SCENE3D_RENDER_XLARGE_MIN_AREA_PX = SCENE3D_RENDER_XLARGE_MIN_AREA_PX;
17899
+ exports.SCENE3D_REVIEW_REFUSED_CODE = SCENE3D_REVIEW_REFUSED_CODE;
17900
+ exports.SCENE3D_REVIEW_UNAVAILABLE_CODE = SCENE3D_REVIEW_UNAVAILABLE_CODE;
17901
+ exports.SCENE3D_REVIEW_UNAVAILABLE_REASONS = SCENE3D_REVIEW_UNAVAILABLE_REASONS;
17659
17902
  exports.SCENE3D_SCHEMA_VERSION = SCENE3D_SCHEMA_VERSION;
17660
17903
  exports.SCENE3D_SCHEMA_VERSION_V2 = SCENE3D_SCHEMA_VERSION_V2;
17661
17904
  exports.SCENE3D_SUPPORTED_SCHEMA_VERSIONS = SCENE3D_SUPPORTED_SCHEMA_VERSIONS;
@@ -17704,14 +17947,18 @@ exports.STUDIO_DEPENDENT_FRAMES_CAPABILITY = STUDIO_DEPENDENT_FRAMES_CAPABILITY;
17704
17947
  exports.STUDIO_SHOT_TRANSIENT_KEYS = STUDIO_SHOT_TRANSIENT_KEYS;
17705
17948
  exports.STUDIO_TRANSIENT_KEYS = STUDIO_TRANSIENT_KEYS;
17706
17949
  exports.SUBMISSION_STATUSES = SUBMISSION_STATUSES;
17950
+ exports.SUNO_ACTIVE_MODELS = SUNO_ACTIVE_MODELS;
17707
17951
  exports.SUNO_ADD_TRACK_MODELS = SUNO_ADD_TRACK_MODELS;
17952
+ exports.SUNO_DURATION_MODELS = SUNO_DURATION_MODELS;
17708
17953
  exports.SUNO_FIELD_HANDLE_FIELDS = SUNO_FIELD_HANDLE_FIELDS;
17709
17954
  exports.SUNO_HARD_CEILING = SUNO_HARD_CEILING;
17955
+ exports.SUNO_LEGACY_MODELS = SUNO_LEGACY_MODELS;
17710
17956
  exports.SUNO_MODELS = SUNO_MODELS;
17711
17957
  exports.SUNO_SELECT_OPERATIONS = SUNO_SELECT_OPERATIONS;
17712
17958
  exports.SUNO_TEXT_MAX = SUNO_TEXT_MAX;
17713
17959
  exports.SUNO_TITLE_MAX = SUNO_TITLE_MAX;
17714
17960
  exports.SUNO_TRACK_SOURCE_TYPES = SUNO_TRACK_SOURCE_TYPES;
17961
+ exports.SUNO_VERSION_CREDIT_KEYS = SUNO_VERSION_CREDIT_KEYS;
17715
17962
  exports.SUNO_VERSION_PRICED_OPERATIONS = SUNO_VERSION_PRICED_OPERATIONS;
17716
17963
  exports.SUPPORTED_FONT_NAMES = SUPPORTED_FONT_NAMES;
17717
17964
  exports.SURROUND_DIRECTIONS = SURROUND_DIRECTIONS;
@@ -17732,6 +17979,7 @@ exports.StyleDirectivesSchema = StyleDirectivesSchema;
17732
17979
  exports.SubGateNameSchema = SubGateNameSchema;
17733
17980
  exports.T2I_TO_I2I_VARIANT = T2I_TO_I2I_VARIANT;
17734
17981
  exports.TASK_CHAINED_EDIT_PROVIDERS = TASK_CHAINED_EDIT_PROVIDERS;
17982
+ exports.TEMPLATE_CATEGORIES = TEMPLATE_CATEGORIES;
17735
17983
  exports.TEXT_TO_AUDIO_PROVIDERS = TEXT_TO_AUDIO_PROVIDERS;
17736
17984
  exports.TEXT_TO_VIDEO_PROVIDERS = TEXT_TO_VIDEO_PROVIDERS;
17737
17985
  exports.TIER_MAX_PIPELINE_COST_CREDITS = TIER_MAX_PIPELINE_COST_CREDITS;
@@ -17794,6 +18042,7 @@ exports.VIDEO_GEN_PROVIDERS = VIDEO_GEN_PROVIDERS;
17794
18042
  exports.VIDEO_INPUT_LIP_SYNC_PROVIDERS = VIDEO_INPUT_LIP_SYNC_PROVIDERS;
17795
18043
  exports.VIDEO_MODEL_CAPS = VIDEO_MODEL_CAPS;
17796
18044
  exports.VIDEO_MODE_ALIASES = VIDEO_MODE_ALIASES;
18045
+ exports.VIDEO_ONLY_PARAMETER_NODE_TYPES = VIDEO_ONLY_PARAMETER_NODE_TYPES;
17797
18046
  exports.VIDEO_PRODUCER_TYPES = VIDEO_PRODUCER_TYPES;
17798
18047
  exports.VIDEO_PROMPT_MAX = VIDEO_PROMPT_MAX;
17799
18048
  exports.VIDEO_PROVIDERS_REQUIRING_IMAGE = VIDEO_PROVIDERS_REQUIRING_IMAGE;
@@ -17987,6 +18236,7 @@ exports.getVideoAudioCapability = getVideoAudioCapability;
17987
18236
  exports.getWeapon = getWeapon;
17988
18237
  exports.getWeaponLabel = getWeaponLabel;
17989
18238
  exports.groupByFamily = groupByFamily;
18239
+ exports.groupByKindAndFamily = groupByKindAndFamily;
17990
18240
  exports.groupHandleId = groupHandleId;
17991
18241
  exports.groupLlmModelsByVendor = groupLlmModelsByVendor;
17992
18242
  exports.hasContiguousSegmentDurations = hasContiguousSegmentDurations;
@@ -18010,6 +18260,7 @@ exports.isGvpSupportedProvider = isGvpSupportedProvider;
18010
18260
  exports.isHandleInputWired = isHandleInputWired;
18011
18261
  exports.isKineticCaptionStyle = isKineticCaptionStyle;
18012
18262
  exports.isKnownScene3DEngine = isKnownScene3DEngine;
18263
+ exports.isLegacySunoModel = isLegacySunoModel;
18013
18264
  exports.isLocationUsageMode = isLocationUsageMode;
18014
18265
  exports.isMinimaxH3Provider = isMinimaxH3Provider;
18015
18266
  exports.isObjectAspectRatio = isObjectAspectRatio;
@@ -18026,9 +18277,11 @@ exports.isScene3DHttpUrl = isScene3DHttpUrl;
18026
18277
  exports.isScene3DPlan = isScene3DPlan;
18027
18278
  exports.isScene3DPlanV1 = isScene3DPlanV1;
18028
18279
  exports.isScene3DPlanV2 = isScene3DPlanV2;
18280
+ exports.isScene3DReviewUnavailableReason = isScene3DReviewUnavailableReason;
18029
18281
  exports.isScene3DSchemaVersionSupported = isScene3DSchemaVersionSupported;
18030
18282
  exports.isScraperActor = isScraperActor;
18031
18283
  exports.isSeedance2Provider = isSeedance2Provider;
18284
+ exports.isTemplateCategory = isTemplateCategory;
18032
18285
  exports.isTiltDirection = isTiltDirection;
18033
18286
  exports.isUsageMode = isUsageMode;
18034
18287
  exports.isVeoProvider = isVeoProvider;
@@ -18062,12 +18315,14 @@ exports.modelsForInputMode = modelsForInputMode;
18062
18315
  exports.modelsWithFeature = modelsWithFeature;
18063
18316
  exports.motionGraphicsFeature = motionGraphicsFeature;
18064
18317
  exports.newScene3DRevisionId = newScene3DRevisionId;
18318
+ exports.nodeStateMayCarryOutput = nodeStateMayCarryOutput;
18065
18319
  exports.normalizeLottieLayers = normalizeLottieLayers;
18066
18320
  exports.normalizeMinimaxH3Resolution = normalizeMinimaxH3Resolution;
18067
18321
  exports.normalizeModelInput = normalizeModelInput;
18068
18322
  exports.normalizeNodeModelParams = normalizeNodeModelParams;
18069
18323
  exports.normalizePinterestUrl = normalizePinterestUrl;
18070
18324
  exports.normalizeRoleSlug = normalizeRoleSlug;
18325
+ exports.normalizeTemplateCategory = normalizeTemplateCategory;
18071
18326
  exports.normalizeVideoRequestParams = normalizeVideoRequestParams;
18072
18327
  exports.normalizeWan3Resolution = normalizeWan3Resolution;
18073
18328
  exports.orderedLlmModels = orderedLlmModels;
@@ -18105,12 +18360,14 @@ exports.presentTypes = presentTypes;
18105
18360
  exports.presetApplyClearKeys = presetApplyClearKeys;
18106
18361
  exports.presetDataMatches = presetDataMatches;
18107
18362
  exports.presetEntries = presetEntries;
18363
+ exports.pricedOutputDurationSec = pricedOutputDurationSec;
18108
18364
  exports.pricedVideoSelection = pricedVideoSelection;
18109
18365
  exports.pro3DRenderCoreOutputSchema = pro3DRenderCoreOutputSchema;
18110
18366
  exports.pro3DRenderFrameUnit = pro3DRenderFrameUnit;
18111
18367
  exports.pro3DRenderJobOutputSchema = pro3DRenderJobOutputSchema;
18112
18368
  exports.pro3DRenderProducedSchemaVersion = pro3DRenderProducedSchemaVersion;
18113
18369
  exports.pro3DRenderQuoteSchema = pro3DRenderQuoteSchema;
18370
+ exports.pro3DRenderReviewVerdictSchema = pro3DRenderReviewVerdictSchema;
18114
18371
  exports.pro3DRenderShotStillSchema = pro3DRenderShotStillSchema;
18115
18372
  exports.pro3DRenderShotStills = pro3DRenderShotStills;
18116
18373
  exports.pro3DRenderTimingOverrides = pro3DRenderTimingOverrides;
@@ -18161,6 +18418,7 @@ exports.resolveSlideshowTransition = resolveSlideshowTransition;
18161
18418
  exports.resolveSourceThroughConnectedList = resolveSourceThroughConnectedList;
18162
18419
  exports.resolveStoredTier = resolveStoredTier;
18163
18420
  exports.resolveSwitchXCreditId = resolveSwitchXCreditId;
18421
+ exports.resolveTemplateCategory = resolveTemplateCategory;
18164
18422
  exports.resolveTopazUpscale = resolveTopazUpscale;
18165
18423
  exports.resolveVideoAnalysisModel = resolveVideoAnalysisModel;
18166
18424
  exports.resolveVideoModeForInputs = resolveVideoModeForInputs;
@@ -18233,6 +18491,8 @@ exports.scene3DProvenanceSchema = scene3DProvenanceSchema;
18233
18491
  exports.scene3DReferenceSchema = scene3DReferenceSchema;
18234
18492
  exports.scene3DRenderTier = scene3DRenderTier;
18235
18493
  exports.scene3DRenderTierCredits = scene3DRenderTierCredits;
18494
+ exports.scene3DReviewNote = scene3DReviewNote;
18495
+ exports.scene3DReviewVerdictOf = scene3DReviewVerdictOf;
18236
18496
  exports.scene3DSampleForFrame = scene3DSampleForFrame;
18237
18497
  exports.scene3DSha256Schema = scene3DSha256Schema;
18238
18498
  exports.scene3DShotForFrame = scene3DShotForFrame;
@@ -18275,10 +18535,12 @@ exports.stripStudioTransientSettings = stripStudioTransientSettings;
18275
18535
  exports.stripTransientRuntimeData = stripTransientRuntimeData;
18276
18536
  exports.summarizeScene3DOperations = summarizeScene3DOperations;
18277
18537
  exports.sunoCreditType = sunoCreditType;
18538
+ exports.sunoModelHonoursDuration = sunoModelHonoursDuration;
18278
18539
  exports.supportedDefaultDimensions = supportedDefaultDimensions;
18279
18540
  exports.supportsAdvancedMode = supportsAdvancedMode;
18280
18541
  exports.supportsEndAnchor = supportsEndAnchor;
18281
18542
  exports.supportsExtendRender = supportsExtendRender;
18543
+ exports.templateCategoryStoredValues = templateCategoryStoredValues;
18282
18544
  exports.toConnectedReference = toConnectedReference;
18283
18545
  exports.toConnectedReferences = toConnectedReferences;
18284
18546
  exports.togglePick = togglePick;