@nodaro/prompts 1.12.0 → 1.14.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 (36) hide show
  1. package/dist/index.cjs +389 -194
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.d.cts +244 -29
  4. package/dist/index.d.ts +244 -29
  5. package/dist/index.js +377 -196
  6. package/dist/index.js.map +1 -1
  7. package/package.json +2 -2
  8. package/src/__tests__/assemble-image-input-cap.test.ts +37 -13
  9. package/src/__tests__/assemble-image-input.test.ts +100 -19
  10. package/src/__tests__/assemble-video-input-cap.test.ts +101 -15
  11. package/src/__tests__/assemble-video-input.test.ts +167 -33
  12. package/src/__tests__/direction-hint-token-safety.test.ts +21 -0
  13. package/src/__tests__/multi-picker-spec.test.ts +21 -1
  14. package/src/__tests__/person-regional-aesthetic.test.ts +2 -1
  15. package/src/__tests__/prompt-style-section.test.ts +345 -0
  16. package/src/__tests__/provider-prompt-doctrine.test.ts +39 -0
  17. package/src/__tests__/style-section-boundary.test.ts +179 -0
  18. package/src/__tests__/subject-fold.test.ts +32 -13
  19. package/src/assemble-image-input.ts +51 -26
  20. package/src/assemble-video-input.ts +54 -34
  21. package/src/direction-registry.ts +108 -37
  22. package/src/gemini-omni-inputs.ts +11 -3
  23. package/src/held-prop.ts +1 -0
  24. package/src/hint-shedding.ts +23 -4
  25. package/src/index.ts +1 -0
  26. package/src/person.ts +4 -0
  27. package/src/picker-analyzer-registry.ts +37 -0
  28. package/src/prompt-builder.ts +84 -27
  29. package/src/prompt-hint-join.ts +9 -0
  30. package/src/prompt-style-section.ts +256 -0
  31. package/src/prompt-wizard-categories.ts +6 -0
  32. package/src/provider-prompt-doctrine.ts +51 -2
  33. package/src/setting.ts +1 -0
  34. package/src/style.ts +1 -0
  35. package/src/styling.ts +5 -1
  36. package/src/video-reference-resolver.ts +5 -2
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { ANIMAL_SUBCATEGORY_LABELS, ANIMAL_SUBCATEGORY_ORDER, VEHICLE_SUBCATEGORY_LABELS, VEHICLE_SUBCATEGORY_ORDER, WEAPON_SUBCATEGORY_LABELS, WEAPON_SUBCATEGORY_ORDER, FURNITURE_SUBCATEGORY_LABELS, FURNITURE_SUBCATEGORY_ORDER, VIDEO_REF_LIMITS_BY_PROVIDER, SOCIAL_POST_NODE_TYPES, FURNITURE, WEAPONS, VEHICLES, ANIMALS, PASSTHROUGH_TYPES, registerCatalogSidecars, resetCatalogSidecars, pickIds, getAnimalPromptHint, getFurniture, getWeapon, getVehicle, DEFAULT_USAGE_MODE, usageModeDirective, DEFAULT_LOCATION_USAGE_MODE, imageReferenceLimit, knownImageSlugsFromRefs, findImageMentionTokens, knownEntitySlugsFromRefs, findEntityMentionTokens, findCharacterMentionTokens, findLocationMentionTokens, NATIVE_NEGATIVE_PROMPT_MODELS, getMaxNegativePromptChars, getMaxImagePromptChars, MODELS_WITH_REFERENCE_IMAGE_SUPPORT, getAnimalTerm, roleToPhrase, resolveDefaultRole, SEEDANCE_2_REF_LIMITS, NON_EN_LOCALE_IDS, readPromptAffixes, setRegisteredPersonPackFields, PLACEHOLDER_CHARACTER_NAME, REFERENCE_ROLE_PRESETS, imageMentionSlugForRef, entityMentionSlugForRef, defaultRoleForSource, locationReferencePhotoKindLabel, resolveNodeRefs, normalizeRoleSlug } from '@nodaro/shared';
1
+ import { ANIMAL_SUBCATEGORY_LABELS, ANIMAL_SUBCATEGORY_ORDER, VEHICLE_SUBCATEGORY_LABELS, VEHICLE_SUBCATEGORY_ORDER, WEAPON_SUBCATEGORY_LABELS, WEAPON_SUBCATEGORY_ORDER, FURNITURE_SUBCATEGORY_LABELS, FURNITURE_SUBCATEGORY_ORDER, SOCIAL_POST_NODE_TYPES, FURNITURE, WEAPONS, VEHICLES, ANIMALS, PASSTHROUGH_TYPES, registerCatalogSidecars, resetCatalogSidecars, pickIds, getAnimalPromptHint, getFurniture, getWeapon, getVehicle, DEFAULT_USAGE_MODE, usageModeDirective, DEFAULT_LOCATION_USAGE_MODE, imageReferenceLimit, knownImageSlugsFromRefs, findImageMentionTokens, knownEntitySlugsFromRefs, findEntityMentionTokens, findCharacterMentionTokens, findLocationMentionTokens, NATIVE_NEGATIVE_PROMPT_MODELS, getMaxNegativePromptChars, getMaxImagePromptChars, MODELS_WITH_REFERENCE_IMAGE_SUPPORT, getAnimalTerm, roleToPhrase, resolveDefaultRole, SEEDANCE_2_REF_LIMITS, NON_EN_LOCALE_IDS, readPromptAffixes, setRegisteredPersonPackFields, PLACEHOLDER_CHARACTER_NAME, REFERENCE_ROLE_PRESETS, imageMentionSlugForRef, entityMentionSlugForRef, defaultRoleForSource, locationReferencePhotoKindLabel, VIDEO_REF_LIMITS_BY_PROVIDER, resolveNodeRefs, normalizeRoleSlug } from '@nodaro/shared';
2
2
 
3
3
  var __defProp = Object.defineProperty;
