@nodaro/shared 2.5.0 → 2.7.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
@@ -729,6 +729,44 @@ var IMAGE_MODELS = {
729
729
  useCases: ["upscale"],
730
730
  pricing: [{ identifier: "grok-upscale", credits: 25 }]
731
731
  },
732
+ // Grok Imagine Image 2.0 — t2i plus task-chained region editing. The edit
733
+ // and segment-map endpoints take a PRIOR grok-2 generation's task id (the
734
+ // job's `kieTaskId` output), not an image URL — same contract as
735
+ // grok-upscale (see TASK_CHAINED_EDIT_PROVIDERS in model-constants).
736
+ "grok-2": {
737
+ id: "grok-2",
738
+ kind: "image",
739
+ modes: ["t2i"],
740
+ family: "xAI",
741
+ label: "Grok Imagine 2",
742
+ series: "Grok",
743
+ description: "Grok Imagine Image 2.0 \u2014 expressive, high-contrast t2i. Generations chain into grok-2-segment (free named region masks) and grok-2-edit (region-targeted edits).",
744
+ useCases: ["stylized", "expressive", "general"],
745
+ aspectRatios: GROK_RATIOS,
746
+ pricing: [{ identifier: "grok-2", credits: 10 }]
747
+ },
748
+ "grok-2-edit": {
749
+ id: "grok-2-edit",
750
+ kind: "image",
751
+ modes: ["edit"],
752
+ family: "xAI",
753
+ label: "Grok Imagine 2 Edit",
754
+ series: "Grok",
755
+ description: "Prompt-edit a prior grok-2 generation by task id. Optional mask indexes (from grok-2-segment) restrict the edit to named regions.",
756
+ useCases: ["edit", "region-edit"],
757
+ pricing: [{ identifier: "grok-2-edit", credits: 10 }]
758
+ },
759
+ "grok-2-segment": {
760
+ id: "grok-2-segment",
761
+ kind: "image",
762
+ modes: ["edit"],
763
+ family: "xAI",
764
+ label: "Grok Imagine 2 Segment Map",
765
+ series: "Grok",
766
+ description: "FREE semantic segment map of a prior grok-2 generation \u2014 named region masks whose indexes feed grok-2-edit's region targeting.",
767
+ useCases: ["segmentation", "region-edit"],
768
+ pricing: [{ identifier: "grok-2-segment", credits: 0, note: "free" }]
769
+ },
732
770
  // ── Utilities ──
