@nodaro/prompts 1.9.0 → 1.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +426 -35
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +830 -51
- package/dist/index.d.ts +830 -51
- package/dist/index.js +410 -37
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/src/__tests__/assemble-image-input.test.ts +93 -3
- package/src/__tests__/assemble-video-input.test.ts +301 -0
- package/src/__tests__/character-fx-timing-catalogs.test.ts +240 -0
- package/src/__tests__/direction-hint-token-safety.test.ts +113 -0
- package/src/__tests__/direction-registry.test.ts +393 -0
- package/src/__tests__/image-convergence-image.test.ts +370 -0
- package/src/__tests__/read-node-direction.test.ts +154 -0
- package/src/__tests__/transition-timing-catalogs.test.ts +3 -1
- package/src/__tests__/video-reference-ref-id-tokens.test.ts +301 -0
- package/src/assemble-image-input.ts +45 -46
- package/src/assemble-video-input.ts +89 -0
- package/src/character-fx.ts +102 -19
- package/src/direction-registry.ts +354 -0
- package/src/index.ts +8 -2
- package/src/picker-catalogs.ts +18 -1
- package/src/prompt-builder.ts +188 -1
- package/src/prompt-hint-join.ts +30 -0
- package/src/provider-prompt-doctrine.ts +2 -2
- package/src/read-node-direction.ts +174 -0
- package/src/ref-binding.ts +45 -0
- package/src/ref-id-tokens.ts +112 -0
- package/src/video-reference-resolver.ts +78 -39
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, getFurniture, getWeapon, getVehicle, getAnimal, DEFAULT_USAGE_MODE, usageModeDirective, DEFAULT_LOCATION_USAGE_MODE, imageReferenceLimit, findCharacterMentionTokens, findLocationMentionTokens, NATIVE_NEGATIVE_PROMPT_MODELS, getMaxNegativePromptChars, getMaxImagePromptChars, MODELS_WITH_REFERENCE_IMAGE_SUPPORT, roleToPhrase, resolveDefaultRole, SEEDANCE_2_REF_LIMITS, NON_EN_LOCALE_IDS, readPromptAffixes, setRegisteredPersonPackFields, PLACEHOLDER_CHARACTER_NAME, REFERENCE_ROLE_PRESETS, normalizeRoleSlug, defaultRoleForSource, locationReferencePhotoKindLabel, resolveNodeRefs } 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, VIDEO_REF_LIMITS_BY_PROVIDER, SOCIAL_POST_NODE_TYPES, FURNITURE, WEAPONS, VEHICLES, ANIMALS, PASSTHROUGH_TYPES, registerCatalogSidecars, resetCatalogSidecars, pickIds, getFurniture, getWeapon, getVehicle, getAnimal, DEFAULT_USAGE_MODE, usageModeDirective, DEFAULT_LOCATION_USAGE_MODE, imageReferenceLimit, knownImageSlugsFromRefs, findImageMentionTokens, findCharacterMentionTokens, findLocationMentionTokens, NATIVE_NEGATIVE_PROMPT_MODELS, getMaxNegativePromptChars, getMaxImagePromptChars, MODELS_WITH_REFERENCE_IMAGE_SUPPORT, roleToPhrase, resolveDefaultRole, SEEDANCE_2_REF_LIMITS, NON_EN_LOCALE_IDS, readPromptAffixes, setRegisteredPersonPackFields, PLACEHOLDER_CHARACTER_NAME, REFERENCE_ROLE_PRESETS, normalizeRoleSlug, imageMentionSlugForRef, defaultRoleForSource, locationReferencePhotoKindLabel, resolveNodeRefs } from '@nodaro/shared';
|
|
2
2
|
|
|
3
3
|
var __defProp = Object.defineProperty;
|
|
4
4
|
var __export = (target, all) => {
|
|
@@ -5890,24 +5890,35 @@ function getCharacterFxTerm(id) {
|
|
|
5890
5890
|
return resolveTerm(getCharacterFx(id));
|
|
5891
5891
|
}
|
|
5892
5892
|
var CHARACTER_FX_IDS = CHARACTER_FX.map((c) => c.id);
|
|
5893
|
-
var
|
|
5894
|
-
|
|
5895
|
-
|
|
5896
|
-
|
|
5897
|
-
|
|
5898
|
-
}
|
|
5899
|
-
|
|
5900
|
-
|
|
5901
|
-
|
|
5902
|
-
|
|
5903
|
-
|
|
5904
|
-
}
|
|
5905
|
-
|
|
5906
|
-
|
|
5907
|
-
|
|
5908
|
-
|
|
5909
|
-
|
|
5910
|
-
}
|
|
5893
|
+
var CHARACTER_FX_POSITIONS = [
|
|
5894
|
+
{ id: "auto", label: "Auto", description: "Let the model place the effect", promptHint: "", term: "" },
|
|
5895
|
+
{ id: "start", label: "Start", description: "Occurs at the opening of the clip", promptHint: "the effect occurs at the opening of the clip", term: "at the opening of the clip" },
|
|
5896
|
+
{ id: "middle", label: "Middle", description: "Occurs in the middle of the clip", promptHint: "the effect occurs in the middle of the clip", term: "mid-clip" },
|
|
5897
|
+
{ id: "end", label: "End", description: "Occurs at the end of the clip", promptHint: "the effect occurs at the end of the clip", term: "at the end of the clip" },
|
|
5898
|
+
{ id: "full", label: "Full", description: "Persists for the entire clip", promptHint: "the effect persists for the entire clip", term: "persisting for the whole clip" }
|
|
5899
|
+
];
|
|
5900
|
+
var CHARACTER_FX_DURATIONS = [
|
|
5901
|
+
{ id: "auto", label: "Auto", description: "Let the model time the effect", promptHint: "", term: "" },
|
|
5902
|
+
{ id: "instant", label: "Instant", description: "Manifests instantaneously", promptHint: "manifesting instantaneously", term: "manifesting instantly" },
|
|
5903
|
+
{ id: "short", label: "Short (~1s)", description: "Manifests over approximately 1 second", promptHint: "manifesting over approximately 1 second", term: "manifesting over about 1 second" },
|
|
5904
|
+
{ id: "medium", label: "Medium (~2s)", description: "Manifests over approximately 2 seconds", promptHint: "manifesting over approximately 2 seconds", term: "manifesting over about 2 seconds" },
|
|
5905
|
+
{ id: "long", label: "Long (~3s)", description: "Manifests over approximately 3 seconds", promptHint: "manifesting over approximately 3 seconds", term: "manifesting over about 3 seconds" }
|
|
5906
|
+
];
|
|
5907
|
+
var CHARACTER_FX_INTENSITIES = [
|
|
5908
|
+
{ id: "auto", label: "Auto", description: "Let the model judge the effect's energy", promptHint: "", term: "" },
|
|
5909
|
+
{ id: "subtle", label: "Subtle", description: "Restrained, minimal flourish", promptHint: "with subtle restrained energy and minimal flourish", term: "subtly" },
|
|
5910
|
+
{ id: "natural", label: "Natural", description: "Unhurried, unforced timing", promptHint: "with natural unhurried timing", term: "at a natural pace" },
|
|
5911
|
+
{ id: "dynamic", label: "Dynamic", description: "Assertive, energetic", promptHint: "with dynamic energy and assertive flourish", term: "energetically" },
|
|
5912
|
+
{ id: "crazy", label: "Crazy", description: "Extreme, wild, distorted", promptHint: "with extreme exaggerated energy, wild flourishes, and dramatic distortion", term: "wildly exaggerated" }
|
|
5913
|
+
];
|
|
5914
|
+
function clausesOf2(options) {
|
|
5915
|
+
return Object.fromEntries(
|
|
5916
|
+
options.filter((o) => o.id !== "auto").map((o) => [o.id, o.promptHint])
|
|
5917
|
+
);
|
|
5918
|
+
}
|
|
5919
|
+
var POSITION_CLAUSES2 = clausesOf2(CHARACTER_FX_POSITIONS);
|
|
5920
|
+
var DURATION_CLAUSES2 = clausesOf2(CHARACTER_FX_DURATIONS);
|
|
5921
|
+
var INTENSITY_CLAUSES2 = clausesOf2(CHARACTER_FX_INTENSITIES);
|
|
5911
5922
|
function composeCharacterFxHintFromConnections(effectId, targetHints, timing, mode = "full") {
|
|
5912
5923
|
const ids = Array.isArray(effectId) ? Array.from(new Set(effectId)).slice(0, 2) : effectId ? [effectId] : [];
|
|
5913
5924
|
const resolveBase = mode === "compact" ? getCharacterFxTerm : getCharacterFxPromptHint;
|
|
@@ -9516,7 +9527,17 @@ var SINGLE_CATALOGS = [
|
|
|
9516
9527
|
defaultValue: "auto",
|
|
9517
9528
|
categoryOrder: CHARACTER_FX_CATEGORY_ORDER,
|
|
9518
9529
|
categoryLabels: CHARACTER_FX_CATEGORY_LABELS,
|
|
9519
|
-
options: toOptions(CHARACTER_FX, "category")
|
|
9530
|
+
options: toOptions(CHARACTER_FX, "category"),
|
|
9531
|
+
// The node's three timing parameters, alongside the effect itself — the
|
|
9532
|
+
// same shape `transition` carries above, but the character-fx scales, not
|
|
9533
|
+
// the transition ones: the wording is deliberately different (an effect
|
|
9534
|
+
// manifests and persists; a transition occurs and spans), so an id-only
|
|
9535
|
+
// consumer must read these rows, never reuse the transition rows.
|
|
9536
|
+
dimensions: perFieldDims([
|
|
9537
|
+
["position", CHARACTER_FX_POSITIONS],
|
|
9538
|
+
["duration", CHARACTER_FX_DURATIONS],
|
|
9539
|
+
["intensity", CHARACTER_FX_INTENSITIES]
|
|
9540
|
+
])
|
|
9520
9541
|
},
|
|
9521
9542
|
// -------- "Subject / Object" family --------
|
|
9522
9543
|
{
|
|
@@ -10454,6 +10475,55 @@ function resolveLocationMentionsHybrid(prompt, tokens, refs, existingUrls) {
|
|
|
10454
10475
|
}
|
|
10455
10476
|
return { prompt: resolvedPrompt, additionalUrls, mentionedLocationSlugs, lockLines, elementDirectives };
|
|
10456
10477
|
}
|
|
10478
|
+
function resolveImageMentionsHybrid(prompt, tokens, refs, existingUrls) {
|
|
10479
|
+
const bySlug = /* @__PURE__ */ new Map();
|
|
10480
|
+
for (const r of refs) {
|
|
10481
|
+
const slug = imageMentionSlugForRef(r);
|
|
10482
|
+
if (!slug) continue;
|
|
10483
|
+
if (!bySlug.has(slug)) bySlug.set(slug, r);
|
|
10484
|
+
}
|
|
10485
|
+
const additionalUrls = [];
|
|
10486
|
+
const refByUrl = /* @__PURE__ */ new Map();
|
|
10487
|
+
const lockOverrideByUrl = /* @__PURE__ */ new Map();
|
|
10488
|
+
const matched = [];
|
|
10489
|
+
for (const t of tokens) {
|
|
10490
|
+
const match = bySlug.get(t.imageSlug);
|
|
10491
|
+
if (!match || !match.url) continue;
|
|
10492
|
+
additionalUrls.push(match.url);
|
|
10493
|
+
refByUrl.set(match.url, match);
|
|
10494
|
+
if (t.lock !== void 0) lockOverrideByUrl.set(match.url, t.lock);
|
|
10495
|
+
const role = (t.role ?? "").trim() || resolveDefaultRole(match.defaultRole, match.defaultUsageMode, match.source);
|
|
10496
|
+
matched.push({ token: t.token, offset: t.offset, url: match.url, role });
|
|
10497
|
+
}
|
|
10498
|
+
const slotByUrl = /* @__PURE__ */ new Map();
|
|
10499
|
+
for (const u of [...existingUrls, ...additionalUrls]) {
|
|
10500
|
+
if (!slotByUrl.has(u)) slotByUrl.set(u, slotByUrl.size + 1);
|
|
10501
|
+
}
|
|
10502
|
+
const bindingFor = (url2) => {
|
|
10503
|
+
const slot = slotByUrl.get(url2);
|
|
10504
|
+
return slot ? `reference image ${slotToLetter(slot)}` : "the reference image";
|
|
10505
|
+
};
|
|
10506
|
+
let resolvedPrompt = prompt;
|
|
10507
|
+
for (const m of [...matched].sort((a, b) => b.offset - a.offset)) {
|
|
10508
|
+
const phrase = roleToPhrase(m.role, bindingFor(m.url));
|
|
10509
|
+
resolvedPrompt = resolvedPrompt.slice(0, m.offset) + phrase + resolvedPrompt.slice(m.offset + m.token.length);
|
|
10510
|
+
}
|
|
10511
|
+
const lockLines = [];
|
|
10512
|
+
const elementDirectives = [];
|
|
10513
|
+
const seenUrls = /* @__PURE__ */ new Set();
|
|
10514
|
+
for (const m of matched) {
|
|
10515
|
+
if (seenUrls.has(m.url)) continue;
|
|
10516
|
+
seenUrls.add(m.url);
|
|
10517
|
+
const ref = refByUrl.get(m.url);
|
|
10518
|
+
if (!ref) continue;
|
|
10519
|
+
const binding = bindingFor(m.url);
|
|
10520
|
+
const lock = buildIdentityLockLine(withForcedIdentityLock(ref, lockOverrideByUrl.get(m.url)), binding);
|
|
10521
|
+
if (lock) lockLines.push(lock);
|
|
10522
|
+
const inject = ref.elementInjection?.trim();
|
|
10523
|
+
if (inject) elementDirectives.push(inject);
|
|
10524
|
+
}
|
|
10525
|
+
return { prompt: resolvedPrompt, additionalUrls, lockLines, elementDirectives };
|
|
10526
|
+
}
|
|
10457
10527
|
function buildCanonicalFallback(refs, mentionedSlugs, startIndex) {
|
|
10458
10528
|
const directiveLines = [];
|
|
10459
10529
|
const urls = [];
|
|
@@ -10836,7 +10906,9 @@ function buildImagePromptInternal(config2, marks) {
|
|
|
10836
10906
|
connectedReferences.map((r) => r.locationSlug).filter((s) => typeof s === "string" && s.length > 0)
|
|
10837
10907
|
)
|
|
10838
10908
|
);
|
|
10839
|
-
|
|
10909
|
+
const knownImageSlugs = knownImageSlugsFromRefs(connectedReferences);
|
|
10910
|
+
const hasImageMentionTokens = isHybrid && knownImageSlugs.length > 0 && findImageMentionTokens(config2.prompt, knownImageSlugs).length > 0;
|
|
10911
|
+
if (knownCharacterSlugs.length > 0 || hasExtraRefs || knownLocationSlugs.length > 0 || hasImageMentionTokens) {
|
|
10840
10912
|
const mentionTokens = knownCharacterSlugs.length > 0 ? findCharacterMentionTokens(config2.prompt, knownCharacterSlugs) : [];
|
|
10841
10913
|
let hybridLockLines = [];
|
|
10842
10914
|
let hybridElementDirectives = [];
|
|
@@ -10890,6 +10962,24 @@ function buildImagePromptInternal(config2, marks) {
|
|
|
10890
10962
|
if (r.locationVariantBucket) return false;
|
|
10891
10963
|
return !mentionedLocationSlugs.has(r.locationSlug);
|
|
10892
10964
|
});
|
|
10965
|
+
let hybridImageLockLines = [];
|
|
10966
|
+
let hybridImageElementDirectives = [];
|
|
10967
|
+
if (hasImageMentionTokens) {
|
|
10968
|
+
const imageTokens = findImageMentionTokens(resolved.prompt, knownImageSlugs);
|
|
10969
|
+
if (imageTokens.length > 0) {
|
|
10970
|
+
const hi = resolveImageMentionsHybrid(
|
|
10971
|
+
resolved.prompt,
|
|
10972
|
+
imageTokens,
|
|
10973
|
+
connectedReferences,
|
|
10974
|
+
[...referenceImageUrls || [], ...resolved.additionalUrls]
|
|
10975
|
+
);
|
|
10976
|
+
resolved.prompt = hi.prompt;
|
|
10977
|
+
resolved.additionalUrls = [...resolved.additionalUrls, ...hi.additionalUrls];
|
|
10978
|
+
hybridImageLockLines = hi.lockLines;
|
|
10979
|
+
hybridImageElementDirectives = hi.elementDirectives;
|
|
10980
|
+
if (hi.additionalUrls.length > 0) hybridBodyConverged = true;
|
|
10981
|
+
}
|
|
10982
|
+
}
|
|
10893
10983
|
const prefixDedupedLength = [
|
|
10894
10984
|
...referenceImageUrls || [],
|
|
10895
10985
|
...resolved.additionalUrls
|
|
@@ -10970,12 +11060,14 @@ ${promptForNext}`;
|
|
|
10970
11060
|
const allLockLines = [.../* @__PURE__ */ new Set([
|
|
10971
11061
|
...hybridLockLines,
|
|
10972
11062
|
...hybridLocationLockLines,
|
|
11063
|
+
...hybridImageLockLines,
|
|
10973
11064
|
...canonical.lockLines,
|
|
10974
11065
|
...extrasRendered.lockLines
|
|
10975
11066
|
])];
|
|
10976
11067
|
const trailingLines = [
|
|
10977
11068
|
...hybridElementDirectives,
|
|
10978
11069
|
...hybridLocationElementDirectives,
|
|
11070
|
+
...hybridImageElementDirectives,
|
|
10979
11071
|
...canonical.phrases,
|
|
10980
11072
|
...canonical.elementDirectives,
|
|
10981
11073
|
...extrasRendered.bodyLines,
|
|
@@ -11598,6 +11690,134 @@ function renderLens(l) {
|
|
|
11598
11690
|
if (l.aperture) bits.push(`f/${l.aperture}`);
|
|
11599
11691
|
return bits.length > 0 ? `Lens: ${bits.join(", ")}.` : "";
|
|
11600
11692
|
}
|
|
11693
|
+
|
|
11694
|
+
// src/direction-registry.ts
|
|
11695
|
+
var perId = (full, compact) => (ids, mode) => {
|
|
11696
|
+
const out = [];
|
|
11697
|
+
for (const id of ids) {
|
|
11698
|
+
const frag = mode === "compact" ? compact(id) : full(id);
|
|
11699
|
+
if (frag.length > 0) out.push(frag);
|
|
11700
|
+
}
|
|
11701
|
+
return out;
|
|
11702
|
+
};
|
|
11703
|
+
var viaListBuilder = (build) => (ids, mode) => build(ids.length === 1 ? ids[0] : [...ids], mode).filter((s) => s.length > 0);
|
|
11704
|
+
var viaStringBuilder = (build) => (ids, mode) => {
|
|
11705
|
+
const s = build(ids.length === 1 ? ids[0] : [...ids], mode);
|
|
11706
|
+
return s.length > 0 ? [s] : [];
|
|
11707
|
+
};
|
|
11708
|
+
var viaMood = (ids, mode) => buildMoodHints({ mood: ids.length === 1 ? ids[0] : [...ids] }, mode).filter(
|
|
11709
|
+
(s) => s.length > 0
|
|
11710
|
+
);
|
|
11711
|
+
var framing = perId(getFramingPromptHint, getFramingTerm);
|
|
11712
|
+
var lighting = perId(getLightingPromptHint, getLightingTerm);
|
|
11713
|
+
var exposure = perId(getExposurePromptHint, getExposureTerm);
|
|
11714
|
+
var temporal = perId(getTemporalPromptHint, getTemporalTerm);
|
|
11715
|
+
var DIRECTION_FIELDS = [
|
|
11716
|
+
{ key: "cameraMotion", surface: "video", family: "motion", maxPicks: 1, render: perId(getCameraMotionPromptHint, getCameraMotionTerm) },
|
|
11717
|
+
// Composition (the Framing catalog, one row per category).
|
|
11718
|
+
{ key: "shotSize", surface: "both", family: "look", maxPicks: 1, render: framing },
|
|
11719
|
+
{ key: "angle", surface: "both", family: "look", maxPicks: 1, render: framing },
|
|
11720
|
+
{ key: "coverage", surface: "both", family: "look", maxPicks: 1, render: framing },
|
|
11721
|
+
{ key: "composition", surface: "both", family: "look", maxPicks: 2, render: framing },
|
|
11722
|
+
{ key: "vantage", surface: "both", family: "look", maxPicks: 1, render: framing },
|
|
11723
|
+
{ key: "pose", surface: "both", family: "look", maxPicks: 1, render: perId(getPosePromptHint, getPoseTerm) },
|
|
11724
|
+
{ key: "compositionEffect", surface: "both", family: "look", maxPicks: 1, render: perId(getCompositionEffectPromptHint, getCompositionEffectTerm) },
|
|
11725
|
+
// Camera.
|
|
11726
|
+
{ key: "cameraFormat", surface: "both", family: "look", maxPicks: 1, render: perId(getCameraFormatPromptHint, getCameraFormatTerm) },
|
|
11727
|
+
{ key: "lens", surface: "both", family: "look", maxPicks: 1, render: perId(getLensPromptHint, getLensTerm) },
|
|
11728
|
+
// Exposure (stills only — a video's exposure rides its own temporal levers).
|
|
11729
|
+
{ key: "aperture", surface: "image", family: "look", maxPicks: 1, render: exposure },
|
|
11730
|
+
{ key: "shutterSpeed", surface: "image", family: "look", maxPicks: 1, render: exposure },
|
|
11731
|
+
{ key: "isoValue", surface: "image", family: "look", maxPicks: 1, render: exposure },
|
|
11732
|
+
// Light (the Lighting catalog, one row per category).
|
|
11733
|
+
{ key: "timeOfDay", surface: "both", family: "look", maxPicks: 1, render: lighting },
|
|
11734
|
+
{ key: "lightingStyle", surface: "both", family: "look", maxPicks: 2, render: lighting },
|
|
11735
|
+
{ key: "lightingDirection", surface: "both", family: "look", maxPicks: 1, render: lighting },
|
|
11736
|
+
{ key: "lightingRatio", surface: "both", family: "look", maxPicks: 1, render: lighting },
|
|
11737
|
+
{ key: "colorTemperature", surface: "both", family: "look", maxPicks: 1, render: lighting },
|
|
11738
|
+
{ key: "colorLook", surface: "both", family: "look", maxPicks: 1, render: perId(getColorLookPromptHint, getColorLookTerm) },
|
|
11739
|
+
{ key: "atmosphere", surface: "both", family: "look", maxPicks: 2, render: viaListBuilder(buildAtmosphereHints) },
|
|
11740
|
+
{ key: "postProcess", surface: "image", family: "look", maxPicks: 2, render: viaListBuilder(buildPostProcessHints) },
|
|
11741
|
+
// Style.
|
|
11742
|
+
{ key: "style", surface: "both", family: "look", maxPicks: 1, render: perId(getStylePromptHint, getStyleTerm) },
|
|
11743
|
+
{ key: "mood", surface: "both", family: "look", maxPicks: 2, render: viaMood },
|
|
11744
|
+
{ key: "aesthetic", surface: "both", family: "look", maxPicks: 2, render: viaStringBuilder(buildAestheticHints) },
|
|
11745
|
+
{ key: "photoGenre", surface: "image", family: "look", maxPicks: 1, render: perId(getPhotoGenrePromptHint, getPhotoGenreTerm) },
|
|
11746
|
+
{ key: "photographer", surface: "image", family: "look", maxPicks: 2, render: viaStringBuilder(buildPhotographerHints) },
|
|
11747
|
+
{ key: "renderQuality", surface: "image", family: "look", maxPicks: 1, render: perId(getRenderQualityPromptHint, getRenderQualityTerm) },
|
|
11748
|
+
// Scene.
|
|
11749
|
+
{ key: "setting", surface: "both", family: "look", maxPicks: 1, render: perId(getSettingPromptHint, getSettingTerm) },
|
|
11750
|
+
{ key: "era", surface: "both", family: "look", maxPicks: 1, render: perId(getEraPromptHint, getEraTerm) },
|
|
11751
|
+
{ key: "backdrop", surface: "both", family: "look", maxPicks: 1, render: perId(getBackdropPromptHint, getBackdropTerm) },
|
|
11752
|
+
// Motion & time.
|
|
11753
|
+
{ key: "actionFx", surface: "video", family: "motion", maxPicks: 2, render: viaListBuilder(buildActionFxHints) },
|
|
11754
|
+
{ key: "temporalSpeed", surface: "video", family: "motion", maxPicks: 1, render: temporal },
|
|
11755
|
+
{ key: "temporalFreeze", surface: "video", family: "motion", maxPicks: 1, render: temporal },
|
|
11756
|
+
{ key: "temporalDirection", surface: "video", family: "motion", maxPicks: 1, render: temporal },
|
|
11757
|
+
{ key: "temporalShutter", surface: "video", family: "motion", maxPicks: 1, render: temporal },
|
|
11758
|
+
{ key: "transition", surface: "video", family: "motion", maxPicks: 2, render: perId(getTransitionPromptHint, getTransitionTerm) },
|
|
11759
|
+
{ key: "loopSubject", surface: "video", family: "motion", maxPicks: 1, render: perId(getLoopSubjectPromptHint, getLoopSubjectTerm) },
|
|
11760
|
+
// ── LEGACY BLOCK — see the table doc above. Placed LAST, in today's exact
|
|
11761
|
+
// `composePromptText` order, so every pre-registry caller is byte-identical.
|
|
11762
|
+
{ key: "framingId", surface: "both", family: "look", maxPicks: 1, render: framing },
|
|
11763
|
+
{ key: "framingAngleId", surface: "both", family: "look", maxPicks: 1, render: framing },
|
|
11764
|
+
{ key: "lightingId", surface: "both", family: "look", maxPicks: 1, render: lighting },
|
|
11765
|
+
{ key: "lensId", surface: "both", family: "look", maxPicks: 1, render: perId(getLensPromptHint, getLensTerm) },
|
|
11766
|
+
{ key: "cameraFormatId", surface: "both", family: "look", maxPicks: 1, render: perId(getCameraFormatPromptHint, getCameraFormatTerm) }
|
|
11767
|
+
];
|
|
11768
|
+
var DIRECTION_KEYS = DIRECTION_FIELDS.map((f) => f.key);
|
|
11769
|
+
var IMAGE_HINT_MODE_DEFAULT = "full";
|
|
11770
|
+
var VIDEO_HINT_MODE_DEFAULT = { look: "full", motion: "compact" };
|
|
11771
|
+
function modeForFamily(mode, family) {
|
|
11772
|
+
return typeof mode === "string" ? mode : family === "motion" ? mode.motion : mode.look;
|
|
11773
|
+
}
|
|
11774
|
+
var DIRECTION_ARRAY_CEILING = 8;
|
|
11775
|
+
var DIRECTION_ID_MAX_CHARS = 100;
|
|
11776
|
+
function normalizeDirectionIds(value, maxPicks) {
|
|
11777
|
+
const ids = [];
|
|
11778
|
+
if (typeof value === "string") {
|
|
11779
|
+
if (value) ids.push(value);
|
|
11780
|
+
} else if (Array.isArray(value)) {
|
|
11781
|
+
for (const v of value) {
|
|
11782
|
+
if (ids.length >= maxPicks) break;
|
|
11783
|
+
if (typeof v === "string" && v && !ids.includes(v)) ids.push(v);
|
|
11784
|
+
}
|
|
11785
|
+
}
|
|
11786
|
+
return ids.slice(0, maxPicks);
|
|
11787
|
+
}
|
|
11788
|
+
function directionFieldsForSurface(surface) {
|
|
11789
|
+
return DIRECTION_FIELDS.filter((f) => f.surface === "both" || f.surface === surface);
|
|
11790
|
+
}
|
|
11791
|
+
function renderDirectionHints(direction, opts) {
|
|
11792
|
+
if (!direction) return [];
|
|
11793
|
+
const mode = opts.mode ?? "full";
|
|
11794
|
+
const out = [];
|
|
11795
|
+
const seen = /* @__PURE__ */ new Set();
|
|
11796
|
+
for (const spec of DIRECTION_FIELDS) {
|
|
11797
|
+
if (spec.surface !== "both" && spec.surface !== opts.surface) continue;
|
|
11798
|
+
const ids = normalizeDirectionIds(
|
|
11799
|
+
direction[spec.key],
|
|
11800
|
+
spec.maxPicks
|
|
11801
|
+
);
|
|
11802
|
+
if (ids.length === 0) continue;
|
|
11803
|
+
for (const hint of spec.render(ids, modeForFamily(mode, spec.family))) {
|
|
11804
|
+
if (hint.length > 0 && !seen.has(hint)) {
|
|
11805
|
+
seen.add(hint);
|
|
11806
|
+
out.push(hint);
|
|
11807
|
+
}
|
|
11808
|
+
}
|
|
11809
|
+
}
|
|
11810
|
+
return out;
|
|
11811
|
+
}
|
|
11812
|
+
|
|
11813
|
+
// src/prompt-hint-join.ts
|
|
11814
|
+
var PROMPT_HINT_SEPARATOR = ". ";
|
|
11815
|
+
function joinPromptHints(userPrompt, hints) {
|
|
11816
|
+
if (hints.length === 0) return userPrompt;
|
|
11817
|
+
return [userPrompt.trim(), ...hints].filter((p) => p.length > 0).join(PROMPT_HINT_SEPARATOR);
|
|
11818
|
+
}
|
|
11819
|
+
|
|
11820
|
+
// src/ref-binding.ts
|
|
11601
11821
|
function identityRefsSentence(firstOrdinal, lastOrdinal) {
|
|
11602
11822
|
return firstOrdinal === lastOrdinal ? `${REF_BINDING.ordinal(firstOrdinal)} is an identity reference for this shot's subjects \u2014 match its subject's exact appearance; it is not a frame.` : `${REF_BINDING.ordinal(firstOrdinal)} through ${REF_BINDING.ordinal(lastOrdinal)} are identity references for this shot's subjects \u2014 match each subject's exact appearance; they are not frames.`;
|
|
11603
11823
|
}
|
|
@@ -11609,6 +11829,38 @@ var REF_BINDING = {
|
|
|
11609
11829
|
ordinal: (n) => `@image_${n}`,
|
|
11610
11830
|
frame: (n, role) => `Use @image_${n} as the ${role} (${role === "opening" ? "first" : "last"}) frame of the video.`
|
|
11611
11831
|
};
|
|
11832
|
+
|
|
11833
|
+
// src/ref-id-tokens.ts
|
|
11834
|
+
var REF_TOKEN_LABEL_RE = /^[a-zA-Z0-9_ -]+$/;
|
|
11835
|
+
var HAS_REF_ID_TOKEN_RE = /\{ref:/i;
|
|
11836
|
+
var REF_ID_TOKEN_RE = /\{[rR][eE][fF]:([^{}]*)\}/g;
|
|
11837
|
+
var MALFORMED_REF_ID_TOKEN_RE = /\{[rR][eE][fF]:[^\s{}]*\}?/g;
|
|
11838
|
+
function splitLabel(content) {
|
|
11839
|
+
const at = content.lastIndexOf(":");
|
|
11840
|
+
if (at === -1) return { id: content };
|
|
11841
|
+
const tail = content.slice(at + 1);
|
|
11842
|
+
if (!REF_TOKEN_LABEL_RE.test(tail)) return { id: content };
|
|
11843
|
+
return { id: content.slice(0, at), label: tail };
|
|
11844
|
+
}
|
|
11845
|
+
function resolveRefIdTokens(prompt, ctx) {
|
|
11846
|
+
if (!prompt || !HAS_REF_ID_TOKEN_RE.test(prompt)) return prompt;
|
|
11847
|
+
const known = (id) => id.length > 0 && (ctx.slotById.has(id) || ctx.nameById.has(id));
|
|
11848
|
+
const bind = (id, label) => {
|
|
11849
|
+
const slot = ctx.slotById.get(id);
|
|
11850
|
+
if (slot !== void 0 && slot >= 1 && slot <= ctx.imageCount) {
|
|
11851
|
+
return label ? REF_BINDING.image(label, slot) : REF_BINDING.ordinal(slot);
|
|
11852
|
+
}
|
|
11853
|
+
return label ?? ctx.nameById.get(id) ?? "";
|
|
11854
|
+
};
|
|
11855
|
+
return prompt.replace(REF_ID_TOKEN_RE, (_match, content) => {
|
|
11856
|
+
if (known(content)) return bind(content, void 0);
|
|
11857
|
+
const { id, label } = splitLabel(content);
|
|
11858
|
+
if (known(id)) return bind(id, label);
|
|
11859
|
+
return label ?? "";
|
|
11860
|
+
}).replace(MALFORMED_REF_ID_TOKEN_RE, "");
|
|
11861
|
+
}
|
|
11862
|
+
|
|
11863
|
+
// src/video-reference-resolver.ts
|
|
11612
11864
|
var REFERENCE_TOKEN_RE = /\{(image|video|audio):(\d+)(?::([a-zA-Z0-9_ -]+))?\}/gi;
|
|
11613
11865
|
function resolveReferenceTokens(prompt, counts) {
|
|
11614
11866
|
if (!prompt) return prompt;
|
|
@@ -11709,12 +11961,27 @@ function resolveVideoReferenceCore(args) {
|
|
|
11709
11961
|
});
|
|
11710
11962
|
}
|
|
11711
11963
|
const hasExtras = (args.extraRefs?.length ?? 0) > 0;
|
|
11964
|
+
const nameByRefId = /* @__PURE__ */ new Map();
|
|
11965
|
+
for (const r of args.wiredCharRefs) {
|
|
11966
|
+
if (r.id && !nameByRefId.has(r.id)) nameByRefId.set(r.id, r.defaultName || r.characterSlug || "");
|
|
11967
|
+
}
|
|
11968
|
+
for (const ex of args.extraRefs ?? []) {
|
|
11969
|
+
if (ex.id && !nameByRefId.has(ex.id)) nameByRefId.set(ex.id, "");
|
|
11970
|
+
}
|
|
11971
|
+
for (const [id, name] of args.refNamesById ?? []) {
|
|
11972
|
+
if (id) nameByRefId.set(id, name);
|
|
11973
|
+
}
|
|
11974
|
+
const slotByRefId = /* @__PURE__ */ new Map();
|
|
11712
11975
|
if (wiredCharRefs.length === 0 && !hasExtras) {
|
|
11976
|
+
const counts = tokenCounts(leadingRefUrls.length);
|
|
11713
11977
|
return {
|
|
11714
11978
|
// tokenCounts(leadingRefUrls.length) → image count == offset (no assets here):
|
|
11715
11979
|
// leadingRefUrls mode counts the leading refs; ordinalOffset mode counts the
|
|
11716
11980
|
// caller-owned leading refs the offset stands in for.
|
|
11717
|
-
prompt: resolveReferenceTokens(
|
|
11981
|
+
prompt: resolveReferenceTokens(
|
|
11982
|
+
resolveRefIdTokens(args.prompt, { slotById: slotByRefId, nameById: nameByRefId, imageCount: counts.image }),
|
|
11983
|
+
counts
|
|
11984
|
+
),
|
|
11718
11985
|
additionalUrls: [...leadingRefUrls]
|
|
11719
11986
|
};
|
|
11720
11987
|
}
|
|
@@ -11747,9 +12014,13 @@ function resolveVideoReferenceCore(args) {
|
|
|
11747
12014
|
let position = offset;
|
|
11748
12015
|
for (let i = 0; i < resolved.additionalUrls.length; i++) {
|
|
11749
12016
|
position += 1;
|
|
11750
|
-
const
|
|
12017
|
+
const url2 = resolved.additionalUrls[i];
|
|
12018
|
+
const ref = wiredCharRefs.find((r) => r.url === url2);
|
|
11751
12019
|
const slug = ref?.characterSlug;
|
|
11752
12020
|
if (slug && !positionsByChar.has(slug)) positionsByChar.set(slug, position);
|
|
12021
|
+
for (const r of wiredCharRefs) {
|
|
12022
|
+
if (r.url === url2 && r.id && !slotByRefId.has(r.id)) slotByRefId.set(r.id, position);
|
|
12023
|
+
}
|
|
11753
12024
|
}
|
|
11754
12025
|
for (const r of wiredCharRefs) {
|
|
11755
12026
|
if (r.source !== "wired-character") continue;
|
|
@@ -11762,6 +12033,7 @@ function resolveVideoReferenceCore(args) {
|
|
|
11762
12033
|
fallbackUrls.push(r.url);
|
|
11763
12034
|
position += 1;
|
|
11764
12035
|
if (!positionsByChar.has(r.characterSlug)) positionsByChar.set(r.characterSlug, position);
|
|
12036
|
+
if (r.id && !slotByRefId.has(r.id)) slotByRefId.set(r.id, position);
|
|
11765
12037
|
if (hybrid) {
|
|
11766
12038
|
const binding = REF_BINDING.ordinal(position);
|
|
11767
12039
|
canonicalPhrases.push(roleToPhrase(resolveDefaultRole(r.defaultRole, r.defaultUsageMode, r.source), binding));
|
|
@@ -11799,6 +12071,7 @@ function resolveVideoReferenceCore(args) {
|
|
|
11799
12071
|
for (const ex of args.extraRefs) {
|
|
11800
12072
|
if (!ex.url) continue;
|
|
11801
12073
|
position += 1;
|
|
12074
|
+
if (ex.id && !slotByRefId.has(ex.id)) slotByRefId.set(ex.id, position);
|
|
11802
12075
|
const desc = (ex.description ?? "").trim();
|
|
11803
12076
|
if (ex.characterSlug) {
|
|
11804
12077
|
const meta3 = args.lookupCharacterBySlug?.(ex.characterSlug);
|
|
@@ -11945,6 +12218,11 @@ ${finalPrompt}` : block;
|
|
|
11945
12218
|
merged.push(u);
|
|
11946
12219
|
}
|
|
11947
12220
|
}
|
|
12221
|
+
finalPrompt = resolveRefIdTokens(finalPrompt, {
|
|
12222
|
+
slotById: slotByRefId,
|
|
12223
|
+
nameById: nameByRefId,
|
|
12224
|
+
imageCount: tokenCounts(merged.length).image
|
|
12225
|
+
}) ?? finalPrompt;
|
|
11948
12226
|
const referenceOrder = args.referenceOrder;
|
|
11949
12227
|
const assetUrls = merged.slice(leadingRefUrls.length);
|
|
11950
12228
|
if (referenceOrder && referenceOrder.length > 0 && assetUrls.length > 1) {
|
|
@@ -12126,15 +12404,10 @@ function assembleSunoInput(input) {
|
|
|
12126
12404
|
// src/assemble-image-input.ts
|
|
12127
12405
|
function composePromptText(userPrompt, direction, structured) {
|
|
12128
12406
|
const hints = [
|
|
12129
|
-
|
|
12130
|
-
getFramingPromptHint(direction?.framingAngleId),
|
|
12131
|
-
getLightingPromptHint(direction?.lightingId),
|
|
12132
|
-
getLensPromptHint(direction?.lensId),
|
|
12133
|
-
getCameraFormatPromptHint(direction?.cameraFormatId),
|
|
12407
|
+
...renderDirectionHints(direction, { surface: "image", mode: IMAGE_HINT_MODE_DEFAULT }),
|
|
12134
12408
|
structured ? renderStructuredFields(structured) : ""
|
|
12135
12409
|
].filter((p) => p.length > 0);
|
|
12136
|
-
|
|
12137
|
-
return [userPrompt.trim(), ...hints].filter((p) => p.length > 0).join(". ");
|
|
12410
|
+
return joinPromptHints(userPrompt, hints);
|
|
12138
12411
|
}
|
|
12139
12412
|
function assembleImageInput(input) {
|
|
12140
12413
|
const prompt = composePromptText(input.userPrompt, input.direction, input.structured);
|
|
@@ -12169,6 +12442,106 @@ function assembleImageInput(input) {
|
|
|
12169
12442
|
}
|
|
12170
12443
|
return result;
|
|
12171
12444
|
}
|
|
12445
|
+
|
|
12446
|
+
// src/assemble-video-input.ts
|
|
12447
|
+
function composeVideoPromptText(userPrompt, direction, structured, opts) {
|
|
12448
|
+
const hints = [
|
|
12449
|
+
...renderDirectionHints(direction, {
|
|
12450
|
+
surface: "video",
|
|
12451
|
+
mode: opts?.hintMode ?? VIDEO_HINT_MODE_DEFAULT
|
|
12452
|
+
}),
|
|
12453
|
+
structured ? renderStructuredFields(structured) : ""
|
|
12454
|
+
].filter((p) => p.length > 0);
|
|
12455
|
+
if (hints.length === 0) return userPrompt;
|
|
12456
|
+
return joinPromptHints(userPrompt ?? "", hints);
|
|
12457
|
+
}
|
|
12458
|
+
|
|
12459
|
+
// src/read-node-direction.ts
|
|
12460
|
+
function readDirectionFields(value) {
|
|
12461
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) return void 0;
|
|
12462
|
+
const src = value;
|
|
12463
|
+
const out = {};
|
|
12464
|
+
for (const spec of DIRECTION_FIELDS) {
|
|
12465
|
+
const v = src[spec.key];
|
|
12466
|
+
if (typeof v === "string") {
|
|
12467
|
+
if (v.length > 0 && v.length <= DIRECTION_ID_MAX_CHARS) out[spec.key] = v;
|
|
12468
|
+
} else if (Array.isArray(v)) {
|
|
12469
|
+
const kept = [];
|
|
12470
|
+
for (const x of v) {
|
|
12471
|
+
if (kept.length >= DIRECTION_ARRAY_CEILING) break;
|
|
12472
|
+
if (typeof x === "string" && x.length > 0 && x.length <= DIRECTION_ID_MAX_CHARS) {
|
|
12473
|
+
kept.push(x);
|
|
12474
|
+
}
|
|
12475
|
+
}
|
|
12476
|
+
if (kept.length > 0) out[spec.key] = kept;
|
|
12477
|
+
}
|
|
12478
|
+
}
|
|
12479
|
+
return Object.keys(out).length > 0 ? out : void 0;
|
|
12480
|
+
}
|
|
12481
|
+
var GENDERS = ["man", "woman", "child", "non-binary"];
|
|
12482
|
+
var MAX_STRUCTURED_VALUE_CHARS = 200;
|
|
12483
|
+
var PERSON_FIELDS2 = {
|
|
12484
|
+
age: "number",
|
|
12485
|
+
gender: "gender",
|
|
12486
|
+
hair: "string",
|
|
12487
|
+
eyes: "string",
|
|
12488
|
+
expression: "string",
|
|
12489
|
+
profession: "string",
|
|
12490
|
+
warriorType: "string"
|
|
12491
|
+
};
|
|
12492
|
+
var STYLING_FIELDS2 = {
|
|
12493
|
+
mood: "string",
|
|
12494
|
+
lighting: "string",
|
|
12495
|
+
aesthetic: "string",
|
|
12496
|
+
colorLook: "string"
|
|
12497
|
+
};
|
|
12498
|
+
var SETTING_FIELDS = {
|
|
12499
|
+
era: "string",
|
|
12500
|
+
atmosphere: "string",
|
|
12501
|
+
backdrop: "string"
|
|
12502
|
+
};
|
|
12503
|
+
var CAMERA_FIELDS = {
|
|
12504
|
+
framing: "string",
|
|
12505
|
+
motion: "string",
|
|
12506
|
+
format: "string"
|
|
12507
|
+
};
|
|
12508
|
+
var LENS_FIELDS = { focalLength: "string", aperture: "string" };
|
|
12509
|
+
var STRUCTURED_GROUPS = {
|
|
12510
|
+
person: PERSON_FIELDS2,
|
|
12511
|
+
styling: STYLING_FIELDS2,
|
|
12512
|
+
setting: SETTING_FIELDS,
|
|
12513
|
+
camera: CAMERA_FIELDS,
|
|
12514
|
+
lens: LENS_FIELDS
|
|
12515
|
+
};
|
|
12516
|
+
function readField(v, kind) {
|
|
12517
|
+
if (kind === "number") return typeof v === "number" && Number.isFinite(v) ? v : void 0;
|
|
12518
|
+
if (typeof v !== "string" || v.length === 0 || v.length > MAX_STRUCTURED_VALUE_CHARS) {
|
|
12519
|
+
return void 0;
|
|
12520
|
+
}
|
|
12521
|
+
if (kind === "gender") return GENDERS.includes(v) ? v : void 0;
|
|
12522
|
+
return v;
|
|
12523
|
+
}
|
|
12524
|
+
function readStructuredFields(value) {
|
|
12525
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) return void 0;
|
|
12526
|
+
const src = value;
|
|
12527
|
+
const out = {};
|
|
12528
|
+
for (const group of Object.keys(STRUCTURED_GROUPS)) {
|
|
12529
|
+
const raw = src[group];
|
|
12530
|
+
if (typeof raw !== "object" || raw === null || Array.isArray(raw)) continue;
|
|
12531
|
+
const rawRec = raw;
|
|
12532
|
+
const kept = {};
|
|
12533
|
+
for (const [field, kind] of Object.entries(
|
|
12534
|
+
STRUCTURED_GROUPS[group]
|
|
12535
|
+
)) {
|
|
12536
|
+
const v = readField(rawRec[field], kind);
|
|
12537
|
+
if (v !== void 0) kept[field] = v;
|
|
12538
|
+
}
|
|
12539
|
+
if (Object.keys(kept).length > 0) out[group] = kept;
|
|
12540
|
+
}
|
|
12541
|
+
const mood = readField(src.mood, "string");
|
|
12542
|
+
if (mood !== void 0) out.mood = mood;
|
|
12543
|
+
return Object.keys(out).length > 0 ? out : void 0;
|
|
12544
|
+
}
|
|
12172
12545
|
var clean = (u) => {
|
|
12173
12546
|
const t = u?.trim();
|
|
12174
12547
|
return t && t.length > 0 ? t : void 0;
|
|
@@ -27331,7 +27704,7 @@ precise subject \u2192 action details \u2192 scene/environment \u2192 lighting &
|
|
|
27331
27704
|
- Transitions and camera terms on 2.5: state a transition's trigger point AND method in one sentence \u2014 "At the 5-second mark, the camera quickly transitions leftward using a left wipe combined with a natural dissolve." Basic shot and camera terms are written directly (push in / pull out / pan / track / orbit / dolly zoom / whip pan / hard cut / dissolve / one-shot / speed ramp); only niche terms need [term + descriptive explanation] \u2014 which is exactly what the pickers' compact hint mode emits versus their long hints.
|
|
27332
27705
|
|
|
27333
27706
|
**References (when reference media is attached)**
|
|
27334
|
-
- Refer to assets by ordinal in attachment order: "@Image 1", "Video 2", "Audio 1". Asset ORDER is priority \u2014 put the most identity-critical asset first. (In the editor, the \`{image:N:label}\` / \`{video:N}\` / \`{audio:N}\` prompt tokens auto-emit this binding \u2014 \`{image:1:person}\` resolves to "the person from @image_1" \u2014 so a wired reference and its mention stay in sync.)
|
|
27707
|
+
- Refer to assets by ordinal in attachment order: "@Image 1", "Video 2", "Audio 1". Asset ORDER is priority \u2014 put the most identity-critical asset first. (In the editor, the \`{image:N:label}\` / \`{video:N}\` / \`{audio:N}\` prompt tokens auto-emit this binding \u2014 \`{image:1:person}\` resolves to "the person from @image_1" \u2014 so a wired reference and its mention stay in sync. An API caller that passes \`connectedReferences\` can instead name a reference by its own id \u2014 \`{ref:<id>}\` / \`{ref:<id>:label}\` \u2014 and the platform substitutes the \`@image_N\` seat after it has numbered the references, so the client never computes N; a token whose reference was not attached drops to its label or name.)
|
|
27335
27708
|
- Define each subject once, then reuse the label consistently: 'Define the woman in the red dress in Image 1 as the courier' \u2026 'the courier opens the door'. In multi-character scenes bind every character to its image ("the man from Image 1 hands the box to the woman from Image 2") and append: "do not generate duplicate copies of the same character".
|
|
27336
27709
|
- Character identity: ONE close-up headshot + ONE full-body image is ideal. On the 2.0 SKUs do NOT attach multi-view/three-view character sheets \u2014 the model reads the views as separate people, causing identity drift and twin duplicates; 2.5 accepts multi-view images (see "Generation differences").
|
|
27337
27710
|
- 4-5 assets total works best (1-2 character images + 1 scene image + 1 camera-movement video + 1 audio clip). Maxing out the 9-image/3-video/3-audio limits degrades feature priority and adherence.
|
|
@@ -27433,7 +27806,7 @@ precise subject \u2192 action details \u2192 scene/environment \u2192 lighting &
|
|
|
27433
27806
|
- Nothing visual connected \u2192 text-to-video. A concrete aspect ratio is required (21:9 / 16:9 / 4:3 / 1:1 / 3:4 / 9:16 \u2014 no adaptive); Nodaro renders 16:9 unless one is picked.
|
|
27434
27807
|
|
|
27435
27808
|
**References (when reference media is attached)**
|
|
27436
|
-
- Refer to assets by ordinal in attachment order: "@Image 1", "Video 1", "Audio 1". Put the identity-critical asset first. (In the editor, the \`{image:N:label}\` / \`{video:N}\` / \`{audio:N}\` prompt tokens auto-emit this binding, so a wired reference and its mention stay in sync.)
|
|
27809
|
+
- Refer to assets by ordinal in attachment order: "@Image 1", "Video 1", "Audio 1". Put the identity-critical asset first. (In the editor, the \`{image:N:label}\` / \`{video:N}\` / \`{audio:N}\` prompt tokens auto-emit this binding, so a wired reference and its mention stay in sync. An API caller that passes \`connectedReferences\` can instead write \`{ref:<id>}\` / \`{ref:<id>:label}\` with the reference's own id \u2014 the platform substitutes the \`@image_N\` seat after numbering.)
|
|
27437
27810
|
- Caps: 9 reference images; 3 reference videos, each 2-15s and \u226415s combined; 3 reference audio clips, \u226415s combined. Reference audio cannot be used alone \u2014 it must accompany an image or video reference.
|
|
27438
27811
|
- Define each subject once, then reuse the label consistently ("the woman from @Image 1 \u2026 the woman opens the door"). A focused set of 4-5 assets beats maxing every cap.
|
|
27439
27812
|
- Billing note: generated seconds AND reference-video input seconds bill at the same per-second rate; the first 5 input images are free and each extra image adds a small surcharge; audio input is free.
|
|
@@ -33185,8 +33558,8 @@ var SINGLE_PICKER_WIRING = [
|
|
|
33185
33558
|
{ kind: "single", nodeType: "furniture", label: "Furniture", valueField: "furniture", defaultValue: "sofa", catalogId: "furniture", entries: mapCat(FURNITURE, "subcategory"), groupOrder: FURNITURE_SUBCATEGORY_ORDER, groupLabels: FURNITURE_SUBCATEGORY_LABELS },
|
|
33186
33559
|
{ kind: "single", nodeType: "held-prop", label: "Held Prop", valueField: "heldProp", defaultValue: "smartphone", catalogId: "held-prop", entries: mapCat(HELD_PROPS, "category"), groupOrder: HELD_PROP_CATEGORY_ORDER, groupLabels: HELD_PROP_CATEGORY_LABELS }
|
|
33187
33560
|
];
|
|
33188
|
-
var
|
|
33189
|
-
var
|
|
33561
|
+
var STYLING_FIELDS3 = STYLING_DIMENSION_ORDER.map((d) => STYLING_FIELD_BY_DIMENSION[d]);
|
|
33562
|
+
var PERSON_FIELDS3 = PERSON_DIMENSION_ORDER.map((d) => PERSON_FIELD_BY_DIMENSION[d]);
|
|
33190
33563
|
var LIGHTING_FIELDS2 = LIGHTING_CATEGORY_ORDER.map((c) => LIGHTING_FIELD_BY_CATEGORY[c]);
|
|
33191
33564
|
var TEMPORAL_FIELD_BY_CATEGORY2 = {
|
|
33192
33565
|
speed: "temporalSpeed",
|
|
@@ -33222,7 +33595,7 @@ var MULTI_PICKER_WIRING = [
|
|
|
33222
33595
|
kind: "multi",
|
|
33223
33596
|
nodeType: "person",
|
|
33224
33597
|
label: "Person",
|
|
33225
|
-
fields:
|
|
33598
|
+
fields: PERSON_FIELDS3,
|
|
33226
33599
|
catalogId: "person",
|
|
33227
33600
|
catalogEntries: flatCat(PEOPLE),
|
|
33228
33601
|
fieldOptions: optionsByDiscriminator(PEOPLE, (e) => e.dimension, PERSON_FIELD_BY_DIMENSION)
|
|
@@ -33231,7 +33604,7 @@ var MULTI_PICKER_WIRING = [
|
|
|
33231
33604
|
kind: "multi",
|
|
33232
33605
|
nodeType: "styling",
|
|
33233
33606
|
label: "Styling",
|
|
33234
|
-
fields:
|
|
33607
|
+
fields: STYLING_FIELDS3,
|
|
33235
33608
|
catalogId: "styling",
|
|
33236
33609
|
catalogEntries: flatCat(STYLINGS),
|
|
33237
33610
|
fieldOptions: optionsByDiscriminator(STYLINGS, (e) => e.dimension, STYLING_FIELD_BY_DIMENSION)
|
|
@@ -33369,6 +33742,6 @@ function buildSurroundFillPrompt(direction, userPrompt) {
|
|
|
33369
33742
|
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.`;
|
|
33370
33743
|
}
|
|
33371
33744
|
|
|
33372
|
-
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_IDS, 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, 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_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, 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, 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, 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_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, 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, computeLlmChatFields, computeNodePrompt, computePackSidecarCoverage, deriveTerm, 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, 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, joinPromptParts, listPickerCatalogs, migratePersonValue, nodeHasInlinePrompt, nodeHasPromptField, nodeSupportsPromptAffixes, personPacksVersion, pickerFanoutTargets, projectAllCatalogs, projectPickerCatalog, promptAffixCoreField, promptBindsFirstFrame, promptFieldCarriesAffixes, promptPartSeparator, referenceRulesBlock, registerCatalogPack, registerPersonPack, renderStructuredFields, resetCatalogPacks, resetPersonPacks, resolveBrandInput, resolveCharacterMentions, resolveGeminiOmniI2vInputs, resolveLocationMentions, resolvePrompt, resolveReferenceTokens, resolveSeedance2Inputs, resolveTemplate, resolveTerm, resolveVeoI2vInputs, resolveVideoReferenceCore, summarizePickerCatalogs, toIdentityLockMode, truncateForField, truncateText, withForcedIdentityLock };
|
|
33745
|
+
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, 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, 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, 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, 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, listPickerCatalogs, migratePersonValue, modeForFamily, nodeHasInlinePrompt, nodeHasPromptField, nodeSupportsPromptAffixes, personPacksVersion, pickerFanoutTargets, projectAllCatalogs, projectPickerCatalog, promptAffixCoreField, promptBindsFirstFrame, promptFieldCarriesAffixes, promptPartSeparator, readDirectionFields, readStructuredFields, referenceRulesBlock, registerCatalogPack, registerPersonPack, renderDirectionHints, renderStructuredFields, resetCatalogPacks, resetPersonPacks, resolveBrandInput, resolveCharacterMentions, resolveGeminiOmniI2vInputs, resolveLocationMentions, resolvePrompt, resolveRefIdTokens, resolveReferenceTokens, resolveSeedance2Inputs, resolveTemplate, resolveTerm, resolveVeoI2vInputs, resolveVideoReferenceCore, summarizePickerCatalogs, toIdentityLockMode, truncateForField, truncateText, withForcedIdentityLock };
|
|
33373
33746
|
//# sourceMappingURL=index.js.map
|
|
33374
33747
|
//# sourceMappingURL=index.js.map
|