4
4
  var __export = (target, all) => {
@@ -1764,7 +1764,8 @@ var STYLES = [
1764
1764
  { id: "pastel", label: "Pastel", description: "Degas-era soft chalk pastel", promptHint: "rendered as a soft chalk pastel drawing, dry powdery pigment laid in feathered strokes on tinted paper with luminous dusty colors, gently blended edges and the dreamy Degas-era atmosphere of dancers in stage light", term: "soft pastel drawing" },
1765
1765
  { id: "acrylic-paint", label: "Acrylic Paint", description: "Fast-drying opaque acrylic on canvas", promptHint: "rendered as an acrylic painting on canvas, fast-drying opaque pigment with crisp sharp edges, confident quick brush strokes, high-key saturated color and a flatter more graphic finish than traditional oil paint", term: "acrylic painting" },
1766
1766
  { id: "mixed-media", label: "Mixed Media", description: "Collage + paint + ink hybrid", promptHint: "rendered as a mixed-media artwork combining torn paper collage, acrylic paint, ink and graphite on a layered substrate, heterogeneous textures, visible tape and stitching, and an exuberant hand-assembled studio-art quality" },
1767
- { id: "manga", label: "Manga", description: "Inked B&W Japanese comic panel", promptHint: "rendered as inked manga panel art, crisp black ink on white with confident line weight variation, screen-tone dot patterns for shading, dramatic speed lines and the distinctly Japanese black-and-white comic aesthetic \u2014 separate from full-color anime" }
1767
+ { id: "manga", label: "Manga", description: "Inked B&W Japanese comic panel", promptHint: "rendered as inked manga panel art, crisp black ink on white with confident line weight variation, screen-tone dot patterns for shading, dramatic speed lines and the distinctly Japanese black-and-white comic aesthetic \u2014 separate from full-color anime" },
1768
+ { id: "early-color-photo", label: "Early Color Photo", description: "Prokudin-Gorsky / autochrome early-1900s color", promptHint: "rendered as an early-1900s color photograph in the Prokudin-Gorsky / autochrome tradition \u2014 soft three-colour-separation registration, muted dye-toned palette, fine grain and a gentle antique warmth", term: "early autochrome color photograph" }
1768
1769
  ];
1769
1770
  var styleById = new Map(STYLES.map((s) => [s.id, s]));
1770
1771
  function getStyle(id) {
@@ -1830,6 +1831,7 @@ var SETTINGS = [
1830
1831
  { id: "parking-lot", label: "Parking Lot", category: "urban", description: "Suburban parking lot at dusk", promptHint: "set in an empty suburban parking lot at dusk with sodium-vapor lamps casting orange pools, scattered shopping carts and painted lane lines" },
1831
1832
  { id: "penthouse", label: "Penthouse", category: "urban", description: "Luxury penthouse with skyline view", promptHint: "set in a luxury penthouse interior with panoramic skyline views, marble floors, modernist furniture and low warm ambient light" },
1832
1833
  { id: "gas-station", label: "Gas Station", category: "urban", description: "Lonely highway gas station at night", promptHint: "set at a lonely highway gas station at night with a fluorescent canopy, bug-swarmed sodium lamps and cracked asphalt" },
1834
+ { id: "open-air-market", label: "Open-Air Market", category: "urban", description: "Bustling market of vendor stalls under canopies", term: "open-air market", promptHint: "set in a bustling open-air market \u2014 rows of vendor stalls under thatched and canvas canopies, produce piled high, warm dusty light and crowds moving between the stalls" },
1833
1835
  // -------------------- Nature --------------------
1834
1836
  { id: "forest", label: "Forest Clearing", category: "nature", description: "Sunlit mossy clearing", promptHint: "set in a sunlit forest clearing with moss-covered stones, dappled light through tall trees and a soft carpet of fallen leaves" },
1835
1837
  { id: "beach", label: "Beach", category: "nature", description: "Wide sandy beach with surf", promptHint: "set on a wide sandy beach with gentle breaking surf, footprints in wet sand and a pastel horizon" },
@@ -2956,6 +2958,9 @@ var PEOPLE = [
2956
2958
  { id: "mumbai-bollywood", label: "Mumbai Bollywood", group: "Asia", dimension: "regional-aesthetic", description: "Mumbai Indian film-industry aesthetic", promptHint: "a Mumbai Bollywood aesthetic \u2014 Indian film-industry vibe, vibrant statement-glamour", term: "mumbai bollywood aesthetic" },
2957
2959
  { id: "south-india-traditional", label: "South India Traditional", group: "Asia", dimension: "regional-aesthetic", description: "Tamil / Kerala temple-town classical aesthetic", promptHint: "a South Indian traditional aesthetic \u2014 Tamil / Kerala temple-town vibe, classical refinement", term: "south indian traditional aesthetic" },
2958
2960
  { id: "bangkok-street", label: "Bangkok Street", group: "Asia", dimension: "regional-aesthetic", description: "Bangkok Thai night-market neon-urban aesthetic", promptHint: "a Bangkok street aesthetic \u2014 Thai night-market energy, neon-and-warmth urban vibe", term: "bangkok street aesthetic" },
2961
+ // ----- Central Asia -----
2962
+ { id: "samarkand-silk-road", label: "Samarkand Silk Road", group: "Central Asia", dimension: "regional-aesthetic", description: "Uzbek Silk Road bazaar aesthetic (Samarkand / Bukhara)", promptHint: "a Central Asian Silk Road aesthetic \u2014 Samarkand / Bukhara bazaar vibe, ikat-and-suzani textiles, sun-baked adobe and blue-tiled madrasa mood", term: "samarkand silk road aesthetic" },
2963
+ { id: "tashkent-modern", label: "Tashkent Modern", group: "Central Asia", dimension: "regional-aesthetic", description: "Contemporary Uzbek metropolitan Central Asian aesthetic", promptHint: "a modern Tashkent aesthetic \u2014 contemporary Uzbek metropolitan vibe, Soviet-modern-meets-Silk-Road blend, warm steppe-city confidence", term: "tashkent modern aesthetic" },
2959
2964
  // ----- Latin America -----
2960
2965
  { id: "carioca-rio", label: "Carioca (Rio)", group: "Latin America", dimension: "regional-aesthetic", description: "Rio de Janeiro beach-and-favela-music Brazilian aesthetic", promptHint: "a Carioca aesthetic \u2014 Rio de Janeiro beach-and-favela-music vibe, sun-warmed Brazilian energy", term: "carioca aesthetic" },
2961
2966
  { id: "paulista", label: "Paulista (S\xE3o Paulo)", group: "Latin America", dimension: "regional-aesthetic", description: "S\xE3o Paulo metropolitan Brazilian creative-class aesthetic", promptHint: "a Paulista aesthetic \u2014 S\xE3o Paulo metropolitan vibe, urban-Brazilian creative-class polish", term: "paulista aesthetic" },
@@ -3796,6 +3801,9 @@ var STYLINGS = [
3796
3801
  { id: "outfit-fairy", label: "Fairy", dimension: "outfit", description: "Fantasy fairy: gauzy wings, flower crown, ethereal dress", promptHint: "wearing a fantasy fairy costume \u2014 gauzy translucent wings, a flower crown, and an ethereal flowing dress", term: "fairy costume with wings" },
3797
3802
  { id: "outfit-mermaid", label: "Mermaid", dimension: "outfit", description: "Fantasy mermaid: scaled tail/skirt, shell top, flowing hair", promptHint: "wearing a fantasy mermaid costume \u2014 a scaled tail or fitted scaled skirt, a shell top, and long flowing hair", term: "mermaid costume" },
3798
3803
  { id: "outfit-pharaoh", label: "Pharaoh Regalia", dimension: "outfit", description: "Ancient Egyptian royalty: usekh collar, pectoral, pleated kilt", promptHint: "wearing ancient Egyptian pharaoh regalia \u2014 a broad beaded usekh collar, a jeweled falcon pectoral, and a pleated linen shendyt kilt with golden arm cuffs" },
3804
+ { id: "outfit-workwear-overalls", label: "Workwear Overalls", dimension: "outfit", description: "Denim bib overalls over a plaid flannel shirt", promptHint: "dressed in a farmer's workwear outfit \u2014 denim bib overalls over a checked plaid flannel shirt, sturdy and worn-in", term: "denim overalls and plaid shirt" },
3805
+ { id: "outfit-chapan", label: "Chapan Robe", dimension: "outfit", description: "Central Asian long quilted ikat robe", promptHint: "dressed in a traditional Central Asian chapan \u2014 a long quilted robe with an ikat-striped weave, tied at the waist with a sash" },
3806
+ { id: "outfit-caftan", label: "Caftan", dimension: "outfit", description: "Long flowing Middle-Eastern / North-African robe", promptHint: "dressed in a long flowing caftan robe, a full-length garment worn across the Middle East and North Africa" },
3799
3807
  // -------------------- Top (upper-body garment) --------------------
3800
3808
  { id: "top-tshirt", label: "T-Shirt", dimension: "top", description: "Plain crewneck t-shirt", promptHint: "wearing a fitted plain crewneck t-shirt with short sleeves" },
3801
3809
  { id: "top-tank", label: "Tank Top", dimension: "top", description: "Scoop-neck tank top", promptHint: "wearing a fitted scoop-neck tank top with thin shoulder straps" },
@@ -3970,6 +3978,8 @@ var STYLING_FIELD_BY_DIMENSION = {
3970
3978
  "wardrobe-state": "wardrobeState"
3971
3979
  };
3972
3980
  var MAX_SELECTED_BY_STYLING_DIMENSION = {
3981
+ headwear: 2,
3982
+ // a hat layered over a wrap/turban
3973
3983
  jewelry: 3,
3974
3984
  "wardrobe-state": 3,
3975
3985
  "hair-state": 2
@@ -6324,7 +6334,8 @@ var HELD_PROPS = [
6324
6334
  { id: "flashlight", label: "Flashlight", category: "occupational", description: "Modern flashlight cutting a beam", promptHint: "holding a modern flashlight raised forward in one hand, a sharp white beam cutting through the darkness ahead and side-lighting the face", term: "holding a flashlight raised forward" },
6325
6335
  { id: "compass", label: "Compass", category: "occupational", description: "Vintage handheld nautical compass", promptHint: "holding a vintage brass nautical compass open in one cupped palm at chest height, the needle clearly visible as the eyes drift down to read the bearing", term: "holding an open brass nautical compass" },
6326
6336
  { id: "bow-and-arrow", label: "Bow and Arrow", category: "occupational", description: "Drawn archery bow with arrow nocked", promptHint: "holding an archery bow drawn at full tension with one hand on the grip and the other pulling the string back to the cheek, an arrow nocked and aimed forward", term: "drawing an archery bow with a nocked arrow" },
6327
- { id: "shield", label: "Shield", category: "occupational", description: "Handheld medieval shield", promptHint: "holding a medieval shield raised across the body with one arm strapped through the back, the front face angled forward in a defensive stance", term: "holding a raised medieval shield" }
6337
+ { id: "shield", label: "Shield", category: "occupational", description: "Handheld medieval shield", promptHint: "holding a medieval shield raised across the body with one arm strapped through the back, the front face angled forward in a defensive stance", term: "holding a raised medieval shield" },
6338
+ { id: "work-gloves", label: "Work Gloves", category: "occupational", description: "Worn leather work gloves held in hand", promptHint: "holding a worn pair of tan leather work gloves in both hands at waist height, the thick weathered leather clearly visible", term: "holding a pair of leather work gloves" }
6328
6339
  ];
6329
6340
  var heldPropById = new Map(HELD_PROPS.map((p) => [p.id, p]));
6330
6341
  function getHeldProp(id) {
@@ -10215,6 +10226,218 @@ function applyTemplate(template, vars) {
10215
10226
  template
10216
10227
  );
10217
10228
  }
10229
+
10230
+ // src/prompt-hint-join.ts
10231
+ var PROMPT_HINT_SEPARATOR = ". ";
10232
+ function joinPromptHints(userPrompt, hints) {
10233
+ if (hints.length === 0) return userPrompt;
10234
+ return [userPrompt.trim(), ...hints].filter((p) => p.length > 0).join(PROMPT_HINT_SEPARATOR);
10235
+ }
10236
+
10237
+ // src/direction-registry.ts
10238
+ var perId = (full, compact) => (ids, mode) => {
10239
+ const out = [];
10240
+ for (const id of ids) {
10241
+ const frag = mode === "compact" ? compact(id) : full(id);
10242
+ if (frag.length > 0) out.push(frag);
10243
+ }
10244
+ return out;
10245
+ };
10246
+ var viaListBuilder = (build) => (ids, mode) => build(ids.length === 1 ? ids[0] : [...ids], mode).filter((s) => s.length > 0);
10247
+ var viaStringBuilder = (build) => (ids, mode) => {
10248
+ const s = build(ids.length === 1 ? ids[0] : [...ids], mode);
10249
+ return s.length > 0 ? [s] : [];
10250
+ };
10251
+ var viaMood = (ids, mode) => buildMoodHints({ mood: ids.length === 1 ? ids[0] : [...ids] }, mode).filter(
10252
+ (s) => s.length > 0
10253
+ );
10254
+ var framing = perId(getFramingPromptHint, getFramingTerm);
10255
+ var lighting = perId(getLightingPromptHint, getLightingTerm);
10256
+ var exposure = perId(getExposurePromptHint, getExposureTerm);
10257
+ var temporal = perId(getTemporalPromptHint, getTemporalTerm);
10258
+ var DIRECTION_FIELDS = [
10259
+ { key: "cameraMotion", surface: "video", family: "motion", maxPicks: 1, render: perId(getCameraMotionPromptHint, getCameraMotionTerm) },
10260
+ // Composition (the Framing catalog, one row per category).
10261
+ { key: "shotSize", surface: "both", family: "look", maxPicks: 1, render: framing },
10262
+ { key: "angle", surface: "both", family: "look", maxPicks: 1, render: framing },
10263
+ { key: "coverage", surface: "both", family: "look", maxPicks: 1, render: framing },
10264
+ { key: "composition", surface: "both", family: "look", maxPicks: 2, render: framing },
10265
+ { key: "vantage", surface: "both", family: "look", maxPicks: 1, render: framing },
10266
+ { key: "pose", surface: "both", family: "look", maxPicks: 1, render: perId(getPosePromptHint, getPoseTerm) },
10267
+ { key: "compositionEffect", surface: "both", family: "look", maxPicks: 1, render: perId(getCompositionEffectPromptHint, getCompositionEffectTerm) },
10268
+ // Camera.
10269
+ { key: "cameraFormat", surface: "both", family: "look", styleGroup: "film", maxPicks: 1, render: perId(getCameraFormatPromptHint, getCameraFormatTerm) },
10270
+ { key: "lens", surface: "both", family: "look", maxPicks: 1, render: perId(getLensPromptHint, getLensTerm) },
10271
+ // Exposure (stills only — a video's exposure rides its own temporal levers).
10272
+ { key: "aperture", surface: "image", family: "look", maxPicks: 1, render: exposure },
10273
+ { key: "shutterSpeed", surface: "image", family: "look", maxPicks: 1, render: exposure },
10274
+ { key: "isoValue", surface: "image", family: "look", maxPicks: 1, render: exposure },
10275
+ // Light (the Lighting catalog, one row per category).
10276
+ { key: "timeOfDay", surface: "both", family: "look", maxPicks: 1, render: lighting },
10277
+ { key: "lightingStyle", surface: "both", family: "look", maxPicks: 2, render: lighting },
10278
+ { key: "lightingDirection", surface: "both", family: "look", maxPicks: 1, render: lighting },
10279
+ { key: "lightingRatio", surface: "both", family: "look", maxPicks: 1, render: lighting },
10280
+ { key: "colorTemperature", surface: "both", family: "look", maxPicks: 1, render: lighting },
10281
+ { key: "colorLook", surface: "both", family: "look", styleGroup: "film", maxPicks: 1, render: perId(getColorLookPromptHint, getColorLookTerm) },
10282
+ { key: "atmosphere", surface: "both", family: "look", maxPicks: 2, render: viaListBuilder(buildAtmosphereHints) },
10283
+ { key: "postProcess", surface: "image", family: "look", maxPicks: 2, render: viaListBuilder(buildPostProcessHints) },
10284
+ // Style.
10285
+ { key: "style", surface: "both", family: "look", styleGroup: "film", maxPicks: 1, render: perId(getStylePromptHint, getStyleTerm) },
10286
+ { key: "mood", surface: "both", family: "look", maxPicks: 2, render: viaMood },
10287
+ { key: "aesthetic", surface: "both", family: "look", maxPicks: 2, render: viaStringBuilder(buildAestheticHints) },
10288
+ { key: "photoGenre", surface: "image", family: "look", maxPicks: 1, render: perId(getPhotoGenrePromptHint, getPhotoGenreTerm) },
10289
+ { key: "photographer", surface: "image", family: "look", maxPicks: 2, render: viaStringBuilder(buildPhotographerHints) },
10290
+ { key: "renderQuality", surface: "image", family: "look", maxPicks: 1, render: perId(getRenderQualityPromptHint, getRenderQualityTerm) },
10291
+ // Scene.
10292
+ { key: "setting", surface: "both", family: "look", maxPicks: 1, render: perId(getSettingPromptHint, getSettingTerm) },
10293
+ { key: "era", surface: "both", family: "look", styleGroup: "film", maxPicks: 1, render: perId(getEraPromptHint, getEraTerm) },
10294
+ { key: "backdrop", surface: "both", family: "look", maxPicks: 1, render: perId(getBackdropPromptHint, getBackdropTerm) },
10295
+ // Motion & time.
10296
+ { key: "actionFx", surface: "video", family: "motion", maxPicks: 2, render: viaListBuilder(buildActionFxHints) },
10297
+ { key: "temporalSpeed", surface: "video", family: "motion", maxPicks: 1, render: temporal },
10298
+ { key: "temporalFreeze", surface: "video", family: "motion", maxPicks: 1, render: temporal },
10299
+ { key: "temporalDirection", surface: "video", family: "motion", maxPicks: 1, render: temporal },
10300
+ { key: "temporalShutter", surface: "video", family: "motion", maxPicks: 1, render: temporal },
10301
+ { key: "transition", surface: "video", family: "motion", maxPicks: 2, render: perId(getTransitionPromptHint, getTransitionTerm) },
10302
+ { key: "loopSubject", surface: "video", family: "motion", maxPicks: 1, render: perId(getLoopSubjectPromptHint, getLoopSubjectTerm) },
10303
+ // ── LEGACY BLOCK — see the table doc above. Placed LAST, in today's exact
10304
+ // `composePromptText` order, so every pre-registry caller is byte-identical.
10305
+ { key: "framingId", surface: "both", family: "look", maxPicks: 1, render: framing },
10306
+ { key: "framingAngleId", surface: "both", family: "look", maxPicks: 1, render: framing },
10307
+ { key: "lightingId", surface: "both", family: "look", maxPicks: 1, render: lighting },
10308
+ { key: "lensId", surface: "both", family: "look", maxPicks: 1, render: perId(getLensPromptHint, getLensTerm) },
10309
+ { key: "cameraFormatId", surface: "both", family: "look", styleGroup: "film", maxPicks: 1, render: perId(getCameraFormatPromptHint, getCameraFormatTerm) }
10310
+ ];
10311
+ var DIRECTION_SPECS = DIRECTION_FIELDS;
10312
+ var DIRECTION_KEYS = DIRECTION_FIELDS.map((f) => f.key);
10313
+ var FILM_STYLE_KEYS = DIRECTION_SPECS.filter(
10314
+ (f) => f.styleGroup === "film"
10315
+ ).map((f) => f.key);
10316
+ var IMAGE_HINT_MODE_DEFAULT = "full";
10317
+ var VIDEO_HINT_MODE_DEFAULT = { look: "full", motion: "compact" };
10318
+ function modeForFamily(mode, family) {
10319
+ return typeof mode === "string" ? mode : family === "motion" ? mode.motion : mode.look;
10320
+ }
10321
+ var DIRECTION_ARRAY_CEILING = 8;
10322
+ var DIRECTION_ID_MAX_CHARS = 100;
10323
+ function normalizeDirectionIds(value, maxPicks) {
10324
+ const ids = [];
10325
+ if (typeof value === "string") {
10326
+ if (value) ids.push(value);
10327
+ } else if (Array.isArray(value)) {
10328
+ for (const v of value) {
10329
+ if (ids.length >= maxPicks) break;
10330
+ if (typeof v === "string" && v && !ids.includes(v)) ids.push(v);
10331
+ }
10332
+ }
10333
+ return ids.slice(0, maxPicks);
10334
+ }
10335
+ function directionFieldsForSurface(surface) {
10336
+ return DIRECTION_SPECS.filter((f) => f.surface === "both" || f.surface === surface);
10337
+ }
10338
+ function renderDirectionHintClauses(direction, opts) {
10339
+ if (!direction) return [];
10340
+ const mode = opts.mode ?? "full";
10341
+ const out = [];
10342
+ const seen = /* @__PURE__ */ new Set();
10343
+ for (const spec of DIRECTION_SPECS) {
10344
+ if (spec.surface !== "both" && spec.surface !== opts.surface) continue;
10345
+ const ids = normalizeDirectionIds(
10346
+ direction[spec.key],
10347
+ spec.maxPicks
10348
+ );
10349
+ if (ids.length === 0) continue;
10350
+ for (const hint of spec.render(ids, modeForFamily(mode, spec.family))) {
10351
+ if (hint.length > 0 && !seen.has(hint)) {
10352
+ seen.add(hint);
10353
+ out.push({
10354
+ key: spec.key,
10355
+ family: spec.family,
10356
+ ...spec.styleGroup !== void 0 ? { styleGroup: spec.styleGroup } : {},
10357
+ text: hint
10358
+ });
10359
+ }
10360
+ }
10361
+ }
10362
+ return out;
10363
+ }
10364
+ function renderDirectionHints(direction, opts) {
10365
+ return renderDirectionHintClauses(direction, opts).map((c) => c.text);
10366
+ }
10367
+
10368
+ // src/prompt-style-section.ts
10369
+ var STYLE_SECTION_HEADER = "[style]:";
10370
+ var STYLE_SECTION_GAP = "\n\n";
10371
+ var STYLE_SECTION_OPENING = `${STYLE_SECTION_GAP}${STYLE_SECTION_HEADER}
10372
+ `;
10373
+ function splitStyleSection(prompt) {
10374
+ const at = prompt.lastIndexOf(STYLE_SECTION_OPENING);
10375
+ if (at >= 0) {
10376
+ return { body: prompt.slice(0, at), section: prompt.slice(at + STYLE_SECTION_GAP.length) };
10377
+ }
10378
+ return prompt.startsWith(`${STYLE_SECTION_HEADER}
10379
+ `) ? { body: "", section: prompt } : { body: prompt, section: "" };
10380
+ }
10381
+ function insertBeforeStyleSection(prompt, lines) {
10382
+ if (lines.length === 0) return prompt;
10383
+ const block = lines.join("\n");
10384
+ const { body, section } = splitStyleSection(prompt);
10385
+ if (section.length === 0) return `${prompt}
10386
+ ${block}`;
10387
+ return `${body.length > 0 ? `${body}
10388
+ ${block}` : block}${STYLE_SECTION_GAP}${section}`;
10389
+ }
10390
+ function endsInsideStyleSection(prompt) {
10391
+ const at = prompt.lastIndexOf(STYLE_SECTION_GAP);
10392
+ const lastBlock = at >= 0 ? prompt.slice(at + STYLE_SECTION_GAP.length) : prompt;
10393
+ return lastBlock.startsWith(`${STYLE_SECTION_HEADER}
10394
+ `);
10395
+ }
10396
+ function styleSlotFor(row) {
10397
+ if (row.family === "motion") return "body";
10398
+ return row.styleGroup === "film" ? "film" : "scene";
10399
+ }
10400
+ function asBodyClauses(texts) {
10401
+ return texts.map((text) => ({ text, slot: "body" }));
10402
+ }
10403
+ function partitionStyleClauses(direction, opts) {
10404
+ return renderDirectionHintClauses(direction, opts).map((clause) => ({
10405
+ text: clause.text,
10406
+ slot: styleSlotFor(clause)
10407
+ }));
10408
+ }
10409
+ function styleSectionFromClauses(clauses) {
10410
+ const line = (slot) => clauses.filter((c) => c.slot === slot).map((c) => c.text).join(PROMPT_HINT_SEPARATOR);
10411
+ const lines = [line("film"), line("scene")].filter((l) => l.length > 0);
10412
+ return lines.length === 0 ? "" : `${STYLE_SECTION_HEADER}
10413
+ ${lines.join("\n")}`;
10414
+ }
10415
+ function renderStyleSection(direction, opts) {
10416
+ return styleSectionFromClauses(partitionStyleClauses(direction, opts));
10417
+ }
10418
+ function composeSectionedPrompt(userPrompt, clauses, structuredFragment) {
10419
+ const bodyHints = [
10420
+ ...clauses.filter((c) => c.slot === "body").map((c) => c.text),
10421
+ structuredFragment
10422
+ ].filter((p) => p.length > 0);
10423
+ const section = styleSectionFromClauses(clauses);
10424
+ if (section.length === 0) {
10425
+ return bodyHints.length === 0 ? userPrompt : joinPromptHints(userPrompt ?? "", bodyHints);
10426
+ }
10427
+ const body = bodyHints.length > 0 ? joinPromptHints(userPrompt ?? "", bodyHints) : (userPrompt ?? "").trim();
10428
+ return body.length > 0 ? `${body}${STYLE_SECTION_GAP}${section}` : section;
10429
+ }
10430
+ function sectionedClauseCosts(userPrompt, clauses, structuredFragment) {
10431
+ const lengthAt = (kept) => composeSectionedPrompt(userPrompt, clauses.slice(0, kept), structuredFragment)?.length ?? 0;
10432
+ const costs = [];
10433
+ let below = lengthAt(0);
10434
+ for (let i = 0; i < clauses.length; i++) {
10435
+ const at = lengthAt(i + 1);
10436
+ costs.push(at - below);
10437
+ below = at;
10438
+ }
10439
+ return costs;
10440
+ }
10218
10441
  function composeIdentityDescPart(subject, canonicalDesc, elementInjection) {
10219
10442
  const parts = [];
10220
10443
  const c = canonicalDesc?.trim();
@@ -10904,6 +11127,12 @@ function reconcileBodySegments(body, bodySegments) {
10904
11127
  }
10905
11128
  return [{ text: body, origin: "user" }];
10906
11129
  }
11130
+ function controlSuffixes(body, styleLine, avoidLine) {
11131
+ const separator = (text) => endsInsideStyleSection(text) ? STYLE_SECTION_GAP : "\n";
11132
+ const styleSuffix = styleLine ? `${separator(body)}${styleLine}` : "";
11133
+ const avoidSuffix = avoidLine ? `${separator(body + styleSuffix)}${avoidLine}` : "";
11134
+ return { styleSuffix, avoidSuffix };
11135
+ }
10907
11136
  function buildImagePrompt(config2) {
10908
11137
  return buildImagePromptInternal(config2);
10909
11138
  }
@@ -11180,9 +11409,7 @@ ${promptForNext}`;
11180
11409
  const lockBlock = allLockLines.length > 0 ? `${allLockLines.join("\n")}
11181
11410
 
11182
11411
  ` : "";
11183
- const trailingBlock = trailingLines.length > 0 ? `
11184
- ${trailingLines.join("\n")}` : "";
11185
- promptForNext = `${lockBlock}${promptForNext}${trailingBlock}`;
11412
+ promptForNext = `${lockBlock}${insertBeforeStyleSection(promptForNext, trailingLines)}`;
11186
11413
  }
11187
11414
  config2 = {
11188
11415
  ...config2,
@@ -11230,9 +11457,7 @@ ${trailingLines.join("\n")}` : "";
11230
11457
  ...locCanon.elementDirectives,
11231
11458
  ...objCanon.elementDirectives
11232
11459
  ];
11233
- const canonTrailingBlock = canonTrailingLines.length > 0 ? `
11234
- ${canonTrailingLines.join("\n")}` : "";
11235
- const composedScene = `${canonLockBlock}${scene}${canonTrailingBlock}`;
11460
+ const composedScene = `${canonLockBlock}${insertBeforeStyleSection(scene, canonTrailingLines)}`;
11236
11461
  prompt2 = config2.referenceLockSnippet ? `${config2.referenceLockSnippet}
11237
11462
  ${composedScene}` : composedScene;
11238
11463
  if (marks) marks.directivesPrefix = "";
@@ -11258,29 +11483,29 @@ ${directives}`;
11258
11483
  }
11259
11484
  }
11260
11485
  const styleText2 = style?.trim();
11261
- const styleSuffix2 = styleText2 ? `
11262
- Style: ${getStylePromptHint(styleText2) || styleText2}` : "";
11486
+ const styleLine2 = styleText2 ? `Style: ${getStylePromptHint(styleText2) || styleText2}` : "";
11263
11487
  const negPrompt2 = negativePrompt?.trim();
11264
11488
  let nativeNegativePrompt2;
11265
- let avoidSuffix2 = "";
11489
+ let avoidLine2 = "";
11266
11490
  if (negPrompt2) {
11267
11491
  if (NATIVE_NEGATIVE_PROMPT_MODELS.has(provider)) {
11268
11492
  nativeNegativePrompt2 = negPrompt2.slice(0, getMaxNegativePromptChars(provider));
11269
11493
  } else {
11270
- avoidSuffix2 = `
11271
- Avoid: ${negPrompt2}`;
11494
+ avoidLine2 = `Avoid: ${negPrompt2}`;
11272
11495
  }
11273
11496
  }
11274
- if (marks) {
11275
- marks.styleSuffix = styleSuffix2;
11276
- marks.avoidSuffix = avoidSuffix2;
11277
- }
11278
11497
  const maxLen2 = getMaxImagePromptChars(provider);
11279
- const reserved2 = styleSuffix2.length + avoidSuffix2.length;
11498
+ const preCut2 = controlSuffixes(prompt2, styleLine2, avoidLine2);
11499
+ const reserved2 = preCut2.styleSuffix.length + preCut2.avoidSuffix.length;
11280
11500
  if (prompt2.length + reserved2 > maxLen2) {
11281
11501
  if (marks) marks.overflowChars += prompt2.length + reserved2 - maxLen2;
11282
11502
  prompt2 = prompt2.slice(0, Math.max(0, maxLen2 - reserved2 - 3)) + "...";
11283
11503
  }
11504
+ const { styleSuffix: styleSuffix2, avoidSuffix: avoidSuffix2 } = controlSuffixes(prompt2, styleLine2, avoidLine2);
11505
+ if (marks) {
11506
+ marks.styleSuffix = styleSuffix2;
11507
+ marks.avoidSuffix = avoidSuffix2;
11508
+ }
11284
11509
  if (marks) marks.bodyBeforeSuffixes = prompt2.slice(marks.directivesPrefix.length);
11285
11510
  prompt2 = prompt2 + styleSuffix2 + avoidSuffix2;
11286
11511
  if (prompt2.length > maxLen2) {
@@ -11332,35 +11557,37 @@ Avoid: ${negPrompt2}`;
11332
11557
  let prompt = config2.prompt;
11333
11558
  if (charDescs.length > 0) {
11334
11559
  const wrapperTemplate = resolveTemplate("generate-image-wrapper", userTemplates, flowTemplates);
11335
- prompt = applyTemplate(wrapperTemplate, {
11336
- userPrompt: prompt,
11560
+ const { body, section } = splitStyleSection(prompt);
11561
+ const wrapped = applyTemplate(wrapperTemplate, {
11562
+ userPrompt: body,
11337
11563
  assetDescriptions: charDescs.join(" ")
11338
11564
  });
11565
+ prompt = section.length > 0 ? `${wrapped}${STYLE_SECTION_GAP}${section}` : wrapped;
11339
11566
  }
11340
11567
  const styleText = style?.trim();
11341
- const styleSuffix = styleText ? `
11342
- Style: ${getStylePromptHint(styleText) || styleText}` : "";
11568
+ const styleLine = styleText ? `Style: ${getStylePromptHint(styleText) || styleText}` : "";
11343
11569
  const negPrompt = negativePrompt?.trim();
11344
11570
  let nativeNegativePrompt;
11345
- let avoidSuffix = "";
11571
+ let avoidLine = "";
11346
11572
  if (negPrompt) {
11347
11573
  if (NATIVE_NEGATIVE_PROMPT_MODELS.has(provider)) {
11348
11574
  nativeNegativePrompt = negPrompt.slice(0, getMaxNegativePromptChars(provider));
11349
11575
  } else {
11350
- avoidSuffix = `
11351
- Avoid: ${negPrompt}`;
11576
+ avoidLine = `Avoid: ${negPrompt}`;
11352
11577
  }
11353
11578
  }
11354
- if (marks) {
11355
- marks.styleSuffix = styleSuffix;
11356
- marks.avoidSuffix = avoidSuffix;
11357
- }
11358
11579
  const maxLen = getMaxImagePromptChars(provider);
11359
- const reserved = styleSuffix.length + avoidSuffix.length;
11580
+ const preCut = controlSuffixes(prompt, styleLine, avoidLine);
11581
+ const reserved = preCut.styleSuffix.length + preCut.avoidSuffix.length;
11360
11582
  if (prompt.length + reserved > maxLen) {
11361
11583
  if (marks) marks.overflowChars += prompt.length + reserved - maxLen;
11362
11584
  prompt = prompt.slice(0, Math.max(0, maxLen - reserved - 3)) + "...";
11363
11585
  }
11586
+ const { styleSuffix, avoidSuffix } = controlSuffixes(prompt, styleLine, avoidLine);
11587
+ if (marks) {
11588
+ marks.styleSuffix = styleSuffix;
11589
+ marks.avoidSuffix = avoidSuffix;
11590
+ }
11364
11591
  if (marks) marks.bodyBeforeSuffixes = prompt;
11365
11592
  prompt = prompt + styleSuffix + avoidSuffix;
11366
11593
  if (prompt.length > maxLen) {
@@ -11587,7 +11814,12 @@ function capitalizeLineInitial(line) {
11587
11814
  return line.replace(/[a-zA-Z]/, (c) => c.toUpperCase());
11588
11815
  }
11589
11816
  function buildHybridScene(prompt, refs, finalIndexByUrl) {
11590
- return prompt.split("\n").map((line) => capitalizeLineInitial(expandImageRefTokensHybrid(line, refs, finalIndexByUrl))).join("\n");
11817
+ const lines = prompt.split("\n");
11818
+ const sectionAt = lines.indexOf(STYLE_SECTION_HEADER);
11819
+ return lines.map((line, i) => {
11820
+ const expanded = expandImageRefTokensHybrid(line, refs, finalIndexByUrl);
11821
+ return sectionAt >= 0 && i >= sectionAt ? expanded : capitalizeLineInitial(expanded);
11822
+ }).join("\n");
11591
11823
  }
11592
11824
  function buildIdentityDirectives(prompt, refs, meta3 = [], suppressedCanonicalLocationIds) {
11593
11825
  return collectIdentities(prompt, refs, meta3).map((id) => buildIdentityDirective(id, suppressedCanonicalLocationIds)).filter((s) => s.length > 0).join("\n");
@@ -11805,125 +12037,6 @@ function renderLens(l) {
11805
12037
  if (l.aperture) bits.push(`f/${l.aperture}`);
11806
12038
  return bits.length > 0 ? `Lens: ${bits.join(", ")}.` : "";
11807
12039
  }
11808
-
11809
- // src/direction-registry.ts
11810
- var perId = (full, compact) => (ids, mode) => {
11811
- const out = [];
11812
- for (const id of ids) {
11813
- const frag = mode === "compact" ? compact(id) : full(id);
11814
- if (frag.length > 0) out.push(frag);
11815
- }
11816
- return out;
11817
- };
11818
- var viaListBuilder = (build) => (ids, mode) => build(ids.length === 1 ? ids[0] : [...ids], mode).filter((s) => s.length > 0);
11819
- var viaStringBuilder = (build) => (ids, mode) => {
11820
- const s = build(ids.length === 1 ? ids[0] : [...ids], mode);
11821
- return s.length > 0 ? [s] : [];
11822
- };
11823
- var viaMood = (ids, mode) => buildMoodHints({ mood: ids.length === 1 ? ids[0] : [...ids] }, mode).filter(
11824
- (s) => s.length > 0
11825
- );
11826
- var framing = perId(getFramingPromptHint, getFramingTerm);
11827
- var lighting = perId(getLightingPromptHint, getLightingTerm);
11828
- var exposure = perId(getExposurePromptHint, getExposureTerm);
11829
- var temporal = perId(getTemporalPromptHint, getTemporalTerm);
11830
- var DIRECTION_FIELDS = [
11831
- { key: "cameraMotion", surface: "video", family: "motion", maxPicks: 1, render: perId(getCameraMotionPromptHint, getCameraMotionTerm) },
11832
- // Composition (the Framing catalog, one row per category).
11833
- { key: "shotSize", surface: "both", family: "look", maxPicks: 1, render: framing },
11834
- { key: "angle", surface: "both", family: "look", maxPicks: 1, render: framing },
11835
- { key: "coverage", surface: "both", family: "look", maxPicks: 1, render: framing },
11836
- { key: "composition", surface: "both", family: "look", maxPicks: 2, render: framing },
11837
- { key: "vantage", surface: "both", family: "look", maxPicks: 1, render: framing },
11838
- { key: "pose", surface: "both", family: "look", maxPicks: 1, render: perId(getPosePromptHint, getPoseTerm) },
11839
- { key: "compositionEffect", surface: "both", family: "look", maxPicks: 1, render: perId(getCompositionEffectPromptHint, getCompositionEffectTerm) },
11840
- // Camera.
11841
- { key: "cameraFormat", surface: "both", family: "look", maxPicks: 1, render: perId(getCameraFormatPromptHint, getCameraFormatTerm) },
11842
- { key: "lens", surface: "both", family: "look", maxPicks: 1, render: perId(getLensPromptHint, getLensTerm) },
11843
- // Exposure (stills only — a video's exposure rides its own temporal levers).
11844
- { key: "aperture", surface: "image", family: "look", maxPicks: 1, render: exposure },
11845
- { key: "shutterSpeed", surface: "image", family: "look", maxPicks: 1, render: exposure },
11846
- { key: "isoValue", surface: "image", family: "look", maxPicks: 1, render: exposure },
11847
- // Light (the Lighting catalog, one row per category).
11848
- { key: "timeOfDay", surface: "both", family: "look", maxPicks: 1, render: lighting },
11849
- { key: "lightingStyle", surface: "both", family: "look", maxPicks: 2, render: lighting },
11850
- { key: "lightingDirection", surface: "both", family: "look", maxPicks: 1, render: lighting },
11851
- { key: "lightingRatio", surface: "both", family: "look", maxPicks: 1, render: lighting },
11852
- { key: "colorTemperature", surface: "both", family: "look", maxPicks: 1, render: lighting },
11853
- { key: "colorLook", surface: "both", family: "look", maxPicks: 1, render: perId(getColorLookPromptHint, getColorLookTerm) },
11854
- { key: "atmosphere", surface: "both", family: "look", maxPicks: 2, render: viaListBuilder(buildAtmosphereHints) },
11855
- { key: "postProcess", surface: "image", family: "look", maxPicks: 2, render: viaListBuilder(buildPostProcessHints) },
11856
- // Style.
11857
- { key: "style", surface: "both", family: "look", maxPicks: 1, render: perId(getStylePromptHint, getStyleTerm) },
11858
- { key: "mood", surface: "both", family: "look", maxPicks: 2, render: viaMood },
11859
- { key: "aesthetic", surface: "both", family: "look", maxPicks: 2, render: viaStringBuilder(buildAestheticHints) },
11860
- { key: "photoGenre", surface: "image", family: "look", maxPicks: 1, render: perId(getPhotoGenrePromptHint, getPhotoGenreTerm) },
11861
- { key: "photographer", surface: "image", family: "look", maxPicks: 2, render: viaStringBuilder(buildPhotographerHints) },
11862
- { key: "renderQuality", surface: "image", family: "look", maxPicks: 1, render: perId(getRenderQualityPromptHint, getRenderQualityTerm) },
11863
- // Scene.
11864
- { key: "setting", surface: "both", family: "look", maxPicks: 1, render: perId(getSettingPromptHint, getSettingTerm) },
11865
- { key: "era", surface: "both", family: "look", maxPicks: 1, render: perId(getEraPromptHint, getEraTerm) },
11866
- { key: "backdrop", surface: "both", family: "look", maxPicks: 1, render: perId(getBackdropPromptHint, getBackdropTerm) },
11867
- // Motion & time.
11868
- { key: "actionFx", surface: "video", family: "motion", maxPicks: 2, render: viaListBuilder(buildActionFxHints) },
11869
- { key: "temporalSpeed", surface: "video", family: "motion", maxPicks: 1, render: temporal },
11870
- { key: "temporalFreeze", surface: "video", family: "motion", maxPicks: 1, render: temporal },
11871
- { key: "temporalDirection", surface: "video", family: "motion", maxPicks: 1, render: temporal },
11872
- { key: "temporalShutter", surface: "video", family: "motion", maxPicks: 1, render: temporal },
11873
- { key: "transition", surface: "video", family: "motion", maxPicks: 2, render: perId(getTransitionPromptHint, getTransitionTerm) },
11874
- { key: "loopSubject", surface: "video", family: "motion", maxPicks: 1, render: perId(getLoopSubjectPromptHint, getLoopSubjectTerm) },
11875
- // ── LEGACY BLOCK — see the table doc above. Placed LAST, in today's exact
11876
- // `composePromptText` order, so every pre-registry caller is byte-identical.
11877
- { key: "framingId", surface: "both", family: "look", maxPicks: 1, render: framing },
11878
- { key: "framingAngleId", surface: "both", family: "look", maxPicks: 1, render: framing },
11879
- { key: "lightingId", surface: "both", family: "look", maxPicks: 1, render: lighting },
11880
- { key: "lensId", surface: "both", family: "look", maxPicks: 1, render: perId(getLensPromptHint, getLensTerm) },
11881
- { key: "cameraFormatId", surface: "both", family: "look", maxPicks: 1, render: perId(getCameraFormatPromptHint, getCameraFormatTerm) }
11882
- ];
11883
- var DIRECTION_KEYS = DIRECTION_FIELDS.map((f) => f.key);
11884
- var IMAGE_HINT_MODE_DEFAULT = "full";
11885
- var VIDEO_HINT_MODE_DEFAULT = { look: "full", motion: "compact" };
11886
- function modeForFamily(mode, family) {
11887
- return typeof mode === "string" ? mode : family === "motion" ? mode.motion : mode.look;
11888
- }
11889
- var DIRECTION_ARRAY_CEILING = 8;
11890
- var DIRECTION_ID_MAX_CHARS = 100;
11891
- function normalizeDirectionIds(value, maxPicks) {
11892
- const ids = [];
11893
- if (typeof value === "string") {
11894
- if (value) ids.push(value);
11895
- } else if (Array.isArray(value)) {
11896
- for (const v of value) {
11897
- if (ids.length >= maxPicks) break;
11898
- if (typeof v === "string" && v && !ids.includes(v)) ids.push(v);
11899
- }
11900
- }
11901
- return ids.slice(0, maxPicks);
11902
- }
11903
- function directionFieldsForSurface(surface) {
11904
- return DIRECTION_FIELDS.filter((f) => f.surface === "both" || f.surface === surface);
11905
- }
11906
- function renderDirectionHints(direction, opts) {
11907
- if (!direction) return [];
11908
- const mode = opts.mode ?? "full";
11909
- const out = [];
11910
- const seen = /* @__PURE__ */ new Set();
11911
- for (const spec of DIRECTION_FIELDS) {
11912
- if (spec.surface !== "both" && spec.surface !== opts.surface) continue;
11913
- const ids = normalizeDirectionIds(
11914
- direction[spec.key],
11915
- spec.maxPicks
11916
- );
11917
- if (ids.length === 0) continue;
11918
- for (const hint of spec.render(ids, modeForFamily(mode, spec.family))) {
11919
- if (hint.length > 0 && !seen.has(hint)) {
11920
- seen.add(hint);
11921
- out.push(hint);
11922
- }
11923
- }
11924
- }
11925
- return out;
11926
- }
11927
12040
  var viaFragmentBuilder = (build) => (subject, mode) => {
11928
12041
  const clause = build(subject, mode).filter((s) => s.length > 0).join(", ");
11929
12042
  return clause.length > 0 ? [clause] : [];
@@ -12048,20 +12161,13 @@ function renderSubjectHints(subject, opts) {
12048
12161
  return out;
12049
12162
  }
12050
12163
 
12051
- // src/prompt-hint-join.ts
12052
- var PROMPT_HINT_SEPARATOR = ". ";
12053
- function joinPromptHints(userPrompt, hints) {
12054
- if (hints.length === 0) return userPrompt;
12055
- return [userPrompt.trim(), ...hints].filter((p) => p.length > 0).join(PROMPT_HINT_SEPARATOR);
12056
- }
12057
-
12058
12164
  // src/hint-shedding.ts
12059
- function keepableDirectionHints(hintClauses, kept, deficit) {
12165
+ function keepableDirectionHints(hintClauses, kept, deficit, clauseCosts) {
12060
12166
  let remaining = deficit;
12061
12167
  let next = kept;
12062
12168
  while (next > 0 && remaining > 0) {
12063
12169
  next -= 1;
12064
- remaining -= hintClauses[next].length + PROMPT_HINT_SEPARATOR.length;
12170
+ remaining -= clauseCosts?.[next] ?? hintClauses[next].length + PROMPT_HINT_SEPARATOR.length;
12065
12171
  }
12066
12172
  return next;
12067
12173
  }
@@ -12415,9 +12521,7 @@ function resolveVideoReferenceCore(args) {
12415
12521
  const lockBlock = lockLines.length > 0 ? `${lockLines.join("\n")}
12416
12522
 
12417
12523
  ` : "";
12418
- const trailingBlock = trailingLines.length > 0 ? `
12419
- ${trailingLines.join("\n")}` : "";
12420
- finalPrompt = `${lockBlock}${finalPrompt}${trailingBlock}`;
12524
+ finalPrompt = `${lockBlock}${insertBeforeStyleSection(finalPrompt, trailingLines)}`;
12421
12525
  } else {
12422
12526
  const allFallbackLines = [...fallbackDirectiveLines, ...extraDirectiveLines];
12423
12527
  if (allFallbackLines.length > 0) {
@@ -12654,24 +12758,26 @@ function assembleSunoInput(input) {
12654
12758
  function renderImageHintPieces(subject, direction, structured) {
12655
12759
  return {
12656
12760
  hintClauses: [
12657
- ...renderSubjectHints(subject, {
12658
- surface: "image",
12659
- mode: SUBJECT_IMAGE_HINT_MODE_DEFAULT
12660
- }),
12661
- ...renderDirectionHints(direction, {
12761
+ ...asBodyClauses(
12762
+ renderSubjectHints(subject, {
12763
+ surface: "image",
12764
+ mode: SUBJECT_IMAGE_HINT_MODE_DEFAULT
12765
+ })
12766
+ ),
12767
+ ...partitionStyleClauses(direction, {
12662
12768
  surface: "image",
12663
12769
  mode: IMAGE_HINT_MODE_DEFAULT
12664
12770
  })
12665
- ].filter((p) => p.length > 0),
12771
+ ].filter((c) => c.text.length > 0),
12666
12772
  structuredFragment: structured ? renderStructuredFields(structured) : ""
12667
12773
  };
12668
12774
  }
12669
12775
  function composePromptText(userPrompt, pieces, keptHintClauses) {
12670
- const hints = [
12671
- ...pieces.hintClauses.slice(0, keptHintClauses),
12776
+ return composeSectionedPrompt(
12777
+ userPrompt,
12778
+ pieces.hintClauses.slice(0, keptHintClauses),
12672
12779
  pieces.structuredFragment
12673
- ].filter((p) => p.length > 0);
12674
- return joinPromptHints(userPrompt, hints);
12780
+ );
12675
12781
  }
12676
12782
  function assembleImageInput(input) {
12677
12783
  const pieces = renderImageHintPieces(input.subject, input.direction, input.structured);
@@ -12701,9 +12807,17 @@ function assembleImageInput(input) {
12701
12807
  });
12702
12808
  let kept = pieces.hintClauses.length;
12703
12809
  let fitted = assembleWith(kept);
12704
- while (fitted.overflowChars > 0 && kept > 0) {
12705
- kept = keepableDirectionHints(pieces.hintClauses, kept, fitted.overflowChars);
12706
- fitted = assembleWith(kept);
12810
+ if (fitted.overflowChars > 0) {
12811
+ const costs = sectionedClauseCosts(
12812
+ input.userPrompt,
12813
+ pieces.hintClauses,
12814
+ pieces.structuredFragment
12815
+ );
12816
+ const texts = pieces.hintClauses.map((c) => c.text);
12817
+ while (fitted.overflowChars > 0 && kept > 0) {
12818
+ kept = keepableDirectionHints(texts, kept, fitted.overflowChars, costs);
12819
+ fitted = assembleWith(kept);
12820
+ }
12707
12821
  }
12708
12822
  const { overflowChars, ...result } = fitted;
12709
12823
  if (input.throwOnEmpty && !result.prompt.trim()) {
@@ -12717,31 +12831,30 @@ function assembleImageInput(input) {
12717
12831
  // src/assemble-video-input.ts
12718
12832
  function composeVideoPromptText(userPrompt, direction, structured, opts) {
12719
12833
  const hintClauses = [
12720
- ...renderSubjectHints(opts?.subject, {
12721
- surface: "video",
12722
- mode: opts?.subjectHintMode ?? SUBJECT_VIDEO_HINT_MODE_DEFAULT
12723
- }),
12724
- ...renderDirectionHints(direction, {
12834
+ ...asBodyClauses(
12835
+ renderSubjectHints(opts?.subject, {
12836
+ surface: "video",
12837
+ mode: opts?.subjectHintMode ?? SUBJECT_VIDEO_HINT_MODE_DEFAULT
12838
+ })
12839
+ ),
12840
+ ...partitionStyleClauses(direction, {
12725
12841
  surface: "video",
12726
12842
  mode: opts?.hintMode ?? VIDEO_HINT_MODE_DEFAULT
12727
12843
  })
12728
- ].filter((p) => p.length > 0);
12844
+ ].filter((c) => c.text.length > 0);
12729
12845
  const structuredFragment = structured ? renderStructuredFields(structured) : "";
12730
- const composeWith = (kept2) => {
12731
- const hints = [...hintClauses.slice(0, kept2), structuredFragment].filter(
12732
- (p) => p.length > 0
12733
- );
12734
- if (hints.length === 0) return userPrompt;
12735
- return joinPromptHints(userPrompt ?? "", hints);
12736
- };
12846
+ const composeWith = (kept2) => composeSectionedPrompt(userPrompt, hintClauses.slice(0, kept2), structuredFragment);
12737
12847
  const cap = opts?.cap;
12738
12848
  if (cap === void 0) return composeWith(hintClauses.length);
12739
12849
  const frame = opts?.frame ?? ((body2) => body2);
12740
12850
  let kept = hintClauses.length;
12741
12851
  let body = composeWith(kept);
12742
12852
  let framedLength = frame(body)?.length ?? 0;
12853
+ if (framedLength <= cap) return body;
12854
+ const costs = sectionedClauseCosts(userPrompt, hintClauses, structuredFragment);
12855
+ const texts = hintClauses.map((c) => c.text);
12743
12856
  while (framedLength > cap && kept > 0) {
12744
- kept = keepableDirectionHints(hintClauses, kept, framedLength - cap);
12857
+ kept = keepableDirectionHints(texts, kept, framedLength - cap, costs);
12745
12858
  body = composeWith(kept);
12746
12859
  framedLength = frame(body)?.length ?? 0;
12747
12860
  }
@@ -12918,10 +13031,13 @@ function resolveSeedance2Inputs(args) {
12918
13031
  droppedRefImages
12919
13032
  };
12920
13033
  }
12921
- var GEMINI_OMNI_INPUT_SLOTS = VIDEO_REF_LIMITS_BY_PROVIDER["gemini-omni-video"]?.images ?? 7;
13034
+ var DEFAULT_GEMINI_OMNI_PROVIDER = "gemini-omni-video";
13035
+ function geminiOmniInputSlots(provider) {
13036
+ return VIDEO_REF_LIMITS_BY_PROVIDER[provider ?? DEFAULT_GEMINI_OMNI_PROVIDER]?.images ?? 7;
13037
+ }
12922
13038
  function resolveGeminiOmniI2vInputs(args) {
12923
13039
  const refs = (args.refImageUrls ?? []).filter((u) => typeof u === "string" && u.length > 0);
12924
- const slots = GEMINI_OMNI_INPUT_SLOTS - (args.videoConnected ? 2 : 0);
13040
+ const slots = geminiOmniInputSlots(args.provider) - (args.videoConnected ? 2 : 0);
12925
13041
  const refSlots = Math.max(0, slots - 1);
12926
13042
  const kept = refs.slice(0, refSlots);
12927
13043
  const droppedRefImages = refs.length - kept.length;
@@ -27760,6 +27876,23 @@ var GAPS_SCHEMA = external_exports.object({
27760
27876
  ).max(8).default([])
27761
27877
  }).default({ missingItems: [], missingCategories: [] });
27762
27878
  var MULTI_CACHE = /* @__PURE__ */ new Map();
27879
+ function pickerDisplayName(type) {
27880
+ return type.split("-").map((w) => w.length > 0 ? w[0].toUpperCase() + w.slice(1) : w).join(" ");
27881
+ }
27882
+ function buildOtherPickersLegend(sorted) {
27883
+ const otherTypes = PICKER_TYPES.filter((t) => !sorted.includes(t));
27884
+ if (otherTypes.length === 0) return "";
27885
+ const lines = otherTypes.map((type) => {
27886
+ const descriptor = PICKER_ANALYZER_REGISTRY[type];
27887
+ if (descriptor.kind === "flat") {
27888
+ return `- ${type}: ${descriptor.label}`;
27889
+ }
27890
+ const dims = descriptor.order.map((k) => descriptor.labels[k]).filter(Boolean).join(", ");
27891
+ return `- ${type}: ${pickerDisplayName(type)}${dims ? ` \u2014 ${dims}` : ""}`;
27892
+ });
27893
+ return `Non-wired pickers \u2014 use one of these keys in a gap's \`picker\` when an attribute belongs to it:
27894
+ ${lines.join("\n")}`;
27895
+ }
27763
27896
  function buildMultiPickerAnalyzerSpec(types) {
27764
27897
  const sorted = [...new Set(types)].sort();
27765
27898
  const key = sorted.join(",");
@@ -27777,7 +27910,8 @@ ${buildPickerLegend(spec)}`);
27777
27910
  const result = {
27778
27911
  schema: external_exports.object(shape).strict(),
27779
27912
  toolName: "emit_pickers",
27780
- legend: legendParts.join("\n\n")
27913
+ legend: legendParts.join("\n\n"),
27914
+ otherPickersLegend: buildOtherPickersLegend(sorted)
27781
27915
  };
27782
27916
  MULTI_CACHE.set(key, result);
27783
27917
  return result;
@@ -28183,8 +28317,8 @@ Sources: Google Cloud "Ultimate prompting guide for Veo 3.1"
28183
28317
  KIE VEO API docs (docs.kie.ai/veo3-api/generate-veo-3-video). Captured 2026-08-09.`
28184
28318
  };
28185
28319
  var GEMINI_OMNI_DOCTRINE = {
28186
- providers: ["gemini-omni-video"],
28187
- heading: "Gemini Omni Video (gemini-omni-video)",
28320
+ providers: ["gemini-omni-video", "gemini-omni-flash"],
28321
+ heading: "Gemini Omni (gemini-omni-video, gemini-omni-flash)",
28188
28322
  tips: [
28189
28323
  "Multimodal Google video with native audio: text-to-video, image-to-video, and video-edit through the same prompt surface. 4/6/8/10s; 720p/1080p or 4K tier.",
28190
28324
  "Structure like the platform default: subject \u2192 action \u2192 scene \u2192 lighting \u2192 camera \u2192 style. Quote dialogue lines to have them spoken; describe SFX/ambience plainly in the prompt.",
@@ -28206,6 +28340,7 @@ subject \u2192 action \u2192 scene/environment \u2192 lighting \u2192 camera mov
28206
28340
 
28207
28341
  **Duration & tiers**
28208
28342
  - 4 / 6 / 8 / 10 seconds. 720p/1080p tier or the pricier 4K tier \u2014 pick 4K only when the deliverable needs it (nearly 2\xD7 the credits).
28343
+ - gemini-omni-flash is the faster/cheaper tier with the identical request surface \u2014 same 4/6/8/10s, same 720p/1080p and 4K tiers, same video-edit path. Everything above applies verbatim.
28209
28344
 
28210
28345
  Source: KIE gemini-omni-video market contract (parameters + live behavior probed for the
28211
28346
  aspect-ratio hard-reject, see providers/kie/video.ts). Captured 2026-08-09.`
@@ -28275,6 +28410,45 @@ push-in (intimacy/tension), pull-out (scale/isolation), tracking shot, orbit, fi
28275
28410
  Source: Alibaba Cloud Model Studio \u2014 "Text-to-video / image-to-video prompt guide"
28276
28411
  (alibabacloud.com/help/en/model-studio/text-to-video-prompt). Captured 2026-08-09.`
28277
28412
  };
28413
+ var WAN_3_DOCTRINE = {
28414
+ providers: ["wan-3", "wan-3-prime"],
28415
+ heading: "Wan 3.0 (wan-3, wan-3-prime)",
28416
+ tips: [
28417
+ "Two INPUT MODES, exclusive on the wire: first/last frame, OR reference mode (images + videos + audio). With any reference wired the platform folds the frame into the references and names it in the prompt.",
28418
+ `References bind by ordinal token in array order: Image1, Image2, Video1, Audio1 \u2014 no space, unlike Wan 2.x's "Image 1". Name every wired asset or it may be ignored.`,
28419
+ "Reference caps: 10 images / 5 videos / 5 audio clips; each video and each audio clip 1-15s, with \u226415s combined per array. With reference videos, input seconds + output duration \u2264 30.",
28420
+ "2-30 seconds (default 5); 480p/720p/1080p; aspect adaptive (default, matches the input media) or 16:9 / 4:3 / 1:1 / 3:4 / 9:16. Prompt cap 20,000 chars \u2014 excess is truncated silently.",
28421
+ '`audio` is a boolean, ON by default: the clip comes back with an ambient/SFX track. Cue the sound you want in the prompt, or state the exclusion ("no music") \u2014 it is not a dialogue guarantee.',
28422
+ "wan-3-prime is the HIGH-SPEED tier: identical surface and limits, faster turnaround at a higher per-second rate. It is not a quality upgrade \u2014 choose it for latency, not for looks."
28423
+ ],
28424
+ doctrine: `Prompt structure (no public Wan 3.0 prompt guide exists \u2014 the KIE API contract is the
28425
+ doctrine source, like MiniMax H3 and HappyHorse; platform-standard structure applies):
28426
+ subject \u2192 action \u2192 scene/environment \u2192 lighting \u2192 camera movement \u2192 style \u2192 constraints.
28427
+
28428
+ **Modes (mutually exclusive at the provider)**
28429
+ - Frame mode: first_frame_url, optionally with last_frame_url, and NO references \u2014 the frames anchor the shot exactly, so describe MOTION and camera, not the still.
28430
+ - Reference mode: image / video / audio reference arrays. The provider CANNOT take these together with the first/last frame parameters, so when both are wired the platform folds \u2014 the frame is appended to the reference images (after the caller's own, ordinals unchanged) and bound in the prompt as the opening/closing frame. Write for reference mode whenever a reference is attached.
28431
+ - Text-only runs are supported and are the model's default mode.
28432
+
28433
+ **Reference binding**
28434
+ - Assets bind by ORDINAL TOKEN in array order: Image1, Image2, \u2026, Video1, \u2026, Audio1, \u2026. Note the format has NO space \u2014 Wan 2.x's "Image 1" is a different generation and does not apply here.
28435
+ - Write the binding into the prompt explicitly ("Image1 walks into the room described in Image2"); an unnamed reference may simply be ignored.
28436
+ - Caps: up to 10 images, 5 videos, 5 audio clips. Each video and each audio clip must be 1-15s with \u226415s combined per array. Audio should not be the only media input \u2014 pair it with an image or a video.
28437
+
28438
+ **Duration, resolution, aspect**
28439
+ - 2-30 seconds (provider default 5). With reference videos there is an extra ceiling: input video duration + output duration \u2264 30 seconds.
28440
+ - 480p / 720p / 1080p. Aspect "adaptive" (the default \u2014 the model selects the ratio from the input media and intent) or 16:9 / 4:3 / 1:1 / 3:4 / 9:16. There is no 21:9.
28441
+ - Prompts accept Chinese and English, up to 20,000 characters; anything beyond is truncated silently, so front-load the load-bearing content.
28442
+
28443
+ **Audio**
28444
+ - The "audio" boolean defaults ON and produces an ambient/SFX track with the clip. Describe the soundscape you want plainly ("rain on glass, distant traffic"), or state the exclusion, or turn the toggle off. The contract documents no lip-synced dialogue guarantee \u2014 plan spoken lines as a separate TTS + lip-sync pass.
28445
+
28446
+ **Tiers**
28447
+ - wan-3 and wan-3-prime take identical inputs. Prime trades a higher per-second rate for faster turnaround; it is not documented as a quality tier.
28448
+
28449
+ Source: KIE Wan 3.0 market contract (docs.kie.ai/market/wan/3-0-video,
28450
+ docs.kie.ai/market/wan/3-0-video-prime). Captured 2026-09-01.`
28451
+ };
28278
28452
  var HAPPYHORSE_DOCTRINE = {
28279
28453
  providers: ["happyhorse", "happyhorse-i2v", "happyhorse-ref2v", "happyhorse-edit"],
28280
28454
  heading: "HappyHorse 1.1 (happyhorse, happyhorse-i2v, happyhorse-ref2v)",
@@ -28330,6 +28504,7 @@ var PROVIDER_PROMPT_DOCTRINES = [
28330
28504
  GEMINI_OMNI_DOCTRINE,
28331
28505
  GROK_IMAGINE_DOCTRINE,
28332
28506
  WAN_DOCTRINE,
28507
+ WAN_3_DOCTRINE,
28333
28508
  HAPPYHORSE_DOCTRINE,
28334
28509
  RUNWAY_KIE_DOCTRINE
28335
28510
  ];
@@ -28554,6 +28729,9 @@ var PROVIDER_CAPABILITIES = {
28554
28729
  "ltx-2.3-pro": "Lightricks LTX 2.3 Pro \u2014 text/image/audio\u2192video, 6\u201310s, up to 4K",
28555
28730
  "ltx-2.3-fast": "Lightricks LTX 2.3 Fast \u2014 text/image\u2192video, 6\u201320s, up to 4K",
28556
28731
  "gemini-omni-video": "Google Gemini Omni \u2014 multimodal video with native audio, 4\u201310s, up to 4K.",
28732
+ "gemini-omni-flash": "Google Gemini Omni Flash \u2014 faster, cheaper Omni tier; multimodal video with native audio, 4\u201310s, up to 4K.",
28733
+ "wan-3": "Wan 3.0 \u2014 multimodal refs (10 images / 5 videos / 5 audio) or first+last frame, native audio, 2\u201330s, 480p/720p/1080p",
28734
+ "wan-3-prime": "Wan 3.0 Prime \u2014 high-speed Wan 3.0 tier; same surface, faster turnaround at a higher rate",
28557
28735
  "grok-imagine-video-1.5": "Grok Imagine 1.5 \u2014 image-to-video only; requires an input image"
28558
28736
  },
28559
28737
  "image-to-video": {
@@ -28587,6 +28765,9 @@ var PROVIDER_CAPABILITIES = {
28587
28765
  "ltx-2.3-pro": "Lightricks LTX 2.3 Pro \u2014 start/end frame i2v + audio\u2192video, 6\u201310s, up to 4K",
28588
28766
  "ltx-2.3-fast": "Lightricks LTX 2.3 Fast \u2014 start/end frame i2v, 6\u201320s, up to 4K",
28589
28767
  "gemini-omni-video": "Google Gemini Omni \u2014 multimodal video with native audio, 4\u201310s, up to 4K.",
28768
+ "gemini-omni-flash": "Google Gemini Omni Flash \u2014 faster, cheaper Omni tier; multimodal video with native audio, 4\u201310s, up to 4K.",
28769
+ "wan-3": "Wan 3.0 \u2014 multimodal refs (10 images / 5 videos / 5 audio) or first+last frame, native audio, 2\u201330s, 480p/720p/1080p",
28770
+ "wan-3-prime": "Wan 3.0 Prime \u2014 high-speed Wan 3.0 tier; same surface, faster turnaround at a higher rate",
28590
28771
  "grok-imagine-video-1.5": "Grok Imagine 1.5 \u2014 stylized animation, 1\u201315s, 480p/720p (image required)"
28591
28772
  },
28592
28773
  "video-to-video": {
@@ -34059,6 +34240,6 @@ function buildSurroundFillPrompt(direction, userPrompt) {
34059
34240
  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.`;
34060
34241
  }
34061
34242
 
34062
- export { ACTION_FX, ACTION_FX_CATEGORY_LABELS, ACTION_FX_CATEGORY_ORDER, ACTION_FX_IDS, AESTHETICS, AESTHETIC_CATEGORY_LABELS, AESTHETIC_CATEGORY_ORDER, AESTHETIC_IDS, ALL_PICKER_WIRING, ANALYZABLE_PICKER_TYPES, ANGLE_LABELS, ASPECT_RATIO_LABELS, ATMOSPHERES, ATMOSPHERE_IDS, AUDIO_WIZARD_CATEGORIES, BACKDROPS, BACKDROP_CATEGORY_LABELS, BACKDROP_CATEGORY_ORDER, BACKDROP_IDS, BRAND_PRESETS, BRAND_PRESET_IDS, BRAND_PRESET_META, CAMERA_FORMATS, CAMERA_FORMAT_IDS, CAMERA_MOTIONS, CAMERA_MOTION_CATEGORY_LABELS, CAMERA_MOTION_CATEGORY_ORDER, CAMERA_MOTION_IDS, CHARACTER_FX, CHARACTER_FX_CATEGORY_LABELS, CHARACTER_FX_CATEGORY_ORDER, CHARACTER_FX_DURATIONS, CHARACTER_FX_IDS, CHARACTER_FX_INTENSITIES, CHARACTER_FX_POSITIONS, CINEMATIC_LOOK_TAIL, COLOR_LOOKS, COLOR_LOOK_CATEGORY_LABELS, COLOR_LOOK_CATEGORY_ORDER, COLOR_LOOK_IDS, COMPOSITION_EFFECTS, COMPOSITION_EFFECT_IDS, DEFAULT_IDENTITY_LOCK, DEFAULT_TEMPLATES, DIRECTION_ARRAY_CEILING, DIRECTION_FIELDS, DIRECTION_ID_MAX_CHARS, DIRECTION_KEYS, ERAS, ERA_CATEGORY_LABELS, ERA_CATEGORY_ORDER, ERA_IDS, EXPOSURE_CATEGORY_LABELS, EXPOSURE_CATEGORY_ORDER, EXPOSURE_FIELD_BY_CATEGORY, EXPOSURE_IDS, EXPOSURE_SETTINGS, FACTORY_PRESETS, FACTORY_SNIPPETS, FILM_STILL_PREFIX, FRAMINGS, FRAMING_CATEGORY_LABELS, FRAMING_CATEGORY_ORDER, FRAMING_FIELD_BY_CATEGORY, FRAMING_IDS, GAPS_SCHEMA, HELD_PROPS, HELD_PROP_CATEGORY_LABELS, HELD_PROP_CATEGORY_ORDER, HELD_PROP_IDS, IMAGE_HINT_MODE_DEFAULT, IMAGE_REFERENCE_PROMPT_DOCTRINE, IMAGE_WIZARD_CATEGORIES, INSTRUMENTATION_DEFAULT_DATA, INSTRUMENTS, INSTRUMENT_CATEGORY_LABELS, INSTRUMENT_CATEGORY_ORDER, LENSES, LENS_IDS, LIGHTINGS, LIGHTING_CATEGORY_LABELS, LIGHTING_CATEGORY_ORDER, LIGHTING_FIELD_BY_CATEGORY, LIGHTING_IDS, LLM_CHAT_WIZARD_CATEGORIES, LOOP_SUBJECTS, LOOP_SUBJECT_CATEGORY_LABELS, LOOP_SUBJECT_CATEGORY_ORDER, MATERIALS, MATERIAL_CATEGORY_LABELS, MATERIAL_CATEGORY_ORDER, MATERIAL_IDS, MAX_SELECTED_BY_DIMENSION, MAX_SELECTED_BY_FRAMING_CATEGORY, MAX_SELECTED_BY_STYLING_DIMENSION, MAX_SUBJECT_KEYS, MOODS, MOOD_CATEGORY_LABELS, MOOD_CATEGORY_ORDER, MOOD_IDS, MOVEMENT_LABELS, MULTI_PICKER_WIRING, MUSIC_EMOTIONS, MUSIC_ENERGIES, MUSIC_ERAS, MUSIC_GENRES, MUSIC_GENRE_CATEGORY_LABELS, MUSIC_GENRE_CATEGORY_ORDER, MUSIC_GENRE_DEFAULT_DATA, MUSIC_MOOD_DEFAULT_DATA, MUSIC_VIBES, MUSIC_WIZARD_CATEGORIES, NODE_PROMPT_CANDIDATE_FIELDS, NODE_PROMPT_FIELDS, OBJECT_ANGLE_PRESETS, OBJECT_ANGLE_PROMPTS, OBJECT_ASSET_PRESETS, OBJECT_ASSET_PROMPTS, OBJECT_MATERIAL_PRESETS, OBJECT_MATERIAL_PROMPTS, OBJECT_VARIATION_PRESETS, OBJECT_VARIATION_PROMPTS, PEOPLE, PERSON_DIMENSION_LABELS, PERSON_DIMENSION_ORDER, PERSON_DIMENSION_SECTIONS, PERSON_FIELD_BY_DIMENSION, PERSON_IDS, PHOTOGRAPHERS, PHOTOGRAPHER_CATEGORY_LABELS, PHOTOGRAPHER_CATEGORY_ORDER, PHOTOGRAPHER_IDS, PHOTO_GENRES, PHOTO_GENRE_CATEGORY_LABELS, PHOTO_GENRE_CATEGORY_ORDER, PHOTO_GENRE_IDS, PICKER_ANALYZER_FAMILIES, PICKER_ANALYZER_REGISTRY, PICKER_CATALOGS, PICKER_TYPES, POSES, POSE_CATEGORY_LABELS, POSE_CATEGORY_ORDER, POSE_IDS, POST_PROCESS_EFFECTS, POST_PROCESS_EFFECT_IDS, PRODUCTION_STYLES, PROMPT_AFFIX_CORE_FIELD_OVERRIDES, PROMPT_AFFIX_NODE_TYPES, PROMPT_HINT_SEPARATOR, PROVIDER_CAPABILITIES, PROVIDER_PROMPT_DOCTRINES, REFERENCE_IMAGE_ROLES, REFERENCE_RULES, REFERENCE_RULES_MULTI_PERSON, REF_BINDING, RENDER_QUALITIES, RENDER_QUALITY_IDS, SCENE_FRAME_RULE, SCENE_PROMPT_MAX_LENGTH, SETTINGS, SETTING_CATEGORY_LABELS, SETTING_IDS, SHOT_LABELS, SINGING_STYLES, SINGLE_PICKER_WIRING, SNIPPET_MEDIA_VALUES, STYLES, STYLE_IDS, STYLE_PRESETS, STYLINGS, STYLING_DIMENSION_LABELS, STYLING_DIMENSION_ORDER, STYLING_FIELD_BY_DIMENSION, STYLING_IDS, SUBJECT_ARRAY_CEILING, SUBJECT_CUSTOM_AGE_KEY, SUBJECT_FIELDS, SUBJECT_FOLD_KEYS, SUBJECT_ID_MAX_CHARS, SUBJECT_IMAGE_HINT_MODE_DEFAULT, SUBJECT_KEYS, SUBJECT_KEY_MAX_CHARS, SUBJECT_VIDEO_HINT_MODE_DEFAULT, TEMPORALS, TEMPORAL_CATEGORY_LABELS, TEMPORAL_CATEGORY_ORDER, TEMPORAL_FIELD_BY_CATEGORY, TEMPORAL_IDS, TERM_MAX_CHARS, TEXT_WIZARD_CATEGORIES, TRANSITIONS, TRANSITION_CATEGORY_LABELS, TRANSITION_CATEGORY_ORDER, TRANSITION_DURATIONS, TRANSITION_IDS, TRANSITION_INTENSITIES, TRANSITION_POSITIONS, VIDEO_HINT_MODE_DEFAULT, VIDEO_WIZARD_CATEGORIES, VOCAL_PRESENCE, VOCAL_PRESENCE_INSTRUMENTAL_ID, VOICE_ACCENTS, VOICE_AGES, VOICE_ARCHETYPES, VOICE_CHARACTER_DEFAULT_DATA, VOICE_DELIVERY_DEFAULT_DATA, VOICE_EMOTIONS, VOICE_GENDERS, VOICE_LANGUAGES, VOICE_PACES, VOICE_TIMBRES, WARDROBE, WARDROBE_CATEGORY_LABELS, WARDROBE_DIMENSION_ORDER, WARDROBE_FIELD_BY_DIMENSION, appendField, appendMusicMeta, applyPickerJson, applyPromptAffixes, applyReferenceOrderToVideo, applyTemplate, assembleImageInput, assembleSunoInput, buildActionFxHints, buildActionFxTerms, buildAestheticHints, buildAestheticTerms, buildAgeHint, buildAtmosphereHints, buildAtmosphereTerms, buildCharacterPrompt, buildCreaturePrompt, buildExposureHints, buildExposureTerms, buildFaceTemplateInputs, buildFramingHints, buildFramingTerms, buildHeldPropHints, buildHeldPropTerms, buildIdentityDirectives, buildIdentityLockLine, buildImagePrompt, buildImagePromptSegments, buildImagePromptWithOverflow, buildInstrumentationHints, buildInstrumentationTerms, buildLightingHints, buildLightingTerms, buildLocationMotionPrompt, buildLocationPrompt, buildLocationRefinePrompt, buildMaterialHints, buildMaterialTerms, buildMoodHints, buildMoodTerms, buildMotionPrompt, buildMultiPickerAnalyzerSpec, buildMusicGenreHints, buildMusicGenreTerms, buildMusicMoodHints, buildMusicMoodTerms, buildObjectMotionPrompt, buildObjectPrompt, buildPersonHints, buildPersonTerms, buildPhotographerHints, buildPhotographerTerms, buildPickerAnalyzerSpec, buildPickerLegend, buildPickerZodSchema, buildPoseHints, buildPoseTerms, buildPostProcessHints, buildPostProcessTerms, buildReferenceBlocks, buildScenePrompt, buildStylingHints, buildStylingTerms, buildSurroundFillPrompt, buildTemporalHints, buildTemporalTerms, buildVoiceCharacterHints, buildVoiceCharacterTerms, buildVoiceDeliveryHints, buildVoiceDeliveryTerms, buildWardrobeHints, catalogPacksVersion, characterLockToRefLock, collectIdentityLockClause, composeCameraMotionHintFromConnections, composeCameraMotionTermFromConnections, composeCharacterFxHintFromConnections, composeNegative, composePickerCatalogs, composeSoundHintFromConnections, composeTransitionHintFromConnections, composeVideoPromptText, computeLlmChatFields, computeNodePrompt, computePackSidecarCoverage, deriveTerm, directionFieldsForSurface, expandImagePositionRefs, expandImageRefTokens, filmStillPrefix, getActionFx, getActionFxLabel, getActionFxPromptHint, getActionFxTerm, getAesthetic, getAestheticLabel, getAestheticPromptHint, getAestheticTerm, getAtmosphere, getAtmosphereLabel, getAtmospherePromptHint, getAtmosphereTerm, getBackdrop, getBackdropLabel, getBackdropPromptHint, getBackdropTerm, getCameraFormat, getCameraFormatLabel, getCameraFormatPromptHint, getCameraFormatTerm, getCameraMotion, getCameraMotionLabel, getCameraMotionPromptHint, getCameraMotionTerm, getCategoriesForNodeType, getCharacterFx, getCharacterFxLabel, getCharacterFxPromptHint, getCharacterFxTerm, getColorLook, getColorLookLabel, getColorLookPromptHint, getColorLookTerm, getCompositionEffect, getCompositionEffectLabel, getCompositionEffectPromptHint, getCompositionEffectTerm, getEffectiveSunoCustomMode, getEra, getEraLabel, getEraPromptHint, getEraTerm, getExposure, getExposureLabel, getExposurePromptHint, getExposureTerm, getFactoryPresets, getFactorySnippets, getFraming, getFramingCategoryLimit, getFramingLabel, getFramingPromptHint, getFramingTerm, getHeldProp, getHeldPropLabel, getHeldPropPromptHint, getHeldPropTerm, getIdentityLockClause, getInstrument, getInstrumentTerm, getLens, getLensLabel, getLensPromptHint, getLensTerm, getLighting, getLightingLabel, getLightingPromptHint, getLightingTerm, getLoopSubject, getLoopSubjectLabel, getLoopSubjectPromptHint, getLoopSubjectTerm, getMaterial, getMaterialLabel, getMaterialPromptHint, getMaterialTerm, getMood, getMoodLabel, getMoodPromptHint, getMoodTerm, getMusicEmotion, getMusicEmotionTerm, getMusicEnergy, getMusicEnergyTerm, getMusicEra, getMusicEraTerm, getMusicGenre, getMusicGenreLabel, getMusicGenreTerm, getMusicSubgenre, getMusicSubgenreTerm, getMusicVibe, getMusicVibeTerm, getParameterPromptHint, getPerson, getPersonDimensionLimit, getPersonLabel, getPersonPromptHint, getPersonTerm, getPhotoGenre, getPhotoGenreLabel, getPhotoGenrePromptHint, getPhotoGenreTerm, getPhotographer, getPhotographerLabel, getPhotographerPromptHint, getPhotographerTerm, getPickerAnalyzer, getPickerCatalog, getPickerWiring, getPose, getPoseLabel, getPosePromptHint, getPoseTerm, getPostProcessEffect, getPostProcessEffectLabel, getPostProcessEffectPromptHint, getPostProcessEffectTerm, getProductionStyle, getProductionStyleTerm, getPromptDoctrine, getPromptFields, getPromptTips, getRegisteredCatalogPacks, getRegisteredPeople, getRegisteredPersonDimensionLabels, getRegisteredPersonDimensionOrder, getRegisteredPersonFieldByDimension, getRegisteredPickerCatalogs, getRegisteredSubjectKeys, getRenderQuality, getRenderQualityLabel, getRenderQualityPromptHint, getRenderQualityTerm, getSetting, getSettingLabel, getSettingPromptHint, getSettingTerm, getSingingStyle, getSingingStyleTerm, getSnippetMedia, getStyle, getStyleLabel, getStylePreset, getStylePromptHint, getStyleTerm, getStyling, getStylingDimensionLimit, getStylingLabel, getStylingPromptHint, getStylingTerm, getTemporal, getTemporalLabel, getTemporalPromptHint, getTemporalTerm, getTransition, getTransitionLabel, getTransitionPromptHint, getTransitionTerm, getVocalPresence, getVocalPresenceTerm, getVoiceAccent, getVoiceAccentTerm, getVoiceAge, getVoiceAgeTerm, getVoiceArchetype, getVoiceArchetypeTerm, getVoiceEmotion, getVoiceEmotionTerm, getVoiceGender, getVoiceGenderTerm, getVoiceLanguage, getVoiceLanguageTerm, getVoicePace, getVoicePaceTerm, getVoiceTimbre, getVoiceTimbreTerm, getWardrobeEntriesByDimension, getWardrobeEntry, getWardrobePromptHint, groupFactoryPresets, hasUpstreamCharacter, identityRefsSentence, isAnalyzablePicker, isInstrumentalVocal, isSuspiciousDerivedTerm, isVantageFraming, isWizardSupported, joinPromptHints, joinPromptParts, keepableDirectionHints, listPickerCatalogs, migratePersonValue, modeForFamily, nodeHasInlinePrompt, nodeHasPromptField, nodeSupportsPromptAffixes, normalizeSubjectFields, personPacksVersion, pickerFanoutTargets, projectAllCatalogs, projectPickerCatalog, promptAffixCoreField, promptBindsFirstFrame, promptFieldCarriesAffixes, promptPartSeparator, readDirectionFields, readStructuredFields, readSubjectFields, referenceRulesBlock, registerCatalogPack, registerPersonPack, renderDirectionHints, renderStructuredFields, renderSubjectHints, resetCatalogPacks, resetPersonPacks, resolveBrandInput, resolveCharacterMentions, resolveGeminiOmniI2vInputs, resolveLocationMentions, resolvePrompt, resolveRefIdTokens, resolveReferenceTokens, resolveSeedance2Inputs, resolveTemplate, resolveTerm, resolveVeoI2vInputs, resolveVideoReferenceCore, subjectFieldsForSurface, summarizePickerCatalogs, toIdentityLockMode, truncateForField, truncateText, withForcedIdentityLock };
34243
+ export { ACTION_FX, ACTION_FX_CATEGORY_LABELS, ACTION_FX_CATEGORY_ORDER, ACTION_FX_IDS, AESTHETICS, AESTHETIC_CATEGORY_LABELS, AESTHETIC_CATEGORY_ORDER, AESTHETIC_IDS, ALL_PICKER_WIRING, ANALYZABLE_PICKER_TYPES, ANGLE_LABELS, ASPECT_RATIO_LABELS, ATMOSPHERES, ATMOSPHERE_IDS, AUDIO_WIZARD_CATEGORIES, BACKDROPS, BACKDROP_CATEGORY_LABELS, BACKDROP_CATEGORY_ORDER, BACKDROP_IDS, BRAND_PRESETS, BRAND_PRESET_IDS, BRAND_PRESET_META, CAMERA_FORMATS, CAMERA_FORMAT_IDS, CAMERA_MOTIONS, CAMERA_MOTION_CATEGORY_LABELS, CAMERA_MOTION_CATEGORY_ORDER, CAMERA_MOTION_IDS, CHARACTER_FX, CHARACTER_FX_CATEGORY_LABELS, CHARACTER_FX_CATEGORY_ORDER, CHARACTER_FX_DURATIONS, CHARACTER_FX_IDS, CHARACTER_FX_INTENSITIES, CHARACTER_FX_POSITIONS, CINEMATIC_LOOK_TAIL, COLOR_LOOKS, COLOR_LOOK_CATEGORY_LABELS, COLOR_LOOK_CATEGORY_ORDER, COLOR_LOOK_IDS, COMPOSITION_EFFECTS, COMPOSITION_EFFECT_IDS, DEFAULT_IDENTITY_LOCK, DEFAULT_TEMPLATES, DIRECTION_ARRAY_CEILING, DIRECTION_FIELDS, DIRECTION_ID_MAX_CHARS, DIRECTION_KEYS, ERAS, ERA_CATEGORY_LABELS, ERA_CATEGORY_ORDER, ERA_IDS, EXPOSURE_CATEGORY_LABELS, EXPOSURE_CATEGORY_ORDER, EXPOSURE_FIELD_BY_CATEGORY, EXPOSURE_IDS, EXPOSURE_SETTINGS, FACTORY_PRESETS, FACTORY_SNIPPETS, FILM_STILL_PREFIX, FILM_STYLE_KEYS, FRAMINGS, FRAMING_CATEGORY_LABELS, FRAMING_CATEGORY_ORDER, FRAMING_FIELD_BY_CATEGORY, FRAMING_IDS, GAPS_SCHEMA, HELD_PROPS, HELD_PROP_CATEGORY_LABELS, HELD_PROP_CATEGORY_ORDER, HELD_PROP_IDS, IMAGE_HINT_MODE_DEFAULT, IMAGE_REFERENCE_PROMPT_DOCTRINE, IMAGE_WIZARD_CATEGORIES, INSTRUMENTATION_DEFAULT_DATA, INSTRUMENTS, INSTRUMENT_CATEGORY_LABELS, INSTRUMENT_CATEGORY_ORDER, LENSES, LENS_IDS, LIGHTINGS, LIGHTING_CATEGORY_LABELS, LIGHTING_CATEGORY_ORDER, LIGHTING_FIELD_BY_CATEGORY, LIGHTING_IDS, LLM_CHAT_WIZARD_CATEGORIES, LOOP_SUBJECTS, LOOP_SUBJECT_CATEGORY_LABELS, LOOP_SUBJECT_CATEGORY_ORDER, MATERIALS, MATERIAL_CATEGORY_LABELS, MATERIAL_CATEGORY_ORDER, MATERIAL_IDS, MAX_SELECTED_BY_DIMENSION, MAX_SELECTED_BY_FRAMING_CATEGORY, MAX_SELECTED_BY_STYLING_DIMENSION, MAX_SUBJECT_KEYS, MOODS, MOOD_CATEGORY_LABELS, MOOD_CATEGORY_ORDER, MOOD_IDS, MOVEMENT_LABELS, MULTI_PICKER_WIRING, MUSIC_EMOTIONS, MUSIC_ENERGIES, MUSIC_ERAS, MUSIC_GENRES, MUSIC_GENRE_CATEGORY_LABELS, MUSIC_GENRE_CATEGORY_ORDER, MUSIC_GENRE_DEFAULT_DATA, MUSIC_MOOD_DEFAULT_DATA, MUSIC_VIBES, MUSIC_WIZARD_CATEGORIES, NODE_PROMPT_CANDIDATE_FIELDS, NODE_PROMPT_FIELDS, OBJECT_ANGLE_PRESETS, OBJECT_ANGLE_PROMPTS, OBJECT_ASSET_PRESETS, OBJECT_ASSET_PROMPTS, OBJECT_MATERIAL_PRESETS, OBJECT_MATERIAL_PROMPTS, OBJECT_VARIATION_PRESETS, OBJECT_VARIATION_PROMPTS, PEOPLE, PERSON_DIMENSION_LABELS, PERSON_DIMENSION_ORDER, PERSON_DIMENSION_SECTIONS, PERSON_FIELD_BY_DIMENSION, PERSON_IDS, PHOTOGRAPHERS, PHOTOGRAPHER_CATEGORY_LABELS, PHOTOGRAPHER_CATEGORY_ORDER, PHOTOGRAPHER_IDS, PHOTO_GENRES, PHOTO_GENRE_CATEGORY_LABELS, PHOTO_GENRE_CATEGORY_ORDER, PHOTO_GENRE_IDS, PICKER_ANALYZER_FAMILIES, PICKER_ANALYZER_REGISTRY, PICKER_CATALOGS, PICKER_TYPES, POSES, POSE_CATEGORY_LABELS, POSE_CATEGORY_ORDER, POSE_IDS, POST_PROCESS_EFFECTS, POST_PROCESS_EFFECT_IDS, PRODUCTION_STYLES, PROMPT_AFFIX_CORE_FIELD_OVERRIDES, PROMPT_AFFIX_NODE_TYPES, PROMPT_HINT_SEPARATOR, PROVIDER_CAPABILITIES, PROVIDER_PROMPT_DOCTRINES, REFERENCE_IMAGE_ROLES, REFERENCE_RULES, REFERENCE_RULES_MULTI_PERSON, REF_BINDING, RENDER_QUALITIES, RENDER_QUALITY_IDS, SCENE_FRAME_RULE, SCENE_PROMPT_MAX_LENGTH, SETTINGS, SETTING_CATEGORY_LABELS, SETTING_IDS, SHOT_LABELS, SINGING_STYLES, SINGLE_PICKER_WIRING, SNIPPET_MEDIA_VALUES, STYLES, STYLE_IDS, STYLE_PRESETS, STYLE_SECTION_GAP, STYLE_SECTION_HEADER, STYLINGS, STYLING_DIMENSION_LABELS, STYLING_DIMENSION_ORDER, STYLING_FIELD_BY_DIMENSION, STYLING_IDS, SUBJECT_ARRAY_CEILING, SUBJECT_CUSTOM_AGE_KEY, SUBJECT_FIELDS, SUBJECT_FOLD_KEYS, SUBJECT_ID_MAX_CHARS, SUBJECT_IMAGE_HINT_MODE_DEFAULT, SUBJECT_KEYS, SUBJECT_KEY_MAX_CHARS, SUBJECT_VIDEO_HINT_MODE_DEFAULT, TEMPORALS, TEMPORAL_CATEGORY_LABELS, TEMPORAL_CATEGORY_ORDER, TEMPORAL_FIELD_BY_CATEGORY, TEMPORAL_IDS, TERM_MAX_CHARS, TEXT_WIZARD_CATEGORIES, TRANSITIONS, TRANSITION_CATEGORY_LABELS, TRANSITION_CATEGORY_ORDER, TRANSITION_DURATIONS, TRANSITION_IDS, TRANSITION_INTENSITIES, TRANSITION_POSITIONS, VIDEO_HINT_MODE_DEFAULT, VIDEO_WIZARD_CATEGORIES, VOCAL_PRESENCE, VOCAL_PRESENCE_INSTRUMENTAL_ID, VOICE_ACCENTS, VOICE_AGES, VOICE_ARCHETYPES, VOICE_CHARACTER_DEFAULT_DATA, VOICE_DELIVERY_DEFAULT_DATA, VOICE_EMOTIONS, VOICE_GENDERS, VOICE_LANGUAGES, VOICE_PACES, VOICE_TIMBRES, WARDROBE, WARDROBE_CATEGORY_LABELS, WARDROBE_DIMENSION_ORDER, WARDROBE_FIELD_BY_DIMENSION, appendField, appendMusicMeta, applyPickerJson, applyPromptAffixes, applyReferenceOrderToVideo, applyTemplate, asBodyClauses, assembleImageInput, assembleSunoInput, buildActionFxHints, buildActionFxTerms, buildAestheticHints, buildAestheticTerms, buildAgeHint, buildAtmosphereHints, buildAtmosphereTerms, buildCharacterPrompt, buildCreaturePrompt, buildExposureHints, buildExposureTerms, buildFaceTemplateInputs, buildFramingHints, buildFramingTerms, buildHeldPropHints, buildHeldPropTerms, buildIdentityDirectives, buildIdentityLockLine, buildImagePrompt, buildImagePromptSegments, buildImagePromptWithOverflow, buildInstrumentationHints, buildInstrumentationTerms, buildLightingHints, buildLightingTerms, buildLocationMotionPrompt, buildLocationPrompt, buildLocationRefinePrompt, buildMaterialHints, buildMaterialTerms, buildMoodHints, buildMoodTerms, buildMotionPrompt, buildMultiPickerAnalyzerSpec, buildMusicGenreHints, buildMusicGenreTerms, buildMusicMoodHints, buildMusicMoodTerms, buildObjectMotionPrompt, buildObjectPrompt, buildPersonHints, buildPersonTerms, buildPhotographerHints, buildPhotographerTerms, buildPickerAnalyzerSpec, buildPickerLegend, buildPickerZodSchema, buildPoseHints, buildPoseTerms, buildPostProcessHints, buildPostProcessTerms, buildReferenceBlocks, buildScenePrompt, buildStylingHints, buildStylingTerms, buildSurroundFillPrompt, buildTemporalHints, buildTemporalTerms, buildVoiceCharacterHints, buildVoiceCharacterTerms, buildVoiceDeliveryHints, buildVoiceDeliveryTerms, buildWardrobeHints, catalogPacksVersion, characterLockToRefLock, collectIdentityLockClause, composeCameraMotionHintFromConnections, composeCameraMotionTermFromConnections, composeCharacterFxHintFromConnections, composeNegative, composePickerCatalogs, composeSectionedPrompt, composeSoundHintFromConnections, composeTransitionHintFromConnections, composeVideoPromptText, computeLlmChatFields, computeNodePrompt, computePackSidecarCoverage, deriveTerm, directionFieldsForSurface, endsInsideStyleSection, expandImagePositionRefs, expandImageRefTokens, filmStillPrefix, getActionFx, getActionFxLabel, getActionFxPromptHint, getActionFxTerm, getAesthetic, getAestheticLabel, getAestheticPromptHint, getAestheticTerm, getAtmosphere, getAtmosphereLabel, getAtmospherePromptHint, getAtmosphereTerm, getBackdrop, getBackdropLabel, getBackdropPromptHint, getBackdropTerm, getCameraFormat, getCameraFormatLabel, getCameraFormatPromptHint, getCameraFormatTerm, getCameraMotion, getCameraMotionLabel, getCameraMotionPromptHint, getCameraMotionTerm, getCategoriesForNodeType, getCharacterFx, getCharacterFxLabel, getCharacterFxPromptHint, getCharacterFxTerm, getColorLook, getColorLookLabel, getColorLookPromptHint, getColorLookTerm, getCompositionEffect, getCompositionEffectLabel, getCompositionEffectPromptHint, getCompositionEffectTerm, getEffectiveSunoCustomMode, getEra, getEraLabel, getEraPromptHint, getEraTerm, getExposure, getExposureLabel, getExposurePromptHint, getExposureTerm, getFactoryPresets, getFactorySnippets, getFraming, getFramingCategoryLimit, getFramingLabel, getFramingPromptHint, getFramingTerm, getHeldProp, getHeldPropLabel, getHeldPropPromptHint, getHeldPropTerm, getIdentityLockClause, getInstrument, getInstrumentTerm, getLens, getLensLabel, getLensPromptHint, getLensTerm, getLighting, getLightingLabel, getLightingPromptHint, getLightingTerm, getLoopSubject, getLoopSubjectLabel, getLoopSubjectPromptHint, getLoopSubjectTerm, getMaterial, getMaterialLabel, getMaterialPromptHint, getMaterialTerm, getMood, getMoodLabel, getMoodPromptHint, getMoodTerm, getMusicEmotion, getMusicEmotionTerm, getMusicEnergy, getMusicEnergyTerm, getMusicEra, getMusicEraTerm, getMusicGenre, getMusicGenreLabel, getMusicGenreTerm, getMusicSubgenre, getMusicSubgenreTerm, getMusicVibe, getMusicVibeTerm, getParameterPromptHint, getPerson, getPersonDimensionLimit, getPersonLabel, getPersonPromptHint, getPersonTerm, getPhotoGenre, getPhotoGenreLabel, getPhotoGenrePromptHint, getPhotoGenreTerm, getPhotographer, getPhotographerLabel, getPhotographerPromptHint, getPhotographerTerm, getPickerAnalyzer, getPickerCatalog, getPickerWiring, getPose, getPoseLabel, getPosePromptHint, getPoseTerm, getPostProcessEffect, getPostProcessEffectLabel, getPostProcessEffectPromptHint, getPostProcessEffectTerm, getProductionStyle, getProductionStyleTerm, getPromptDoctrine, getPromptFields, getPromptTips, getRegisteredCatalogPacks, getRegisteredPeople, getRegisteredPersonDimensionLabels, getRegisteredPersonDimensionOrder, getRegisteredPersonFieldByDimension, getRegisteredPickerCatalogs, getRegisteredSubjectKeys, getRenderQuality, getRenderQualityLabel, getRenderQualityPromptHint, getRenderQualityTerm, getSetting, getSettingLabel, getSettingPromptHint, getSettingTerm, getSingingStyle, getSingingStyleTerm, getSnippetMedia, getStyle, getStyleLabel, getStylePreset, getStylePromptHint, getStyleTerm, getStyling, getStylingDimensionLimit, getStylingLabel, getStylingPromptHint, getStylingTerm, getTemporal, getTemporalLabel, getTemporalPromptHint, getTemporalTerm, getTransition, getTransitionLabel, getTransitionPromptHint, getTransitionTerm, getVocalPresence, getVocalPresenceTerm, getVoiceAccent, getVoiceAccentTerm, getVoiceAge, getVoiceAgeTerm, getVoiceArchetype, getVoiceArchetypeTerm, getVoiceEmotion, getVoiceEmotionTerm, getVoiceGender, getVoiceGenderTerm, getVoiceLanguage, getVoiceLanguageTerm, getVoicePace, getVoicePaceTerm, getVoiceTimbre, getVoiceTimbreTerm, getWardrobeEntriesByDimension, getWardrobeEntry, getWardrobePromptHint, groupFactoryPresets, hasUpstreamCharacter, identityRefsSentence, insertBeforeStyleSection, isAnalyzablePicker, isInstrumentalVocal, isSuspiciousDerivedTerm, isVantageFraming, isWizardSupported, joinPromptHints, joinPromptParts, keepableDirectionHints, listPickerCatalogs, migratePersonValue, modeForFamily, nodeHasInlinePrompt, nodeHasPromptField, nodeSupportsPromptAffixes, normalizeSubjectFields, partitionStyleClauses, personPacksVersion, pickerFanoutTargets, projectAllCatalogs, projectPickerCatalog, promptAffixCoreField, promptBindsFirstFrame, promptFieldCarriesAffixes, promptPartSeparator, readDirectionFields, readStructuredFields, readSubjectFields, referenceRulesBlock, registerCatalogPack, registerPersonPack, renderDirectionHintClauses, renderDirectionHints, renderStructuredFields, renderStyleSection, renderSubjectHints, resetCatalogPacks, resetPersonPacks, resolveBrandInput, resolveCharacterMentions, resolveGeminiOmniI2vInputs, resolveLocationMentions, resolvePrompt, resolveRefIdTokens, resolveReferenceTokens, resolveSeedance2Inputs, resolveTemplate, resolveTerm, resolveVeoI2vInputs, resolveVideoReferenceCore, sectionedClauseCosts, splitStyleSection, styleSectionFromClauses, styleSlotFor, subjectFieldsForSurface, summarizePickerCatalogs, toIdentityLockMode, truncateForField, truncateText, withForcedIdentityLock };
34063
34244
  //# sourceMappingURL=index.js.map
34064
34245
  //# sourceMappingURL=index.js.map