@nodaro/shared 2.18.0 → 2.20.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 (83) hide show
  1. package/dist/index.cjs +350 -23
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.d.cts +955 -564
  4. package/dist/index.d.ts +955 -564
  5. package/dist/index.js +334 -24
  6. package/dist/index.js.map +1 -1
  7. package/package.json +1 -1
  8. package/src/__tests__/credit-identifiers.test.ts +180 -0
  9. package/src/__tests__/gvp-supported-providers.test.ts +22 -1
  10. package/src/__tests__/image-pricing-catalog-coverage.test.ts +139 -0
  11. package/src/__tests__/normalize-node-params.test.ts +36 -0
  12. package/src/__tests__/organizations-types.test.ts +29 -1
  13. package/src/__tests__/prompt-length-limits.test.ts +40 -0
  14. package/src/__tests__/suno-credit-type.test.ts +54 -0
  15. package/src/__tests__/video-analysis-brief.test.ts +61 -0
  16. package/src/__tests__/video-audio-capability.test.ts +43 -0
  17. package/src/__tests__/video-mode-for-inputs.test.ts +1 -1
  18. package/src/__tests__/wan-3-catalog.test.ts +243 -0
  19. package/src/credit-identifiers.ts +191 -21
  20. package/src/i18n/held-prop.ar.ts +2 -0
  21. package/src/i18n/held-prop.de.ts +3 -0
  22. package/src/i18n/held-prop.es.ts +3 -0
  23. package/src/i18n/held-prop.fr.ts +2 -0
  24. package/src/i18n/held-prop.he.ts +3 -0
  25. package/src/i18n/held-prop.hi.ts +2 -0
  26. package/src/i18n/held-prop.ja.ts +3 -0
  27. package/src/i18n/held-prop.ko.ts +3 -0
  28. package/src/i18n/held-prop.pt-BR.ts +3 -0
  29. package/src/i18n/held-prop.ru.ts +2 -0
  30. package/src/i18n/held-prop.zh-CN.ts +3 -0
  31. package/src/i18n/person.ar.ts +3 -0
  32. package/src/i18n/person.de.ts +4 -0
  33. package/src/i18n/person.es.ts +4 -0
  34. package/src/i18n/person.fr.ts +3 -0
  35. package/src/i18n/person.he.ts +4 -0
  36. package/src/i18n/person.hi.ts +3 -0
  37. package/src/i18n/person.ja.ts +4 -0
  38. package/src/i18n/person.ko.ts +4 -0
  39. package/src/i18n/person.pt-BR.ts +4 -0
  40. package/src/i18n/person.ru.ts +3 -0
  41. package/src/i18n/person.zh-CN.ts +4 -0
  42. package/src/i18n/setting.ar.ts +2 -0
  43. package/src/i18n/setting.de.ts +3 -0
  44. package/src/i18n/setting.es.ts +3 -0
  45. package/src/i18n/setting.fr.ts +2 -0
  46. package/src/i18n/setting.he.ts +3 -0
  47. package/src/i18n/setting.hi.ts +2 -0
  48. package/src/i18n/setting.ja.ts +3 -0
  49. package/src/i18n/setting.ko.ts +3 -0
  50. package/src/i18n/setting.pt-BR.ts +3 -0
  51. package/src/i18n/setting.ru.ts +2 -0
  52. package/src/i18n/setting.zh-CN.ts +3 -0
  53. package/src/i18n/style.ar.ts +2 -0
  54. package/src/i18n/style.de.ts +3 -0
  55. package/src/i18n/style.es.ts +3 -0
  56. package/src/i18n/style.fr.ts +2 -0
  57. package/src/i18n/style.he.ts +3 -0
  58. package/src/i18n/style.hi.ts +2 -0
  59. package/src/i18n/style.ja.ts +3 -0
  60. package/src/i18n/style.ko.ts +3 -0
  61. package/src/i18n/style.pt-BR.ts +3 -0
  62. package/src/i18n/style.ru.ts +2 -0
  63. package/src/i18n/style.zh-CN.ts +3 -0
  64. package/src/i18n/styling.ar.ts +4 -0
  65. package/src/i18n/styling.de.ts +5 -0
  66. package/src/i18n/styling.es.ts +5 -0
  67. package/src/i18n/styling.fr.ts +4 -0
  68. package/src/i18n/styling.he.ts +5 -0
  69. package/src/i18n/styling.hi.ts +4 -0
  70. package/src/i18n/styling.ja.ts +5 -0
  71. package/src/i18n/styling.ko.ts +5 -0
  72. package/src/i18n/styling.pt-BR.ts +5 -0
  73. package/src/i18n/styling.ru.ts +4 -0
  74. package/src/i18n/styling.zh-CN.ts +5 -0
  75. package/src/index.ts +17 -0
  76. package/src/model-catalog.ts +101 -0
  77. package/src/model-constants.ts +251 -16
  78. package/src/node-default-mappings.ts +5 -0
  79. package/src/normalize-node-params.ts +8 -0
  80. package/src/organizations/types.ts +12 -0
  81. package/src/organizations/views.ts +114 -0
  82. package/src/video-analysis.ts +45 -0
  83. package/src/video-ui-defaults.ts +66 -0
