@nodaro/prompts 1.7.3 → 1.8.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.cjs +5443 -4295
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1202 -61
- package/dist/index.d.ts +1202 -61
- package/dist/index.js +5357 -4297
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/src/__tests__/b7-person-pack-e2e.test.ts +37 -0
- package/src/__tests__/catalog-funnel-ratchet.test.ts +97 -0
- package/src/__tests__/catalog-packs.test.ts +130 -0
- package/src/__tests__/catalog-sidecar-coverage.test.ts +27 -0
- package/src/__tests__/catalog-terms.test.ts +162 -0
- package/src/__tests__/character-default-role.test.ts +3 -2
- package/src/__tests__/content-free-contract.test.ts +45 -0
- package/src/__tests__/dod-replace-pack-acceptance.test.ts +41 -0
- package/src/__tests__/fixtures/parameter-hint-golden.json +2959 -0
- package/src/__tests__/fixtures/person-sector-pack.ts +27 -0
- package/src/__tests__/i18n-entry-completeness.test.ts +5 -2
- package/src/__tests__/parameter-hint-mode.test.ts +385 -0
- package/src/__tests__/parameter-prompt-hint-pack-fallback.test.ts +25 -0
- package/src/__tests__/person-packs.test.ts +166 -0
- package/src/__tests__/project-all-catalogs.test.ts +26 -0
- package/src/__tests__/prompt-builder.test.ts +53 -0
- package/src/__tests__/provider-prompt-doctrine.test.ts +18 -0
- package/src/__tests__/registered-catalogs-funnel.test.ts +30 -0
- package/src/__tests__/registered-catalogs-guard.test.ts +11 -0
- package/src/__tests__/term.test.ts +104 -0
- package/src/__tests__/transitions.test.ts +8 -5
- package/src/__tests__/upstream-immutability.test.ts +23 -0
- package/src/action-fx.ts +67 -17
- package/src/aesthetic.ts +54 -6
- package/src/atmosphere.ts +64 -23
- package/src/backdrop.ts +44 -30
- package/src/camera-format.ts +33 -11
- package/src/camera-motions.ts +89 -0
- package/src/catalog-packs.ts +125 -0
- package/src/catalog-sidecar-coverage.ts +36 -0
- package/src/character-fx.ts +112 -39
- package/src/color-look.ts +44 -27
- package/src/composition-effects.ts +21 -7
- package/src/era.ts +24 -0
- package/src/exposure-settings.ts +76 -18
- package/src/framing.ts +102 -10
- package/src/held-prop.ts +125 -63
- package/src/identity-lock.ts +12 -5
- package/src/image-reference-doctrine.ts +55 -0
- package/src/index.ts +5 -0
- package/src/instrumentation.ts +148 -57
- package/src/lens.ts +31 -15
- package/src/lighting.ts +120 -59
- package/src/loop-subject.ts +27 -1
- package/src/materials.ts +123 -69
- package/src/mood.ts +123 -51
- package/src/music-genre.ts +171 -67
- package/src/music-mood.ts +85 -17
- package/src/parameter-prompt-hint.ts +168 -56
- package/src/person-packs.ts +182 -0
- package/src/person.ts +506 -408
- package/src/photo-genre.ts +37 -22
- package/src/photographer.ts +138 -1
- package/src/picker-catalogs.ts +86 -40
- package/src/pose.ts +105 -40
- package/src/post-process-effects.ts +51 -8
- package/src/prompt-builder.ts +16 -1
- package/src/provider-prompt-doctrine.ts +12 -5
- package/src/render-quality.ts +25 -7
- package/src/setting.ts +30 -14
- package/src/style.ts +33 -15
- package/src/styling.ts +155 -94
- package/src/temporal.ts +80 -18
- package/src/term.ts +155 -0
- package/src/transitions.ts +73 -26
- package/src/voice-character.ts +190 -90
- package/src/voice-delivery.ts +83 -12
package/src/held-prop.ts
CHANGED
|
@@ -22,6 +22,8 @@
|
|
|
22
22
|
* and the backend orchestrator.
|
|
23
23
|
*/
|
|
24
24
|
|
|
25
|
+
import { resolveTerm, type PickerHintMode } from "./term.js"
|
|
26
|
+
|
|
25
27
|
export type HeldPropCategory =
|
|
26
28
|
| "device"
|
|
27
29
|
| "drink"
|
|
@@ -39,85 +41,100 @@ export interface HeldProp {
|
|
|
39
41
|
readonly category: HeldPropCategory
|
|
40
42
|
readonly description: string
|
|
41
43
|
readonly promptHint: string
|
|
44
|
+
/**
|
|
45
|
+
* Compact professional term for hint-compact mode (see `term.ts`). Authored
|
|
46
|
+
* on EVERY entry, and always with the held-in-hand VERB the catalog exists
|
|
47
|
+
* to encode ("holding a lit cigarette", "cradling a cat", "carrying a
|
|
48
|
+
* hard-shell briefcase"): the bare prop noun would say only that the object
|
|
49
|
+
* is somewhere in the scene, which is exactly the Object-node meaning this
|
|
50
|
+
* catalog is distinct from. Beyond the verb, each term also carries the
|
|
51
|
+
* qualifier the label drops where the bare noun would inject the wrong prop
|
|
52
|
+
* — homonym traps ("Lighter", "Joint", "Compass", "Marker", "Apple"), a
|
|
53
|
+
* trade meaning that collides with a sibling ("Cocktail Glass" is the
|
|
54
|
+
* conical glass in the trade; this entry is a rocks glass), and the state
|
|
55
|
+
* that decides what actually RENDERS ("Umbrella" -> open black umbrella,
|
|
56
|
+
* "Book" -> open hardback book).
|
|
57
|
+
*/
|
|
58
|
+
readonly term?: string
|
|
42
59
|
}
|
|
43
60
|
|
|
44
61
|
export const HELD_PROPS: ReadonlyArray<HeldProp> = [
|
|
45
62
|
// -------------------- Devices / Phones --------------------
|
|
46
|
-
{ id: "smartphone", label: "Smartphone", category: "device", description: "Modern phone in hand", promptHint: "holding a modern smartphone in one hand, screen lightly catching the ambient light, fingers wrapped naturally around the device" },
|
|
47
|
-
{ id: "smartphone-raised", label: "Phone Raised", category: "device", description: "Phone raised mid-photo", promptHint: "holding a smartphone raised at arm's length toward the camera as if mid-photo, both the phone and the gesture clearly visible" },
|
|
48
|
-
{ id: "polaroid-camera", label: "Polaroid Camera", category: "device", description: "Vintage instant camera", promptHint: "cradling a vintage Polaroid instant camera in both hands at chest height, the boxy white body and rainbow stripe clearly visible" },
|
|
49
|
-
{ id: "vintage-camera", label: "Vintage Camera", category: "device", description: "Old film camera with strap", promptHint: "holding a vintage 35mm film camera lifted toward the face with a leather strap looped around the neck, fingers poised over the shutter" },
|
|
50
|
-
{ id: "dslr-camera", label: "DSLR Camera", category: "device", description: "Modern DSLR / mirrorless camera", promptHint: "holding a modern DSLR camera up to the eye with both hands wrapped around the body and lens, mid-composition" },
|
|
51
|
-
{ id: "video-camera", label: "Video Camera", category: "device", description: "Shoulder-mounted video camera", promptHint: "shouldering a professional video camera with one hand on the side grip and the other steadying the body, eye to the viewfinder" },
|
|
52
|
-
{ id: "microphone", label: "Microphone", category: "device", description: "Handheld vocal microphone", promptHint: "gripping a handheld microphone close to the lips with one hand, the cable looping down from the bottom" },
|
|
53
|
-
{ id: "megaphone", label: "Megaphone", category: "device", description: "Bullhorn / megaphone", promptHint: "holding a bullhorn megaphone raised toward the mouth with the trigger pressed, the wide cone aimed forward" },
|
|
54
|
-
{ id: "smartwatch", label: "Smartwatch", category: "device", description: "Wrist raised to check watch", promptHint: "raising one wrist into frame with a sleek smartwatch face glowing on it, the other hand lightly steadying the band" },
|
|
63
|
+
{ id: "smartphone", label: "Smartphone", category: "device", description: "Modern phone in hand", promptHint: "holding a modern smartphone in one hand, screen lightly catching the ambient light, fingers wrapped naturally around the device", term: "holding a smartphone" },
|
|
64
|
+
{ id: "smartphone-raised", label: "Phone Raised", category: "device", description: "Phone raised mid-photo", promptHint: "holding a smartphone raised at arm's length toward the camera as if mid-photo, both the phone and the gesture clearly visible", term: "holding a smartphone raised at arm's length" },
|
|
65
|
+
{ id: "polaroid-camera", label: "Polaroid Camera", category: "device", description: "Vintage instant camera", promptHint: "cradling a vintage Polaroid instant camera in both hands at chest height, the boxy white body and rainbow stripe clearly visible", term: "cradling a vintage polaroid instant camera" },
|
|
66
|
+
{ id: "vintage-camera", label: "Vintage Camera", category: "device", description: "Old film camera with strap", promptHint: "holding a vintage 35mm film camera lifted toward the face with a leather strap looped around the neck, fingers poised over the shutter", term: "holding a vintage 35mm film camera" },
|
|
67
|
+
{ id: "dslr-camera", label: "DSLR Camera", category: "device", description: "Modern DSLR / mirrorless camera", promptHint: "holding a modern DSLR camera up to the eye with both hands wrapped around the body and lens, mid-composition", term: "holding a dslr camera to the eye" },
|
|
68
|
+
{ id: "video-camera", label: "Video Camera", category: "device", description: "Shoulder-mounted video camera", promptHint: "shouldering a professional video camera with one hand on the side grip and the other steadying the body, eye to the viewfinder", term: "shouldering a video camera" },
|
|
69
|
+
{ id: "microphone", label: "Microphone", category: "device", description: "Handheld vocal microphone", promptHint: "gripping a handheld microphone close to the lips with one hand, the cable looping down from the bottom", term: "gripping a handheld microphone" },
|
|
70
|
+
{ id: "megaphone", label: "Megaphone", category: "device", description: "Bullhorn / megaphone", promptHint: "holding a bullhorn megaphone raised toward the mouth with the trigger pressed, the wide cone aimed forward", term: "holding a raised megaphone" },
|
|
71
|
+
{ id: "smartwatch", label: "Smartwatch", category: "device", description: "Wrist raised to check watch", promptHint: "raising one wrist into frame with a sleek smartwatch face glowing on it, the other hand lightly steadying the band", term: "raising a wrist to check a smartwatch" },
|
|
55
72
|
|
|
56
73
|
// -------------------- Drinks --------------------
|
|
57
|
-
{ id: "coffee-cup", label: "Coffee Cup", category: "drink", description: "Ceramic coffee cup", promptHint: "cradling a warm ceramic coffee cup in both hands at chest height, soft steam rising from the rim" },
|
|
58
|
-
{ id: "takeaway-coffee", label: "Takeaway Coffee", category: "drink", description: "Paper takeaway coffee cup", promptHint: "holding a paper takeaway coffee cup with a sleeve and lid in one hand, steam drifting from the small opening" },
|
|
59
|
-
{ id: "wine-glass", label: "Wine Glass", category: "drink", description: "Stemmed glass of red wine", promptHint: "holding a stemmed wine glass by the bowl, deep red wine catching the warm ambient light" },
|
|
60
|
-
{ id: "champagne-flute", label: "Champagne Flute", category: "drink", description: "Tall champagne flute", promptHint: "holding a tall champagne flute by the stem, bubbles rising in the pale gold liquid" },
|
|
61
|
-
{ id: "martini-glass", label: "Martini Glass", category: "drink", description: "Classic martini glass", promptHint: "holding a classic conical martini glass by the stem at chest height, a single olive on a pick resting in the clear liquor" },
|
|
62
|
-
{ id: "cocktail-glass", label: "Cocktail Glass", category: "drink", description: "Short glass with cocktail", promptHint: "holding a short rocks glass with an amber cocktail and a single ice sphere, two fingers pressed against the chilled side" },
|
|
63
|
-
{ id: "beer-bottle", label: "Beer Bottle", category: "drink", description: "Brown bottle of beer", promptHint: "holding a brown glass beer bottle loosely by the neck, condensation beading on the surface" },
|
|
64
|
-
{ id: "water-bottle", label: "Water Bottle", category: "drink", description: "Reusable water bottle", promptHint: "holding a tall reusable water bottle in one hand at hip height, condensation beading on its sides" },
|
|
74
|
+
{ id: "coffee-cup", label: "Coffee Cup", category: "drink", description: "Ceramic coffee cup", promptHint: "cradling a warm ceramic coffee cup in both hands at chest height, soft steam rising from the rim", term: "cradling a ceramic coffee cup" },
|
|
75
|
+
{ id: "takeaway-coffee", label: "Takeaway Coffee", category: "drink", description: "Paper takeaway coffee cup", promptHint: "holding a paper takeaway coffee cup with a sleeve and lid in one hand, steam drifting from the small opening", term: "holding a paper takeaway coffee cup" },
|
|
76
|
+
{ id: "wine-glass", label: "Wine Glass", category: "drink", description: "Stemmed glass of red wine", promptHint: "holding a stemmed wine glass by the bowl, deep red wine catching the warm ambient light", term: "holding a stemmed glass of red wine" },
|
|
77
|
+
{ id: "champagne-flute", label: "Champagne Flute", category: "drink", description: "Tall champagne flute", promptHint: "holding a tall champagne flute by the stem, bubbles rising in the pale gold liquid", term: "holding a champagne flute by the stem" },
|
|
78
|
+
{ id: "martini-glass", label: "Martini Glass", category: "drink", description: "Classic martini glass", promptHint: "holding a classic conical martini glass by the stem at chest height, a single olive on a pick resting in the clear liquor", term: "holding a classic martini glass" },
|
|
79
|
+
{ id: "cocktail-glass", label: "Cocktail Glass", category: "drink", description: "Short glass with cocktail", promptHint: "holding a short rocks glass with an amber cocktail and a single ice sphere, two fingers pressed against the chilled side", term: "holding a rocks glass with an amber cocktail" },
|
|
80
|
+
{ id: "beer-bottle", label: "Beer Bottle", category: "drink", description: "Brown bottle of beer", promptHint: "holding a brown glass beer bottle loosely by the neck, condensation beading on the surface", term: "holding a brown glass beer bottle" },
|
|
81
|
+
{ id: "water-bottle", label: "Water Bottle", category: "drink", description: "Reusable water bottle", promptHint: "holding a tall reusable water bottle in one hand at hip height, condensation beading on its sides", term: "holding a reusable water bottle" },
|
|
65
82
|
|
|
66
83
|
// -------------------- Smoking --------------------
|
|
67
|
-
{ id: "cigarette", label: "Cigarette", category: "smoking", description: "Lit cigarette between fingers", promptHint: "holding a lit cigarette pinched between two fingers raised near the face, a thin curl of smoke drifting upward" },
|
|
68
|
-
{ id: "cigar", label: "Cigar", category: "smoking", description: "Thick lit cigar", promptHint: "holding a thick lit cigar between two fingers, a slow wisp of smoke rising and an ember glowing at the tip" },
|
|
69
|
-
{ id: "vape-pen", label: "Vape Pen", category: "smoking", description: "Slim vape pen", promptHint: "holding a slim vape pen between two fingers, a soft puff of vapor curling out from a half-parted mouth" },
|
|
70
|
-
{ id: "joint", label: "Joint", category: "smoking", description: "Hand-rolled joint", promptHint: "holding a hand-rolled joint pinched between thumb and forefinger, a thin trail of smoke rising into the frame" },
|
|
71
|
-
{ id: "lighter", label: "Lighter", category: "smoking", description: "Chrome lighter with thumb on flame", promptHint: "holding a polished chrome lighter cupped in one hand with the thumb pressed on the wheel, a small warm flame catching across the fingers" },
|
|
84
|
+
{ id: "cigarette", label: "Cigarette", category: "smoking", description: "Lit cigarette between fingers", promptHint: "holding a lit cigarette pinched between two fingers raised near the face, a thin curl of smoke drifting upward", term: "holding a lit cigarette" },
|
|
85
|
+
{ id: "cigar", label: "Cigar", category: "smoking", description: "Thick lit cigar", promptHint: "holding a thick lit cigar between two fingers, a slow wisp of smoke rising and an ember glowing at the tip", term: "holding a lit cigar" },
|
|
86
|
+
{ id: "vape-pen", label: "Vape Pen", category: "smoking", description: "Slim vape pen", promptHint: "holding a slim vape pen between two fingers, a soft puff of vapor curling out from a half-parted mouth", term: "holding a slim vape pen" },
|
|
87
|
+
{ id: "joint", label: "Joint", category: "smoking", description: "Hand-rolled joint", promptHint: "holding a hand-rolled joint pinched between thumb and forefinger, a thin trail of smoke rising into the frame", term: "holding a hand-rolled joint" },
|
|
88
|
+
{ id: "lighter", label: "Lighter", category: "smoking", description: "Chrome lighter with thumb on flame", promptHint: "holding a polished chrome lighter cupped in one hand with the thumb pressed on the wheel, a small warm flame catching across the fingers", term: "holding a lit chrome lighter" },
|
|
72
89
|
|
|
73
90
|
// -------------------- Reading / Writing --------------------
|
|
74
|
-
{ id: "book", label: "Book", category: "reading-writing", description: "Open hardback book", promptHint: "holding an open hardback book in both hands at chest height, eyes drifting down toward the page" },
|
|
75
|
-
{ id: "magazine", label: "Magazine", category: "reading-writing", description: "Glossy folded magazine", promptHint: "holding a glossy magazine folded back on itself in one hand, the cover partly visible from the side" },
|
|
76
|
-
{ id: "newspaper", label: "Newspaper", category: "reading-writing", description: "Folded broadsheet newspaper", promptHint: "holding a folded broadsheet newspaper open between both hands at chest height, masthead lightly visible" },
|
|
77
|
-
{ id: "notebook", label: "Notebook", category: "reading-writing", description: "Open lined notebook", promptHint: "holding an open lined notebook in one hand at chest height with a pen poised above the page in the other" },
|
|
78
|
-
{ id: "pen", label: "Pen", category: "reading-writing", description: "Pen poised mid-write", promptHint: "holding a slender pen between thumb and fingers, the tip poised over an unseen surface as if mid-thought" },
|
|
79
|
-
{ id: "marker", label: "Marker", category: "reading-writing", description: "Thick marker mid-stroke", promptHint: "holding a thick permanent marker in one hand, cap clenched in the teeth and the tip poised mid-stroke" },
|
|
80
|
-
{ id: "paintbrush", label: "Paintbrush", category: "reading-writing", description: "Loaded paintbrush", promptHint: "holding a loaded paintbrush between thumb and fingers, bristles glistening with wet color and the wrist softly turned" },
|
|
81
|
-
{ id: "chalk", label: "Chalk", category: "reading-writing", description: "White stick of chalk", promptHint: "holding a short stick of white chalk between thumb and forefinger, faint chalk dust drifting from the tip as if mid-stroke" },
|
|
91
|
+
{ id: "book", label: "Book", category: "reading-writing", description: "Open hardback book", promptHint: "holding an open hardback book in both hands at chest height, eyes drifting down toward the page", term: "holding an open hardback book" },
|
|
92
|
+
{ id: "magazine", label: "Magazine", category: "reading-writing", description: "Glossy folded magazine", promptHint: "holding a glossy magazine folded back on itself in one hand, the cover partly visible from the side", term: "holding a folded glossy magazine" },
|
|
93
|
+
{ id: "newspaper", label: "Newspaper", category: "reading-writing", description: "Folded broadsheet newspaper", promptHint: "holding a folded broadsheet newspaper open between both hands at chest height, masthead lightly visible", term: "holding a folded broadsheet newspaper" },
|
|
94
|
+
{ id: "notebook", label: "Notebook", category: "reading-writing", description: "Open lined notebook", promptHint: "holding an open lined notebook in one hand at chest height with a pen poised above the page in the other", term: "holding an open lined notebook" },
|
|
95
|
+
{ id: "pen", label: "Pen", category: "reading-writing", description: "Pen poised mid-write", promptHint: "holding a slender pen between thumb and fingers, the tip poised over an unseen surface as if mid-thought", term: "holding a pen poised mid-write" },
|
|
96
|
+
{ id: "marker", label: "Marker", category: "reading-writing", description: "Thick marker mid-stroke", promptHint: "holding a thick permanent marker in one hand, cap clenched in the teeth and the tip poised mid-stroke", term: "holding a thick permanent marker" },
|
|
97
|
+
{ id: "paintbrush", label: "Paintbrush", category: "reading-writing", description: "Loaded paintbrush", promptHint: "holding a loaded paintbrush between thumb and fingers, bristles glistening with wet color and the wrist softly turned", term: "holding a loaded paintbrush" },
|
|
98
|
+
{ id: "chalk", label: "Chalk", category: "reading-writing", description: "White stick of chalk", promptHint: "holding a short stick of white chalk between thumb and forefinger, faint chalk dust drifting from the tip as if mid-stroke", term: "holding a stick of white chalk" },
|
|
82
99
|
|
|
83
100
|
// -------------------- Bags / Accessories --------------------
|
|
84
|
-
{ id: "handbag", label: "Handbag", category: "bag-accessory", description: "Designer handbag", promptHint: "carrying a structured designer handbag by the top handles in one hand at hip height, the bag positioned cleanly in frame" },
|
|
85
|
-
{ id: "tote-bag", label: "Tote Bag", category: "bag-accessory", description: "Soft canvas tote", promptHint: "carrying a soft canvas tote bag slung over one shoulder, fabric folding naturally against the side" },
|
|
86
|
-
{ id: "briefcase", label: "Briefcase", category: "bag-accessory", description: "Hard-shell briefcase", promptHint: "carrying a hard-shell briefcase by the top handle in one hand at hip height, the case angled to read clearly in frame" },
|
|
87
|
-
{ id: "umbrella", label: "Umbrella", category: "bag-accessory", description: "Open black umbrella", promptHint: "holding an open black umbrella overhead with one hand, the canopy haloing the head and shadow falling across the face" },
|
|
88
|
-
{ id: "fan-folding", label: "Folding Fan", category: "bag-accessory", description: "Open hand-painted fan", promptHint: "holding an open hand-painted folding fan raised near the face, fingers fanned along the spine" },
|
|
89
|
-
{ id: "parasol", label: "Parasol", category: "bag-accessory", description: "Decorative Victorian / Asian parasol", promptHint: "holding a decorative parasol open above one shoulder, the lace or hand-painted canopy shielding the face from sun and casting a delicate dappled shadow" },
|
|
90
|
-
{ id: "locket", label: "Locket", category: "bag-accessory", description: "Open vintage locket pendant", promptHint: "holding an open vintage locket pendant between thumb and forefinger close to the chest, the tiny portrait inside angled gently toward the face" },
|
|
101
|
+
{ id: "handbag", label: "Handbag", category: "bag-accessory", description: "Designer handbag", promptHint: "carrying a structured designer handbag by the top handles in one hand at hip height, the bag positioned cleanly in frame", term: "carrying a structured designer handbag" },
|
|
102
|
+
{ id: "tote-bag", label: "Tote Bag", category: "bag-accessory", description: "Soft canvas tote", promptHint: "carrying a soft canvas tote bag slung over one shoulder, fabric folding naturally against the side", term: "carrying a canvas tote bag over one shoulder" },
|
|
103
|
+
{ id: "briefcase", label: "Briefcase", category: "bag-accessory", description: "Hard-shell briefcase", promptHint: "carrying a hard-shell briefcase by the top handle in one hand at hip height, the case angled to read clearly in frame", term: "carrying a hard-shell briefcase" },
|
|
104
|
+
{ id: "umbrella", label: "Umbrella", category: "bag-accessory", description: "Open black umbrella", promptHint: "holding an open black umbrella overhead with one hand, the canopy haloing the head and shadow falling across the face", term: "holding an open black umbrella overhead" },
|
|
105
|
+
{ id: "fan-folding", label: "Folding Fan", category: "bag-accessory", description: "Open hand-painted fan", promptHint: "holding an open hand-painted folding fan raised near the face, fingers fanned along the spine", term: "holding an open hand-painted folding fan" },
|
|
106
|
+
{ id: "parasol", label: "Parasol", category: "bag-accessory", description: "Decorative Victorian / Asian parasol", promptHint: "holding a decorative parasol open above one shoulder, the lace or hand-painted canopy shielding the face from sun and casting a delicate dappled shadow", term: "holding an open decorative parasol" },
|
|
107
|
+
{ id: "locket", label: "Locket", category: "bag-accessory", description: "Open vintage locket pendant", promptHint: "holding an open vintage locket pendant between thumb and forefinger close to the chest, the tiny portrait inside angled gently toward the face", term: "holding an open vintage locket" },
|
|
91
108
|
|
|
92
109
|
// -------------------- Floral / Nature --------------------
|
|
93
|
-
{ id: "bouquet", label: "Bouquet", category: "floral-nature", description: "Mixed bouquet of flowers", promptHint: "cradling a mixed bouquet of fresh flowers in both arms against the chest, blooms framing the face from below" },
|
|
94
|
-
{ id: "single-rose", label: "Single Rose", category: "floral-nature", description: "Single long-stem rose", promptHint: "holding a single long-stem red rose loosely between two fingers, the bloom raised softly toward the face" },
|
|
95
|
-
{ id: "sunflower", label: "Sunflower", category: "floral-nature", description: "Single tall sunflower", promptHint: "holding a tall sunflower upright by the stem in one hand, the wide yellow bloom raised slightly above the shoulder" },
|
|
96
|
-
{ id: "leaf", label: "Leaf", category: "floral-nature", description: "Single large leaf", promptHint: "holding a single large green leaf by its stem in one hand, the broad surface positioned to one side of the face" },
|
|
97
|
-
{ id: "fruit-apple", label: "Apple", category: "floral-nature", description: "Single fresh apple", promptHint: "holding a single fresh apple cradled in one open palm at chest height, the glossy skin catching the light" },
|
|
110
|
+
{ id: "bouquet", label: "Bouquet", category: "floral-nature", description: "Mixed bouquet of flowers", promptHint: "cradling a mixed bouquet of fresh flowers in both arms against the chest, blooms framing the face from below", term: "cradling a bouquet of fresh flowers" },
|
|
111
|
+
{ id: "single-rose", label: "Single Rose", category: "floral-nature", description: "Single long-stem rose", promptHint: "holding a single long-stem red rose loosely between two fingers, the bloom raised softly toward the face", term: "holding a long-stem red rose" },
|
|
112
|
+
{ id: "sunflower", label: "Sunflower", category: "floral-nature", description: "Single tall sunflower", promptHint: "holding a tall sunflower upright by the stem in one hand, the wide yellow bloom raised slightly above the shoulder", term: "holding a tall sunflower by the stem" },
|
|
113
|
+
{ id: "leaf", label: "Leaf", category: "floral-nature", description: "Single large leaf", promptHint: "holding a single large green leaf by its stem in one hand, the broad surface positioned to one side of the face", term: "holding a large green leaf" },
|
|
114
|
+
{ id: "fruit-apple", label: "Apple", category: "floral-nature", description: "Single fresh apple", promptHint: "holding a single fresh apple cradled in one open palm at chest height, the glossy skin catching the light", term: "holding a fresh apple in one palm" },
|
|
98
115
|
|
|
99
116
|
// -------------------- Instruments / Performance --------------------
|
|
100
|
-
{ id: "guitar", label: "Guitar", category: "instrument", description: "Guitar slung across body", promptHint: "holding a guitar slung across the body with one hand on the neck and the other resting over the strings near the soundhole" },
|
|
101
|
-
{ id: "violin", label: "Violin", category: "instrument", description: "Violin under chin", promptHint: "holding a violin tucked under the chin with one hand fingering the neck and the other drawing a bow across the strings" },
|
|
102
|
-
{ id: "saxophone", label: "Saxophone", category: "instrument", description: "Saxophone raised to lips", promptHint: "holding a saxophone raised to the lips with both hands wrapped around the keys, a strap supporting the weight at the neck" },
|
|
103
|
-
{ id: "drumsticks", label: "Drumsticks", category: "instrument", description: "Pair of drumsticks crossed", promptHint: "holding a pair of drumsticks crossed in front of the chest, fingers wrapped firmly around their grips" },
|
|
104
|
-
{ id: "sheet-music", label: "Sheet Music", category: "instrument", description: "Folded sheet music", promptHint: "holding a folded sheet of musical notation open between both hands at chest height, eyes lightly scanning the staves" },
|
|
117
|
+
{ id: "guitar", label: "Guitar", category: "instrument", description: "Guitar slung across body", promptHint: "holding a guitar slung across the body with one hand on the neck and the other resting over the strings near the soundhole", term: "holding a guitar slung across the body" },
|
|
118
|
+
{ id: "violin", label: "Violin", category: "instrument", description: "Violin under chin", promptHint: "holding a violin tucked under the chin with one hand fingering the neck and the other drawing a bow across the strings", term: "holding a violin under the chin" },
|
|
119
|
+
{ id: "saxophone", label: "Saxophone", category: "instrument", description: "Saxophone raised to lips", promptHint: "holding a saxophone raised to the lips with both hands wrapped around the keys, a strap supporting the weight at the neck", term: "holding a saxophone raised to the lips" },
|
|
120
|
+
{ id: "drumsticks", label: "Drumsticks", category: "instrument", description: "Pair of drumsticks crossed", promptHint: "holding a pair of drumsticks crossed in front of the chest, fingers wrapped firmly around their grips", term: "holding a pair of wooden drumsticks" },
|
|
121
|
+
{ id: "sheet-music", label: "Sheet Music", category: "instrument", description: "Folded sheet music", promptHint: "holding a folded sheet of musical notation open between both hands at chest height, eyes lightly scanning the staves", term: "holding folded sheet music" },
|
|
105
122
|
|
|
106
123
|
// -------------------- Companion --------------------
|
|
107
|
-
{ id: "small-dog", label: "Small Dog", category: "companion", description: "Small dog held in arms", promptHint: "cradling a small dog in both arms against the chest, the pet's head resting comfortably under the subject's chin" },
|
|
108
|
-
{ id: "cat", label: "Cat", category: "companion", description: "Cat draped over arm", promptHint: "cradling a cat draped across one arm at chest height, the other hand resting gently along its back" },
|
|
109
|
-
{ id: "plush-toy", label: "Plush Toy", category: "companion", description: "Soft plush toy hugged", promptHint: "hugging a soft plush toy against the chest with both arms wrapped around it, head leaning lightly against its top" },
|
|
124
|
+
{ id: "small-dog", label: "Small Dog", category: "companion", description: "Small dog held in arms", promptHint: "cradling a small dog in both arms against the chest, the pet's head resting comfortably under the subject's chin", term: "cradling a small dog in both arms" },
|
|
125
|
+
{ id: "cat", label: "Cat", category: "companion", description: "Cat draped over arm", promptHint: "cradling a cat draped across one arm at chest height, the other hand resting gently along its back", term: "cradling a cat" },
|
|
126
|
+
{ id: "plush-toy", label: "Plush Toy", category: "companion", description: "Soft plush toy hugged", promptHint: "hugging a soft plush toy against the chest with both arms wrapped around it, head leaning lightly against its top", term: "hugging a soft plush toy" },
|
|
110
127
|
|
|
111
128
|
// -------------------- Occupational / Weapon --------------------
|
|
112
|
-
{ id: "katana", label: "Katana", category: "occupational", description: "Single-edged Japanese sword", promptHint: "holding a katana with one hand on the wrapped grip and the other resting on the long polished edge, blade angled diagonally across the body" },
|
|
113
|
-
{ id: "pointer-stick", label: "Pointer Stick", category: "occupational", description: "Telescoping pointer stick", promptHint: "holding a slender telescoping pointer stick in one hand, the tip raised toward an unseen surface as if mid-explanation" },
|
|
114
|
-
{ id: "gavel", label: "Gavel", category: "occupational", description: "Wooden judicial gavel", promptHint: "gripping a polished wooden gavel mid-strike with one hand, the head poised above an unseen sound block" },
|
|
115
|
-
{ id: "wine-bottle", label: "Wine Bottle", category: "occupational", description: "Full bottle with foil seal", promptHint: "holding a tall wine bottle by the neck with one hand, the labeled body and red foil seal angled clearly toward the camera" },
|
|
116
|
-
{ id: "lantern", label: "Lantern", category: "occupational", description: "Vintage handheld lantern with amber glow", promptHint: "carrying a vintage handheld lantern by its top ring at hip height, warm amber glow casting a soft circular pool of light across the face and surroundings" },
|
|
117
|
-
{ id: "flashlight", label: "Flashlight", category: "occupational", description: "Modern flashlight cutting a beam", promptHint: "holding a modern flashlight raised forward in one hand, a sharp white beam cutting through the darkness ahead and side-lighting the face" },
|
|
118
|
-
{ id: "compass", label: "Compass", category: "occupational", description: "Vintage handheld nautical compass", promptHint: "holding a vintage brass nautical compass open in one cupped palm at chest height, the needle clearly visible as the eyes drift down to read the bearing" },
|
|
119
|
-
{ id: "bow-and-arrow", label: "Bow and Arrow", category: "occupational", description: "Drawn archery bow with arrow nocked", promptHint: "holding an archery bow drawn at full tension with one hand on the grip and the other pulling the string back to the cheek, an arrow nocked and aimed forward" },
|
|
120
|
-
{ id: "shield", label: "Shield", category: "occupational", description: "Handheld medieval shield", promptHint: "holding a medieval shield raised across the body with one arm strapped through the back, the front face angled forward in a defensive stance" },
|
|
129
|
+
{ id: "katana", label: "Katana", category: "occupational", description: "Single-edged Japanese sword", promptHint: "holding a katana with one hand on the wrapped grip and the other resting on the long polished edge, blade angled diagonally across the body", term: "holding a katana across the body" },
|
|
130
|
+
{ id: "pointer-stick", label: "Pointer Stick", category: "occupational", description: "Telescoping pointer stick", promptHint: "holding a slender telescoping pointer stick in one hand, the tip raised toward an unseen surface as if mid-explanation", term: "holding a telescoping pointer stick" },
|
|
131
|
+
{ id: "gavel", label: "Gavel", category: "occupational", description: "Wooden judicial gavel", promptHint: "gripping a polished wooden gavel mid-strike with one hand, the head poised above an unseen sound block", term: "gripping a wooden gavel mid-strike" },
|
|
132
|
+
{ id: "wine-bottle", label: "Wine Bottle", category: "occupational", description: "Full bottle with foil seal", promptHint: "holding a tall wine bottle by the neck with one hand, the labeled body and red foil seal angled clearly toward the camera", term: "holding a wine bottle by the neck" },
|
|
133
|
+
{ id: "lantern", label: "Lantern", category: "occupational", description: "Vintage handheld lantern with amber glow", promptHint: "carrying a vintage handheld lantern by its top ring at hip height, warm amber glow casting a soft circular pool of light across the face and surroundings", term: "carrying a vintage handheld lantern" },
|
|
134
|
+
{ id: "flashlight", label: "Flashlight", category: "occupational", description: "Modern flashlight cutting a beam", promptHint: "holding a modern flashlight raised forward in one hand, a sharp white beam cutting through the darkness ahead and side-lighting the face", term: "holding a flashlight raised forward" },
|
|
135
|
+
{ id: "compass", label: "Compass", category: "occupational", description: "Vintage handheld nautical compass", promptHint: "holding a vintage brass nautical compass open in one cupped palm at chest height, the needle clearly visible as the eyes drift down to read the bearing", term: "holding an open brass nautical compass" },
|
|
136
|
+
{ id: "bow-and-arrow", label: "Bow and Arrow", category: "occupational", description: "Drawn archery bow with arrow nocked", promptHint: "holding an archery bow drawn at full tension with one hand on the grip and the other pulling the string back to the cheek, an arrow nocked and aimed forward", term: "drawing an archery bow with a nocked arrow" },
|
|
137
|
+
{ id: "shield", label: "Shield", category: "occupational", description: "Handheld medieval shield", promptHint: "holding a medieval shield raised across the body with one arm strapped through the back, the front face angled forward in a defensive stance", term: "holding a raised medieval shield" },
|
|
121
138
|
] as const
|
|
122
139
|
|
|
123
140
|
const heldPropById = new Map<string, HeldProp>(HELD_PROPS.map((p) => [p.id, p]))
|
|
@@ -138,13 +155,47 @@ export function getHeldPropPromptHint(id: string | undefined | null): string {
|
|
|
138
155
|
return getHeldProp(id)?.promptHint ?? ""
|
|
139
156
|
}
|
|
140
157
|
|
|
158
|
+
/**
|
|
159
|
+
* Compact professional TERM for an id — the short prop phrase a stylist would
|
|
160
|
+
* write in a prompt ("holding a lit chrome lighter", "cradling a cat"), as
|
|
161
|
+
* opposed to the pose-carrying paragraph in `promptHint`.
|
|
162
|
+
*
|
|
163
|
+
* KEEPS the catalog's held-in-hand verb ("holding a…", "cradling a…",
|
|
164
|
+
* "carrying a…"). No consumer re-adds it — the orchestrator and the frontend
|
|
165
|
+
* resolver append the fragment verbatim, and a thin client injects the
|
|
166
|
+
* projected `term` standalone — so dropping the verb would turn "the subject
|
|
167
|
+
* is holding X" into "X is somewhere in the scene".
|
|
168
|
+
*
|
|
169
|
+
* Same lookup and same empty-string-on-miss behavior as
|
|
170
|
+
* `getHeldPropPromptHint`, so the two can never disagree about which entry
|
|
171
|
+
* they describe.
|
|
172
|
+
*/
|
|
173
|
+
export function getHeldPropTerm(id: string | undefined | null): string {
|
|
174
|
+
return resolveTerm(getHeldProp(id))
|
|
175
|
+
}
|
|
176
|
+
|
|
141
177
|
/**
|
|
142
178
|
* Multi-pick: 1-2 prop ids → composite held-prop clause. Single → entry's
|
|
143
179
|
* own promptHint (which already starts with "holding..." / "carrying..."
|
|
144
180
|
* grammar). Two → emit independently, joined by buildPersonHints-style
|
|
145
181
|
* comma-join. Common combos: book + coffee, cigarette + drink, phone + bag.
|
|
146
182
|
*/
|
|
147
|
-
export function buildHeldPropHints(value: unknown): string[] {
|
|
183
|
+
export function buildHeldPropHints(value: unknown, mode: PickerHintMode = "full"): string[] {
|
|
184
|
+
if (mode === "compact") return buildHeldPropTerms(value)
|
|
185
|
+
const out: string[] = []
|
|
186
|
+
for (const id of pickHeldPropIds(value)) {
|
|
187
|
+
const hint = getHeldPropPromptHint(id)
|
|
188
|
+
if (hint) out.push(hint)
|
|
189
|
+
}
|
|
190
|
+
return out
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* The id list both builders read: a lone non-empty string, or the distinct
|
|
195
|
+
* non-empty strings of an array. Shared so the hint and term builders can
|
|
196
|
+
* never disagree about WHICH props a value selects.
|
|
197
|
+
*/
|
|
198
|
+
function pickHeldPropIds(value: unknown): string[] {
|
|
148
199
|
const ids: string[] = []
|
|
149
200
|
if (typeof value === "string" && value) ids.push(value)
|
|
150
201
|
else if (Array.isArray(value)) {
|
|
@@ -152,10 +203,21 @@ export function buildHeldPropHints(value: unknown): string[] {
|
|
|
152
203
|
if (typeof v === "string" && v && !ids.includes(v)) ids.push(v)
|
|
153
204
|
}
|
|
154
205
|
}
|
|
206
|
+
return ids
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* Compact-mode mirror of `buildHeldPropHints`: the same ids in the same order,
|
|
211
|
+
* resolved to their short professional terms — verb included — instead of
|
|
212
|
+
* their pose-carrying paragraph hints. The caller joins the array exactly as
|
|
213
|
+
* it joins the full hints, so each term carrying its own verb is what keeps a
|
|
214
|
+
* two-prop pick reading correctly.
|
|
215
|
+
*/
|
|
216
|
+
export function buildHeldPropTerms(value: unknown): string[] {
|
|
155
217
|
const out: string[] = []
|
|
156
|
-
for (const id of
|
|
157
|
-
const
|
|
158
|
-
if (
|
|
218
|
+
for (const id of pickHeldPropIds(value)) {
|
|
219
|
+
const term = getHeldPropTerm(id)
|
|
220
|
+
if (term) out.push(term)
|
|
159
221
|
}
|
|
160
222
|
return out
|
|
161
223
|
}
|
package/src/identity-lock.ts
CHANGED
|
@@ -17,8 +17,15 @@ import { PASSTHROUGH_TYPES } from "@nodaro/shared"
|
|
|
17
17
|
|
|
18
18
|
export type IdentityLockMode = "off" | "soft" | "strict"
|
|
19
19
|
|
|
20
|
-
/**
|
|
21
|
-
|
|
20
|
+
/**
|
|
21
|
+
* The identity-lock default for characters — the value used wherever a Character
|
|
22
|
+
* node or entity has no explicit `identityLock`/`identity_lock`: the UI display
|
|
23
|
+
* fallback (canvas node, config panel, Character Studio), the runtime coercion in
|
|
24
|
+
* `toIdentityLockMode`, and the backend create defaults (characters route, MCP
|
|
25
|
+
* create_character, asset generation). Mirror this value in the
|
|
26
|
+
* `characters.identity_lock` SQL column default (migration 353).
|
|
27
|
+
*/
|
|
28
|
+
export const DEFAULT_IDENTITY_LOCK: IdentityLockMode = "off"
|
|
22
29
|
|
|
23
30
|
/** Strict beats Soft beats Off — when multiple Character nodes feed one node. */
|
|
24
31
|
const RANK: Record<IdentityLockMode, number> = { off: 0, soft: 1, strict: 2 }
|
|
@@ -68,9 +75,9 @@ const CHARACTER_NODE_LOCK_TEXT: Record<Exclude<IdentityLockMode, "off">, string>
|
|
|
68
75
|
* - off → { enabled: false } (no lock line)
|
|
69
76
|
* - soft → { enabled: true, text: <soft clause> } (mild "preserve likeness")
|
|
70
77
|
* - strict → { enabled: true, text: <strict clause> }(strong "match exactly")
|
|
71
|
-
* `undefined` coerces to the runtime default (`"
|
|
72
|
-
* so
|
|
73
|
-
* per-mention `~lock`/`~nolock` sentinel still overrides via `withForcedIdentityLock`.
|
|
78
|
+
* `undefined` coerces to the runtime default (`DEFAULT_IDENTITY_LOCK`, now `"off"`)
|
|
79
|
+
* via `toIdentityLockMode`, so a node that never set the field emits NO lock line
|
|
80
|
+
* in hybrid. The per-mention `~lock`/`~nolock` sentinel still overrides via `withForcedIdentityLock`.
|
|
74
81
|
*/
|
|
75
82
|
export function characterLockToRefLock(
|
|
76
83
|
mode: IdentityLockMode | undefined,
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reference-image prompting doctrine for IMAGE generation — the single source
|
|
3
|
+
* of truth for the `{image:N:label}` token idiom on `generate-image`. Consumed
|
|
4
|
+
* by backend/scripts/gen-skills (the `image-reference-prompting` block in the
|
|
5
|
+
* generate-image node skill), the same way `PROVIDER_PROMPT_DOCTRINES` feeds
|
|
6
|
+
* the video node skills.
|
|
7
|
+
*
|
|
8
|
+
* Unlike the per-provider video doctrines, this is a PLATFORM mechanism: the
|
|
9
|
+
* token grammar and expansion are Nodaro's own (`prompt-builder.ts` —
|
|
10
|
+
* `IMAGE_TOKEN_PATTERN`, `expandImageRefTokens`), so there is one doctrine,
|
|
11
|
+
* not one per model family.
|
|
12
|
+
*
|
|
13
|
+
* Source of truth for the semantics documented here (verified 2026-08-25):
|
|
14
|
+
* - `IMAGE_TOKEN_PATTERN` = `/\{image:(\d+)(?::([^}\n]+))?\}/gi`
|
|
15
|
+
* - `expandImageRefTokens`: `{image:N:label}` → `Image N (label)`,
|
|
16
|
+
* `{image:N}` → `Image N`; out-of-range tokens are left untouched so the
|
|
17
|
+
* author can see and fix them.
|
|
18
|
+
* - N is the reference's 1-based position in the assembled reference list
|
|
19
|
+
* (connection order on the `references` handle).
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
export interface ImageReferenceDoctrine {
|
|
23
|
+
/** Human heading for skill docs. */
|
|
24
|
+
readonly heading: string
|
|
25
|
+
/** Full markdown doctrine for generated skill docs. */
|
|
26
|
+
readonly doctrine: string
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export const IMAGE_REFERENCE_PROMPT_DOCTRINE: ImageReferenceDoctrine = {
|
|
30
|
+
heading: "Reference-image prompting ({image:N:label} tokens)",
|
|
31
|
+
doctrine: `The \`references\` handle takes MULTIPLE image producers (upload-image, generate-image, …) wired into one generate-image node. Connection order is the numbering: the first-connected reference is 1. The prompt then binds them with tokens:
|
|
32
|
+
|
|
33
|
+
- \`{image:N:label}\` → expands server-side to \`Image N (label)\`, aligned with the numbered reference list sent to the provider.
|
|
34
|
+
- \`{image:N}\` → \`Image N\` (no role named).
|
|
35
|
+
- A token whose N has no wired reference is left as literal text in the final prompt — visible on purpose, so fix the numbering instead of ignoring it.
|
|
36
|
+
|
|
37
|
+
**How to compose**
|
|
38
|
+
- The prompt should be little more than tokens plus glue words: \`{image:1:person} with {image:2:face}\`. The label tells the model what to TAKE from that image — \`person\`, \`face\`, \`background\`, \`settings\`, or a concrete garment/prop name (\`jacket\`).
|
|
39
|
+
- Order = priority. Put the identity-critical image first. Swapping the numbers (or the labels) swaps the result — \`{image:2:person} with {image:1:face}\` transplants in the opposite direction.
|
|
40
|
+
- Do NOT re-describe what a referenced image already shows; a sentence fighting the reference degrades adherence. Add only what is NEW (pose, lighting, scene) — or better, reference it from another image.
|
|
41
|
+
|
|
42
|
+
**Core patterns (each is one generate-image node with two wired references)**
|
|
43
|
+
- Identity transplant: \`{image:1:person} with {image:2:face}\` — body/outfit/scene from 1, face from 2.
|
|
44
|
+
- Reverse transplant: \`{image:2:person} with {image:1:face}\` — same two references, opposite result.
|
|
45
|
+
- Keep the stage, change the star: \`{image:1:background} with {image:2:person}\`.
|
|
46
|
+
- Relocation: \`{image:1:person} in {image:2:settings}\`.
|
|
47
|
+
- Garment transfer: \`{image:1:person} Wearing {image:2:jacket} on top, at {image:2:settings}\` — several labels can pull different things from the SAME image.
|
|
48
|
+
|
|
49
|
+
**Providers & settings**
|
|
50
|
+
- Multi-reference composition is strongest on the GPT-Image family (\`gpt-image-2\`) and the Nano Banana family (\`nano-banana-pro\`). Check a model's reference support via \`list_models\` before relying on more than one reference.
|
|
51
|
+
- Set an explicit \`aspectRatio\` and prefer \`resolution: "2K"\` for composites — face detail survives the merge better.
|
|
52
|
+
|
|
53
|
+
**Known pitfall**
|
|
54
|
+
- Person+face composition intermittently trips provider content filters ("Content policy violation"). Keep wording neutral (no glamor/body emphasis), and on a rejection rephrase the glue words or swap provider rather than retrying unchanged.`,
|
|
55
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
*/
|
|
11
11
|
export * from "./identity-lock.js"
|
|
12
12
|
export * from "./reference-rules.js"
|
|
13
|
+
export * from "./term.js"
|
|
13
14
|
export * from "./parameter-prompt-hint.js"
|
|
14
15
|
export * from "./entity-prompts.js"
|
|
15
16
|
export * from "./brand-tokens.js"
|
|
@@ -24,6 +25,9 @@ export * from "./gemini-omni-inputs.js"
|
|
|
24
25
|
export * from "./veo-i2v-inputs.js"
|
|
25
26
|
export * from "./person.js"
|
|
26
27
|
export * from "./picker-catalogs.js"
|
|
28
|
+
export * from "./catalog-packs.js"
|
|
29
|
+
export * from "./catalog-sidecar-coverage.js"
|
|
30
|
+
export * from "./person-packs.js"
|
|
27
31
|
export * from "./picker-analyzer-registry.js"
|
|
28
32
|
export * from "./action-fx.js"
|
|
29
33
|
export * from "./aesthetic.js"
|
|
@@ -61,6 +65,7 @@ export * from "./voice-delivery.js"
|
|
|
61
65
|
export * from "./wardrobe.js"
|
|
62
66
|
export * from "./prompt-templates.js"
|
|
63
67
|
export * from "./provider-prompt-doctrine.js"
|
|
68
|
+
export * from "./image-reference-doctrine.js"
|
|
64
69
|
export * from "./prompt-wizard-categories.js"
|
|
65
70
|
export * from "./resolve-prompt.js"
|
|
66
71
|
export * from "./factory-presets.js"
|