@nodaro/prompts 1.16.0 → 1.17.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -10342,32 +10342,6 @@ function resolveBrandInput(brand) {
10342
10342
  return brand;
10343
10343
  }
10344
10344
 
10345
- // src/prompt-templates.ts
10346
- var DEFAULT_TEMPLATES = {
10347
- "character-description": "Include character '{name}': {description}.",
10348
- "object-description": "Include object '{name}': {description}.",
10349
- "location-description": "Include location '{name}': {description}.",
10350
- "face-description": "Include the exact face and facial features of '{name}' from the reference image. Maintain perfect likeness and facial identity.",
10351
- // `-generation` templates drive standalone entity generation routes
10352
- // (`/v1/generate-character`, `/v1/generate-face`, etc.). Duplicated between
10353
- // frontend and backend historically; consolidated here so the backend DAG
10354
- // orchestrator produces the same prompt as a single-node HTTP call.
10355
- "character-generation": "Create a full-body character portrait: {description}. Style: {style}. Gender: {gender}. High quality, detailed, consistent lighting, neutral background.",
10356
- "object-generation": "Create a product photo of: {description}. Category: {category}. Clean background, professional studio lighting, high detail.",
10357
- "location-generation": "Create a cinematic scene of: {description}. Category: {category}. Atmospheric lighting, high detail, wide angle.",
10358
- "face-generation": "Create a professional close-up face portrait headshot: {description}. Style: {style}. Looking directly at camera, sharp focus on facial features, clean background, studio lighting, high resolution. Maintain exact facial identity and features from the reference image.",
10359
- "generate-image-wrapper": "{userPrompt}\n{assetDescriptions}"
10360
- };
10361
- function resolveTemplate(key, userTemplates, flowTemplates) {
10362
- return flowTemplates?.[key] ?? userTemplates?.[key] ?? DEFAULT_TEMPLATES[key] ?? "";
10363
- }
10364
- function applyTemplate(template, vars) {
10365
- return Object.entries(vars).reduce(
10366
- (result, [key, value]) => result.replaceAll(`{${key}}`, value || ""),
10367
- template
10368
- );
10369
- }
10370
-
10371
10345
  // src/prompt-hint-join.ts
10372
10346
  var PROMPT_HINT_SEPARATOR = ". ";
10373
10347
  function joinPromptHints(userPrompt, hints) {
@@ -10579,6 +10553,87 @@ function sectionedClauseCosts(userPrompt, clauses, structuredFragment) {
10579
10553
  }
10580
10554
  return costs;
10581
10555
  }
