@nodaro/prompts 1.10.0 → 1.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/dist/index.cjs +693 -53
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.d.cts +1084 -27
  4. package/dist/index.d.ts +1084 -27
  5. package/dist/index.js +664 -55
  6. package/dist/index.js.map +1 -1
  7. package/package.json +2 -2
  8. package/src/__tests__/__snapshots__/entity-convergence-image.test.ts.snap +19 -0
  9. package/src/__tests__/animal-getters-parity.test.ts +82 -0
  10. package/src/__tests__/assemble-image-input-cap.test.ts +212 -0
  11. package/src/__tests__/assemble-image-input.test.ts +93 -3
  12. package/src/__tests__/assemble-video-input-cap.test.ts +356 -0
  13. package/src/__tests__/assemble-video-input.test.ts +301 -0
  14. package/src/__tests__/direction-hint-token-safety.test.ts +113 -0
  15. package/src/__tests__/direction-registry.test.ts +393 -0
  16. package/src/__tests__/entity-convergence-image.test.ts +374 -0
  17. package/src/__tests__/image-convergence-image.test.ts +370 -0
  18. package/src/__tests__/location-convergence-image.test.ts +29 -1
  19. package/src/__tests__/location-default-role-image.test.ts +166 -0
  20. package/src/__tests__/mention-splice-spacing.test.ts +257 -0
  21. package/src/__tests__/read-node-direction.test.ts +154 -0
  22. package/src/__tests__/read-node-subject.test.ts +140 -0
  23. package/src/__tests__/subject-fold.test.ts +232 -0
  24. package/src/__tests__/subject-registry.test.ts +312 -0
  25. package/src/assemble-image-input.ts +160 -58
  26. package/src/assemble-video-input.ts +244 -0
  27. package/src/direction-registry.ts +371 -0
  28. package/src/hint-shedding.ts +68 -0
  29. package/src/index.ts +10 -2
  30. package/src/parameter-prompt-hint.ts +8 -7
  31. package/src/picker-catalogs.ts +14 -7
  32. package/src/prompt-builder.ts +728 -58
  33. package/src/prompt-hint-join.ts +30 -0
  34. package/src/read-node-direction.ts +233 -0
  35. package/src/subject-registry.ts +464 -0
package/dist/index.d.cts CHANGED
@@ -859,6 +859,12 @@ interface BuildImagePromptConfig {
859
859
  * (`flux-lora-character`) — the trigger word + LoRA carries identity, so
860
860
  * the directive bullets are redundant and the wired-character refs
861
861
  * shouldn't be injected as `Image N`.
862
+ *
863
+ * The strip regex is grammar-agnostic — it eats LOCATION and named-IMAGE
864
+ * mentions (`@town:3:background`) as well as character ones. That is
865
+ * INTENDED, not an oversight: this path drops `connectedReferences` outright,
866
+ * so there is no reference left for any mention to bind to and a surviving
867
+ * token would reach the model as literal noise. Do not narrow it.
862
868
  */
863
869
  skipCharacterMentions?: boolean;
864
870
  }
