@nodaro/shared 3.9.0 → 3.11.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 (48) hide show
  1. package/dist/index.cjs +448 -51
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.d.cts +959 -30
  4. package/dist/index.d.ts +959 -30
  5. package/dist/index.js +410 -52
  6. package/dist/index.js.map +1 -1
  7. package/package.json +1 -1
  8. package/src/__tests__/credit-identifiers.test.ts +51 -1
  9. package/src/__tests__/gvp-supported-providers.test.ts +20 -3
  10. package/src/__tests__/model-catalog-sections.test.ts +59 -0
  11. package/src/__tests__/model-tree.test.ts +2 -2
  12. package/src/__tests__/parameter-node-value.test.ts +47 -0
  13. package/src/__tests__/pricing-default-duration.test.ts +45 -0
  14. package/src/__tests__/prompt-length-limits.test.ts +4 -0
  15. package/src/__tests__/scene3d-delivery-review.test.ts +512 -0
  16. package/src/__tests__/template-categories.test.ts +45 -0
  17. package/src/__tests__/video-analysis.test.ts +15 -0
  18. package/src/__tests__/video-frame-fit.test.ts +189 -0
  19. package/src/__tests__/video-ref-limits.test.ts +11 -2
  20. package/src/catalog-projection.ts +3 -0
  21. package/src/character-motion-metadata.ts +19 -0
  22. package/src/credit-identifiers.ts +44 -9
  23. package/src/i18n/character-motion.ar.ts +1082 -0
  24. package/src/i18n/character-motion.de.ts +1082 -0
  25. package/src/i18n/character-motion.es.ts +1082 -0
  26. package/src/i18n/character-motion.fr.ts +1082 -0
  27. package/src/i18n/character-motion.he.ts +1082 -0
  28. package/src/i18n/character-motion.hi.ts +1082 -0
  29. package/src/i18n/character-motion.ja.ts +1082 -0
  30. package/src/i18n/character-motion.ko.ts +1082 -0
  31. package/src/i18n/character-motion.pt-BR.ts +1082 -0
  32. package/src/i18n/character-motion.ru.ts +1082 -0
  33. package/src/i18n/character-motion.zh-CN.ts +1082 -0
  34. package/src/i18n/types.ts +1 -0
  35. package/src/index.ts +26 -0
  36. package/src/model-catalog.ts +49 -32
  37. package/src/model-constants.ts +50 -11
  38. package/src/node-execution-state.ts +95 -0
  39. package/src/parameter-node-value.ts +59 -0
  40. package/src/presentation-utils.ts +1 -0
  41. package/src/pro-3d-render.ts +159 -0
  42. package/src/scene3d-delivery-notes.ts +490 -0
  43. package/src/scene3d-v2-plan.ts +8 -2
  44. package/src/smart-cut-windows.ts +15 -10
  45. package/src/template-categories.ts +67 -0
  46. package/src/video-analysis.ts +15 -0
  47. package/src/video-frame-fit.ts +228 -0
  48. package/src/video-output-canvas.ts +119 -0
package/dist/index.cjs CHANGED
@@ -601,23 +601,8 @@ var IMAGE_MODELS = {
601
601
  { identifier: "ideogram-remix:QUALITY", credits: 60, note: "best quality" }
602
602
  ]
603
603
  },
604
- "ideogram-reframe": {
605
- id: "ideogram-reframe",
606
- kind: "image",
607
- modes: ["edit"],
608
- family: "Ideogram",
609
- label: "Ideogram Reframe",
610
- series: "Ideogram",
611
- description: "Outpaint / reframe to a new aspect ratio while preserving subject.",
612
- useCases: ["outpaint", "reframe"],
613
- features: ["reference-image"],
614
- aspectRatios: IDEOGRAM_RATIOS,
615
- pricing: [
616
- { identifier: "ideogram-reframe", credits: 18, note: "BALANCED default" },
617
- { identifier: "ideogram-reframe:TURBO", credits: 18, note: "fastest" },
618
- { identifier: "ideogram-reframe:QUALITY", credits: 18, note: "best quality" }
619
- ]
620
- },
604
+ // `ideogram-reframe` was retired 2026-09-15 — KIE's `ideogram/v3-reframe`
605
+ // fails every task upstream (#1331); see IDEOGRAM_PROVIDERS in model-constants.
621
606
  // ── Google Imagen ──