10556
+
10557
+ // src/described-references.ts
10558
+ var CHARACTER_BLOCK_HEADER = "Use these characters:";
10559
+ function referenceDescriptionLine(subject, description) {
10560
+ const s = subject.trim();
10561
+ const d = description?.trim();
10562
+ if (!s || !d) return "";
10563
+ return `${s} \u2014 ${d}.`;
10564
+ }
10565
+ function renderDescribedReferenceLines(refs) {
10566
+ if (!refs || refs.length === 0) return [];
10567
+ const lines = [];
10568
+ const seen = /* @__PURE__ */ new Set();
10569
+ for (const r of refs) {
10570
+ const key = r.name?.trim().toLowerCase();
10571
+ if (!key || seen.has(key)) continue;
10572
+ const line = referenceDescriptionLine(r.name, r.description);
10573
+ if (!line) continue;
10574
+ seen.add(key);
10575
+ lines.push(line);
10576
+ }
10577
+ return lines;
10578
+ }
10579
+ function renderReferenceCaptionLines(videoCaptions, audioCaptions, counts) {
10580
+ const lines = [];
10581
+ const render = (captions, kind, cap) => {
10582
+ if (!captions) return;
10583
+ for (let i = 0; i < captions.length && i < cap; i++) {
10584
+ const text = captions[i]?.trim();
10585
+ if (!text) continue;
10586
+ lines.push(`@${kind}_${i + 1}: ${text}.`);
10587
+ }
10588
+ };
10589
+ render(videoCaptions, "video", counts.video);
10590
+ render(audioCaptions, "audio", counts.audio);
10591
+ return lines;
10592
+ }
10593
+ function appendReferenceLines(prompt, lines, format) {
10594
+ if (lines.length === 0) return prompt;
10595
+ if (format === "hybrid") return insertBeforeStyleSection(prompt, lines);
10596
+ const bullets = lines.map((l) => `- ${l}`).join("\n");
10597
+ if (prompt.startsWith(`${CHARACTER_BLOCK_HEADER}
10598
+ `)) {
10599
+ const splitIdx = prompt.indexOf("\n\n");
10600
+ if (splitIdx === -1) return `${prompt}
10601
+ ${bullets}`;
10602
+ return `${prompt.slice(0, splitIdx)}
10603
+ ${bullets}${prompt.slice(splitIdx)}`;
10604
+ }
10605
+ const block = `${CHARACTER_BLOCK_HEADER}
10606
+ ${bullets}`;
10607
+ return prompt ? `${block}
10608
+
10609
+ ${prompt}` : block;
10610
+ }
10611
+
10612
+ // src/prompt-templates.ts
10613
+ var DEFAULT_TEMPLATES = {
10614
+ "character-description": "Include character '{name}': {description}.",
10615
+ "object-description": "Include object '{name}': {description}.",
10616
+ "location-description": "Include location '{name}': {description}.",
10617
+ "face-description": "Include the exact face and facial features of '{name}' from the reference image. Maintain perfect likeness and facial identity.",
10618
+ // `-generation` templates drive standalone entity generation routes
10619
+ // (`/v1/generate-character`, `/v1/generate-face`, etc.). Duplicated between
10620
+ // frontend and backend historically; consolidated here so the backend DAG
10621
+ // orchestrator produces the same prompt as a single-node HTTP call.
10622
+ "character-generation": "Create a full-body character portrait: {description}. Style: {style}. Gender: {gender}. High quality, detailed, consistent lighting, neutral background.",
10623
+ "object-generation": "Create a product photo of: {description}. Category: {category}. Clean background, professional studio lighting, high detail.",
10624
+ "location-generation": "Create a cinematic scene of: {description}. Category: {category}. Atmospheric lighting, high detail, wide angle.",
10625
+ "face-generation": "Create a professional close-up face portrait headshot: {description}. Style: {style}. Looking directly at camera, sharp focus on facial features, clean background, studio lighting, high resolution. Maintain exact facial identity and features from the reference image.",
10626
+ "generate-image-wrapper": "{userPrompt}\n{assetDescriptions}"
10627
+ };
10628
+ function resolveTemplate(key, userTemplates, flowTemplates) {
10629
+ return flowTemplates?.[key] ?? userTemplates?.[key] ?? DEFAULT_TEMPLATES[key] ?? "";
10630
+ }
10631
+ function applyTemplate(template, vars) {
10632
+ return Object.entries(vars).reduce(
10633
+ (result, [key, value]) => result.replaceAll(`{${key}}`, value || ""),
10634
+ template
10635
+ );
10636
+ }
10582
10637
  function composeIdentityDescPart(subject, canonicalDesc, elementInjection) {
10583
10638
  const parts = [];
10584
10639
  const c = canonicalDesc?.trim();
@@ -10587,6 +10642,10 @@ function composeIdentityDescPart(subject, canonicalDesc, elementInjection) {
10587
10642
  if (e) parts.push(e);
10588
10643
  return parts.length > 0 ? `${subject} \u2014 ${parts.join(". ")}` : subject;
10589
10644
  }
10645
+ function pushOverrideDirective(out, ref, binding) {
10646
+ const line = referenceDescriptionLine(binding, ref.descriptionOverride);
10647
+ if (line) out.push(line);
10648
+ }
10590
10649
  function resolveCharacterMentions(prompt, tokens, refs) {
10591
10650
  const bySlug = /* @__PURE__ */ new Map();
10592
10651
  const byVariant = /* @__PURE__ */ new Map();
@@ -10627,7 +10686,7 @@ function resolveCharacterMentions(prompt, tokens, refs) {
10627
10686
  const includeCanonicalDesc = effectiveMode === "identical" || effectiveMode === "face-pose";
10628
10687
  const descPart = composeIdentityDescPart(
10629
10688
  subject,
10630
- includeCanonicalDesc ? match.characterCanonicalDescription : void 0,
10689
+ match.descriptionOverride?.trim() || (includeCanonicalDesc ? match.characterCanonicalDescription : void 0),
10631
10690
  match.elementInjection
10632
10691
  );
10633
10692
  directiveLines.push(`- ${descPart}.${directive ? ` ${directive}` : ""}`);
@@ -10705,6 +10764,7 @@ function resolveCharacterMentionsHybrid(prompt, tokens, refs, existingUrls) {
10705
10764
  const binding = bindingFor(m.url);
10706
10765
  const lock = buildIdentityLockLine(withForcedIdentityLock(ref, lockOverrideByUrl.get(m.url)), binding);
10707
10766
  if (lock) lockLines.push(lock);
10767
+ pushOverrideDirective(elementDirectives, ref, binding);
10708
10768
  const inject = ref.elementInjection?.trim();
10709
10769
  if (inject) elementDirectives.push(inject);
10710
10770
  }
@@ -10778,7 +10838,8 @@ function resolveLocationMentions(prompt, tokens, refs) {
10778
10838
  const subject = `Image ${t.imageIndex} (${displayName})`;
10779
10839
  const includeCanonicalDesc = effectiveMode === "identical";
10780
10840
  const canonicalDesc = match.locationCanonicalDescription?.trim();
10781
- const descPart = includeCanonicalDesc && canonicalDesc ? `${subject} \u2014 ${canonicalDesc}` : subject;
10841
+ const shownDesc = match.descriptionOverride?.trim() || (includeCanonicalDesc ? canonicalDesc : void 0);
10842
+ const descPart = shownDesc ? `${subject} \u2014 ${shownDesc}` : subject;
10782
10843
  directiveLines.push(`- ${descPart}.${directive ? ` ${directive}` : ""}`);
10783
10844
  if (t.bucket && t.variant && match.locationVariantDisplayName && match.locationVariantDisplayName !== "canonical") {
10784
10845
  directiveLines.push(` (in this image: ${match.locationVariantDisplayName})`);
@@ -10846,6 +10907,7 @@ function resolveLocationMentionsHybrid(prompt, tokens, refs, existingUrls) {
10846
10907
  const binding = bindingFor(m.url);
10847
10908
  const lock = buildIdentityLockLine(withForcedIdentityLock(ref, lockOverrideByUrl.get(m.url)), binding);
10848
10909
  if (lock) lockLines.push(lock);
10910
+ pushOverrideDirective(elementDirectives, ref, binding);
10849
10911
  const inject = ref.elementInjection?.trim();
10850
10912
  if (inject) elementDirectives.push(inject);
10851
10913
  }
@@ -10895,10 +10957,11 @@ function resolveImageMentionsHybrid(prompt, tokens, refs, existingUrls) {
10895
10957
  const binding = bindingFor(m.url);
10896
10958
  const lock = buildIdentityLockLine(withForcedIdentityLock(ref, lockOverrideByUrl.get(m.url)), binding);
10897
10959
  if (lock) lockLines.push(lock);
10960
+ pushOverrideDirective(elementDirectives, ref, binding);
10898
10961
  const inject = ref.elementInjection?.trim();
10899
10962
  if (inject) elementDirectives.push(inject);
10900
10963
  }
10901
- return { prompt: resolvedPrompt, additionalUrls, lockLines, elementDirectives };
10964
+ return { prompt: resolvedPrompt, additionalUrls, mentionedUrls: seenUrls, lockLines, elementDirectives };
10902
10965
  }
10903
10966
  function resolveEntityMentionsHybrid(prompt, tokens, refs, existingUrls) {
10904
10967
  const bySlug = /* @__PURE__ */ new Map();
@@ -10949,6 +11012,7 @@ function resolveEntityMentionsHybrid(prompt, tokens, refs, existingUrls) {
10949
11012
  const binding = bindingFor(m.url);
10950
11013
  const lock = buildIdentityLockLine(withForcedIdentityLock(ref, lockOverrideByUrl.get(m.url)), binding);
10951
11014
  if (lock) lockLines.push(lock);
11015
+ pushOverrideDirective(elementDirectives, ref, binding);
10952
11016
  const inject = ref.elementInjection?.trim();
10953
11017
  if (inject) elementDirectives.push(inject);
10954
11018
  }
@@ -10984,7 +11048,7 @@ function buildCanonicalFallback(refs, mentionedSlugs, startIndex) {
10984
11048
  const subject = `Image ${cursor} (${displayName})`;
10985
11049
  const descPart = composeIdentityDescPart(
10986
11050
  subject,
10987
- includeCanonicalDesc ? r.characterCanonicalDescription : void 0,
11051
+ r.descriptionOverride?.trim() || (includeCanonicalDesc ? r.characterCanonicalDescription : void 0),
10988
11052
  r.elementInjection
10989
11053
  );
10990
11054
  directiveLines.push(`- ${descPart}.${directive ? ` ${directive}` : ""}`);
@@ -11000,7 +11064,7 @@ function buildExtraRefDirectives(refs, emittedCharacterPositions, startIndex) {
11000
11064
  for (const r of refs) {
11001
11065
  if (!r.isExtraRef) continue;
11002
11066
  if (!r.url) continue;
11003
- const description = (r.description ?? r.variantDescription ?? "").trim();
11067
+ const description = (r.descriptionOverride ?? "").trim() || (r.description ?? r.variantDescription ?? "").trim();
11004
11068
  if (r.source === "wired-character" && r.characterSlug) {
11005
11069
  const effectiveMode = r.defaultUsageMode ?? DEFAULT_USAGE_MODE;
11006
11070
  const earlierPos = positionsByChar.get(r.characterSlug);
@@ -11064,6 +11128,7 @@ function renderCanonicalFallbackHybrid(refs, letterForUrl) {
11064
11128
  phrases.push(roleToPhrase(resolveDefaultRole(r.defaultRole, r.defaultUsageMode, r.source), binding));
11065
11129
  const lock = buildIdentityLockLine(r, binding);
11066
11130
  if (lock) lockLines.push(lock);
11131
+ pushOverrideDirective(elementDirectives, r, binding);
11067
11132
  const inject = r.elementInjection?.trim();
11068
11133
  if (inject) elementDirectives.push(inject);
11069
11134
  }
@@ -11078,7 +11143,7 @@ function renderExtraRefsHybrid(extraRefs, letterForUrl, seedLetterByChar) {
11078
11143
  if (!r.url) continue;
11079
11144
  const letter = letterForUrl(r.url);
11080
11145
  const binding = `reference image ${letter}`;
11081
- const description = (r.description ?? r.variantDescription ?? "").trim();
11146
+ const description = (r.descriptionOverride ?? "").trim() || (r.description ?? r.variantDescription ?? "").trim();
11082
11147
  if (r.source === "wired-character" && r.characterSlug) {
11083
11148
  const earlier = firstLetterByChar.get(r.characterSlug);
11084
11149
  if (earlier !== void 0 && earlier !== letter) {
@@ -11115,10 +11180,11 @@ function renderLocationCanonicalHybrid(nonCharacterRefs, finalIndexByUrl, covere
11115
11180
  phrases.push(roleToPhrase(resolveLocationRole(null, null, r), binding));
11116
11181
  const lock = buildIdentityLockLine(r, binding);
11117
11182
  if (lock) lockLines.push(lock);
11183
+ pushOverrideDirective(elementDirectives, r, binding);
11118
11184
  const inject = r.elementInjection?.trim();
11119
11185
  if (inject) elementDirectives.push(inject);
11120
11186
  }
11121
- return { phrases, lockLines, elementDirectives };
11187
+ return { phrases, lockLines, elementDirectives, renderedUrls: seenUrls };
11122
11188
  }
11123
11189
  function renderObjectCreatureCanonicalHybrid(nonCharacterRefs, finalIndexByUrl, coveredUrls) {
11124
11190
  const phrases = [];
@@ -11135,10 +11201,24 @@ function renderObjectCreatureCanonicalHybrid(nonCharacterRefs, finalIndexByUrl,
11135
11201
  phrases.push(roleToPhrase(defaultRoleForSource(r.source), binding));
11136
11202
  const lock = buildIdentityLockLine(r, binding);
11137
11203
  if (lock) lockLines.push(lock);
11204
+ pushOverrideDirective(elementDirectives, r, binding);
11138
11205
  const inject = r.elementInjection?.trim();
11139
11206
  if (inject) elementDirectives.push(inject);
11140
11207
  }
11141
- return { phrases, lockLines, elementDirectives };
11208
+ return { phrases, lockLines, elementDirectives, renderedUrls: seenUrls };
11209
+ }
11210
+ function renderUntoldOverridesHybrid(nonCharacterRefs, finalIndexByUrl, toldUrls) {
11211
+ const lines = [];
11212
+ const sweptUrls = /* @__PURE__ */ new Set();
11213
+ for (const r of nonCharacterRefs) {
11214
+ if (!r.url || toldUrls.has(r.url) || sweptUrls.has(r.url)) continue;
11215
+ const slot = finalIndexByUrl.get(r.url);
11216
+ if (!slot) continue;
11217
+ const before = lines.length;
11218
+ pushOverrideDirective(lines, r, `reference image ${slotToLetter(slot)}`);
11219
+ if (lines.length > before) sweptUrls.add(r.url);
11220
+ }
11221
+ return lines;
11142
11222
  }
11143
11223
  function buildTileIdForUrl(urls, refs, prompt, sourceNodeIdById) {
11144
11224
  const knownSlugs = Array.from(
@@ -11311,8 +11391,10 @@ function buildImagePromptInternal(config2, marks) {
11311
11391
  );
11312
11392
  const suppressedCanonicalLocationIds = config2.suppressedCanonicalLocationIds ?? [];
11313
11393
  const isHybrid = config2.referenceFormat === "hybrid";
11394
+ const describedLines = renderDescribedReferenceLines(config2.describedReferences);
11314
11395
  let hybridBodyConverged = false;
11315
11396
  const mentionedEntityUrls = /* @__PURE__ */ new Set();
11397
+ const mentionedImageUrls = /* @__PURE__ */ new Set();
11316
11398
  if (config2.skipCharacterMentions) {
11317
11399
  config2 = {
11318
11400
  ...config2,
@@ -11430,6 +11512,7 @@ function buildImagePromptInternal(config2, marks) {
11430
11512
  resolved.additionalUrls = [...resolved.additionalUrls, ...hi.additionalUrls];
11431
11513
  hybridImageLockLines = hi.lockLines;
11432
11514
  hybridImageElementDirectives = hi.elementDirectives;
11515
+ for (const u of hi.mentionedUrls) mentionedImageUrls.add(u);
11433
11516
  if (hi.additionalUrls.length > 0) hybridBodyConverged = true;
11434
11517
  }
11435
11518
  }
@@ -11560,9 +11643,13 @@ ${promptForNext}`;
11560
11643
  referenceImageUrls = config2.referenceImageUrls || [];
11561
11644
  }
11562
11645
  }
11563
- if (connectedReferences) {
11646
+ if (connectedReferences || describedLines.length > 0) {
11647
+ const structuredRefs = connectedReferences ?? [];
11564
11648
  let prompt2 = config2.prompt;
11565
- const nonCharacterRefs = connectedReferences.filter(
11649
+ if (!isHybrid && describedLines.length > 0) {
11650
+ prompt2 = appendReferenceLines(prompt2, describedLines, "legacy");
11651
+ }
11652
+ const nonCharacterRefs = structuredRefs.filter(
11566
11653
  (r) => r.source !== "wired-character" && r.isExtraRef !== true
11567
11654
  );
11568
11655
  const nonCharacterUrls = nonCharacterRefs.map((r) => r.url).filter((u) => Boolean(u));
@@ -11592,11 +11679,23 @@ ${promptForNext}`;
11592
11679
  const canonLockBlock = canonLockLines.length > 0 ? `${canonLockLines.join("\n")}
11593
11680
 
11594
11681
  ` : "";
11682
+ const toldOverrideUrls = /* @__PURE__ */ new Set([
11683
+ ...locCanon.renderedUrls,
11684
+ ...objCanon.renderedUrls,
11685
+ ...mentionedEntityUrls,
11686
+ ...mentionedImageUrls
11687
+ ]);
11688
+ const untoldOverrides = renderUntoldOverridesHybrid(
11689
+ nonCharacterRefs,
11690
+ finalIndexByUrl,
11691
+ toldOverrideUrls
11692
+ );
11595
11693
  const canonTrailingLines = [
11596
11694
  ...locCanon.phrases,
11597
11695
  ...objCanon.phrases,
11598
11696
  ...locCanon.elementDirectives,
11599
- ...objCanon.elementDirectives
11697
+ ...objCanon.elementDirectives,
11698
+ ...untoldOverrides
11600
11699
  ];
11601
11700
  const composedScene = `${canonLockBlock}${insertBeforeStyleSection(scene, canonTrailingLines)}`;
11602
11701
  prompt2 = config2.referenceLockSnippet ? `${config2.referenceLockSnippet}
@@ -11623,6 +11722,9 @@ ${directives}`;
11623
11722
  }
11624
11723
  }
11625
11724
  }
11725
+ if (isHybrid && describedLines.length > 0) {
11726
+ prompt2 = appendReferenceLines(prompt2, describedLines, "hybrid");
11727
+ }
11626
11728
  const styleText2 = style?.trim();
11627
11729
  const styleLine2 = styleText2 && !isDeniedStyleId(styleText2) ? `Style: ${getStylePromptHint(styleText2) || styleText2}` : "";
11628
11730
  const negPrompt2 = negativePrompt?.trim();
@@ -11663,7 +11765,7 @@ ${directives}`;
11663
11765
  const reordered = applyReferenceOrder(
11664
11766
  assembledUrls,
11665
11767
  prompt2,
11666
- connectedReferences,
11768
+ structuredRefs,
11667
11769
  referenceOrder,
11668
11770
  sourceNodeIdById
11669
11771
  );
@@ -11788,7 +11890,10 @@ function collectIdentities(prompt, refs, meta3) {
11788
11890
  label,
11789
11891
  fidelity: m?.fidelity ?? defaultFidelityForSource(ref?.source),
11790
11892
  customText: m?.customText?.trim() || void 0,
11791
- description: ref?.description,
11893
+ // Per-use override ahead of the ref's own description; the directive
11894
+ // builder's location-canonical fallback only fires when BOTH are absent,
11895
+ // so an override outranks the stored location wording too.
11896
+ description: ref?.descriptionOverride?.trim() || ref?.description,
11792
11897
  source: ref?.source,
11793
11898
  locationCanonicalDescription: ref?.locationCanonicalDescription,
11794
11899
  locationSlug: ref?.locationSlug,
@@ -11896,7 +12001,7 @@ function buildNonCharacterDirectives(prompt, nonCharacterRefs, identityMeta, fin
11896
12001
  // wired-object falls through to the strict "match exactly" verb.
11897
12002
  label: ref.source === "wired-location" ? "location" : ref.source === "wired-creature" ? "creature" : "object",
11898
12003
  fidelity: defaultFidelityForSource(ref.source),
11899
- description: ref.description?.trim() || void 0,
12004
+ description: ref.descriptionOverride?.trim() || ref.description?.trim() || void 0,
11900
12005
  source: ref.source,
11901
12006
  locationCanonicalDescription: ref.locationCanonicalDescription,
11902
12007
  locationSlug: ref.locationSlug,
@@ -12423,6 +12528,8 @@ function resolveVideoCharacterMentionsHybrid(prompt, tokens, refs, offset) {
12423
12528
  const binding = bindingFor(m.url);
12424
12529
  const lock = buildIdentityLockLine(withForcedIdentityLock(ref, lockOverrideByUrl.get(m.url)), binding);
12425
12530
  if (lock) lockLines.push(lock);
12531
+ const overrideLine = referenceDescriptionLine(binding, ref.descriptionOverride);
12532
+ if (overrideLine) elementDirectives.push(overrideLine);
12426
12533
  const inject = ref.elementInjection?.trim();
12427
12534
  if (inject) elementDirectives.push(inject);
12428
12535
  }
@@ -12448,6 +12555,13 @@ function resolveVideoReferenceCore(args) {
12448
12555
  video: args.videoRefCount ?? 0,
12449
12556
  audio: args.audioRefCount ?? 0
12450
12557
  });
12558
+ const describedAndCaptionLines = [
12559
+ ...renderDescribedReferenceLines(args.describedReferences),
12560
+ ...renderReferenceCaptionLines(args.videoCaptions, args.audioCaptions, {
12561
+ video: args.videoRefCount ?? 0,
12562
+ audio: args.audioRefCount ?? 0
12563
+ })
12564
+ ];
12451
12565
  let wiredCharRefs = [...args.wiredCharRefs];
12452
12566
  const suppressedSlugs = new Set(args.suppressedCanonicalCharacterIds ?? []);
12453
12567
  if (suppressedSlugs.size > 0) {
@@ -12472,14 +12586,15 @@ function resolveVideoReferenceCore(args) {
12472
12586
  const slotByRefId = /* @__PURE__ */ new Map();
12473
12587
  if (wiredCharRefs.length === 0 && !hasExtras) {
12474
12588
  const counts = tokenCounts(leadingRefUrls.length);
12589
+ const resolved2 = resolveReferenceTokens(
12590
+ resolveRefIdTokens(args.prompt, { slotById: slotByRefId, nameById: nameByRefId, imageCount: counts.image }),
12591
+ counts
12592
+ );
12475
12593
  return {
12476
- // tokenCounts(leadingRefUrls.length) → image count == offset (no assets here):
12477
- // leadingRefUrls mode counts the leading refs; ordinalOffset mode counts the
12478
- // caller-owned leading refs the offset stands in for.
12479
- prompt: resolveReferenceTokens(
12480
- resolveRefIdTokens(args.prompt, { slotById: slotByRefId, nameById: nameByRefId, imageCount: counts.image }),
12481
- counts
12482
- ),
12594
+ // Described references and rail captions are the ONE thing this branch can
12595
+ // still contribute: they need no seat, so a request that carries only them
12596
+ // (a story landing before any entity exists) reaches the model here.
12597
+ prompt: describedAndCaptionLines.length > 0 ? appendReferenceLines(resolved2 ?? "", describedAndCaptionLines, args.hybridRoles === true ? "hybrid" : "legacy") : resolved2,
12483
12598
  additionalUrls: [...leadingRefUrls]
12484
12599
  };
12485
12600
  }
@@ -12537,6 +12652,8 @@ function resolveVideoReferenceCore(args) {
12537
12652
  canonicalPhrases.push(roleToPhrase(resolveDefaultRole(r.defaultRole, r.defaultUsageMode, r.source), binding));
12538
12653
  const lock = buildIdentityLockLine(r, binding);
12539
12654
  if (lock) canonicalLockLines.push(lock);
12655
+ const overrideLine = referenceDescriptionLine(binding, r.descriptionOverride);
12656
+ if (overrideLine) canonicalElementDirectives.push(overrideLine);
12540
12657
  const inject = r.elementInjection?.trim();
12541
12658
  if (inject) canonicalElementDirectives.push(inject);
12542
12659
  continue;
@@ -12553,7 +12670,10 @@ function resolveVideoReferenceCore(args) {
12553
12670
  const directive = usageModeDirective(effectiveMode);
12554
12671
  const includeCanonicalDesc = effectiveMode === "identical" || effectiveMode === "face-pose";
12555
12672
  const descBodyParts = [];
12556
- if (includeCanonicalDesc && r.characterCanonicalDescription?.trim()) {
12673
+ const canonicalOverride = r.descriptionOverride?.trim();
12674
+ if (canonicalOverride) {
12675
+ descBodyParts.push(canonicalOverride);
12676
+ } else if (includeCanonicalDesc && r.characterCanonicalDescription?.trim()) {
12557
12677
  descBodyParts.push(r.characterCanonicalDescription.trim());
12558
12678
  }
12559
12679
  if (r.elementInjection?.trim()) descBodyParts.push(r.elementInjection.trim());
@@ -12570,7 +12690,7 @@ function resolveVideoReferenceCore(args) {
12570
12690
  if (!ex.url) continue;
12571
12691
  position += 1;
12572
12692
  if (ex.id && !slotByRefId.has(ex.id)) slotByRefId.set(ex.id, position);
12573
- const desc = (ex.description ?? "").trim();
12693
+ const desc = (ex.descriptionOverride ?? "").trim() || (ex.description ?? "").trim();
12574
12694
  if (ex.characterSlug) {
12575
12695
  const meta3 = args.lookupCharacterBySlug?.(ex.characterSlug);
12576
12696
  const charDefaultMode = meta3?.defaultUsageMode;
@@ -12714,6 +12834,11 @@ ${finalPrompt}` : block;
12714
12834
  merged.push(u);
12715
12835
  }
12716
12836
  }
12837
+ finalPrompt = appendReferenceLines(
12838
+ finalPrompt,
12839
+ describedAndCaptionLines,
12840
+ hybrid ? "hybrid" : "legacy"
12841
+ );
12717
12842
  finalPrompt = resolveRefIdTokens(finalPrompt, {
12718
12843
  slotById: slotByRefId,
12719
12844
  nameById: nameByRefId,
@@ -12928,6 +13053,7 @@ function assembleImageInput(input) {
12928
13053
  prompt: composePromptText(input.userPrompt, pieces, keptHintClauses),
12929
13054
  provider: input.provider,
12930
13055
  ...input.connectedReferences !== void 0 ? { connectedReferences: input.connectedReferences } : {},
13056
+ ...input.describedReferences !== void 0 ? { describedReferences: input.describedReferences } : {},
12931
13057
  // Manual uploads / direct refs ride the builder's reference-URL channel so
12932
13058
  // the per-provider reference gate filters them alongside bound entities.
12933
13059
  // Omit the field entirely when absent so the builder's default ([]) kicks
@@ -29353,6 +29479,8 @@ var NODE_PROMPT_FIELDS = {
29353
29479
  // ── Composition / FX (compact, no media-result preview → no inline editor) ──
29354
29480
  "image-critic": { prompt: "prompt", promptLabel: "Criteria", media: "image", inline: false },
29355
29481
  "motion-graphics": { prompt: "motionPrompt", promptLabel: "Motion prompt", media: "video", inline: false },
29482
+ "generate-3d-scene": { prompt: "scenePrompt", promptLabel: "Scene", media: "text", inline: false },
29483
+ "edit-3d-scene": { prompt: "editPrompt", promptLabel: "Edit instruction", media: "text", inline: false },
29356
29484
  "3d-title": { prompt: "titlePrompt", promptLabel: "Title", media: "text", inline: false },
29357
29485
  // ── Script / alignment (their primary text field) ──
29358
29486
  "generate-script": { prompt: "styleGuide", promptLabel: "Style guide", media: "text", inline: false },
@@ -34636,6 +34764,6 @@ function buildSurroundFillPrompt(direction, userPrompt) {
34636
34764
  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.`;
34637
34765
  }
34638
34766
 
34639
- export { ACTION_FX, ACTION_FX_CATEGORY_LABELS, ACTION_FX_CATEGORY_ORDER, ACTION_FX_IDS, ADULT_AGE_IDS, ADULT_ONLY_FLAG, ADULT_SWEPT_CATALOG_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, FLOORED_PICKER_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, MINOR_IMPLYING_TYPE_IDS, 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, RETIRED_ADULT_ONLY_HINT_STRINGS, 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, __resetCatalogIdGuardForTests, appendField, appendMusicMeta, applyMinorAgeFloorToPickerValues, 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, buildNeedleAlternationSource, 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, catalogGuardActive, catalogPacksVersion, characterLockToRefLock, collectIdentityLockClause, composeCameraMotionHintFromConnections, composeCameraMotionTermFromConnections, composeCharacterFxHintFromConnections, composeNegative, composePickerCatalogs, composeSectionedPrompt, composeSoundHintFromConnections, composeTransitionHintFromConnections, composeVideoPromptText, composedHas, composedOption, composedOptionIndex, computeLlmChatFields, computeNodePrompt, computePackSidecarCoverage, containsMinorAgeHint, curateEntries, curatedAnimalPromptHint, curatedAnimalTerm, curatedFurnitureText, curatedVehicleText, curatedWeaponText, deriveTerm, directionFieldsForSurface, endsInsideStyleSection, expandImagePositionRefs, expandImageRefTokens, filmStillPrefix, findForeignCatalogIds, findForeignCatalogIdsInBody, foreignCatalogIdMessage, getActionFx, getActionFxLabel, getActionFxPromptHint, getActionFxTerm, getAdultOnlyEntries, getAdultOnlyHintStrings, getAdultOnlyIds, 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, getMinorAgeHintStrings, 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, hasCatalogPacksFor, hasUpstreamCharacter, identityRefsSentence, insertBeforeStyleSection, isAnalyzablePicker, isDeniedStyleId, isInstrumentalVocal, isMinorAge, isSuspiciousDerivedTerm, isVantageFraming, isWizardSupported, joinPromptHints, joinPromptParts, keepableDirectionHints, listPickerCatalogs, migratePersonValue, modeForFamily, nodeHasInlinePrompt, nodeHasPromptField, nodeSupportsPromptAffixes, normalizeSubjectFields, overlayEntry, 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, setComposedCatalogResolver, splitStyleSection, styleSectionFromClauses, styleSlotFor, subjectFieldsForSurface, subscribeCatalogPacks, summarizePickerCatalogs, toIdentityLockMode, truncateForField, truncateText, withForcedIdentityLock };
34767
+ export { ACTION_FX, ACTION_FX_CATEGORY_LABELS, ACTION_FX_CATEGORY_ORDER, ACTION_FX_IDS, ADULT_AGE_IDS, ADULT_ONLY_FLAG, ADULT_SWEPT_CATALOG_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, FLOORED_PICKER_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, MINOR_IMPLYING_TYPE_IDS, 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, RETIRED_ADULT_ONLY_HINT_STRINGS, 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, __resetCatalogIdGuardForTests, appendField, appendMusicMeta, appendReferenceLines, applyMinorAgeFloorToPickerValues, 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, buildNeedleAlternationSource, 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, catalogGuardActive, catalogPacksVersion, characterLockToRefLock, collectIdentityLockClause, composeCameraMotionHintFromConnections, composeCameraMotionTermFromConnections, composeCharacterFxHintFromConnections, composeNegative, composePickerCatalogs, composeSectionedPrompt, composeSoundHintFromConnections, composeTransitionHintFromConnections, composeVideoPromptText, composedHas, composedOption, composedOptionIndex, computeLlmChatFields, computeNodePrompt, computePackSidecarCoverage, containsMinorAgeHint, curateEntries, curatedAnimalPromptHint, curatedAnimalTerm, curatedFurnitureText, curatedVehicleText, curatedWeaponText, deriveTerm, directionFieldsForSurface, endsInsideStyleSection, expandImagePositionRefs, expandImageRefTokens, filmStillPrefix, findForeignCatalogIds, findForeignCatalogIdsInBody, foreignCatalogIdMessage, getActionFx, getActionFxLabel, getActionFxPromptHint, getActionFxTerm, getAdultOnlyEntries, getAdultOnlyHintStrings, getAdultOnlyIds, 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, getMinorAgeHintStrings, 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, hasCatalogPacksFor, hasUpstreamCharacter, identityRefsSentence, insertBeforeStyleSection, isAnalyzablePicker, isDeniedStyleId, isInstrumentalVocal, isMinorAge, isSuspiciousDerivedTerm, isVantageFraming, isWizardSupported, joinPromptHints, joinPromptParts, keepableDirectionHints, listPickerCatalogs, migratePersonValue, modeForFamily, nodeHasInlinePrompt, nodeHasPromptField, nodeSupportsPromptAffixes, normalizeSubjectFields, overlayEntry, partitionStyleClauses, personPacksVersion, pickerFanoutTargets, projectAllCatalogs, projectPickerCatalog, promptAffixCoreField, promptBindsFirstFrame, promptFieldCarriesAffixes, promptPartSeparator, readDirectionFields, readStructuredFields, readSubjectFields, referenceDescriptionLine, referenceRulesBlock, registerCatalogPack, registerPersonPack, renderDescribedReferenceLines, renderDirectionHintClauses, renderDirectionHints, renderReferenceCaptionLines, renderStructuredFields, renderStyleSection, renderSubjectHints, resetCatalogPacks, resetPersonPacks, resolveBrandInput, resolveCharacterMentions, resolveGeminiOmniI2vInputs, resolveLocationMentions, resolvePrompt, resolveRefIdTokens, resolveReferenceTokens, resolveSeedance2Inputs, resolveTemplate, resolveTerm, resolveVeoI2vInputs, resolveVideoReferenceCore, sectionedClauseCosts, setComposedCatalogResolver, splitStyleSection, styleSectionFromClauses, styleSlotFor, subjectFieldsForSurface, subscribeCatalogPacks, summarizePickerCatalogs, toIdentityLockMode, truncateForField, truncateText, withForcedIdentityLock };
34640
34768
  //# sourceMappingURL=index.js.map
34641
34769
  //# sourceMappingURL=index.js.map