@nodaro/shared 2.1.0 → 2.2.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.
package/dist/index.cjs CHANGED
@@ -16,7 +16,17 @@ var DEFAULT_LABEL_BY_SOURCE = {
16
16
  // subject ("match anatomy, markings…"), not a prop. See CREATURE_LABELS in
17
17
  // prompt-builder.ts.
18
18
  "wired-creature": "creature",
19
- "wired-location": "background"
19
+ // A PLACE, NOT A BACKDROP (2026-08-05). This defaulted to "background", which
20
+ // `roleToPhrase` renders as "the background from reference image B" — and the
21
+ // image models read that as "paste this behind the subject". Measured on
22
+ // gpt-image-2 (character + location, 4 draws per arm): with "background" every
23
+ // draw was a cut-out composite — an indoor-lit subject over a stock beach, no
24
+ // cast shadow, ignoring the asked-for action. Changing ONLY this word put the
25
+ // subject inside the scene with ground contact and a matching sun. "background"
26
+ // remains a curated pick in REFERENCE_ROLE_PRESETS for the genuine backdrop
27
+ // case; it is no longer what every location silently gets. Nodes that stored a
28
+ // role explicitly are untouched — `resolveDefaultRole` prefers the explicit value.
29
+ "wired-location": "location"
20
30
  };
21
31
 
22
32
  // src/freecut-protocol.ts