622
607
  "imagen4": {
623
608
  id: "imagen4",
@@ -1069,9 +1054,17 @@ var VIDEO_MODELS = {
1069
1054
  family: "Google",
1070
1055
  label: "VEO 3.1 Quality",
1071
1056
  series: "VEO",
1072
- description: "Google VEO 3.1 Quality \u2014 premium cinematic video. 4/6/8s clips, optional end frame, native audio. Flat per-generation pricing across durations.",
1057
+ description: "Google VEO 3.1 Quality \u2014 premium cinematic video. 4/6/8s clips, optional end frame, native audio. No reference-to-video mode (Fast/Lite only). Flat per-generation pricing across durations.",
1073
1058
  useCases: ["cinematic", "premium", "narrative"],
1074
- features: ["end-frame", "audio", "reference-image"],
1059
+ // NO "reference-image": KIE serves REFERENCE_2_VIDEO on the Fast and Lite
1060
+ // SKUs only. Its own words, on a production job (2026-09-04, app-reports
1061
+ // lane G): "Reference to video only supports the Veo Fast model and Veo
1062
+ // Lite model." Until 2026-09-15 this entry claimed the feature, so the
1063
+ // editor offered the reference handles, the adapter sent
1064
+ // generationType: "REFERENCE_2_VIDEO", and the call came back 422 every
1065
+ // time — after credits were reserved. `veo3.1` (KIE `veo3_fast`) and
1066
+ // `veo3_lite` DO serve it and keep the flag.
1067
+ features: ["end-frame", "audio"],
1075
1068
  durations: [4, 6, 8],
1076
1069
  aspectRatios: VIDEO_RATIOS_HV,
1077
1070
  // 720p (default) + 1080p inline. 4K generates the base at 1080p then chains
@@ -2028,7 +2021,7 @@ var VIDEO_MODELS = {
2028
2021
  id: "omnihuman-1-5",
2029
2022
  kind: "video",
2030
2023
  modes: ["lip-sync"],
2031
- family: "ByteDance",
2024
+ family: "Bytedance",
2032
2025
  label: "OmniHuman 1.5",
2033
2026
  series: "OmniHuman",
2034
2027
  description: "Premium prompt-directed talking avatar from a still image + audio. 720p / 1080p, up to 60s. People, pets, anime.",
@@ -2287,17 +2280,8 @@ var AUDIO_MODELS = {
2287
2280
  pricing: [{ identifier: "elevenlabs-dialogue", credits: 25, note: "per 1K chars" }]
2288
2281
  },
2289
2282
  // ── ElevenLabs voice utilities ──
2290
- "voice-clone": {
2291
- id: "voice-clone",
2292
- kind: "audio",
2293
- modes: ["voice-clone"],
2294
- family: "ElevenLabs",
2295
- label: "Voice Clone (Instant)",
2296
- series: "ElevenLabs",
2297
- description: "Clone a voice from a short reference clip. Instant clone via direct ElevenLabs API.",
2298
- useCases: ["voice-clone", "personalization"],
2299
- pricing: [{ identifier: "voice-clone", credits: 50 }]
2300
- },
2283
+ // (voice cloning was retired platform-wide on 2026-09-15 — no catalog entry,
2284
+ // no price, no MCP tool; existing clones still resolve as TTS voice ids.)
2301
2285
  "elevenlabs-voice-design": {
2302
2286
  id: "elevenlabs-voice-design",
2303
2287
  kind: "audio",
@@ -2353,6 +2337,17 @@ var AUDIO_MODELS = {
2353
2337
  useCases: ["dubbing", "multilingual"],
2354
2338
  pricing: [{ identifier: "elevenlabs-dubbing", credits: 40, note: "per minute of the dubbed span (min 1)" }]
2355
2339
  },
2340
+ "elevenlabs-dubbing-v2": {
2341
+ id: "elevenlabs-dubbing-v2",
2342
+ kind: "audio",
2343
+ modes: ["dubbing"],
2344
+ family: "ElevenLabs",
2345
+ label: "ElevenLabs Dubbing v2",
2346
+ series: "ElevenLabs",
2347
+ description: "Translate + dub audio or a whole video into a new language \u2014 video in, dubbed video out. Async.",
2348
+ useCases: ["dubbing", "multilingual"],
2349
+ pricing: [{ identifier: "elevenlabs-dubbing-v2", credits: 1100, note: "per minute of the dubbed span (min 1)" }]
2350
+ },
2356
2351
  "elevenlabs-forced-alignment": {
2357
2352
  id: "elevenlabs-forced-alignment",
2358
2353
  kind: "audio",
@@ -2475,6 +2470,10 @@ function groupByFamily(entries) {
2475
2470
  }
2476
2471
  return Array.from(groups.entries()).map(([family, models]) => ({ family, models }));
2477
2472
  }
2473
+ var MODEL_KINDS = ["image", "video", "audio"];
2474
+ function groupByKindAndFamily(entries) {
2475
+ return MODEL_KINDS.map((kind) => ({ kind, families: groupByFamily(entries.filter((m) => m.kind === kind)) })).filter((section) => section.families.length > 0);
2476
+ }
2478
2477
  function getModel(id) {
2479
2478
  return MODEL_CATALOG[id];
2480
2479
  }
@@ -2915,16 +2914,23 @@ var MAX_IMAGE_PROMPT_CHARS_BY_PROVIDER = {
2915
2914
  // docs.kie.ai/market/seedream-5-lite-image-to-image (NB: t2i sibling is 1000)
2916
2915
  "qwen": 3e3,
2917
2916
  // docs.kie.ai/market/qwen/text-to-image
2918
- "qwen-edit": 2e3
2917
+ "qwen-edit": 2e3,
2919
2918
  // docs.kie.ai/market/qwen/image-edit
2919
+ // Z-Image is the SHORTEST of the family — "maxLength: 1000" in its schema
2920
+ // (docs.kie.ai/market/z-image/z-image, re-fetched 2026-09-15). It was listed
2921
+ // below as "verified == 5000", which is how three production runs on
2922
+ // 2026-09-07 sent a workflow-assembled prompt straight into KIE's
2923
+ // `{"code":500,"msg":"The text length cannot exceed the maximum limit"}`.
2924
+ "z-image": 1e3
2925
+ // docs.kie.ai/market/z-image/z-image
2920
2926
  // verified == 5000 default (no entry needed): imagen4(-fast/-ultra), nano-banana,
2921
2927
  // nano-banana-edit, flux, flux-flex, gpt-image-2, ideogram-v3/-edit/-remix,
2922
- // z-image, grok, qwen-i2i, seedream-5-pro, seedream-5-pro-i2i
2928
+ // grok, qwen-i2i, seedream-5-pro, seedream-5-pro-i2i
2923
2929
  // (docs.kie.ai/market/seedream/5-pro-text-to-image + 5-pro-image-to-image).
2924
2930
  // grok-i2i: doc states 390000 (78× its t2i sibling) — treated as a KIE schema
2925
2931
  // typo and left at the 5000 default per the sanity-cap decision.
2926
2932
  // UNVERIFIED (no limit stated in schema) → 5000 default: flux-kontext(-max)
2927
- // gpt-image, gpt-image-i2i, flux-i2i, flux-pro-i2i, ideogram-reframe.
2933
+ // gpt-image, gpt-image-i2i, flux-i2i, flux-pro-i2i.
2928
2934
  };
2929
2935
  function getMaxImagePromptChars(provider) {
2930
2936
  return provider && MAX_IMAGE_PROMPT_CHARS_BY_PROVIDER[provider] || IMAGE_PROMPT_MAX;
@@ -3118,7 +3124,6 @@ var MODELS_WITH_REFERENCE_IMAGE_SUPPORT = /* @__PURE__ */ new Set([
3118
3124
  "flux-kontext-max",
3119
3125
  "ideogram-edit",
3120
3126
  "ideogram-remix",
3121
- "ideogram-reframe",
3122
3127
  "qwen-i2i",
3123
3128
  "qwen-edit",
3124
3129
  "seedream-edit",
@@ -3179,7 +3184,6 @@ var REF_IMAGE_MAX_LIMITS = {
3179
3184
  "flux-kontext-max": 1,
3180
3185
  "ideogram-edit": 1,
3181
3186
  "ideogram-remix": 1,
3182
- "ideogram-reframe": 1,
3183
3187
  "qwen-i2i": 1,
3184
3188
  "qwen-edit": 1,
3185
3189
  "grok-i2i": 1,
@@ -3224,7 +3228,6 @@ var VARIABLE_PRICING_MODELS = {
3224
3228
  "topaz-image-upscale": "resolution",
3225
3229
  "ideogram-edit": "rendering-speed",
3226
3230
  "ideogram-remix": "rendering-speed",
3227
- "ideogram-reframe": "rendering-speed",
3228
3231
  "ideogram-v3": "rendering-speed",
3229
3232
  "wan-2.7": "resolution",
3230
3233
  "wan-2.7-pro": "resolution"
@@ -3242,7 +3245,7 @@ var RESOLUTION_2K_4K_TIERED_PROVIDERS = /* @__PURE__ */ new Set([
3242
3245
  "wan-2.7",
3243
3246
  "wan-2.7-pro"
3244
3247
  ]);
3245
- var IDEOGRAM_PROVIDERS = /* @__PURE__ */ new Set(["ideogram-edit", "ideogram-remix", "ideogram-reframe", "ideogram-v3"]);
3248
+ var IDEOGRAM_PROVIDERS = /* @__PURE__ */ new Set(["ideogram-edit", "ideogram-remix", "ideogram-v3"]);
3246
3249
  var IMAGE_GEN_PROVIDERS = [
3247
3250
  "nano-banana",
3248
3251
  "flux",
@@ -3289,7 +3292,6 @@ var IMAGE_I2I_PROVIDERS = [
3289
3292
  "grok-2-i2i",
3290
3293
  "ideogram-edit",
3291
3294
  "ideogram-remix",
3292
- "ideogram-reframe",
3293
3295
  "qwen-i2i",
3294
3296
  "qwen-edit",
3295
3297
  "seedream-edit",
@@ -3683,7 +3685,6 @@ var I2I_STRENGTH_SUPPORT = {
3683
3685
  };
3684
3686
  var SEED_SUPPORT = /* @__PURE__ */ new Set([
3685
3687
  "ideogram-remix",
3686
- "ideogram-reframe",
3687
3688
  "ideogram-v3",
3688
3689
  "qwen",
3689
3690
  "qwen-i2i",
@@ -3699,7 +3700,6 @@ var SEED_SUPPORT = /* @__PURE__ */ new Set([
3699
3700
  ]);
3700
3701
  var RENDERING_SPEED_SUPPORT = /* @__PURE__ */ new Set([
3701
3702
  "ideogram-remix",
3702
- "ideogram-reframe",
3703
3703
  "ideogram-v3"
3704
3704
  ]);
3705
3705
  var GUIDANCE_SCALE_SUPPORT = {
@@ -3960,8 +3960,13 @@ var VIDEO_REF_LIMITS_BY_PROVIDER = {
3960
3960
  // backend kie/models.ts maxRefImages: 7
3961
3961
  "happyhorse-ref2v": { images: 9 },
3962
3962
  // backend kie/models.ts maxRefImages: 9
3963
- // VEO 3.x — REFERENCE_2_VIDEO path caps refs at 3 (kie/video.ts slice(0, 3)).
3964
- "veo3": { images: 3 },
3963
+ // VEO 3.x — REFERENCE_2_VIDEO path caps refs at 3 (kie/video.ts slices to
3964
+ // this number). `veo3` (VEO 3.1 QUALITY) is deliberately ABSENT: KIE serves
3965
+ // reference-to-video on the Fast and Lite SKUs only and rejects it on
3966
+ // Quality with "Reference to video only supports the Veo Fast model and Veo
3967
+ // Lite model." (production, 2026-09-04). Absent ⇒ 0 ⇒ the handle dims, the
3968
+ // `connectedReferences` assembly strips image tokens, and kie/video.ts never
3969
+ // flips a Quality call to REFERENCE_2_VIDEO.
3965
3970
  "veo3.1": { images: 3 },
3966
3971
  "veo3_lite": { images: 3 }
3967
3972
  // NOTE: wan-i2v / hailuo-2.3[-pro] / bytedance-pro[-fast] / grok-imagine-video-1.5
@@ -4189,8 +4194,23 @@ var VIDEO_VARIABLE_PRICING = {
4189
4194
  "wan-3-prime": "duration+resolution"
4190
4195
  };
4191
4196
  var PRICING_DEFAULT_DURATION_SEC = {
4192
- "minimax-h3": 6
4197
+ "minimax-h3": 6,
4198
+ // KIE renders 8s when `duration` is omitted (kie/models.ts extraParams), and
4199
+ // Seedance 2.5 prices one tier per second across 4–30s, so the 5s fallback
4200
+ // billed a 5s tier against an 8s render — and under-reserved every
4201
+ // reference-video run's output seconds by three (#1397).
4202
+ "seedance-2-5": 8,
4203
+ // Same shape: KIE renders 8s by default and the ladder is priced per second,
4204
+ // so the 5s fallback billed a 5s tier against an 8s render (caught by the
4205
+ // render-default ↔ priced-tier invariant in
4206
+ // backend/src/providers/__tests__/pricing-default-duration-sync.test.ts).
4207
+ "grok-imagine-video-1.5": 8
4193
4208
  };
4209
+ function pricedOutputDurationSec(provider, requested) {
4210
+ const fallback = PRICING_DEFAULT_DURATION_SEC[provider] ?? 5;
4211
+ const parsed = typeof requested === "string" ? parseInt(requested, 10) : requested;
4212
+ return parsed === void 0 || Number.isNaN(parsed) ? fallback : parsed;
4213
+ }
4194
4214
  var PRICING_DEFAULT_RESOLUTION = {
4195
4215
  // KIE renders 720p when `resolution` is omitted (kie/models.ts extraParams).
4196
4216
  "seedance-2-5": "720p",
@@ -4882,10 +4902,16 @@ function expandExtraRefsToConnectedReferences(extras, lookupCharacterContext) {
4882
4902
  }
4883
4903
 
4884
4904
  // src/credit-identifiers.ts
4905
+ function flux2MegapixelTier(model, resolution) {
4906
+ const bare = (v) => v.replace(/\s*MP$/i, "").trim();
4907
+ const raw = typeof resolution === "string" ? bare(resolution) : "";
4908
+ if (raw === "") return "1";
4909
+ const tier = FLUX2_RES_MP.find((t2) => Number(t2) === Number(raw));
4910
+ return tier ?? bare(defaultResolutionFor(model) ?? "1 MP");
4911
+ }
4885
4912
  function buildCreditModelIdentifier(provider, quality, resolution, renderingSpeed, targetResolution, referenceImageCount) {
4886
4913
  if (isFlux2Model(provider)) {
4887
- const mp = (resolution ?? "1 MP").replace(/\s*MP$/i, "").trim();
4888
- return `${provider}:${mp}MP:${Math.min(referenceImageCount ?? 0, 8)}ref`;
4914
+ return `${provider}:${flux2MegapixelTier(provider, resolution)}MP:${Math.min(referenceImageCount ?? 0, 8)}ref`;
4889
4915
  }
4890
4916
  if (HIGH_QUALITY_PROVIDERS.has(provider) && quality === "high") {
4891
4917
  return `${provider}:high`;
@@ -4991,9 +5017,7 @@ function buildVideoCreditModelIdentifier(provider, duration, sound, nodeType, mo
4991
5017
  if (!DURATION_PRICED_PROVIDERS.has(effectiveProvider)) {
4992
5018
  return effectiveProvider;
4993
5019
  }
4994
- const durationFallback = PRICING_DEFAULT_DURATION_SEC[effectiveProvider] ?? 5;
4995
- const parsed = typeof duration === "string" ? parseInt(duration, 10) : duration ?? durationFallback;
4996
- const durationSec = Number.isNaN(parsed) ? durationFallback : parsed;
5020
+ const durationSec = pricedOutputDurationSec(effectiveProvider, duration);
4997
5021
  const tiers = VIDEO_DURATION_TIERS[effectiveProvider];
4998
5022
  if (!tiers) return effectiveProvider;
4999
5023
  const tier = tiers.find((t2) => durationSec <= t2.maxSeconds) ?? tiers[tiers.length - 1];
@@ -5713,6 +5737,7 @@ var INPUT_FIELD_MAP = {
5713
5737
  "post-process-effects": { key: "postProcess", type: "select" },
5714
5738
  "action-fx": { key: "actionFx", type: "select" },
5715
5739
  "character-fx": { key: "characterFx", type: "select" },
5740
+ "character-motion": { key: "characterMotion", type: "select" },
5716
5741
  "transition": { key: "transition", type: "select" },
5717
5742
  "loop-subject": { key: "loopSubject", type: "select" },
5718
5743
  // --- Multi-dimension pickers: representative (first) field. Overriding only
@@ -8191,6 +8216,7 @@ var PARAMETER_NODE_TYPES = /* @__PURE__ */ new Set([
8191
8216
  "post-process-effects",
8192
8217
  "action-fx",
8193
8218
  "character-fx",
8219
+ "character-motion",
8194
8220
  "transition",
8195
8221
  "loop-subject",
8196
8222
  "scene-count",
@@ -8208,6 +8234,19 @@ var HINT_EXEMPT_PARAMETER_TYPES = /* @__PURE__ */ new Set([
8208
8234
  "duration",
8209
8235
  "aspect-ratio"
8210
8236
  ]);
8237
+ var VIDEO_ONLY_PARAMETER_NODE_TYPES = /* @__PURE__ */ new Set([
8238
+ "camera-motion",
8239
+ "temporal",
8240
+ "transition",
8241
+ "character-fx",
8242
+ "character-motion"
8243
+ ]);
8244
+ var EXECUTION_GRAPH_COMPOSED_PARAMETER_TYPES = /* @__PURE__ */ new Set([
8245
+ "camera-motion",
8246
+ "character-motion",
8247
+ "transition",
8248
+ "character-fx"
8249
+ ]);
8211
8250
  var registeredPersonPackFields = [];
8212
8251
  function setRegisteredPersonPackFields(fields) {
8213
8252
  registeredPersonPackFields = [...fields];
@@ -8250,6 +8289,8 @@ function getParameterValue(data, nodeType) {
8250
8289
  return trim(data.actionFx);
8251
8290
  case "character-fx":
8252
8291
  return trim(data.characterFx);
8292
+ case "character-motion":
8293
+ return trim(data.characterMotion);
8253
8294
  case "transition":
8254
8295
  return trim(data.transition);
8255
8296
  case "style":
@@ -13387,6 +13428,12 @@ var VOICE_CHANGER_MODEL_IDS = VOICE_CHANGER_MODELS.map(
13387
13428
  );
13388
13429
  var DEFAULT_VOICE_CHANGER_MODEL = "eleven_multilingual_sts_v2";
13389
13430
 
13431
+ // src/node-execution-state.ts
13432
+ var OUTPUT_BEARING_NODE_STATUSES = /* @__PURE__ */ new Set(["completed", "failed"]);
13433
+ function nodeStateMayCarryOutput(status) {
13434
+ return status !== void 0 && OUTPUT_BEARING_NODE_STATUSES.has(status);
13435
+ }
13436
+
13390
13437
  // src/normalize-node-params.ts
13391
13438
  var MODEL_PARAM_NODE_TYPES = /* @__PURE__ */ new Set([
13392
13439
  "generate-image",
@@ -14034,6 +14081,45 @@ function buildBoardPrompt(templateId, ctx) {
14034
14081
  return tpl.build(ctx);
14035
14082
  }
14036
14083
 
14084
+ // src/template-categories.ts
14085
+ var TEMPLATE_CATEGORIES = [
14086
+ "product-imagery",
14087
+ "static-ads",
14088
+ "user-generated-content",
14089
+ "video-ads",
14090
+ "brand-assets",
14091
+ "automations",
14092
+ "campaign-concepts",
14093
+ "social-creatives"
14094
+ ];
14095
+ var DEFAULT_TEMPLATE_CATEGORY = "automations";
14096
+ var LEGACY_TEMPLATE_CATEGORIES = {
14097
+ "image-generation": "product-imagery",
14098
+ "video-production": "video-ads",
14099
+ "audio-music": "social-creatives",
14100
+ "content-writing": "campaign-concepts",
14101
+ "social-media": "social-creatives",
14102
+ "data-processing": "automations",
14103
+ "multi-step": "automations",
14104
+ other: "automations"
14105
+ };
14106
+ var CURRENT = new Set(TEMPLATE_CATEGORIES);
14107
+ function isTemplateCategory(value) {
14108
+ return typeof value === "string" && CURRENT.has(value);
14109
+ }
14110
+ function resolveTemplateCategory(value) {
14111
+ if (value == null) return void 0;
14112
+ if (isTemplateCategory(value)) return value;
14113
+ return LEGACY_TEMPLATE_CATEGORIES[value];
14114
+ }
14115
+ function normalizeTemplateCategory(value) {
14116
+ return resolveTemplateCategory(value) ?? DEFAULT_TEMPLATE_CATEGORY;
14117
+ }
14118
+ function templateCategoryStoredValues(category) {
14119
+ const legacy = Object.keys(LEGACY_TEMPLATE_CATEGORIES).filter((value) => LEGACY_TEMPLATE_CATEGORIES[value] === category);
14120
+ return [category, ...legacy];
14121
+ }
14122
+
14037
14123
  // src/model-tree.ts
14038
14124
  var ENUM_TARGETS = [
14039
14125
  [IMAGE_GEN_PROVIDERS, "generate-image"],
@@ -14605,7 +14691,21 @@ var entitySlotSchema = zod.z.object({
14605
14691
  */
14606
14692
  refRejectedReason: zod.z.string().optional(),
14607
14693
  /** NON-default looks only; present only when at least one exists. */
14608
- variations: zod.z.array(slotVariationSchema).max(VIDEO_ANALYSIS_MAX_VARIATIONS).optional()
14694
+ variations: zod.z.array(slotVariationSchema).max(VIDEO_ANALYSIS_MAX_VARIATIONS).optional(),
14695
+ /**
14696
+ * WHOSE THIS OBJECT IS (2026-09-17). An object slot that is worn, held,
14697
+ * carried, driven or ridden by a cast person or creature names that slot
14698
+ * here, with the relation as a short passive phrase ending in "by" ("worn
14699
+ * by", "held by", "driven by"). The link says the object slot IS the one on
14700
+ * that person — not a second one: a recast that saw "Man in Blue Silk
14701
+ * Shirt" AND "Blue Silk Shirt" as unrelated slots rendered two shirts.
14702
+ * Object slots only; a free-standing prop, the product on a table, a place
14703
+ * or a person never carries it. Optional/additive: producers may omit it.
14704
+ */
14705
+ owner: zod.z.object({
14706
+ slotId: zod.z.string().min(1).regex(/^[a-z0-9-]+$/),
14707
+ relation: zod.z.string().min(1)
14708
+ }).optional()
14609
14709
  });
14610
14710
  var VIDEO_ANALYSIS_AUDIO_MODES = ["speech", "music", "sfx", "ambience"];
14611
14711
  var audioLayerSchema = zod.z.object({
@@ -16837,6 +16937,56 @@ function parseScene3DCameraTrackJson(text) {
16837
16937
  }
16838
16938
  return { ok: true, value: parsed.data };
16839
16939
  }
16940
+
16941
+ // src/scene3d-delivery-notes.ts
16942
+ var SCENE3D_AUTHORING_ASSUMPTION_CODE = "SCENE_AUTHORING_ASSUMPTION";
16943
+ var SCENE3D_REVIEW_REFUSED_CODE = "SCENE_REVIEW_REFUSED";
16944
+ var SCENE3D_REVIEW_UNAVAILABLE_CODE = "SCENE_REVIEW_UNAVAILABLE";
16945
+ var SCENE3D_REMEDY_AUTO_APPLIED_CODE = "REMEDY_AUTO_APPLIED";
16946
+ var SCENE3D_ASSERTION_RESTORED_CODE = "ASSERTION_RESTORED";
16947
+ var SCENE3D_REVIEW_UNAVAILABLE_REASONS = ["provider", "unusable"];
16948
+ function isScene3DReviewUnavailableReason(value) {
16949
+ return SCENE3D_REVIEW_UNAVAILABLE_REASONS.includes(value);
16950
+ }
16951
+ function scene3DReviewVerdictOf(output) {
16952
+ const review = output?.metadata?.review;
16953
+ if (typeof review !== "object" || review === null) return void 0;
16954
+ const candidate = review;
16955
+ if (candidate.verdict !== "refused" && candidate.verdict !== "unavailable") return void 0;
16956
+ const objections = (Array.isArray(candidate.objections) ? candidate.objections : []).flatMap((entry) => {
16957
+ if (typeof entry !== "object" || entry === null) return [];
16958
+ const objection = entry;
16959
+ if (typeof objection.what !== "string" || !objection.what) return [];
16960
+ const frames = (Array.isArray(objection.frames) ? objection.frames : []).filter((frame) => Number.isSafeInteger(frame) && frame >= 0);
16961
+ return [{
16962
+ category: typeof objection.category === "string" && objection.category ? objection.category : "unsupported",
16963
+ what: objection.what,
16964
+ ...typeof objection.correction === "string" && objection.correction ? { correction: objection.correction } : {},
16965
+ frames
16966
+ }];
16967
+ });
16968
+ const findings = {
16969
+ objections,
16970
+ ...typeof candidate.observed === "string" && candidate.observed ? { observed: candidate.observed } : {}
16971
+ };
16972
+ if (candidate.verdict === "refused") return { verdict: "refused", ...findings };
16973
+ const attempts = typeof candidate.attempts === "number" && Number.isSafeInteger(candidate.attempts) && candidate.attempts > 0 ? candidate.attempts : 1;
16974
+ const reason = isScene3DReviewUnavailableReason(candidate.reason) ? candidate.reason : "provider";
16975
+ return { verdict: "unavailable", reason, attempts, ...findings };
16976
+ }
16977
+ function scene3DReviewNote(verdict) {
16978
+ if (verdict.verdict === "unavailable") {
16979
+ const asked = verdict.attempts === 1 ? "one attempt" : `${verdict.attempts} attempts`;
16980
+ const partial = verdict.objections.length ? ` Part of the review did answer first, and its ${verdict.objections.length === 1 ? "one finding is" : `${verdict.objections.length} findings are`} listed \u2014 but they are not the whole verdict.` : "";
16981
+ const missing = verdict.reason === "unusable" ? `returned no usable verdict in ${asked}` : `did not reach its provider in ${asked}`;
16982
+ return `The scene built and every mandatory assertion passed, but the visual review ${missing}; it was delivered unreviewed.${partial}`;
16983
+ }
16984
+ const count = verdict.objections.length;
16985
+ if (!count) {
16986
+ return "The visual review refused this scene without naming anything to change; it was delivered anyway because every mandatory assertion passed.";
16987
+ }
16988
+ return `The visual review refused this scene on ${count === 1 ? "one finding" : `${count} findings`}; it was delivered anyway because every mandatory assertion passed.`;
16989
+ }
16840
16990
  var scene3DInputAssetSchema = zod.z.object({
16841
16991
  id: zod.z.string().regex(/^[A-Za-z0-9][A-Za-z0-9_.:-]{0,63}$/),
16842
16992
  revisionId: zod.z.uuid(),
@@ -16907,6 +17057,26 @@ var pro3DRenderQuoteSchema = zod.z.object({
16907
17057
  function isPro3DRenderQuote(value) {
16908
17058
  return pro3DRenderQuoteSchema.safeParse(value).success;
16909
17059
  }
17060
+ var pro3DRenderReviewFindingsShape = {
17061
+ objections: zod.z.array(
17062
+ zod.z.object({
17063
+ category: zod.z.string(),
17064
+ what: zod.z.string(),
17065
+ correction: zod.z.string().optional(),
17066
+ frames: zod.z.array(zod.z.number().int().min(0)).default([])
17067
+ }).passthrough()
17068
+ ),
17069
+ observed: zod.z.string().optional()
17070
+ };
17071
+ var pro3DRenderReviewVerdictSchema = zod.z.union([
17072
+ zod.z.object({ verdict: zod.z.literal("refused"), ...pro3DRenderReviewFindingsShape }).passthrough(),
17073
+ zod.z.object({
17074
+ verdict: zod.z.literal("unavailable"),
17075
+ reason: zod.z.enum(SCENE3D_REVIEW_UNAVAILABLE_REASONS).catch("provider"),
17076
+ attempts: zod.z.number().int().min(1).catch(1),
17077
+ ...pro3DRenderReviewFindingsShape
17078
+ }).passthrough()
17079
+ ]);
16910
17080
  var pro3DRenderShotStillSchema = zod.z.object({
16911
17081
  shotIndex: zod.z.number().int().min(0),
16912
17082
  frame: zod.z.number().int().min(0),
@@ -16937,8 +17107,34 @@ var pro3DRenderJobOutputSchema = zod.z.object({
16937
17107
  height: zod.z.number().int().positive(),
16938
17108
  fps: zod.z.number().positive(),
16939
17109
  frames: zod.z.number().int().positive(),
16940
- duration: zod.z.number().positive()
17110
+ duration: zod.z.number().positive(),
17111
+ summary: zod.z.string().optional(),
17112
+ /**
17113
+ * Degrades to absent rather than refusing the RESULT, which is the whole lesson of the
17114
+ * verdict this round added. A narrow `verdict` here did not merely mis-read an unreviewed
17115
+ * delivery — it failed `isPro3DRenderJobOutput` for the entire job, blanking a real,
17116
+ * paid, playable MP4 over an advisory field. A verdict a future engine invents must cost
17117
+ * at most itself; the `SCENE_REVIEW_*` entry in `validation.warnings[]` still arrives
17118
+ * either way, because that array has no code enum.
17119
+ */
17120
+ review: pro3DRenderReviewVerdictSchema.optional().catch(void 0)
16941
17121
  }).passthrough(),
17122
+ repairPasses: zod.z.number().int().min(0).optional(),
17123
+ admissionRetries: zod.z.number().int().min(0).optional(),
17124
+ mechanicalPasses: zod.z.number().int().min(0).optional(),
17125
+ // Tolerant like the review verdict above, and for the same reason: this rides a result that
17126
+ // already has a real MP4, so a malformed entry must never blank a video the platform rendered
17127
+ // and charged for. The identity fields are required because an entry without them names
17128
+ // nothing; `value` is unknown because a restored assertion holds whatever it holds.
17129
+ restoredAssertions: zod.z.array(
17130
+ zod.z.object({
17131
+ op: zod.z.string(),
17132
+ path: zod.z.string(),
17133
+ value: zod.z.unknown().optional(),
17134
+ assertionId: zod.z.string(),
17135
+ reason: zod.z.string()
17136
+ }).passthrough()
17137
+ ).optional(),
16942
17138
  changeSummary: zod.z.string().optional()
16943
17139
  }).passthrough();
16944
17140
  function isPro3DRenderJobOutput(value) {
@@ -17315,6 +17511,168 @@ function unavailable(engine) {
17315
17511
  }
17316
17512
  var SCENE3D_BASIC_SCHEMA_VERSION = SCENE3D_SCHEMA_VERSION;
17317
17513
 
17514
+ // src/video-output-canvas.ts
17515
+ var VIDEO_OUTPUT_CANVAS = {
17516
+ "seedance-2-5": {
17517
+ "480p": { "16:9": [854, 480], "9:16": [480, 854] },
17518
+ "720p": { "16:9": [1280, 720], "9:16": [720, 1280], "1:1": [960, 960] },
17519
+ "1080p": { "16:9": [1920, 1080] }
17520
+ },
17521
+ // The 2.0 family is NOT the same as 2.5 at 480p — 864x496 vs 854x480.
17522
+ "seedance-2": {
17523
+ "480p": { "16:9": [864, 496], "9:16": [496, 864] },
17524
+ "720p": { "16:9": [1280, 720], "9:16": [720, 1280] }
17525
+ },
17526
+ "seedance-2-fast": {
17527
+ "480p": { "16:9": [864, 496], "9:16": [496, 864] },
17528
+ "720p": { "16:9": [1280, 720], "9:16": [720, 1280] }
17529
+ },
17530
+ "seedance-2-mini": {
17531
+ "480p": { "16:9": [864, 496], "9:16": [496, 864] },
17532
+ "720p": { "16:9": [1280, 720], "9:16": [720, 1280] }
17533
+ },
17534
+ "gemini-omni-video": {
17535
+ "720p": { "16:9": [1280, 720], "9:16": [720, 1280] },
17536
+ "1080p": { "16:9": [1920, 1080] }
17537
+ },
17538
+ "gemini-omni-flash": {
17539
+ "720p": { "16:9": [1280, 720], "9:16": [720, 1280] }
17540
+ },
17541
+ "veo3.1": {
17542
+ "720p": { "9:16": [720, 1280] },
17543
+ "1080p": { "16:9": [1920, 1080] }
17544
+ },
17545
+ "wan-3": {
17546
+ "480p": { "16:9": [832, 480] },
17547
+ "720p": { "16:9": [1280, 720], "9:16": [720, 1280] }
17548
+ },
17549
+ "wan-3-prime": {
17550
+ "720p": { "16:9": [1280, 720] }
17551
+ },
17552
+ // 768P's "9:16" is 0.5714, not 0.5625 — the single clearest reason this table
17553
+ // exists.
17554
+ "minimax-h3": {
17555
+ "768p": { "9:16": [768, 1344] },
17556
+ "2k": { "16:9": [2560, 1440], "9:16": [1440, 2560] }
17557
+ },
17558
+ seedance: {
17559
+ "1080p": {
17560
+ "16:9": [1920, 1080],
17561
+ "9:16": [1080, 1920],
17562
+ "1:1": [1440, 1440],
17563
+ "3:4": [1248, 1664]
17564
+ }
17565
+ }
17566
+ };
17567
+ function resolveOutputCanvas(provider, resolution, aspect) {
17568
+ if (!provider || !resolution || !aspect) return void 0;
17569
+ return VIDEO_OUTPUT_CANVAS[provider]?.[resolution.toLowerCase()]?.[aspect];
17570
+ }
17571
+ function measuredCanvasCombinations() {
17572
+ const out = [];
17573
+ for (const [provider, byResolution] of Object.entries(VIDEO_OUTPUT_CANVAS)) {
17574
+ for (const [resolution, byAspect] of Object.entries(byResolution)) {
17575
+ for (const [aspect, canvas] of Object.entries(byAspect)) {
17576
+ out.push({ provider, resolution, aspect, canvas });
17577
+ }
17578
+ }
17579
+ }
17580
+ return out;
17581
+ }
17582
+
17583
+ // src/video-frame-fit.ts
17584
+ var FRAME_FITS = ["original", "ratio", "resolution"];
17585
+ var DEFAULT_FRAME_FIT = "resolution";
17586
+ var FRAME_DELIVERIES = ["auto", "frame", "reference"];
17587
+ var DEFAULT_FRAME_DELIVERY = "auto";
17588
+ var FRAME_FIT_STRETCH_TOLERANCE = 0.05;
17589
+ var FRAME_DELIVERY_BY_PROVIDER = {
17590
+ "seedance-2": "reference",
17591
+ "seedance-2-fast": "reference",
17592
+ "seedance-2-mini": "reference"
17593
+ };
17594
+ var OPEN_ASPECT_TOKENS = /* @__PURE__ */ new Set(["adaptive", "auto"]);
17595
+ function parseAspectToken(token) {
17596
+ if (!token) return void 0;
17597
+ const m = /^(\d+(?:\.\d+)?)\s*[:x/]\s*(\d+(?:\.\d+)?)$/.exec(token.trim());
17598
+ if (!m) return void 0;
17599
+ const w = Number(m[1]);
17600
+ const h = Number(m[2]);
17601
+ if (!(w > 0) || !(h > 0)) return void 0;
17602
+ return w / h;
17603
+ }
17604
+ function resolveFrameFitAspect(args) {
17605
+ const requested = args.requestedAspect?.trim();
17606
+ if (requested && !OPEN_ASPECT_TOKENS.has(requested.toLowerCase())) return requested;
17607
+ const ratios = args.provider ? getModel(args.provider)?.aspectRatios : void 0;
17608
+ if (!ratios?.length || !(args.sourceWidth > 0) || !(args.sourceHeight > 0)) return void 0;
17609
+ const source = args.sourceWidth / args.sourceHeight;
17610
+ let best;
17611
+ for (const token of ratios) {
17612
+ const value = parseAspectToken(token);
17613
+ if (value === void 0) continue;
17614
+ const gap = Math.abs(Math.log(value / source));
17615
+ if (!best || gap < best.gap) best = { token, gap };
17616
+ }
17617
+ return best?.token;
17618
+ }
17619
+ function even(value) {
17620
+ return Math.max(2, Math.round(value / 2) * 2);
17621
+ }
17622
+ function minimalRatioDimensions(width, height, aspect) {
17623
+ const current = width / height;
17624
+ if (current > aspect) {
17625
+ return { width: even(width), height: even(width / aspect) };
17626
+ }
17627
+ return { width: even(height * aspect), height: even(height) };
17628
+ }
17629
+ function centreCropToAspect(width, height, aspect) {
17630
+ const current = width / height;
17631
+ if (current > aspect) {
17632
+ const w = even(height * aspect);
17633
+ return { left: Math.max(0, Math.round((width - w) / 2)), top: 0, width: Math.min(width, w), height };
17634
+ }
17635
+ const h = even(width / aspect);
17636
+ return { left: 0, top: Math.max(0, Math.round((height - h) / 2)), width, height: Math.min(height, h) };
17637
+ }
17638
+ function computeFrameFitPlan(args) {
17639
+ const { fit, sourceWidth, sourceHeight } = args;
17640
+ if (fit === "original") return null;
17641
+ if (!(sourceWidth > 0) || !(sourceHeight > 0)) return null;
17642
+ const aspectToken = resolveFrameFitAspect({
17643
+ provider: args.provider,
17644
+ requestedAspect: args.aspect,
17645
+ sourceWidth,
17646
+ sourceHeight
17647
+ });
17648
+ const canvas = fit === "resolution" ? args.canvas ?? resolveOutputCanvas(args.provider, args.resolution, aspectToken) : void 0;
17649
+ const targetAspect = canvas ? canvas[0] / canvas[1] : parseAspectToken(aspectToken);
17650
+ if (targetAspect === void 0 || !(targetAspect > 0)) return null;
17651
+ const sourceAspect = sourceWidth / sourceHeight;
17652
+ const gap = Math.abs(sourceAspect - targetAspect) / targetAspect;
17653
+ const tolerance = args.tolerance ?? FRAME_FIT_STRETCH_TOLERANCE;
17654
+ const crop = gap > tolerance ? centreCropToAspect(sourceWidth, sourceHeight, targetAspect) : void 0;
17655
+ const target = canvas ? { width: canvas[0], height: canvas[1] } : minimalRatioDimensions(
17656
+ crop ? crop.width : sourceWidth,
17657
+ crop ? crop.height : sourceHeight,
17658
+ targetAspect
17659
+ );
17660
+ const unchanged = target.width === sourceWidth && target.height === sourceHeight && !crop;
17661
+ if (unchanged) return null;
17662
+ return {
17663
+ width: target.width,
17664
+ height: target.height,
17665
+ ...crop ? { crop } : {},
17666
+ reason: canvas ? "resolution" : "ratio"
17667
+ };
17668
+ }
17669
+ function resolveFrameDelivery(args) {
17670
+ const requested = args.requested ?? DEFAULT_FRAME_DELIVERY;
17671
+ const wanted = requested === "auto" ? args.provider ? FRAME_DELIVERY_BY_PROVIDER[args.provider] ?? "frame" : "frame" : requested;
17672
+ if (wanted === "reference" && !args.supportsReferenceImages) return "frame";
17673
+ return wanted;
17674
+ }
17675
+
17318
17676
  exports.ACCESS_LEVELS = ACCESS_LEVELS;
17319
17677
  exports.ACTIVE_SCENE_HELPERS = ACTIVE_SCENE_HELPERS;
17320
17678
  exports.ADVANCED_MODE_UNAVAILABLE_REASON = ADVANCED_MODE_UNAVAILABLE_REASON;
@@ -17402,6 +17760,8 @@ exports.DEFAULT_CARRIED_FRACTION = DEFAULT_CARRIED_FRACTION;
17402
17760
  exports.DEFAULT_CHARACTER_ANGLE_COUNT = DEFAULT_CHARACTER_ANGLE_COUNT;
17403
17761
  exports.DEFAULT_CHARACTER_EXPRESSION_COUNT = DEFAULT_CHARACTER_EXPRESSION_COUNT;
17404
17762
  exports.DEFAULT_CHARACTER_FACET = DEFAULT_CHARACTER_FACET;
17763
+ exports.DEFAULT_FRAME_DELIVERY = DEFAULT_FRAME_DELIVERY;
17764
+ exports.DEFAULT_FRAME_FIT = DEFAULT_FRAME_FIT;
17405
17765
  exports.DEFAULT_LABEL_BY_SOURCE = DEFAULT_LABEL_BY_SOURCE;
17406
17766
  exports.DEFAULT_LOCATION_USAGE_MODE = DEFAULT_LOCATION_USAGE_MODE;
17407
17767
  exports.DEFAULT_OVERLAY_QR = DEFAULT_OVERLAY_QR;
@@ -17411,6 +17771,7 @@ exports.DEFAULT_PANEL_COUNT = DEFAULT_PANEL_COUNT;
17411
17771
  exports.DEFAULT_REF_IMAGE_MAX = DEFAULT_REF_IMAGE_MAX;
17412
17772
  exports.DEFAULT_SECTIONS = DEFAULT_SECTIONS;
17413
17773
  exports.DEFAULT_SUNO_MODEL = DEFAULT_SUNO_MODEL;
17774
+ exports.DEFAULT_TEMPLATE_CATEGORY = DEFAULT_TEMPLATE_CATEGORY;
17414
17775
  exports.DEFAULT_USAGE_MODE = DEFAULT_USAGE_MODE;
17415
17776
  exports.DEFAULT_VIDEO_ANALYSIS_MODEL = DEFAULT_VIDEO_ANALYSIS_MODEL;
17416
17777
  exports.DEFAULT_VIDEO_ANALYSIS_TIER = DEFAULT_VIDEO_ANALYSIS_TIER;
@@ -17439,6 +17800,7 @@ exports.ENTITY_TABLE = ENTITY_TABLE;
17439
17800
  exports.ENTITY_TOOL_RETRY_CAP = ENTITY_TOOL_RETRY_CAP;
17440
17801
  exports.ENTITY_TYPES = ENTITY_TYPES;
17441
17802
  exports.EXECUTION_DATA_KEYS = EXECUTION_DATA_KEYS;
17803
+ exports.EXECUTION_GRAPH_COMPOSED_PARAMETER_TYPES = EXECUTION_GRAPH_COMPOSED_PARAMETER_TYPES;
17442
17804
  exports.EXTEND_VIDEO_PROVIDERS = EXTEND_VIDEO_PROVIDERS;
17443
17805
  exports.EntityMetadataSchema = EntityMetadataSchema;
17444
17806
  exports.EntityRejectInputSchema = EntityRejectInputSchema;
@@ -17452,6 +17814,10 @@ exports.FILM_BASE_CREDITS = FILM_BASE_CREDITS;
17452
17814
  exports.FLEXIBLE_INPUT_LIP_SYNC_PROVIDERS = FLEXIBLE_INPUT_LIP_SYNC_PROVIDERS;
17453
17815
  exports.FLUX2_RES_MP = FLUX2_RES_MP;
17454
17816
  exports.FLUX_LORA_CHARACTER_MODEL_ID = FLUX_LORA_CHARACTER_MODEL_ID;
17817
+ exports.FRAME_DELIVERIES = FRAME_DELIVERIES;
17818
+ exports.FRAME_DELIVERY_BY_PROVIDER = FRAME_DELIVERY_BY_PROVIDER;
17819
+ exports.FRAME_FITS = FRAME_FITS;
17820
+ exports.FRAME_FIT_STRETCH_TOLERANCE = FRAME_FIT_STRETCH_TOLERANCE;
17455
17821
  exports.FRAME_MODE_ADAPTIVE_ONLY_ASPECT = FRAME_MODE_ADAPTIVE_ONLY_ASPECT;
17456
17822
  exports.FRAME_TARGET_HANDLES = FRAME_TARGET_HANDLES;
17457
17823
  exports.FREECUT_EXPORT_COMPLETE = FREECUT_EXPORT_COMPLETE;
@@ -17513,6 +17879,7 @@ exports.KEYFRAME_CREDITS_PER_SHOT = KEYFRAME_CREDITS_PER_SHOT;
17513
17879
  exports.KINETIC_CAPTION_STYLES = KINETIC_CAPTION_STYLES;
17514
17880
  exports.LANGUAGES = LANGUAGES;
17515
17881
  exports.LEGACY_LOTTIE_HOST_REMAP = LEGACY_LOTTIE_HOST_REMAP;
17882
+ exports.LEGACY_TEMPLATE_CATEGORIES = LEGACY_TEMPLATE_CATEGORIES;
17516
17883
  exports.LIP_SYNC_DURATION_BUCKETS = LIP_SYNC_DURATION_BUCKETS;
17517
17884
  exports.LIP_SYNC_MAX_AUDIO_SECONDS = LIP_SYNC_MAX_AUDIO_SECONDS;
17518
17885
  exports.LIP_SYNC_PROVIDERS = LIP_SYNC_PROVIDERS;
@@ -17552,6 +17919,7 @@ exports.MINIMAX_H3_DEFAULT_RESOLUTION = MINIMAX_H3_DEFAULT_RESOLUTION;
17552
17919
  exports.MINIMAX_H3_PROVIDERS = MINIMAX_H3_PROVIDERS;
17553
17920
  exports.MODELS_WITH_REFERENCE_IMAGE_SUPPORT = MODELS_WITH_REFERENCE_IMAGE_SUPPORT;
17554
17921
  exports.MODEL_CATALOG = MODEL_CATALOG;
17922
+ exports.MODEL_KINDS = MODEL_KINDS;
17555
17923
  exports.MODEL_PARAM_NODE_TYPES = MODEL_PARAM_NODE_TYPES;
17556
17924
  exports.MODEL_RECOMMENDATIONS = MODEL_RECOMMENDATIONS;
17557
17925
  exports.MODIFY_IMAGE_PROVIDERS = MODIFY_IMAGE_PROVIDERS;
@@ -17584,6 +17952,7 @@ exports.ORG_ERROR_CODES = ORG_ERROR_CODES;
17584
17952
  exports.ORG_KINDS = ORG_KINDS;
17585
17953
  exports.ORG_ROLES = ORG_ROLES;
17586
17954
  exports.ORG_STATUSES = ORG_STATUSES;
17955
+ exports.OUTPUT_BEARING_NODE_STATUSES = OUTPUT_BEARING_NODE_STATUSES;
17587
17956
  exports.OUTPUT_FIELD_MAP = OUTPUT_FIELD_MAP;
17588
17957
  exports.OUTPUT_FORMATS = OUTPUT_FORMATS;
17589
17958
  exports.OVERLAY_ANCHORS = OVERLAY_ANCHORS;
@@ -17676,9 +18045,11 @@ exports.REPEATABLE_NODE_TYPES = REPEATABLE_NODE_TYPES;
17676
18045
  exports.REPEAT_PLACEHOLDER = REPEAT_PLACEHOLDER;
17677
18046
  exports.REPLICATE_LIP_SYNC_PROVIDERS = REPLICATE_LIP_SYNC_PROVIDERS;
17678
18047
  exports.RESERVED_TEMPLATE_VARS = RESERVED_TEMPLATE_VARS;
18048
+ exports.SCENE3D_ASSERTION_RESTORED_CODE = SCENE3D_ASSERTION_RESTORED_CODE;
17679
18049
  exports.SCENE3D_ASSET_KINDS = SCENE3D_ASSET_KINDS;
17680
18050
  exports.SCENE3D_ASSET_ROLES = SCENE3D_ASSET_ROLES;
17681
18051
  exports.SCENE3D_ASSET_ROLE_KINDS = SCENE3D_ASSET_ROLE_KINDS;
18052
+ exports.SCENE3D_AUTHORING_ASSUMPTION_CODE = SCENE3D_AUTHORING_ASSUMPTION_CODE;
17682
18053
  exports.SCENE3D_AUTHORING_ENGINES = SCENE3D_AUTHORING_ENGINES;
17683
18054
  exports.SCENE3D_BASIC_ENGINE = SCENE3D_BASIC_ENGINE;
17684
18055
  exports.SCENE3D_BASIC_SCHEMA_VERSION = SCENE3D_BASIC_SCHEMA_VERSION;
@@ -17703,11 +18074,15 @@ exports.SCENE3D_PLAN_FIELD = SCENE3D_PLAN_FIELD;
17703
18074
  exports.SCENE3D_PLAN_TYPE = SCENE3D_PLAN_TYPE;
17704
18075
  exports.SCENE3D_PRIMITIVES = SCENE3D_PRIMITIVES;
17705
18076
  exports.SCENE3D_PRIMITIVE_MATERIAL_ROLE = SCENE3D_PRIMITIVE_MATERIAL_ROLE;
18077
+ exports.SCENE3D_REMEDY_AUTO_APPLIED_CODE = SCENE3D_REMEDY_AUTO_APPLIED_CODE;
17706
18078
  exports.SCENE3D_RENDERER_ASSET_KINDS = SCENE3D_RENDERER_ASSET_KINDS;
17707
18079
  exports.SCENE3D_RENDER_BASE_MAX_PX = SCENE3D_RENDER_BASE_MAX_PX;
17708
18080
  exports.SCENE3D_RENDER_TIERS = SCENE3D_RENDER_TIERS;
17709
18081
  exports.SCENE3D_RENDER_TIER_MULTIPLIERS = SCENE3D_RENDER_TIER_MULTIPLIERS;
17710
18082
  exports.SCENE3D_RENDER_XLARGE_MIN_AREA_PX = SCENE3D_RENDER_XLARGE_MIN_AREA_PX;
18083
+ exports.SCENE3D_REVIEW_REFUSED_CODE = SCENE3D_REVIEW_REFUSED_CODE;
18084
+ exports.SCENE3D_REVIEW_UNAVAILABLE_CODE = SCENE3D_REVIEW_UNAVAILABLE_CODE;
18085
+ exports.SCENE3D_REVIEW_UNAVAILABLE_REASONS = SCENE3D_REVIEW_UNAVAILABLE_REASONS;
17711
18086
  exports.SCENE3D_SCHEMA_VERSION = SCENE3D_SCHEMA_VERSION;
17712
18087
  exports.SCENE3D_SCHEMA_VERSION_V2 = SCENE3D_SCHEMA_VERSION_V2;
17713
18088
  exports.SCENE3D_SUPPORTED_SCHEMA_VERSIONS = SCENE3D_SUPPORTED_SCHEMA_VERSIONS;
@@ -17788,6 +18163,7 @@ exports.StyleDirectivesSchema = StyleDirectivesSchema;
17788
18163
  exports.SubGateNameSchema = SubGateNameSchema;
17789
18164
  exports.T2I_TO_I2I_VARIANT = T2I_TO_I2I_VARIANT;
17790
18165
  exports.TASK_CHAINED_EDIT_PROVIDERS = TASK_CHAINED_EDIT_PROVIDERS;
18166
+ exports.TEMPLATE_CATEGORIES = TEMPLATE_CATEGORIES;
17791
18167
  exports.TEXT_TO_AUDIO_PROVIDERS = TEXT_TO_AUDIO_PROVIDERS;
17792
18168
  exports.TEXT_TO_VIDEO_PROVIDERS = TEXT_TO_VIDEO_PROVIDERS;
17793
18169
  exports.TIER_MAX_PIPELINE_COST_CREDITS = TIER_MAX_PIPELINE_COST_CREDITS;
@@ -17850,6 +18226,8 @@ exports.VIDEO_GEN_PROVIDERS = VIDEO_GEN_PROVIDERS;
17850
18226
  exports.VIDEO_INPUT_LIP_SYNC_PROVIDERS = VIDEO_INPUT_LIP_SYNC_PROVIDERS;
17851
18227
  exports.VIDEO_MODEL_CAPS = VIDEO_MODEL_CAPS;
17852
18228
  exports.VIDEO_MODE_ALIASES = VIDEO_MODE_ALIASES;
18229
+ exports.VIDEO_ONLY_PARAMETER_NODE_TYPES = VIDEO_ONLY_PARAMETER_NODE_TYPES;
18230
+ exports.VIDEO_OUTPUT_CANVAS = VIDEO_OUTPUT_CANVAS;
17853
18231
  exports.VIDEO_PRODUCER_TYPES = VIDEO_PRODUCER_TYPES;
17854
18232
  exports.VIDEO_PROMPT_MAX = VIDEO_PROMPT_MAX;
17855
18233
  exports.VIDEO_PROVIDERS_REQUIRING_IMAGE = VIDEO_PROVIDERS_REQUIRING_IMAGE;
@@ -17923,6 +18301,7 @@ exports.calculateMonetizedCost = calculateMonetizedCost;
17923
18301
  exports.calculateProgress = calculateProgress;
17924
18302
  exports.canonicalScene3DPlanV2Json = canonicalScene3DPlanV2Json;
17925
18303
  exports.canonicalVarName = canonicalVarName;
18304
+ exports.centreCropToAspect = centreCropToAspect;
17926
18305
  exports.characterBoardItems = characterBoardItems;
17927
18306
  exports.characterBucketDisplayRank = characterBucketDisplayRank;
17928
18307
  exports.characterMentionSlug = characterMentionSlug;
@@ -17941,6 +18320,7 @@ exports.clipLookSchema = clipLookSchema;
17941
18320
  exports.collectAncestorRefs = collectAncestorRefs;
17942
18321
  exports.combineSameLabelRefs = combineSameLabelRefs;
17943
18322
  exports.computeAggregateLanes = computeAggregateLanes;
18323
+ exports.computeFrameFitPlan = computeFrameFitPlan;
17944
18324
  exports.computeScene3DPlanV2ContentHash = computeScene3DPlanV2ContentHash;
17945
18325
  exports.countRefModalityEdges = countRefModalityEdges;
17946
18326
  exports.creditRangesAll = creditRangesAll;
@@ -18043,6 +18423,7 @@ exports.getVideoAudioCapability = getVideoAudioCapability;
18043
18423
  exports.getWeapon = getWeapon;
18044
18424
  exports.getWeaponLabel = getWeaponLabel;
18045
18425
  exports.groupByFamily = groupByFamily;
18426
+ exports.groupByKindAndFamily = groupByKindAndFamily;
18046
18427
  exports.groupHandleId = groupHandleId;
18047
18428
  exports.groupLlmModelsByVendor = groupLlmModelsByVendor;
18048
18429
  exports.hasContiguousSegmentDurations = hasContiguousSegmentDurations;
@@ -18083,9 +18464,11 @@ exports.isScene3DHttpUrl = isScene3DHttpUrl;
18083
18464
  exports.isScene3DPlan = isScene3DPlan;
18084
18465
  exports.isScene3DPlanV1 = isScene3DPlanV1;
18085
18466
  exports.isScene3DPlanV2 = isScene3DPlanV2;
18467
+ exports.isScene3DReviewUnavailableReason = isScene3DReviewUnavailableReason;
18086
18468
  exports.isScene3DSchemaVersionSupported = isScene3DSchemaVersionSupported;
18087
18469
  exports.isScraperActor = isScraperActor;
18088
18470
  exports.isSeedance2Provider = isSeedance2Provider;
18471
+ exports.isTemplateCategory = isTemplateCategory;
18089
18472
  exports.isTiltDirection = isTiltDirection;
18090
18473
  exports.isUsageMode = isUsageMode;
18091
18474
  exports.isVeoProvider = isVeoProvider;
@@ -18108,23 +18491,27 @@ exports.mapShotIntentToProviderDirectives = mapShotIntentToProviderDirectives;
18108
18491
  exports.matchVariant = matchVariant;
18109
18492
  exports.maxSegmentSecFor = maxSegmentSecFor;
18110
18493
  exports.maxSegmentsFor = maxSegmentsFor;
18494
+ exports.measuredCanvasCombinations = measuredCanvasCombinations;
18111
18495
  exports.mergeClipLook = mergeClipLook;
18112
18496
  exports.mergeExposedSettings = mergeExposedSettings;
18113
18497
  exports.migrateEdgeOutputMode = migrateEdgeOutputMode;
18114
18498
  exports.migrateToItems = migrateToItems;
18115
18499
  exports.minSegmentSecFor = minSegmentSecFor;
18500
+ exports.minimalRatioDimensions = minimalRatioDimensions;
18116
18501
  exports.modelIdsByKindMode = modelIdsByKindMode;
18117
18502
  exports.modelToNodeTarget = modelToNodeTarget;
18118
18503
  exports.modelsForInputMode = modelsForInputMode;
18119
18504
  exports.modelsWithFeature = modelsWithFeature;
18120
18505
  exports.motionGraphicsFeature = motionGraphicsFeature;
18121
18506
  exports.newScene3DRevisionId = newScene3DRevisionId;
18507
+ exports.nodeStateMayCarryOutput = nodeStateMayCarryOutput;
18122
18508
  exports.normalizeLottieLayers = normalizeLottieLayers;
18123
18509
  exports.normalizeMinimaxH3Resolution = normalizeMinimaxH3Resolution;
18124
18510
  exports.normalizeModelInput = normalizeModelInput;
18125
18511
  exports.normalizeNodeModelParams = normalizeNodeModelParams;
18126
18512
  exports.normalizePinterestUrl = normalizePinterestUrl;
18127
18513
  exports.normalizeRoleSlug = normalizeRoleSlug;
18514
+ exports.normalizeTemplateCategory = normalizeTemplateCategory;
18128
18515
  exports.normalizeVideoRequestParams = normalizeVideoRequestParams;
18129
18516
  exports.normalizeWan3Resolution = normalizeWan3Resolution;
18130
18517
  exports.orderedLlmModels = orderedLlmModels;
@@ -18138,6 +18525,7 @@ exports.overlayStrokeSchema = overlayStrokeSchema;
18138
18525
  exports.overlayTextStyleSchema = overlayTextStyleSchema;
18139
18526
  exports.overlayVariantHandle = overlayVariantHandle;
18140
18527
  exports.overlayVariantIdFromHandle = overlayVariantIdFromHandle;
18528
+ exports.parseAspectToken = parseAspectToken;
18141
18529
  exports.parseAttributedDialogue = parseAttributedDialogue;
18142
18530
  exports.parseCharacterMentionToken = parseCharacterMentionToken;
18143
18531
  exports.parseEntityMentionToken = parseEntityMentionToken;
@@ -18162,12 +18550,14 @@ exports.presentTypes = presentTypes;
18162
18550
  exports.presetApplyClearKeys = presetApplyClearKeys;
18163
18551
  exports.presetDataMatches = presetDataMatches;
18164
18552
  exports.presetEntries = presetEntries;
18553
+ exports.pricedOutputDurationSec = pricedOutputDurationSec;
18165
18554
  exports.pricedVideoSelection = pricedVideoSelection;
18166
18555
  exports.pro3DRenderCoreOutputSchema = pro3DRenderCoreOutputSchema;
18167
18556
  exports.pro3DRenderFrameUnit = pro3DRenderFrameUnit;
18168
18557
  exports.pro3DRenderJobOutputSchema = pro3DRenderJobOutputSchema;
18169
18558
  exports.pro3DRenderProducedSchemaVersion = pro3DRenderProducedSchemaVersion;
18170
18559
  exports.pro3DRenderQuoteSchema = pro3DRenderQuoteSchema;
18560
+ exports.pro3DRenderReviewVerdictSchema = pro3DRenderReviewVerdictSchema;
18171
18561
  exports.pro3DRenderShotStillSchema = pro3DRenderShotStillSchema;
18172
18562
  exports.pro3DRenderShotStills = pro3DRenderShotStills;
18173
18563
  exports.pro3DRenderTimingOverrides = pro3DRenderTimingOverrides;
@@ -18195,6 +18585,8 @@ exports.resolveEffectiveSourceType = resolveEffectiveSourceType;
18195
18585
  exports.resolveEffectiveTier = resolveEffectiveTier;
18196
18586
  exports.resolveEntityAspect = resolveEntityAspect;
18197
18587
  exports.resolveFieldMappings = resolveFieldMappings;
18588
+ exports.resolveFrameDelivery = resolveFrameDelivery;
18589
+ exports.resolveFrameFitAspect = resolveFrameFitAspect;
18198
18590
  exports.resolveGvpAnchorWire = resolveGvpAnchorWire;
18199
18591
  exports.resolveImageGenCreditIdentifier = resolveImageGenCreditIdentifier;
18200
18592
  exports.resolveIndex = resolveIndex;
@@ -18207,6 +18599,7 @@ exports.resolveLottieOverlaySrc = resolveLottieOverlaySrc;
18207
18599
  exports.resolveNodeRefs = resolveNodeRefs;
18208
18600
  exports.resolveNormalizedImageGen = resolveNormalizedImageGen;
18209
18601
  exports.resolveObjectAspectRatio = resolveObjectAspectRatio;
18602
+ exports.resolveOutputCanvas = resolveOutputCanvas;
18210
18603
  exports.resolvePipelineModel = resolvePipelineModel;
18211
18604
  exports.resolveRelativeWindowToken = resolveRelativeWindowToken;
18212
18605
  exports.resolveScene3DAuthoringEngine = resolveScene3DAuthoringEngine;
@@ -18218,6 +18611,7 @@ exports.resolveSlideshowTransition = resolveSlideshowTransition;
18218
18611
  exports.resolveSourceThroughConnectedList = resolveSourceThroughConnectedList;
18219
18612
  exports.resolveStoredTier = resolveStoredTier;
18220
18613
  exports.resolveSwitchXCreditId = resolveSwitchXCreditId;
18614
+ exports.resolveTemplateCategory = resolveTemplateCategory;
18221
18615
  exports.resolveTopazUpscale = resolveTopazUpscale;
18222
18616
  exports.resolveVideoAnalysisModel = resolveVideoAnalysisModel;
18223
18617
  exports.resolveVideoModeForInputs = resolveVideoModeForInputs;
@@ -18290,6 +18684,8 @@ exports.scene3DProvenanceSchema = scene3DProvenanceSchema;
18290
18684
  exports.scene3DReferenceSchema = scene3DReferenceSchema;
18291
18685
  exports.scene3DRenderTier = scene3DRenderTier;
18292
18686
  exports.scene3DRenderTierCredits = scene3DRenderTierCredits;
18687
+ exports.scene3DReviewNote = scene3DReviewNote;
18688
+ exports.scene3DReviewVerdictOf = scene3DReviewVerdictOf;
18293
18689
  exports.scene3DSampleForFrame = scene3DSampleForFrame;
18294
18690
  exports.scene3DSha256Schema = scene3DSha256Schema;
18295
18691
  exports.scene3DShotForFrame = scene3DShotForFrame;
@@ -18337,6 +18733,7 @@ exports.supportedDefaultDimensions = supportedDefaultDimensions;
18337
18733
  exports.supportsAdvancedMode = supportsAdvancedMode;
18338
18734
  exports.supportsEndAnchor = supportsEndAnchor;
18339
18735
  exports.supportsExtendRender = supportsExtendRender;
18736
+ exports.templateCategoryStoredValues = templateCategoryStoredValues;
18340
18737
  exports.toConnectedReference = toConnectedReference;
18341
18738
  exports.toConnectedReferences = toConnectedReferences;
18342
18739
  exports.togglePick = togglePick;