@nodaro/shared 2.8.0 → 2.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 (56) hide show
  1. package/dist/index.cjs +329 -53
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.d.cts +631 -94
  4. package/dist/index.d.ts +631 -94
  5. package/dist/index.js +297 -53
  6. package/dist/index.js.map +1 -1
  7. package/package.json +1 -1
  8. package/src/__tests__/catalog-projection.test.ts +14 -0
  9. package/src/__tests__/default-video-provider.test.ts +1 -1
  10. package/src/__tests__/llm-models.test.ts +3 -2
  11. package/src/__tests__/organizations-types.test.ts +61 -0
  12. package/src/__tests__/pack-sidecar-localization.test.ts +21 -0
  13. package/src/__tests__/parameter-node-value.test.ts +18 -1
  14. package/src/__tests__/producer-types.test.ts +11 -0
  15. package/src/__tests__/prompt-length-limits.test.ts +7 -3
  16. package/src/__tests__/resolve-pipeline-model.test.ts +4 -4
  17. package/src/__tests__/seedance2-continuation-ref.test.ts +2 -3
  18. package/src/__tests__/video-analysis-catalog-sync.test.ts +1 -1
  19. package/src/__tests__/video-analysis-pricing.test.ts +2 -2
  20. package/src/__tests__/video-mode-for-inputs.test.ts +74 -0
  21. package/src/animals.ts +10 -0
  22. package/src/catalog-projection.ts +48 -0
  23. package/src/combine-transitions.ts +38 -0
  24. package/src/credit-estimators/video-utils.ts +1 -1
  25. package/src/entity-node-fields.ts +147 -0
  26. package/src/featured-entities.ts +1 -1
  27. package/src/furniture.ts +10 -0
  28. package/src/i18n/index.ts +33 -3
  29. package/src/i18n/transitions.ar.ts +6 -0
  30. package/src/i18n/transitions.de.ts +6 -0
  31. package/src/i18n/transitions.es.ts +6 -0
  32. package/src/i18n/transitions.fr.ts +6 -0
  33. package/src/i18n/transitions.he.ts +6 -0
  34. package/src/i18n/transitions.hi.ts +6 -0
  35. package/src/i18n/transitions.ja.ts +6 -0
  36. package/src/i18n/transitions.ko.ts +6 -0
  37. package/src/i18n/transitions.pt-BR.ts +6 -0
  38. package/src/i18n/transitions.ru.ts +6 -0
  39. package/src/i18n/transitions.zh-CN.ts +6 -0
  40. package/src/i18n/types.ts +12 -14
  41. package/src/index.ts +30 -1
  42. package/src/llm-models.ts +4 -0
  43. package/src/model-catalog.ts +19 -0
  44. package/src/model-constants.ts +52 -7
  45. package/src/organizations/index.ts +2 -0
  46. package/src/organizations/types.ts +152 -0
  47. package/src/organizations/views.ts +220 -0
  48. package/src/parameter-node-value.ts +23 -3
  49. package/src/producer-types.ts +10 -0
  50. package/src/smart-cut-windows.ts +8 -17
  51. package/src/suno-track-sources.ts +23 -0
  52. package/src/surround.ts +10 -90
  53. package/src/vehicles.ts +11 -1
  54. package/src/video-analysis-pricing.ts +25 -36
  55. package/src/weapons.ts +11 -1
  56. package/src/workflow-export.ts +41 -0
package/dist/index.cjs CHANGED
@@ -742,6 +742,9 @@ var IMAGE_MODELS = {
742
742
  series: "Grok",
743
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
744
  useCases: ["stylized", "expressive", "general"],
745
+ // Refs auto-route to grok-2-i2i (segment-map → image-edit chain); ONE
746
+ // reference (REF_IMAGE_MAX_LIMITS).
747
+ features: ["reference-image"],
745
748
  aspectRatios: GROK_RATIOS,
746
749
  pricing: [{ identifier: "grok-2", credits: 10 }]
747
750
  },
@@ -756,6 +759,21 @@ var IMAGE_MODELS = {
756
759
  useCases: ["edit", "region-edit"],
757
760
  pricing: [{ identifier: "grok-2-edit", credits: 10 }]
758
761
  },