@@ -890,6 +896,28 @@ interface BuildImagePromptSegmentsResult extends BuildImagePromptResult {
890
896
  * origin-tagged decomposition.
891
897
  */
892
898
  declare function buildImagePrompt(config: BuildImagePromptConfig): BuildImagePromptResult;
899
+ /** {@link buildImagePrompt} plus `overflowChars`. */
900
+ interface BuildImagePromptOverflowResult extends BuildImagePromptResult {
901
+ /**
902
+ * Characters the provider's prompt cap forced off the tail — `0` when the
903
+ * assembled prompt fit. This is the amount of text that must LEAVE the body
904
+ * for the prompt to fit without a tail cut, so a caller can shed exactly
905
+ * enough of its own droppable text and re-assemble.
906
+ */
907
+ overflowChars: number;
908
+ }
909
+ /**
910
+ * `buildImagePrompt` plus the size of the cap overflow it had to clamp away.
911
+ *
912
+ * The prompt (and every other field) is BYTE-IDENTICAL to `buildImagePrompt` —
913
+ * the marks channel only observes. Exists because the tail clamp is ORDER-BLIND:
914
+ * it cuts whatever happens to be last, which on a low-cap provider can sever a
915
+ * reference directive or the user's own prose while a decorative hint clause
916
+ * survives. `assembleImageInput` uses this to drop its lowest-value text
917
+ * (direction-folded hint clauses) FIRST and re-assemble; the clamp then stays
918
+ * the last-resort fallback for a body that overflows on prose alone.
919
+ */
920
+ declare function buildImagePromptWithOverflow(config: BuildImagePromptConfig): BuildImagePromptOverflowResult;
893
921
  /**
894
922
  * `buildImagePrompt` plus an origin-tagged decomposition of the assembled
895
923
  * `prompt`. The string output (and all other fields) is byte-identical to
@@ -999,6 +1027,768 @@ interface StructuredPromptFields {
999
1027
  */
1000
1028
  declare function renderStructuredFields(fields: StructuredPromptFields): string;
1001
1029
 
1030
+ /**
1031
+ * THE DIRECTION REGISTRY — the single, ordered table of every cinematic
1032
+ * dimension the flat `direction` channel carries, plus the one renderer that
1033
+ * folds it into prompt text.
1034
+ *
1035
+ * WHY IT EXISTS: before this module, five of the ~35 cinematic dimensions rode
1036
+ * the `direction` wire channel and every other dimension was folded into prompt
1037
+ * TEXT by the client. A production copied between clients therefore froze stale
1038
+ * catalog wording, and each client re-implemented the fold. The table below is
1039
+ * the platform-owned replacement: the wire carries ids, the platform renders
1040
+ * the clauses, and the fold ORDER is exported so a client preview cannot drift
1041
+ * from what the server actually emits.
1042
+ *
1043
+ * WIRE VOCABULARY: the keys are the platform's OWN node-data field names — the
1044
+ * ones `SINGLE_PICKER_WIRING[].valueField` and the four `*_FIELD_BY_CATEGORY`
1045
+ * maps already use (`shotSize`, `lightingStyle`, `isoValue`, `style`, `mood`,
1046
+ * `cameraMotion`, …). A Studio-emitted graph and a hand-built canvas node
1047
+ * therefore speak ONE vocabulary for one catalog, and every `build*Hints`
1048
+ * already consumes these names.
1049
+ *
1050
+ * IMPORT RULE (hard): this module imports only `get*PromptHint` / `get*Term` /
1051
+ * `build*Hints` FUNCTIONS — never a raw UPPERCASE catalog array.
1052
+ * `catalog-funnel-ratchet.test.ts` derives its watch set from
1053
+ * `picker-catalogs.ts`'s uppercase value imports and can only SHRINK, so a raw
1054
+ * array import here would be a new offender. Nothing here reads an environment
1055
+ * variable either (`content-free-contract.test.ts`) — verbosity and surface are
1056
+ * threaded parameters, never deployment state.
1057
+ *
1058
+ * DELIBERATELY EXCLUDED, so neither is filed as a gap:
1059
+ * - `characterFx` — a per-shot composer with catalog timing levers
1060
+ * (`composeCharacterFxHintFromConnections`) positioned at an in-prose effect
1061
+ * token, not a bare id. A single-id channel cannot carry it.
1062
+ * - Subject / Styling / prop dimensions (`animal`, `heldProp`, `material`,
1063
+ * Person, Styling) — a separate `subject` channel, deliberately out of scope
1064
+ * here. It now exists: `subject-registry.ts`, same table-driven shape, its
1065
+ * key set DISJOINT from this one (pinned by a test) so nothing folds twice.
1066
+ *
1067
+ * PACK BLINDNESS (parity, not a regression): `get*PromptHint` reads the frozen
1068
+ * base arrays, so ids added by a deployment-registered catalog pack resolve to
1069
+ * `""` and contribute no clause. This is identical to the behavior of the five
1070
+ * keys that shipped before this table; routing through `getPickerCatalog` is a
1071
+ * deliberate non-goal.
1072
+ */
1073
+
1074
+ /** Which generation stages fold a dimension. */
1075
+ type DirectionSurface = "image" | "video" | "both";
1076
+ /** Verbosity family — the video policy folds `motion` compact, `look` full. */
1077
+ type DirectionFamily = "look" | "motion";
1078
+ interface DirectionFieldSpec {
1079
+ /**
1080
+ * Wire key — also the `DirectionFields` property name and the canvas
1081
+ * node-data field name for the same catalog.
1082
+ */
1083
+ readonly key: string;
1084
+ /**
1085
+ * Which generation stages fold this dimension. Filtering happens in the
1086
+ * RENDERER, never in the wire schema: an image-only key sent to
1087
+ * `/v1/generate-video` is accepted and simply contributes no hint.
1088
+ */
1089
+ readonly surface: DirectionSurface;
1090
+ /** Verbosity family. The video policy folds `motion` compact, `look` full. */
1091
+ readonly family: DirectionFamily;
1092
+ /** Ids honored per dimension. Extras are SLICED at render, never a 400. */
1093
+ readonly maxPicks: number;
1094
+ /**
1095
+ * Render selected ids in this catalog's own doctrine: per-id for independent
1096
+ * catalogs, ONE blended clause for Mood / Aesthetic / Photographer, the
1097
+ * catalog's own multi builder where it has one. `[]` when nothing resolves.
1098
+ */
1099
+ readonly render: (ids: readonly string[], mode: PickerHintMode) => string[];
1100
+ }
1101
+ /**
1102
+ * THE TABLE. Declaration order IS fold order (`DIRECTION_KEYS`), pinned by
1103
+ * `__tests__/direction-registry.test.ts`.
1104
+ *
1105
+ * Group order: camera motion leads (matching the video hint order the canvas
1106
+ * and Studio both emit today), then composition → camera → exposure → light →
1107
+ * style → scene → motion, then the LEGACY BLOCK last.
1108
+ *
1109
+ * THE LEGACY BLOCK (the last five rows) is the pre-registry published
1110
+ * `DirectionFields`, placed LAST in today's exact `composePromptText` order so
1111
+ * every existing caller's fold is byte-identical. They are WHOLE-CATALOG keys —
1112
+ * `framingId` accepts ANY `FRAMINGS` id and `lightingId` ANY `LIGHTINGS` id —
1113
+ * so they are NOT aliases of `shotSize` / `lightingStyle`, and an alias table
1114
+ * would wrongly suppress a legal second selection. Overlap is handled instead
1115
+ * by the exact-string dedupe in `renderDirectionHints`.
1116
+ *
1117
+ * SECOND MEANING OF POSITION: BOTH cap-aware assemblers — `assembleImageInput`
1118
+ * (stills) and `composeVideoPromptText` (video) — shed hint clauses from the
1119
+ * TAIL of this order when a provider's prompt cap overflows, through the one
1120
+ * shared arithmetic in `hint-shedding.ts`. So a row's position is also its
1121
+ * survival order under the cap on EVERY surface: reordering rows for one
1122
+ * surface silently changes what the other drops first, and the row a
1123
+ * video-surface reorder would most likely touch (`cameraMotion`) leads the
1124
+ * fold. That is a consequence of reusing the fold order, not a ranking — this
1125
+ * table stays a compatibility order; anything that needs a real importance
1126
+ * ranking should add an explicit priority column rather than reorder these rows.
1127
+ *
1128
+ * WHERE THIS TABLE SITS IN THE COMBINED ORDER: both assemblers fold the SUBJECT
1129
+ * channel (`subject-registry.ts`) BEFORE this one and shed the combined list
1130
+ * tail-first, so every direction row here is dropped before any subject clause.
1131
+ * Deliberate — see `hint-shedding.ts` for the argument.
1132
+ */
1133
+ declare const DIRECTION_FIELDS: readonly [{
1134
+ readonly key: "cameraMotion";
1135
+ readonly surface: "video";
1136
+ readonly family: "motion";
1137
+ readonly maxPicks: 1;
1138
+ readonly render: (ids: readonly string[], mode: PickerHintMode) => string[];
1139
+ }, {
1140
+ readonly key: "shotSize";
1141
+ readonly surface: "both";
1142
+ readonly family: "look";
1143
+ readonly maxPicks: 1;
1144
+ readonly render: (ids: readonly string[], mode: PickerHintMode) => string[];
1145
+ }, {
1146
+ readonly key: "angle";
1147
+ readonly surface: "both";
1148
+ readonly family: "look";
1149
+ readonly maxPicks: 1;
1150
+ readonly render: (ids: readonly string[], mode: PickerHintMode) => string[];
1151
+ }, {
1152
+ readonly key: "coverage";
1153
+ readonly surface: "both";
1154
+ readonly family: "look";
1155
+ readonly maxPicks: 1;
1156
+ readonly render: (ids: readonly string[], mode: PickerHintMode) => string[];
1157
+ }, {
1158
+ readonly key: "composition";
1159
+ readonly surface: "both";
1160
+ readonly family: "look";
1161
+ readonly maxPicks: 2;
1162
+ readonly render: (ids: readonly string[], mode: PickerHintMode) => string[];
1163
+ }, {
1164
+ readonly key: "vantage";
1165
+ readonly surface: "both";
1166
+ readonly family: "look";
1167
+ readonly maxPicks: 1;
1168
+ readonly render: (ids: readonly string[], mode: PickerHintMode) => string[];
1169
+ }, {
1170
+ readonly key: "pose";
1171
+ readonly surface: "both";
1172
+ readonly family: "look";
1173
+ readonly maxPicks: 1;
1174
+ readonly render: (ids: readonly string[], mode: PickerHintMode) => string[];
1175
+ }, {
1176
+ readonly key: "compositionEffect";
1177
+ readonly surface: "both";
1178
+ readonly family: "look";
1179
+ readonly maxPicks: 1;
1180
+ readonly render: (ids: readonly string[], mode: PickerHintMode) => string[];
1181
+ }, {
1182
+ readonly key: "cameraFormat";
1183
+ readonly surface: "both";
1184
+ readonly family: "look";
1185
+ readonly maxPicks: 1;
1186
+ readonly render: (ids: readonly string[], mode: PickerHintMode) => string[];
1187
+ }, {
1188
+ readonly key: "lens";
1189
+ readonly surface: "both";
1190
+ readonly family: "look";
1191
+ readonly maxPicks: 1;
1192
+ readonly render: (ids: readonly string[], mode: PickerHintMode) => string[];
1193
+ }, {
1194
+ readonly key: "aperture";
1195
+ readonly surface: "image";
1196
+ readonly family: "look";
1197
+ readonly maxPicks: 1;
1198
+ readonly render: (ids: readonly string[], mode: PickerHintMode) => string[];
1199
+ }, {
1200
+ readonly key: "shutterSpeed";
1201
+ readonly surface: "image";
1202
+ readonly family: "look";
1203
+ readonly maxPicks: 1;
1204
+ readonly render: (ids: readonly string[], mode: PickerHintMode) => string[];
1205
+ }, {
1206
+ readonly key: "isoValue";
1207
+ readonly surface: "image";
1208
+ readonly family: "look";
1209
+ readonly maxPicks: 1;
1210
+ readonly render: (ids: readonly string[], mode: PickerHintMode) => string[];
1211
+ }, {
1212
+ readonly key: "timeOfDay";
1213
+ readonly surface: "both";
1214
+ readonly family: "look";
1215
+ readonly maxPicks: 1;
1216
+ readonly render: (ids: readonly string[], mode: PickerHintMode) => string[];
1217
+ }, {
1218
+ readonly key: "lightingStyle";
1219
+ readonly surface: "both";
1220
+ readonly family: "look";
1221
+ readonly maxPicks: 2;
1222
+ readonly render: (ids: readonly string[], mode: PickerHintMode) => string[];
1223
+ }, {
1224
+ readonly key: "lightingDirection";
1225
+ readonly surface: "both";
1226
+ readonly family: "look";
1227
+ readonly maxPicks: 1;
1228
+ readonly render: (ids: readonly string[], mode: PickerHintMode) => string[];
1229
+ }, {
1230
+ readonly key: "lightingRatio";
1231
+ readonly surface: "both";
1232
+ readonly family: "look";
1233
+ readonly maxPicks: 1;
1234
+ readonly render: (ids: readonly string[], mode: PickerHintMode) => string[];
1235
+ }, {
1236
+ readonly key: "colorTemperature";
1237
+ readonly surface: "both";
1238
+ readonly family: "look";
1239
+ readonly maxPicks: 1;
1240
+ readonly render: (ids: readonly string[], mode: PickerHintMode) => string[];
1241
+ }, {
1242
+ readonly key: "colorLook";
1243
+ readonly surface: "both";
1244
+ readonly family: "look";
1245
+ readonly maxPicks: 1;
1246
+ readonly render: (ids: readonly string[], mode: PickerHintMode) => string[];
1247
+ }, {
1248
+ readonly key: "atmosphere";
1249
+ readonly surface: "both";
1250
+ readonly family: "look";
1251
+ readonly maxPicks: 2;
1252
+ readonly render: (ids: readonly string[], mode: PickerHintMode) => string[];
1253
+ }, {
1254
+ readonly key: "postProcess";
1255
+ readonly surface: "image";
1256
+ readonly family: "look";
1257
+ readonly maxPicks: 2;
1258
+ readonly render: (ids: readonly string[], mode: PickerHintMode) => string[];
1259
+ }, {
1260
+ readonly key: "style";
1261
+ readonly surface: "both";
1262
+ readonly family: "look";
1263
+ readonly maxPicks: 1;
1264
+ readonly render: (ids: readonly string[], mode: PickerHintMode) => string[];
1265
+ }, {
1266
+ readonly key: "mood";
1267
+ readonly surface: "both";
1268
+ readonly family: "look";
1269
+ readonly maxPicks: 2;
1270
+ readonly render: (ids: readonly string[], mode: PickerHintMode) => string[];
1271
+ }, {
1272
+ readonly key: "aesthetic";
1273
+ readonly surface: "both";
1274
+ readonly family: "look";
1275
+ readonly maxPicks: 2;
1276
+ readonly render: (ids: readonly string[], mode: PickerHintMode) => string[];
1277
+ }, {
1278
+ readonly key: "photoGenre";
1279
+ readonly surface: "image";
1280
+ readonly family: "look";
1281
+ readonly maxPicks: 1;
1282
+ readonly render: (ids: readonly string[], mode: PickerHintMode) => string[];
1283
+ }, {
1284
+ readonly key: "photographer";
1285
+ readonly surface: "image";
1286
+ readonly family: "look";
1287
+ readonly maxPicks: 2;
1288
+ readonly render: (ids: readonly string[], mode: PickerHintMode) => string[];
1289
+ }, {
1290
+ readonly key: "renderQuality";
1291
+ readonly surface: "image";
1292
+ readonly family: "look";
1293
+ readonly maxPicks: 1;
1294
+ readonly render: (ids: readonly string[], mode: PickerHintMode) => string[];
1295
+ }, {
1296
+ readonly key: "setting";
1297
+ readonly surface: "both";
1298
+ readonly family: "look";
1299
+ readonly maxPicks: 1;
1300
+ readonly render: (ids: readonly string[], mode: PickerHintMode) => string[];
1301
+ }, {
1302
+ readonly key: "era";
1303
+ readonly surface: "both";
1304
+ readonly family: "look";
1305
+ readonly maxPicks: 1;
1306
+ readonly render: (ids: readonly string[], mode: PickerHintMode) => string[];
1307
+ }, {
1308
+ readonly key: "backdrop";
1309
+ readonly surface: "both";
1310
+ readonly family: "look";
1311
+ readonly maxPicks: 1;
1312
+ readonly render: (ids: readonly string[], mode: PickerHintMode) => string[];
1313
+ }, {
1314
+ readonly key: "actionFx";
1315
+ readonly surface: "video";
1316
+ readonly family: "motion";
1317
+ readonly maxPicks: 2;
1318
+ readonly render: (ids: readonly string[], mode: PickerHintMode) => string[];
1319
+ }, {
1320
+ readonly key: "temporalSpeed";
1321
+ readonly surface: "video";
1322
+ readonly family: "motion";
1323
+ readonly maxPicks: 1;
1324
+ readonly render: (ids: readonly string[], mode: PickerHintMode) => string[];
1325
+ }, {
1326
+ readonly key: "temporalFreeze";
1327
+ readonly surface: "video";
1328
+ readonly family: "motion";
1329
+ readonly maxPicks: 1;
1330
+ readonly render: (ids: readonly string[], mode: PickerHintMode) => string[];
1331
+ }, {
1332
+ readonly key: "temporalDirection";
1333
+ readonly surface: "video";
1334
+ readonly family: "motion";
1335
+ readonly maxPicks: 1;
1336
+ readonly render: (ids: readonly string[], mode: PickerHintMode) => string[];
1337
+ }, {
1338
+ readonly key: "temporalShutter";
1339
+ readonly surface: "video";
1340
+ readonly family: "motion";
1341
+ readonly maxPicks: 1;
1342
+ readonly render: (ids: readonly string[], mode: PickerHintMode) => string[];
1343
+ }, {
1344
+ readonly key: "transition";
1345
+ readonly surface: "video";
1346
+ readonly family: "motion";
1347
+ readonly maxPicks: 2;
1348
+ readonly render: (ids: readonly string[], mode: PickerHintMode) => string[];
1349
+ }, {
1350
+ readonly key: "loopSubject";
1351
+ readonly surface: "video";
1352
+ readonly family: "motion";
1353
+ readonly maxPicks: 1;
1354
+ readonly render: (ids: readonly string[], mode: PickerHintMode) => string[];
1355
+ }, {
1356
+ readonly key: "framingId";
1357
+ readonly surface: "both";
1358
+ readonly family: "look";
1359
+ readonly maxPicks: 1;
1360
+ readonly render: (ids: readonly string[], mode: PickerHintMode) => string[];
1361
+ }, {
1362
+ readonly key: "framingAngleId";
1363
+ readonly surface: "both";
1364
+ readonly family: "look";
1365
+ readonly maxPicks: 1;
1366
+ readonly render: (ids: readonly string[], mode: PickerHintMode) => string[];
1367
+ }, {
1368
+ readonly key: "lightingId";
1369
+ readonly surface: "both";
1370
+ readonly family: "look";
1371
+ readonly maxPicks: 1;
1372
+ readonly render: (ids: readonly string[], mode: PickerHintMode) => string[];
1373
+ }, {
1374
+ readonly key: "lensId";
1375
+ readonly surface: "both";
1376
+ readonly family: "look";
1377
+ readonly maxPicks: 1;
1378
+ readonly render: (ids: readonly string[], mode: PickerHintMode) => string[];
1379
+ }, {
1380
+ readonly key: "cameraFormatId";
1381
+ readonly surface: "both";
1382
+ readonly family: "look";
1383
+ readonly maxPicks: 1;
1384
+ readonly render: (ids: readonly string[], mode: PickerHintMode) => string[];
1385
+ }];
1386
+ type DirectionFieldRow = (typeof DIRECTION_FIELDS)[number];
1387
+ type DirectionKey = DirectionFieldRow["key"];
1388
+ type ImageDirectionKey = Extract<DirectionFieldRow, {
1389
+ surface: "image" | "both";
1390
+ }>["key"];
1391
+ type VideoDirectionKey = Extract<DirectionFieldRow, {
1392
+ surface: "video" | "both";
1393
+ }>["key"];
1394
+ /**
1395
+ * Flat cinematic-direction ids (Studio / MCP / canvas node data).
1396
+ *
1397
+ * Every key accepts a single id OR an array: multi-pick dimensions always carry
1398
+ * an array, and a single-pick key may legitimately carry one (a client's
1399
+ * partition writer preserving legacy out-of-catalog ids). Absent ≠ empty — a
1400
+ * missing key means "no hint", never a default.
1401
+ */
1402
+ type DirectionFields = {
1403
+ readonly [K in DirectionKey]?: string | readonly string[];
1404
+ };
1405
+ /**
1406
+ * Table order — THE canonical fold order. Exported so a client's "will inject
1407
+ * into prompt" preview folds in the exact order the server does instead of
1408
+ * re-deriving one.
1409
+ */
1410
+ declare const DIRECTION_KEYS: ReadonlyArray<DirectionKey>;
1411
+ /** Verbosity for a whole fold, or split per family. */
1412
+ type DirectionHintMode = PickerHintMode | {
1413
+ readonly look: PickerHintMode;
1414
+ readonly motion: PickerHintMode;
1415
+ };
1416
+ /** Image policy: full clause for every dimension (today's behavior). */
1417
+ declare const IMAGE_HINT_MODE_DEFAULT: DirectionHintMode;
1418
+ /** Video policy: full look clauses, compact motion terms. */
1419
+ declare const VIDEO_HINT_MODE_DEFAULT: DirectionHintMode;
1420
+ declare function modeForFamily(mode: DirectionHintMode, family: DirectionFamily): PickerHintMode;
1421
+ /**
1422
+ * Wire tolerance ceiling for an array-valued direction key. The SEMANTIC cap is
1423
+ * the per-row render-time slice (`maxPicks`) — this is only the point past
1424
+ * which a body is malformed rather than merely over-generous.
1425
+ */
1426
+ declare const DIRECTION_ARRAY_CEILING = 8;
1427
+ /**
1428
+ * Tolerance ceiling for the LENGTH of a single direction id. Catalog ids are
1429
+ * short slugs (<= ~40 chars); 100 is generous and closes an otherwise unbounded
1430
+ * string channel that lands verbatim in `jobs.input_data`.
1431
+ *
1432
+ * ONE literal for BOTH doors into the fold — the route's `directionSchema`
1433
+ * (`backend/src/lib/direction-schema.ts`) and the persisted-node reader
1434
+ * (`read-node-direction.ts`) — so the wire and the canvas cannot start
1435
+ * disagreeing about which strings are ids at all.
1436
+ */
1437
+ declare const DIRECTION_ID_MAX_CHARS = 100;
1438
+ /** The rows a given generation stage folds, in table order. */
1439
+ declare function directionFieldsForSurface(surface: "image" | "video"): ReadonlyArray<DirectionFieldSpec>;
1440
+ /**
1441
+ * Every clause the `direction` channel injects, in canonical table order.
1442
+ *
1443
+ * Iterates the TABLE (never the caller's object), so unknown wire keys are
1444
+ * ignored, the order is platform-owned, and off-surface dimensions are inert.
1445
+ * Unknown IDS are silently skipped too — every `get*PromptHint` returns `""` on
1446
+ * a miss, so a retired or pack-only id contributes no clause rather than a 400.
1447
+ *
1448
+ * DEDUPE: the result is de-duplicated by exact clause string, FIRST OCCURRENCE
1449
+ * WINS (order-preserving). This is what lets the five legacy whole-catalog keys
1450
+ * (`framingId`, `lightingId`, …) coexist with their canonical counterparts
1451
+ * without an alias table: a caller sending `framingId` and `shotSize` with the
1452
+ * SAME id emits the clause once, while `lightingId: "golden-hour"` alongside
1453
+ * `lightingStyle: "rembrandt"` correctly emits BOTH (they are different ids in
1454
+ * the same catalog — an alias table would have wrongly suppressed one).
1455
+ * A caller sending two DIFFERENT ids for the same dimension gets both clauses,
1456
+ * exactly as two wired picker nodes of one family behave today.
1457
+ *
1458
+ * Exported so a client's "will inject into prompt" preview renders the exact
1459
+ * server output instead of re-implementing the fold.
1460
+ */
1461
+ declare function renderDirectionHints(direction: DirectionFields | undefined, opts: {
1462
+ surface: "image" | "video";
1463
+ mode?: DirectionHintMode;
1464
+ }): string[];
1465
+
1466
+ /**
1467
+ * THE SUBJECT REGISTRY — the ordered table of every SUBJECT dimension the flat
1468
+ * `subject` channel carries (who is in the shot: Person, Styling, and the three
1469
+ * prop catalogs), plus the one renderer that folds it into prompt text.
1470
+ *
1471
+ * WHY A SECOND CHANNEL, NOT `StructuredPromptFields`: that type is FREE TEXT
1472
+ * (`person.hair?: string` → "with {hair} hair"), its reader is a hand-authored
1473
+ * field table whose totality is compile-time enforced by mapped types, its
1474
+ * values are bounded as prose (200 chars), and it renders as headed sentences
1475
+ * ("Subject: …. Style: …."). None of those survive contact with ~50 CATALOG IDS
1476
+ * plus deployment-registered pack dimensions unknown at compile time, whose
1477
+ * hints are authored as comma-joinable compound clauses. `direction-registry.ts`
1478
+ * already has the four properties this channel needs — a platform-owned fold
1479
+ * order exported for client preview parity, a DERIVED wire schema and node
1480
+ * reader, unknown-key/unknown-id inertness, and shared bounds across both doors
1481
+ * — so this module mirrors it. `direction-registry.ts` hands this scope off by
1482
+ * name in its own header.
1483
+ *
1484
+ * WIRE VOCABULARY: the keys are the platform's OWN node-data field names — the
1485
+ * ones `PERSON_FIELD_BY_DIMENSION` / `STYLING_FIELD_BY_DIMENSION` and the prop
1486
+ * pickers' `valueField` already use (`hairBase`, `lipState`, `wardrobeState`,
1487
+ * `heldProp`, `material`, `animal`, …). A canvas person/styling node stores
1488
+ * exactly these, and every `build*Hints` already consumes them.
1489
+ *
1490
+ * THE WIRE IS A FLAT BAG, AND THE FLATNESS IS LOAD-BEARING (not a shortcut):
1491
+ * `collectStylingFragments` reads `data.lipState` — a PERSON field — to skip
1492
+ * `makeup-bold-lips` when `lip-state-bold-red` is already selected. That dedupe
1493
+ * only fires for a consumer folding both pickers off ONE shared value map,
1494
+ * which is precisely what this channel is. Nesting `person` / `styling` as
1495
+ * sub-records would hand the styling builder a bag with no `lipState` in it and
1496
+ * the lipstick clause would silently double. Hence: flat wire, and the group
1497
+ * rows below receive the WHOLE normalized bag rather than a slice of it.
1498
+ *
1499
+ * PRE/POST FREE TEXT IS DELIBERATELY OFF THE WIRE (v1): `PersonValue` and
1500
+ * `StylingValue` BOTH declare `preText`/`postText` and both `collect*Fragments`
1501
+ * read them, so a shared flat bag would emit the same prose twice. They are the
1502
+ * only genuine key collision in the set and are simply not `SUBJECT_KEYS`, so
1503
+ * the normalizer drops them. Per-subject free text is the one future need that
1504
+ * would force either nesting or suffixed keys (`personPreText` / …).
1505
+ *
1506
+ * IMPORT RULE (hard, inherited from the direction registry): this module
1507
+ * imports only `get*PromptHint` / `get*Term` / `build*Hints` FUNCTIONS and the
1508
+ * `*_FIELD_BY_DIMENSION` / `*_DIMENSION_ORDER` maps — never a raw UPPERCASE
1509
+ * catalog array (`PEOPLE`, `STYLINGS`, `ANIMALS`). `catalog-funnel-ratchet.test.ts`
1510
+ * derives its watch set from `picker-catalogs.ts`'s uppercase value imports and
1511
+ * can only SHRINK, so a raw array import here would be a new offender — which
1512
+ * is exactly why the animal getters live in `@nodaro/shared`. Nothing here
1513
+ * reads an environment variable either (`content-free-contract.test.ts`):
1514
+ * verbosity and surface are threaded parameters, never deployment state.
1515
+ *
1516
+ * DISJOINT FROM `direction` BY CONTRACT: `SUBJECT_KEYS ∩ DIRECTION_KEYS = ∅`,
1517
+ * pinned by a test. `pose` rides `direction` even though the picker wiring files
1518
+ * it under "Subject / Object"; keeping the two key sets disjoint is what stops
1519
+ * one selection emitting two clauses.
1520
+ */
1521
+
1522
+ /** Which generation stages fold a dimension (mirrors `DirectionSurface`). */
1523
+ type SubjectSurface = "image" | "video" | "both";
1524
+ /**
1525
+ * Flat subject ids — the wire shape and the canvas node-data shape.
1526
+ *
1527
+ * Keys are the platform's own field names; a value is one id, a list of ids, or
1528
+ * (for `customAge` alone) a number. Absent ≠ empty: a missing key means "no
1529
+ * hint", never a default.
1530
+ */
1531
+ type SubjectFields = Readonly<Record<string, string | readonly string[] | number>>;
1532
+ /**
1533
+ * A fold row whose render consumes the WHOLE normalized bag and returns ONE
1534
+ * already-joined clause.
1535
+ *
1536
+ * Two reasons this kind exists rather than one row per person/styling field:
1537
+ * 1. the cross-catalog dedupe described in the module header needs the whole
1538
+ * bag in one call;
1539
+ * 2. these builders emit FRAGMENTS, not clauses — 30 person fragments handed
1540
+ * to the `". "` prompt-hint join read as "a beautiful woman. in her 30s.
1541
+ * East Asian." The catalogs' own grammar is a comma-joined compound clause,
1542
+ * so the row joins with ", " and hands back a single piece.
1543
+ */
1544
+ interface SubjectGroupFieldSpec {
1545
+ /** Fold-row id. NOT a wire key — a group row reads many of them. */
1546
+ readonly key: string;
1547
+ readonly kind: "group";
1548
+ readonly surface: SubjectSurface;
1549
+ /** The whole normalized bag in, one joined clause out (`[]` when empty). */
1550
+ readonly render: (subject: SubjectFields, mode: PickerHintMode) => string[];
1551
+ }
1552
+ /** A fold row that reads ONE wire key holding catalog ids (the prop catalogs). */
1553
+ interface SubjectIdsFieldSpec {
1554
+ /** Wire key AND fold-row id — these rows are one key each. */
1555
+ readonly key: string;
1556
+ readonly kind: "ids";
1557
+ readonly surface: SubjectSurface;
1558
+ /** Ids honored. Extras are SLICED by the normalizer, never a 400. */
1559
+ readonly maxPicks: number;
1560
+ readonly render: (ids: readonly string[], mode: PickerHintMode) => string[];
1561
+ }
1562
+ type SubjectFieldSpec = SubjectGroupFieldSpec | SubjectIdsFieldSpec;
1563
+ /**
1564
+ * THE TABLE. Declaration order IS fold order (`SUBJECT_FOLD_KEYS`), pinned by
1565
+ * `__tests__/subject-registry.test.ts`.
1566
+ *
1567
+ * Person leads (who), then how they are styled, then what they hold, what it is
1568
+ * made of, and finally the animal in frame. Both group rows run over the SAME
1569
+ * normalized bag, in this order, which is what keeps the styling builder's
1570
+ * `lipState` dedupe alive.
1571
+ *
1572
+ * SECOND MEANING OF POSITION (same as `DIRECTION_FIELDS`): both cap-aware
1573
+ * assemblers fold this table AHEAD of the direction table into ONE sheddable
1574
+ * list and shed it TAIL-FIRST through `hint-shedding.ts`, so a row's position
1575
+ * here is also its survival order under a provider's prompt cap — subject
1576
+ * clauses outlive every direction clause, and within this block `animal` leaves
1577
+ * before `person`. A compatibility order, not a ranking; anything needing a
1578
+ * real ranking adds an explicit priority column rather than reordering rows.
1579
+ */
1580
+ declare const SUBJECT_FIELDS: readonly [{
1581
+ readonly key: "person";
1582
+ readonly kind: "group";
1583
+ readonly surface: "both";
1584
+ readonly render: (subject: SubjectFields, mode: PickerHintMode) => string[];
1585
+ }, {
1586
+ readonly key: "styling";
1587
+ readonly kind: "group";
1588
+ readonly surface: "both";
1589
+ readonly render: (subject: SubjectFields, mode: PickerHintMode) => string[];
1590
+ }, {
1591
+ readonly key: "heldProp";
1592
+ readonly kind: "ids";
1593
+ readonly surface: "both";
1594
+ readonly maxPicks: 2;
1595
+ readonly render: (ids: readonly string[], mode: PickerHintMode) => string[];
1596
+ }, {
1597
+ readonly key: "material";
1598
+ readonly kind: "ids";
1599
+ readonly surface: "both";
1600
+ readonly maxPicks: 2;
1601
+ readonly render: (ids: readonly string[], mode: PickerHintMode) => string[];
1602
+ }, {
1603
+ readonly key: "animal";
1604
+ readonly kind: "ids";
1605
+ readonly surface: "both";
1606
+ readonly maxPicks: 1;
1607
+ readonly render: (ids: readonly string[], mode: PickerHintMode) => string[];
1608
+ }];
1609
+ type SubjectFieldRow = (typeof SUBJECT_FIELDS)[number];
1610
+ /**
1611
+ * Table order — THE canonical fold order, over ROWS (not wire keys). Exported
1612
+ * so a client's "will inject into prompt" preview folds in the exact order the
1613
+ * server does, the way `DIRECTION_KEYS` does for direction.
1614
+ */
1615
+ declare const SUBJECT_FOLD_KEYS: ReadonlyArray<string>;
1616
+ /**
1617
+ * The one person field that is a NUMBER, not ids: the literal age in years,
1618
+ * consulted only when `age === "age-custom"` (`buildAgeFragment`). It has no
1619
+ * styling twin, so it rides the flat bag without collision.
1620
+ */
1621
+ declare const SUBJECT_CUSTOM_AGE_KEY = "customAge";
1622
+ /**
1623
+ * THE WIRE KEY SET, derived — every person field, `customAge`, every styling
1624
+ * field, then the prop rows, in fold order. Never hand-listed: a dimension
1625
+ * added to either catalog joins the channel by construction.
1626
+ *
1627
+ * BASE ONLY, deliberately: a deployment-registered person pack adds dimensions
1628
+ * at RUNTIME, so the pack-aware set is computed per call inside
1629
+ * `normalizeSubjectFields` (and inside `readSubjectFields`). This constant is
1630
+ * what a client enumerates to build its projection; a pack dimension it cannot
1631
+ * know about still rides the wire and still folds.
1632
+ *
1633
+ * ONE CONSEQUENCE, noted rather than fixed: the person builder's legacy `lips`
1634
+ * fallback field is not a dimension and so is not here, making it unreachable
1635
+ * through this channel. Intended — the wire speaks the current vocabulary; the
1636
+ * fallback stays for node blobs written before the split.
1637
+ */
1638
+ declare const SUBJECT_KEYS: ReadonlyArray<string>;
1639
+ /**
1640
+ * `SUBJECT_KEYS` plus whatever a deployment-registered person pack added — the
1641
+ * set the DOORS accept (`readSubjectFields`, and any route-side normalize).
1642
+ *
1643
+ * Rebuilt per call because pack registration happens at boot, after this module
1644
+ * is imported. With no packs registered it is `SUBJECT_KEYS` exactly, pinned by
1645
+ * a test.
1646
+ */
1647
+ declare function getRegisteredSubjectKeys(): ReadonlyArray<string>;
1648
+ /** Verbosity for a whole subject fold. No family split — subject is one family. */
1649
+ type SubjectHintMode = PickerHintMode;
1650
+ /** Image policy: the full mechanism clause for every dimension. */
1651
+ declare const SUBJECT_IMAGE_HINT_MODE_DEFAULT: SubjectHintMode;
1652
+ /**
1653
+ * Video policy: the compact professional term.
1654
+ *
1655
+ * A fully specified person at `"full"` is ~30 paragraph clauses, and on the
1656
+ * video stage the start frame already carries the subject's identity — the
1657
+ * clip's prompt needs the subject NAMED, not re-described. (The image stage,
1658
+ * which is where the subject is actually being built, keeps `"full"`.)
1659
+ */
1660
+ declare const SUBJECT_VIDEO_HINT_MODE_DEFAULT: SubjectHintMode;
1661
+ /**
1662
+ * Wire tolerance ceiling for an array-valued subject key, and the ceiling for
1663
+ * one id's length. DEFINED AS the direction constants rather than re-typed, so
1664
+ * ONE literal governs both channels and both doors (the route schema and the
1665
+ * persisted-node reader) — the wire and the canvas cannot start disagreeing
1666
+ * about which strings are ids at all.
1667
+ */
1668
+ declare const SUBJECT_ARRAY_CEILING = 8;
1669
+ declare const SUBJECT_ID_MAX_CHARS = 100;
1670
+ /**
1671
+ * Bound on the NUMBER of keys in a subject bag. `SUBJECT_KEYS` is 54 today;
1672
+ * this leaves generous headroom for deployment-registered pack dimensions while
1673
+ * still closing an otherwise unbounded record that lands verbatim in
1674
+ * `jobs.input_data`. Unknown keys are inert (the renderer never reads them), so
1675
+ * this is storage hygiene, not validation.
1676
+ */
1677
+ declare const MAX_SUBJECT_KEYS = 128;
1678
+ /** Bound on the LENGTH of one wire key. Field names are short identifiers. */
1679
+ declare const SUBJECT_KEY_MAX_CHARS = 64;
1680
+ /**
1681
+ * THE NORMALIZER — a known-key, per-dimension-capped copy of a subject bag.
1682
+ *
1683
+ * WHY IT EXISTS (and why the fold is unusable without it): the subject builders
1684
+ * do NOT cap. `collectPersonFragments` / `collectStylingFragments` /
1685
+ * `emitIndependentFragments` emit EVERY id they are handed; `normalizePickIds`
1686
+ * and `pickHeldPropIds` dedupe but never slice; only `buildMaterialHints` caps,
1687
+ * and only structurally at 2. `MAX_SELECTED_BY_DIMENSION`'s own doc names its
1688
+ * consumers as the picker UI, the analyzer schema and the Zod validator — NOT
1689
+ * the builders. Straight off the wire, then, a bag is a clause amplifier: 8 ids
1690
+ * (the array ceiling) on each of ~50 dimensions. This is where the per-dimension
1691
+ * cap actually gets enforced.
1692
+ *
1693
+ * It also:
1694
+ * - DROPS UNKNOWN KEYS, so `jobs.input_data` stays the platform's vocabulary
1695
+ * (unknown IDS stay inert instead — every getter resolves a miss to `""`);
1696
+ * - UNWRAPS a single-id array to a bare string. Load-bearing:
1697
+ * `collectPersonFragments` reads a single-pick dimension with
1698
+ * `typeof raw === "string"`, so a legitimate `["hair-base-long"]` from a
1699
+ * client's array-shaped store would otherwise contribute NOTHING;
1700
+ * - clamps `customAge` to a whole `0..120`, mirroring `buildAgeFragment`.
1701
+ *
1702
+ * Copy-on-write: the caller's object is never mutated. Idempotent, so calling it
1703
+ * at a door AND inside the renderer is free.
1704
+ */
1705
+ declare function normalizeSubjectFields(subject: SubjectFields | undefined): SubjectFields | undefined;
1706
+ /** The rows a given generation stage folds, in table order. */
1707
+ declare function subjectFieldsForSurface(surface: "image" | "video"): ReadonlyArray<SubjectFieldSpec>;
1708
+ /**
1709
+ * Every clause the `subject` channel injects, in canonical table order.
1710
+ *
1711
+ * NORMALIZES ONCE, at the top, and hands THE SAME bag to both group rows — that
1712
+ * single shared bag is the mechanism behind the styling builder's cross-catalog
1713
+ * `lipState` dedupe, and it must not depend on a door having normalized first
1714
+ * (the normalizer is idempotent, so a door may do it too).
1715
+ *
1716
+ * Iterates the TABLE, never the caller's object: unknown wire keys contribute
1717
+ * nothing, the order is platform-owned, and an off-surface row is inert.
1718
+ * Unknown IDS are skipped too — every `get*PromptHint` returns `""` on a miss,
1719
+ * so a retired or pack-only id costs no clause rather than a 400.
1720
+ *
1721
+ * DEDUPE by exact clause string, FIRST OCCURRENCE WINS (order-preserving),
1722
+ * matching `renderDirectionHints`.
1723
+ *
1724
+ * Exported so a client's "will inject into prompt" preview renders the exact
1725
+ * server output — called on the very object the client sends — instead of
1726
+ * re-implementing the fold.
1727
+ */
1728
+ declare function renderSubjectHints(subject: SubjectFields | undefined, opts: {
1729
+ surface: "image" | "video";
1730
+ mode?: SubjectHintMode;
1731
+ }): string[];
1732
+
1733
+ /**
1734
+ * The measured hint join, shared by the image (`composePromptText`) and video
1735
+ * (`composeVideoPromptText`) composers so the two can never drift.
1736
+ *
1737
+ * EXACT NO-OP: zero hints → the user's prompt back VERBATIM AND UNTRIMMED (the
1738
+ * platform-caller byte-parity contract — the old platform path passed the
1739
+ * prompt straight to `buildImagePrompt`, which never trims, so trimming here
1740
+ * would change the assembled prompt and the recorded `jobs.input_data`
1741
+ * byte-for-byte). With hints → trim the body so the join reads cleanly
1742
+ * ("prompt. hint", not "prompt . hint"), and drop a blank body so the result
1743
+ * never starts with ". ".
1744
+ *
1745
+ * Never mutates its inputs.
1746
+ */
1747
+ /** The measured separator between the user's prompt and each folded hint. */
1748
+ declare const PROMPT_HINT_SEPARATOR = ". ";
1749
+ /**
1750
+ * Join a user prompt with its folded hint clauses.
1751
+ *
1752
+ * The trailing `.filter((p) => p.length > 0)` on the join array is
1753
+ * parity-critical — do NOT remove it as "redundant": `hints` arrives
1754
+ * pre-filtered but `userPrompt` does not, so a blank user prompt would
1755
+ * otherwise make the result start with ". ".
1756
+ */
1757
+ declare function joinPromptHints(userPrompt: string, hints: readonly string[]): string;
1758
+
1759
+ /**
1760
+ * How many of the first `kept` hint clauses may STAY if `deficit`
1761
+ * characters have to leave the body. Walks the fold order from the TAIL,
1762
+ * subtracting each clause plus the separator it brought, and stops as soon as
1763
+ * enough has been reclaimed.
1764
+ *
1765
+ * The name is historical (direction was the first and for a while the only
1766
+ * channel); the list both callers pass is now the COMBINED fold —
1767
+ * `[...subject, ...direction]` on both surfaces — so the shed order is that
1768
+ * combined order REVERSED: the direction block empties first, then the subject
1769
+ * block. Deliberate, and the reason the two folds share one list: a fully
1770
+ * specified person renders ~30 clauses, so a subject fold left unsheddable
1771
+ * would be the single biggest way to push an overflow into the order-blind
1772
+ * clamp, while a decorative grade or ISO value survives.
1773
+ *
1774
+ * Within the direction block the order is `DIRECTION_FIELDS` order REVERSED
1775
+ * (and within the subject block, `SUBJECT_FIELDS` reversed). Note what that
1776
+ * is and is not: each table's order is a COMPATIBILITY order (grouped by family,
1777
+ * with the legacy `DirectionFields` block pinned last so every pre-registry
1778
+ * caller's fold stays byte-identical) — it is NOT a ranking of how load-bearing
1779
+ * a dimension is, and this function does not claim one. Tail-first is chosen
1780
+ * because it is deterministic, matches the fold order the API documents, and
1781
+ * needs no second ordering to drift out of sync with the table. A caller mixing
1782
+ * legacy keys with the newer ones can therefore lose e.g. `lightingId` before a
1783
+ * decorative `isoValue` clause; if that ever matters, the fix is an explicit
1784
+ * priority column on `DIRECTION_FIELDS`, not a second hand-kept list here.
1785
+ *
1786
+ * Deliberately approximate (assembly is not perfectly additive); the caller
1787
+ * re-assembles and re-checks, and this function strictly decreases `kept`
1788
+ * whenever `deficit > 0`, so that loop terminates.
1789
+ */
1790
+ declare function keepableDirectionHints(hintClauses: readonly string[], kept: number, deficit: number): number;
1791
+
1002
1792
  /**
1003
1793
  * The reference-binding surface string — `@image_N` / `@video_N` / `@audio_N`
1004
1794
  * — and the one identity sentence built on it. Split out of
@@ -1454,13 +2244,17 @@ declare function assembleSunoInput(input: AssembleSunoInput): AssembleSunoResult
1454
2244
  * This wrapper collapses them into one.
1455
2245
  *
1456
2246
  * THE NO-OP CONTRACT (load-bearing — the platform-caller parity relies on it):
1457
- * the two platform callers (`execute-node` / `payload-builder`) compose their
1458
- * prompt from the canvas graph themselves and pass NO cinematic `direction`
1459
- * ids and NO `structured` fields. In that case `composePromptText` MUST return
1460
- * the caller's `userPrompt` byte-for-byte unchanged, so the wrapper degenerates
1461
- * to exactly the `buildImagePrompt(...)` call those sites make today. Studio
1462
- * (and the MCP route) supply `direction` / `structured` and get the id-hint
1463
- * composition on top.
2247
+ * a node that carries NO stored `subject` / `direction` / `structured` (every
2248
+ * workflow authored before the canvas honored them) still reaches here with all
2249
+ * three absent, and `composePromptText` MUST return the caller's `userPrompt`
2250
+ * byte-for-byte unchanged, so the wrapper degenerates to exactly the
2251
+ * `buildImagePrompt(...)` call those sites made before. The platform callers
2252
+ * (`execute-node` / `payload-builder`) compose their prompt from the canvas GRAPH themselves and
2253
+ * ALSO forward a node's STORED `subject` / `direction` / `structured` when it
2254
+ * carries them (`readSubjectFields` / `readDirectionFields` /
2255
+ * `readStructuredFields`); those nodes get the id-hint composition on top,
2256
+ * ADDITIVE to the graph-wired cinematography hints the caller already folded
2257
+ * into `userPrompt`. Studio and the MCP route supply the levers directly.
1464
2258
  *
1465
2259
  * THE EMPTY-CHECK FLAG (also load-bearing for parity): `execute-node` rejects a
1466
2260
  * truly-empty assembled prompt (its "type one, mention a character, or connect
@@ -1470,21 +2264,6 @@ declare function assembleSunoInput(input: AssembleSunoInput): AssembleSunoResult
1470
2264
  * guard (frontend, Studio, route) pass `throwOnEmpty: true`.
1471
2265
  */
1472
2266
 
1473
- /**
1474
- * Flat cinematic-direction ids the Studio framing UI (and the MCP route)
1475
- * expose — all optional. Promoted here from Studio's `assembly.ts` so the
1476
- * id → hint composition lives in one place. The platform callers pass none of
1477
- * these (they fold their hints from the graph into `userPrompt` themselves).
1478
- */
1479
- interface DirectionFields {
1480
- /** Shot Type — the FRAMINGS shot-size/coverage/composition/vantage dimensions. */
1481
- framingId?: string;
1482
- /** Angle — the FRAMINGS angle dimension (separate pill, so it can coexist with Shot Type). */
1483
- framingAngleId?: string;
1484
- lightingId?: string;
1485
- lensId?: string;
1486
- cameraFormatId?: string;
1487
- }
1488
2267
  /**
1489
2268
  * Input to `assembleImageInput`. A faithful SUPERSET of what the two platform
1490
2269
  * callers pass to `buildImagePrompt` today (so they can route through this
@@ -1504,10 +2283,18 @@ interface AssembleImageInput {
1504
2283
  connectedReferences?: ConnectedReference[];
1505
2284
  /**
1506
2285
  * Flat cinematic-direction ids → folded into the prompt as hints. Studio /
1507
- * MCP-route use; the platform callers pass none (so `composePromptText` is a
1508
- * no-op for them and the result is byte-identical to today).
2286
+ * MCP-route use, and the platform callers' narrow-read of a node's STORED
2287
+ * `data.direction`; absent on a node that carries none (so `composePromptText`
2288
+ * is a no-op for it and the result is byte-identical to today).
1509
2289
  */
1510
2290
  direction?: DirectionFields;
2291
+ /**
2292
+ * Flat subject ids (Person / Styling / props) → folded into the prompt AHEAD
2293
+ * of the direction clauses: the subject is the noun phrase the cinematography
2294
+ * then modifies. Same provenance as `direction` — Studio / MCP-route, or the
2295
+ * platform callers' narrow-read of a node's STORED `data.subject`.
2296
+ */
2297
+ subject?: SubjectFields;
1511
2298
  /** Path-1 structured fields → composed fragment appended to the prompt. */
1512
2299
  structured?: StructuredPromptFields;
1513
2300
  /**
@@ -1567,12 +2354,282 @@ interface AssembleImageInput {
1567
2354
  * Assemble a node's image-generation inputs into a `BuildImagePromptResult`
1568
2355
  * (`{ prompt, nativeNegativePrompt, referenceImageUrls }`).
1569
2356
  *
1570
- * Order: (1) compose the prompt text (no-op when no direction/structured),
2357
+ * Order: (1) compose the prompt text (no-op when no subject/direction/structured),
1571
2358
  * (2) `buildImagePrompt(...)` — exactly the call the three sites make today,
1572
- * (3) optional post-assembly empty-prompt throw (gated by `throwOnEmpty`).
2359
+ * (3) shed hint clauses and re-assemble while the provider cap overflows,
2360
+ * (4) optional post-assembly empty-prompt throw (gated by `throwOnEmpty`).
2361
+ *
2362
+ * TRUNCATION ORDERING (step 3): `buildImagePrompt`'s cap clamp cuts the TAIL,
2363
+ * which is ORDER-BLIND — on a low-cap provider (seedream = 3000) a maximal
2364
+ * direction fold renders ~3.3K characters of clauses and the cut can sever a
2365
+ * reference directive, mention-resolved text or the user's own prose while a
2366
+ * decorative clause survives. So the ASSEMBLER decides instead: it knows which
2367
+ * clauses are hints because it just built them, and drops them last-folded
2368
+ * first until the prompt fits. Everything else — references, prose, the
2369
+ * structured fragment, the Style/Avoid suffixes — outranks a hint. A body that
2370
+ * still overflows with ZERO hints (long prose or many directives on its own)
2371
+ * falls back to the builder's clamp, unchanged.
2372
+ *
2373
+ * UNDER-CAP PARITY: the first pass folds every hint, so a prompt that fits is
2374
+ * byte-identical to before — the retry only ever runs on an over-cap assembly.
1573
2375
  */
1574
2376
  declare function assembleImageInput(input: AssembleImageInput): BuildImagePromptResult;
1575
2377
 
2378
+ /**
2379
+ * `composeVideoPromptText` — the video twin of `assemble-image-input.ts`'s
2380
+ * `composePromptText`: fold cinematic-direction picker IDS into the prompt BODY,
2381
+ * server-side, at the model call.
2382
+ *
2383
+ * WHY THIS EXISTS: `/v1/generate-video` had no structured direction channel, so
2384
+ * every client baked the hint TEXT itself. A copied scene then carried stale
2385
+ * catalog wording forever, a re-generate double-baked it, and each client
2386
+ * re-implemented the fold with its own separator and its own order. The wire
2387
+ * now carries ids; the platform renders the clauses.
2388
+ *
2389
+ * WHERE IT RUNS (load-bearing): on the prompt BODY, BEFORE
2390
+ * `resolveVideoReferenceCore`. That resolver FRAMES the body — legacy prepends
2391
+ * its `Use these characters:` block, hybrid prepends the lock lines and APPENDS
2392
+ * the canonical role phrases and extras. Folding afterwards would push the
2393
+ * scene/look description PAST the identity directives, a worse version of the
2394
+ * bug this channel exists to fix. The image side is structurally identical
2395
+ * (`assembleImageInput` = `composePromptText` → `buildImagePrompt`).
2396
+ *
2397
+ * That ordering is also why cap-aware shedding here takes a `frame` callback
2398
+ * rather than a provider id: the shed must run at the FOLD site (before the
2399
+ * resolver) but be decided on the RESOLVED length (after it), so the binding
2400
+ * text the resolver adds is inside the budget and can never be the thing that
2401
+ * gets dropped. See {@link VideoPromptCapOptions}. Both catalog channels —
2402
+ * SUBJECT and direction — fold into the one sheddable list that budget walks.
2403
+ *
2404
+ * THE VERBOSITY POLICY LIVES HERE, NOT IN THE CLIENT: motion dimensions render
2405
+ * their compact professional term, look dimensions their full clause
2406
+ * (`VIDEO_HINT_MODE_DEFAULT`, resolved per row's `family` by the registry). The
2407
+ * SUBJECT fold has its own policy — compact on video
2408
+ * (`SUBJECT_VIDEO_HINT_MODE_DEFAULT`), because a fully specified person at full
2409
+ * verbosity is ~30 paragraph clauses and the start frame already carries the
2410
+ * subject's identity into the clip.
2411
+ * It is a threaded PARAMETER with a pure default — never deployment state:
2412
+ * `__tests__/content-free-contract.test.ts` hard-fails any environment read
2413
+ * under `packages/prompts/src`, and this module has nothing to read anyway.
2414
+ *
2415
+ * EXACT NO-OP CONTRACT: with no subject, no direction and no structured fields
2416
+ * the caller's
2417
+ * `userPrompt` comes back VERBATIM AND UNTRIMMED — `undefined` included, since
2418
+ * a video prompt is optional on the route. That is what keeps every existing
2419
+ * caller byte-identical (the "backward-compatible: no connectedReferences →
2420
+ * prompt + flat refs pass through unchanged" oracle in
2421
+ * `backend/src/routes/__tests__/generate-video.test.ts`, restated locally in
2422
+ * `__tests__/assemble-video-input.test.ts`).
2423
+ *
2424
+ * WHAT IS DELIBERATELY NOT HERE: the dimension table, the fold order, the
2425
+ * dedupe and the surface filter all live in `direction-registry.ts` (and
2426
+ * `subject-registry.ts` for the subject channel) — ONE renderer per channel
2427
+ * serves both surfaces, so the image and video folds cannot drift.
2428
+ * Clients render their "will inject into prompt" preview by importing
2429
+ * `renderDirectionHints` + `joinPromptHints` directly.
2430
+ */
2431
+
2432
+ /**
2433
+ * Cap-aware shedding, opt-in. Absent → the composer is exactly what it always
2434
+ * was (every existing caller stays byte-identical, and the no-op path below is
2435
+ * never even reached differently).
2436
+ *
2437
+ * WHY A NUMBER AND A CALLBACK, NOT A PROVIDER ID — the two halves of the video
2438
+ * surface's problem, which the image half did not have:
2439
+ *
2440
+ * - `cap` is the caller's EFFECTIVE ceiling, not `getMaxVideoPromptChars` read
2441
+ * here. The routes compute it with `effectiveVideoPromptCeiling`, which
2442
+ * mirrors `applyVideoNegativePrompt`'s reservation of the `"\nAvoid: …"`
2443
+ * suffix for a provider with no native negative param. Re-deriving the cap
2444
+ * inside this package would put a second copy of that reservation one
2445
+ * refactor away from drifting from the clamp it is supposed to predict.
2446
+ *
2447
+ * - `frame` is the REFERENCE RESOLVER, and it is what makes the shed correct
2448
+ * end-to-end. The fold runs BEFORE `resolveVideoReferenceCore` (see the
2449
+ * module header — folding afterwards strands the scene description past the
2450
+ * identity directives). The resolver then ADDS binding text: legacy's
2451
+ * "Use these characters:" block, hybrid's lock lines and the canonical role
2452
+ * phrases it APPENDS. That added text is exactly what an order-blind tail cut
2453
+ * destroys first, so it must be inside the budget — but it must never be
2454
+ * shed. Measuring THROUGH the caller's framing gives both properties at once:
2455
+ * the shed decision sees the final length, while the only thing it can drop
2456
+ * is a hint clause it rendered itself.
2457
+ *
2458
+ * Re-framing a SUBSET of the hints is sound because a hint can never change how
2459
+ * the resolver reads the rest of the body: no registered catalog hint, term or
2460
+ * label contains a `{image:N}` / `{ref:` / `@slug:N` shape
2461
+ * (`__tests__/direction-hint-token-safety.test.ts` pins that for every catalog),
2462
+ * so dropping one cannot renumber or unbind a reference.
2463
+ */
2464
+ interface VideoPromptCapOptions {
2465
+ /**
2466
+ * The maximum length the FRAMED prompt may reach. Sheds only while the framed
2467
+ * body exceeds it; `undefined` (the default) disables shedding entirely.
2468
+ */
2469
+ readonly cap?: number;
2470
+ /**
2471
+ * The downstream framing the cap is measured through — the caller's reference
2472
+ * assembly. Identity when omitted (a caller with a cap but no references).
2473
+ * Must be PURE: it is called once per shed iteration, and the caller re-runs
2474
+ * its own real assembly on the returned body afterwards.
2475
+ */
2476
+ readonly frame?: (body: string | undefined) => string | undefined;
2477
+ }
2478
+ /**
2479
+ * Fold a video run's subject and cinematic-direction ids (and optional
2480
+ * structured fields) into its prompt body.
2481
+ *
2482
+ * The SUBJECT hints land first (who is in the shot — the noun phrase the
2483
+ * cinematography modifies), then the direction hints in the registry's
2484
+ * canonical table order (camera motion leads), and the structured fragment
2485
+ * lands LAST — the same ordering `composePromptText` uses for stills.
2486
+ *
2487
+ * `subject` rides `opts` rather than a fourth positional parameter on purpose:
2488
+ * every existing caller passes `(prompt, direction)` or
2489
+ * `(prompt, direction, structured)` positionally, and a new positional would
2490
+ * have made the two levers' order a memorization test.
2491
+ *
2492
+ * TRUNCATION ORDERING (opt-in via `opts.cap`): the provider clamp
2493
+ * (`applyVideoNegativePrompt`) slices the prompt TAIL, which is ORDER-BLIND —
2494
+ * on a low-cap provider (kling = 1000) a broad direction renders more than the
2495
+ * whole ceiling and the cut severs reference bindings and the end of the user's
2496
+ * prose while decorative clauses survive. With a cap the composer decides
2497
+ * instead: it knows which clauses are hints because it just rendered them, and
2498
+ * drops them LAST-FOLDED FIRST until the framed prompt fits. Everything else —
2499
+ * the user's prose, the structured fragment (user CONTENT, never a garnish) and
2500
+ * every byte the resolver's framing adds — outranks a hint.
2501
+ *
2502
+ * SUBJECT CLAUSES ARE SHED CANDIDATES TOO, and they shed AFTER the direction
2503
+ * clauses. Both folds are catalog decoration of the same class — ids the
2504
+ * platform rendered into wording — so exempting one would just move the
2505
+ * overflow into the order-blind clamp, which is the bug this machinery exists
2506
+ * to prevent. They ride the SAME `hintClauses` list the shed already walks
2507
+ * (subject first, direction second, tail-first shedding), so there is exactly
2508
+ * one shed arithmetic (`hint-shedding.ts`) across both channels and both
2509
+ * surfaces. Neither channel ever sheds before the prose, the references or the
2510
+ * structured fragment.
2511
+ *
2512
+ * WHAT THE BUDGET DELIBERATELY EXCLUDES: the route's later opt-in identity
2513
+ * injection (an async DB read that appends a canonical description) and any
2514
+ * registered `applyPromptPolicies` transform both run AFTER the reference
2515
+ * assembly and are not modelled here. Pricing them in would mean folding an
2516
+ * await into this pure composer; instead the provider clamp stays their last
2517
+ * resort, exactly as today. Same for a body that still overflows with ZERO
2518
+ * hints left — long prose, or many bound references on their own.
2519
+ *
2520
+ * UNDER-CAP PARITY: the first pass folds every hint, so a prompt that fits is
2521
+ * byte-identical to a capless call, and a caller with no
2522
+ * `subject`/`direction`/`structured` takes the same exact no-op path it always
2523
+ * did.
2524
+ *
2525
+ * @param userPrompt The user's prompt. Optional: an image-to-video run may
2526
+ * legitimately have none, and it is returned as-is when nothing folds.
2527
+ * @param direction Flat catalog ids. Unknown keys, off-surface keys (an
2528
+ * image-only dimension sent to a video run) and unknown ids all contribute
2529
+ * nothing — never a throw.
2530
+ * @param structured Path-1 structured fields. Not a `/v1/generate-video` wire
2531
+ * field today; the canvas orchestrator passes it directly.
2532
+ * @param opts.hintMode Override the direction verbosity policy (a whole-fold
2533
+ * `PickerHintMode`, or a `{ look, motion }` split).
2534
+ * @param opts.subject Flat subject ids (Person / Styling / props), same
2535
+ * inertness contract as `direction`.
2536
+ * @param opts.subjectHintMode Override the subject verbosity policy.
2537
+ * @param opts.cap / `opts.frame` See {@link VideoPromptCapOptions}.
2538
+ */
2539
+ declare function composeVideoPromptText(userPrompt: string | undefined, direction: DirectionFields | undefined, structured?: StructuredPromptFields, opts?: {
2540
+ readonly hintMode?: DirectionHintMode;
2541
+ readonly subject?: SubjectFields;
2542
+ readonly subjectHintMode?: SubjectHintMode;
2543
+ } & VideoPromptCapOptions): string | undefined;
2544
+
2545
+ /**
2546
+ * Narrow readers turning UNTRUSTED persisted node data (`workflows.nodes`
2547
+ * JSONB — import, MCP write, node preset, a Studio-emitted graph) into the
2548
+ * typed `subject` / `direction` / `structured` levers `assembleImageInput`
2549
+ * accepts.
2550
+ * `buildPayload` has no zod and workflow writes are
2551
+ * `z.record(z.string(), z.unknown())`, so this blob may have been written years
2552
+ * ago by any client.
2553
+ *
2554
+ * Used by ALL THREE image-assembly sites so what the canvas accepts cannot
2555
+ * drift between them: the frontend single-node executor (`execute-node.ts`),
2556
+ * the orchestrator (`payload-builder.ts`), and the config-panel final-prompt
2557
+ * preview (`build-image-assemble-input.ts`).
2558
+ *
2559
+ * `readDirectionFields` is DERIVED FROM `DIRECTION_FIELDS`, never a hand list:
2560
+ * a dimension added to the registry is honored here by construction, so the
2561
+ * reader can never silently drop a key the wire schema and the renderer both
2562
+ * know about. Anything unrecognised is DROPPED, never thrown on — a malformed
2563
+ * blob must not fail a canvas run, and an unknown catalog ID already degrades
2564
+ * to `""` inside each `get*PromptHint`, so this validates SHAPE only.
2565
+ *
2566
+ * BOUNDS MATCH THE WIRE SCHEMA where both exist, by SHARED CONSTANT:
2567
+ * `DIRECTION_ID_MAX_CHARS` and `DIRECTION_ARRAY_CEILING` are the same two
2568
+ * literals the `generate-image` route's `directionSchema` enforces, imported
2569
+ * from the registry rather than re-typed here — a body the route accepts and a
2570
+ * node the canvas re-runs must not disagree about which strings are ids.
2571
+ *
2572
+ * DELIBERATELY STRICTER THAN THE WIRE SCHEMA on `structured` values: the
2573
+ * route's `structuredPromptFieldsSchema` declares every field as a bare
2574
+ * `z.string().optional()` (unbounded), while `MAX_STRUCTURED_VALUE_CHARS` below
2575
+ * bounds them at 200. Do not "fix" that asymmetry by loosening HERE — this
2576
+ * reads a blob any client may have written years ago, and the values land
2577
+ * verbatim in `jobs.input_data.prompt`. Tightening the ROUTE instead would be a
2578
+ * new 400 on currently-accepted input, so a >200-char structured value stored
2579
+ * on a node is dropped on a canvas run while `POST /v1/generate-image` still
2580
+ * renders it. That is the one known divergence; it is bounded to a field the
2581
+ * canvas UI never writes that long.
2582
+ *
2583
+ * RETURNS `undefined`, NEVER `{}`: an empty object would still be a *defined*
2584
+ * `direction`, and the call sites' `...(x !== undefined ? { x } : {})` spread
2585
+ * would then hand `assembleImageInput` a defined-but-empty lever. Returning
2586
+ * `undefined` keeps that spread honest and the exact no-op branch taken.
2587
+ */
2588
+
2589
+ /**
2590
+ * Read a node's stored cinematic-direction ids. Accepts a single id OR an array
2591
+ * on every key (multi-pick dimensions carry arrays; a single-pick key may
2592
+ * legitimately carry one).
2593
+ *
2594
+ * The SEMANTIC per-dimension cap stays the renderer's slice (`maxPicks`) — this
2595
+ * reader does not know a row's pick budget and must not guess it. But it DOES
2596
+ * bound cardinality at `DIRECTION_ARRAY_CEILING`, the same ceiling the wire
2597
+ * schema enforces: the value is untrusted persisted JSONB (a node blob is
2598
+ * validated only as `z.record(z.string(), z.unknown())` on write), and handing
2599
+ * an unbounded array to `renderDirectionHints` would put an `includes`-dedupe
2600
+ * scan in front of that slice. Keeping the FIRST `DIRECTION_ARRAY_CEILING`
2601
+ * survivors is what the wire door already does to the same input.
2602
+ *
2603
+ * Junk is filtered BEFORE the cap, so valid ids sitting behind malformed
2604
+ * entries survive rather than being crowded out by them.
2605
+ */
2606
+ declare function readDirectionFields(value: unknown): DirectionFields | undefined;
2607
+ /**
2608
+ * Read a node's stored SUBJECT ids — the flat Person / Styling / prop bag the
2609
+ * `subject` channel carries. Same three contracts as `readDirectionFields`:
2610
+ * drop-never-throw, `undefined` never `{}`, and bounds shared with the wire
2611
+ * door by CONSTANT (`SUBJECT_ID_MAX_CHARS` / `SUBJECT_ARRAY_CEILING`, which are
2612
+ * defined AS the direction constants) so a body the route accepts and the same
2613
+ * node re-run from the canvas cannot disagree about which strings are ids.
2614
+ *
2615
+ * DERIVED from `getRegisteredSubjectKeys()`, never a hand-authored field list —
2616
+ * that is the whole lesson of `readStructuredFields` below, whose hand table is
2617
+ * only viable because `StructuredPromptFields` is a small hand-authored type.
2618
+ * The subject vocabulary is ~54 catalog-derived fields PLUS deployment-registered
2619
+ * pack dimensions unknown at compile time, so it is read from the registry at
2620
+ * call time. Iterating the KEY SET (never `Object.keys(value)`) is also what
2621
+ * keeps an adversarial blob's key count off the hot path.
2622
+ *
2623
+ * The SEMANTIC per-dimension cap stays the renderer's job
2624
+ * (`normalizeSubjectFields`), exactly as `maxPicks` does for direction: this
2625
+ * reader bounds cardinality only. `customAge` is the one number on the wire and
2626
+ * is passed through finite-only — the renderer clamps it.
2627
+ */
2628
+ declare function readSubjectFields(value: unknown): SubjectFields | undefined;
2629
+ /** Read a node's stored Path-1 structured prompt fields. Same drop-never-throw
2630
+ * and `undefined`-never-`{}` contract as `readDirectionFields`. */
2631
+ declare function readStructuredFields(value: unknown): StructuredPromptFields | undefined;
2632
+
1576
2633
  type Seedance2Mode = "first-frame" | "first-last-frame" | "reference";
1577
2634
  interface Seedance2InputsArgs {
1578
2635
  /** The generation prompt — used ONLY to detect an existing first-frame
@@ -5924,4 +6981,4 @@ declare function getPickerWiring(nodeType: string | undefined | null): PickerWir
5924
6981
  */
5925
6982
  declare function buildSurroundFillPrompt(direction: SurroundDirection, userPrompt?: string): string;
5926
6983
 
5927
- export { ACTION_FX, ACTION_FX_CATEGORY_LABELS, ACTION_FX_CATEGORY_ORDER, ACTION_FX_IDS, AESTHETICS, AESTHETIC_CATEGORY_LABELS, AESTHETIC_CATEGORY_ORDER, AESTHETIC_IDS, ALL_PICKER_WIRING, ANALYZABLE_PICKER_TYPES, ANGLE_LABELS, ASPECT_RATIO_LABELS, ATMOSPHERES, ATMOSPHERE_IDS, AUDIO_WIZARD_CATEGORIES, type ActionFx, type ActionFxCategory, type Aesthetic, type AestheticCategory, type AssembleImageInput, type AssembleSunoInput, type AssembleSunoResult, type Atmosphere, BACKDROPS, BACKDROP_CATEGORY_LABELS, BACKDROP_CATEGORY_ORDER, BACKDROP_IDS, BRAND_PRESETS, BRAND_PRESET_IDS, BRAND_PRESET_META, type Backdrop, type BackdropCategory, type BrandCasing, type BrandFonts, type BrandLogo, type BrandPalette, type BrandPresetId, type BrandPresetMeta, type BrandTokens, type BrandTypeSpec, type BuildImagePromptConfig, type BuildImagePromptResult, type BuildImagePromptSegmentsResult, CAMERA_FORMATS, CAMERA_FORMAT_IDS, CAMERA_MOTIONS, CAMERA_MOTION_CATEGORY_LABELS, CAMERA_MOTION_CATEGORY_ORDER, CAMERA_MOTION_IDS, CHARACTER_FX, CHARACTER_FX_CATEGORY_LABELS, CHARACTER_FX_CATEGORY_ORDER, CHARACTER_FX_DURATIONS, CHARACTER_FX_IDS, CHARACTER_FX_INTENSITIES, CHARACTER_FX_POSITIONS, CINEMATIC_LOOK_TAIL, COLOR_LOOKS, COLOR_LOOK_CATEGORY_LABELS, COLOR_LOOK_CATEGORY_ORDER, COLOR_LOOK_IDS, COMPOSITION_EFFECTS, COMPOSITION_EFFECT_IDS, type CameraFormat, type CameraMotion, type CameraMotionCategory, type CatalogPack, type CatalogPackMode, type CategorizedInstrument, type CharacterFx, type CharacterFxCategory, type CharacterFxDuration, type CharacterFxIntensity, type CharacterFxPosition, type CharacterFxTiming, type CharacterFxTimingOption, type CharacterMeta, type CharacterMotionPromptInput, type CharacterPromptInput, type ColorLook, type ColorLookCategory, type CompositionEffect, type ComputeNodePromptArgs, type CreaturePromptInput, DEFAULT_IDENTITY_LOCK, DEFAULT_TEMPLATES, type DirectionFields, ERAS, ERA_CATEGORY_LABELS, ERA_CATEGORY_ORDER, ERA_IDS, EXPOSURE_CATEGORY_LABELS, EXPOSURE_CATEGORY_ORDER, EXPOSURE_FIELD_BY_CATEGORY, EXPOSURE_IDS, EXPOSURE_SETTINGS, type Era, type EraCategory, type ExposureCategory, type ExposureSettings, type ExposureValue, FACTORY_PRESETS, FACTORY_SNIPPETS, FILM_STILL_PREFIX, FRAMINGS, FRAMING_CATEGORY_LABELS, FRAMING_CATEGORY_ORDER, FRAMING_FIELD_BY_CATEGORY, FRAMING_IDS, type FacePromptInput, type FactoryPreset, type FactoryPresetGroup, type FactorySnippet, type Framing, type FramingCategory, type FramingValue, GAPS_SCHEMA, type GeminiOmniI2vInputsArgs, type GeminiOmniI2vInputsResult, HELD_PROPS, HELD_PROP_CATEGORY_LABELS, HELD_PROP_CATEGORY_ORDER, HELD_PROP_IDS, type HeldProp, type HeldPropCategory, IMAGE_REFERENCE_PROMPT_DOCTRINE, IMAGE_WIZARD_CATEGORIES, INSTRUMENTATION_DEFAULT_DATA, INSTRUMENTS, INSTRUMENT_CATEGORY_LABELS, INSTRUMENT_CATEGORY_ORDER, type IdentityLockMode, type ImageReferenceDoctrine, type InstrumentCategory, type InstrumentationEntry, LENSES, LENS_IDS, LIGHTINGS, LIGHTING_CATEGORY_LABELS, LIGHTING_CATEGORY_ORDER, LIGHTING_FIELD_BY_CATEGORY, LIGHTING_IDS, LLM_CHAT_WIZARD_CATEGORIES, LOOP_SUBJECTS, LOOP_SUBJECT_CATEGORY_LABELS, LOOP_SUBJECT_CATEGORY_ORDER, type Lens, type Lighting, type LightingCategory, type LightingValue, type LlmChatFieldArgs, type LocationMotionPromptInput, type LocationPromptInput, type LocationRefinePromptInput, type LoopSubject, type LoopSubjectCategory, MATERIALS, MATERIAL_CATEGORY_LABELS, MATERIAL_CATEGORY_ORDER, MATERIAL_IDS, MAX_SELECTED_BY_DIMENSION, MAX_SELECTED_BY_FRAMING_CATEGORY, MAX_SELECTED_BY_STYLING_DIMENSION, MOODS, MOOD_CATEGORY_LABELS, MOOD_CATEGORY_ORDER, MOOD_IDS, MOVEMENT_LABELS, MULTI_PICKER_WIRING, MUSIC_EMOTIONS, MUSIC_ENERGIES, MUSIC_ERAS, MUSIC_GENRES, MUSIC_GENRE_CATEGORY_LABELS, MUSIC_GENRE_CATEGORY_ORDER, MUSIC_GENRE_DEFAULT_DATA, MUSIC_MOOD_DEFAULT_DATA, MUSIC_VIBES, MUSIC_WIZARD_CATEGORIES, type Material, type MaterialCategory, type ModelChange, type Mood, type MoodCategory, type MoodValue, type MultiDimPickerWiring, type MultiPickerAnalyzerSpec, type MusicEra, type MusicGenre, type MusicGenreCategory, type MusicMoodData, type MusicMoodEntry, type MusicSubgenre, NODE_PROMPT_CANDIDATE_FIELDS, NODE_PROMPT_FIELDS, OBJECT_ANGLE_PRESETS, OBJECT_ANGLE_PROMPTS, OBJECT_ASSET_PRESETS, OBJECT_ASSET_PROMPTS, OBJECT_MATERIAL_PRESETS, OBJECT_MATERIAL_PROMPTS, OBJECT_VARIATION_PRESETS, OBJECT_VARIATION_PROMPTS, type ObjectMotionPromptInput, type ObjectPresetAssetType, type ObjectPromptInput, PEOPLE, PERSON_DIMENSION_LABELS, PERSON_DIMENSION_ORDER, PERSON_DIMENSION_SECTIONS, PERSON_FIELD_BY_DIMENSION, PERSON_IDS, PHOTOGRAPHERS, PHOTOGRAPHER_CATEGORY_LABELS, PHOTOGRAPHER_CATEGORY_ORDER, PHOTOGRAPHER_IDS, PHOTO_GENRES, PHOTO_GENRE_CATEGORY_LABELS, PHOTO_GENRE_CATEGORY_ORDER, PHOTO_GENRE_IDS, PICKER_ANALYZER_FAMILIES, PICKER_ANALYZER_REGISTRY, PICKER_CATALOGS, PICKER_TYPES, POSES, POSE_CATEGORY_LABELS, POSE_CATEGORY_ORDER, POSE_IDS, POST_PROCESS_EFFECTS, POST_PROCESS_EFFECT_IDS, PRODUCTION_STYLES, PROMPT_AFFIX_CORE_FIELD_OVERRIDES, PROMPT_AFFIX_NODE_TYPES, PROVIDER_CAPABILITIES, PROVIDER_PROMPT_DOCTRINES, type Person, type PersonDimension, type PersonDimensionSection, type PersonPack, type PersonValue, type PhotoGenre, type PhotoGenreCategory, type Photographer, type PhotographerCategory, type PickerAnalyzer, type PickerAnalyzerDescriptor, type PickerAnalyzerSpec, type PickerApplyMode, type PickerCatalog, type PickerCatalogDetail, type PickerCatalogInput, type PickerCatalogSummary, type PickerDimension, type PickerDimensionInput, type PickerDimensionSpec, type PickerGaps, type PickerHintMode, type PickerOption, type PickerOptionInput, type PickerType, type PickerWiring, type PickerWiringEntry, type Pose, type PoseCategory, type PoseValue, type PostProcessEffect, type ProjectPickerCatalogOptions, type ProjectedPickerCatalog, type ProjectedPickerDimension, type ProjectedPickerOption, type PromptFieldSpec, type PromptIconKind, type PromptSegment, type PromptSegmentOrigin, type ProviderPromptDoctrine, REFERENCE_IMAGE_ROLES, REFERENCE_RULES, REFERENCE_RULES_MULTI_PERSON, REF_BINDING, RENDER_QUALITIES, RENDER_QUALITY_IDS, type RecommendedModel, type RefIdTokenContext, type ReferenceCounts, type RegisteredPersonEntry, type RenderQuality, type ResolveCharacterMentionsResult, type ResolveLocationMentionsResult, type ResolvePromptArgs, type ResolveVideoReferenceCoreArgs, SCENE_FRAME_RULE, SCENE_PROMPT_MAX_LENGTH, SETTINGS, SETTING_CATEGORY_LABELS, SETTING_IDS, SHOT_LABELS, SINGING_STYLES, SINGLE_PICKER_WIRING, SNIPPET_MEDIA_VALUES, STYLES, STYLE_IDS, STYLE_PRESETS, STYLINGS, STYLING_DIMENSION_LABELS, STYLING_DIMENSION_ORDER, STYLING_FIELD_BY_DIMENSION, STYLING_IDS, type Seedance2InputsArgs, type Seedance2InputsResult, type Seedance2Mode, type Setting, type SettingCategory, type SidecarCoverageReport, type SingleDimPickerWiring, type SnippetMedia, type SnippetTarget, type SoundComposition, type SoundCompositionFields, type SoundConsumerType, type StructuredPromptFields, type Style, type StylePreset, type Styling, type StylingDimension, type StylingValue, type SuspiciousTermOptions, TEMPORALS, TEMPORAL_CATEGORY_LABELS, TEMPORAL_CATEGORY_ORDER, TEMPORAL_FIELD_BY_CATEGORY, TEMPORAL_IDS, TERM_MAX_CHARS, TEXT_WIZARD_CATEGORIES, TRANSITIONS, TRANSITION_CATEGORY_LABELS, TRANSITION_CATEGORY_ORDER, TRANSITION_DURATIONS, TRANSITION_IDS, TRANSITION_INTENSITIES, TRANSITION_POSITIONS, type Temporal, type TemporalCategory, type TemporalValue, type TermCarrier, type Transition, type TransitionCategory, type TransitionDuration, type TransitionIntensity, type TransitionPosition, type TransitionTiming, type TransitionTimingOption, VIDEO_WIZARD_CATEGORIES, VOCAL_PRESENCE, VOCAL_PRESENCE_INSTRUMENTAL_ID, VOICE_ACCENTS, VOICE_AGES, VOICE_ARCHETYPES, VOICE_CHARACTER_DEFAULT_DATA, VOICE_DELIVERY_DEFAULT_DATA, VOICE_EMOTIONS, VOICE_GENDERS, VOICE_LANGUAGES, VOICE_PACES, VOICE_TIMBRES, type VeoI2vInputsArgs, type VeoI2vInputsResult, type VideoExtraRef, type VoiceCharacterEntry, type VoiceDeliveryEntry, WARDROBE, WARDROBE_CATEGORY_LABELS, WARDROBE_DIMENSION_ORDER, WARDROBE_FIELD_BY_DIMENSION, type WardrobeDimension, type WardrobeEntry, type WardrobeValue, type WizardCategory, type WizardNodeContext, type WizardOption, type WizardQuestion, type WizardSelection, appendField, appendMusicMeta, applyPickerJson, applyPromptAffixes, applyReferenceOrderToVideo, applyTemplate, assembleImageInput, assembleSunoInput, buildActionFxHints, buildActionFxTerms, buildAestheticHints, buildAestheticTerms, buildAgeHint, buildAtmosphereHints, buildAtmosphereTerms, buildCharacterPrompt, buildCreaturePrompt, buildExposureHints, buildExposureTerms, buildFaceTemplateInputs, buildFramingHints, buildFramingTerms, buildHeldPropHints, buildHeldPropTerms, buildIdentityDirectives, buildIdentityLockLine, buildImagePrompt, buildImagePromptSegments, buildInstrumentationHints, buildInstrumentationTerms, buildLightingHints, buildLightingTerms, buildLocationMotionPrompt, buildLocationPrompt, buildLocationRefinePrompt, buildMaterialHints, buildMaterialTerms, buildMoodHints, buildMoodTerms, buildMotionPrompt, buildMultiPickerAnalyzerSpec, buildMusicGenreHints, buildMusicGenreTerms, buildMusicMoodHints, buildMusicMoodTerms, buildObjectMotionPrompt, buildObjectPrompt, buildPersonHints, buildPersonTerms, buildPhotographerHints, buildPhotographerTerms, buildPickerAnalyzerSpec, buildPickerLegend, buildPickerZodSchema, buildPoseHints, buildPoseTerms, buildPostProcessHints, buildPostProcessTerms, buildReferenceBlocks, buildScenePrompt, buildStylingHints, buildStylingTerms, buildSurroundFillPrompt, buildTemporalHints, buildTemporalTerms, buildVoiceCharacterHints, buildVoiceCharacterTerms, buildVoiceDeliveryHints, buildVoiceDeliveryTerms, buildWardrobeHints, catalogPacksVersion, characterLockToRefLock, collectIdentityLockClause, composeCameraMotionHintFromConnections, composeCameraMotionTermFromConnections, composeCharacterFxHintFromConnections, composeNegative, composePickerCatalogs, composeSoundHintFromConnections, composeTransitionHintFromConnections, computeLlmChatFields, computeNodePrompt, computePackSidecarCoverage, deriveTerm, expandImagePositionRefs, expandImageRefTokens, filmStillPrefix, getActionFx, getActionFxLabel, getActionFxPromptHint, getActionFxTerm, getAesthetic, getAestheticLabel, getAestheticPromptHint, getAestheticTerm, getAtmosphere, getAtmosphereLabel, getAtmospherePromptHint, getAtmosphereTerm, getBackdrop, getBackdropLabel, getBackdropPromptHint, getBackdropTerm, getCameraFormat, getCameraFormatLabel, getCameraFormatPromptHint, getCameraFormatTerm, getCameraMotion, getCameraMotionLabel, getCameraMotionPromptHint, getCameraMotionTerm, getCategoriesForNodeType, getCharacterFx, getCharacterFxLabel, getCharacterFxPromptHint, getCharacterFxTerm, getColorLook, getColorLookLabel, getColorLookPromptHint, getColorLookTerm, getCompositionEffect, getCompositionEffectLabel, getCompositionEffectPromptHint, getCompositionEffectTerm, getEffectiveSunoCustomMode, getEra, getEraLabel, getEraPromptHint, getEraTerm, getExposure, getExposureLabel, getExposurePromptHint, getExposureTerm, getFactoryPresets, getFactorySnippets, getFraming, getFramingCategoryLimit, getFramingLabel, getFramingPromptHint, getFramingTerm, getHeldProp, getHeldPropLabel, getHeldPropPromptHint, getHeldPropTerm, getIdentityLockClause, getInstrument, getInstrumentTerm, getLens, getLensLabel, getLensPromptHint, getLensTerm, getLighting, getLightingLabel, getLightingPromptHint, getLightingTerm, getLoopSubject, getLoopSubjectLabel, getLoopSubjectPromptHint, getLoopSubjectTerm, getMaterial, getMaterialLabel, getMaterialPromptHint, getMaterialTerm, getMood, getMoodLabel, getMoodPromptHint, getMoodTerm, getMusicEmotion, getMusicEmotionTerm, getMusicEnergy, getMusicEnergyTerm, getMusicEra, getMusicEraTerm, getMusicGenre, getMusicGenreLabel, getMusicGenreTerm, getMusicSubgenre, getMusicSubgenreTerm, getMusicVibe, getMusicVibeTerm, getParameterPromptHint, getPerson, getPersonDimensionLimit, getPersonLabel, getPersonPromptHint, getPersonTerm, getPhotoGenre, getPhotoGenreLabel, getPhotoGenrePromptHint, getPhotoGenreTerm, getPhotographer, getPhotographerLabel, getPhotographerPromptHint, getPhotographerTerm, getPickerAnalyzer, getPickerCatalog, getPickerWiring, getPose, getPoseLabel, getPosePromptHint, getPoseTerm, getPostProcessEffect, getPostProcessEffectLabel, getPostProcessEffectPromptHint, getPostProcessEffectTerm, getProductionStyle, getProductionStyleTerm, getPromptDoctrine, getPromptFields, getPromptTips, getRegisteredCatalogPacks, getRegisteredPeople, getRegisteredPersonDimensionLabels, getRegisteredPersonDimensionOrder, getRegisteredPersonFieldByDimension, getRegisteredPickerCatalogs, getRenderQuality, getRenderQualityLabel, getRenderQualityPromptHint, getRenderQualityTerm, getSetting, getSettingLabel, getSettingPromptHint, getSettingTerm, getSingingStyle, getSingingStyleTerm, getSnippetMedia, getStyle, getStyleLabel, getStylePreset, getStylePromptHint, getStyleTerm, getStyling, getStylingDimensionLimit, getStylingLabel, getStylingPromptHint, getStylingTerm, getTemporal, getTemporalLabel, getTemporalPromptHint, getTemporalTerm, getTransition, getTransitionLabel, getTransitionPromptHint, getTransitionTerm, getVocalPresence, getVocalPresenceTerm, getVoiceAccent, getVoiceAccentTerm, getVoiceAge, getVoiceAgeTerm, getVoiceArchetype, getVoiceArchetypeTerm, getVoiceEmotion, getVoiceEmotionTerm, getVoiceGender, getVoiceGenderTerm, getVoiceLanguage, getVoiceLanguageTerm, getVoicePace, getVoicePaceTerm, getVoiceTimbre, getVoiceTimbreTerm, getWardrobeEntriesByDimension, getWardrobeEntry, getWardrobePromptHint, groupFactoryPresets, hasUpstreamCharacter, identityRefsSentence, isAnalyzablePicker, isInstrumentalVocal, isSuspiciousDerivedTerm, isVantageFraming, isWizardSupported, joinPromptParts, listPickerCatalogs, migratePersonValue, nodeHasInlinePrompt, nodeHasPromptField, nodeSupportsPromptAffixes, personPacksVersion, pickerFanoutTargets, projectAllCatalogs, projectPickerCatalog, promptAffixCoreField, promptBindsFirstFrame, promptFieldCarriesAffixes, promptPartSeparator, referenceRulesBlock, registerCatalogPack, registerPersonPack, renderStructuredFields, resetCatalogPacks, resetPersonPacks, resolveBrandInput, resolveCharacterMentions, resolveGeminiOmniI2vInputs, resolveLocationMentions, resolvePrompt, resolveRefIdTokens, resolveReferenceTokens, resolveSeedance2Inputs, resolveTemplate, resolveTerm, resolveVeoI2vInputs, resolveVideoReferenceCore, summarizePickerCatalogs, toIdentityLockMode, truncateForField, truncateText, withForcedIdentityLock };
6984
+ export { ACTION_FX, ACTION_FX_CATEGORY_LABELS, ACTION_FX_CATEGORY_ORDER, ACTION_FX_IDS, AESTHETICS, AESTHETIC_CATEGORY_LABELS, AESTHETIC_CATEGORY_ORDER, AESTHETIC_IDS, ALL_PICKER_WIRING, ANALYZABLE_PICKER_TYPES, ANGLE_LABELS, ASPECT_RATIO_LABELS, ATMOSPHERES, ATMOSPHERE_IDS, AUDIO_WIZARD_CATEGORIES, type ActionFx, type ActionFxCategory, type Aesthetic, type AestheticCategory, type AssembleImageInput, type AssembleSunoInput, type AssembleSunoResult, type Atmosphere, BACKDROPS, BACKDROP_CATEGORY_LABELS, BACKDROP_CATEGORY_ORDER, BACKDROP_IDS, BRAND_PRESETS, BRAND_PRESET_IDS, BRAND_PRESET_META, type Backdrop, type BackdropCategory, type BrandCasing, type BrandFonts, type BrandLogo, type BrandPalette, type BrandPresetId, type BrandPresetMeta, type BrandTokens, type BrandTypeSpec, type BuildImagePromptConfig, type BuildImagePromptOverflowResult, type BuildImagePromptResult, type BuildImagePromptSegmentsResult, CAMERA_FORMATS, CAMERA_FORMAT_IDS, CAMERA_MOTIONS, CAMERA_MOTION_CATEGORY_LABELS, CAMERA_MOTION_CATEGORY_ORDER, CAMERA_MOTION_IDS, CHARACTER_FX, CHARACTER_FX_CATEGORY_LABELS, CHARACTER_FX_CATEGORY_ORDER, CHARACTER_FX_DURATIONS, CHARACTER_FX_IDS, CHARACTER_FX_INTENSITIES, CHARACTER_FX_POSITIONS, CINEMATIC_LOOK_TAIL, COLOR_LOOKS, COLOR_LOOK_CATEGORY_LABELS, COLOR_LOOK_CATEGORY_ORDER, COLOR_LOOK_IDS, COMPOSITION_EFFECTS, COMPOSITION_EFFECT_IDS, type CameraFormat, type CameraMotion, type CameraMotionCategory, type CatalogPack, type CatalogPackMode, type CategorizedInstrument, type CharacterFx, type CharacterFxCategory, type CharacterFxDuration, type CharacterFxIntensity, type CharacterFxPosition, type CharacterFxTiming, type CharacterFxTimingOption, type CharacterMeta, type CharacterMotionPromptInput, type CharacterPromptInput, type ColorLook, type ColorLookCategory, type CompositionEffect, type ComputeNodePromptArgs, type CreaturePromptInput, DEFAULT_IDENTITY_LOCK, DEFAULT_TEMPLATES, DIRECTION_ARRAY_CEILING, DIRECTION_FIELDS, DIRECTION_ID_MAX_CHARS, DIRECTION_KEYS, type DirectionFamily, type DirectionFieldRow, type DirectionFieldSpec, type DirectionFields, type DirectionHintMode, type DirectionKey, type DirectionSurface, ERAS, ERA_CATEGORY_LABELS, ERA_CATEGORY_ORDER, ERA_IDS, EXPOSURE_CATEGORY_LABELS, EXPOSURE_CATEGORY_ORDER, EXPOSURE_FIELD_BY_CATEGORY, EXPOSURE_IDS, EXPOSURE_SETTINGS, type Era, type EraCategory, type ExposureCategory, type ExposureSettings, type ExposureValue, FACTORY_PRESETS, FACTORY_SNIPPETS, FILM_STILL_PREFIX, FRAMINGS, FRAMING_CATEGORY_LABELS, FRAMING_CATEGORY_ORDER, FRAMING_FIELD_BY_CATEGORY, FRAMING_IDS, type FacePromptInput, type FactoryPreset, type FactoryPresetGroup, type FactorySnippet, type Framing, type FramingCategory, type FramingValue, GAPS_SCHEMA, type GeminiOmniI2vInputsArgs, type GeminiOmniI2vInputsResult, HELD_PROPS, HELD_PROP_CATEGORY_LABELS, HELD_PROP_CATEGORY_ORDER, HELD_PROP_IDS, type HeldProp, type HeldPropCategory, IMAGE_HINT_MODE_DEFAULT, IMAGE_REFERENCE_PROMPT_DOCTRINE, IMAGE_WIZARD_CATEGORIES, INSTRUMENTATION_DEFAULT_DATA, INSTRUMENTS, INSTRUMENT_CATEGORY_LABELS, INSTRUMENT_CATEGORY_ORDER, type IdentityLockMode, type ImageDirectionKey, type ImageReferenceDoctrine, type InstrumentCategory, type InstrumentationEntry, LENSES, LENS_IDS, LIGHTINGS, LIGHTING_CATEGORY_LABELS, LIGHTING_CATEGORY_ORDER, LIGHTING_FIELD_BY_CATEGORY, LIGHTING_IDS, LLM_CHAT_WIZARD_CATEGORIES, LOOP_SUBJECTS, LOOP_SUBJECT_CATEGORY_LABELS, LOOP_SUBJECT_CATEGORY_ORDER, type Lens, type Lighting, type LightingCategory, type LightingValue, type LlmChatFieldArgs, type LocationMotionPromptInput, type LocationPromptInput, type LocationRefinePromptInput, type LoopSubject, type LoopSubjectCategory, MATERIALS, MATERIAL_CATEGORY_LABELS, MATERIAL_CATEGORY_ORDER, MATERIAL_IDS, MAX_SELECTED_BY_DIMENSION, MAX_SELECTED_BY_FRAMING_CATEGORY, MAX_SELECTED_BY_STYLING_DIMENSION, MAX_SUBJECT_KEYS, MOODS, MOOD_CATEGORY_LABELS, MOOD_CATEGORY_ORDER, MOOD_IDS, MOVEMENT_LABELS, MULTI_PICKER_WIRING, MUSIC_EMOTIONS, MUSIC_ENERGIES, MUSIC_ERAS, MUSIC_GENRES, MUSIC_GENRE_CATEGORY_LABELS, MUSIC_GENRE_CATEGORY_ORDER, MUSIC_GENRE_DEFAULT_DATA, MUSIC_MOOD_DEFAULT_DATA, MUSIC_VIBES, MUSIC_WIZARD_CATEGORIES, type Material, type MaterialCategory, type ModelChange, type Mood, type MoodCategory, type MoodValue, type MultiDimPickerWiring, type MultiPickerAnalyzerSpec, type MusicEra, type MusicGenre, type MusicGenreCategory, type MusicMoodData, type MusicMoodEntry, type MusicSubgenre, NODE_PROMPT_CANDIDATE_FIELDS, NODE_PROMPT_FIELDS, OBJECT_ANGLE_PRESETS, OBJECT_ANGLE_PROMPTS, OBJECT_ASSET_PRESETS, OBJECT_ASSET_PROMPTS, OBJECT_MATERIAL_PRESETS, OBJECT_MATERIAL_PROMPTS, OBJECT_VARIATION_PRESETS, OBJECT_VARIATION_PROMPTS, type ObjectMotionPromptInput, type ObjectPresetAssetType, type ObjectPromptInput, PEOPLE, PERSON_DIMENSION_LABELS, PERSON_DIMENSION_ORDER, PERSON_DIMENSION_SECTIONS, PERSON_FIELD_BY_DIMENSION, PERSON_IDS, PHOTOGRAPHERS, PHOTOGRAPHER_CATEGORY_LABELS, PHOTOGRAPHER_CATEGORY_ORDER, PHOTOGRAPHER_IDS, PHOTO_GENRES, PHOTO_GENRE_CATEGORY_LABELS, PHOTO_GENRE_CATEGORY_ORDER, PHOTO_GENRE_IDS, PICKER_ANALYZER_FAMILIES, PICKER_ANALYZER_REGISTRY, PICKER_CATALOGS, PICKER_TYPES, POSES, POSE_CATEGORY_LABELS, POSE_CATEGORY_ORDER, POSE_IDS, POST_PROCESS_EFFECTS, POST_PROCESS_EFFECT_IDS, PRODUCTION_STYLES, PROMPT_AFFIX_CORE_FIELD_OVERRIDES, PROMPT_AFFIX_NODE_TYPES, PROMPT_HINT_SEPARATOR, PROVIDER_CAPABILITIES, PROVIDER_PROMPT_DOCTRINES, type Person, type PersonDimension, type PersonDimensionSection, type PersonPack, type PersonValue, type PhotoGenre, type PhotoGenreCategory, type Photographer, type PhotographerCategory, type PickerAnalyzer, type PickerAnalyzerDescriptor, type PickerAnalyzerSpec, type PickerApplyMode, type PickerCatalog, type PickerCatalogDetail, type PickerCatalogInput, type PickerCatalogSummary, type PickerDimension, type PickerDimensionInput, type PickerDimensionSpec, type PickerGaps, type PickerHintMode, type PickerOption, type PickerOptionInput, type PickerType, type PickerWiring, type PickerWiringEntry, type Pose, type PoseCategory, type PoseValue, type PostProcessEffect, type ProjectPickerCatalogOptions, type ProjectedPickerCatalog, type ProjectedPickerDimension, type ProjectedPickerOption, type PromptFieldSpec, type PromptIconKind, type PromptSegment, type PromptSegmentOrigin, type ProviderPromptDoctrine, REFERENCE_IMAGE_ROLES, REFERENCE_RULES, REFERENCE_RULES_MULTI_PERSON, REF_BINDING, RENDER_QUALITIES, RENDER_QUALITY_IDS, type RecommendedModel, type RefIdTokenContext, type ReferenceCounts, type RegisteredPersonEntry, type RenderQuality, type ResolveCharacterMentionsResult, type ResolveLocationMentionsResult, type ResolvePromptArgs, type ResolveVideoReferenceCoreArgs, SCENE_FRAME_RULE, SCENE_PROMPT_MAX_LENGTH, SETTINGS, SETTING_CATEGORY_LABELS, SETTING_IDS, SHOT_LABELS, SINGING_STYLES, SINGLE_PICKER_WIRING, SNIPPET_MEDIA_VALUES, STYLES, STYLE_IDS, STYLE_PRESETS, STYLINGS, STYLING_DIMENSION_LABELS, STYLING_DIMENSION_ORDER, STYLING_FIELD_BY_DIMENSION, STYLING_IDS, SUBJECT_ARRAY_CEILING, SUBJECT_CUSTOM_AGE_KEY, SUBJECT_FIELDS, SUBJECT_FOLD_KEYS, SUBJECT_ID_MAX_CHARS, SUBJECT_IMAGE_HINT_MODE_DEFAULT, SUBJECT_KEYS, SUBJECT_KEY_MAX_CHARS, SUBJECT_VIDEO_HINT_MODE_DEFAULT, type Seedance2InputsArgs, type Seedance2InputsResult, type Seedance2Mode, type Setting, type SettingCategory, type SidecarCoverageReport, type SingleDimPickerWiring, type SnippetMedia, type SnippetTarget, type SoundComposition, type SoundCompositionFields, type SoundConsumerType, type StructuredPromptFields, type Style, type StylePreset, type Styling, type StylingDimension, type StylingValue, type SubjectFieldRow, type SubjectFieldSpec, type SubjectFields, type SubjectGroupFieldSpec, type SubjectHintMode, type SubjectIdsFieldSpec, type SubjectSurface, type SuspiciousTermOptions, TEMPORALS, TEMPORAL_CATEGORY_LABELS, TEMPORAL_CATEGORY_ORDER, TEMPORAL_FIELD_BY_CATEGORY, TEMPORAL_IDS, TERM_MAX_CHARS, TEXT_WIZARD_CATEGORIES, TRANSITIONS, TRANSITION_CATEGORY_LABELS, TRANSITION_CATEGORY_ORDER, TRANSITION_DURATIONS, TRANSITION_IDS, TRANSITION_INTENSITIES, TRANSITION_POSITIONS, type Temporal, type TemporalCategory, type TemporalValue, type TermCarrier, type Transition, type TransitionCategory, type TransitionDuration, type TransitionIntensity, type TransitionPosition, type TransitionTiming, type TransitionTimingOption, VIDEO_HINT_MODE_DEFAULT, VIDEO_WIZARD_CATEGORIES, VOCAL_PRESENCE, VOCAL_PRESENCE_INSTRUMENTAL_ID, VOICE_ACCENTS, VOICE_AGES, VOICE_ARCHETYPES, VOICE_CHARACTER_DEFAULT_DATA, VOICE_DELIVERY_DEFAULT_DATA, VOICE_EMOTIONS, VOICE_GENDERS, VOICE_LANGUAGES, VOICE_PACES, VOICE_TIMBRES, type VeoI2vInputsArgs, type VeoI2vInputsResult, type VideoDirectionKey, type VideoExtraRef, type VideoPromptCapOptions, type VoiceCharacterEntry, type VoiceDeliveryEntry, WARDROBE, WARDROBE_CATEGORY_LABELS, WARDROBE_DIMENSION_ORDER, WARDROBE_FIELD_BY_DIMENSION, type WardrobeDimension, type WardrobeEntry, type WardrobeValue, type WizardCategory, type WizardNodeContext, type WizardOption, type WizardQuestion, type WizardSelection, appendField, appendMusicMeta, applyPickerJson, applyPromptAffixes, applyReferenceOrderToVideo, applyTemplate, assembleImageInput, assembleSunoInput, buildActionFxHints, buildActionFxTerms, buildAestheticHints, buildAestheticTerms, buildAgeHint, buildAtmosphereHints, buildAtmosphereTerms, buildCharacterPrompt, buildCreaturePrompt, buildExposureHints, buildExposureTerms, buildFaceTemplateInputs, buildFramingHints, buildFramingTerms, buildHeldPropHints, buildHeldPropTerms, buildIdentityDirectives, buildIdentityLockLine, buildImagePrompt, buildImagePromptSegments, buildImagePromptWithOverflow, buildInstrumentationHints, buildInstrumentationTerms, buildLightingHints, buildLightingTerms, buildLocationMotionPrompt, buildLocationPrompt, buildLocationRefinePrompt, buildMaterialHints, buildMaterialTerms, buildMoodHints, buildMoodTerms, buildMotionPrompt, buildMultiPickerAnalyzerSpec, buildMusicGenreHints, buildMusicGenreTerms, buildMusicMoodHints, buildMusicMoodTerms, buildObjectMotionPrompt, buildObjectPrompt, buildPersonHints, buildPersonTerms, buildPhotographerHints, buildPhotographerTerms, buildPickerAnalyzerSpec, buildPickerLegend, buildPickerZodSchema, buildPoseHints, buildPoseTerms, buildPostProcessHints, buildPostProcessTerms, buildReferenceBlocks, buildScenePrompt, buildStylingHints, buildStylingTerms, buildSurroundFillPrompt, buildTemporalHints, buildTemporalTerms, buildVoiceCharacterHints, buildVoiceCharacterTerms, buildVoiceDeliveryHints, buildVoiceDeliveryTerms, buildWardrobeHints, catalogPacksVersion, characterLockToRefLock, collectIdentityLockClause, composeCameraMotionHintFromConnections, composeCameraMotionTermFromConnections, composeCharacterFxHintFromConnections, composeNegative, composePickerCatalogs, composeSoundHintFromConnections, composeTransitionHintFromConnections, composeVideoPromptText, computeLlmChatFields, computeNodePrompt, computePackSidecarCoverage, deriveTerm, directionFieldsForSurface, expandImagePositionRefs, expandImageRefTokens, filmStillPrefix, getActionFx, getActionFxLabel, getActionFxPromptHint, getActionFxTerm, getAesthetic, getAestheticLabel, getAestheticPromptHint, getAestheticTerm, getAtmosphere, getAtmosphereLabel, getAtmospherePromptHint, getAtmosphereTerm, getBackdrop, getBackdropLabel, getBackdropPromptHint, getBackdropTerm, getCameraFormat, getCameraFormatLabel, getCameraFormatPromptHint, getCameraFormatTerm, getCameraMotion, getCameraMotionLabel, getCameraMotionPromptHint, getCameraMotionTerm, getCategoriesForNodeType, getCharacterFx, getCharacterFxLabel, getCharacterFxPromptHint, getCharacterFxTerm, getColorLook, getColorLookLabel, getColorLookPromptHint, getColorLookTerm, getCompositionEffect, getCompositionEffectLabel, getCompositionEffectPromptHint, getCompositionEffectTerm, getEffectiveSunoCustomMode, getEra, getEraLabel, getEraPromptHint, getEraTerm, getExposure, getExposureLabel, getExposurePromptHint, getExposureTerm, getFactoryPresets, getFactorySnippets, getFraming, getFramingCategoryLimit, getFramingLabel, getFramingPromptHint, getFramingTerm, getHeldProp, getHeldPropLabel, getHeldPropPromptHint, getHeldPropTerm, getIdentityLockClause, getInstrument, getInstrumentTerm, getLens, getLensLabel, getLensPromptHint, getLensTerm, getLighting, getLightingLabel, getLightingPromptHint, getLightingTerm, getLoopSubject, getLoopSubjectLabel, getLoopSubjectPromptHint, getLoopSubjectTerm, getMaterial, getMaterialLabel, getMaterialPromptHint, getMaterialTerm, getMood, getMoodLabel, getMoodPromptHint, getMoodTerm, getMusicEmotion, getMusicEmotionTerm, getMusicEnergy, getMusicEnergyTerm, getMusicEra, getMusicEraTerm, getMusicGenre, getMusicGenreLabel, getMusicGenreTerm, getMusicSubgenre, getMusicSubgenreTerm, getMusicVibe, getMusicVibeTerm, getParameterPromptHint, getPerson, getPersonDimensionLimit, getPersonLabel, getPersonPromptHint, getPersonTerm, getPhotoGenre, getPhotoGenreLabel, getPhotoGenrePromptHint, getPhotoGenreTerm, getPhotographer, getPhotographerLabel, getPhotographerPromptHint, getPhotographerTerm, getPickerAnalyzer, getPickerCatalog, getPickerWiring, getPose, getPoseLabel, getPosePromptHint, getPoseTerm, getPostProcessEffect, getPostProcessEffectLabel, getPostProcessEffectPromptHint, getPostProcessEffectTerm, getProductionStyle, getProductionStyleTerm, getPromptDoctrine, getPromptFields, getPromptTips, getRegisteredCatalogPacks, getRegisteredPeople, getRegisteredPersonDimensionLabels, getRegisteredPersonDimensionOrder, getRegisteredPersonFieldByDimension, getRegisteredPickerCatalogs, getRegisteredSubjectKeys, getRenderQuality, getRenderQualityLabel, getRenderQualityPromptHint, getRenderQualityTerm, getSetting, getSettingLabel, getSettingPromptHint, getSettingTerm, getSingingStyle, getSingingStyleTerm, getSnippetMedia, getStyle, getStyleLabel, getStylePreset, getStylePromptHint, getStyleTerm, getStyling, getStylingDimensionLimit, getStylingLabel, getStylingPromptHint, getStylingTerm, getTemporal, getTemporalLabel, getTemporalPromptHint, getTemporalTerm, getTransition, getTransitionLabel, getTransitionPromptHint, getTransitionTerm, getVocalPresence, getVocalPresenceTerm, getVoiceAccent, getVoiceAccentTerm, getVoiceAge, getVoiceAgeTerm, getVoiceArchetype, getVoiceArchetypeTerm, getVoiceEmotion, getVoiceEmotionTerm, getVoiceGender, getVoiceGenderTerm, getVoiceLanguage, getVoiceLanguageTerm, getVoicePace, getVoicePaceTerm, getVoiceTimbre, getVoiceTimbreTerm, getWardrobeEntriesByDimension, getWardrobeEntry, getWardrobePromptHint, groupFactoryPresets, hasUpstreamCharacter, identityRefsSentence, isAnalyzablePicker, isInstrumentalVocal, isSuspiciousDerivedTerm, isVantageFraming, isWizardSupported, joinPromptHints, joinPromptParts, keepableDirectionHints, listPickerCatalogs, migratePersonValue, modeForFamily, nodeHasInlinePrompt, nodeHasPromptField, nodeSupportsPromptAffixes, normalizeSubjectFields, personPacksVersion, pickerFanoutTargets, projectAllCatalogs, projectPickerCatalog, promptAffixCoreField, promptBindsFirstFrame, promptFieldCarriesAffixes, promptPartSeparator, readDirectionFields, readStructuredFields, readSubjectFields, referenceRulesBlock, registerCatalogPack, registerPersonPack, renderDirectionHints, renderStructuredFields, renderSubjectHints, resetCatalogPacks, resetPersonPacks, resolveBrandInput, resolveCharacterMentions, resolveGeminiOmniI2vInputs, resolveLocationMentions, resolvePrompt, resolveRefIdTokens, resolveReferenceTokens, resolveSeedance2Inputs, resolveTemplate, resolveTerm, resolveVeoI2vInputs, resolveVideoReferenceCore, subjectFieldsForSurface, summarizePickerCatalogs, toIdentityLockMode, truncateForField, truncateText, withForcedIdentityLock };