733
771
  "recraft-remove-bg": {
734
772
  id: "recraft-remove-bg",
@@ -1203,7 +1241,8 @@ var VIDEO_MODELS = {
1203
1241
  },
1204
1242
  // Seedance 2.5 — the next Seedance generation, not a tier of the 2.0 ladder.
1205
1243
  // Two levers differ from every 2.0 SKU and drive its own entries throughout:
1206
- // durations run to 30s (2.0 caps at 15s) and there is NO 1080p/4K tier.
1244
+ // durations run to 30s (2.0 caps at 15s) and there is NO 4K tier (1080p
1245
+ // arrived on KIE 2026-08-17 — probe-verified; 4k/2k/1440p still rejected).
1207
1246
  // Reference caps are also wider (30 images / 10 videos / 10 audio) — see
1208
1247
  // SEEDANCE_2_5_REF_LIMITS in model-constants.
1209
1248
  "seedance-2-5": {
@@ -1213,20 +1252,23 @@ var VIDEO_MODELS = {
1213
1252
  family: "Bytedance",
1214
1253
  label: "Seedance 2.5",
1215
1254
  series: "Seedance",
1216
- description: "Seedance 2.5 \u2014 up to 30s in one shot, native audio, wide multimodal references. 480p/720p.",
1255
+ description: "Seedance 2.5 \u2014 up to 30s in one shot, native audio, wide multimodal references. 480p/720p/1080p.",
1217
1256
  useCases: ["premium", "narrative", "long-form"],
1218
1257
  features: ["end-frame", "audio", "reference-image", "video-reference"],
1219
1258
  aspectRatios: VIDEO_RATIOS_SEEDANCE_2,
1220
1259
  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],
1221
- resolutions: ["480p", "720p"],
1260
+ resolutions: ["480p", "720p", "1080p"],
1222
1261
  pricing: [
1223
1262
  { identifier: "seedance-2-5", credits: 1260, note: "default 8s 720p \u2014 see :Ns:res variants for exact" },
1224
1263
  { identifier: "seedance-2-5:8s:480p", credits: 560, note: "8s 480p" },
1225
1264
  { identifier: "seedance-2-5:8s:720p", credits: 1260, note: "8s 720p" },
1265
+ { identifier: "seedance-2-5:8s:1080p", credits: 2280, note: "8s 1080p" },
1226
1266
  { identifier: "seedance-2-5:8s:480p-ref", credits: 340, note: "8s 480p with reference video" },
1227
1267
  { identifier: "seedance-2-5:8s:720p-ref", credits: 760, note: "8s 720p with reference video" },
1268
+ { identifier: "seedance-2-5:8s:1080p-ref", credits: 1370, note: "8s 1080p with reference video" },
1228
1269
  { identifier: "seedance-2-5:30s:480p", credits: 2100, note: "30s 480p (max)" },
1229
- { identifier: "seedance-2-5:30s:720p", credits: 4730, note: "30s 720p (max)" }
1270
+ { identifier: "seedance-2-5:30s:720p", credits: 4730, note: "30s 720p (max)" },
1271
+ { identifier: "seedance-2-5:30s:1080p", credits: 8550, note: "30s 1080p (max)" }
1230
1272
  ]
1231
1273
  },
1232
1274
  // ── Wan ──
@@ -2688,6 +2730,7 @@ var IMAGE_GEN_PROVIDERS = [
2688
2730
  "nano-banana-2",
2689
2731
  "nano-banana-2-lite",
2690
2732
  "grok",
2733
+ "grok-2",
2691
2734
  "gpt-image",
2692
2735
  "gpt-image-2",
2693
2736
  "imagen4",
@@ -2748,8 +2791,19 @@ var IMAGE_EDIT_PROVIDERS = [
2748
2791
  "topaz-image-upscale",
2749
2792
  // grok-upscale takes a prior Grok generation's task_id (NOT an image URL) —
2750
2793
  // see edit-image route for the taskId-vs-imageUrl branching.
2751
- "grok-upscale"
2794
+ "grok-upscale",
2795
+ // Grok Imagine 2 task-chained ops — same task_id contract as grok-upscale.
2796
+ // grok-2-edit: prompt edit of a prior grok-2 generation, optionally region-
2797
+ // targeted via mask indexes from grok-2-segment. grok-2-segment: FREE named
2798
+ // segment-mask map of a prior grok-2 generation.
2799
+ "grok-2-edit",
2800
+ "grok-2-segment"
2752
2801
  ];
2802
+ var TASK_CHAINED_EDIT_PROVIDERS = /* @__PURE__ */ new Set([
2803
+ "grok-upscale",
2804
+ "grok-2-edit",
2805
+ "grok-2-segment"
2806
+ ]);
2753
2807
  var MODIFY_IMAGE_PROVIDERS = [
2754
2808
  ...IMAGE_I2I_PROVIDERS,
2755
2809
  "nano-banana-edit"
@@ -3048,6 +3102,7 @@ var IMAGE_MASK_MODE = {
3048
3102
  "flux": "composite",
3049
3103
  "flux-flex": "composite",
3050
3104
  "grok": "composite",
3105
+ "grok-2": "composite",
3051
3106
  "imagen4": "composite",
3052
3107
  "imagen4-fast": "composite",
3053
3108
  "imagen4-ultra": "composite",
@@ -4698,6 +4753,16 @@ function buildChildrenByParent(nodes) {
4698
4753
  function isCollectInEdge(e) {
4699
4754
  return (e.targetHandle ?? COLLECT_IN_HANDLE) === COLLECT_IN_HANDLE;
4700
4755
  }
4756
+ function computeAggregateLanes(nodeId, wiredTypes, buckets, edges) {
4757
+ const present = new Set(wiredTypes);
4758
+ for (const t2 of presentTypes(buckets)) present.add(t2);
4759
+ for (const e of edges) {
4760
+ if (e.source !== nodeId) continue;
4761
+ const lane = parseGroupHandle(e.sourceHandle);
4762
+ if (lane) present.add(lane);
4763
+ }
4764
+ return AGGREGATEABLE_TYPES.filter((t2) => present.has(t2));
4765
+ }
4701
4766
 
4702
4767
  // src/llm-models.ts
4703
4768
  var LLM_REASONING_EFFORTS = ["none", "low", "medium", "high", "xhigh", "max"];
@@ -5009,7 +5074,8 @@ var LLM_FEATURE_DEFAULTS = {
5009
5074
  "qa-check": "gemini-3.6-flash",
5010
5075
  "generate-script": "gemini-3.6-flash",
5011
5076
  "translate": "gemini-3.6-flash",
5012
- "image-critic": "claude-sonnet-4.6"
5077
+ "image-critic": "claude-sonnet-4.6",
5078
+ "pick-best-llm": "claude-sonnet-4.6"
5013
5079
  };
5014
5080
  var LLM_MODALITY_CAPS = {
5015
5081
  "gemini-3-flash": { image: true, video: true, audio: true },
@@ -7753,8 +7819,9 @@ var QUALITY_MAP = {
7753
7819
  "seedance-2": { field: "resolution", values: { low: "720p", mid: "1080p", high: "1080p" } },
7754
7820
  "seedance-2-fast": { field: "resolution", values: { low: "480p", mid: "720p", high: "720p" } },
7755
7821
  "seedance-2-mini": { field: "resolution", values: { low: "480p", mid: "720p", high: "720p" } },
7756
- // Seedance 2.5 tops out at 720p on KIE (1080p/4k probe-rejected 2026-08-08).
7757
- "seedance-2-5": { field: "resolution", values: { low: "480p", mid: "720p", high: "720p" } },
7822
+ // Seedance 2.5 spans 480p/720p/1080p on KIE (1080p accepted since the
7823
+ // 2026-08-17 re-probe; 4k still rejected), so each quality rung gets its own tier.
7824
+ "seedance-2-5": { field: "resolution", values: { low: "480p", mid: "720p", high: "1080p" } },
7758
7825
  "wan-2.7-i2v": { field: "resolution", values: { low: "720p", mid: "1080p", high: "1080p" } },
7759
7826
  "wan-2.7-t2v": { field: "resolution", values: { low: "720p", mid: "1080p", high: "1080p" } },
7760
7827
  "happyhorse": { field: "resolution", values: { low: "720p", mid: "1080p", high: "1080p" } },
@@ -11222,24 +11289,31 @@ function selectLoraRoutingForMentions(refs) {
11222
11289
  }
11223
11290
  var PICK_BEST_LLM_STRATEGY = {
11224
11291
  id: "pick-best-llm",
11225
- label: "Pick best (LLM judge)",
11226
- description: "Sonnet picks the best item against your criteria.",
11292
+ label: "AI picks the best",
11293
+ description: "AI compares every candidate against your criteria and picks one.",
11227
11294
  configSchema: zod.z.object({
11228
11295
  // Default to the sensible "best quality" criteria when omitted (matches
11229
11296
  // defaultConfig) so a reduce({strategyId:"pick-best-llm"}) call with no
11230
11297
  // criteria degrades gracefully instead of erroring. An explicit "" still
11231
11298
  // rejects via min(1).
11232
11299
  criteria: zod.z.string().min(1, "criteria cannot be empty").default("Pick the highest-quality result."),
11233
- inputKind: zod.z.enum(["text", "image-url"]).default("text")
11300
+ inputKind: zod.z.enum(["text", "image-url"]).default("text"),
11301
+ // The judge model, like every other LLM node (llmModel + LlmModelSelect).
11302
+ // Optional: omitted → LLM_FEATURE_DEFAULTS["pick-best-llm"]. Validated
11303
+ // against LLM_MODEL_IDS at the route (the registry can't import the model
11304
+ // list without a cycle), and its tier drives the credit price via
11305
+ // buildLlmCreditIdentifier — economy / standard / premium.
11306
+ llmModel: zod.z.string().optional()
11234
11307
  }),
11235
11308
  defaultConfig: { criteria: "Pick the highest-quality result.", inputKind: "text" },
11236
11309
  outputType: "text",
11237
- creditCostKey: "reduce:pick-best-llm"
11310
+ creditCostKey: "reduce:pick-best-llm",
11311
+ usesLlm: true
11238
11312
  };
11239
11313
  var CONCAT_STRATEGY = {
11240
11314
  id: "concat",
11241
- label: "Concatenate",
11242
- description: "Join all survivors with a separator.",
11315
+ label: "Join into one text",
11316
+ description: "Puts every candidate into a single text, one after another, with a separator between them.",
11243
11317
  configSchema: zod.z.object({ separator: zod.z.string().default("\n\n") }),
11244
11318
  defaultConfig: { separator: "\n\n" },
11245
11319
  outputType: "text",
@@ -11247,8 +11321,8 @@ var CONCAT_STRATEGY = {
11247
11321
  };
11248
11322
  var FIRST_NON_EMPTY_STRATEGY = {
11249
11323
  id: "first-non-empty",
11250
- label: "First non-empty",
11251
- description: "Return the first survivor (empty strings filtered).",
11324
+ label: "First that has content",
11325
+ description: "Takes the first candidate that is not empty and ignores the rest.",
11252
11326
  configSchema: zod.z.object({}),
11253
11327
  defaultConfig: {},
11254
11328
  outputType: "text",
@@ -11256,8 +11330,8 @@ var FIRST_NON_EMPTY_STRATEGY = {
11256
11330
  };
11257
11331
  var COUNT_STRATEGY = {
11258
11332
  id: "count",
11259
- label: "Count",
11260
- description: "Return how many survivors came through.",
11333
+ label: "Count them",
11334
+ description: "Outputs how many candidates arrived.",
11261
11335
  configSchema: zod.z.object({}),
11262
11336
  defaultConfig: {},
11263
11337
  outputType: "data",
@@ -11265,8 +11339,8 @@ var COUNT_STRATEGY = {
11265
11339
  };
11266
11340
  var VOTE_STRATEGY = {
11267
11341
  id: "vote",
11268
- label: "Majority vote",
11269
- description: "Return the most common survivor (ties \u2192 first).",
11342
+ label: "Most common answer",
11343
+ description: "Picks the candidate that appears most often (ties go to the first).",
11270
11344
  configSchema: zod.z.object({ caseSensitive: zod.z.boolean().default(false) }),
11271
11345
  defaultConfig: { caseSensitive: false },
11272
11346
  outputType: "text",
@@ -11274,8 +11348,8 @@ var VOTE_STRATEGY = {
11274
11348
  };
11275
11349
  var MERGE_JSON_STRATEGY = {
11276
11350
  id: "merge-json",
11277
- label: "Merge JSON",
11278
- description: "Parse each survivor as JSON and merge into one object.",
11351
+ label: "Merge JSON objects",
11352
+ description: "Reads every candidate as JSON and merges them into one object.",
11279
11353
  configSchema: zod.z.object({ strategy: zod.z.enum(["deep", "shallow"]).default("deep") }),
11280
11354
  defaultConfig: { strategy: "deep" },
11281
11355
  outputType: "data",
@@ -12700,10 +12774,21 @@ var ENTITY_IMAGE_HANDLE_TYPES = /* @__PURE__ */ new Set([
12700
12774
  "object",
12701
12775
  "creature"
12702
12776
  ]);
12777
+ var AGGREGATE_LANE_SOURCE_TYPES = /* @__PURE__ */ new Set(["group", "collect"]);
12778
+ var AGGREGATE_LANE_EFFECTIVE_TYPE = {
12779
+ "out-image": "upload-image",
12780
+ "out-video": "upload-video",
12781
+ "out-audio": "upload-audio",
12782
+ "out-text": "list"
12783
+ };
12703
12784
  function resolveEffectiveSourceType(rawSourceType, sourceHandleId) {
12704
12785
  if (sourceHandleId === "image" && ENTITY_IMAGE_HANDLE_TYPES.has(rawSourceType ?? "")) {
12705
12786
  return "upload-image";
12706
12787
  }
12788
+ if (AGGREGATE_LANE_SOURCE_TYPES.has(rawSourceType ?? "")) {
12789
+ const effective = AGGREGATE_LANE_EFFECTIVE_TYPE[sourceHandleId ?? ""];
12790
+ if (effective) return effective;
12791
+ }
12707
12792
  return rawSourceType ?? "";
12708
12793
  }
12709
12794
  function sourceRefKey(nodeId, sourceHandleId, rawSourceType) {
@@ -12788,6 +12873,8 @@ var VIDEO_ANALYSIS_VISUAL_EFFECTS = [
12788
12873
  ];
12789
12874
  var VIDEO_ANALYSIS_TRANSITIONS = ["cut", "fade", "dissolve", "wipe", "whip"];
12790
12875
  var VIDEO_ANALYSIS_SPEED_EFFECTS = ["slow-motion", "ramp-in", "ramp-out", "timelapse", "freeze", "reverse"];
12876
+ var VIDEO_ANALYSIS_TIMES_OF_DAY = ["dawn", "day", "dusk", "night", "ambiguous"];
12877
+ var VIDEO_ANALYSIS_STORY_JUMPS = ["continuous", "same-day", "another-day", "years-later", "unclear"];
12791
12878
  var clipLookSchema = zod.z.object({
12792
12879
  /**
12793
12880
  * The rendering MEDIUM — "live-action photoreal", "2D anime", "stop-motion
@@ -12912,6 +12999,12 @@ var windowSceneBase = zod.z.object({
12912
12999
  angle: zod.z.enum(VIDEO_ANALYSIS_SHOT_ANGLES).optional(),
12913
13000
  /** Time manipulation. Absent ⇒ normal speed. */
12914
13001
  speed: zod.z.enum(VIDEO_ANALYSIS_SPEED_EFFECTS).optional(),
13002
+ /** CHRONICLE TIME (2026-08-17) — see the consts' docstrings. Both optional:
13003
+ * absent on every pre-2.6.0 analysis, and legitimately absent when the
13004
+ * analyser cannot read the clock. Enum + optional keeps the window decode
13005
+ * grammar congruence-safe (no ints, no maxItems). */
13006
+ timeOfDay: zod.z.enum(VIDEO_ANALYSIS_TIMES_OF_DAY).optional(),
13007
+ storyJump: zod.z.enum(VIDEO_ANALYSIS_STORY_JUMPS).optional(),
12915
13008
  visual: zod.z.string().min(1),
12916
13009
  /**
12917
13010
  * Text burned into the PICTURE of this shot — titles, captions, lower-thirds,
@@ -13079,6 +13172,23 @@ function aspectRatioFromDims(w, h) {
13079
13172
  const g = gcd(Math.round(w), Math.round(h));
13080
13173
  return `${Math.round(w) / g}:${Math.round(h) / g}`;
13081
13174
  }
13175
+ var MUSIC_VOCAL_RE = /\b(?:lyrics?|sung|sings?|singing|vocals?|chorus|verse|rap(?:ping|ped)?|a cappella)\b/i;
13176
+ var MUSIC_VOCAL_QUOTE_RE = /["\u201c][^"\u201d]{6,}["\u201d]/;
13177
+ var MUSIC_NO_VOCAL_RE = /\b(?:no|without|non)[- ](?:vocals?|lyrics?|singing)\b|\binstrumental\b|\bwordless\b/i;
13178
+ function inferMusicVideo(analysis) {
13179
+ const scenes = analysis?.scenes ?? [];
13180
+ if (scenes.length < 4) return false;
13181
+ const musicLayers = (sc) => (sc.audio ?? []).filter((a) => a?.mode === "music");
13182
+ const withMusic = scenes.filter((sc) => musicLayers(sc).length > 0).length;
13183
+ if (withMusic / scenes.length < 0.8) return false;
13184
+ return scenes.some(
13185
+ (sc) => musicLayers(sc).some((a) => {
13186
+ const content = typeof a.content === "string" ? a.content : "";
13187
+ if (MUSIC_NO_VOCAL_RE.test(content)) return false;
13188
+ return MUSIC_VOCAL_RE.test(content) || MUSIC_VOCAL_QUOTE_RE.test(content);
13189
+ })
13190
+ );
13191
+ }
13082
13192
 
13083
13193
  // src/video-analysis-pricing.ts
13084
13194
  var VIDEO_ANALYSIS_DURATION_BUCKETS = [60, 180, 360, 600];
@@ -13181,6 +13291,7 @@ function clampSmartCutWindow(value) {
13181
13291
  exports.ACTIVE_SCENE_HELPERS = ACTIVE_SCENE_HELPERS;
13182
13292
  exports.ADVANCED_MODE_UNAVAILABLE_REASON = ADVANCED_MODE_UNAVAILABLE_REASON;
13183
13293
  exports.AGGREGATEABLE_TYPES = AGGREGATEABLE_TYPES;
13294
+ exports.AGGREGATE_LANE_SOURCE_TYPES = AGGREGATE_LANE_SOURCE_TYPES;
13184
13295
  exports.AI_AVATAR_DURATION_BUCKETS = AI_AVATAR_DURATION_BUCKETS;
13185
13296
  exports.AI_AVATAR_MAX_AUDIO_SEC = AI_AVATAR_MAX_AUDIO_SEC;
13186
13297
  exports.AI_AVATAR_MAX_DURATION_SEC = AI_AVATAR_MAX_DURATION_SEC;
@@ -13536,6 +13647,7 @@ exports.StoryboardCohesionCriticVerdictSchema = StoryboardCohesionCriticVerdictS
13536
13647
  exports.StyleDirectivesSchema = StyleDirectivesSchema;
13537
13648
  exports.SubGateNameSchema = SubGateNameSchema;
13538
13649
  exports.T2I_TO_I2I_VARIANT = T2I_TO_I2I_VARIANT;
13650
+ exports.TASK_CHAINED_EDIT_PROVIDERS = TASK_CHAINED_EDIT_PROVIDERS;
13539
13651
  exports.TEXT_TO_AUDIO_PROVIDERS = TEXT_TO_AUDIO_PROVIDERS;
13540
13652
  exports.TEXT_TO_VIDEO_PROVIDERS = TEXT_TO_VIDEO_PROVIDERS;
13541
13653
  exports.TIER_MAX_PIPELINE_COST_CREDITS = TIER_MAX_PIPELINE_COST_CREDITS;
@@ -13569,9 +13681,11 @@ exports.VIDEO_ANALYSIS_MAX_VARIATIONS = VIDEO_ANALYSIS_MAX_VARIATIONS;
13569
13681
  exports.VIDEO_ANALYSIS_MIXED_TIERS = VIDEO_ANALYSIS_MIXED_TIERS;
13570
13682
  exports.VIDEO_ANALYSIS_SHOT_ANGLES = VIDEO_ANALYSIS_SHOT_ANGLES;
13571
13683
  exports.VIDEO_ANALYSIS_SPEED_EFFECTS = VIDEO_ANALYSIS_SPEED_EFFECTS;
13684
+ exports.VIDEO_ANALYSIS_STORY_JUMPS = VIDEO_ANALYSIS_STORY_JUMPS;
13572
13685
  exports.VIDEO_ANALYSIS_TIERS = VIDEO_ANALYSIS_TIERS;
13573
13686
  exports.VIDEO_ANALYSIS_TIER_LABELS = VIDEO_ANALYSIS_TIER_LABELS;
13574
13687
  exports.VIDEO_ANALYSIS_TIER_ORDER = VIDEO_ANALYSIS_TIER_ORDER;
13688
+ exports.VIDEO_ANALYSIS_TIMES_OF_DAY = VIDEO_ANALYSIS_TIMES_OF_DAY;
13575
13689
  exports.VIDEO_ANALYSIS_TRANSITIONS = VIDEO_ANALYSIS_TRANSITIONS;
13576
13690
  exports.VIDEO_ANALYSIS_VARIATION_SLUGS = VIDEO_ANALYSIS_VARIATION_SLUGS;
13577
13691
  exports.VIDEO_ANALYSIS_VISUAL_EFFECTS = VIDEO_ANALYSIS_VISUAL_EFFECTS;
@@ -13666,6 +13780,7 @@ exports.clearVideoCriticMetadata = clearVideoCriticMetadata;
13666
13780
  exports.clipLookSchema = clipLookSchema;
13667
13781
  exports.collectAncestorRefs = collectAncestorRefs;
13668
13782
  exports.combineSameLabelRefs = combineSameLabelRefs;
13783
+ exports.computeAggregateLanes = computeAggregateLanes;
13669
13784
  exports.countRefModalityEdges = countRefModalityEdges;
13670
13785
  exports.creditRangesAll = creditRangesAll;
13671
13786
  exports.creditsToUsd = creditsToUsd;
@@ -13765,6 +13880,7 @@ exports.hasFeature = hasFeature;
13765
13880
  exports.hexToRgbaArray = hexToRgbaArray;
13766
13881
  exports.humanizeSlotSid = humanizeSlotSid;
13767
13882
  exports.imageReferenceLimit = imageReferenceLimit;
13883
+ exports.inferMusicVideo = inferMusicVideo;
13768
13884
  exports.isAggregateableType = isAggregateableType;
13769
13885
  exports.isCharacterAspectRatio = isCharacterAspectRatio;
13770
13886
  exports.isCollectInEdge = isCollectInEdge;