762
+ // Auto-selected when references are attached to grok-2 (T2I_TO_I2I_VARIANT):
763
+ // the t2i endpoint takes no image, so the FREE segment-map mints a task id
764
+ // from the reference URL and image-edit consumes it. Single reference.
765
+ "grok-2-i2i": {
766
+ id: "grok-2-i2i",
767
+ kind: "image",
768
+ modes: ["i2i"],
769
+ family: "xAI",
770
+ label: "Grok Imagine 2 (reference)",
771
+ series: "Grok",
772
+ description: "grok-2 guided by ONE reference image via the segment-map \u2192 image-edit chain \u2014 preserves the reference's composition while applying the prompt.",
773
+ useCases: ["restyle", "edit", "reference"],
774
+ features: ["reference-image"],
775
+ pricing: [{ identifier: "grok-2-i2i", credits: 10 }]
776
+ },
759
777
  "grok-2-segment": {
760
778
  id: "grok-2-segment",
761
779
  kind: "image",
@@ -2540,7 +2558,7 @@ function getMaxTtsChars(provider) {
2540
2558
  }
2541
2559
  var SUNO_TITLE_MAX = 80;
2542
2560
  function getMaxSunoPromptChars(model, customMode) {
2543
- if (!customMode) return 500;
2561
+ if (!customMode) return 3e3;
2544
2562
  return model === "V4" || model === "V3_5" ? 3e3 : 5e3;
2545
2563
  }
2546
2564
  function getMaxSunoStyleChars(model) {
@@ -2599,6 +2617,7 @@ var MODELS_WITH_REFERENCE_IMAGE_SUPPORT = /* @__PURE__ */ new Set([
2599
2617
  "gpt-image",
2600
2618
  "gpt-image-2",
2601
2619
  "grok",
2620
+ "grok-2",
2602
2621
  "qwen",
2603
2622
  "seedream",
2604
2623
  "seedream-5-lite",
@@ -2609,6 +2628,7 @@ var MODELS_WITH_REFERENCE_IMAGE_SUPPORT = /* @__PURE__ */ new Set([
2609
2628
  "nano-banana-edit",
2610
2629
  "gpt-image-i2i",
2611
2630
  "gpt-image-2-i2i",
2631
+ "grok-2-i2i",
2612
2632
  "flux-i2i",
2613
2633
  "flux-pro-i2i",
2614
2634
  "flux-kontext",
@@ -2638,6 +2658,9 @@ var T2I_TO_I2I_VARIANT = {
2638
2658
  "gpt-image": "gpt-image-i2i",
2639
2659
  "gpt-image-2": "gpt-image-2-i2i",
2640
2660
  "grok": "grok-i2i",
2661
+ // grok-2's t2i takes NO image input; its "i2i" is the segment-map(image_url)
2662
+ // → image-edit(task_id) chain in the KIE provider (single reference).
2663
+ "grok-2": "grok-2-i2i",
2641
2664
  "qwen": "qwen-i2i",
2642
2665
  "seedream": "seedream-edit",
2643
2666
  "seedream-5-lite": "seedream-5-lite-i2i",
@@ -2653,6 +2676,8 @@ var REF_IMAGE_MAX_LIMITS = {
2653
2676
  "nano-banana-2": 4,
2654
2677
  "nano-banana-2-lite": 10,
2655
2678
  "wan-2.7": 9,
2679
+ // grok-2 reference chain consumes exactly one image (segment-map input).
2680
+ "grok-2-i2i": 1,
2656
2681
  // Image-to-image (multi-source array)
2657
2682
  "nano-banana-edit": 8,
2658
2683
  "gpt-image-i2i": 16,
@@ -2762,6 +2787,7 @@ var IMAGE_I2I_PROVIDERS = [
2762
2787
  "flux-pro-i2i",
2763
2788
  "gpt-image-i2i",
2764
2789
  "gpt-image-2-i2i",
2790
+ "grok-2-i2i",
2765
2791
  "ideogram-edit",
2766
2792
  "ideogram-remix",
2767
2793
  "ideogram-reframe",
@@ -2922,6 +2948,15 @@ function resolveVideoProviderForMode(provider, mode) {
2922
2948
  }
2923
2949
  return provider;
2924
2950
  }
2951
+ function resolveVideoModeForInputs(provider, inputs) {
2952
+ if (inputs.hasStartFrame) return "image-to-video";
2953
+ if (!provider || !inputs.hasImageRefs) return "text-to-video";
2954
+ const i2v = resolveVideoProviderForMode(provider, "image-to-video");
2955
+ const t2v = resolveVideoProviderForMode(provider, "text-to-video");
2956
+ if (i2v === t2v) return "text-to-video";
2957
+ const carriesImageRefs = (id) => (VIDEO_REF_LIMITS_BY_PROVIDER[id]?.images ?? 0) > 0;
2958
+ return carriesImageRefs(i2v) && !carriesImageRefs(t2v) ? "image-to-video" : "text-to-video";
2959
+ }
2925
2960
  var VIDEO_GEN_COLLAPSED_T2V_IDS = new Set(
2926
2961
  VIDEO_MODE_ALIASES.filter((g) => g.t2v !== g.base).map((g) => g.t2v)
2927
2962
  );
@@ -5146,7 +5181,8 @@ var LLM_FEATURE_DEFAULTS = {
5146
5181
  "generate-script": "gemini-3.6-flash",
5147
5182
  "translate": "gemini-3.6-flash",
5148
5183
  "image-critic": "claude-sonnet-4.6",
5149
- "pick-best-llm": "claude-sonnet-4.6"
5184
+ "pick-best-llm": "claude-sonnet-4.6",
5185
+ "workflow-copilot": "claude-sonnet-5"
5150
5186
  };
5151
5187
  var LLM_MODALITY_CAPS = {
5152
5188
  "gemini-3-flash": { image: true, video: true, audio: true },
@@ -6925,33 +6961,6 @@ function isTiltDirection(direction) {
6925
6961
  function defaultCarriedFraction(direction) {
6926
6962
  return isTiltDirection(direction) ? TILT_CARRIED_FRACTION : DEFAULT_CARRIED_FRACTION;
6927
6963
  }
6928
- var EDGE = {
6929
- right: { carried: "left", painted: "right" },
6930
- left: { carried: "right", painted: "left" },
6931
- up: { carried: "bottom", painted: "top" },
6932
- down: { carried: "top", painted: "bottom" }
6933
- };
6934
- var TILT_SUBJECT = {
6935
- up: {
6936
- word: "up",
6937
- subject: "the open sky directly overhead \u2014 sky, clouds, or (for an interior) the canopy or ceiling",
6938
- where: "overhead"
6939
- },
6940
- down: {
6941
- word: "down",
6942
- subject: "the ground directly below \u2014 terrain, floor, or water surface",
6943
- where: "below"
6944
- }
6945
- };
6946
- function buildSurroundFillPrompt(direction, userPrompt) {
6947
- const scene = userPrompt && userPrompt.trim() ? `${userPrompt.trim()}. ` : "";
6948
- const { carried, painted } = EDGE[direction];
6949
- if (direction === "up" || direction === "down") {
6950
- const t2 = TILT_SUBJECT[direction];
6951
- return `${scene}This is a camera tilted straight ${t2.word} from the same scene. The ${carried} strip holds real, finished pixels from the edge of the horizon view; the ${painted} region is flat gray and MUST be painted as ${t2.subject}. Render what is genuinely ${t2.where} \u2014 do NOT repeat, mirror, or continue the landscape, and do NOT draw a horizon line or distant scenery in the painted region. CRITICAL: keep the ${carried} strip unchanged and match the scene's EXACT lighting, time of day, white balance, and color grade \u2014 the same light as the ${carried} strip; no golden hour, no sunset, no warm relight, no cinematic regrade. Blend smoothly into the ${carried} strip with no visible seam. No people, no text, no labels, no watermarks.`;
6952
- }
6953
- return `${scene}This is a partial frame: the ${carried} portion contains real, finished pixels and the ${painted} portion is flat gray that MUST be painted in. Paint ONLY the ${painted} gray region as a natural, seamless continuation of the ${carried} portion \u2014 same scene, same perspective, continuing the horizon, geometry, and content across the boundary with no break. Keep the ${carried} portion completely unchanged. CRITICAL: do NOT change the lighting, exposure, white balance, or time of day. Match the ${carried} portion's EXACT light, color temperature, and contrast across the whole frame \u2014 if it is flat overcast daylight, keep flat overcast daylight. No golden hour, no sunset, no warm relight, no cinematic regrade. The seam between the ${carried} and ${painted} portions must be invisible. No people, no text, no labels, no watermarks.`;
6954
- }
6955
6964
 
6956
6965
  // src/parameter-node-value.ts
6957
6966
  var PARAMETER_NODE_TYPES = /* @__PURE__ */ new Set([
@@ -7007,6 +7016,10 @@ var HINT_EXEMPT_PARAMETER_TYPES = /* @__PURE__ */ new Set([
7007
7016
  "duration",
7008
7017
  "aspect-ratio"
7009
7018
  ]);
7019
+ var registeredPersonPackFields = [];
7020
+ function setRegisteredPersonPackFields(fields) {
7021
+ registeredPersonPackFields = [...fields];
7022
+ }
7010
7023
  function getParameterValue(data, nodeType) {
7011
7024
  switch (nodeType) {
7012
7025
  case "text-prompt":
@@ -7069,8 +7082,15 @@ function getParameterValue(data, nodeType) {
7069
7082
  return trim(data.backdrop);
7070
7083
  case "held-prop":
7071
7084
  return trim(data.heldProp);
7072
- case "person":
7073
- return trim(data.type) ?? trim(data.age) ?? trim(data.ethnicity) ?? trim(data.regionalAesthetic) ?? trim(data.frame) ?? trim(data.bodyMass) ?? trim(data.bust) ?? trim(data.waist) ?? trim(data.hips) ?? trim(data.silhouette) ?? trim(data.faceShape) ?? trim(data.jawline) ?? trim(data.cheekbones) ?? trim(data.facialFullness) ?? trim(data.eyeShape) ?? trim(data.eyelidType) ?? trim(data.canthalTilt) ?? trim(data.eyeSpacing) ?? trim(data.eyeSetBrow) ?? trim(data.nose) ?? trim(data.noseTip) ?? trim(data.lipFullness) ?? trim(data.lipShape) ?? trim(data.lips) ?? trim(data.hairColor) ?? trim(data.hairBase) ?? trim(data.eyebrows) ?? trim(data.skinTone) ?? trim(data.skinTexture) ?? trim(data.eyeColor) ?? trim(data.facialHair) ?? trim(data.distinctiveFeature) ?? trim(data.lipState) ?? trim(data.eyeState);
7085
+ case "person": {
7086
+ const base = trim(data.type) ?? trim(data.age) ?? trim(data.ethnicity) ?? trim(data.regionalAesthetic) ?? trim(data.frame) ?? trim(data.bodyMass) ?? trim(data.bust) ?? trim(data.waist) ?? trim(data.hips) ?? trim(data.silhouette) ?? trim(data.faceShape) ?? trim(data.jawline) ?? trim(data.cheekbones) ?? trim(data.facialFullness) ?? trim(data.eyeShape) ?? trim(data.eyelidType) ?? trim(data.canthalTilt) ?? trim(data.eyeSpacing) ?? trim(data.eyeSetBrow) ?? trim(data.nose) ?? trim(data.noseTip) ?? trim(data.lipFullness) ?? trim(data.lipShape) ?? trim(data.lips) ?? trim(data.hairColor) ?? trim(data.hairBase) ?? trim(data.eyebrows) ?? trim(data.skinTone) ?? trim(data.skinTexture) ?? trim(data.eyeColor) ?? trim(data.facialHair) ?? trim(data.distinctiveFeature) ?? trim(data.lipState) ?? trim(data.eyeState);
7087
+ if (base !== void 0) return base;
7088
+ for (const field of registeredPersonPackFields) {
7089
+ const v = trim(data[field]);
7090
+ if (v !== void 0) return v;
7091
+ }
7092
+ return void 0;
7093
+ }
7074
7094
  case "mood":
7075
7095
  return trim(data.mood);
7076
7096
  case "photographer":
@@ -9087,7 +9107,7 @@ var VEHICLES = [
9087
9107
  { id: "seaplane", label: "Seaplane", subcategory: "aircraft", description: "Seaplane with twin pontoon floats instead of wheels, high wings and a propeller, resting on calm water" },
9088
9108
  { id: "hot-air-balloon", label: "Hot Air Balloon", subcategory: "aircraft", description: "Giant hot-air balloon with a colorful rainbow-striped fabric envelope, a roaring flame burner flaring upward into the mouth and a wicker passenger basket suspended below by braided cables" },
9089
9109
  { id: "blimp", label: "Blimp", subcategory: "aircraft", description: "Sausage-shaped blimp airship with a sleek silver envelope, small rear fins and a slung gondola beneath" },
9090
- { id: "airship", label: "Airship / Dirigible", subcategory: "aircraft", description: "Massive rigid lighter-than-air dirigible with a long cigar-shaped fabric-covered metal frame, large rear stabilizer fins, multiple slung engine gondolas and a long passenger cabin running underneath the hull" },
9110
+ { id: "airship", label: "Airship / Dirigible", subcategory: "aircraft", description: "Massive rigid lighter-than-air dirigible with a long cigar-shaped fabric-covered metal frame, large rear stabilizer fins, multiple slung engine gondolas and a long passenger cabin running underneath the hull", term: "airship" },
9091
9111
  { id: "glider", label: "Glider", subcategory: "aircraft", description: "Elegant sailplane glider with ultra-long narrow wings, no engine and a teardrop cockpit pod" },
9092
9112
  { id: "paraglider", label: "Paraglider", subcategory: "aircraft", description: "Foot-launched paraglider with a wide elliptical soft-fabric ram-air wing arched overhead, dozens of slender suspension lines converging into a tandem harness with a seated pilot" },
9093
9113
  { id: "microlight", label: "Microlight Aircraft", subcategory: "aircraft", description: "Lightweight single-pilot microlight aircraft with an exposed tubular metal frame, fabric-covered high wings, a small pusher propeller engine behind the open seat and tricycle landing gear" },
@@ -9262,7 +9282,7 @@ var WEAPONS = [
9262
9282
  { id: "phaser", label: "Phaser", subcategory: "sci-fi", description: "Sleek sci-fi phaser with a minimalist curved grip, glowing emitter tip and a smooth panel controlling intensity" },
9263
9283
  { id: "rail-gun", label: "Rail Gun", subcategory: "sci-fi", description: "Heavy electromagnetic rail gun with parallel metal rails, massive capacitors along the body and a glowing projectile chamber" },
9264
9284
  { id: "emp-grenade", label: "EMP Grenade", subcategory: "sci-fi", description: "Spherical electromagnetic pulse grenade with exposed coils, glowing blue indicator lights and a holographic arming dial" },
9265
- { id: "plasma-sword", label: "Plasma Sword / Lightsaber", subcategory: "sci-fi", description: "Sci-fi energy blade with a metallic ridged hilt projecting a tall column of saturated plasma energy, surrounded by a bright halo of glowing light, casting colored reflections on the wielder and humming softly with contained power" },
9285
+ { id: "plasma-sword", label: "Plasma Sword / Lightsaber", subcategory: "sci-fi", description: "Sci-fi energy blade with a metallic ridged hilt projecting a tall column of saturated plasma energy, surrounded by a bright halo of glowing light, casting colored reflections on the wielder and humming softly with contained power", term: "plasma sword" },
9266
9286
  { id: "gravity-gun", label: "Gravity Gun", subcategory: "sci-fi", description: "Sci-fi physics-manipulating ranged weapon with a chunky metallic body, three articulated prongs at the muzzle that crackle with blue gravitational energy, exposed power conduits along the barrel and a heavy two-handed grip with a glowing trigger assembly" },
9267
9287
  // -------------------- Fantasy / Magical --------------------
9268
9288
  { id: "enchanted-sword", label: "Enchanted Sword", subcategory: "fantasy", description: "Enchanted sword with a glowing rune-etched blade, gold-inlaid crossguard and a gemstone embedded in the pommel" },
@@ -9349,18 +9369,18 @@ function isKineticCaptionStyle(style) {
9349
9369
 
9350
9370
  // src/i18n/types.ts
9351
9371
  var LANGUAGES = [
9352
- { id: "en", englishName: "English", nativeName: "English", shortCode: "EN", dir: "ltr", flag: "\u{1F1EC}\u{1F1E7}" },
9353
- { id: "es", englishName: "Spanish", nativeName: "Espa\xF1ol", shortCode: "ES", dir: "ltr", flag: "\u{1F1EA}\u{1F1F8}" },
9354
- { id: "fr", englishName: "French", nativeName: "Fran\xE7ais", shortCode: "FR", dir: "ltr", flag: "\u{1F1EB}\u{1F1F7}" },
9355
- { id: "de", englishName: "German", nativeName: "Deutsch", shortCode: "DE", dir: "ltr", flag: "\u{1F1E9}\u{1F1EA}" },
9356
- { id: "pt-BR", englishName: "Portuguese (Brazil)", nativeName: "Portugu\xEAs", shortCode: "PT", dir: "ltr", flag: "\u{1F1E7}\u{1F1F7}" },
9357
- { id: "ru", englishName: "Russian", nativeName: "\u0420\u0443\u0441\u0441\u043A\u0438\u0439", shortCode: "RU", dir: "ltr", flag: "\u{1F1F7}\u{1F1FA}" },
9358
- { id: "hi", englishName: "Hindi", nativeName: "\u0939\u093F\u0928\u094D\u0926\u0940", shortCode: "HI", dir: "ltr", flag: "\u{1F1EE}\u{1F1F3}" },
9359
- { id: "ja", englishName: "Japanese", nativeName: "\u65E5\u672C\u8A9E", shortCode: "JA", dir: "ltr", flag: "\u{1F1EF}\u{1F1F5}" },
9360
- { id: "ko", englishName: "Korean", nativeName: "\uD55C\uAD6D\uC5B4", shortCode: "KO", dir: "ltr", flag: "\u{1F1F0}\u{1F1F7}" },
9361
- { id: "zh-CN", englishName: "Chinese (Simplified)", nativeName: "\u7B80\u4F53\u4E2D\u6587", shortCode: "ZH", dir: "ltr", flag: "\u{1F1E8}\u{1F1F3}" },
9362
- { id: "he", englishName: "Hebrew", nativeName: "\u05E2\u05D1\u05E8\u05D9\u05EA", shortCode: "HE", dir: "rtl", flag: "\u{1F1EE}\u{1F1F1}" },
9363
- { id: "ar", englishName: "Arabic", nativeName: "\u0627\u0644\u0639\u0631\u0628\u064A\u0629", shortCode: "AR", dir: "rtl", flag: "\u{1F1F8}\u{1F1E6}" }
9372
+ { id: "en", englishName: "English", nativeName: "English", shortCode: "EN", dir: "ltr" },
9373
+ { id: "es", englishName: "Spanish", nativeName: "Espa\xF1ol", shortCode: "ES", dir: "ltr" },
9374
+ { id: "fr", englishName: "French", nativeName: "Fran\xE7ais", shortCode: "FR", dir: "ltr" },
9375
+ { id: "de", englishName: "German", nativeName: "Deutsch", shortCode: "DE", dir: "ltr" },
9376
+ { id: "pt-BR", englishName: "Portuguese (Brazil)", nativeName: "Portugu\xEAs", shortCode: "PT", dir: "ltr" },
9377
+ { id: "ru", englishName: "Russian", nativeName: "\u0420\u0443\u0441\u0441\u043A\u0438\u0439", shortCode: "RU", dir: "ltr" },
9378
+ { id: "hi", englishName: "Hindi", nativeName: "\u0939\u093F\u0928\u094D\u0926\u0940", shortCode: "HI", dir: "ltr" },
9379
+ { id: "ja", englishName: "Japanese", nativeName: "\u65E5\u672C\u8A9E", shortCode: "JA", dir: "ltr" },
9380
+ { id: "ko", englishName: "Korean", nativeName: "\uD55C\uAD6D\uC5B4", shortCode: "KO", dir: "ltr" },
9381
+ { id: "zh-CN", englishName: "Chinese (Simplified)", nativeName: "\u7B80\u4F53\u4E2D\u6587", shortCode: "ZH", dir: "ltr" },
9382
+ { id: "he", englishName: "Hebrew", nativeName: "\u05E2\u05D1\u05E8\u05D9\u05EA", shortCode: "HE", dir: "rtl" },
9383
+ { id: "ar", englishName: "Arabic", nativeName: "\u0627\u0644\u0639\u0631\u0628\u064A\u0629", shortCode: "AR", dir: "rtl" }
9364
9384
  ];
9365
9385
  LANGUAGES.map((l) => l.id);
9366
9386
  var NON_EN_LOCALE_IDS = LANGUAGES.filter((l) => l.id !== "en").map((l) => l.id);
@@ -9379,6 +9399,19 @@ var inflight = /* @__PURE__ */ new Map();
9379
9399
  function cacheKey(catalog, locale) {
9380
9400
  return `${catalog}:${locale}`;
9381
9401
  }
9402
+ var packSidecars = /* @__PURE__ */ new Map();
9403
+ function registerCatalogSidecars(catalog, sidecars) {
9404
+ if (!sidecars) return;
9405
+ for (const locale of Object.keys(sidecars)) {
9406
+ const map = sidecars[locale];
9407
+ if (!map) continue;
9408
+ const key = `${catalog}:${locale}`;
9409
+ packSidecars.set(key, { ...packSidecars.get(key) ?? {}, ...map });
9410
+ }
9411
+ }
9412
+ function resetCatalogSidecars() {
9413
+ packSidecars.clear();
9414
+ }
9382
9415
  async function ensureLocaleCatalogLoaded(catalog, locale) {
9383
9416
  if (locale === "en") return null;
9384
9417
  const key = cacheKey(catalog, locale);
@@ -9404,9 +9437,10 @@ async function ensureLocaleCatalogLoaded(catalog, locale) {
9404
9437
  }
9405
9438
  function getLocalizedEntry(catalog, id, locale) {
9406
9439
  if (locale === "en") return void 0;
9407
- const map = cache.get(cacheKey(catalog, locale));
9408
- if (!map) return void 0;
9409
- return map[id];
9440
+ const key = cacheKey(catalog, locale);
9441
+ const fromFile = cache.get(key)?.[id];
9442
+ if (fromFile) return fromFile;
9443
+ return packSidecars.get(key)?.[id];
9410
9444
  }
9411
9445
  function resolveLabel(catalog, id, englishLabel, locale) {
9412
9446
  if (locale === "en") return englishLabel;
@@ -11878,6 +11912,26 @@ function resolveXfadeName(id) {
11878
11912
  }
11879
11913
  return entry.xfade;
11880
11914
  }
11915
+ var PICKER_TO_COMBINE_TRANSITION = {
11916
+ "none": "cut",
11917
+ "auto": "dissolve",
11918
+ // an explicitly wired "auto" wants A blend — the classic slideshow default
11919
+ "cross-dissolve": "dissolve",
11920
+ "fade-to-black": "dip-to-black",
11921
+ "fade-to-white": "dip-to-white",
11922
+ "iris": "circle-open",
11923
+ "wipe": "wipe-left",
11924
+ "pixelate-reform": "pixelize",
11925
+ "dissolve-to-mist": "hblur",
11926
+ "match-cut": "cut",
11927
+ "smash-cut": "cut",
11928
+ "freeze-frame-jump": "cut"
11929
+ };
11930
+ function resolveSlideshowTransition(value) {
11931
+ if (!value) return "cut";
11932
+ if (COMBINE_TRANSITION_IDS.includes(value)) return value;
11933
+ return PICKER_TO_COMBINE_TRANSITION[value] ?? "cut";
11934
+ }
11881
11935
 
11882
11936
  // src/audio-crossfade-curves.ts
11883
11937
  var AUDIO_CROSSFADE_CURVES = [
@@ -11986,7 +12040,17 @@ var VIDEO_PRODUCER_TYPES = /* @__PURE__ */ new Set([
11986
12040
  // Cinematic Avatar (HeyGen cinematic_avatar): prompt + 1–3 avatar looks → video.
11987
12041
  "cinematic-avatar",
11988
12042
  // Assemble Narrated Video: fits N (clip, voice) blocks into one MP4 → video.
11989
- "assemble-narrated-video"
12043
+ "assemble-narrated-video",
12044
+ // Still to Video: one still image + one audio track → MP4 (local FFmpeg,
12045
+ // no provider). Emits generatedVideoUrl like every other ffmpeg video node.
12046
+ "still-to-video",
12047
+ // Slideshow: 2-100 stills + one optional audio track → MP4 (local FFmpeg,
12048
+ // no provider). Same contract; images arrive via the image-collage lane.
12049
+ "slideshow",
12050
+ // GIF to Video: animated GIF → H.264 MP4 (local FFmpeg, no provider).
12051
+ // Emits generatedVideoUrl so it connects to any downstream video consumer
12052
+ // (e.g. a Seedance video-reference input) by an ordinary edge.
12053
+ "gif-to-video"
11990
12054
  ]);
11991
12055
  var DYNAMIC_PRODUCER_TYPES = /* @__PURE__ */ new Set([
11992
12056
  "list",
@@ -12055,6 +12119,19 @@ var FAN_OUT_EACH_TYPES = /* @__PURE__ */ new Set([
12055
12119
  "selector"
12056
12120
  ]);
12057
12121
 
12122
+ // src/suno-track-sources.ts
12123
+ var SUNO_TRACK_SOURCE_TYPES = /* @__PURE__ */ new Set([
12124
+ "suno-generate",
12125
+ "suno-cover",
12126
+ "suno-extend",
12127
+ "suno-mashup",
12128
+ "suno-replace-section",
12129
+ "suno-add-instrumental",
12130
+ "suno-add-vocals",
12131
+ "suno-convert-wav",
12132
+ "suno-upload-extend"
12133
+ ]);
12134
+
12058
12135
  // src/voice-changer-models.ts
12059
12136
  var VOICE_CHANGER_MODELS = [
12060
12137
  {
@@ -13299,9 +13376,8 @@ var VIDEO_ANALYSIS_BUCKET_CREDITS = {
13299
13376
  "video-analysis:mixed:180s": 289,
13300
13377
  "video-analysis:mixed:360s": 724,
13301
13378
  "video-analysis:mixed:600s": 1169,
13302
- // SMART — the accuracy tier, and since the 2026-08-03 hybrid re-plan a
13303
- // multi-roll plan like the others: one native 6fps skeleton pass plus 2
13304
- // fast + 2 pro donor rolls, always refined (`selectionMode` does not apply
13379
+ // SMART — the accuracy tier, and since the 2026-08-03 re-plan a multi-roll
13380
+ // plan like the others, always refined (`selectionMode` does not apply
13305
13381
  // here — smart always refines; it never offers a cheaper "choose" path).
13306
13382
  // Priced above the economy tiers because it genuinely costs more to run;
13307
13383
  // the only tier whose accuracy is validated against a hand-counted edit
@@ -13365,7 +13441,176 @@ function clampSmartCutWindow(value) {
13365
13441
  if (n > SMART_CUT_WINDOW_MAX) return SMART_CUT_WINDOW_MAX;
13366
13442
  return n;
13367
13443
  }
13444
+ var WORKSPACE_HEADER = "X-Nodaro-Workspace";
13445
+ var WORKSPACE_HEADER_LOWER = "x-nodaro-workspace";
13446
+ var ORG_KINDS = ["school", "team"];
13447
+ var ORG_ROLES = ["owner", "admin", "member"];
13448
+ var WORKSPACE_ROLES = ["admin", "member"];
13449
+ var MEMBER_STATUSES = ["active", "suspended"];
13450
+ var ORG_STATUSES = ["pending", "active", "suspended", "deleted"];
13451
+ var COLLABORATOR_ROLES = ["editor", "viewer"];
13452
+ var WORKFLOW_VISIBILITIES = ["private", "workspace"];
13453
+ var ACCESS_LEVELS = ["own", "edit", "view", "none"];
13454
+ var GRANTED_ACCESS = ["view", "edit"];
13455
+ var SUBMISSION_STATUSES = ["submitted", "in_review", "returned", "approved"];
13456
+ var ORG_ERROR_CODES = [
13457
+ "not_a_member",
13458
+ "insufficient_role",
13459
+ "org_not_active",
13460
+ "member_suspended",
13461
+ "workspace_archived",
13462
+ "personal_space_disabled",
13463
+ "token_workspace_mismatch",
13464
+ "run_requires_authenticated_member",
13465
+ "budget_exceeded",
13466
+ "member_cap_exceeded",
13467
+ "model_not_allowed",
13468
+ "invitation_expired",
13469
+ "invitation_revoked",
13470
+ "email_mismatch",
13471
+ "join_code_invalid",
13472
+ "domain_not_allowed",
13473
+ "already_started",
13474
+ "collab_unavailable",
13475
+ // Organization, workspace and membership endpoints.
13476
+ "terms_required",
13477
+ "not_org_member",
13478
+ "already_a_member",
13479
+ "owner_cannot_leave",
13480
+ "has_active_workspaces",
13481
+ // Invitations and join codes.
13482
+ "invitation_not_found",
13483
+ "invitation_accepted",
13484
+ "bulk_invite_cap_exceeded"
13485
+ ];
13486
+ var PresetSettingsSchema = zod.z.object({
13487
+ /** What org/workspace admins may do with a member's workflow. */
13488
+ admin_access: zod.z.enum(GRANTED_ACCESS),
13489
+ default_workflow_visibility: zod.z.enum(WORKFLOW_VISIBILITIES),
13490
+ /** What a plain member may do with a `visibility = workspace` workflow. */
13491
+ member_access_to_shared: zod.z.enum(GRANTED_ACCESS),
13492
+ members_can_create_projects: zod.z.boolean(),
13493
+ member_caps_enabled: zod.z.boolean(),
13494
+ /** Whether members keep a personal (non-workspace) space at all. */
13495
+ personal_space_enabled: zod.z.boolean(),
13496
+ /** Whether a workspace admin may invite NEW people into the org. */
13497
+ workspace_admins_can_invite: zod.z.boolean(),
13498
+ /** Whether an editor collaborator may invite further collaborators. */
13499
+ collaborators_can_invite: zod.z.boolean(),
13500
+ /**
13501
+ * When the organization is SUSPENDED, do its content rules still bind its
13502
+ * members?
13503
+ *
13504
+ * Today this governs exactly one rule — `personal_space_enabled` — and that
13505
+ * is not an accident: every other key above governs behaviour INSIDE a
13506
+ * workspace, and a suspended organization grants no workspace context at
13507
+ * all, so those are already moot.
13508
+ *
13509
+ * The name is general because an organization is deciding a principle here,
13510
+ * not one checkbox's fate. Default `false`, which is today's behaviour: a
13511
+ * suspended organization stops binding, and its members work independently
13512
+ * until it resumes. An organization whose reason for disabling the personal
13513
+ * space is contractual — the work made here belongs to the institution —
13514
+ * turns this on, because an unpaid invoice does not void a contract.
13515
+ */
13516
+ policy_survives_suspension: zod.z.boolean()
13517
+ });
13518
+ var PRESET_SETTING_KEYS = Object.freeze(
13519
+ Object.keys(PresetSettingsSchema.shape)
13520
+ );
13521
+ var WorkspaceSettingsSchema = PresetSettingsSchema.partial();
13522
+ var EMAIL_DOMAIN_PATTERN = /^[a-z0-9-]+(\.[a-z0-9-]+)+$/;
13523
+ var OrgSettingsSchema = PresetSettingsSchema.partial().extend({
13524
+ /** Lower-case domains that join codes / domain auto-join accept. Empty = any. */
13525
+ allowed_email_domains: zod.z.array(zod.z.string().regex(EMAIL_DOMAIN_PATTERN)).optional(),
13526
+ /** Per-org relabelling of the kind vocabulary (./vocabulary.ts). */
13527
+ vocabulary_overrides: zod.z.record(zod.z.string(), zod.z.string()).optional()
13528
+ });
13529
+
13530
+ // src/entity-node-fields.ts
13531
+ var ENTITY_NODE_KINDS = ["character", "object", "creature", "location"];
13532
+ var ENTITY_DB_ID_FIELD = {
13533
+ character: "characterDbId",
13534
+ object: "objectDbId",
13535
+ creature: "creatureDbId",
13536
+ location: "locationDbId"
13537
+ };
13538
+ var ENTITY_NAME_FIELD = {
13539
+ character: "characterName",
13540
+ object: "objectName",
13541
+ creature: "creatureName",
13542
+ location: "locationName"
13543
+ };
13544
+ var ENTITY_TABLE = {
13545
+ character: "characters",
13546
+ object: "objects",
13547
+ creature: "creatures",
13548
+ location: "locations"
13549
+ };
13550
+ var ENTITY_BUCKET_FIELDS = {
13551
+ character: [
13552
+ ["expressions", "expressions"],
13553
+ ["poses", "poses"],
13554
+ ["motions", "motions"],
13555
+ ["angles", "angles"],
13556
+ ["body_angles", "bodyAngles"],
13557
+ ["lighting_variations", "lightingVariations"],
13558
+ ["outfit_variations", "outfitVariations"],
13559
+ ["detail_closeups", "detailCloseups"],
13560
+ ["sheets", "sheets"]
13561
+ ],
13562
+ object: [
13563
+ ["angles", "angles"],
13564
+ ["materials", "materials"],
13565
+ ["variations", "variations"],
13566
+ ["motion_clips", "motionClips"],
13567
+ ["detail_closeups", "detailCloseups"],
13568
+ ["sheets", "sheets"]
13569
+ ],
13570
+ creature: [
13571
+ ["angles", "angles"],
13572
+ ["poses", "poses"],
13573
+ ["variations", "variations"],
13574
+ ["motion_clips", "motionClips"],
13575
+ ["detail_closeups", "detailCloseups"],
13576
+ ["sheets", "sheets"]
13577
+ ],
13578
+ location: [
13579
+ ["time_of_day", "timeOfDay"],
13580
+ ["weather", "weather"],
13581
+ ["angles", "angles"],
13582
+ ["lighting", "lighting"],
13583
+ ["seasons", "seasons"],
13584
+ ["atmosphere_motions", "atmosphereMotions"],
13585
+ ["detail_closeups", "detailCloseups"],
13586
+ ["sheets", "sheets"]
13587
+ ]
13588
+ };
13589
+ var ENTITY_SCALAR_FIELDS = [
13590
+ ["name", "__name"],
13591
+ // routed to the kind's own name field by the caller
13592
+ ["description", "description"],
13593
+ ["canonical_description", "canonicalDescription"],
13594
+ ["source_image_url", "sourceImageUrl"]
13595
+ ];
13596
+ var ENTITY_KIND_SCALAR_FIELDS = {
13597
+ character: [],
13598
+ object: [["style_lock", "styleLock"]],
13599
+ creature: [["style_lock", "styleLock"]],
13600
+ location: [["style_lock", "styleLock"]]
13601
+ };
13602
+ function entityHydrationColumns(kind) {
13603
+ return [
13604
+ "id",
13605
+ ...entityScalarFields(kind).map(([column]) => column),
13606
+ ...ENTITY_BUCKET_FIELDS[kind].map(([column]) => column)
13607
+ ];
13608
+ }
13609
+ function entityScalarFields(kind) {
13610
+ return [...ENTITY_SCALAR_FIELDS, ...ENTITY_KIND_SCALAR_FIELDS[kind]];
13611
+ }
13368
13612
 
13613
+ exports.ACCESS_LEVELS = ACCESS_LEVELS;
13369
13614
  exports.ACTIVE_SCENE_HELPERS = ACTIVE_SCENE_HELPERS;
13370
13615
  exports.ADVANCED_MODE_UNAVAILABLE_REASON = ADVANCED_MODE_UNAVAILABLE_REASON;
13371
13616
  exports.AGGREGATEABLE_TYPES = AGGREGATEABLE_TYPES;
@@ -13430,6 +13675,7 @@ exports.CINEMATIC_MIN_DURATION_SEC = CINEMATIC_MIN_DURATION_SEC;
13430
13675
  exports.CINEMATIC_MIN_LOOKS = CINEMATIC_MIN_LOOKS;
13431
13676
  exports.CINEMATIC_PROMPT_MAX = CINEMATIC_PROMPT_MAX;
13432
13677
  exports.CINEMATIC_RESERVE_IDS = CINEMATIC_RESERVE_IDS;
13678
+ exports.COLLABORATOR_ROLES = COLLABORATOR_ROLES;
13433
13679
  exports.COLLECT_IN_HANDLE = COLLECT_IN_HANDLE;
13434
13680
  exports.COMBINE_TRANSITIONS = COMBINE_TRANSITIONS;
13435
13681
  exports.COMBINE_TRANSITION_GROUP_LABELS = COMBINE_TRANSITION_GROUP_LABELS;
@@ -13471,9 +13717,16 @@ exports.DetectionResultSchema = DetectionResultSchema;
13471
13717
  exports.EFFORT_TIER_BUMP = EFFORT_TIER_BUMP;
13472
13718
  exports.EMOTIONAL_BEAT = EMOTIONAL_BEAT;
13473
13719
  exports.ENTITY_ASPECT_DEFAULTS = ENTITY_ASPECT_DEFAULTS;
13720
+ exports.ENTITY_BUCKET_FIELDS = ENTITY_BUCKET_FIELDS;
13721
+ exports.ENTITY_DB_ID_FIELD = ENTITY_DB_ID_FIELD;
13474
13722
  exports.ENTITY_IMAGE_HANDLE_TYPES = ENTITY_IMAGE_HANDLE_TYPES;
13723
+ exports.ENTITY_KIND_SCALAR_FIELDS = ENTITY_KIND_SCALAR_FIELDS;
13724
+ exports.ENTITY_NAME_FIELD = ENTITY_NAME_FIELD;
13725
+ exports.ENTITY_NODE_KINDS = ENTITY_NODE_KINDS;
13726
+ exports.ENTITY_SCALAR_FIELDS = ENTITY_SCALAR_FIELDS;
13475
13727
  exports.ENTITY_SECTIONS = ENTITY_SECTIONS;
13476
13728
  exports.ENTITY_STATUSES = ENTITY_STATUSES;
13729
+ exports.ENTITY_TABLE = ENTITY_TABLE;
13477
13730
  exports.ENTITY_TOOL_RETRY_CAP = ENTITY_TOOL_RETRY_CAP;
13478
13731
  exports.ENTITY_TYPES = ENTITY_TYPES;
13479
13732
  exports.EXECUTION_DATA_KEYS = EXECUTION_DATA_KEYS;
@@ -13503,6 +13756,7 @@ exports.FixContinuityInputSchema = FixContinuityInputSchema;
13503
13756
  exports.FixContinuityResultSchema = FixContinuityResultSchema;
13504
13757
  exports.GENERATE_TEXT_DELIMITER = GENERATE_TEXT_DELIMITER;
13505
13758
  exports.GLOBAL_MAX_DURATION_SECONDS = GLOBAL_MAX_DURATION_SECONDS;
13759
+ exports.GRANTED_ACCESS = GRANTED_ACCESS;
13506
13760
  exports.GROUP_HANDLE_PREFIX = GROUP_HANDLE_PREFIX;
13507
13761
  exports.GUIDANCE_SCALE_SUPPORT = GUIDANCE_SCALE_SUPPORT;
13508
13762
  exports.GVP_ANCHOR_CHOICES = GVP_ANCHOR_CHOICES;
@@ -13580,6 +13834,7 @@ exports.MAX_NEGATIVE_PROMPT_CHARS_BY_PROVIDER = MAX_NEGATIVE_PROMPT_CHARS_BY_PRO
13580
13834
  exports.MAX_PANELS_PER_SHEET = MAX_PANELS_PER_SHEET;
13581
13835
  exports.MAX_TTS_CHARS_BY_PROVIDER = MAX_TTS_CHARS_BY_PROVIDER;
13582
13836
  exports.MAX_VIDEO_PROMPT_CHARS_BY_PROVIDER = MAX_VIDEO_PROMPT_CHARS_BY_PROVIDER;
13837
+ exports.MEMBER_STATUSES = MEMBER_STATUSES;
13583
13838
  exports.MINIMAX_H3_DEFAULT_RESOLUTION = MINIMAX_H3_DEFAULT_RESOLUTION;
13584
13839
  exports.MINIMAX_H3_PROVIDERS = MINIMAX_H3_PROVIDERS;
13585
13840
  exports.MODELS_WITH_REFERENCE_IMAGE_SUPPORT = MODELS_WITH_REFERENCE_IMAGE_SUPPORT;
@@ -13612,15 +13867,21 @@ exports.OBJECT_ASSET_VARIANTS = OBJECT_ASSET_VARIANTS;
13612
13867
  exports.OBJECT_ATTACH_COLUMNS = OBJECT_ATTACH_COLUMNS;
13613
13868
  exports.OBJECT_MOTION_PROVIDERS = OBJECT_MOTION_PROVIDERS;
13614
13869
  exports.OBJECT_PICKER_NODE_TYPES = OBJECT_PICKER_NODE_TYPES;
13870
+ exports.ORG_ERROR_CODES = ORG_ERROR_CODES;
13871
+ exports.ORG_KINDS = ORG_KINDS;
13872
+ exports.ORG_ROLES = ORG_ROLES;
13873
+ exports.ORG_STATUSES = ORG_STATUSES;
13615
13874
  exports.OUTPUT_FIELD_MAP = OUTPUT_FIELD_MAP;
13616
13875
  exports.OUTPUT_FORMATS = OUTPUT_FORMATS;
13617
13876
  exports.ObjectMetadataSchema = ObjectMetadataSchema;
13618
13877
  exports.OptimizeForModelInputSchema = OptimizeForModelInputSchema;
13619
13878
  exports.OptimizeForModelResultSchema = OptimizeForModelResultSchema;
13879
+ exports.OrgSettingsSchema = OrgSettingsSchema;
13620
13880
  exports.PARAMETER_NODE_TYPES = PARAMETER_NODE_TYPES;
13621
13881
  exports.PASSTHROUGH_TYPES = PASSTHROUGH_TYPES;
13622
13882
  exports.PAYG_RETENTION_DAYS = PAYG_RETENTION_DAYS;
13623
13883
  exports.PER_FORMAT_DURATION_BOUNDS = PER_FORMAT_DURATION_BOUNDS;
13884
+ exports.PICKER_TO_COMBINE_TRANSITION = PICKER_TO_COMBINE_TRANSITION;
13624
13885
  exports.PIPELINE_ACTIVATION_MODES = PIPELINE_ACTIVATION_MODES;
13625
13886
  exports.PIPELINE_FORMATS = PIPELINE_FORMATS;
13626
13887
  exports.PIPELINE_HARD_TIMEOUT_MS = PIPELINE_HARD_TIMEOUT_MS;
@@ -13639,6 +13900,7 @@ exports.PLATFORM_SPECS = PLATFORM_SPECS;
13639
13900
  exports.PRESET_APPLY_CLEAR_KEYS = PRESET_APPLY_CLEAR_KEYS;
13640
13901
  exports.PRESET_EXCLUDED_KEYS = PRESET_EXCLUDED_KEYS;
13641
13902
  exports.PRESET_LABELS = PRESET_LABELS;
13903
+ exports.PRESET_SETTING_KEYS = PRESET_SETTING_KEYS;
13642
13904
  exports.PRICING_DEFAULT_DURATION_SEC = PRICING_DEFAULT_DURATION_SEC;
13643
13905
  exports.PRICING_DEFAULT_RESOLUTION = PRICING_DEFAULT_RESOLUTION;
13644
13906
  exports.PROMPT_HARD_CEILING = PROMPT_HARD_CEILING;
@@ -13655,6 +13917,7 @@ exports.PipelineStageNameSchema = PipelineStageNameSchema;
13655
13917
  exports.PipelineStageStatusSchema = PipelineStageStatusSchema;
13656
13918
  exports.PipelineStateSchema = PipelineStateSchema;
13657
13919
  exports.PipelineStatusSchema = PipelineStatusSchema;
13920
+ exports.PresetSettingsSchema = PresetSettingsSchema;
13658
13921
  exports.QA_CHECK_PROVIDERS = QA_CHECK_PROVIDERS;
13659
13922
  exports.REDUCE_STRATEGIES = REDUCE_STRATEGIES;
13660
13923
  exports.REDUCE_STRATEGY_IDS = REDUCE_STRATEGY_IDS;
@@ -13705,11 +13968,13 @@ exports.STAGE_PATCH_SCHEMA = STAGE_PATCH_SCHEMA;
13705
13968
  exports.STATIC_CAPTION_STYLES = STATIC_CAPTION_STYLES;
13706
13969
  exports.STRUCTURAL_SECTIONS = STRUCTURAL_SECTIONS;
13707
13970
  exports.STRUCTURED_VISION_MODELS = STRUCTURED_VISION_MODELS;
13971
+ exports.SUBMISSION_STATUSES = SUBMISSION_STATUSES;
13708
13972
  exports.SUNO_ADD_TRACK_MODELS = SUNO_ADD_TRACK_MODELS;
13709
13973
  exports.SUNO_FIELD_HANDLE_FIELDS = SUNO_FIELD_HANDLE_FIELDS;
13710
13974
  exports.SUNO_MODELS = SUNO_MODELS;
13711
13975
  exports.SUNO_TEXT_MAX = SUNO_TEXT_MAX;
13712
13976
  exports.SUNO_TITLE_MAX = SUNO_TITLE_MAX;
13977
+ exports.SUNO_TRACK_SOURCE_TYPES = SUNO_TRACK_SOURCE_TYPES;
13713
13978
  exports.SUPPORTED_FONT_NAMES = SUPPORTED_FONT_NAMES;
13714
13979
  exports.SURROUND_DIRECTIONS = SURROUND_DIRECTIONS;
13715
13980
  exports.SWITCHX_BLOCK_FRAMES = SWITCHX_BLOCK_FRAMES;
@@ -13804,6 +14069,11 @@ exports.WARDROBE_VARIANTS = WARDROBE_VARIANTS;
13804
14069
  exports.WEAPONS = WEAPONS;
13805
14070
  exports.WEAPON_SUBCATEGORY_LABELS = WEAPON_SUBCATEGORY_LABELS;
13806
14071
  exports.WEAPON_SUBCATEGORY_ORDER = WEAPON_SUBCATEGORY_ORDER;
14072
+ exports.WORKFLOW_VISIBILITIES = WORKFLOW_VISIBILITIES;
14073
+ exports.WORKSPACE_HEADER = WORKSPACE_HEADER;
14074
+ exports.WORKSPACE_HEADER_LOWER = WORKSPACE_HEADER_LOWER;
14075
+ exports.WORKSPACE_ROLES = WORKSPACE_ROLES;
14076
+ exports.WorkspaceSettingsSchema = WorkspaceSettingsSchema;
13807
14077
  exports.aggregateByType = aggregateByType;
13808
14078
  exports.aiAvatarReserveCreditId = aiAvatarReserveCreditId;
13809
14079
  exports.analyzedSceneSchema = analyzedSceneSchema;
@@ -13836,7 +14106,6 @@ exports.buildPanelPrompt = buildPanelPrompt;
13836
14106
  exports.buildProgressSegments = buildProgressSegments;
13837
14107
  exports.buildRangeLabel = buildRangeLabel;
13838
14108
  exports.buildScraperCreditId = buildScraperCreditId;
13839
- exports.buildSurroundFillPrompt = buildSurroundFillPrompt;
13840
14109
  exports.buildVideoAnalysisCreditId = buildVideoAnalysisCreditId;
13841
14110
  exports.buildVideoAuditCreditId = buildVideoAuditCreditId;
13842
14111
  exports.buildVideoCreditModelIdentifier = buildVideoCreditModelIdentifier;
@@ -13882,6 +14151,8 @@ exports.durationsByMode = durationsByMode;
13882
14151
  exports.effectiveReasoningEffort = effectiveReasoningEffort;
13883
14152
  exports.encodeProviderItem = encodeProviderItem;
13884
14153
  exports.ensureLocaleCatalogLoaded = ensureLocaleCatalogLoaded;
14154
+ exports.entityHydrationColumns = entityHydrationColumns;
14155
+ exports.entityScalarFields = entityScalarFields;
13885
14156
  exports.entitySlotSchema = entitySlotSchema;
13886
14157
  exports.entryMatchesQuery = entryMatchesQuery;
13887
14158
  exports.estimateCombineVideosCredits = estimateCombineVideosCredits;
@@ -14038,8 +14309,10 @@ exports.qualityOptionsByKind = qualityOptionsByKind;
14038
14309
  exports.refHandleCategory = refHandleCategory;
14039
14310
  exports.referenceModalityForHandle = referenceModalityForHandle;
14040
14311
  exports.referenceSheetCreditId = referenceSheetCreditId;
14312
+ exports.registerCatalogSidecars = registerCatalogSidecars;
14041
14313
  exports.registerSidecarLoaders = registerSidecarLoaders;
14042
14314
  exports.renderAnalyzedScene = renderAnalyzedScene;
14315
+ exports.resetCatalogSidecars = resetCatalogSidecars;
14043
14316
  exports.resolutionOptionsByKind = resolutionOptionsByKind;
14044
14317
  exports.resolveAiAvatarCreditId = resolveAiAvatarCreditId;
14045
14318
  exports.resolveAudioCrossfadeCurve = resolveAudioCrossfadeCurve;
@@ -14070,10 +14343,12 @@ exports.resolveScraperCreditId = resolveScraperCreditId;
14070
14343
  exports.resolveSelectorRefs = resolveSelectorRefs;
14071
14344
  exports.resolveSeparator = resolveSeparator;
14072
14345
  exports.resolveSheetSections = resolveSheetSections;
14346
+ exports.resolveSlideshowTransition = resolveSlideshowTransition;
14073
14347
  exports.resolveSourceThroughConnectedList = resolveSourceThroughConnectedList;
14074
14348
  exports.resolveStoredTier = resolveStoredTier;
14075
14349
  exports.resolveSwitchXCreditId = resolveSwitchXCreditId;
14076
14350
  exports.resolveVideoAnalysisModel = resolveVideoAnalysisModel;
14351
+ exports.resolveVideoModeForInputs = resolveVideoModeForInputs;
14077
14352
  exports.resolveVideoProviderForMode = resolveVideoProviderForMode;
14078
14353
  exports.resolveXfadeName = resolveXfadeName;
14079
14354
  exports.rewriteSceneBindings = rewriteSceneBindings;
@@ -14092,6 +14367,7 @@ exports.selectByPredicate = selectByPredicate;
14092
14367
  exports.selectListItems = selectListItems;
14093
14368
  exports.selectLoraRoutingForMentions = selectLoraRoutingForMentions;
14094
14369
  exports.selectRandom = selectRandom;
14370
+ exports.setRegisteredPersonPackFields = setRegisteredPersonPackFields;
14095
14371
  exports.settledWithLimit = settledWithLimit;
14096
14372
  exports.slotVariationSchema = slotVariationSchema;
14097
14373
  exports.sortCharacterEntriesForDisplay = sortCharacterEntriesForDisplay;