@@ -263,10 +273,10 @@ var IMAGE_MODELS = {
263
273
  aspectRatios: FLUX_RATIOS,
264
274
  resolutions: ["0.5 MP", "1 MP", "2 MP", "4 MP"],
265
275
  pricing: [
266
- { identifier: "flux-2-klein", credits: 10 },
276
+ { identifier: "flux-2-klein", credits: 3 },
267
277
  // 1MP 0ref (default)
268
278
  { identifier: "flux-2-klein:1MP:0ref", credits: 3 },
269
- // min
279
+ // min — same point on the grid as the bare default
270
280
  { identifier: "flux-2-klein:4MP:8ref", credits: 108 }
271
281
  // max
272
282
  ]
@@ -297,7 +307,7 @@ var IMAGE_MODELS = {
297
307
  aspectRatios: FLUX_RATIOS,
298
308
  resolutions: ["0.5 MP", "1 MP", "2 MP", "4 MP"],
299
309
  pricing: [
300
- { identifier: "flux-2-pro", credits: 30 },
310
+ { identifier: "flux-2-pro", credits: 23 },
301
311
  // 2MP 0ref (default)
302
312
  { identifier: "flux-2-pro:0.5MP:0ref", credits: 12 },
303
313
  // min
@@ -771,6 +781,42 @@ var VIDEO_MODELS = {
771
781
  durations: [5],
772
782
  pricing: [{ identifier: "minimax", credits: 143, note: "5s, 1080p" }]
773
783
  },
784
+ // MiniMax Hailuo 3 (KIE "minimax-h3") — t2v / i2v (first and/or last frame) /
785
+ // reference-to-video (9 images / 3 videos ≤15s total / 3 audios ≤15s total;
786
+ // audio refs require an image or video ref alongside). Two-rate resolution
787
+ // lever (768P added 2026-08-03): 2K (KIE default) at 36.5 KIE cr/s, 768P at
788
+ // 22.5 KIE cr/s — billed on output + input-video seconds at the SELECTED
789
+ // resolution's rate; input images beyond the first 5 add 11 KIE cr each,
790
+ // reference audio free. Bare duration composites stay the 2K rate (identical
791
+ // to the pre-lever seeded rows); 768P appends ":768p". Mirrors the Seedance 2
792
+ // multimodal surface.
793
+ // docs.kie.ai/market/minimax-h3/{text,image,reference}-to-video.
794
+ "minimax-h3": {
795
+ id: "minimax-h3",
796
+ kind: "video",
797
+ modes: ["i2v", "t2v"],
798
+ family: "MiniMax",
799
+ label: "Hailuo 3 (H3)",
800
+ series: "Hailuo",
801
+ description: "MiniMax Hailuo 3 \u2014 premium multimodal tier: first/last frame + image/video/audio references, native audio, 2K (default) or 768P output, 4-15s per-second pricing.",
802
+ useCases: ["premium", "narrative"],
803
+ features: ["end-frame", "audio", "reference-image", "video-reference"],
804
+ aspectRatios: VIDEO_RATIOS_SEEDANCE_2,
805
+ durations: [4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],
806
+ // First entry = default (the UI dropdown + fail-safe snap use opts[0], and
807
+ // 2K is the KIE-side default). Uppercase values are the exact KIE wire enum.
808
+ resolutions: ["2K", "768P"],
809
+ valueLabels: { "2K": "2K (default)" },
810
+ pricing: [
811
+ { identifier: "minimax-h3", credits: 550, note: "default 6s @2K \u2014 see :Ns variants" },
812
+ { identifier: "minimax-h3:4s", credits: 370, note: "4s @2K (min)" },
813
+ { identifier: "minimax-h3:8s", credits: 730, note: "8s @2K" },
814
+ { identifier: "minimax-h3:15s", credits: 1370, note: "15s @2K (max)" },
815
+ { identifier: "minimax-h3:4s:768p", credits: 230, note: "4s @768P (min)" },
816
+ { identifier: "minimax-h3:8s:768p", credits: 450, note: "8s @768P" },
817
+ { identifier: "minimax-h3:15s:768p", credits: 850, note: "15s @768P (max)" }
818
+ ]
819
+ },
774
820
  "hailuo-2.3-pro": {
775
821
  id: "hailuo-2.3-pro",
776
822
  kind: "video",
@@ -1091,7 +1137,7 @@ var VIDEO_MODELS = {
1091
1137
  series: "Seedance",
1092
1138
  description: "Seedance 2 \u2014 premium tier with native audio. Per-second pricing by resolution.",
1093
1139
  useCases: ["premium", "narrative"],
1094
- features: ["end-frame", "audio", "reference-image"],
1140
+ features: ["end-frame", "audio", "reference-image", "video-reference"],
1095
1141
  aspectRatios: VIDEO_RATIOS_SEEDANCE_2,
1096
1142
  durations: [4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],
1097
1143
  resolutions: ["480p", "720p", "1080p", "4k"],
@@ -1116,7 +1162,7 @@ var VIDEO_MODELS = {
1116
1162
  series: "Seedance",
1117
1163
  description: "Cheaper / quicker Seedance 2 tier.",
1118
1164
  useCases: ["fast", "motion"],
1119
- features: ["end-frame", "audio", "reference-image"],
1165
+ features: ["end-frame", "audio", "reference-image", "video-reference"],
1120
1166
  aspectRatios: VIDEO_RATIOS_SEEDANCE_2,
1121
1167
  durations: [4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],
1122
1168
  resolutions: ["480p", "720p"],
@@ -1137,7 +1183,7 @@ var VIDEO_MODELS = {
1137
1183
  series: "Seedance",
1138
1184
  description: "Budget Seedance 2 tier \u2014 480p/720p only, per-second pricing by resolution.",
1139
1185
  useCases: ["fast", "motion"],
1140
- features: ["end-frame", "audio", "reference-image"],
1186
+ features: ["end-frame", "audio", "reference-image", "video-reference"],
1141
1187
  aspectRatios: VIDEO_RATIOS_SEEDANCE_2,
1142
1188
  durations: [4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],
1143
1189
  resolutions: ["480p", "720p"],
@@ -1149,6 +1195,34 @@ var VIDEO_MODELS = {
1149
1195
  { identifier: "seedance-2-mini:8s:720p-ref", credits: 250 }
1150
1196
  ]
1151
1197
  },
1198
+ // Seedance 2.5 — the next Seedance generation, not a tier of the 2.0 ladder.
1199
+ // Two levers differ from every 2.0 SKU and drive its own entries throughout:
1200
+ // durations run to 30s (2.0 caps at 15s) and there is NO 1080p/4K tier.
1201
+ // Reference caps are also wider (30 images / 10 videos / 10 audio) — see
1202
+ // SEEDANCE_2_5_REF_LIMITS in model-constants.
1203
+ "seedance-2-5": {
1204
+ id: "seedance-2-5",
1205
+ kind: "video",
1206
+ modes: ["i2v", "t2v"],
1207
+ family: "Bytedance",
1208
+ label: "Seedance 2.5",
1209
+ series: "Seedance",
1210
+ description: "Seedance 2.5 \u2014 up to 30s in one shot, native audio, wide multimodal references. 480p/720p.",
1211
+ useCases: ["premium", "narrative", "long-form"],
1212
+ features: ["end-frame", "audio", "reference-image", "video-reference"],
1213
+ aspectRatios: VIDEO_RATIOS_SEEDANCE_2,
1214
+ durations: [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],
1215
+ resolutions: ["480p", "720p"],
1216
+ pricing: [
1217
+ { identifier: "seedance-2-5", credits: 1260, note: "default 8s 720p \u2014 see :Ns:res variants for exact" },
1218
+ { identifier: "seedance-2-5:8s:480p", credits: 560, note: "8s 480p" },
1219
+ { identifier: "seedance-2-5:8s:720p", credits: 1260, note: "8s 720p" },
1220
+ { identifier: "seedance-2-5:8s:480p-ref", credits: 340, note: "8s 480p with reference video" },
1221
+ { identifier: "seedance-2-5:8s:720p-ref", credits: 760, note: "8s 720p with reference video" },
1222
+ { identifier: "seedance-2-5:30s:480p", credits: 2100, note: "30s 480p (max)" },
1223
+ { identifier: "seedance-2-5:30s:720p", credits: 4730, note: "30s 720p (max)" }
1224
+ ]
1225
+ },
1152
1226
  // ── Wan ──
1153
1227
  "wan-i2v": {
1154
1228
  id: "wan-i2v",
@@ -1670,11 +1744,11 @@ var VIDEO_MODELS = {
1670
1744
  description: "Legacy fast-tier analysis model (pre-2026-07). Kept so stored raw-model configs keep running and keep pricing under their own identifier; new fast-tier runs use the current fast model.",
1671
1745
  useCases: ["video-analysis", "shot-list", "fast"],
1672
1746
  pricing: [
1673
- { identifier: "video-analysis:gemini-3-flash", credits: 143, note: "10-min ceiling (no duration given)" },
1674
- { identifier: "video-analysis:gemini-3-flash:60s", credits: 24 },
1675
- { identifier: "video-analysis:gemini-3-flash:180s", credits: 33 },
1676
- { identifier: "video-analysis:gemini-3-flash:360s", credits: 86 },
1677
- { identifier: "video-analysis:gemini-3-flash:600s", credits: 143, note: "10-min ceiling" }
1747
+ { identifier: "video-analysis:gemini-3-flash", credits: 846, note: "10-min ceiling (no duration given)" },
1748
+ { identifier: "video-analysis:gemini-3-flash:60s", credits: 180 },
1749
+ { identifier: "video-analysis:gemini-3-flash:180s", credits: 185 },
1750
+ { identifier: "video-analysis:gemini-3-flash:360s", credits: 514 },
1751
+ { identifier: "video-analysis:gemini-3-flash:600s", credits: 846, note: "10-min ceiling" }
1678
1752
  ]
1679
1753
  },
1680
1754
  "gemini-3.6-flash-video-analysis": {
@@ -1687,11 +1761,11 @@ var VIDEO_MODELS = {
1687
1761
  description: "Analyze a video into a structured shot list (scenes, camera, audio) \u2014 fast, economy tier. Billed per duration bucket.",
1688
1762
  useCases: ["video-analysis", "shot-list", "fast"],
1689
1763
  pricing: [
1690
- { identifier: "video-analysis:gemini-3.6-flash", credits: 395, note: "10-min ceiling (no duration given)" },
1691
- { identifier: "video-analysis:gemini-3.6-flash:60s", credits: 65 },
1692
- { identifier: "video-analysis:gemini-3.6-flash:180s", credits: 92 },
1693
- { identifier: "video-analysis:gemini-3.6-flash:360s", credits: 237 },
1694
- { identifier: "video-analysis:gemini-3.6-flash:600s", credits: 395, note: "10-min ceiling" }
1764
+ { identifier: "video-analysis:gemini-3.6-flash", credits: 986, note: "10-min ceiling (no duration given)" },
1765
+ { identifier: "video-analysis:gemini-3.6-flash:60s", credits: 203 },
1766
+ { identifier: "video-analysis:gemini-3.6-flash:180s", credits: 218 },
1767
+ { identifier: "video-analysis:gemini-3.6-flash:360s", credits: 598 },
1768
+ { identifier: "video-analysis:gemini-3.6-flash:600s", credits: 986, note: "10-min ceiling" }
1695
1769
  ]
1696
1770
  },
1697
1771
  "gemini-3.1-pro-video-analysis": {
@@ -1704,11 +1778,11 @@ var VIDEO_MODELS = {
1704
1778
  description: "Analyze a video into a structured shot list (scenes, camera, audio) \u2014 higher-fidelity, default tier. Billed per duration bucket.",
1705
1779
  useCases: ["video-analysis", "shot-list", "cinematic"],
1706
1780
  pricing: [
1707
- { identifier: "video-analysis:gemini-3.1-pro", credits: 509, note: "10-min ceiling (no duration given)" },
1708
- { identifier: "video-analysis:gemini-3.1-pro:60s", credits: 87 },
1709
- { identifier: "video-analysis:gemini-3.1-pro:180s", credits: 116 },
1710
- { identifier: "video-analysis:gemini-3.1-pro:360s", credits: 305 },
1711
- { identifier: "video-analysis:gemini-3.1-pro:600s", credits: 509, note: "10-min ceiling" }
1781
+ { identifier: "video-analysis:gemini-3.1-pro", credits: 1050, note: "10-min ceiling (no duration given)" },
1782
+ { identifier: "video-analysis:gemini-3.1-pro:60s", credits: 215 },
1783
+ { identifier: "video-analysis:gemini-3.1-pro:180s", credits: 231 },
1784
+ { identifier: "video-analysis:gemini-3.1-pro:360s", credits: 636 },
1785
+ { identifier: "video-analysis:gemini-3.1-pro:600s", credits: 1050, note: "10-min ceiling" }
1712
1786
  ]
1713
1787
  },
1714
1788
  // Both mixed tiers are variants of the same advanced multi-engine analysis
@@ -1724,17 +1798,18 @@ var VIDEO_MODELS = {
1724
1798
  description: "Our most advanced analysis tier \u2014 multiple analysis engines combined into one result for maximum completeness and accuracy. Billed per duration bucket.",
1725
1799
  useCases: ["video-analysis", "shot-list", "premium", "most-complete"],
1726
1800
  pricing: [
1727
- { identifier: "video-analysis:mixed", credits: 651, note: "10-min ceiling (no duration given)" },
1728
- { identifier: "video-analysis:mixed:60s", credits: 110 },
1729
- { identifier: "video-analysis:mixed:180s", credits: 149 },
1730
- { identifier: "video-analysis:mixed:360s", credits: 390 },
1731
- { identifier: "video-analysis:mixed:600s", credits: 651, note: "10-min ceiling" }
1801
+ { identifier: "video-analysis:mixed", credits: 1169, note: "10-min ceiling (no duration given)" },
1802
+ { identifier: "video-analysis:mixed:60s", credits: 268 },
1803
+ { identifier: "video-analysis:mixed:180s", credits: 289 },
1804
+ { identifier: "video-analysis:mixed:360s", credits: 724 },
1805
+ { identifier: "video-analysis:mixed:600s", credits: 1169, note: "10-min ceiling" }
1732
1806
  ]
1733
1807
  },
1734
- // SMART — the accuracy tier, and the only one that does not rely on voting.
1735
- // Every other tier runs several cheap passes and has a grader pick between them;
1736
- // this one runs a single pass with reasoning and frame sampling turned all the
1737
- // way up. Priced well above them because it genuinely costs more to run.
1808
+ // SMART — the accuracy tier. Since the 2026-08-03 hybrid re-plan it is a
1809
+ // multi-roll plan like the others: a native skeleton pass blended with
1810
+ // several donor analysis rolls, with the merged result always refined
1811
+ // (it ignores `selectionMode` see video-analysis-pricing.ts). Priced
1812
+ // well above them because it genuinely costs more to run.
1738
1813
  "smart-video-analysis": {
1739
1814
  id: "smart-video-analysis",
1740
1815
  kind: "video",
@@ -1742,14 +1817,58 @@ var VIDEO_MODELS = {
1742
1817
  family: "Nodaro",
1743
1818
  label: "Video Analysis (Smart)",
1744
1819
  series: "Video Analysis",
1745
- description: "Highest-accuracy analysis \u2014 a single deep pass that reads the footage frame by frame, finds its own shot boundaries, and identifies the cast by appearance. Best choice when the shot list will drive regeneration. Billed per duration bucket.",
1820
+ description: "Highest-accuracy analysis \u2014 a hybrid pass that blends a native skeleton read with several donor analysis rolls, then always refines the merged result to find shot boundaries and identify the cast by appearance. Best choice when the shot list will drive regeneration. Billed per duration bucket.",
1746
1821
  useCases: ["video-analysis", "shot-list", "premium", "most-accurate"],
1747
1822
  pricing: [
1748
- { identifier: "video-analysis:smart", credits: 1868, note: "10-min ceiling (no duration given)" },
1749
- { identifier: "video-analysis:smart:60s", credits: 333 },
1750
- { identifier: "video-analysis:smart:180s", credits: 470 },
1751
- { identifier: "video-analysis:smart:360s", credits: 1135 },
1752
- { identifier: "video-analysis:smart:600s", credits: 1868, note: "10-min ceiling" }
1823
+ { identifier: "video-analysis:smart", credits: 2064, note: "10-min ceiling (no duration given)" },
1824
+ { identifier: "video-analysis:smart:60s", credits: 410 },
1825
+ { identifier: "video-analysis:smart:180s", credits: 500 },
1826
+ { identifier: "video-analysis:smart:360s", credits: 1259 },
1827
+ { identifier: "video-analysis:smart:600s", credits: 2064, note: "10-min ceiling" }
1828
+ ]
1829
+ },
1830
+ // ── AI Audit (`video-audit`) ── a SEPARATE node from video-analysis (own
1831
+ // node type, own route in the private plugin): it re-watches a clip
1832
+ // against its analysis (auto-running a fast analysis first when none is
1833
+ // wired), applies video-verified corrections under guards, and returns a
1834
+ // disclosed report of what was checked, fixed, and left open. These two
1835
+ // rows exist for pricing/MCP-discovery visibility only — the node has no
1836
+ // model picker in V1, so (unlike every other row in this section) they
1837
+ // deliberately carry no `series` and their `modes` has no Models-tab
1838
+ // mapping (see model-tree.ts's MODE_TO_NODE) — they must never appear as
1839
+ // selectable "video-analysis" models. Two credit families, chosen by
1840
+ // whether an analysis is wired into the node; the structural formula lives
1841
+ // in video-analysis-pricing.ts.
1842
+ "video-audit": {
1843
+ id: "video-audit",
1844
+ kind: "video",
1845
+ modes: ["video-audit"],
1846
+ family: "Nodaro",
1847
+ label: "AI Audit",
1848
+ description: "Re-watches a clip against a wired analysis, applies video-verified corrections under guards, and returns a disclosed report of what changed. Billed per duration bucket.",
1849
+ useCases: ["video-audit", "qa", "shot-list", "verification"],
1850
+ pricing: [
1851
+ { identifier: "video-audit", credits: 1066, note: "10-min ceiling (no duration given)" },
1852
+ { identifier: "video-audit:60s", credits: 213 },
1853
+ { identifier: "video-audit:180s", credits: 289 },
1854
+ { identifier: "video-audit:360s", credits: 659 },
1855
+ { identifier: "video-audit:600s", credits: 1066, note: "10-min ceiling" }
1856
+ ]
1857
+ },
1858
+ "video-audit-auto": {
1859
+ id: "video-audit-auto",
1860
+ kind: "video",
1861
+ modes: ["video-audit"],
1862
+ family: "Nodaro",
1863
+ label: "AI Audit (with analysis run)",
1864
+ description: "Same video-verified audit as AI Audit, but auto-runs a fast analysis first when none is wired in, then applies corrections under guards and returns a disclosed report. Billed per duration bucket.",
1865
+ useCases: ["video-audit", "qa", "shot-list", "verification", "auto-analysis"],
1866
+ pricing: [
1867
+ { identifier: "video-audit:auto", credits: 1912, note: "10-min ceiling (no duration given)" },
1868
+ { identifier: "video-audit:auto:60s", credits: 393 },
1869
+ { identifier: "video-audit:auto:180s", credits: 474 },
1870
+ { identifier: "video-audit:auto:360s", credits: 1173 },
1871
+ { identifier: "video-audit:auto:600s", credits: 1912, note: "10-min ceiling" }
1753
1872
  ]
1754
1873
  }
1755
1874
  };
@@ -2209,7 +2328,7 @@ function getMaxImagePromptChars(provider) {
2209
2328
  }
2210
2329
  var VIDEO_PROMPT_MAX = 8e3;
2211
2330
  var SUNO_TEXT_MAX = 5e3;
2212
- var PROMPT_HARD_CEILING = 2e4;
2331
+ var PROMPT_HARD_CEILING = 3e4;
2213
2332
  var LLM_TEXT_INPUT_MAX = 1e5;
2214
2333
  var MAX_VIDEO_PROMPT_CHARS_BY_PROVIDER = {
2215
2334
  // Kling family — our `kling`→kling-2.6 (1000), `kling-turbo`→v2.5-turbo-pro (2500)
@@ -2221,10 +2340,16 @@ var MAX_VIDEO_PROMPT_CHARS_BY_PROVIDER = {
2221
2340
  "seedance-2-fast": 2e4,
2222
2341
  "seedance-2-mini": 2e4,
2223
2342
  "seedance-2-extend": 2e4,
2343
+ // Seedance 2.5 raises the prompt ceiling to 30000
2344
+ // (docs.kie.ai/market/bytedance/seedance-2-5).
2345
+ "seedance-2-5": 3e4,
2224
2346
  "gemini-omni-video": 2e4,
2225
2347
  "bytedance-lite": 1e4,
2226
2348
  "bytedance-pro": 1e4,
2227
2349
  "bytedance-pro-fast": 1e4,
2350
+ // MiniMax Hailuo 3 — 1-7000 chars, uniform across t2v/i2v/r2v
2351
+ // (docs.kie.ai/market/minimax-h3).
2352
+ "minimax-h3": 7e3,
2228
2353
  // lower than the 8000 default
2229
2354
  "minimax": 1500,
2230
2355
  "hailuo-standard": 1500,
@@ -2563,6 +2688,8 @@ var IMAGE_TO_VIDEO_PROVIDERS = [
2563
2688
  "seedance-2",
2564
2689
  "seedance-2-fast",
2565
2690
  "seedance-2-mini",
2691
+ "seedance-2-5",
2692
+ "minimax-h3",
2566
2693
  "hailuo-2.3-pro",
2567
2694
  "hailuo-2.3",
2568
2695
  "hailuo-standard",
@@ -2602,6 +2729,8 @@ var TEXT_TO_VIDEO_PROVIDERS = [
2602
2729
  "seedance-2",
2603
2730
  "seedance-2-fast",
2604
2731
  "seedance-2-mini",
2732
+ "seedance-2-5",
2733
+ "minimax-h3",
2605
2734
  "wan",
2606
2735
  "hailuo-standard",
2607
2736
  "bytedance-lite",
@@ -2715,12 +2844,19 @@ var LIP_SYNC_PROVIDERS = [
2715
2844
  // not the dedicated lip-sync flow.
2716
2845
  "seedance-2",
2717
2846
  "seedance-2-fast",
2718
- "seedance-2-mini"
2847
+ "seedance-2-mini",
2848
+ "seedance-2-5",
2849
+ // MiniMax Hailuo 3 — same multimodal audio-driven mechanism (r2v
2850
+ // reference_audio_urls paired with an image ref); rides the same
2851
+ // reference-audio lip-sync surface as the Seedance 2 family.
2852
+ "minimax-h3"
2719
2853
  ];
2720
2854
  var SEEDANCE_LIP_SYNC_PROVIDERS = /* @__PURE__ */ new Set([
2721
2855
  "seedance-2",
2722
2856
  "seedance-2-fast",
2723
- "seedance-2-mini"
2857
+ "seedance-2-mini",
2858
+ "seedance-2-5",
2859
+ "minimax-h3"
2724
2860
  ]);
2725
2861
  var REPLICATE_LIP_SYNC_PROVIDERS = /* @__PURE__ */ new Set([
2726
2862
  "latentsync",
@@ -2885,6 +3021,8 @@ var DURATION_PRICED_PROVIDERS = /* @__PURE__ */ new Set([
2885
3021
  "seedance-2",
2886
3022
  "seedance-2-fast",
2887
3023
  "seedance-2-mini",
3024
+ "seedance-2-5",
3025
+ "minimax-h3",
2888
3026
  "grok-imagine-video-1.5",
2889
3027
  "happyhorse",
2890
3028
  "happyhorse-i2v",
@@ -2893,17 +3031,111 @@ var DURATION_PRICED_PROVIDERS = /* @__PURE__ */ new Set([
2893
3031
  var SEEDANCE_2_PROVIDERS = /* @__PURE__ */ new Set([
2894
3032
  "seedance-2",
2895
3033
  "seedance-2-fast",
2896
- "seedance-2-mini"
3034
+ "seedance-2-mini",
3035
+ // Seedance 2.5 — a later generation, but it shares the whole 2.0 capability
3036
+ // surface this set gates (frames + image/video/audio refs, adaptive aspect,
3037
+ // per-second resolution × video-ref pricing), so it belongs here. Where it
3038
+ // DIFFERS (30s ceiling, no 1080p/4K, wider ref caps) the difference is
3039
+ // carried by the per-provider maps, never by branching on this set.
3040
+ "seedance-2-5"
2897
3041
  ]);
2898
3042
  function isSeedance2Provider(provider) {
2899
3043
  return !!provider && SEEDANCE_2_PROVIDERS.has(provider);
2900
3044
  }
2901
- var GVP_SUPPORTED_PROVIDERS = ["seedance-2", "seedance-2-fast"];
3045
+ var MINIMAX_H3_PROVIDERS = /* @__PURE__ */ new Set([
3046
+ "minimax-h3"
3047
+ ]);
3048
+ function isMinimaxH3Provider(provider) {
3049
+ return !!provider && MINIMAX_H3_PROVIDERS.has(provider);
3050
+ }
3051
+ var MINIMAX_H3_DEFAULT_RESOLUTION = "2K";
3052
+ function normalizeMinimaxH3Resolution(resolution) {
3053
+ return resolution?.trim().toLowerCase() === "768p" ? "768P" : MINIMAX_H3_DEFAULT_RESOLUTION;
3054
+ }
3055
+ var VIDEO_PROVIDERS_WITHOUT_DISPATCH = /* @__PURE__ */ new Set([
3056
+ "kling-3-omni"
3057
+ ]);
3058
+ var GVP_DEFAULT_PROVIDER = "seedance-2";
3059
+ function deriveGvpSupportedProviders() {
3060
+ const dispatchable = new Set(VIDEO_GEN_PROVIDERS);
3061
+ const eligible = Object.values(MODEL_CATALOG).filter(
3062
+ (m) => m.kind === "video" && m.modes.includes("i2v") && m.features?.includes("reference-image") === true && (m.durations?.length ?? 0) > 0 && // Must also be dispatchable by the unified video node — the pro route
3063
+ // hands the provider id straight to the app's imageToVideo.
3064
+ dispatchable.has(m.id) && // ...and must actually REACH a provider. Capability alone is not
3065
+ // enough: kling-3-omni passes every check above and still fails at the
3066
+ // router (see VIDEO_PROVIDERS_WITHOUT_DISPATCH).
3067
+ !VIDEO_PROVIDERS_WITHOUT_DISPATCH.has(m.id)
3068
+ ).map((m) => m.id);
3069
+ const seriesOf = (id) => MODEL_CATALOG[id]?.series ?? MODEL_CATALOG[id]?.family ?? id;
3070
+ const defaultSeries = seriesOf(GVP_DEFAULT_PROVIDER);
3071
+ const order = [];
3072
+ for (const id of eligible) {
3073
+ const s = seriesOf(id);
3074
+ if (!order.includes(s)) order.push(s);
3075
+ }
3076
+ const rank = (id) => {
3077
+ const s = seriesOf(id);
3078
+ return s === defaultSeries ? -1 : order.indexOf(s);
3079
+ };
3080
+ return [...eligible].sort((a, b) => {
3081
+ const d = rank(a) - rank(b);
3082
+ if (d !== 0) return d;
3083
+ if (a === GVP_DEFAULT_PROVIDER) return -1;
3084
+ if (b === GVP_DEFAULT_PROVIDER) return 1;
3085
+ return eligible.indexOf(a) - eligible.indexOf(b);
3086
+ });
3087
+ }
3088
+ var GVP_SUPPORTED_PROVIDERS = deriveGvpSupportedProviders();
2902
3089
  function isGvpSupportedProvider(provider) {
2903
3090
  return !!provider && GVP_SUPPORTED_PROVIDERS.includes(provider);
2904
3091
  }
3092
+ var GVP_EXTEND_PROVIDERS = GVP_SUPPORTED_PROVIDERS.filter(
3093
+ (id) => MODEL_CATALOG[id]?.features?.includes("video-reference") === true
3094
+ );
3095
+ function supportsExtendRender(provider) {
3096
+ return !!provider && GVP_EXTEND_PROVIDERS.includes(provider);
3097
+ }
3098
+ var GVP_END_FRAME_PROVIDERS = GVP_SUPPORTED_PROVIDERS.filter(
3099
+ (id) => MODEL_CATALOG[id]?.features?.includes("end-frame") === true
3100
+ );
3101
+ function supportsEndAnchor(provider) {
3102
+ return !!provider && GVP_END_FRAME_PROVIDERS.includes(provider);
3103
+ }
3104
+ var GVP_ANCHOR_CHOICES = ["auto", "start-end", "start-only", "reference"];
3105
+ function resolveGvpAnchorWire(choice) {
3106
+ switch (choice) {
3107
+ case "start-end":
3108
+ return "upfront";
3109
+ case "start-only":
3110
+ return "progressive";
3111
+ case "reference":
3112
+ return "none";
3113
+ default:
3114
+ return void 0;
3115
+ }
3116
+ }
3117
+ function segmentDurationsFor(provider) {
3118
+ if (!provider) return [];
3119
+ return [...MODEL_CATALOG[provider]?.durations ?? []].sort((a, b) => a - b);
3120
+ }
3121
+ function minSegmentSecFor(provider) {
3122
+ return segmentDurationsFor(provider)[0] ?? 0;
3123
+ }
3124
+ function maxSegmentSecFor(provider) {
3125
+ const d = segmentDurationsFor(provider);
3126
+ return d[d.length - 1] ?? 0;
3127
+ }
3128
+ function hasContiguousSegmentDurations(provider) {
3129
+ const d = segmentDurationsFor(provider);
3130
+ if (d.length === 0) return false;
3131
+ return d.length === d[d.length - 1] - d[0] + 1;
3132
+ }
3133
+ function maxSegmentsFor(provider, capSec) {
3134
+ const max = maxSegmentSecFor(provider);
3135
+ return max > 0 ? Math.ceil(capSec / max) : 0;
3136
+ }
2905
3137
  function defaultVideoAspectRatio(provider) {
2906
- return isSeedance2Provider(provider) ? "adaptive" : "16:9";
3138
+ return isSeedance2Provider(provider) || isMinimaxH3Provider(provider) ? "adaptive" : "16:9";
2907
3139
  }
2908
3140
  var VEO_PROVIDERS = /* @__PURE__ */ new Set([
2909
3141
  "veo3",
@@ -2918,6 +3150,11 @@ var SEEDANCE_2_REF_LIMITS = {
2918
3150
  videos: 3,
2919
3151
  audio: 3
2920
3152
  };
3153
+ var SEEDANCE_2_5_REF_LIMITS = {
3154
+ images: 30,
3155
+ videos: 10,
3156
+ audio: 10
3157
+ };
2921
3158
  var SEEDANCE_2_R2V_MIN_REF_VIDEO_SEC = 1.8;
2922
3159
  var SEEDANCE_2_CONTINUATION_REF_SEC = 2;
2923
3160
  var SEEDANCE_2_EXTEND_STITCH = {
@@ -2936,7 +3173,13 @@ var SEEDANCE_2_EXTEND_STITCH = {
2936
3173
  referenceTailSeconds: SEEDANCE_2_CONTINUATION_REF_SEC
2937
3174
  };
2938
3175
  var SEEDANCE_2_R2V_MAX_AUDIO_SEC_BY_PROVIDER = {
2939
- "seedance-2-fast": 15.2
3176
+ "seedance-2-fast": 15.2,
3177
+ // Seedance 2.5 — documented hard limit: each reference audio 2-30s, ≤15 MB
3178
+ // per file (docs.kie.ai/market/bytedance/seedance-2-5).
3179
+ "seedance-2-5": 30,
3180
+ // MiniMax Hailuo 3 — documented hard limit: each reference audio segment
3181
+ // 2-15s, ≤15s total (docs.kie.ai/market/minimax-h3/reference-to-video).
3182
+ "minimax-h3": 15
2940
3183
  };
2941
3184
  function seedance2AudioLimitSec(provider) {
2942
3185
  if (!provider) return null;
@@ -2955,6 +3198,13 @@ var VIDEO_REF_LIMITS_BY_PROVIDER = {
2955
3198
  "seedance-2": { ...SEEDANCE_2_REF_LIMITS },
2956
3199
  "seedance-2-fast": { ...SEEDANCE_2_REF_LIMITS },
2957
3200
  "seedance-2-mini": { ...SEEDANCE_2_REF_LIMITS },
3201
+ // Seedance 2.5 — wider caps than the 2.0 family (30 / 10 / 10).
3202
+ "seedance-2-5": { ...SEEDANCE_2_5_REF_LIMITS },
3203
+ // MiniMax Hailuo 3 — identical multimodal caps (9 images / 3 videos / 3
3204
+ // audio per docs.kie.ai/market/minimax-h3/reference-to-video). Note: KIE
3205
+ // bills input images beyond the first 5 (11 KIE cr each) — see the
3206
+ // minimax-h3 credit helper in backend ee/billing.
3207
+ "minimax-h3": { ...SEEDANCE_2_REF_LIMITS },
2958
3208
  // Multi-image reference providers.
2959
3209
  "gemini-omni-video": { images: 7, videos: 1 },
2960
3210
  "kling-3-omni": { images: 7 },
@@ -2992,8 +3242,12 @@ var RESOLUTION_DURATION_PRICING = {
2992
3242
  var NATIVE_ADAPTIVE_ASPECT = {
2993
3243
  "seedance-2": "adaptive",
2994
3244
  "seedance-2-fast": "adaptive",
2995
- "seedance-2-mini": "adaptive"
3245
+ "seedance-2-mini": "adaptive",
3246
+ "seedance-2-5": "adaptive"
2996
3247
  };
3248
+ var FRAME_MODE_ADAPTIVE_ONLY_ASPECT = /* @__PURE__ */ new Set([
3249
+ "seedance-2-5"
3250
+ ]);
2997
3251
  var VIDEO_PROVIDERS_REQUIRING_IMAGE = new Set(
2998
3252
  Object.values(MODEL_CATALOG).filter(
2999
3253
  (m) => m.kind === "video" && m.modes.includes("i2v") && !m.modes.includes("t2v") && VIDEO_GEN_PROVIDERS.includes(m.id) && resolveVideoProviderForMode(m.id, "text-to-video") === m.id
@@ -3032,7 +3286,15 @@ var VIDEO_AUDIO_CAPABILITY = {
3032
3286
  // Seedance 2.0 — multimodal; lip-syncs to a supplied reference-audio track.
3033
3287
  "seedance-2": { mode: "audio_driven", field: "generateAudio" },
3034
3288
  "seedance-2-fast": { mode: "audio_driven", field: "generateAudio" },
3035
- "seedance-2-mini": { mode: "audio_driven", field: "generateAudio" }
3289
+ "seedance-2-mini": { mode: "audio_driven", field: "generateAudio" },
3290
+ // Seedance 2.5 — same audio-driven surface; `generate_audio` defaults TRUE
3291
+ // on KIE and is cost-affecting only through the -ref/no-ref rate split,
3292
+ // which the resolution+ref composite already carries (no `:audio` suffix).
3293
+ "seedance-2-5": { mode: "audio_driven", field: "generateAudio", defaultOn: true },
3294
+ // MiniMax Hailuo 3 — multimodal; lip-syncs to reference audio (r2v). The
3295
+ // KIE API exposes NO audio on/off parameter (audio is always produced), so
3296
+ // there is no toggle field — alwaysOn, like VEO.
3297
+ "minimax-h3": { mode: "audio_driven", alwaysOn: true }
3036
3298
  };
3037
3299
  var VIDEO_AUDIO_NONE = { mode: "none" };
3038
3300
  function getVideoAudioCapability(model) {
@@ -3073,13 +3335,30 @@ var VIDEO_VARIABLE_PRICING = {
3073
3335
  "seedance-2": "duration+resolution+ref",
3074
3336
  "seedance-2-fast": "duration+resolution+ref",
3075
3337
  "seedance-2-mini": "duration+resolution+ref",
3338
+ "seedance-2-5": "duration+resolution+ref",
3339
+ // MiniMax Hailuo 3 — per-second rate at two resolution tiers (2K default /
3340
+ // 768P). Duration + resolution form the composite (bare = 2K, ":768p"
3341
+ // appended for the cheaper tier); ref-video input seconds + extra input
3342
+ // images are billed via the dedicated compute hook, not the identifier.
3343
+ "minimax-h3": "duration+resolution",
3076
3344
  // Grok Imagine Video 1.5 — per-second billing split 480p/720p (no video-ref dimension).
3077
3345
  "grok-imagine-video-1.5": "duration+resolution"
3078
3346
  };
3347
+ var PRICING_DEFAULT_DURATION_SEC = {
3348
+ "minimax-h3": 6
3349
+ };
3350
+ var PRICING_DEFAULT_RESOLUTION = {
3351
+ // KIE renders 720p when `resolution` is omitted (kie/models.ts extraParams).
3352
+ "seedance-2-5": "720p"
3353
+ };
3079
3354
  var HAPPYHORSE_DURATION_TIERS = Array.from(
3080
3355
  { length: 13 },
3081
3356
  (_, i) => ({ maxSeconds: i + 3, suffix: `${i + 3}s` })
3082
3357
  );
3358
+ var SEEDANCE_2_5_DURATION_TIERS = Array.from(
3359
+ { length: 27 },
3360
+ (_, i) => ({ maxSeconds: i + 4, suffix: `${i + 4}s` })
3361
+ );
3083
3362
  var VIDEO_DURATION_TIERS = {
3084
3363
  "kling-3.0": [
3085
3364
  { maxSeconds: 5, suffix: "5s" },
@@ -3154,6 +3433,25 @@ var VIDEO_DURATION_TIERS = {
3154
3433
  { maxSeconds: 12, suffix: "12s" },
3155
3434
  { maxSeconds: 15, suffix: "15s" }
3156
3435
  ],
3436
+ "seedance-2-5": SEEDANCE_2_5_DURATION_TIERS,
3437
+ // MiniMax Hailuo 3 — true per-second billing (KIE 36.5 cr/s @2K, 22.5 cr/s
3438
+ // @768P). One tier per allowed second (4-15s) so the composite identifier
3439
+ // maps 1:1 to the seeded price — no rounding/overcharge for any on-menu
3440
+ // duration; the ":768p" resolution suffix is appended after the tier.
3441
+ "minimax-h3": [
3442
+ { maxSeconds: 4, suffix: "4s" },
3443
+ { maxSeconds: 5, suffix: "5s" },
3444
+ { maxSeconds: 6, suffix: "6s" },
3445
+ { maxSeconds: 7, suffix: "7s" },
3446
+ { maxSeconds: 8, suffix: "8s" },
3447
+ { maxSeconds: 9, suffix: "9s" },
3448
+ { maxSeconds: 10, suffix: "10s" },
3449
+ { maxSeconds: 11, suffix: "11s" },
3450
+ { maxSeconds: 12, suffix: "12s" },
3451
+ { maxSeconds: 13, suffix: "13s" },
3452
+ { maxSeconds: 14, suffix: "14s" },
3453
+ { maxSeconds: 15, suffix: "15s" }
3454
+ ],
3157
3455
  // Grok Imagine Video 1.5 — true per-second billing (KIE 14.5 cr/s @480p, 25 cr/s
3158
3456
  // @720p, +2 cr/image). One tier per allowed second (1–15s) so the composite
3159
3457
  // identifier maps 1:1 to the seeded price — no rounding/overcharge for any on-menu value.
@@ -3285,6 +3583,17 @@ var VIDEO_MODEL_CAPS = {
3285
3583
  // character + location + 3 secondary refs.
3286
3584
  maxReferenceImages: 5
3287
3585
  },
3586
+ "seedance-2-5": {
3587
+ inputModes: ["first_frame", "first_last_frame", "ref_images", "video_continuation"],
3588
+ supportsVideoExtension: true,
3589
+ // 30s single-shot on KIE (probe-verified 2026-08-08: 30 accepted, 31 rejected).
3590
+ maxDurationSeconds: 30,
3591
+ prompting_style: "natural_language",
3592
+ // SEEDANCE_2_5_REF_LIMITS.images is the hard upper bound (30); the same
3593
+ // conservative headroom rule as seedance-2 applies to what the director
3594
+ // actually allocates.
3595
+ maxReferenceImages: 5
3596
+ },
3288
3597
  "hailuo-2.3-pro": {
3289
3598
  inputModes: ["first_frame", "text"],
3290
3599
  maxDurationSeconds: 10,
@@ -3395,6 +3704,8 @@ var VIDEO_CLIP_CREDITS = {
3395
3704
  // seedance-2-fast:8s:720p-ref
3396
3705
  "seedance-2-mini": { credits: 25, clipSeconds: 8 },
3397
3706
  // seedance-2-mini:8s:720p-ref
3707
+ "seedance-2-5": { credits: 76, clipSeconds: 8 },
3708
+ // seedance-2-5:8s:720p-ref
3398
3709
  "veo3": { credits: 79, clipSeconds: 8 },
3399
3710
  // flat per generation (VEO 3.1 Quality)
3400
3711
  "veo3.1": { credits: 19, clipSeconds: 6 },
@@ -3798,8 +4109,9 @@ function buildVideoCreditModelIdentifier(provider, duration, sound, nodeType, mo
3798
4109
  if (!DURATION_PRICED_PROVIDERS.has(effectiveProvider)) {
3799
4110
  return effectiveProvider;
3800
4111
  }
3801
- const parsed = typeof duration === "string" ? parseInt(duration, 10) : duration ?? 5;
3802
- const durationSec = Number.isNaN(parsed) ? 5 : parsed;
4112
+ const durationFallback = PRICING_DEFAULT_DURATION_SEC[effectiveProvider] ?? 5;
4113
+ const parsed = typeof duration === "string" ? parseInt(duration, 10) : duration ?? durationFallback;
4114
+ const durationSec = Number.isNaN(parsed) ? durationFallback : parsed;
3803
4115
  const tiers = VIDEO_DURATION_TIERS[effectiveProvider];
3804
4116
  if (!tiers) return effectiveProvider;
3805
4117
  const tier = tiers.find((t2) => durationSec <= t2.maxSeconds) ?? tiers[tiers.length - 1];
@@ -3813,7 +4125,8 @@ function buildVideoCreditModelIdentifier(provider, duration, sound, nodeType, mo
3813
4125
  }
3814
4126
  if (RESOLUTION_VIDEO_REF_PRICING.has(effectiveProvider)) {
3815
4127
  const supported = MODEL_CATALOG[effectiveProvider]?.resolutions ?? ["480p", "720p", "1080p"];
3816
- const want = resolution === "4k" ? "4k" : resolution === "1080p" ? "1080p" : resolution === "720p" ? "720p" : "480p";
4128
+ const requested = resolution ?? PRICING_DEFAULT_RESOLUTION[effectiveProvider];
4129
+ const want = requested === "4k" ? "4k" : requested === "1080p" ? "1080p" : requested === "720p" ? "720p" : "480p";
3817
4130
  const res = supported.includes(want) ? want : supported[supported.length - 1] ?? "480p";
3818
4131
  identifier += `:${res}`;
3819
4132
  if (hasVideoRef) identifier += "-ref";
@@ -3823,6 +4136,9 @@ function buildVideoCreditModelIdentifier(provider, duration, sound, nodeType, mo
3823
4136
  const res = resolution && resTiers.includes(resolution) ? resolution : resTiers[0];
3824
4137
  identifier += `:${res}`;
3825
4138
  }
4139
+ if (isMinimaxH3Provider(effectiveProvider) && normalizeMinimaxH3Resolution(resolution) === "768P") {
4140
+ identifier += ":768p";
4141
+ }
3826
4142
  return identifier;
3827
4143
  }
3828
4144
  function buildMotionCreditModelIdentifier(provider, resolution, videoDuration) {
@@ -7337,6 +7653,8 @@ var QUALITY_MAP = {
7337
7653
  "seedance-2": { field: "resolution", values: { low: "720p", mid: "1080p", high: "1080p" } },
7338
7654
  "seedance-2-fast": { field: "resolution", values: { low: "480p", mid: "720p", high: "720p" } },
7339
7655
  "seedance-2-mini": { field: "resolution", values: { low: "480p", mid: "720p", high: "720p" } },
7656
+ // Seedance 2.5 tops out at 720p on KIE (1080p/4k probe-rejected 2026-08-08).
7657
+ "seedance-2-5": { field: "resolution", values: { low: "480p", mid: "720p", high: "720p" } },
7340
7658
  "wan-2.7-i2v": { field: "resolution", values: { low: "720p", mid: "1080p", high: "1080p" } },
7341
7659
  "wan-2.7-t2v": { field: "resolution", values: { low: "720p", mid: "1080p", high: "1080p" } },
7342
7660
  "happyhorse": { field: "resolution", values: { low: "720p", mid: "1080p", high: "1080p" } },
@@ -7417,7 +7735,7 @@ var NODE_MAPPABLE_FIELDS = {
7417
7735
  "suno-cover": ["prompt", "lyrics", "style", "title", "negativeStyle"],
7418
7736
  "suno-extend": ["prompt", "style", "title"],
7419
7737
  "suno-lyrics": ["prompt"],
7420
- "suno-replace-section": ["prompt", "tags", "title"],
7738
+ "suno-replace-section": ["prompt", "tags", "title", "fullLyrics", "negativeTags"],
7421
7739
  "suno-style-boost": ["content"],
7422
7740
  "suno-upload-extend": ["prompt", "style", "title"],
7423
7741
  "suno-mashup": ["style", "title", "negativeStyle"],
@@ -9780,6 +10098,7 @@ var PIPELINE_PINNABLE_VIDEO_MODELS = [
9780
10098
  "seedance-2",
9781
10099
  "seedance-2-fast",
9782
10100
  "seedance-2-mini",
10101
+ "seedance-2-5",
9783
10102
  "veo3",
9784
10103
  "veo3.1",
9785
10104
  "veo3_lite",
@@ -10745,6 +11064,10 @@ var PROVIDER_DIRECTIVE_DEFAULTS = {
10745
11064
  "hailuo-2.3-pro": {},
10746
11065
  "hailuo-standard": {},
10747
11066
  minimax: {},
11067
+ // MiniMax Hailuo 3 — multimodal like seedance-2 but no verified directive
11068
+ // semantics yet; empty until probed (NOTE: never match `minimax-h3` with a
11069
+ // startsWith("seedance") / startsWith("minimax") prefix check — exact keys only).
11070
+ "minimax-h3": {},
10748
11071
  "bytedance-lite": {}
10749
11072
  };
10750
11073
  function mapShotIntentToProviderDirectives(provider, shotIntent) {
@@ -12242,7 +12565,10 @@ function sourceRefKey(nodeId, sourceHandleId, rawSourceType) {
12242
12565
  var REFERENCE_ROLE_PRESETS = {
12243
12566
  "wired-character": ["ref-only", "person", "face", "clothes", "hair", "pose", "expression", "style"],
12244
12567
  "wired-face": ["face", "person", "expression", "style"],
12245
- "wired-location": ["ref-only", "background", "atmosphere", "as-is", "empty background", "layout", "lighting", "style"],
12568
+ // "location" sits second, mirroring wired-character's ref-only/person order
12569
+ // it is this source's default. "background" keeps its place for the genuine
12570
+ // backdrop case (see DEFAULT_LABEL_BY_SOURCE for why it stopped being default).
12571
+ "wired-location": ["ref-only", "location", "background", "atmosphere", "as-is", "empty background", "layout", "lighting", "style"],
12246
12572
  "wired-object": ["object", "shape", "material", "color", "texture", "style"],
12247
12573
  "wired-creature": ["creature", "anatomy", "markings", "pose", "color", "style"],
12248
12574
  "wired-image": ["object", "person", "face", "clothes", "background", "style", "pose", "texture"],
@@ -12585,8 +12911,9 @@ function renderAnalyzedScene(scene, slots, castMap) {
12585
12911
  const byId = new Map(slots.map((s) => [s.slotId, s]));
12586
12912
  return scene.visual.replace(SLOT_TOKEN_RE, (_whole, id) => castMap?.[id] ?? byId.get(id)?.description ?? id);
12587
12913
  }
12914
+ var OVERSIZE_TOLERANCE_SEC = 1e-6;
12588
12915
  function isOversizedScene(startSec, endSec) {
12589
- return endSec - startSec > VIDEO_ANALYSIS_MAX_SCENE_SEC;
12916
+ return endSec - startSec > VIDEO_ANALYSIS_MAX_SCENE_SEC + OVERSIZE_TOLERANCE_SEC;
12590
12917
  }
12591
12918
  var STANDARD_RATIOS = [
12592
12919
  ["16:9", 16 / 9],
@@ -12614,36 +12941,38 @@ var WINDOW_OVERLAP = 5;
12614
12941
  var VIDEO_ANALYSIS_WINDOW = { LEN: WINDOW_LEN, STRIDE: WINDOW_STRIDE, OVERLAP: WINDOW_OVERLAP, SINGLE_MAX: 180 };
12615
12942
  var VIDEO_ANALYSIS_BUCKET_CREDITS = {
12616
12943
  // Legacy fast-tier model (pre-2026-07) — kept for stored raw-id configs.
12617
- "video-analysis:gemini-3-flash:60s": 24,
12618
- "video-analysis:gemini-3-flash:180s": 33,
12619
- "video-analysis:gemini-3-flash:360s": 86,
12620
- "video-analysis:gemini-3-flash:600s": 143,
12944
+ "video-analysis:gemini-3-flash:60s": 180,
12945
+ "video-analysis:gemini-3-flash:180s": 185,
12946
+ "video-analysis:gemini-3-flash:360s": 514,
12947
+ "video-analysis:gemini-3-flash:600s": 846,
12621
12948
  // Current fast tier — regenerated from the private formula for its backing
12622
12949
  // model; higher than the legacy fast schedule but still ≤ pro per bucket.
12623
- "video-analysis:gemini-3.6-flash:60s": 65,
12624
- "video-analysis:gemini-3.6-flash:180s": 92,
12625
- "video-analysis:gemini-3.6-flash:360s": 237,
12626
- "video-analysis:gemini-3.6-flash:600s": 395,
12627
- "video-analysis:gemini-3.1-pro:60s": 87,
12628
- "video-analysis:gemini-3.1-pro:180s": 116,
12629
- "video-analysis:gemini-3.1-pro:360s": 305,
12630
- "video-analysis:gemini-3.1-pro:600s": 509,
12950
+ "video-analysis:gemini-3.6-flash:60s": 203,
12951
+ "video-analysis:gemini-3.6-flash:180s": 218,
12952
+ "video-analysis:gemini-3.6-flash:360s": 598,
12953
+ "video-analysis:gemini-3.6-flash:600s": 986,
12954
+ "video-analysis:gemini-3.1-pro:60s": 215,
12955
+ "video-analysis:gemini-3.1-pro:180s": 231,
12956
+ "video-analysis:gemini-3.1-pro:360s": 636,
12957
+ "video-analysis:gemini-3.1-pro:600s": 1050,
12631
12958
  // Mixed tiers (`mixed` + `mixed-fast`) share ONE credit family — they are
12632
12959
  // variants of the same engine plan (plan internals live in the private
12633
12960
  // analysis plugin). Admin-tunable via model_pricing like every other row.
12634
- "video-analysis:mixed:60s": 110,
12635
- "video-analysis:mixed:180s": 149,
12636
- "video-analysis:mixed:360s": 390,
12637
- "video-analysis:mixed:600s": 651,
12638
- // SMART — the one native-transport plan: a single pass with reasoning turned
12639
- // all the way up at a measured-optimal sampling rate. Priced above the
12640
- // economy tiers because it genuinely costs more to run; the only tier whose
12641
- // accuracy is validated against a hand-counted edit list, re-validated at
12642
- // the current sampling rate before this schedule shipped.
12643
- "video-analysis:smart:60s": 333,
12644
- "video-analysis:smart:180s": 470,
12645
- "video-analysis:smart:360s": 1135,
12646
- "video-analysis:smart:600s": 1868
12961
+ "video-analysis:mixed:60s": 268,
12962
+ "video-analysis:mixed:180s": 289,
12963
+ "video-analysis:mixed:360s": 724,
12964
+ "video-analysis:mixed:600s": 1169,
12965
+ // SMART — the accuracy tier, and since the 2026-08-03 hybrid re-plan a
12966
+ // multi-roll plan like the others: one native 6fps skeleton pass plus 2
12967
+ // fast + 2 pro donor rolls, always refined (`selectionMode` does not apply
12968
+ // here smart always refines; it never offers a cheaper "choose" path).
12969
+ // Priced above the economy tiers because it genuinely costs more to run;
12970
+ // the only tier whose accuracy is validated against a hand-counted edit
12971
+ // list, re-validated at the current plan before this schedule shipped.
12972
+ "video-analysis:smart:60s": 410,
12973
+ "video-analysis:smart:180s": 500,
12974
+ "video-analysis:smart:360s": 1259,
12975
+ "video-analysis:smart:600s": 2064
12647
12976
  };
12648
12977
  function videoAnalysisCreditSegment(modelOrSentinel) {
12649
12978
  return modelOrSentinel === "mixed-fast" ? "mixed" : modelOrSentinel;
@@ -12663,6 +12992,30 @@ function bucketSecondsFromCreditId(creditId) {
12663
12992
  function videoAnalysisNumWindows(bucketSec) {
12664
12993
  return bucketSec <= VIDEO_ANALYSIS_WINDOW.SINGLE_MAX ? 1 : 1 + Math.ceil((bucketSec - WINDOW_LEN) / WINDOW_STRIDE);
12665
12994
  }
12995
+ var VIDEO_AUDIT_BUCKET_CREDITS = {
12996
+ "video-audit:60s": 213,
12997
+ "video-audit:180s": 289,
12998
+ "video-audit:360s": 659,
12999
+ "video-audit:600s": 1066,
13000
+ "video-audit:auto:60s": 393,
13001
+ "video-audit:auto:180s": 474,
13002
+ "video-audit:auto:360s": 1173,
13003
+ "video-audit:auto:600s": 1912
13004
+ };
13005
+ function buildVideoAuditCreditId(args) {
13006
+ const { analysisProvided, durationSec } = args;
13007
+ const bucket = durationSec !== void 0 && durationSec > 0 ? pickVideoAnalysisBucket(Math.min(durationSec, VIDEO_ANALYSIS_MAX_DURATION_SEC)) : VIDEO_ANALYSIS_MAX_DURATION_SEC;
13008
+ const family = analysisProvided ? "video-audit" : "video-audit:auto";
13009
+ return `${family}:${bucket}s`;
13010
+ }
13011
+ function videoAuditCreditsForBucket(bucketSec, auto) {
13012
+ const bucket = pickVideoAnalysisBucket(bucketSec);
13013
+ return VIDEO_AUDIT_BUCKET_CREDITS[`video-audit${auto ? ":auto" : ""}:${bucket}s`];
13014
+ }
13015
+ function bucketSecondsFromAuditCreditId(id) {
13016
+ const m = /^video-audit(?::auto)?:(\d+)s$/.exec(id);
13017
+ return m ? Number(m[1]) : null;
13018
+ }
12666
13019
 
12667
13020
  // src/smart-cut-windows.ts
12668
13021
  var SMART_CUT_WINDOW_MAX = 24;
@@ -12799,6 +13152,7 @@ exports.FILM_BASE_CREDITS = FILM_BASE_CREDITS;
12799
13152
  exports.FLEXIBLE_INPUT_LIP_SYNC_PROVIDERS = FLEXIBLE_INPUT_LIP_SYNC_PROVIDERS;
12800
13153
  exports.FLUX2_RES_MP = FLUX2_RES_MP;
12801
13154
  exports.FLUX_LORA_CHARACTER_MODEL_ID = FLUX_LORA_CHARACTER_MODEL_ID;
13155
+ exports.FRAME_MODE_ADAPTIVE_ONLY_ASPECT = FRAME_MODE_ADAPTIVE_ONLY_ASPECT;
12802
13156
  exports.FRAME_TARGET_HANDLES = FRAME_TARGET_HANDLES;
12803
13157
  exports.FREECUT_EXPORT_COMPLETE = FREECUT_EXPORT_COMPLETE;
12804
13158
  exports.FREECUT_EXPORT_PROGRESS = FREECUT_EXPORT_PROGRESS;
@@ -12813,6 +13167,10 @@ exports.GENERATE_TEXT_DELIMITER = GENERATE_TEXT_DELIMITER;
12813
13167
  exports.GLOBAL_MAX_DURATION_SECONDS = GLOBAL_MAX_DURATION_SECONDS;
12814
13168
  exports.GROUP_HANDLE_PREFIX = GROUP_HANDLE_PREFIX;
12815
13169
  exports.GUIDANCE_SCALE_SUPPORT = GUIDANCE_SCALE_SUPPORT;
13170
+ exports.GVP_ANCHOR_CHOICES = GVP_ANCHOR_CHOICES;
13171
+ exports.GVP_DEFAULT_PROVIDER = GVP_DEFAULT_PROVIDER;
13172
+ exports.GVP_END_FRAME_PROVIDERS = GVP_END_FRAME_PROVIDERS;
13173
+ exports.GVP_EXTEND_PROVIDERS = GVP_EXTEND_PROVIDERS;
12816
13174
  exports.GVP_SUPPORTED_PROVIDERS = GVP_SUPPORTED_PROVIDERS;
12817
13175
  exports.GenerateMotionInputSchema = GenerateMotionInputSchema;
12818
13176
  exports.GenerateMotionResultSchema = GenerateMotionResultSchema;
@@ -12882,6 +13240,8 @@ exports.MAX_NEGATIVE_PROMPT_CHARS_BY_PROVIDER = MAX_NEGATIVE_PROMPT_CHARS_BY_PRO
12882
13240
  exports.MAX_PANELS_PER_SHEET = MAX_PANELS_PER_SHEET;
12883
13241
  exports.MAX_TTS_CHARS_BY_PROVIDER = MAX_TTS_CHARS_BY_PROVIDER;
12884
13242
  exports.MAX_VIDEO_PROMPT_CHARS_BY_PROVIDER = MAX_VIDEO_PROMPT_CHARS_BY_PROVIDER;
13243
+ exports.MINIMAX_H3_DEFAULT_RESOLUTION = MINIMAX_H3_DEFAULT_RESOLUTION;
13244
+ exports.MINIMAX_H3_PROVIDERS = MINIMAX_H3_PROVIDERS;
12885
13245
  exports.MODELS_WITH_REFERENCE_IMAGE_SUPPORT = MODELS_WITH_REFERENCE_IMAGE_SUPPORT;
12886
13246
  exports.MODEL_CATALOG = MODEL_CATALOG;
12887
13247
  exports.MODEL_RECOMMENDATIONS = MODEL_RECOMMENDATIONS;
@@ -12937,6 +13297,8 @@ exports.PLATFORM_SPECS = PLATFORM_SPECS;
12937
13297
  exports.PRESET_APPLY_CLEAR_KEYS = PRESET_APPLY_CLEAR_KEYS;
12938
13298
  exports.PRESET_EXCLUDED_KEYS = PRESET_EXCLUDED_KEYS;
12939
13299
  exports.PRESET_LABELS = PRESET_LABELS;
13300
+ exports.PRICING_DEFAULT_DURATION_SEC = PRICING_DEFAULT_DURATION_SEC;
13301
+ exports.PRICING_DEFAULT_RESOLUTION = PRICING_DEFAULT_RESOLUTION;
12940
13302
  exports.PROMPT_HARD_CEILING = PROMPT_HARD_CEILING;
12941
13303
  exports.PROVIDER_DIRECTIVE_DEFAULTS = PROVIDER_DIRECTIVE_DEFAULTS;
12942
13304
  exports.PROVIDER_PLACEHOLDER_PREFIX = PROVIDER_PLACEHOLDER_PREFIX;
@@ -12973,6 +13335,7 @@ exports.SCRIPT_PROVIDERS = SCRIPT_PROVIDERS;
12973
13335
  exports.SEASONS = SEASONS;
12974
13336
  exports.SECTION_BOARD = SECTION_BOARD;
12975
13337
  exports.SECTION_KINDS = SECTION_KINDS;
13338
+ exports.SEEDANCE_2_5_REF_LIMITS = SEEDANCE_2_5_REF_LIMITS;
12976
13339
  exports.SEEDANCE_2_CONTINUATION_REF_SEC = SEEDANCE_2_CONTINUATION_REF_SEC;
12977
13340
  exports.SEEDANCE_2_EXTEND_STITCH = SEEDANCE_2_EXTEND_STITCH;
12978
13341
  exports.SEEDANCE_2_PROVIDERS = SEEDANCE_2_PROVIDERS;
@@ -13063,6 +13426,7 @@ exports.VIDEO_ANALYSIS_VARIATION_SLUGS = VIDEO_ANALYSIS_VARIATION_SLUGS;
13063
13426
  exports.VIDEO_ANALYSIS_VISUAL_EFFECTS = VIDEO_ANALYSIS_VISUAL_EFFECTS;
13064
13427
  exports.VIDEO_ANALYSIS_WINDOW = VIDEO_ANALYSIS_WINDOW;
13065
13428
  exports.VIDEO_AUDIO_CAPABILITY = VIDEO_AUDIO_CAPABILITY;
13429
+ exports.VIDEO_AUDIT_BUCKET_CREDITS = VIDEO_AUDIT_BUCKET_CREDITS;
13066
13430
  exports.VIDEO_CLIP_CREDITS = VIDEO_CLIP_CREDITS;
13067
13431
  exports.VIDEO_CRITIC_CREDITS_PER_SHOT = VIDEO_CRITIC_CREDITS_PER_SHOT;
13068
13432
  exports.VIDEO_CRITIC_FRAME_MODES = VIDEO_CRITIC_FRAME_MODES;
@@ -13078,6 +13442,7 @@ exports.VIDEO_MODE_ALIASES = VIDEO_MODE_ALIASES;
13078
13442
  exports.VIDEO_PRODUCER_TYPES = VIDEO_PRODUCER_TYPES;
13079
13443
  exports.VIDEO_PROMPT_MAX = VIDEO_PROMPT_MAX;
13080
13444
  exports.VIDEO_PROVIDERS_REQUIRING_IMAGE = VIDEO_PROVIDERS_REQUIRING_IMAGE;
13445
+ exports.VIDEO_PROVIDERS_WITHOUT_DISPATCH = VIDEO_PROVIDERS_WITHOUT_DISPATCH;
13081
13446
  exports.VIDEO_REF_LIMITS_BY_PROVIDER = VIDEO_REF_LIMITS_BY_PROVIDER;
13082
13447
  exports.VIDEO_TO_VIDEO_PROVIDERS = VIDEO_TO_VIDEO_PROVIDERS;
13083
13448
  exports.VIDEO_UPSCALE_PROVIDERS = VIDEO_UPSCALE_PROVIDERS;
@@ -13109,6 +13474,7 @@ exports.aspectRatioOptionsByKind = aspectRatioOptionsByKind;
13109
13474
  exports.aspectRatioToNumber = aspectRatioToNumber;
13110
13475
  exports.assembleNarratedVideoCredits = assembleNarratedVideoCredits;
13111
13476
  exports.availableReasoningEfforts = availableReasoningEfforts;
13477
+ exports.bucketSecondsFromAuditCreditId = bucketSecondsFromAuditCreditId;
13112
13478
  exports.bucketSecondsFromCreditId = bucketSecondsFromCreditId;
13113
13479
  exports.buildBoardPrompt = buildBoardPrompt;
13114
13480
  exports.buildChildrenByParent = buildChildrenByParent;
@@ -13127,6 +13493,7 @@ exports.buildRangeLabel = buildRangeLabel;
13127
13493
  exports.buildScraperCreditId = buildScraperCreditId;
13128
13494
  exports.buildSurroundFillPrompt = buildSurroundFillPrompt;
13129
13495
  exports.buildVideoAnalysisCreditId = buildVideoAnalysisCreditId;
13496
+ exports.buildVideoAuditCreditId = buildVideoAuditCreditId;
13130
13497
  exports.buildVideoCreditModelIdentifier = buildVideoCreditModelIdentifier;
13131
13498
  exports.calculateCombinedProgress = calculateCombinedProgress;
13132
13499
  exports.calculateMonetizationMarkup = calculateMonetizationMarkup;
@@ -13240,6 +13607,7 @@ exports.getWeapon = getWeapon;
13240
13607
  exports.getWeaponLabel = getWeaponLabel;
13241
13608
  exports.groupByFamily = groupByFamily;
13242
13609
  exports.groupHandleId = groupHandleId;
13610
+ exports.hasContiguousSegmentDurations = hasContiguousSegmentDurations;
13243
13611
  exports.hasFeature = hasFeature;
13244
13612
  exports.hexToRgbaArray = hexToRgbaArray;
13245
13613
  exports.humanizeSlotSid = humanizeSlotSid;
@@ -13254,6 +13622,7 @@ exports.isGvpSupportedProvider = isGvpSupportedProvider;
13254
13622
  exports.isHandleInputWired = isHandleInputWired;
13255
13623
  exports.isKineticCaptionStyle = isKineticCaptionStyle;
13256
13624
  exports.isLocationUsageMode = isLocationUsageMode;
13625
+ exports.isMinimaxH3Provider = isMinimaxH3Provider;
13257
13626
  exports.isObjectAspectRatio = isObjectAspectRatio;
13258
13627
  exports.isOversizedScene = isOversizedScene;
13259
13628
  exports.isPerSecondLipSyncProvider = isPerSecondLipSyncProvider;
@@ -13276,16 +13645,20 @@ exports.mapAspectRatio = mapAspectRatio;
13276
13645
  exports.mapQuality = mapQuality;
13277
13646
  exports.mapShotIntentToProviderDirectives = mapShotIntentToProviderDirectives;
13278
13647
  exports.matchVariant = matchVariant;
13648
+ exports.maxSegmentSecFor = maxSegmentSecFor;
13649
+ exports.maxSegmentsFor = maxSegmentsFor;
13279
13650
  exports.mergeClipLook = mergeClipLook;
13280
13651
  exports.mergeExposedSettings = mergeExposedSettings;
13281
13652
  exports.migrateEdgeOutputMode = migrateEdgeOutputMode;
13282
13653
  exports.migrateToItems = migrateToItems;
13654
+ exports.minSegmentSecFor = minSegmentSecFor;
13283
13655
  exports.modelIdsByKindMode = modelIdsByKindMode;
13284
13656
  exports.modelToNodeTarget = modelToNodeTarget;
13285
13657
  exports.modelsForInputMode = modelsForInputMode;
13286
13658
  exports.modelsWithFeature = modelsWithFeature;
13287
13659
  exports.motionGraphicsFeature = motionGraphicsFeature;
13288
13660
  exports.normalizeLottieLayers = normalizeLottieLayers;
13661
+ exports.normalizeMinimaxH3Resolution = normalizeMinimaxH3Resolution;
13289
13662
  exports.normalizePinterestUrl = normalizePinterestUrl;
13290
13663
  exports.normalizeRoleSlug = normalizeRoleSlug;
13291
13664
  exports.parseAttributedDialogue = parseAttributedDialogue;
@@ -13325,6 +13698,7 @@ exports.resolveDialogueVoices = resolveDialogueVoices;
13325
13698
  exports.resolveEffectiveSourceType = resolveEffectiveSourceType;
13326
13699
  exports.resolveEntityAspect = resolveEntityAspect;
13327
13700
  exports.resolveFieldMappings = resolveFieldMappings;
13701
+ exports.resolveGvpAnchorWire = resolveGvpAnchorWire;
13328
13702
  exports.resolveImageGenCreditIdentifier = resolveImageGenCreditIdentifier;
13329
13703
  exports.resolveIndex = resolveIndex;
13330
13704
  exports.resolveLabel = resolveLabel;
@@ -13355,6 +13729,7 @@ exports.runSelector = runSelector;
13355
13729
  exports.sanitizeRole = sanitizeRole;
13356
13730
  exports.searchModelVariants = searchModelVariants;
13357
13731
  exports.seedance2AudioLimitSec = seedance2AudioLimitSec;
13732
+ exports.segmentDurationsFor = segmentDurationsFor;
13358
13733
  exports.selectByModulo = selectByModulo;
13359
13734
  exports.selectByNamedKey = selectByNamedKey;
13360
13735
  exports.selectByPredicate = selectByPredicate;
@@ -13375,6 +13750,8 @@ exports.stripExportContent = stripExportContent;
13375
13750
  exports.stripTransientRuntimeData = stripTransientRuntimeData;
13376
13751
  exports.supportedDefaultDimensions = supportedDefaultDimensions;
13377
13752
  exports.supportsAdvancedMode = supportsAdvancedMode;
13753
+ exports.supportsEndAnchor = supportsEndAnchor;
13754
+ exports.supportsExtendRender = supportsExtendRender;
13378
13755
  exports.toConnectedReference = toConnectedReference;
13379
13756
  exports.toConnectedReferences = toConnectedReferences;
13380
13757
  exports.togglePick = togglePick;
@@ -13397,6 +13774,7 @@ exports.variantJobId = variantJobId;
13397
13774
  exports.videoAnalysisCreditSegment = videoAnalysisCreditSegment;
13398
13775
  exports.videoAnalysisNumWindows = videoAnalysisNumWindows;
13399
13776
  exports.videoAnalysisResultSchema = videoAnalysisResultSchema;
13777
+ exports.videoAuditCreditsForBucket = videoAuditCreditsForBucket;
13400
13778
  exports.videoModelCanSpeakDialogue = videoModelCanSpeakDialogue;
13401
13779
  exports.videoModelSupportsAudio = videoModelSupportsAudio;
13402
13780
  exports.videoProviderRequiresImage = videoProviderRequiresImage;