package/dist/index.cjs CHANGED
@@ -84,6 +84,7 @@ var WAN_27_IMAGE_RATIOS = ["1:1", "16:9", "9:16", "4:3", "3:4", "21:9", "8:1", "
84
84
  var VIDEO_RATIOS_HVS345 = ["16:9", "9:16", "1:1", "4:3", "3:4"];
85
85
  var VIDEO_RATIOS_SEEDANCE_2 = ["16:9", "9:16", "1:1", "4:3", "3:4", "21:9", "adaptive"];
86
86
  var VIDEO_RATIOS_HAPPYHORSE_11 = ["16:9", "9:16", "1:1", "4:3", "3:4", "4:5", "5:4", "21:9", "9:21"];
87
+ var VIDEO_RATIOS_WAN_3 = ["adaptive", "16:9", "4:3", "1:1", "3:4", "9:16"];
87
88
  var IMAGE_MODELS = {
88
89
  // ── Google Nano Banana ──
89
90
  "nano-banana": {
@@ -1023,6 +1024,42 @@ var VIDEO_MODELS = {
1023
1024
  { identifier: "gemini-omni-video:4k:vref", credits: 900, note: "video-edit 4K" }
1024
1025
  ]
1025
1026
  },
1027
+ // Gemini Omni Flash 1.1 — the faster/cheaper Omni SKU (KIE
1028
+ // `google/gemini-omni-flash-1-1`). Identical request surface to
1029
+ // gemini-omni-video, so every capability below is deliberate PARITY with the
1030
+ // sibling: same 4/6/8/10s ladder, same 720p/1080p + 4K bands, same
1031
+ // features (the KIE schema also exposes first/last frame, but the pro
1032
+ // sibling's frame path is unwired here too — no "end-frame" until it is).
1033
+ // 360p is on the KIE enum but NOT exposed: it sits in the same credit band as
1034
+ // 720p/1080p, so it could only hand the user a worse render at the same price.
1035
+ "gemini-omni-flash": {
1036
+ id: "gemini-omni-flash",
1037
+ kind: "video",
1038
+ modes: ["i2v", "t2v"],
1039
+ // V2V is served via the i2v handle, not a catalog mode
1040
+ family: "Google",
1041
+ label: "Gemini Omni Flash",
1042
+ series: "Gemini",
1043
+ description: "Google Gemini Omni Flash \u2014 faster/cheaper Omni tier: multimodal video with native audio, text/image-to-video + video-edit.",
1044
+ useCases: ["cinematic", "fast"],
1045
+ features: ["audio", "reference-image"],
1046
+ aspectRatios: VIDEO_RATIOS_HV,
1047
+ resolutions: ["720p", "1080p", "4k"],
1048
+ durations: [4, 6, 8, 10],
1049
+ pricing: [
1050
+ { identifier: "gemini-omni-flash", credits: 270, note: "default \u2014 8s 720p/1080p (the credit builder's duration fallback)" },
1051
+ { identifier: "gemini-omni-flash:4", credits: 160, note: "720p/1080p 4s" },
1052
+ { identifier: "gemini-omni-flash:6", credits: 210, note: "720p/1080p 6s" },
1053
+ { identifier: "gemini-omni-flash:8", credits: 270, note: "720p/1080p 8s" },
1054
+ { identifier: "gemini-omni-flash:10", credits: 320, note: "720p/1080p 10s" },
1055
+ { identifier: "gemini-omni-flash:4k:4", credits: 370, note: "4K 4s" },
1056
+ { identifier: "gemini-omni-flash:4k:6", credits: 420, note: "4K 6s" },
1057
+ { identifier: "gemini-omni-flash:4k:8", credits: 480, note: "4K 8s" },
1058
+ { identifier: "gemini-omni-flash:4k:10", credits: 530, note: "4K 10s" },
1059
+ { identifier: "gemini-omni-flash:vref", credits: 420, note: "video-edit 720p/1080p" },
1060
+ { identifier: "gemini-omni-flash:4k:vref", credits: 630, note: "video-edit 4K" }
1061
+ ]
1062
+ },
1026
1063
  // ── Kling ──
1027
1064
  "kling": {
1028
1065
  id: "kling",
@@ -1290,6 +1327,66 @@ var VIDEO_MODELS = {
1290
1327
  ]
1291
1328
  },
1292
1329
  // ── Wan ──
1330
+ // Wan 3.0 (standard + Prime) — a NEW generation, not a tier of the 2.x ladder.
1331
+ // One id per SKU serves BOTH modes (no t2v twin, no alias): first/last frame
1332
+ // OR an all-purpose reference mode (images/videos/audio, bound in the prompt
1333
+ // as Image1/Video1/Audio1 — no space, unlike Wan 2.x), native audio behind a
1334
+ // boolean `audio` lever, 2-30s at 480p/720p/1080p.
1335
+ // `video-reference` is deliberately NOT declared: KIE accepts reference videos,
1336
+ // but the extend chain is unwired and KIE caps input-video + output at 30s,
1337
+ // which the segment bounds cannot express. Precedent: gemini-omni-video carries
1338
+ // ref limits without the feature. The ref CAPS still live in
1339
+ // VIDEO_REF_LIMITS_BY_PROVIDER (model-constants).
1340
+ // `resolutions` is ascending (repo convention); the DEFAULT tier (720p) is
1341
+ // declared explicitly in PRICING_DEFAULT_RESOLUTION, never by array position.
1342
+ "wan-3": {
1343
+ id: "wan-3",
1344
+ kind: "video",
1345
+ modes: ["i2v", "t2v"],
1346
+ family: "Alibaba",
1347
+ label: "Wan 3.0",
1348
+ series: "Wan",
1349
+ description: "Wan 3.0 \u2014 multimodal: first/last frame or image/video/audio references, native audio, 2-30s at 480p/720p/1080p.",
1350
+ useCases: ["motion", "narrative", "long-form"],
1351
+ features: ["end-frame", "audio", "reference-image"],
1352
+ aspectRatios: VIDEO_RATIOS_WAN_3,
1353
+ durations: [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30],
1354
+ resolutions: ["480p", "720p", "1080p"],
1355
+ pricing: [
1356
+ { identifier: "wan-3", credits: 200, note: "default 5s 720p \u2014 see :Ns:res variants for exact" },
1357
+ { identifier: "wan-3:5s:720p", credits: 200, note: "5s 720p (the default tier)" },
1358
+ { identifier: "wan-3:8s:480p", credits: 160, note: "8s 480p" },
1359
+ { identifier: "wan-3:8s:720p", credits: 320, note: "8s 720p" },
1360
+ { identifier: "wan-3:8s:1080p", credits: 640, note: "8s 1080p" },
1361
+ { identifier: "wan-3:30s:480p", credits: 600, note: "30s 480p (max)" },
1362
+ { identifier: "wan-3:30s:720p", credits: 1200, note: "30s 720p (max)" },
1363
+ { identifier: "wan-3:30s:1080p", credits: 2400, note: "30s 1080p (max)" }
1364
+ ]
1365
+ },
1366
+ "wan-3-prime": {
1367
+ id: "wan-3-prime",
1368
+ kind: "video",
1369
+ modes: ["i2v", "t2v"],
1370
+ family: "Alibaba",
1371
+ label: "Wan 3.0 Prime",
1372
+ series: "Wan",
1373
+ description: "Wan 3.0 Prime \u2014 Alibaba's high-speed Wan 3.0 tier: same multimodal surface and 2-30s range, faster turnaround at a higher per-second rate.",
1374
+ useCases: ["fast", "motion", "narrative"],
1375
+ features: ["end-frame", "audio", "reference-image"],
1376
+ aspectRatios: VIDEO_RATIOS_WAN_3,
1377
+ durations: [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30],
1378
+ resolutions: ["480p", "720p", "1080p"],
1379
+ pricing: [
1380
+ { identifier: "wan-3-prime", credits: 320, note: "default 5s 720p \u2014 see :Ns:res variants for exact" },
1381
+ { identifier: "wan-3-prime:5s:720p", credits: 320, note: "5s 720p (the default tier)" },
1382
+ { identifier: "wan-3-prime:8s:480p", credits: 250, note: "8s 480p" },
1383
+ { identifier: "wan-3-prime:8s:720p", credits: 510, note: "8s 720p" },
1384
+ { identifier: "wan-3-prime:8s:1080p", credits: 1010, note: "8s 1080p" },
1385
+ { identifier: "wan-3-prime:30s:480p", credits: 920, note: "30s 480p (max)" },
1386
+ { identifier: "wan-3-prime:30s:720p", credits: 1890, note: "30s 720p (max)" },
1387
+ { identifier: "wan-3-prime:30s:1080p", credits: 3780, note: "30s 1080p (max)" }
1388
+ ]
1389
+ },
1293
1390
  "wan-i2v": {
1294
1391
  id: "wan-i2v",
1295
1392
  kind: "video",
@@ -2428,6 +2525,25 @@ function modelIdsByKindMode(kind, modes, opts = {}) {
2428
2525
  // src/model-constants.ts
2429
2526
  var CREDIT_BASE_USD = 2e-3;
2430
2527
  var IMAGE_PROMPT_MAX = 5e3;
2528
+ var IMAGE_ASPECT_RATIO_VALUES = [
2529
+ "auto",
2530
+ "1:1",
2531
+ "16:9",
2532
+ "9:16",
2533
+ "4:3",
2534
+ "3:4",
2535
+ "3:2",
2536
+ "2:3",
2537
+ "5:4",
2538
+ "4:5",
2539
+ "21:9",
2540
+ // Ultra-wide / ultra-tall banner ratios: Wan 2.7 + Wan 2.7 Pro (8:1, 1:8)
2541
+ // and Nano Banana 2 Lite (4:1, 1:4, 8:1, 1:8).
2542
+ "4:1",
2543
+ "1:4",
2544
+ "8:1",
2545
+ "1:8"
2546
+ ];
2431
2547
  var MAX_IMAGE_PROMPT_CHARS_BY_PROVIDER = {
2432
2548
  // ── higher than the 5000 default ──
2433
2549
  "nano-banana-2": 2e4,
@@ -2465,6 +2581,7 @@ function getMaxImagePromptChars(provider) {
2465
2581
  }
2466
2582
  var VIDEO_PROMPT_MAX = 8e3;
2467
2583
  var SUNO_TEXT_MAX = 5e3;
2584
+ var SUNO_HARD_CEILING = 3e4;
2468
2585
  var PROMPT_HARD_CEILING = 3e4;
2469
2586
  var LLM_TEXT_INPUT_MAX = 1e5;
2470
2587
  var MAX_VIDEO_PROMPT_CHARS_BY_PROVIDER = {
@@ -2481,6 +2598,13 @@ var MAX_VIDEO_PROMPT_CHARS_BY_PROVIDER = {
2481
2598
  // (docs.kie.ai/market/bytedance/seedance-2-5).
2482
2599
  "seedance-2-5": 3e4,
2483
2600
  "gemini-omni-video": 2e4,
2601
+ // Gemini Omni Flash 1.1 — same 20000-char prompt surface as the pro sibling
2602
+ // (docs.kie.ai/market/google/gemini-omni-flash-1-1).
2603
+ "gemini-omni-flash": 2e4,
2604
+ // Wan 3.0 / 3.0 Prime — 20000 chars, excess truncated by the provider
2605
+ // (docs.kie.ai/market/wan/3-0-video and /3-0-video-prime).
2606
+ "wan-3": 2e4,
2607
+ "wan-3-prime": 2e4,
2484
2608
  "bytedance-lite": 1e4,
2485
2609
  "bytedance-pro": 1e4,
2486
2610
  "bytedance-pro-fast": 1e4,
@@ -2873,6 +2997,11 @@ var IMAGE_TO_VIDEO_PROVIDERS = [
2873
2997
  "runway-kie",
2874
2998
  "kling-3-omni",
2875
2999
  "gemini-omni-video",
3000
+ "gemini-omni-flash",
3001
+ // Wan 3.0 family — one id per SKU serves BOTH modes (no t2v twin, no alias),
3002
+ // so each id is listed in this array AND in TEXT_TO_VIDEO_PROVIDERS.
3003
+ "wan-3",
3004
+ "wan-3-prime",
2876
3005
  "ltx-2.3-pro",
2877
3006
  "ltx-2.3-fast",
2878
3007
  // xAI Grok Imagine Video 1.5 — KIE i2v (image_urls required). Also listed in
@@ -2908,6 +3037,12 @@ var TEXT_TO_VIDEO_PROVIDERS = [
2908
3037
  "happyhorse",
2909
3038
  "runway-kie",
2910
3039
  "gemini-omni-video",
3040
+ "gemini-omni-flash",
3041
+ // Wan 3.0 family — REAL t2v (prompt-only runs are the documented default
3042
+ // mode), so they belong in this main section and must NOT be gated by
3043
+ // VIDEO_PROVIDERS_REQUIRING_IMAGE.
3044
+ "wan-3",
3045
+ "wan-3-prime",
2911
3046
  "ltx-2.3-pro",
2912
3047
  "ltx-2.3-fast",
2913
3048
  // ── i2v-only providers (image required) ──────────────────────────────────
@@ -3204,7 +3339,13 @@ var DURATION_PRICED_PROVIDERS = /* @__PURE__ */ new Set([
3204
3339
  "grok-imagine-video-1.5",
3205
3340
  "happyhorse",
3206
3341
  "happyhorse-i2v",
3207
- "happyhorse-ref2v"
3342
+ "happyhorse-ref2v",
3343
+ // Wan 3.0 family — per-second billing at three resolution rates. NOTE:
3344
+ // gemini-omni-flash is deliberately ABSENT (like gemini-omni-video): the
3345
+ // Gemini Omni branch in buildVideoCreditModelIdentifier early-returns before
3346
+ // this gate is consulted.
3347
+ "wan-3",
3348
+ "wan-3-prime"
3208
3349
  ]);
3209
3350
  var SEEDANCE_2_PROVIDERS = /* @__PURE__ */ new Set([
3210
3351
  "seedance-2",
@@ -3230,6 +3371,33 @@ var MINIMAX_H3_DEFAULT_RESOLUTION = "2K";
3230
3371
  function normalizeMinimaxH3Resolution(resolution) {
3231
3372
  return resolution?.trim().toLowerCase() === "768p" ? "768P" : MINIMAX_H3_DEFAULT_RESOLUTION;
3232
3373
  }
3374
+ var WAN_3_PROVIDERS = /* @__PURE__ */ new Set([
3375
+ "wan-3",
3376
+ "wan-3-prime"
3377
+ ]);
3378
+ function isWan3Provider(provider) {
3379
+ return !!provider && WAN_3_PROVIDERS.has(provider);
3380
+ }
3381
+ var WAN_3_DEFAULT_RESOLUTION = "720P";
3382
+ function normalizeWan3Resolution(resolution) {
3383
+ switch (resolution?.trim().toLowerCase()) {
3384
+ case "480p":
3385
+ return "480P";
3386
+ case "1080p":
3387
+ return "1080P";
3388
+ case "720p":
3389
+ return "720P";
3390
+ default:
3391
+ return WAN_3_DEFAULT_RESOLUTION;
3392
+ }
3393
+ }
3394
+ var GEMINI_OMNI_PROVIDERS = /* @__PURE__ */ new Set([
3395
+ "gemini-omni-video",
3396
+ "gemini-omni-flash"
3397
+ ]);
3398
+ function isGeminiOmniProvider(provider) {
3399
+ return !!provider && GEMINI_OMNI_PROVIDERS.has(provider);
3400
+ }
3233
3401
  var VIDEO_PROVIDERS_WITHOUT_DISPATCH = /* @__PURE__ */ new Set([
3234
3402
  "kling-3-omni"
3235
3403
  ]);
@@ -3313,7 +3481,7 @@ function maxSegmentsFor(provider, capSec) {
3313
3481
  return max > 0 ? Math.ceil(capSec / max) : 0;
3314
3482
  }
3315
3483
  function defaultVideoAspectRatio(provider) {
3316
- return isSeedance2Provider(provider) || isMinimaxH3Provider(provider) ? "adaptive" : "16:9";
3484
+ return isSeedance2Provider(provider) || isMinimaxH3Provider(provider) || isWan3Provider(provider) ? "adaptive" : "16:9";
3317
3485
  }
3318
3486
  var VEO_PROVIDERS = /* @__PURE__ */ new Set([
3319
3487
  "veo3",
@@ -3357,7 +3525,11 @@ var SEEDANCE_2_R2V_MAX_AUDIO_SEC_BY_PROVIDER = {
3357
3525
  "seedance-2-5": 30,
3358
3526
  // MiniMax Hailuo 3 — documented hard limit: each reference audio segment
3359
3527
  // 2-15s, ≤15s total (docs.kie.ai/market/minimax-h3/reference-to-video).
3360
- "minimax-h3": 15
3528
+ "minimax-h3": 15,
3529
+ // Wan 3.0 family — documented hard limit: each reference audio clip 1-15s,
3530
+ // ≤15s combined (docs.kie.ai/market/wan/3-0-video).
3531
+ "wan-3": 15,
3532
+ "wan-3-prime": 15
3361
3533
  };
3362
3534
  function seedance2AudioLimitSec(provider) {
3363
3535
  if (!provider) return null;
@@ -3383,8 +3555,17 @@ var VIDEO_REF_LIMITS_BY_PROVIDER = {
3383
3555
  // bills input images beyond the first 5 (11 KIE cr each) — see the
3384
3556
  // minimax-h3 credit helper in backend ee/billing.
3385
3557
  "minimax-h3": { ...SEEDANCE_2_REF_LIMITS },
3558
+ // Wan 3.0 family — all-purpose reference mode: up to 10 images / 5 videos
3559
+ // (each 1-15s, ≤15s combined) / 5 audio clips (each 1-15s, ≤15s combined).
3560
+ // The reference arrays are mutually EXCLUSIVE with first/last frame at the
3561
+ // provider (docs.kie.ai/market/wan/3-0-video).
3562
+ "wan-3": { images: 10, videos: 5, audio: 5 },
3563
+ "wan-3-prime": { images: 10, videos: 5, audio: 5 },
3386
3564
  // Multi-image reference providers.
3387
3565
  "gemini-omni-video": { images: 7, videos: 1 },
3566
+ // Gemini Omni Flash 1.1 — identical quota to the pro sibling
3567
+ // (images + 2×videos + character_ids ≤ 7).
3568
+ "gemini-omni-flash": { images: 7, videos: 1 },
3388
3569
  "kling-3-omni": { images: 7 },
3389
3570
  // catalog/docs: "end frame + up to 7 reference images"
3390
3571
  "grok-i2v": { images: 7 },
@@ -3415,13 +3596,26 @@ var RESOLUTION_DURATION_PRICING = {
3415
3596
  // pinned to 720p via extraParams in backend kie/models.ts so render matches.
3416
3597
  "happyhorse": ["720p", "1080p"],
3417
3598
  "happyhorse-i2v": ["720p", "1080p"],
3418
- "happyhorse-ref2v": ["720p", "1080p"]
3599
+ "happyhorse-ref2v": ["720p", "1080p"],
3600
+ // Wan 3.0 / Prime — per-second billing at three published resolution rates.
3601
+ // Ascending, matching the catalog; the BILLED default is declared explicitly
3602
+ // in PRICING_DEFAULT_RESOLUTION ("720p") rather than carried by index 0, and
3603
+ // the provider layer pins the same 720P so render == billed.
3604
+ "wan-3": ["480p", "720p", "1080p"],
3605
+ "wan-3-prime": ["480p", "720p", "1080p"]
3419
3606
  };
3420
3607
  var NATIVE_ADAPTIVE_ASPECT = {
3421
3608
  "seedance-2": "adaptive",
3422
3609
  "seedance-2-fast": "adaptive",
3423
3610
  "seedance-2-mini": "adaptive",
3424
- "seedance-2-5": "adaptive"
3611
+ "seedance-2-5": "adaptive",
3612
+ // Wan 3.0 family: `adaptive` is the enum DEFAULT and KIE documents it as
3613
+ // "automatically selects the ratio based on the input media and intent"
3614
+ // (docs.kie.ai/market/wan/3-0-video) — i.e. match-the-input, not merely
3615
+ // "provider default" (the grok `auto` trap). DOC-verified only; re-confirm
3616
+ // with a live job before relying on it for off-catalog ratios.
3617
+ "wan-3": "adaptive",
3618
+ "wan-3-prime": "adaptive"
3425
3619
  };
3426
3620
  var FRAME_MODE_ADAPTIVE_ONLY_ASPECT = /* @__PURE__ */ new Set([
3427
3621
  "seedance-2-5"
@@ -3472,7 +3666,20 @@ var VIDEO_AUDIO_CAPABILITY = {
3472
3666
  // MiniMax Hailuo 3 — multimodal; lip-syncs to reference audio (r2v). The
3473
3667
  // KIE API exposes NO audio on/off parameter (audio is always produced), so
3474
3668
  // there is no toggle field — alwaysOn, like VEO.
3475
- "minimax-h3": { mode: "audio_driven", alwaysOn: true }
3669
+ "minimax-h3": { mode: "audio_driven", alwaysOn: true },
3670
+ // Wan 3.0 family — a single boolean `audio` lever (KIE default true) produces
3671
+ // an ambient/SFX track with the clip. Classified "ambient", NOT
3672
+ // "native_speech" or "audio_driven": the schema documents no dialogue
3673
+ // guarantee, and reference audio is a generic conditioning array, not a
3674
+ // verified lip-sync transport. Upgrade only on a live probe (the kling-3.0
3675
+ // standard) — `audio_driven` would reroute the Story→Video dialogue pipeline
3676
+ // and skip the lip-sync pass. `defaultOn` mirrors the KIE default so an
3677
+ // intent-less request is described honestly; audio is priced into the uniform
3678
+ // per-second rate, so NOT cost-affecting (no `:audio` composite).
3679
+ // gemini-omni-flash is deliberately ABSENT — gemini-omni-video is absent too
3680
+ // (mode "none"), and the siblings must not disagree.
3681
+ "wan-3": { mode: "ambient", field: "audio", defaultOn: true },
3682
+ "wan-3-prime": { mode: "ambient", field: "audio", defaultOn: true }
3476
3683
  };
3477
3684
  var VIDEO_AUDIO_NONE = { mode: "none" };
3478
3685
  function getVideoAudioCapability(model) {
@@ -3491,6 +3698,7 @@ function applyVideoAudioToggle(input, provider, opts) {
3491
3698
  const enabled = cap.affectsCost ? opts?.sound : opts?.sound ?? opts?.generateAudio;
3492
3699
  if (enabled === void 0) return;
3493
3700
  if (cap.field === "generateAudio") input.generate_audio = enabled;
3701
+ else if (cap.field === "audio") input.audio = enabled;
3494
3702
  else input.sound = enabled;
3495
3703
  }
3496
3704
  var MODE_ADDON_PROVIDERS = /* @__PURE__ */ new Set([]);
@@ -3520,14 +3728,27 @@ var VIDEO_VARIABLE_PRICING = {
3520
3728
  // images are billed via the dedicated compute hook, not the identifier.
3521
3729
  "minimax-h3": "duration+resolution",
3522
3730
  // Grok Imagine Video 1.5 — per-second billing split 480p/720p (no video-ref dimension).
3523
- "grok-imagine-video-1.5": "duration+resolution"
3731
+ "grok-imagine-video-1.5": "duration+resolution",
3732
+ // Wan 3.0 family — per-second billing at three resolution rates (no video-ref
3733
+ // dimension: reference runs bill output seconds only). No gemini-omni-flash
3734
+ // entry, mirroring gemini-omni-video which has none either.
3735
+ "wan-3": "duration+resolution",
3736
+ "wan-3-prime": "duration+resolution"
3524
3737
  };
3525
3738
  var PRICING_DEFAULT_DURATION_SEC = {
3526
3739
  "minimax-h3": 6
3527
3740
  };
3528
3741
  var PRICING_DEFAULT_RESOLUTION = {
3529
3742
  // KIE renders 720p when `resolution` is omitted (kie/models.ts extraParams).
3530
- "seedance-2-5": "720p"
3743
+ "seedance-2-5": "720p",
3744
+ // Wan 3.0 family — KIE's OWN default is 1080P, but the provider layer pins
3745
+ // 720P (normalizeWan3Resolution / WAN_3_DEFAULT_RESOLUTION) so the rendered
3746
+ // tier equals the tier the bare identifier bills. This declaration is what
3747
+ // makes the billed default explicit instead of an array ordering: the
3748
+ // RESOLUTION_DURATION_PRICING branch consults it before falling back to the
3749
+ // first tier, so the catalog can stay ascending without repricing anything.
3750
+ "wan-3": "720p",
3751
+ "wan-3-prime": "720p"
3531
3752
  };
3532
3753
  var HAPPYHORSE_DURATION_TIERS = Array.from(
3533
3754
  { length: 13 },
@@ -3537,6 +3758,10 @@ var SEEDANCE_2_5_DURATION_TIERS = Array.from(
3537
3758
  { length: 27 },
3538
3759
  (_, i) => ({ maxSeconds: i + 4, suffix: `${i + 4}s` })
3539
3760
  );
3761
+ var WAN_3_DURATION_TIERS = Array.from(
3762
+ { length: 29 },
3763
+ (_, i) => ({ maxSeconds: i + 2, suffix: `${i + 2}s` })
3764
+ );
3540
3765
  var VIDEO_DURATION_TIERS = {
3541
3766
  "kling-3.0": [
3542
3767
  { maxSeconds: 5, suffix: "5s" },
@@ -3612,6 +3837,8 @@ var VIDEO_DURATION_TIERS = {
3612
3837
  { maxSeconds: 15, suffix: "15s" }
3613
3838
  ],
3614
3839
  "seedance-2-5": SEEDANCE_2_5_DURATION_TIERS,
3840
+ "wan-3": WAN_3_DURATION_TIERS,
3841
+ "wan-3-prime": WAN_3_DURATION_TIERS,
3615
3842
  // MiniMax Hailuo 3 — true per-second billing (KIE 36.5 cr/s @2K, 22.5 cr/s
3616
3843
  // @768P). One tier per allowed second (4-15s) so the composite identifier
3617
3844
  // maps 1:1 to the seeded price — no rounding/overcharge for any on-menu
@@ -4219,17 +4446,33 @@ function buildCreditModelIdentifier(provider, quality, resolution, renderingSpee
4219
4446
  }
4220
4447
  return provider;
4221
4448
  }
4449
+ function resolveNormalizedImageGen(opts) {
4450
+ const str = (v) => typeof v === "string" && v.length > 0 ? v : void 0;
4451
+ const provider = str(opts.provider) ?? "nano-banana";
4452
+ const modelId = opts.swapToI2i && opts.refCount > 0 ? T2I_TO_I2I_VARIANT[provider] ?? provider : provider;
4453
+ const n = normalizeModelInput(modelId, {
4454
+ aspectRatio: str(opts.aspectRatio),
4455
+ resolution: str(opts.resolution),
4456
+ quality: str(opts.quality)
4457
+ });
4458
+ return {
4459
+ identifier: buildCreditModelIdentifier(
4460
+ modelId,
4461
+ n.quality,
4462
+ n.resolution,
4463
+ str(opts.renderingSpeed),
4464
+ void 0,
4465
+ opts.refCount
4466
+ ),
4467
+ modelId,
4468
+ aspectRatio: n.aspectRatio,
4469
+ resolution: n.resolution,
4470
+ quality: n.quality,
4471
+ adjustments: n.adjustments
4472
+ };
4473
+ }
4222
4474
  function resolveImageGenCreditIdentifier(opts) {
4223
- const provider = opts.provider || "nano-banana";
4224
- const effectiveProvider = opts.swapToI2i && opts.refCount > 0 ? T2I_TO_I2I_VARIANT[provider] ?? provider : provider;
4225
- return buildCreditModelIdentifier(
4226
- effectiveProvider,
4227
- opts.quality,
4228
- opts.resolution,
4229
- opts.renderingSpeed,
4230
- void 0,
4231
- opts.refCount
4232
- );
4475
+ return resolveNormalizedImageGen(opts).identifier;
4233
4476
  }
4234
4477
  var T2V_CREDIT_OVERRIDES = {
4235
4478
  "grok": "grok-i2v",
@@ -4261,13 +4504,13 @@ function buildVideoCreditModelIdentifier(provider, duration, sound, nodeType, mo
4261
4504
  if (resolution === "1080p" && VEO_RESOLUTION_TIERED_PROVIDERS.has(effectiveProvider)) return `${effectiveProvider}:1080p`;
4262
4505
  return effectiveProvider;
4263
4506
  }
4264
- if (effectiveProvider === "gemini-omni-video") {
4507
+ if (isGeminiOmniProvider(effectiveProvider)) {
4265
4508
  if (hasVideoRef) {
4266
- return resolution === "4k" ? "gemini-omni-video:4k:vref" : "gemini-omni-video:vref";
4509
+ return resolution === "4k" ? `${effectiveProvider}:4k:vref` : `${effectiveProvider}:vref`;
4267
4510
  }
4268
4511
  const raw = parseInt(String(duration ?? 8), 10);
4269
4512
  const d = Number.isNaN(raw) ? 8 : GEMINI_OMNI_DURATIONS.reduce((b, a) => Math.abs(a - raw) < Math.abs(b - raw) ? a : b);
4270
- return resolution === "4k" ? `gemini-omni-video:4k:${d}` : `gemini-omni-video:${d}`;
4513
+ return resolution === "4k" ? `${effectiveProvider}:4k:${d}` : `${effectiveProvider}:${d}`;
4271
4514
  }
4272
4515
  if (effectiveProvider === "ltx-2.3-pro" || effectiveProvider === "ltx-2.3-fast") {
4273
4516
  const bands = LTX_DURATION_TIERS[effectiveProvider];
@@ -4305,7 +4548,10 @@ function buildVideoCreditModelIdentifier(provider, duration, sound, nodeType, mo
4305
4548
  }
4306
4549
  const resTiers = RESOLUTION_DURATION_PRICING[effectiveProvider];
4307
4550
  if (resTiers) {
4308
- const res = resolution && resTiers.includes(resolution) ? resolution : resTiers[0];
4551
+ const declaredDefault = PRICING_DEFAULT_RESOLUTION[effectiveProvider];
4552
+ const fallback = declaredDefault && resTiers.includes(declaredDefault) ? declaredDefault : resTiers[0];
4553
+ const requested = isWan3Provider(effectiveProvider) ? normalizeWan3Resolution(resolution).toLowerCase() : resolution;
4554
+ const res = requested && resTiers.includes(requested) ? requested : fallback;
4309
4555
  identifier += `:${res}`;
4310
4556
  }
4311
4557
  if (isMinimaxH3Provider(effectiveProvider) && normalizeMinimaxH3Resolution(resolution) === "768P") {
@@ -4327,6 +4573,28 @@ function buildMotionCreditModelIdentifier(provider, resolution, videoDuration) {
4327
4573
  const resSuffix = resolution === "1080p" ? ":1080p" : "";
4328
4574
  return `${base}${resSuffix}:${tier.suffix}`;
4329
4575
  }
4576
+ var SUNO_VERSION_PRICED_OPERATIONS = [
4577
+ "suno-generate",
4578
+ "suno-cover",
4579
+ "suno-extend"
4580
+ ];
4581
+ var SUNO_SELECT_OPERATIONS = [
4582
+ "suno-generate",
4583
+ "suno-cover",
4584
+ "suno-extend",
4585
+ "suno-mashup",
4586
+ "suno-add-instrumental",
4587
+ "suno-add-vocals",
4588
+ "suno-upload-extend"
4589
+ ];
4590
+ function sunoCreditType(model, operation) {
4591
+ if (!SUNO_VERSION_PRICED_OPERATIONS.includes(operation)) {
4592
+ return operation;
4593
+ }
4594
+ if (model === "V5_5") return "suno-v5_5";
4595
+ if (model === "V5") return "suno-v5";
4596
+ return operation;
4597
+ }
4330
4598
 
4331
4599
  // src/credit-estimators/video-utils.ts
4332
4600
  var VIDEO_UTIL_PRICING = {
@@ -7925,6 +8193,10 @@ var QUALITY_MAP = {
7925
8193
  // Seedance 2.5 spans 480p/720p/1080p on KIE (1080p accepted since the
7926
8194
  // 2026-08-17 re-probe; 4k still rejected), so each quality rung gets its own tier.
7927
8195
  "seedance-2-5": { field: "resolution", values: { low: "480p", mid: "720p", high: "1080p" } },
8196
+ // Wan 3.0 family — 480p / 720p / 1080p (lowercase catalog spellings; the
8197
+ // uppercase KIE wire form is produced only by normalizeWan3Resolution).
8198
+ "wan-3": { field: "resolution", values: { low: "480p", mid: "720p", high: "1080p" } },
8199
+ "wan-3-prime": { field: "resolution", values: { low: "480p", mid: "720p", high: "1080p" } },
7928
8200
  "wan-2.7-i2v": { field: "resolution", values: { low: "720p", mid: "1080p", high: "1080p" } },
7929
8201
  "wan-2.7-t2v": { field: "resolution", values: { low: "720p", mid: "1080p", high: "1080p" } },
7930
8202
  "happyhorse": { field: "resolution", values: { low: "720p", mid: "1080p", high: "1080p" } },
@@ -7938,6 +8210,7 @@ var QUALITY_MAP = {
7938
8210
  "ltx-2.3-pro": { field: "resolution", values: { low: "1080p", mid: "2k", high: "4k" } },
7939
8211
  "ltx-2.3-fast": { field: "resolution", values: { low: "1080p", mid: "2k", high: "4k" } },
7940
8212
  "gemini-omni-video": { field: "resolution", values: { low: "720p", mid: "1080p", high: "4k" } },
8213
+ "gemini-omni-flash": { field: "resolution", values: { low: "720p", mid: "1080p", high: "4k" } },
7941
8214
  // Grok Imagine Video 1.5 — only 480p/720p (no 1080p tier); high clamps to 720p.
7942
8215
  "grok-imagine-video-1.5": { field: "resolution", values: { low: "480p", mid: "720p", high: "720p" } },
7943
8216
  // Replicate Flux 2 family — MP-based resolution (matching IMAGE_RESOLUTION_OPTIONS["flux-2-*"]).
@@ -12310,7 +12583,9 @@ var DEFAULT_VOICE_CHANGER_MODEL = "eleven_multilingual_sts_v2";
12310
12583
  // src/normalize-node-params.ts
12311
12584
  var MODEL_PARAM_NODE_TYPES = /* @__PURE__ */ new Set([
12312
12585
  "generate-image",
12313
- "image-to-image"
12586
+ "image-to-image",
12587
+ "modify-image",
12588
+ "edit-image"
12314
12589
  ]);
12315
12590
  function normalizeNodeModelParams(nodes) {
12316
12591
  const adjustments = [];
@@ -13556,6 +13831,23 @@ function inferMusicVideo(analysis) {
13556
13831
  })
13557
13832
  );
13558
13833
  }
13834
+ var DERIVED_ANALYSIS_TOP_KEYS = /* @__PURE__ */ new Set(["warnings", "variationFolds"]);
13835
+ var DERIVED_ANALYSIS_SCENE_KEYS = /* @__PURE__ */ new Set(["visualResolved", "slotRefs", "oversized"]);
13836
+ var asRecord = (v) => typeof v === "object" && v !== null && !Array.isArray(v) ? v : null;
13837
+ function stripDerivedAnalysisFields(json) {
13838
+ const doc = asRecord(json);
13839
+ if (!doc) return json;
13840
+ const out = {};
13841
+ for (const [key, value] of Object.entries(doc)) {
13842
+ if (DERIVED_ANALYSIS_TOP_KEYS.has(key)) continue;
13843
+ out[key] = key === "scenes" && Array.isArray(value) ? value.map((scene) => {
13844
+ const s = asRecord(scene);
13845
+ if (!s) return scene;
13846
+ return Object.fromEntries(Object.entries(s).filter(([k]) => !DERIVED_ANALYSIS_SCENE_KEYS.has(k)));
13847
+ }) : value;
13848
+ }
13849
+ return out;
13850
+ }
13559
13851
 
13560
13852
  // src/video-analysis-pricing.ts
13561
13853
  var VIDEO_ANALYSIS_DURATION_BUCKETS = [60, 180, 360, 600];
@@ -13642,6 +13934,21 @@ function bucketSecondsFromAuditCreditId(id) {
13642
13934
  return m ? Number(m[1]) : null;
13643
13935
  }
13644
13936
 
13937
+ // src/video-ui-defaults.ts
13938
+ function uiAspectRatioFill(provider) {
13939
+ return isSeedance2Provider(provider) || isMinimaxH3Provider(provider) || isWan3Provider(provider) ? "adaptive" : void 0;
13940
+ }
13941
+ function uiResolutionFill(provider) {
13942
+ if (isWan3Provider(provider)) return PRICING_DEFAULT_RESOLUTION[provider];
13943
+ if (isSeedance2Provider(provider)) return MODEL_CATALOG[provider]?.resolutions?.[0];
13944
+ return void 0;
13945
+ }
13946
+ function uiDurationFill(provider) {
13947
+ if (isWan3Provider(provider)) return 5;
13948
+ if (isGeminiOmniProvider(provider)) return 8;
13949
+ return void 0;
13950
+ }
13951
+
13645
13952
  // src/smart-cut-windows.ts
13646
13953
  var SMART_CUT_WINDOW_MAX = 24;
13647
13954
  var SMART_CUT_WINDOW_MIN = 1;
@@ -13665,6 +13972,7 @@ var WORKFLOW_VISIBILITIES = ["private", "workspace"];
13665
13972
  var ACCESS_LEVELS = ["own", "edit", "view", "none"];
13666
13973
  var GRANTED_ACCESS = ["view", "edit"];
13667
13974
  var SUBMISSION_STATUSES = ["submitted", "in_review", "returned", "approved"];
13975
+ var USAGE_GROUP_BYS = ["workspace", "member", "model", "day", "none"];
13668
13976
  var ORG_ERROR_CODES = [
13669
13977
  "not_a_member",
13670
13978
  "insufficient_role",
@@ -13684,6 +13992,8 @@ var ORG_ERROR_CODES = [
13684
13992
  "domain_not_allowed",
13685
13993
  "already_started",
13686
13994
  "collab_unavailable",
13995
+ // A CSV usage export whose write-ahead audit row could not be written (503).
13996
+ "audit_unavailable",
13687
13997
  // Organization, workspace and membership endpoints.
13688
13998
  "terms_required",
13689
13999
  "not_org_member",
@@ -13966,6 +14276,7 @@ exports.FURNITURE_SUBCATEGORY_LABELS = FURNITURE_SUBCATEGORY_LABELS;
13966
14276
  exports.FURNITURE_SUBCATEGORY_ORDER = FURNITURE_SUBCATEGORY_ORDER;
13967
14277
  exports.FixContinuityInputSchema = FixContinuityInputSchema;
13968
14278
  exports.FixContinuityResultSchema = FixContinuityResultSchema;
14279
+ exports.GEMINI_OMNI_PROVIDERS = GEMINI_OMNI_PROVIDERS;
13969
14280
  exports.GENERATE_TEXT_DELIMITER = GENERATE_TEXT_DELIMITER;
13970
14281
  exports.GLOBAL_MAX_DURATION_SECONDS = GLOBAL_MAX_DURATION_SECONDS;
13971
14282
  exports.GRANTED_ACCESS = GRANTED_ACCESS;
@@ -13985,6 +14296,7 @@ exports.HINT_EXEMPT_PARAMETER_TYPES = HINT_EXEMPT_PARAMETER_TYPES;
13985
14296
  exports.I2I_MASK_SUPPORT = I2I_MASK_SUPPORT;
13986
14297
  exports.I2I_STRENGTH_SUPPORT = I2I_STRENGTH_SUPPORT;
13987
14298
  exports.IDEOGRAM_PROVIDERS = IDEOGRAM_PROVIDERS;
14299
+ exports.IMAGE_ASPECT_RATIO_VALUES = IMAGE_ASPECT_RATIO_VALUES;
13988
14300
  exports.IMAGE_CRITIC_LEAF_MODES = IMAGE_CRITIC_LEAF_MODES;
13989
14301
  exports.IMAGE_CRITIC_MAX_RETRIES = IMAGE_CRITIC_MAX_RETRIES;
13990
14302
  exports.IMAGE_CRITIC_METADATA_KEYS = IMAGE_CRITIC_METADATA_KEYS;
@@ -14185,10 +14497,13 @@ exports.STRUCTURED_VISION_MODELS = STRUCTURED_VISION_MODELS;
14185
14497
  exports.SUBMISSION_STATUSES = SUBMISSION_STATUSES;
14186
14498
  exports.SUNO_ADD_TRACK_MODELS = SUNO_ADD_TRACK_MODELS;
14187
14499
  exports.SUNO_FIELD_HANDLE_FIELDS = SUNO_FIELD_HANDLE_FIELDS;
14500
+ exports.SUNO_HARD_CEILING = SUNO_HARD_CEILING;
14188
14501
  exports.SUNO_MODELS = SUNO_MODELS;
14502
+ exports.SUNO_SELECT_OPERATIONS = SUNO_SELECT_OPERATIONS;
14189
14503
  exports.SUNO_TEXT_MAX = SUNO_TEXT_MAX;
14190
14504
  exports.SUNO_TITLE_MAX = SUNO_TITLE_MAX;
14191
14505
  exports.SUNO_TRACK_SOURCE_TYPES = SUNO_TRACK_SOURCE_TYPES;
14506
+ exports.SUNO_VERSION_PRICED_OPERATIONS = SUNO_VERSION_PRICED_OPERATIONS;
14192
14507
  exports.SUPPORTED_FONT_NAMES = SUPPORTED_FONT_NAMES;
14193
14508
  exports.SURROUND_DIRECTIONS = SURROUND_DIRECTIONS;
14194
14509
  exports.SWITCHX_BLOCK_FRAMES = SWITCHX_BLOCK_FRAMES;
@@ -14219,6 +14534,7 @@ exports.TTS_TEXT_MAX = TTS_TEXT_MAX;
14219
14534
  exports.TWO_K_RESOLUTION_PROVIDERS = TWO_K_RESOLUTION_PROVIDERS;
14220
14535
  exports.TransitionTypeSchema = TransitionTypeSchema;
14221
14536
  exports.UPSCALE_IMAGE_PROVIDERS = UPSCALE_IMAGE_PROVIDERS;
14537
+ exports.USAGE_GROUP_BYS = USAGE_GROUP_BYS;
14222
14538
  exports.USAGE_MODES = USAGE_MODES;
14223
14539
  exports.VARIABLES_HANDLE_ID = VARIABLES_HANDLE_ID;
14224
14540
  exports.VARIABLE_PRICING_MODELS = VARIABLE_PRICING_MODELS;
@@ -14281,6 +14597,8 @@ exports.ValidateMatchCutInputSchema = ValidateMatchCutInputSchema;
14281
14597
  exports.ValidateMatchCutResultSchema = ValidateMatchCutResultSchema;
14282
14598
  exports.VideoCriticVerdictSchema = VideoCriticVerdictSchema;
14283
14599
  exports.VoiceMatchSchema = VoiceMatchSchema;
14600
+ exports.WAN_3_DEFAULT_RESOLUTION = WAN_3_DEFAULT_RESOLUTION;
14601
+ exports.WAN_3_PROVIDERS = WAN_3_PROVIDERS;
14284
14602
  exports.WARDROBE_VARIANTS = WARDROBE_VARIANTS;
14285
14603
  exports.WEAPONS = WEAPONS;
14286
14604
  exports.WEAPON_SUBCATEGORY_LABELS = WEAPON_SUBCATEGORY_LABELS;
@@ -14463,6 +14781,7 @@ exports.isCollectInEdge = isCollectInEdge;
14463
14781
  exports.isDefaultSelectorConfig = isDefaultSelectorConfig;
14464
14782
  exports.isExpandedClone = isExpandedClone;
14465
14783
  exports.isFlux2Model = isFlux2Model;
14784
+ exports.isGeminiOmniProvider = isGeminiOmniProvider;
14466
14785
  exports.isGvpSupportedProvider = isGvpSupportedProvider;
14467
14786
  exports.isHandleInputWired = isHandleInputWired;
14468
14787
  exports.isKineticCaptionStyle = isKineticCaptionStyle;
@@ -14479,6 +14798,7 @@ exports.isUsageMode = isUsageMode;
14479
14798
  exports.isVeoProvider = isVeoProvider;
14480
14799
  exports.isVideoAnalysisMixedTier = isVideoAnalysisMixedTier;
14481
14800
  exports.isVideoAnalysisTier = isVideoAnalysisTier;
14801
+ exports.isWan3Provider = isWan3Provider;
14482
14802
  exports.jsonResultToList = jsonResultToList;
14483
14803
  exports.knownEntitySlugsFromRefs = knownEntitySlugsFromRefs;
14484
14804
  exports.knownImageSlugsFromRefs = knownImageSlugsFromRefs;
@@ -14511,6 +14831,7 @@ exports.normalizeModelInput = normalizeModelInput;
14511
14831
  exports.normalizeNodeModelParams = normalizeNodeModelParams;
14512
14832
  exports.normalizePinterestUrl = normalizePinterestUrl;
14513
14833
  exports.normalizeRoleSlug = normalizeRoleSlug;
14834
+ exports.normalizeWan3Resolution = normalizeWan3Resolution;
14514
14835
  exports.orderedLlmModels = orderedLlmModels;
14515
14836
  exports.parseAttributedDialogue = parseAttributedDialogue;
14516
14837
  exports.parseCharacterMentionToken = parseCharacterMentionToken;
@@ -14566,6 +14887,7 @@ exports.resolveLocationFields = resolveLocationFields;
14566
14887
  exports.resolveLocationPresetCatalog = resolveLocationPresetCatalog;
14567
14888
  exports.resolveLottieOverlaySrc = resolveLottieOverlaySrc;
14568
14889
  exports.resolveNodeRefs = resolveNodeRefs;
14890
+ exports.resolveNormalizedImageGen = resolveNormalizedImageGen;
14569
14891
  exports.resolveObjectAspectRatio = resolveObjectAspectRatio;
14570
14892
  exports.resolvePipelineModel = resolvePipelineModel;
14571
14893
  exports.resolveRelativeWindowToken = resolveRelativeWindowToken;
@@ -14608,8 +14930,10 @@ exports.splitByLoopDelimiter = splitByLoopDelimiter;
14608
14930
  exports.splitGeneratedItems = splitGeneratedItems;
14609
14931
  exports.spreadJsonArrayIfSingleton = spreadJsonArrayIfSingleton;
14610
14932
  exports.stringifyPathResults = stringifyPathResults;
14933
+ exports.stripDerivedAnalysisFields = stripDerivedAnalysisFields;
14611
14934
  exports.stripExportContent = stripExportContent;
14612
14935
  exports.stripTransientRuntimeData = stripTransientRuntimeData;
14936
+ exports.sunoCreditType = sunoCreditType;
14613
14937
  exports.supportedDefaultDimensions = supportedDefaultDimensions;
14614
14938
  exports.supportsAdvancedMode = supportsAdvancedMode;
14615
14939
  exports.supportsEndAnchor = supportsEndAnchor;
@@ -14618,6 +14942,9 @@ exports.toConnectedReference = toConnectedReference;
14618
14942
  exports.toConnectedReferences = toConnectedReferences;
14619
14943
  exports.togglePick = togglePick;
14620
14944
  exports.tryParseJson = tryParseJson;
14945
+ exports.uiAspectRatioFill = uiAspectRatioFill;
14946
+ exports.uiDurationFill = uiDurationFill;
14947
+ exports.uiResolutionFill = uiResolutionFill;
14621
14948
  exports.unwrapUnresolvedTokens = unwrapUnresolvedTokens;
14622
14949
  exports.usageModeDirective = usageModeDirective;
14623
14950
  exports.usageModeIncludesName = usageModeIncludesName;