@nodaro/prompts 1.53.2 → 1.55.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/{catalog-packs-DeMcSVCR.d.cts → catalog-packs-Bw7OpufR.d.cts} +1 -1
- package/dist/{catalog-packs-DjqvicAR.d.ts → catalog-packs-CyS8NdLM.d.ts} +1 -1
- package/dist/{chunk-HOZPYHRA.js → chunk-242NZ6SI.js} +5 -5
- package/dist/{chunk-HOZPYHRA.js.map → chunk-242NZ6SI.js.map} +1 -1
- package/dist/{chunk-GRSKB3P7.cjs → chunk-2LWYFWZL.cjs} +528 -2
- package/dist/chunk-2LWYFWZL.cjs.map +1 -0
- package/dist/{chunk-P4BXE4OA.cjs → chunk-2MTFPGQC.cjs} +13 -13
- package/dist/{chunk-P4BXE4OA.cjs.map → chunk-2MTFPGQC.cjs.map} +1 -1
- package/dist/{chunk-EKRO42T3.cjs → chunk-32BMZ4Q5.cjs} +113 -41
- package/dist/chunk-32BMZ4Q5.cjs.map +1 -0
- package/dist/{chunk-WQ7FWGZ2.js → chunk-4MCK7Y6C.js} +524 -3
- package/dist/chunk-4MCK7Y6C.js.map +1 -0
- package/dist/{chunk-FFPFBNXH.cjs → chunk-7ZWWJY24.cjs} +8 -2
- package/dist/chunk-7ZWWJY24.cjs.map +1 -0
- package/dist/{chunk-F22GZF7T.cjs → chunk-AMUXCE7X.cjs} +8 -8
- package/dist/{chunk-F22GZF7T.cjs.map → chunk-AMUXCE7X.cjs.map} +1 -1
- package/dist/{chunk-OQ3J7OGR.cjs → chunk-BHBZN2AP.cjs} +49 -49
- package/dist/{chunk-OQ3J7OGR.cjs.map → chunk-BHBZN2AP.cjs.map} +1 -1
- package/dist/{chunk-YAIPYPMM.js → chunk-BJGD4DBP.js} +4 -4
- package/dist/{chunk-YAIPYPMM.js.map → chunk-BJGD4DBP.js.map} +1 -1
- package/dist/{chunk-ZRORO6OM.js → chunk-CYYHQNW3.js} +4 -4
- package/dist/{chunk-ZRORO6OM.js.map → chunk-CYYHQNW3.js.map} +1 -1
- package/dist/{chunk-E5EKWWOO.cjs → chunk-FEHXLXAV.cjs} +8 -7
- package/dist/chunk-FEHXLXAV.cjs.map +1 -0
- package/dist/{chunk-5XPELUES.js → chunk-GJX5N63V.js} +8 -2
- package/dist/chunk-GJX5N63V.js.map +1 -0
- package/dist/{chunk-XR7RAHZI.js → chunk-HZH6XXYK.js} +81 -9
- package/dist/chunk-HZH6XXYK.js.map +1 -0
- package/dist/{chunk-OMRFKG4M.js → chunk-KBWUO4P7.js} +3 -3
- package/dist/{chunk-OMRFKG4M.js.map → chunk-KBWUO4P7.js.map} +1 -1
- package/dist/{chunk-XRCK3BCF.cjs → chunk-M25N26II.cjs} +55 -10
- package/dist/chunk-M25N26II.cjs.map +1 -0
- package/dist/{chunk-PHCYQWJP.js → chunk-NCF5TAR6.js} +55 -10
- package/dist/chunk-NCF5TAR6.js.map +1 -0
- package/dist/{chunk-NUC5RV4P.cjs → chunk-NDKJW7RP.cjs} +4 -4
- package/dist/{chunk-NUC5RV4P.cjs.map → chunk-NDKJW7RP.cjs.map} +1 -1
- package/dist/{chunk-ED47NNIN.js → chunk-OXNJVQ2V.js} +3 -3
- package/dist/{chunk-ED47NNIN.js.map → chunk-OXNJVQ2V.js.map} +1 -1
- package/dist/{chunk-PWYASBX2.cjs → chunk-P5HAPDV3.cjs} +18 -18
- package/dist/{chunk-PWYASBX2.cjs.map → chunk-P5HAPDV3.cjs.map} +1 -1
- package/dist/{chunk-EUU5W7XR.js → chunk-TMYYALRF.js} +4 -4
- package/dist/{chunk-EUU5W7XR.js.map → chunk-TMYYALRF.js.map} +1 -1
- package/dist/{chunk-H322GC7M.js → chunk-VX3BIUGY.js} +5 -4
- package/dist/chunk-VX3BIUGY.js.map +1 -0
- package/dist/{chunk-VBCVQPQ4.js → chunk-WDKQQ7WL.js} +3 -3
- package/dist/{chunk-VBCVQPQ4.js.map → chunk-WDKQQ7WL.js.map} +1 -1
- package/dist/{chunk-KTNCB2IE.cjs → chunk-XMRDZRGV.cjs} +35 -35
- package/dist/{chunk-KTNCB2IE.cjs.map → chunk-XMRDZRGV.cjs.map} +1 -1
- package/dist/{chunk-7BWDATUZ.cjs → chunk-Y3TSRO3S.cjs} +125 -125
- package/dist/{chunk-7BWDATUZ.cjs.map → chunk-Y3TSRO3S.cjs.map} +1 -1
- package/dist/entries/assembly.cjs +29 -29
- package/dist/entries/assembly.d.cts +9 -0
- package/dist/entries/assembly.d.ts +9 -0
- package/dist/entries/assembly.js +6 -6
- package/dist/entries/catalog-packs.d.cts +4 -4
- package/dist/entries/catalog-packs.d.ts +4 -4
- package/dist/entries/doctrine.cjs +46 -46
- package/dist/entries/doctrine.js +1 -1
- package/dist/entries/person.d.cts +3 -3
- package/dist/entries/person.d.ts +3 -3
- package/dist/entries/picker-art.cjs +22 -22
- package/dist/entries/picker-art.d.cts +1 -1
- package/dist/entries/picker-art.d.ts +1 -1
- package/dist/entries/picker-art.js +2 -2
- package/dist/entries/picker-catalogs.cjs +57 -57
- package/dist/entries/picker-catalogs.d.cts +3 -3
- package/dist/entries/picker-catalogs.d.ts +3 -3
- package/dist/entries/picker-catalogs.js +5 -5
- package/dist/entries/pickers.cjs +383 -383
- package/dist/entries/pickers.js +3 -3
- package/dist/entries/presets.cjs +55 -35
- package/dist/entries/presets.d.cts +29 -1
- package/dist/entries/presets.d.ts +29 -1
- package/dist/entries/presets.js +1 -1
- package/dist/entries/prompt-builder.cjs +76 -76
- package/dist/entries/prompt-builder.js +5 -5
- package/dist/{images-ChAOLY5V.d.cts → images-BQ1jUWyZ.d.cts} +32 -3
- package/dist/{images-ChAOLY5V.d.ts → images-BQ1jUWyZ.d.ts} +32 -3
- package/dist/index.cjs +657 -637
- package/dist/index.d.cts +4 -4
- package/dist/index.d.ts +4 -4
- package/dist/index.js +12 -12
- package/dist/{picker-catalogs-DzLCu6qQ.d.cts → picker-catalogs-BuMGOVWC.d.cts} +1 -1
- package/dist/{picker-catalogs-SDSWrufc.d.ts → picker-catalogs-CVQopXwp.d.ts} +1 -1
- package/package.json +2 -2
- package/src/__tests__/doctrine-roster-completeness.test.ts +3 -0
- package/src/__tests__/factory-preset-previews.test.ts +38 -0
- package/src/__tests__/factory-preset-shelves.test.ts +30 -0
- package/src/__tests__/picker-art-images.test.ts +54 -0
- package/src/__tests__/seedance-extend.test.ts +37 -23
- package/src/__tests__/video-reference-features.test.ts +7 -5
- package/src/__tests__/video-reference-seatless-assets.test.ts +132 -0
- package/src/factory-presets/index.ts +4 -0
- package/src/factory-presets/preview-files.generated.ts +472 -0
- package/src/factory-presets/previews.ts +17 -2
- package/src/factory-presets/shelves.ts +50 -0
- package/src/picker-art/images.ts +39 -2
- package/src/picker-catalogs.ts +4 -2
- package/src/prompt-wizard-categories.ts +15 -3
- package/src/provider-prompt-doctrine.ts +44 -5
- package/src/seatless-assets.ts +141 -0
- package/src/video-reference-resolver.ts +31 -4
- package/dist/chunk-5XPELUES.js.map +0 -1
- package/dist/chunk-E5EKWWOO.cjs.map +0 -1
- package/dist/chunk-EKRO42T3.cjs.map +0 -1
- package/dist/chunk-FFPFBNXH.cjs.map +0 -1
- package/dist/chunk-GRSKB3P7.cjs.map +0 -1
- package/dist/chunk-H322GC7M.js.map +0 -1
- package/dist/chunk-PHCYQWJP.js.map +0 -1
- package/dist/chunk-WQ7FWGZ2.js.map +0 -1
- package/dist/chunk-XR7RAHZI.js.map +0 -1
- package/dist/chunk-XRCK3BCF.cjs.map +0 -1
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
var
|
|
3
|
+
var chunkP5HAPDV3_cjs = require('./chunk-P5HAPDV3.cjs');
|
|
4
|
+
var chunkXMRDZRGV_cjs = require('./chunk-XMRDZRGV.cjs');
|
|
5
5
|
|
|
6
6
|
// src/read-node-direction.ts
|
|
7
7
|
function readDirectionFields(value) {
|
|
8
8
|
if (typeof value !== "object" || value === null || Array.isArray(value)) return void 0;
|
|
9
9
|
const src = value;
|
|
10
10
|
const out = {};
|
|
11
|
-
for (const spec of
|
|
11
|
+
for (const spec of chunkXMRDZRGV_cjs.DIRECTION_FIELDS) {
|
|
12
12
|
const v = src[spec.key];
|
|
13
13
|
if (typeof v === "string") {
|
|
14
|
-
if (v.length > 0 && v.length <=
|
|
14
|
+
if (v.length > 0 && v.length <= chunkXMRDZRGV_cjs.DIRECTION_ID_MAX_CHARS) out[spec.key] = v;
|
|
15
15
|
} else if (Array.isArray(v)) {
|
|
16
16
|
const kept = [];
|
|
17
17
|
for (const x of v) {
|
|
18
|
-
if (kept.length >=
|
|
19
|
-
if (typeof x === "string" && x.length > 0 && x.length <=
|
|
18
|
+
if (kept.length >= chunkXMRDZRGV_cjs.DIRECTION_ARRAY_CEILING) break;
|
|
19
|
+
if (typeof x === "string" && x.length > 0 && x.length <= chunkXMRDZRGV_cjs.DIRECTION_ID_MAX_CHARS) {
|
|
20
20
|
kept.push(x);
|
|
21
21
|
}
|
|
22
22
|
}
|
|
@@ -29,19 +29,19 @@ function readSubjectFields(value) {
|
|
|
29
29
|
if (typeof value !== "object" || value === null || Array.isArray(value)) return void 0;
|
|
30
30
|
const src = value;
|
|
31
31
|
const out = {};
|
|
32
|
-
for (const key of
|
|
32
|
+
for (const key of chunkP5HAPDV3_cjs.getRegisteredSubjectKeys()) {
|
|
33
33
|
const v = src[key];
|
|
34
|
-
if (key ===
|
|
34
|
+
if (key === chunkP5HAPDV3_cjs.SUBJECT_CUSTOM_AGE_KEY) {
|
|
35
35
|
if (typeof v === "number" && Number.isFinite(v)) out[key] = v;
|
|
36
36
|
continue;
|
|
37
37
|
}
|
|
38
38
|
if (typeof v === "string") {
|
|
39
|
-
if (v.length > 0 && v.length <=
|
|
39
|
+
if (v.length > 0 && v.length <= chunkP5HAPDV3_cjs.SUBJECT_ID_MAX_CHARS) out[key] = v;
|
|
40
40
|
} else if (Array.isArray(v)) {
|
|
41
41
|
const kept = [];
|
|
42
42
|
for (const x of v) {
|
|
43
|
-
if (kept.length >=
|
|
44
|
-
if (typeof x === "string" && x.length > 0 && x.length <=
|
|
43
|
+
if (kept.length >= chunkP5HAPDV3_cjs.SUBJECT_ARRAY_CEILING) break;
|
|
44
|
+
if (typeof x === "string" && x.length > 0 && x.length <= chunkP5HAPDV3_cjs.SUBJECT_ID_MAX_CHARS) {
|
|
45
45
|
kept.push(x);
|
|
46
46
|
}
|
|
47
47
|
}
|
|
@@ -118,5 +118,5 @@ function readStructuredFields(value) {
|
|
|
118
118
|
exports.readDirectionFields = readDirectionFields;
|
|
119
119
|
exports.readStructuredFields = readStructuredFields;
|
|
120
120
|
exports.readSubjectFields = readSubjectFields;
|
|
121
|
-
//# sourceMappingURL=chunk-
|
|
122
|
-
//# sourceMappingURL=chunk-
|
|
121
|
+
//# sourceMappingURL=chunk-2MTFPGQC.cjs.map
|
|
122
|
+
//# sourceMappingURL=chunk-2MTFPGQC.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/read-node-direction.ts"],"names":["DIRECTION_FIELDS","DIRECTION_ID_MAX_CHARS","DIRECTION_ARRAY_CEILING","getRegisteredSubjectKeys","SUBJECT_CUSTOM_AGE_KEY","SUBJECT_ID_MAX_CHARS","SUBJECT_ARRAY_CEILING"],"mappings":"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","file":"chunk-P4BXE4OA.cjs","sourcesContent":["/**\n * Narrow readers turning UNTRUSTED persisted node data (`workflows.nodes`\n * JSONB — import, MCP write, node preset, a Studio-emitted graph) into the\n * typed `subject` / `direction` / `structured` levers `assembleImageInput`\n * accepts.\n * `buildPayload` has no zod and workflow writes are\n * `z.record(z.string(), z.unknown())`, so this blob may have been written years\n * ago by any client.\n *\n * Used by ALL THREE image-assembly sites so what the canvas accepts cannot\n * drift between them: the frontend single-node executor (`execute-node.ts`),\n * the orchestrator (`payload-builder.ts`), and the config-panel final-prompt\n * preview (`build-image-assemble-input.ts`).\n *\n * `readDirectionFields` is DERIVED FROM `DIRECTION_FIELDS`, never a hand list:\n * a dimension added to the registry is honored here by construction, so the\n * reader can never silently drop a key the wire schema and the renderer both\n * know about. Anything unrecognised is DROPPED, never thrown on — a malformed\n * blob must not fail a canvas run, and an unknown catalog ID already degrades\n * to `\"\"` inside each `get*PromptHint`, so this validates SHAPE only.\n *\n * BOUNDS MATCH THE WIRE SCHEMA where both exist, by SHARED CONSTANT:\n * `DIRECTION_ID_MAX_CHARS` and `DIRECTION_ARRAY_CEILING` are the same two\n * literals the `generate-image` route's `directionSchema` enforces, imported\n * from the registry rather than re-typed here — a body the route accepts and a\n * node the canvas re-runs must not disagree about which strings are ids.\n *\n * DELIBERATELY STRICTER THAN THE WIRE SCHEMA on `structured` values: the\n * route's `structuredPromptFieldsSchema` declares every field as a bare\n * `z.string().optional()` (unbounded), while `MAX_STRUCTURED_VALUE_CHARS` below\n * bounds them at 200. Do not \"fix\" that asymmetry by loosening HERE — this\n * reads a blob any client may have written years ago, and the values land\n * verbatim in `jobs.input_data.prompt`. Tightening the ROUTE instead would be a\n * new 400 on currently-accepted input, so a >200-char structured value stored\n * on a node is dropped on a canvas run while `POST /v1/generate-image` still\n * renders it. That is the one known divergence; it is bounded to a field the\n * canvas UI never writes that long.\n *\n * RETURNS `undefined`, NEVER `{}`: an empty object would still be a *defined*\n * `direction`, and the call sites' `...(x !== undefined ? { x } : {})` spread\n * would then hand `assembleImageInput` a defined-but-empty lever. Returning\n * `undefined` keeps that spread honest and the exact no-op branch taken.\n */\nimport {\n DIRECTION_ARRAY_CEILING,\n DIRECTION_FIELDS,\n DIRECTION_ID_MAX_CHARS,\n type DirectionFields,\n} from \"./direction-registry.js\"\nimport {\n SUBJECT_ARRAY_CEILING,\n SUBJECT_CUSTOM_AGE_KEY,\n SUBJECT_ID_MAX_CHARS,\n getRegisteredSubjectKeys,\n type SubjectFields,\n} from \"./subject-registry.js\"\nimport type { StructuredPromptFields } from \"./prompt-builder-structured-fields.js\"\n\n/**\n * Read a node's stored cinematic-direction ids. Accepts a single id OR an array\n * on every key (multi-pick dimensions carry arrays; a single-pick key may\n * legitimately carry one).\n *\n * The SEMANTIC per-dimension cap stays the renderer's slice (`maxPicks`) — this\n * reader does not know a row's pick budget and must not guess it. But it DOES\n * bound cardinality at `DIRECTION_ARRAY_CEILING`, the same ceiling the wire\n * schema enforces: the value is untrusted persisted JSONB (a node blob is\n * validated only as `z.record(z.string(), z.unknown())` on write), and handing\n * an unbounded array to `renderDirectionHints` would put an `includes`-dedupe\n * scan in front of that slice. Keeping the FIRST `DIRECTION_ARRAY_CEILING`\n * survivors is what the wire door already does to the same input.\n *\n * Junk is filtered BEFORE the cap, so valid ids sitting behind malformed\n * entries survive rather than being crowded out by them.\n */\nexport function readDirectionFields(value: unknown): DirectionFields | undefined {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return undefined\n const src = value as Record<string, unknown>\n const out: Record<string, string | string[]> = {}\n for (const spec of DIRECTION_FIELDS) {\n const v = src[spec.key]\n if (typeof v === \"string\") {\n if (v.length > 0 && v.length <= DIRECTION_ID_MAX_CHARS) out[spec.key] = v\n } else if (Array.isArray(v)) {\n const kept: string[] = []\n for (const x of v) {\n if (kept.length >= DIRECTION_ARRAY_CEILING) break\n if (typeof x === \"string\" && x.length > 0 && x.length <= DIRECTION_ID_MAX_CHARS) {\n kept.push(x)\n }\n }\n if (kept.length > 0) out[spec.key] = kept\n }\n }\n return Object.keys(out).length > 0 ? (out as DirectionFields) : undefined\n}\n\n// ── subject ──────────────────────────────────────────────────────────────────\n\n/**\n * Read a node's stored SUBJECT ids — the flat Person / Styling / prop bag the\n * `subject` channel carries. Same three contracts as `readDirectionFields`:\n * drop-never-throw, `undefined` never `{}`, and bounds shared with the wire\n * door by CONSTANT (`SUBJECT_ID_MAX_CHARS` / `SUBJECT_ARRAY_CEILING`, which are\n * defined AS the direction constants) so a body the route accepts and the same\n * node re-run from the canvas cannot disagree about which strings are ids.\n *\n * DERIVED from `getRegisteredSubjectKeys()`, never a hand-authored field list —\n * that is the whole lesson of `readStructuredFields` below, whose hand table is\n * only viable because `StructuredPromptFields` is a small hand-authored type.\n * The subject vocabulary is ~54 catalog-derived fields PLUS deployment-registered\n * pack dimensions unknown at compile time, so it is read from the registry at\n * call time. Iterating the KEY SET (never `Object.keys(value)`) is also what\n * keeps an adversarial blob's key count off the hot path.\n *\n * The SEMANTIC per-dimension cap stays the renderer's job\n * (`normalizeSubjectFields`), exactly as `maxPicks` does for direction: this\n * reader bounds cardinality only. `customAge` is the one number on the wire and\n * is passed through finite-only — the renderer clamps it.\n */\nexport function readSubjectFields(value: unknown): SubjectFields | undefined {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return undefined\n const src = value as Record<string, unknown>\n const out: Record<string, string | string[] | number> = {}\n for (const key of getRegisteredSubjectKeys()) {\n const v = src[key]\n if (key === SUBJECT_CUSTOM_AGE_KEY) {\n if (typeof v === \"number\" && Number.isFinite(v)) out[key] = v\n continue\n }\n if (typeof v === \"string\") {\n if (v.length > 0 && v.length <= SUBJECT_ID_MAX_CHARS) out[key] = v\n } else if (Array.isArray(v)) {\n // Junk is filtered BEFORE the cap, so valid ids sitting behind malformed\n // entries survive rather than being crowded out by them.\n const kept: string[] = []\n for (const x of v) {\n if (kept.length >= SUBJECT_ARRAY_CEILING) break\n if (typeof x === \"string\" && x.length > 0 && x.length <= SUBJECT_ID_MAX_CHARS) {\n kept.push(x)\n }\n }\n if (kept.length > 0) out[key] = kept\n }\n }\n return Object.keys(out).length > 0 ? (out as SubjectFields) : undefined\n}\n\n// ── structured ───────────────────────────────────────────────────────────────\n\ntype FieldKind = \"string\" | \"number\" | \"gender\"\nconst GENDERS = [\"man\", \"woman\", \"child\", \"non-binary\"] as const\nconst MAX_STRUCTURED_VALUE_CHARS = 200\n\ntype Group = Exclude<keyof StructuredPromptFields, \"mood\">\ntype GroupFields<K extends Group> = Record<keyof NonNullable<StructuredPromptFields[K]>, FieldKind>\n\n/**\n * A FIELD-BY-FIELD table (not a registry walk) on purpose:\n * `StructuredPromptFields` is a small HAND-AUTHORED type, not catalog-derived,\n * and the table is what blocks `person: { age: \"drop table\" }` from rendering\n * verbatim into `jobs.input_data.prompt` — `renderStructuredFields` never\n * throws on junk, but it does render it. Totality is enforced by the\n * `GroupFields<K>` / `{ [K in Group]: … }` mapped types: a new field or group\n * on the published type fails to typecheck here.\n */\nconst PERSON_FIELDS: GroupFields<\"person\"> = {\n age: \"number\",\n gender: \"gender\",\n hair: \"string\",\n eyes: \"string\",\n expression: \"string\",\n profession: \"string\",\n warriorType: \"string\",\n}\nconst STYLING_FIELDS: GroupFields<\"styling\"> = {\n mood: \"string\",\n lighting: \"string\",\n aesthetic: \"string\",\n colorLook: \"string\",\n}\nconst SETTING_FIELDS: GroupFields<\"setting\"> = {\n era: \"string\",\n atmosphere: \"string\",\n backdrop: \"string\",\n}\nconst CAMERA_FIELDS: GroupFields<\"camera\"> = {\n framing: \"string\",\n motion: \"string\",\n format: \"string\",\n}\nconst LENS_FIELDS: GroupFields<\"lens\"> = { focalLength: \"string\", aperture: \"string\" }\n\nconst STRUCTURED_GROUPS: { [K in Group]: GroupFields<K> } = {\n person: PERSON_FIELDS,\n styling: STYLING_FIELDS,\n setting: SETTING_FIELDS,\n camera: CAMERA_FIELDS,\n lens: LENS_FIELDS,\n}\n\nfunction readField(v: unknown, kind: FieldKind): string | number | undefined {\n if (kind === \"number\") return typeof v === \"number\" && Number.isFinite(v) ? v : undefined\n if (typeof v !== \"string\" || v.length === 0 || v.length > MAX_STRUCTURED_VALUE_CHARS) {\n return undefined\n }\n if (kind === \"gender\") return (GENDERS as readonly string[]).includes(v) ? v : undefined\n return v\n}\n\n/** Read a node's stored Path-1 structured prompt fields. Same drop-never-throw\n * and `undefined`-never-`{}` contract as `readDirectionFields`. */\nexport function readStructuredFields(value: unknown): StructuredPromptFields | undefined {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return undefined\n const src = value as Record<string, unknown>\n const out: Record<string, unknown> = {}\n for (const group of Object.keys(STRUCTURED_GROUPS) as Group[]) {\n const raw = src[group]\n if (typeof raw !== \"object\" || raw === null || Array.isArray(raw)) continue\n const rawRec = raw as Record<string, unknown>\n const kept: Record<string, unknown> = {}\n for (const [field, kind] of Object.entries(\n STRUCTURED_GROUPS[group] as Record<string, FieldKind>,\n )) {\n const v = readField(rawRec[field], kind)\n if (v !== undefined) kept[field] = v\n }\n if (Object.keys(kept).length > 0) out[group] = kept\n }\n const mood = readField(src.mood, \"string\")\n if (mood !== undefined) out.mood = mood\n return Object.keys(out).length > 0 ? (out as StructuredPromptFields) : undefined\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/read-node-direction.ts"],"names":["DIRECTION_FIELDS","DIRECTION_ID_MAX_CHARS","DIRECTION_ARRAY_CEILING","getRegisteredSubjectKeys","SUBJECT_CUSTOM_AGE_KEY","SUBJECT_ID_MAX_CHARS","SUBJECT_ARRAY_CEILING"],"mappings":"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","file":"chunk-2MTFPGQC.cjs","sourcesContent":["/**\n * Narrow readers turning UNTRUSTED persisted node data (`workflows.nodes`\n * JSONB — import, MCP write, node preset, a Studio-emitted graph) into the\n * typed `subject` / `direction` / `structured` levers `assembleImageInput`\n * accepts.\n * `buildPayload` has no zod and workflow writes are\n * `z.record(z.string(), z.unknown())`, so this blob may have been written years\n * ago by any client.\n *\n * Used by ALL THREE image-assembly sites so what the canvas accepts cannot\n * drift between them: the frontend single-node executor (`execute-node.ts`),\n * the orchestrator (`payload-builder.ts`), and the config-panel final-prompt\n * preview (`build-image-assemble-input.ts`).\n *\n * `readDirectionFields` is DERIVED FROM `DIRECTION_FIELDS`, never a hand list:\n * a dimension added to the registry is honored here by construction, so the\n * reader can never silently drop a key the wire schema and the renderer both\n * know about. Anything unrecognised is DROPPED, never thrown on — a malformed\n * blob must not fail a canvas run, and an unknown catalog ID already degrades\n * to `\"\"` inside each `get*PromptHint`, so this validates SHAPE only.\n *\n * BOUNDS MATCH THE WIRE SCHEMA where both exist, by SHARED CONSTANT:\n * `DIRECTION_ID_MAX_CHARS` and `DIRECTION_ARRAY_CEILING` are the same two\n * literals the `generate-image` route's `directionSchema` enforces, imported\n * from the registry rather than re-typed here — a body the route accepts and a\n * node the canvas re-runs must not disagree about which strings are ids.\n *\n * DELIBERATELY STRICTER THAN THE WIRE SCHEMA on `structured` values: the\n * route's `structuredPromptFieldsSchema` declares every field as a bare\n * `z.string().optional()` (unbounded), while `MAX_STRUCTURED_VALUE_CHARS` below\n * bounds them at 200. Do not \"fix\" that asymmetry by loosening HERE — this\n * reads a blob any client may have written years ago, and the values land\n * verbatim in `jobs.input_data.prompt`. Tightening the ROUTE instead would be a\n * new 400 on currently-accepted input, so a >200-char structured value stored\n * on a node is dropped on a canvas run while `POST /v1/generate-image` still\n * renders it. That is the one known divergence; it is bounded to a field the\n * canvas UI never writes that long.\n *\n * RETURNS `undefined`, NEVER `{}`: an empty object would still be a *defined*\n * `direction`, and the call sites' `...(x !== undefined ? { x } : {})` spread\n * would then hand `assembleImageInput` a defined-but-empty lever. Returning\n * `undefined` keeps that spread honest and the exact no-op branch taken.\n */\nimport {\n DIRECTION_ARRAY_CEILING,\n DIRECTION_FIELDS,\n DIRECTION_ID_MAX_CHARS,\n type DirectionFields,\n} from \"./direction-registry.js\"\nimport {\n SUBJECT_ARRAY_CEILING,\n SUBJECT_CUSTOM_AGE_KEY,\n SUBJECT_ID_MAX_CHARS,\n getRegisteredSubjectKeys,\n type SubjectFields,\n} from \"./subject-registry.js\"\nimport type { StructuredPromptFields } from \"./prompt-builder-structured-fields.js\"\n\n/**\n * Read a node's stored cinematic-direction ids. Accepts a single id OR an array\n * on every key (multi-pick dimensions carry arrays; a single-pick key may\n * legitimately carry one).\n *\n * The SEMANTIC per-dimension cap stays the renderer's slice (`maxPicks`) — this\n * reader does not know a row's pick budget and must not guess it. But it DOES\n * bound cardinality at `DIRECTION_ARRAY_CEILING`, the same ceiling the wire\n * schema enforces: the value is untrusted persisted JSONB (a node blob is\n * validated only as `z.record(z.string(), z.unknown())` on write), and handing\n * an unbounded array to `renderDirectionHints` would put an `includes`-dedupe\n * scan in front of that slice. Keeping the FIRST `DIRECTION_ARRAY_CEILING`\n * survivors is what the wire door already does to the same input.\n *\n * Junk is filtered BEFORE the cap, so valid ids sitting behind malformed\n * entries survive rather than being crowded out by them.\n */\nexport function readDirectionFields(value: unknown): DirectionFields | undefined {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return undefined\n const src = value as Record<string, unknown>\n const out: Record<string, string | string[]> = {}\n for (const spec of DIRECTION_FIELDS) {\n const v = src[spec.key]\n if (typeof v === \"string\") {\n if (v.length > 0 && v.length <= DIRECTION_ID_MAX_CHARS) out[spec.key] = v\n } else if (Array.isArray(v)) {\n const kept: string[] = []\n for (const x of v) {\n if (kept.length >= DIRECTION_ARRAY_CEILING) break\n if (typeof x === \"string\" && x.length > 0 && x.length <= DIRECTION_ID_MAX_CHARS) {\n kept.push(x)\n }\n }\n if (kept.length > 0) out[spec.key] = kept\n }\n }\n return Object.keys(out).length > 0 ? (out as DirectionFields) : undefined\n}\n\n// ── subject ──────────────────────────────────────────────────────────────────\n\n/**\n * Read a node's stored SUBJECT ids — the flat Person / Styling / prop bag the\n * `subject` channel carries. Same three contracts as `readDirectionFields`:\n * drop-never-throw, `undefined` never `{}`, and bounds shared with the wire\n * door by CONSTANT (`SUBJECT_ID_MAX_CHARS` / `SUBJECT_ARRAY_CEILING`, which are\n * defined AS the direction constants) so a body the route accepts and the same\n * node re-run from the canvas cannot disagree about which strings are ids.\n *\n * DERIVED from `getRegisteredSubjectKeys()`, never a hand-authored field list —\n * that is the whole lesson of `readStructuredFields` below, whose hand table is\n * only viable because `StructuredPromptFields` is a small hand-authored type.\n * The subject vocabulary is ~54 catalog-derived fields PLUS deployment-registered\n * pack dimensions unknown at compile time, so it is read from the registry at\n * call time. Iterating the KEY SET (never `Object.keys(value)`) is also what\n * keeps an adversarial blob's key count off the hot path.\n *\n * The SEMANTIC per-dimension cap stays the renderer's job\n * (`normalizeSubjectFields`), exactly as `maxPicks` does for direction: this\n * reader bounds cardinality only. `customAge` is the one number on the wire and\n * is passed through finite-only — the renderer clamps it.\n */\nexport function readSubjectFields(value: unknown): SubjectFields | undefined {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return undefined\n const src = value as Record<string, unknown>\n const out: Record<string, string | string[] | number> = {}\n for (const key of getRegisteredSubjectKeys()) {\n const v = src[key]\n if (key === SUBJECT_CUSTOM_AGE_KEY) {\n if (typeof v === \"number\" && Number.isFinite(v)) out[key] = v\n continue\n }\n if (typeof v === \"string\") {\n if (v.length > 0 && v.length <= SUBJECT_ID_MAX_CHARS) out[key] = v\n } else if (Array.isArray(v)) {\n // Junk is filtered BEFORE the cap, so valid ids sitting behind malformed\n // entries survive rather than being crowded out by them.\n const kept: string[] = []\n for (const x of v) {\n if (kept.length >= SUBJECT_ARRAY_CEILING) break\n if (typeof x === \"string\" && x.length > 0 && x.length <= SUBJECT_ID_MAX_CHARS) {\n kept.push(x)\n }\n }\n if (kept.length > 0) out[key] = kept\n }\n }\n return Object.keys(out).length > 0 ? (out as SubjectFields) : undefined\n}\n\n// ── structured ───────────────────────────────────────────────────────────────\n\ntype FieldKind = \"string\" | \"number\" | \"gender\"\nconst GENDERS = [\"man\", \"woman\", \"child\", \"non-binary\"] as const\nconst MAX_STRUCTURED_VALUE_CHARS = 200\n\ntype Group = Exclude<keyof StructuredPromptFields, \"mood\">\ntype GroupFields<K extends Group> = Record<keyof NonNullable<StructuredPromptFields[K]>, FieldKind>\n\n/**\n * A FIELD-BY-FIELD table (not a registry walk) on purpose:\n * `StructuredPromptFields` is a small HAND-AUTHORED type, not catalog-derived,\n * and the table is what blocks `person: { age: \"drop table\" }` from rendering\n * verbatim into `jobs.input_data.prompt` — `renderStructuredFields` never\n * throws on junk, but it does render it. Totality is enforced by the\n * `GroupFields<K>` / `{ [K in Group]: … }` mapped types: a new field or group\n * on the published type fails to typecheck here.\n */\nconst PERSON_FIELDS: GroupFields<\"person\"> = {\n age: \"number\",\n gender: \"gender\",\n hair: \"string\",\n eyes: \"string\",\n expression: \"string\",\n profession: \"string\",\n warriorType: \"string\",\n}\nconst STYLING_FIELDS: GroupFields<\"styling\"> = {\n mood: \"string\",\n lighting: \"string\",\n aesthetic: \"string\",\n colorLook: \"string\",\n}\nconst SETTING_FIELDS: GroupFields<\"setting\"> = {\n era: \"string\",\n atmosphere: \"string\",\n backdrop: \"string\",\n}\nconst CAMERA_FIELDS: GroupFields<\"camera\"> = {\n framing: \"string\",\n motion: \"string\",\n format: \"string\",\n}\nconst LENS_FIELDS: GroupFields<\"lens\"> = { focalLength: \"string\", aperture: \"string\" }\n\nconst STRUCTURED_GROUPS: { [K in Group]: GroupFields<K> } = {\n person: PERSON_FIELDS,\n styling: STYLING_FIELDS,\n setting: SETTING_FIELDS,\n camera: CAMERA_FIELDS,\n lens: LENS_FIELDS,\n}\n\nfunction readField(v: unknown, kind: FieldKind): string | number | undefined {\n if (kind === \"number\") return typeof v === \"number\" && Number.isFinite(v) ? v : undefined\n if (typeof v !== \"string\" || v.length === 0 || v.length > MAX_STRUCTURED_VALUE_CHARS) {\n return undefined\n }\n if (kind === \"gender\") return (GENDERS as readonly string[]).includes(v) ? v : undefined\n return v\n}\n\n/** Read a node's stored Path-1 structured prompt fields. Same drop-never-throw\n * and `undefined`-never-`{}` contract as `readDirectionFields`. */\nexport function readStructuredFields(value: unknown): StructuredPromptFields | undefined {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return undefined\n const src = value as Record<string, unknown>\n const out: Record<string, unknown> = {}\n for (const group of Object.keys(STRUCTURED_GROUPS) as Group[]) {\n const raw = src[group]\n if (typeof raw !== \"object\" || raw === null || Array.isArray(raw)) continue\n const rawRec = raw as Record<string, unknown>\n const kept: Record<string, unknown> = {}\n for (const [field, kind] of Object.entries(\n STRUCTURED_GROUPS[group] as Record<string, FieldKind>,\n )) {\n const v = readField(rawRec[field], kind)\n if (v !== undefined) kept[field] = v\n }\n if (Object.keys(kept).length > 0) out[group] = kept\n }\n const mood = readField(src.mood, \"string\")\n if (mood !== undefined) out.mood = mood\n return Object.keys(out).length > 0 ? (out as StructuredPromptFields) : undefined\n}\n"]}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkP5HAPDV3_cjs = require('./chunk-P5HAPDV3.cjs');
|
|
4
4
|
var chunkXUZXBY75_cjs = require('./chunk-XUZXBY75.cjs');
|
|
5
5
|
var chunk2NJTFCKQ_cjs = require('./chunk-2NJTFCKQ.cjs');
|
|
6
|
-
var
|
|
7
|
-
var
|
|
8
|
-
var
|
|
6
|
+
var chunkBHBZN2AP_cjs = require('./chunk-BHBZN2AP.cjs');
|
|
7
|
+
var chunkXMRDZRGV_cjs = require('./chunk-XMRDZRGV.cjs');
|
|
8
|
+
var chunkFEHXLXAV_cjs = require('./chunk-FEHXLXAV.cjs');
|
|
9
9
|
var entities = require('@nodaro/shared/entities');
|
|
10
10
|
var models = require('@nodaro/shared/models');
|
|
11
11
|
var video = require('@nodaro/shared/video');
|
|
@@ -80,16 +80,78 @@ function resolveRefIdTokens(prompt, ctx) {
|
|
|
80
80
|
return label ?? "";
|
|
81
81
|
}).replace(MALFORMED_REF_ID_TOKEN_RE, "");
|
|
82
82
|
}
|
|
83
|
+
function identityDescription(mode, override, canonical, injection) {
|
|
84
|
+
if (mode === "none" || mode === "name") return "";
|
|
85
|
+
const parts = [];
|
|
86
|
+
const o = override?.trim();
|
|
87
|
+
const c = canonical?.trim();
|
|
88
|
+
if (o) parts.push(o);
|
|
89
|
+
else if ((mode === "identical" || mode === "face-pose") && c) parts.push(c);
|
|
90
|
+
const i = injection?.trim();
|
|
91
|
+
if (i) parts.push(i);
|
|
92
|
+
return parts.join(". ");
|
|
93
|
+
}
|
|
94
|
+
function resolveSeatlessAssets(args) {
|
|
95
|
+
const bySlug = /* @__PURE__ */ new Map();
|
|
96
|
+
for (const r of args.wiredCharRefs) {
|
|
97
|
+
if (r.source !== "wired-character" || !r.characterSlug) continue;
|
|
98
|
+
const known = bySlug.get(r.characterSlug);
|
|
99
|
+
if (!known || known.variantSlug && !r.variantSlug) bySlug.set(r.characterSlug, r);
|
|
100
|
+
}
|
|
101
|
+
const nameOf = (slug) => {
|
|
102
|
+
const r = bySlug.get(slug);
|
|
103
|
+
return r?.defaultName || r?.characterSlug || slug;
|
|
104
|
+
};
|
|
105
|
+
let prompt = args.prompt;
|
|
106
|
+
const mentioned = /* @__PURE__ */ new Set();
|
|
107
|
+
if (prompt && bySlug.size > 0) {
|
|
108
|
+
const tokens = entities.findCharacterMentionTokens(prompt, [...bySlug.keys()]);
|
|
109
|
+
for (const t of [...tokens].sort((a, b) => b.offset - a.offset)) {
|
|
110
|
+
mentioned.add(t.characterSlug);
|
|
111
|
+
prompt = prompt.slice(0, t.offset) + nameOf(t.characterSlug) + prompt.slice(t.offset + t.token.length);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
const identities = [];
|
|
115
|
+
const described = /* @__PURE__ */ new Set();
|
|
116
|
+
const describe = (slug, name, description) => {
|
|
117
|
+
if (described.has(slug)) return;
|
|
118
|
+
described.add(slug);
|
|
119
|
+
if (description) identities.push({ name, description });
|
|
120
|
+
};
|
|
121
|
+
for (const [slug, r] of bySlug) {
|
|
122
|
+
const shown = !args.suppressedCanonicalSlugs.has(slug) || mentioned.has(slug);
|
|
123
|
+
if (!shown) continue;
|
|
124
|
+
describe(
|
|
125
|
+
slug,
|
|
126
|
+
nameOf(slug),
|
|
127
|
+
identityDescription(r.defaultUsageMode ?? entities.DEFAULT_USAGE_MODE, r.descriptionOverride, r.characterCanonicalDescription, r.elementInjection)
|
|
128
|
+
);
|
|
129
|
+
}
|
|
130
|
+
const extraNamesById = /* @__PURE__ */ new Map();
|
|
131
|
+
for (const ex of args.extraRefs ?? []) {
|
|
132
|
+
if (!ex.characterSlug) continue;
|
|
133
|
+
const meta = args.lookupCharacterBySlug?.(ex.characterSlug);
|
|
134
|
+
const name = bySlug.has(ex.characterSlug) ? nameOf(ex.characterSlug) : meta?.characterName || ex.characterSlug;
|
|
135
|
+
if (ex.id) extraNamesById.set(ex.id, name);
|
|
136
|
+
const own = (ex.descriptionOverride ?? "").trim() || (ex.description ?? "").trim();
|
|
137
|
+
describe(
|
|
138
|
+
ex.characterSlug,
|
|
139
|
+
name,
|
|
140
|
+
identityDescription(ex.usageMode ?? meta?.defaultUsageMode ?? entities.DEFAULT_USAGE_MODE, own, meta?.canonicalDescription, ex.elementInjection)
|
|
141
|
+
);
|
|
142
|
+
}
|
|
143
|
+
return { prompt, identities, extraNamesById };
|
|
144
|
+
}
|
|
83
145
|
|
|
84
146
|
// src/video-reference-resolver.ts
|
|
85
147
|
var REFERENCE_TOKEN_RE = /\{(image|video|audio):(\d+)(?::([a-zA-Z0-9_ -]+))?\}/gi;
|
|
86
148
|
function resolveReferenceTokens(prompt, counts) {
|
|
87
149
|
if (!prompt) return prompt;
|
|
88
|
-
return
|
|
150
|
+
return chunkP5HAPDV3_cjs.tidyReferenceTokenGaps(
|
|
89
151
|
prompt.replace(REFERENCE_TOKEN_RE, (_match, rawKind, nStr, label) => {
|
|
90
152
|
const kind = rawKind.toLowerCase();
|
|
91
153
|
const n = parseInt(nStr, 10);
|
|
92
|
-
if (n < 1 || n > counts[kind]) return
|
|
154
|
+
if (n < 1 || n > counts[kind]) return chunkP5HAPDV3_cjs.unboundReferenceTokenText(label);
|
|
93
155
|
if (label) return REF_BINDING[kind](label, n);
|
|
94
156
|
return `@${kind}_${n}`;
|
|
95
157
|
})
|
|
@@ -148,7 +210,7 @@ function resolveVideoCharacterMentionsHybrid(prompt, tokens, refs, offset) {
|
|
|
148
210
|
const binding = bindingFor(m.url);
|
|
149
211
|
const lock = chunk2NJTFCKQ_cjs.buildIdentityLockLine(chunk2NJTFCKQ_cjs.withForcedIdentityLock(ref, lockOverrideByUrl.get(m.url)), binding);
|
|
150
212
|
if (lock) lockLines.push(lock);
|
|
151
|
-
const overrideLine =
|
|
213
|
+
const overrideLine = chunkP5HAPDV3_cjs.referenceDescriptionLine(binding, ref.descriptionOverride);
|
|
152
214
|
if (overrideLine) elementDirectives.push(overrideLine);
|
|
153
215
|
const inject = ref.elementInjection?.trim();
|
|
154
216
|
if (inject) elementDirectives.push(inject);
|
|
@@ -175,9 +237,18 @@ function resolveVideoReferenceCore(args) {
|
|
|
175
237
|
video: args.videoRefCount ?? 0,
|
|
176
238
|
audio: args.audioRefCount ?? 0
|
|
177
239
|
});
|
|
240
|
+
const seatless = args.assetsTakeNoSeat === true ? resolveSeatlessAssets({
|
|
241
|
+
prompt: args.prompt,
|
|
242
|
+
wiredCharRefs: args.wiredCharRefs,
|
|
243
|
+
suppressedCanonicalSlugs: new Set(args.suppressedCanonicalCharacterIds ?? []),
|
|
244
|
+
extraRefs: args.extraRefs,
|
|
245
|
+
lookupCharacterBySlug: args.lookupCharacterBySlug
|
|
246
|
+
}) : void 0;
|
|
178
247
|
const describedAndCaptionLines = [
|
|
179
|
-
...
|
|
180
|
-
|
|
248
|
+
...chunkP5HAPDV3_cjs.renderDescribedReferenceLines(
|
|
249
|
+
seatless ? [...seatless.identities, ...args.describedReferences ?? []] : args.describedReferences
|
|
250
|
+
),
|
|
251
|
+
...chunkP5HAPDV3_cjs.renderReferenceCaptionLines(args.videoCaptions, args.audioCaptions, {
|
|
181
252
|
video: args.videoRefCount ?? 0,
|
|
182
253
|
audio: args.audioRefCount ?? 0
|
|
183
254
|
})
|
|
@@ -200,21 +271,22 @@ function resolveVideoReferenceCore(args) {
|
|
|
200
271
|
for (const ex of args.extraRefs ?? []) {
|
|
201
272
|
if (ex.id && !nameByRefId.has(ex.id)) nameByRefId.set(ex.id, "");
|
|
202
273
|
}
|
|
274
|
+
for (const [id, name] of seatless?.extraNamesById ?? []) nameByRefId.set(id, name);
|
|
203
275
|
for (const [id, name] of args.refNamesById ?? []) {
|
|
204
276
|
if (id) nameByRefId.set(id, name);
|
|
205
277
|
}
|
|
206
278
|
const slotByRefId = /* @__PURE__ */ new Map();
|
|
207
|
-
if (wiredCharRefs.length === 0 && !hasExtras) {
|
|
279
|
+
if (seatless || wiredCharRefs.length === 0 && !hasExtras) {
|
|
208
280
|
const counts = tokenCounts(leadingRefUrls.length);
|
|
209
281
|
const resolved2 = resolveReferenceTokens(
|
|
210
|
-
resolveRefIdTokens(args.prompt, { slotById: slotByRefId, nameById: nameByRefId, imageCount: counts.image }),
|
|
282
|
+
resolveRefIdTokens(seatless ? seatless.prompt : args.prompt, { slotById: slotByRefId, nameById: nameByRefId, imageCount: counts.image }),
|
|
211
283
|
counts
|
|
212
284
|
);
|
|
213
285
|
return {
|
|
214
286
|
// Described references and rail captions are the ONE thing this branch can
|
|
215
287
|
// still contribute: they need no seat, so a request that carries only them
|
|
216
288
|
// (a story landing before any entity exists) reaches the model here.
|
|
217
|
-
prompt: describedAndCaptionLines.length > 0 ?
|
|
289
|
+
prompt: describedAndCaptionLines.length > 0 ? chunkP5HAPDV3_cjs.appendReferenceLines(resolved2 ?? "", describedAndCaptionLines, args.hybridRoles === true ? "hybrid" : "legacy") : resolved2,
|
|
218
290
|
additionalUrls: [...leadingRefUrls]
|
|
219
291
|
};
|
|
220
292
|
}
|
|
@@ -235,7 +307,7 @@ function resolveVideoReferenceCore(args) {
|
|
|
235
307
|
mentionLockLines = h.lockLines;
|
|
236
308
|
mentionElementDirectives = h.elementDirectives;
|
|
237
309
|
} else {
|
|
238
|
-
resolved = mentionTokens.length > 0 ?
|
|
310
|
+
resolved = mentionTokens.length > 0 ? chunkP5HAPDV3_cjs.resolveCharacterMentions(promptForResolution, mentionTokens, wiredCharRefs) : { prompt: promptForResolution, additionalUrls: [], mentionedCharacterSlugs: /* @__PURE__ */ new Set() };
|
|
239
311
|
}
|
|
240
312
|
const fallbackUrls = [];
|
|
241
313
|
const fallbackDirectiveLines = [];
|
|
@@ -272,7 +344,7 @@ function resolveVideoReferenceCore(args) {
|
|
|
272
344
|
canonicalPhrases.push(entities.roleToPhrase(entities.resolveDefaultRole(r.defaultRole, r.defaultUsageMode, r.source), binding));
|
|
273
345
|
const lock = chunk2NJTFCKQ_cjs.buildIdentityLockLine(r, binding);
|
|
274
346
|
if (lock) canonicalLockLines.push(lock);
|
|
275
|
-
const overrideLine =
|
|
347
|
+
const overrideLine = chunkP5HAPDV3_cjs.referenceDescriptionLine(binding, r.descriptionOverride);
|
|
276
348
|
if (overrideLine) canonicalElementDirectives.push(overrideLine);
|
|
277
349
|
const inject = r.elementInjection?.trim();
|
|
278
350
|
if (inject) canonicalElementDirectives.push(inject);
|
|
@@ -404,7 +476,7 @@ function resolveVideoReferenceCore(args) {
|
|
|
404
476
|
const lockBlock = lockLines.length > 0 ? `${lockLines.join("\n")}
|
|
405
477
|
|
|
406
478
|
` : "";
|
|
407
|
-
finalPrompt = `${lockBlock}${
|
|
479
|
+
finalPrompt = `${lockBlock}${chunkP5HAPDV3_cjs.insertBeforeStyleSection(finalPrompt, trailingLines)}`;
|
|
408
480
|
} else {
|
|
409
481
|
const allFallbackLines = [...fallbackDirectiveLines, ...extraDirectiveLines];
|
|
410
482
|
if (allFallbackLines.length > 0) {
|
|
@@ -454,7 +526,7 @@ ${finalPrompt}` : block;
|
|
|
454
526
|
merged.push(u);
|
|
455
527
|
}
|
|
456
528
|
}
|
|
457
|
-
finalPrompt =
|
|
529
|
+
finalPrompt = chunkP5HAPDV3_cjs.appendReferenceLines(
|
|
458
530
|
finalPrompt,
|
|
459
531
|
describedAndCaptionLines,
|
|
460
532
|
hybrid ? "hybrid" : "legacy"
|
|
@@ -482,7 +554,7 @@ ${finalPrompt}` : block;
|
|
|
482
554
|
});
|
|
483
555
|
}
|
|
484
556
|
}
|
|
485
|
-
const reordered =
|
|
557
|
+
const reordered = chunkP5HAPDV3_cjs.applyReferenceOrderToVideo(assetUrls, finalPrompt, refsForOrdering, referenceOrder, void 0, offset);
|
|
486
558
|
return {
|
|
487
559
|
prompt: resolveReferenceTokens(reordered.prompt, tokenCounts(merged.length)),
|
|
488
560
|
additionalUrls: [...leadingRefUrls, ...reordered.urls]
|
|
@@ -536,7 +608,7 @@ function composeSoundHintFromConnections(consumer, consumerType, ctx) {
|
|
|
536
608
|
continue;
|
|
537
609
|
}
|
|
538
610
|
}
|
|
539
|
-
const hint =
|
|
611
|
+
const hint = chunkBHBZN2AP_cjs.getParameterPromptHint(src);
|
|
540
612
|
if (hint) acceptedHints.push(hint);
|
|
541
613
|
if ((consumerType === "suno-generate" || consumerType === "generate-music") && t === "voice-character" && src.data) {
|
|
542
614
|
const gender = src.data.gender;
|
|
@@ -550,14 +622,14 @@ function composeSoundHintFromConnections(consumer, consumerType, ctx) {
|
|
|
550
622
|
const sub = typeof data.subgenre === "string" ? data.subgenre : void 0;
|
|
551
623
|
const genreId = typeof data.genre === "string" ? data.genre : void 0;
|
|
552
624
|
const eraId = typeof data.era === "string" ? data.era : void 0;
|
|
553
|
-
const eraHint =
|
|
554
|
-
const genre =
|
|
625
|
+
const eraHint = chunkFEHXLXAV_cjs.getMusicEra(eraId)?.promptHint;
|
|
626
|
+
const genre = chunkFEHXLXAV_cjs.getMusicGenre(genreId);
|
|
555
627
|
const subHint = genre?.subgenres.find((s) => s.id === sub)?.promptHint ?? genre?.promptHint;
|
|
556
628
|
const composed = [eraHint, subHint].filter(Boolean).join(" ");
|
|
557
629
|
if (composed && !fields.genre) Object.assign(fields, { genre: composed });
|
|
558
630
|
}
|
|
559
631
|
if (t === "music-mood" && data) {
|
|
560
|
-
const composed =
|
|
632
|
+
const composed = chunkFEHXLXAV_cjs.buildMusicMoodHints({
|
|
561
633
|
energy: typeof data.energy === "string" ? data.energy : void 0,
|
|
562
634
|
emotion: data.emotion,
|
|
563
635
|
vibe: data.vibe
|
|
@@ -644,23 +716,23 @@ function assembleSunoInput(input) {
|
|
|
644
716
|
function renderImageHintPieces(subject, direction, structured, directionRefs) {
|
|
645
717
|
return {
|
|
646
718
|
hintClauses: [
|
|
647
|
-
...
|
|
648
|
-
|
|
719
|
+
...chunkP5HAPDV3_cjs.asBodyClauses(
|
|
720
|
+
chunkP5HAPDV3_cjs.renderSubjectHints(subject, {
|
|
649
721
|
surface: "image",
|
|
650
|
-
mode:
|
|
722
|
+
mode: chunkP5HAPDV3_cjs.SUBJECT_IMAGE_HINT_MODE_DEFAULT
|
|
651
723
|
})
|
|
652
724
|
),
|
|
653
|
-
...
|
|
725
|
+
...chunkP5HAPDV3_cjs.partitionStyleClauses(direction, {
|
|
654
726
|
surface: "image",
|
|
655
|
-
mode:
|
|
727
|
+
mode: chunkXMRDZRGV_cjs.IMAGE_HINT_MODE_DEFAULT,
|
|
656
728
|
...directionRefs !== void 0 ? { refs: directionRefs } : {}
|
|
657
729
|
})
|
|
658
730
|
].filter((c) => c.text.length > 0),
|
|
659
|
-
structuredFragment: structured ?
|
|
731
|
+
structuredFragment: structured ? chunkP5HAPDV3_cjs.renderStructuredFields(structured) : ""
|
|
660
732
|
};
|
|
661
733
|
}
|
|
662
734
|
function composePromptText(userPrompt, pieces, keptHintClauses) {
|
|
663
|
-
return
|
|
735
|
+
return chunkP5HAPDV3_cjs.composeSectionedPrompt(
|
|
664
736
|
userPrompt,
|
|
665
737
|
pieces.hintClauses.slice(0, keptHintClauses),
|
|
666
738
|
pieces.structuredFragment
|
|
@@ -707,12 +779,12 @@ function styleConnectedReference(s, index) {
|
|
|
707
779
|
url: s.url,
|
|
708
780
|
isExtraRef: true,
|
|
709
781
|
defaultRole: "style",
|
|
710
|
-
description:
|
|
782
|
+
description: chunkXMRDZRGV_cjs.styleReferenceDescription(index, s.caption)
|
|
711
783
|
};
|
|
712
784
|
}
|
|
713
785
|
function assembleOnce(input) {
|
|
714
786
|
const pieces = renderImageHintPieces(input.subject, input.direction, input.structured, input.directionRefs);
|
|
715
|
-
const assembleWith = (keptHintClauses) =>
|
|
787
|
+
const assembleWith = (keptHintClauses) => chunkP5HAPDV3_cjs.buildImagePromptWithOverflow({
|
|
716
788
|
prompt: composePromptText(input.userPrompt, pieces, keptHintClauses),
|
|
717
789
|
provider: input.provider,
|
|
718
790
|
...input.connectedReferences !== void 0 ? { connectedReferences: input.connectedReferences } : {},
|
|
@@ -740,7 +812,7 @@ function assembleOnce(input) {
|
|
|
740
812
|
let kept = pieces.hintClauses.length;
|
|
741
813
|
let fitted = assembleWith(kept);
|
|
742
814
|
if (fitted.overflowChars > 0) {
|
|
743
|
-
const costs =
|
|
815
|
+
const costs = chunkP5HAPDV3_cjs.sectionedClauseCosts(
|
|
744
816
|
input.userPrompt,
|
|
745
817
|
pieces.hintClauses,
|
|
746
818
|
pieces.structuredFragment
|
|
@@ -758,19 +830,19 @@ function assembleOnce(input) {
|
|
|
758
830
|
// src/assemble-video-input.ts
|
|
759
831
|
function composeVideoPromptText(userPrompt, direction, structured, opts) {
|
|
760
832
|
const hintClauses = [
|
|
761
|
-
...
|
|
762
|
-
|
|
833
|
+
...chunkP5HAPDV3_cjs.asBodyClauses(
|
|
834
|
+
chunkP5HAPDV3_cjs.renderSubjectHints(opts?.subject, {
|
|
763
835
|
surface: "video",
|
|
764
|
-
mode: opts?.subjectHintMode ??
|
|
836
|
+
mode: opts?.subjectHintMode ?? chunkP5HAPDV3_cjs.SUBJECT_VIDEO_HINT_MODE_DEFAULT
|
|
765
837
|
})
|
|
766
838
|
),
|
|
767
|
-
...
|
|
839
|
+
...chunkP5HAPDV3_cjs.partitionStyleClauses(direction, {
|
|
768
840
|
surface: "video",
|
|
769
|
-
mode: opts?.hintMode ??
|
|
841
|
+
mode: opts?.hintMode ?? chunkXMRDZRGV_cjs.VIDEO_HINT_MODE_DEFAULT
|
|
770
842
|
})
|
|
771
843
|
].filter((c) => c.text.length > 0);
|
|
772
|
-
const structuredFragment = structured ?
|
|
773
|
-
const composeWith = (kept2) =>
|
|
844
|
+
const structuredFragment = structured ? chunkP5HAPDV3_cjs.renderStructuredFields(structured) : "";
|
|
845
|
+
const composeWith = (kept2) => chunkP5HAPDV3_cjs.composeSectionedPrompt(userPrompt, hintClauses.slice(0, kept2), structuredFragment);
|
|
774
846
|
const cap = opts?.cap;
|
|
775
847
|
if (cap === void 0) return composeWith(hintClauses.length);
|
|
776
848
|
const frame = opts?.frame ?? ((body2) => body2);
|
|
@@ -778,7 +850,7 @@ function composeVideoPromptText(userPrompt, direction, structured, opts) {
|
|
|
778
850
|
let body = composeWith(kept);
|
|
779
851
|
let framedLength = frame(body)?.length ?? 0;
|
|
780
852
|
if (framedLength <= cap) return body;
|
|
781
|
-
const costs =
|
|
853
|
+
const costs = chunkP5HAPDV3_cjs.sectionedClauseCosts(userPrompt, hintClauses, structuredFragment);
|
|
782
854
|
const texts = hintClauses.map((c) => c.text);
|
|
783
855
|
while (framedLength > cap && kept > 0) {
|
|
784
856
|
kept = chunkXUZXBY75_cjs.keepableDirectionHints(texts, kept, framedLength - cap, costs);
|
|
@@ -1002,5 +1074,5 @@ exports.resolveSeedance2Inputs = resolveSeedance2Inputs;
|
|
|
1002
1074
|
exports.resolveVeoI2vInputs = resolveVeoI2vInputs;
|
|
1003
1075
|
exports.resolveVideoReferenceCore = resolveVideoReferenceCore;
|
|
1004
1076
|
exports.truncateForField = truncateForField;
|
|
1005
|
-
//# sourceMappingURL=chunk-
|
|
1006
|
-
//# sourceMappingURL=chunk-
|
|
1077
|
+
//# sourceMappingURL=chunk-32BMZ4Q5.cjs.map
|
|
1078
|
+
//# sourceMappingURL=chunk-32BMZ4Q5.cjs.map
|