@nodaro/prompts 1.41.0 → 1.42.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 (85) hide show
  1. package/dist/{catalog-packs-BP21C1lp.d.cts → catalog-packs-C9CXEWfl.d.cts} +1 -1
  2. package/dist/{catalog-packs-3SxAVxPF.d.ts → catalog-packs-D7NJpo4k.d.ts} +1 -1
  3. package/dist/{chunk-3U7X6JZN.cjs → chunk-4YUXR23B.cjs} +13 -13
  4. package/dist/{chunk-3U7X6JZN.cjs.map → chunk-4YUXR23B.cjs.map} +1 -1
  5. package/dist/{chunk-DUXX6CBX.js → chunk-6JABZ5OC.js} +4 -4
  6. package/dist/{chunk-DUXX6CBX.js.map → chunk-6JABZ5OC.js.map} +1 -1
  7. package/dist/{chunk-PWWM7Q3T.cjs → chunk-AXQK7UH7.cjs} +49 -49
  8. package/dist/{chunk-PWWM7Q3T.cjs.map → chunk-AXQK7UH7.cjs.map} +1 -1
  9. package/dist/{chunk-SXXW4LCR.js → chunk-CYMIXKFT.js} +12 -8
  10. package/dist/chunk-CYMIXKFT.js.map +1 -0
  11. package/dist/{chunk-6GVFJLDL.js → chunk-GIO77YH5.js} +4 -4
  12. package/dist/{chunk-6GVFJLDL.js.map → chunk-GIO77YH5.js.map} +1 -1
  13. package/dist/{chunk-C3NHNECH.cjs → chunk-H4JMZWOE.cjs} +39 -39
  14. package/dist/{chunk-C3NHNECH.cjs.map → chunk-H4JMZWOE.cjs.map} +1 -1
  15. package/dist/{chunk-GTDKDD7Y.js → chunk-HL6PZ4A6.js} +5 -5
  16. package/dist/{chunk-GTDKDD7Y.js.map → chunk-HL6PZ4A6.js.map} +1 -1
  17. package/dist/chunk-HOMR5XFP.js +3 -0
  18. package/dist/{chunk-F4VO6YEJ.js.map → chunk-HOMR5XFP.js.map} +1 -1
  19. package/dist/{chunk-SECAGGRK.cjs → chunk-I3QS7BSY.cjs} +8 -8
  20. package/dist/{chunk-SECAGGRK.cjs.map → chunk-I3QS7BSY.cjs.map} +1 -1
  21. package/dist/{chunk-JOHYGDUU.js → chunk-IFRFYBGE.js} +3 -3
  22. package/dist/{chunk-JOHYGDUU.js.map → chunk-IFRFYBGE.js.map} +1 -1
  23. package/dist/chunk-JCYK7NSR.js +3384 -0
  24. package/dist/chunk-JCYK7NSR.js.map +1 -0
  25. package/dist/{chunk-2P26SZX5.cjs → chunk-JDNHMVEV.cjs} +35 -35
  26. package/dist/{chunk-2P26SZX5.cjs.map → chunk-JDNHMVEV.cjs.map} +1 -1
  27. package/dist/{chunk-HQTHDTHN.js → chunk-PHFOKGYS.js} +6 -6
  28. package/dist/{chunk-HQTHDTHN.js.map → chunk-PHFOKGYS.js.map} +1 -1
  29. package/dist/{chunk-EAYEZXWT.js → chunk-QJACEKMZ.js} +3 -3
  30. package/dist/{chunk-EAYEZXWT.js.map → chunk-QJACEKMZ.js.map} +1 -1
  31. package/dist/{chunk-MQEXFCNU.cjs → chunk-SB7AYE6S.cjs} +14 -10
  32. package/dist/chunk-SB7AYE6S.cjs.map +1 -0
  33. package/dist/chunk-T4OJFIJK.cjs +4 -0
  34. package/dist/{chunk-VIT3NKGB.cjs.map → chunk-T4OJFIJK.cjs.map} +1 -1
  35. package/dist/chunk-WARNUGXT.cjs +3403 -0
  36. package/dist/chunk-WARNUGXT.cjs.map +1 -0
  37. package/dist/{chunk-QDUTMOF4.js → chunk-ZFOXGNLK.js} +4 -4
  38. package/dist/{chunk-QDUTMOF4.js.map → chunk-ZFOXGNLK.js.map} +1 -1
  39. package/dist/{chunk-IUCNJAHW.cjs → chunk-ZGA72NCT.cjs} +125 -125
  40. package/dist/{chunk-IUCNJAHW.cjs.map → chunk-ZGA72NCT.cjs.map} +1 -1
  41. package/dist/{chunk-WRM52ZBN.cjs → chunk-ZLRB5BVT.cjs} +18 -18
  42. package/dist/{chunk-WRM52ZBN.cjs.map → chunk-ZLRB5BVT.cjs.map} +1 -1
  43. package/dist/entries/assembly.cjs +29 -29
  44. package/dist/entries/assembly.js +6 -6
  45. package/dist/entries/catalog-packs.d.cts +4 -4
  46. package/dist/entries/catalog-packs.d.ts +4 -4
  47. package/dist/entries/person.d.cts +3 -3
  48. package/dist/entries/person.d.ts +3 -3
  49. package/dist/entries/picker-art.cjs +29 -17
  50. package/dist/entries/picker-art.d.cts +1122 -447
  51. package/dist/entries/picker-art.d.ts +1122 -447
  52. package/dist/entries/picker-art.js +2 -2
  53. package/dist/entries/picker-catalogs.cjs +57 -57
  54. package/dist/entries/picker-catalogs.d.cts +3 -3
  55. package/dist/entries/picker-catalogs.d.ts +3 -3
  56. package/dist/entries/picker-catalogs.js +5 -5
  57. package/dist/entries/pickers.cjs +374 -374
  58. package/dist/entries/pickers.js +3 -3
  59. package/dist/entries/prompt-builder.cjs +76 -76
  60. package/dist/entries/prompt-builder.js +5 -5
  61. package/dist/images-DrbQB9Yh.d.cts +65 -0
  62. package/dist/images-DrbQB9Yh.d.ts +65 -0
  63. package/dist/index.cjs +554 -542
  64. package/dist/index.d.cts +4 -4
  65. package/dist/index.d.ts +4 -4
  66. package/dist/index.js +10 -10
  67. package/dist/{picker-catalogs-DDjtZND3.d.ts → picker-catalogs-BM8IphF1.d.ts} +1 -1
  68. package/dist/{picker-catalogs-CmV7r0j1.d.cts → picker-catalogs-C3utGMRB.d.cts} +1 -1
  69. package/package.json +2 -2
  70. package/src/__tests__/picker-art-images.test.ts +94 -3
  71. package/src/picker-art/images.ts +59 -9
  72. package/src/picker-art/index.ts +1 -0
  73. package/src/picker-art/look-preview-sets.ts +449 -445
  74. package/src/picker-art/sound-render-sets.ts +688 -0
  75. package/src/picker-catalogs.ts +12 -8
  76. package/dist/chunk-F4VO6YEJ.js +0 -3
  77. package/dist/chunk-MQEXFCNU.cjs.map +0 -1
  78. package/dist/chunk-QGVZXBDE.cjs +0 -2708
  79. package/dist/chunk-QGVZXBDE.cjs.map +0 -1
  80. package/dist/chunk-RZJEROA2.js +0 -2692
  81. package/dist/chunk-RZJEROA2.js.map +0 -1
  82. package/dist/chunk-SXXW4LCR.js.map +0 -1
  83. package/dist/chunk-VIT3NKGB.cjs +0 -4
  84. package/dist/images-BAnMUUmW.d.cts +0 -39
  85. package/dist/images-BAnMUUmW.d.ts +0 -39
@@ -0,0 +1,3 @@
1
+
2
+ //# sourceMappingURL=chunk-HOMR5XFP.js.map
3
+ //# sourceMappingURL=chunk-HOMR5XFP.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-F4VO6YEJ.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-HOMR5XFP.js"}
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkMQEXFCNU_cjs = require('./chunk-MQEXFCNU.cjs');
3
+ var chunkSB7AYE6S_cjs = require('./chunk-SB7AYE6S.cjs');
4
4
  var catalogs = require('@nodaro/shared/catalogs');
5
5
 
6
6
  var WARDROBE_DIMENSION_ORDER = [
@@ -169,11 +169,11 @@ function getCharacterMotionDiagnostics(value, timing, bindings = {}) {
169
169
  const requested = typeof value === "string" ? [value] : Array.isArray(value) ? [...new Set(value)] : [];
170
170
  const result = [];
171
171
  const add = (code, severity, ids, message) => result.push({ code, severity, ids, message });
172
- if (requested.length > chunkMQEXFCNU_cjs.CHARACTER_MOTION_MAX_PICKS) add("capacity", "warning", requested, "Only the first three selections contribute. Remove extra selections.");
173
- const picks = requested.slice(0, chunkMQEXFCNU_cjs.CHARACTER_MOTION_MAX_PICKS);
174
- for (const id of picks) if (!chunkMQEXFCNU_cjs.getCharacterMotion(id)) add("unknown", "error", [id], `Motion \u201C${id}\u201D is unavailable and contributes no fragment. Remove or replace it.`);
172
+ if (requested.length > chunkSB7AYE6S_cjs.CHARACTER_MOTION_MAX_PICKS) add("capacity", "warning", requested, "Only the first three selections contribute. Remove extra selections.");
173
+ const picks = requested.slice(0, chunkSB7AYE6S_cjs.CHARACTER_MOTION_MAX_PICKS);
174
+ for (const id of picks) if (!chunkSB7AYE6S_cjs.getCharacterMotion(id)) add("unknown", "error", [id], `Motion \u201C${id}\u201D is unavailable and contributes no fragment. Remove or replace it.`);
175
175
  const entries = picks.flatMap((id) => {
176
- const entry = chunkMQEXFCNU_cjs.getCharacterMotion(id);
176
+ const entry = chunkSB7AYE6S_cjs.getCharacterMotion(id);
177
177
  return entry?.promptHint ? [entry] : [];
178
178
  });
179
179
  const active = entries.filter((e) => !bindings.subjectMinor || !e.adultOnly);
@@ -182,7 +182,7 @@ function getCharacterMotionDiagnostics(value, timing, bindings = {}) {
182
182
  if (omitted.length) add("omitted", active.length ? "warning" : "error", omitted.map((e) => e.id), `${omitted.map((e) => e.label).join(", ")} omitted for a connected minor. ${active.length ? "Replace these selections." : "No selected motion contributes a fragment."}`);
183
183
  if ((bindings.targetNames?.length ?? 0) > 1) add("multiple-targets", "warning", picks, "Each target performs a separate copy of the sequence. Use separate motion nodes for coordinated choreography.");
184
184
  for (const entry of active) {
185
- if (entry.deprecated) add("retired", "warning", [entry.id], `${entry.label} is retired from new choices but still resolves in saved workflows.${entry.replacementId ? ` Use ${chunkMQEXFCNU_cjs.getCharacterMotion(entry.replacementId)?.label ?? entry.replacementId}.` : ""}`);
185
+ if (entry.deprecated) add("retired", "warning", [entry.id], `${entry.label} is retired from new choices but still resolves in saved workflows.${entry.replacementId ? ` Use ${chunkSB7AYE6S_cjs.getCharacterMotion(entry.replacementId)?.label ?? entry.replacementId}.` : ""}`);
186
186
  if (entry.fixedPace && timing?.pace && timing.pace !== "auto") add("pace", "warning", [entry.id], `${entry.label} sets its own timing. Set Pace to Auto or replace the motion.`);
187
187
  if (entry.requires?.length) add("requirements", "info", [entry.id], `${entry.label} requires: ${entry.requires.join(", ")}.${entry.twoPerson || entry.counterpart ? bindings.partnerNames?.length ? ` Partner reference: ${bindings.partnerNames.join(", ")}; confirm it matches the required recipient.` : " Connect a Partner reference to identify the recipient; otherwise the model chooses it." : " Establish these in the scene or prompt; the fragment does not supply reference media."}`);
188
188
  }
@@ -206,5 +206,5 @@ exports.getCharacterMotionDiagnostics = getCharacterMotionDiagnostics;
206
206
  exports.getWardrobeEntriesByDimension = getWardrobeEntriesByDimension;
207
207
  exports.getWardrobeEntry = getWardrobeEntry;
208
208
  exports.getWardrobePromptHint = getWardrobePromptHint;
209
- //# sourceMappingURL=chunk-SECAGGRK.cjs.map
210
- //# sourceMappingURL=chunk-SECAGGRK.cjs.map
209
+ //# sourceMappingURL=chunk-I3QS7BSY.cjs.map
210
+ //# sourceMappingURL=chunk-I3QS7BSY.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/wardrobe.ts","../src/character-motion-diagnostics.ts"],"names":["id","pickIds","h","CHARACTER_MOTION_MAX_PICKS","getCharacterMotion"],"mappings":"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","file":"chunk-SECAGGRK.cjs","sourcesContent":["import { pickIds } from \"@nodaro/shared/catalogs\"\n\nexport type WardrobeDimension =\n | \"archetype\" | \"top\" | \"bottom\" | \"outerwear\" | \"footwear\"\n | \"headwear\" | \"accessories\" | \"color-palette\" | \"material\" | \"era\"\n\nexport interface WardrobeEntry {\n readonly id: string\n readonly label: string\n readonly dimension: WardrobeDimension\n readonly promptHint: string\n}\n\nexport interface WardrobeValue {\n archetype?: string\n top?: string\n bottom?: string\n outerwear?: string\n footwear?: string\n headwear?: string | ReadonlyArray<string>\n accessories?: string | ReadonlyArray<string>\n colorPalette?: string\n material?: string\n era?: string\n}\n\nexport const WARDROBE_DIMENSION_ORDER: ReadonlyArray<WardrobeDimension> = [\n \"archetype\", \"top\", \"bottom\", \"outerwear\", \"footwear\",\n \"headwear\", \"accessories\", \"color-palette\", \"material\", \"era\",\n]\n\nexport const WARDROBE_CATEGORY_LABELS: Readonly<Record<WardrobeDimension, string>> = {\n archetype: \"Archetype\", top: \"Top\", bottom: \"Bottom\", outerwear: \"Outerwear\",\n footwear: \"Footwear\", headwear: \"Headwear\", accessories: \"Accessories\",\n \"color-palette\": \"Color Palette\", material: \"Material\", era: \"Era\",\n}\n\nexport const WARDROBE_FIELD_BY_DIMENSION: Record<WardrobeDimension, keyof WardrobeValue> = {\n archetype: \"archetype\", top: \"top\", bottom: \"bottom\", outerwear: \"outerwear\",\n footwear: \"footwear\", headwear: \"headwear\", accessories: \"accessories\",\n \"color-palette\": \"colorPalette\", material: \"material\", era: \"era\",\n}\n\n/** Multi-pick dims emit each picked entry independently. */\nconst MULTI_PICK: ReadonlySet<WardrobeDimension> = new Set([\"headwear\", \"accessories\"])\n/** Sentinel ids that mean \"nothing here\" and emit no hint. */\nconst NONE_IDS: ReadonlySet<string> = new Set([\"wd-outer-none\"])\n\nexport const WARDROBE: ReadonlyArray<WardrobeEntry> = [\n // archetype\n { id: \"wd-casual\", label: \"Casual\", dimension: \"archetype\", promptHint: \"in casual everyday clothing\" },\n { id: \"wd-business\", label: \"Business\", dimension: \"archetype\", promptHint: \"in smart business attire\" },\n { id: \"wd-formal\", label: \"Formal\", dimension: \"archetype\", promptHint: \"in elegant formal wear\" },\n { id: \"wd-streetwear\", label: \"Streetwear\", dimension: \"archetype\", promptHint: \"in contemporary streetwear\" },\n { id: \"wd-athletic\", label: \"Athletic\", dimension: \"archetype\", promptHint: \"in athletic sportswear\" },\n { id: \"wd-fantasy\", label: \"Fantasy\", dimension: \"archetype\", promptHint: \"in fantasy costume\" },\n { id: \"wd-scifi\", label: \"Sci-Fi\", dimension: \"archetype\", promptHint: \"in futuristic sci-fi attire\" },\n { id: \"wd-historical\", label: \"Historical\", dimension: \"archetype\", promptHint: \"in period historical dress\" },\n { id: \"wd-uniform\", label: \"Uniform\", dimension: \"archetype\", promptHint: \"in a uniform\" },\n { id: \"wd-loungewear\", label: \"Loungewear\", dimension: \"archetype\", promptHint: \"in relaxed loungewear\" },\n // top\n { id: \"wd-tshirt\", label: \"T-Shirt\", dimension: \"top\", promptHint: \"wearing a t-shirt\" },\n { id: \"wd-blouse\", label: \"Blouse\", dimension: \"top\", promptHint: \"wearing a blouse\" },\n { id: \"wd-hoodie\", label: \"Hoodie\", dimension: \"top\", promptHint: \"wearing a hoodie\" },\n { id: \"wd-buttondown\", label: \"Button-down\", dimension: \"top\", promptHint: \"wearing a button-down shirt\" },\n { id: \"wd-tank\", label: \"Tank\", dimension: \"top\", promptHint: \"wearing a tank top\" },\n { id: \"wd-sweater\", label: \"Sweater\", dimension: \"top\", promptHint: \"wearing a sweater\" },\n { id: \"wd-turtleneck\", label: \"Turtleneck\", dimension: \"top\", promptHint: \"wearing a turtleneck\" },\n // bottom\n { id: \"wd-jeans\", label: \"Jeans\", dimension: \"bottom\", promptHint: \"wearing jeans\" },\n { id: \"wd-trousers\", label: \"Trousers\", dimension: \"bottom\", promptHint: \"wearing tailored trousers\" },\n { id: \"wd-skirt\", label: \"Skirt\", dimension: \"bottom\", promptHint: \"wearing a skirt\" },\n { id: \"wd-shorts\", label: \"Shorts\", dimension: \"bottom\", promptHint: \"wearing shorts\" },\n { id: \"wd-leggings\", label: \"Leggings\", dimension: \"bottom\", promptHint: \"wearing leggings\" },\n { id: \"wd-cargo\", label: \"Cargo\", dimension: \"bottom\", promptHint: \"wearing cargo pants\" },\n // outerwear\n { id: \"wd-outer-none\", label: \"None\", dimension: \"outerwear\", promptHint: \"\" },\n { id: \"wd-leatherjkt\", label: \"Leather Jacket\", dimension: \"outerwear\", promptHint: \"in a leather jacket\" },\n { id: \"wd-blazer\", label: \"Blazer\", dimension: \"outerwear\", promptHint: \"in a blazer\" },\n { id: \"wd-trench\", label: \"Trench Coat\", dimension: \"outerwear\", promptHint: \"in a trench coat\" },\n { id: \"wd-parka\", label: \"Parka\", dimension: \"outerwear\", promptHint: \"in a parka\" },\n { id: \"wd-cloak\", label: \"Cloak\", dimension: \"outerwear\", promptHint: \"in a flowing cloak\" },\n { id: \"wd-denimjkt\", label: \"Denim Jacket\", dimension: \"outerwear\", promptHint: \"in a denim jacket\" },\n { id: \"wd-cardigan\", label: \"Cardigan\", dimension: \"outerwear\", promptHint: \"in a cardigan\" },\n // footwear\n { id: \"wd-sneakers\", label: \"Sneakers\", dimension: \"footwear\", promptHint: \"wearing sneakers\" },\n { id: \"wd-boots\", label: \"Boots\", dimension: \"footwear\", promptHint: \"wearing boots\" },\n { id: \"wd-heels\", label: \"Heels\", dimension: \"footwear\", promptHint: \"wearing heels\" },\n { id: \"wd-sandals\", label: \"Sandals\", dimension: \"footwear\", promptHint: \"wearing sandals\" },\n { id: \"wd-dressshoe\", label: \"Dress Shoes\", dimension: \"footwear\", promptHint: \"wearing dress shoes\" },\n { id: \"wd-barefoot\", label: \"Barefoot\", dimension: \"footwear\", promptHint: \"barefoot\" },\n // headwear (multi)\n { id: \"wd-cap\", label: \"Cap\", dimension: \"headwear\", promptHint: \"wearing a cap\" },\n { id: \"wd-beanie\", label: \"Beanie\", dimension: \"headwear\", promptHint: \"wearing a beanie\" },\n { id: \"wd-widehat\", label: \"Wide-brim Hat\", dimension: \"headwear\", promptHint: \"wearing a wide-brim hat\" },\n { id: \"wd-hood\", label: \"Hood\", dimension: \"headwear\", promptHint: \"with the hood up\" },\n { id: \"wd-crown\", label: \"Crown\", dimension: \"headwear\", promptHint: \"wearing a crown\" },\n { id: \"wd-helmet\", label: \"Helmet\", dimension: \"headwear\", promptHint: \"wearing a helmet\" },\n // accessories (multi)\n { id: \"wd-glasses\", label: \"Glasses\", dimension: \"accessories\", promptHint: \"wearing glasses\" },\n { id: \"wd-sunglasses\", label: \"Sunglasses\", dimension: \"accessories\", promptHint: \"wearing sunglasses\" },\n { id: \"wd-scarf\", label: \"Scarf\", dimension: \"accessories\", promptHint: \"wearing a scarf\" },\n { id: \"wd-gloves\", label: \"Gloves\", dimension: \"accessories\", promptHint: \"wearing gloves\" },\n { id: \"wd-jewelry\", label: \"Jewelry\", dimension: \"accessories\", promptHint: \"wearing statement jewelry\" },\n { id: \"wd-belt\", label: \"Belt\", dimension: \"accessories\", promptHint: \"with a belt\" },\n { id: \"wd-watch\", label: \"Watch\", dimension: \"accessories\", promptHint: \"wearing a watch\" },\n // color-palette\n { id: \"wd-neutral\", label: \"Neutral\", dimension: \"color-palette\", promptHint: \"in a neutral color palette\" },\n { id: \"wd-all-black\", label: \"All Black\", dimension: \"color-palette\", promptHint: \"in an all-black palette\" },\n { id: \"wd-earth\", label: \"Earth Tones\", dimension: \"color-palette\", promptHint: \"in earth-tone colors\" },\n { id: \"wd-pastel\", label: \"Pastel\", dimension: \"color-palette\", promptHint: \"in pastel colors\" },\n { id: \"wd-jewel\", label: \"Jewel Tones\", dimension: \"color-palette\", promptHint: \"in rich jewel-tone colors\" },\n { id: \"wd-neon\", label: \"Neon\", dimension: \"color-palette\", promptHint: \"in vivid neon colors\" },\n { id: \"wd-all-white\", label: \"All White\", dimension: \"color-palette\", promptHint: \"in an all-white palette\" },\n // material\n { id: \"wd-cotton\", label: \"Cotton\", dimension: \"material\", promptHint: \"in cotton fabric\" },\n { id: \"wd-denim\", label: \"Denim\", dimension: \"material\", promptHint: \"in denim\" },\n { id: \"wd-leather\", label: \"Leather\", dimension: \"material\", promptHint: \"in leather\" },\n { id: \"wd-silk\", label: \"Silk\", dimension: \"material\", promptHint: \"in silk\" },\n { id: \"wd-wool\", label: \"Wool\", dimension: \"material\", promptHint: \"in wool\" },\n { id: \"wd-latex\", label: \"Latex\", dimension: \"material\", promptHint: \"in latex\" },\n { id: \"wd-linen\", label: \"Linen\", dimension: \"material\", promptHint: \"in linen\" },\n // era\n { id: \"wd-contemporary\", label: \"Contemporary\", dimension: \"era\", promptHint: \"in contemporary fashion\" },\n { id: \"wd-1920s\", label: \"1920s\", dimension: \"era\", promptHint: \"in 1920s fashion\" },\n { id: \"wd-1950s\", label: \"1950s\", dimension: \"era\", promptHint: \"in 1950s fashion\" },\n { id: \"wd-1980s\", label: \"1980s\", dimension: \"era\", promptHint: \"in 1980s fashion\" },\n { id: \"wd-victorian\", label: \"Victorian\", dimension: \"era\", promptHint: \"in Victorian-era dress\" },\n { id: \"wd-medieval\", label: \"Medieval\", dimension: \"era\", promptHint: \"in medieval dress\" },\n { id: \"wd-futuristic\", label: \"Futuristic\", dimension: \"era\", promptHint: \"in futuristic clothing\" },\n] as const\n\nconst BY_ID: Map<string, WardrobeEntry> = new Map(WARDROBE.map((e) => [e.id, e]))\n\n/** Entries grouped by dimension — precomputed once so per-dimension lookups\n * (the picker calls one per dimension per render) are O(1) with stable array\n * refs, instead of a full WARDROBE scan each call. */\nconst BY_DIMENSION: Map<WardrobeDimension, WardrobeEntry[]> = (() => {\n const map = new Map<WardrobeDimension, WardrobeEntry[]>()\n for (const e of WARDROBE) {\n const list = map.get(e.dimension)\n if (list) list.push(e)\n else map.set(e.dimension, [e])\n }\n return map\n})()\n\nexport function getWardrobeEntry(id: string | undefined | null): WardrobeEntry | undefined {\n return id ? BY_ID.get(id) : undefined\n}\n\nexport function getWardrobePromptHint(id: string | undefined | null): string {\n return getWardrobeEntry(id)?.promptHint ?? \"\"\n}\n\nexport function getWardrobeEntriesByDimension(dim: WardrobeDimension): WardrobeEntry[] {\n return BY_DIMENSION.get(dim) ?? []\n}\n\nexport function buildWardrobeHints(value: Record<string, unknown> & WardrobeValue): string[] {\n const hints: string[] = []\n for (const dimension of WARDROBE_DIMENSION_ORDER) {\n const field = WARDROBE_FIELD_BY_DIMENSION[dimension]\n const raw = value[field]\n if (MULTI_PICK.has(dimension)) {\n for (const id of pickIds(raw)) {\n if (NONE_IDS.has(id)) continue\n const h = getWardrobePromptHint(id)\n if (h) hints.push(h)\n }\n continue\n }\n const id = typeof raw === \"string\" ? raw : undefined\n if (!id || NONE_IDS.has(id)) continue\n const h = getWardrobePromptHint(id)\n if (h) hints.push(h)\n }\n return hints\n}\n","import { getCharacterMotion, CHARACTER_MOTION_MAX_PICKS, type CharacterMotionTiming } from \"./character-motion.js\"\n\nexport interface CharacterMotionDiagnostic {\n readonly code: \"unknown\" | \"omitted\" | \"retired\" | \"pose\" | \"visibility\" | \"hands\" | \"pace\" | \"requirements\" | \"compound\" | \"capacity\" | \"multiple-targets\" | \"roles\"\n readonly severity: \"error\" | \"warning\" | \"info\"\n readonly ids: readonly string[]\n readonly message: string\n}\nexport interface CharacterMotionBindings {\n readonly selfPairing?: boolean\n readonly subjectMinor?: boolean\n readonly partnerNames?: readonly string[]\n readonly targetNames?: readonly string[]\n}\n\n/** Shared by editor, API clients and local review. Missing metadata means\n * unknown; this never certifies a sequence or predicts clip duration. */\nexport function getCharacterMotionDiagnostics(\n value: string | readonly string[] | null | undefined,\n timing?: CharacterMotionTiming,\n bindings: CharacterMotionBindings = {},\n): readonly CharacterMotionDiagnostic[] {\n const requested = typeof value === \"string\" ? [value] : Array.isArray(value) ? [...new Set(value)] : []\n const result: CharacterMotionDiagnostic[] = []\n const add = (code: CharacterMotionDiagnostic[\"code\"], severity: CharacterMotionDiagnostic[\"severity\"], ids: readonly string[], message: string) => result.push({ code, severity, ids, message })\n if (requested.length > CHARACTER_MOTION_MAX_PICKS) add(\"capacity\", \"warning\", requested, \"Only the first three selections contribute. Remove extra selections.\")\n const picks = requested.slice(0, CHARACTER_MOTION_MAX_PICKS)\n for (const id of picks) if (!getCharacterMotion(id)) add(\"unknown\", \"error\", [id], `Motion “${id}” is unavailable and contributes no fragment. Remove or replace it.`)\n const entries = picks.flatMap(id => { const entry = getCharacterMotion(id); return entry?.promptHint ? [entry] : [] })\n const active = entries.filter(e => !bindings.subjectMinor || !e.adultOnly)\n if (bindings.selfPairing && active.some(e => e.twoPerson || e.counterpart)) add(\"roles\", \"error\", active.filter(e => e.twoPerson || e.counterpart).map(e => e.id), \"The same reference is connected as Target and Partner. Connect distinct participants before running this interaction.\")\n const omitted = entries.filter(e => bindings.subjectMinor && e.adultOnly)\n if (omitted.length) add(\"omitted\", active.length ? \"warning\" : \"error\", omitted.map(e => e.id), `${omitted.map(e => e.label).join(\", \")} omitted for a connected minor. ${active.length ? \"Replace these selections.\" : \"No selected motion contributes a fragment.\"}`)\n if ((bindings.targetNames?.length ?? 0) > 1) add(\"multiple-targets\", \"warning\", picks, \"Each target performs a separate copy of the sequence. Use separate motion nodes for coordinated choreography.\")\n for (const entry of active) {\n if (entry.deprecated) add(\"retired\", \"warning\", [entry.id], `${entry.label} is retired from new choices but still resolves in saved workflows.${entry.replacementId ? ` Use ${getCharacterMotion(entry.replacementId)?.label ?? entry.replacementId}.` : \"\"}`)\n if (entry.fixedPace && timing?.pace && timing.pace !== \"auto\") add(\"pace\", \"warning\", [entry.id], `${entry.label} sets its own timing. Set Pace to Auto or replace the motion.`)\n if (entry.requires?.length) add(\"requirements\", \"info\", [entry.id], `${entry.label} requires: ${entry.requires.join(\", \")}.${entry.twoPerson || entry.counterpart ? bindings.partnerNames?.length ? ` Partner reference: ${bindings.partnerNames.join(\", \")}; confirm it matches the required recipient.` : \" Connect a Partner reference to identify the recipient; otherwise the model chooses it.\" : \" Establish these in the scene or prompt; the fragment does not supply reference media.\"}`)\n }\n for (let i = 1; i < active.length; i++) {\n const before = active[i - 1]!, after = active[i]!, ids = [before.id, after.id]\n if (before.endVisibility === \"out-of-frame\") add(\"visibility\", \"warning\", ids, `${before.label} ends out of view before ${after.label}. Reorder or add an entrance.`)\n if (before.endPose && after.startPose && before.endPose !== \"any\" && after.startPose !== \"any\" && before.endPose !== after.startPose) add(\"pose\", \"warning\", ids, `${before.label} ends ${before.endPose}; ${after.label} starts ${after.startPose}. Add a transition or replace a motion.`)\n if (before.handsAfter && before.handsAfter !== \"free\" && after.needsFreeHands) add(\"hands\", \"warning\", ids, `${before.label} leaves hands occupied; ${after.label} needs free hands. Add a release first.`)\n }\n const compound = active.filter(e => e.kind === \"compound\")\n if (compound.length) add(\"compound\", \"warning\", compound.map(e => e.id), `${compound.length} selection${compound.length === 1 ? \" is\" : \"s are\"} compound choreography. Short clips may not fit every phase; test the sequence before adding more actions.`)\n return result\n}\n"]}
1
+ {"version":3,"sources":["../src/wardrobe.ts","../src/character-motion-diagnostics.ts"],"names":["id","pickIds","h","CHARACTER_MOTION_MAX_PICKS","getCharacterMotion"],"mappings":"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","file":"chunk-I3QS7BSY.cjs","sourcesContent":["import { pickIds } from \"@nodaro/shared/catalogs\"\n\nexport type WardrobeDimension =\n | \"archetype\" | \"top\" | \"bottom\" | \"outerwear\" | \"footwear\"\n | \"headwear\" | \"accessories\" | \"color-palette\" | \"material\" | \"era\"\n\nexport interface WardrobeEntry {\n readonly id: string\n readonly label: string\n readonly dimension: WardrobeDimension\n readonly promptHint: string\n}\n\nexport interface WardrobeValue {\n archetype?: string\n top?: string\n bottom?: string\n outerwear?: string\n footwear?: string\n headwear?: string | ReadonlyArray<string>\n accessories?: string | ReadonlyArray<string>\n colorPalette?: string\n material?: string\n era?: string\n}\n\nexport const WARDROBE_DIMENSION_ORDER: ReadonlyArray<WardrobeDimension> = [\n \"archetype\", \"top\", \"bottom\", \"outerwear\", \"footwear\",\n \"headwear\", \"accessories\", \"color-palette\", \"material\", \"era\",\n]\n\nexport const WARDROBE_CATEGORY_LABELS: Readonly<Record<WardrobeDimension, string>> = {\n archetype: \"Archetype\", top: \"Top\", bottom: \"Bottom\", outerwear: \"Outerwear\",\n footwear: \"Footwear\", headwear: \"Headwear\", accessories: \"Accessories\",\n \"color-palette\": \"Color Palette\", material: \"Material\", era: \"Era\",\n}\n\nexport const WARDROBE_FIELD_BY_DIMENSION: Record<WardrobeDimension, keyof WardrobeValue> = {\n archetype: \"archetype\", top: \"top\", bottom: \"bottom\", outerwear: \"outerwear\",\n footwear: \"footwear\", headwear: \"headwear\", accessories: \"accessories\",\n \"color-palette\": \"colorPalette\", material: \"material\", era: \"era\",\n}\n\n/** Multi-pick dims emit each picked entry independently. */\nconst MULTI_PICK: ReadonlySet<WardrobeDimension> = new Set([\"headwear\", \"accessories\"])\n/** Sentinel ids that mean \"nothing here\" and emit no hint. */\nconst NONE_IDS: ReadonlySet<string> = new Set([\"wd-outer-none\"])\n\nexport const WARDROBE: ReadonlyArray<WardrobeEntry> = [\n // archetype\n { id: \"wd-casual\", label: \"Casual\", dimension: \"archetype\", promptHint: \"in casual everyday clothing\" },\n { id: \"wd-business\", label: \"Business\", dimension: \"archetype\", promptHint: \"in smart business attire\" },\n { id: \"wd-formal\", label: \"Formal\", dimension: \"archetype\", promptHint: \"in elegant formal wear\" },\n { id: \"wd-streetwear\", label: \"Streetwear\", dimension: \"archetype\", promptHint: \"in contemporary streetwear\" },\n { id: \"wd-athletic\", label: \"Athletic\", dimension: \"archetype\", promptHint: \"in athletic sportswear\" },\n { id: \"wd-fantasy\", label: \"Fantasy\", dimension: \"archetype\", promptHint: \"in fantasy costume\" },\n { id: \"wd-scifi\", label: \"Sci-Fi\", dimension: \"archetype\", promptHint: \"in futuristic sci-fi attire\" },\n { id: \"wd-historical\", label: \"Historical\", dimension: \"archetype\", promptHint: \"in period historical dress\" },\n { id: \"wd-uniform\", label: \"Uniform\", dimension: \"archetype\", promptHint: \"in a uniform\" },\n { id: \"wd-loungewear\", label: \"Loungewear\", dimension: \"archetype\", promptHint: \"in relaxed loungewear\" },\n // top\n { id: \"wd-tshirt\", label: \"T-Shirt\", dimension: \"top\", promptHint: \"wearing a t-shirt\" },\n { id: \"wd-blouse\", label: \"Blouse\", dimension: \"top\", promptHint: \"wearing a blouse\" },\n { id: \"wd-hoodie\", label: \"Hoodie\", dimension: \"top\", promptHint: \"wearing a hoodie\" },\n { id: \"wd-buttondown\", label: \"Button-down\", dimension: \"top\", promptHint: \"wearing a button-down shirt\" },\n { id: \"wd-tank\", label: \"Tank\", dimension: \"top\", promptHint: \"wearing a tank top\" },\n { id: \"wd-sweater\", label: \"Sweater\", dimension: \"top\", promptHint: \"wearing a sweater\" },\n { id: \"wd-turtleneck\", label: \"Turtleneck\", dimension: \"top\", promptHint: \"wearing a turtleneck\" },\n // bottom\n { id: \"wd-jeans\", label: \"Jeans\", dimension: \"bottom\", promptHint: \"wearing jeans\" },\n { id: \"wd-trousers\", label: \"Trousers\", dimension: \"bottom\", promptHint: \"wearing tailored trousers\" },\n { id: \"wd-skirt\", label: \"Skirt\", dimension: \"bottom\", promptHint: \"wearing a skirt\" },\n { id: \"wd-shorts\", label: \"Shorts\", dimension: \"bottom\", promptHint: \"wearing shorts\" },\n { id: \"wd-leggings\", label: \"Leggings\", dimension: \"bottom\", promptHint: \"wearing leggings\" },\n { id: \"wd-cargo\", label: \"Cargo\", dimension: \"bottom\", promptHint: \"wearing cargo pants\" },\n // outerwear\n { id: \"wd-outer-none\", label: \"None\", dimension: \"outerwear\", promptHint: \"\" },\n { id: \"wd-leatherjkt\", label: \"Leather Jacket\", dimension: \"outerwear\", promptHint: \"in a leather jacket\" },\n { id: \"wd-blazer\", label: \"Blazer\", dimension: \"outerwear\", promptHint: \"in a blazer\" },\n { id: \"wd-trench\", label: \"Trench Coat\", dimension: \"outerwear\", promptHint: \"in a trench coat\" },\n { id: \"wd-parka\", label: \"Parka\", dimension: \"outerwear\", promptHint: \"in a parka\" },\n { id: \"wd-cloak\", label: \"Cloak\", dimension: \"outerwear\", promptHint: \"in a flowing cloak\" },\n { id: \"wd-denimjkt\", label: \"Denim Jacket\", dimension: \"outerwear\", promptHint: \"in a denim jacket\" },\n { id: \"wd-cardigan\", label: \"Cardigan\", dimension: \"outerwear\", promptHint: \"in a cardigan\" },\n // footwear\n { id: \"wd-sneakers\", label: \"Sneakers\", dimension: \"footwear\", promptHint: \"wearing sneakers\" },\n { id: \"wd-boots\", label: \"Boots\", dimension: \"footwear\", promptHint: \"wearing boots\" },\n { id: \"wd-heels\", label: \"Heels\", dimension: \"footwear\", promptHint: \"wearing heels\" },\n { id: \"wd-sandals\", label: \"Sandals\", dimension: \"footwear\", promptHint: \"wearing sandals\" },\n { id: \"wd-dressshoe\", label: \"Dress Shoes\", dimension: \"footwear\", promptHint: \"wearing dress shoes\" },\n { id: \"wd-barefoot\", label: \"Barefoot\", dimension: \"footwear\", promptHint: \"barefoot\" },\n // headwear (multi)\n { id: \"wd-cap\", label: \"Cap\", dimension: \"headwear\", promptHint: \"wearing a cap\" },\n { id: \"wd-beanie\", label: \"Beanie\", dimension: \"headwear\", promptHint: \"wearing a beanie\" },\n { id: \"wd-widehat\", label: \"Wide-brim Hat\", dimension: \"headwear\", promptHint: \"wearing a wide-brim hat\" },\n { id: \"wd-hood\", label: \"Hood\", dimension: \"headwear\", promptHint: \"with the hood up\" },\n { id: \"wd-crown\", label: \"Crown\", dimension: \"headwear\", promptHint: \"wearing a crown\" },\n { id: \"wd-helmet\", label: \"Helmet\", dimension: \"headwear\", promptHint: \"wearing a helmet\" },\n // accessories (multi)\n { id: \"wd-glasses\", label: \"Glasses\", dimension: \"accessories\", promptHint: \"wearing glasses\" },\n { id: \"wd-sunglasses\", label: \"Sunglasses\", dimension: \"accessories\", promptHint: \"wearing sunglasses\" },\n { id: \"wd-scarf\", label: \"Scarf\", dimension: \"accessories\", promptHint: \"wearing a scarf\" },\n { id: \"wd-gloves\", label: \"Gloves\", dimension: \"accessories\", promptHint: \"wearing gloves\" },\n { id: \"wd-jewelry\", label: \"Jewelry\", dimension: \"accessories\", promptHint: \"wearing statement jewelry\" },\n { id: \"wd-belt\", label: \"Belt\", dimension: \"accessories\", promptHint: \"with a belt\" },\n { id: \"wd-watch\", label: \"Watch\", dimension: \"accessories\", promptHint: \"wearing a watch\" },\n // color-palette\n { id: \"wd-neutral\", label: \"Neutral\", dimension: \"color-palette\", promptHint: \"in a neutral color palette\" },\n { id: \"wd-all-black\", label: \"All Black\", dimension: \"color-palette\", promptHint: \"in an all-black palette\" },\n { id: \"wd-earth\", label: \"Earth Tones\", dimension: \"color-palette\", promptHint: \"in earth-tone colors\" },\n { id: \"wd-pastel\", label: \"Pastel\", dimension: \"color-palette\", promptHint: \"in pastel colors\" },\n { id: \"wd-jewel\", label: \"Jewel Tones\", dimension: \"color-palette\", promptHint: \"in rich jewel-tone colors\" },\n { id: \"wd-neon\", label: \"Neon\", dimension: \"color-palette\", promptHint: \"in vivid neon colors\" },\n { id: \"wd-all-white\", label: \"All White\", dimension: \"color-palette\", promptHint: \"in an all-white palette\" },\n // material\n { id: \"wd-cotton\", label: \"Cotton\", dimension: \"material\", promptHint: \"in cotton fabric\" },\n { id: \"wd-denim\", label: \"Denim\", dimension: \"material\", promptHint: \"in denim\" },\n { id: \"wd-leather\", label: \"Leather\", dimension: \"material\", promptHint: \"in leather\" },\n { id: \"wd-silk\", label: \"Silk\", dimension: \"material\", promptHint: \"in silk\" },\n { id: \"wd-wool\", label: \"Wool\", dimension: \"material\", promptHint: \"in wool\" },\n { id: \"wd-latex\", label: \"Latex\", dimension: \"material\", promptHint: \"in latex\" },\n { id: \"wd-linen\", label: \"Linen\", dimension: \"material\", promptHint: \"in linen\" },\n // era\n { id: \"wd-contemporary\", label: \"Contemporary\", dimension: \"era\", promptHint: \"in contemporary fashion\" },\n { id: \"wd-1920s\", label: \"1920s\", dimension: \"era\", promptHint: \"in 1920s fashion\" },\n { id: \"wd-1950s\", label: \"1950s\", dimension: \"era\", promptHint: \"in 1950s fashion\" },\n { id: \"wd-1980s\", label: \"1980s\", dimension: \"era\", promptHint: \"in 1980s fashion\" },\n { id: \"wd-victorian\", label: \"Victorian\", dimension: \"era\", promptHint: \"in Victorian-era dress\" },\n { id: \"wd-medieval\", label: \"Medieval\", dimension: \"era\", promptHint: \"in medieval dress\" },\n { id: \"wd-futuristic\", label: \"Futuristic\", dimension: \"era\", promptHint: \"in futuristic clothing\" },\n] as const\n\nconst BY_ID: Map<string, WardrobeEntry> = new Map(WARDROBE.map((e) => [e.id, e]))\n\n/** Entries grouped by dimension — precomputed once so per-dimension lookups\n * (the picker calls one per dimension per render) are O(1) with stable array\n * refs, instead of a full WARDROBE scan each call. */\nconst BY_DIMENSION: Map<WardrobeDimension, WardrobeEntry[]> = (() => {\n const map = new Map<WardrobeDimension, WardrobeEntry[]>()\n for (const e of WARDROBE) {\n const list = map.get(e.dimension)\n if (list) list.push(e)\n else map.set(e.dimension, [e])\n }\n return map\n})()\n\nexport function getWardrobeEntry(id: string | undefined | null): WardrobeEntry | undefined {\n return id ? BY_ID.get(id) : undefined\n}\n\nexport function getWardrobePromptHint(id: string | undefined | null): string {\n return getWardrobeEntry(id)?.promptHint ?? \"\"\n}\n\nexport function getWardrobeEntriesByDimension(dim: WardrobeDimension): WardrobeEntry[] {\n return BY_DIMENSION.get(dim) ?? []\n}\n\nexport function buildWardrobeHints(value: Record<string, unknown> & WardrobeValue): string[] {\n const hints: string[] = []\n for (const dimension of WARDROBE_DIMENSION_ORDER) {\n const field = WARDROBE_FIELD_BY_DIMENSION[dimension]\n const raw = value[field]\n if (MULTI_PICK.has(dimension)) {\n for (const id of pickIds(raw)) {\n if (NONE_IDS.has(id)) continue\n const h = getWardrobePromptHint(id)\n if (h) hints.push(h)\n }\n continue\n }\n const id = typeof raw === \"string\" ? raw : undefined\n if (!id || NONE_IDS.has(id)) continue\n const h = getWardrobePromptHint(id)\n if (h) hints.push(h)\n }\n return hints\n}\n","import { getCharacterMotion, CHARACTER_MOTION_MAX_PICKS, type CharacterMotionTiming } from \"./character-motion.js\"\n\nexport interface CharacterMotionDiagnostic {\n readonly code: \"unknown\" | \"omitted\" | \"retired\" | \"pose\" | \"visibility\" | \"hands\" | \"pace\" | \"requirements\" | \"compound\" | \"capacity\" | \"multiple-targets\" | \"roles\"\n readonly severity: \"error\" | \"warning\" | \"info\"\n readonly ids: readonly string[]\n readonly message: string\n}\nexport interface CharacterMotionBindings {\n readonly selfPairing?: boolean\n readonly subjectMinor?: boolean\n readonly partnerNames?: readonly string[]\n readonly targetNames?: readonly string[]\n}\n\n/** Shared by editor, API clients and local review. Missing metadata means\n * unknown; this never certifies a sequence or predicts clip duration. */\nexport function getCharacterMotionDiagnostics(\n value: string | readonly string[] | null | undefined,\n timing?: CharacterMotionTiming,\n bindings: CharacterMotionBindings = {},\n): readonly CharacterMotionDiagnostic[] {\n const requested = typeof value === \"string\" ? [value] : Array.isArray(value) ? [...new Set(value)] : []\n const result: CharacterMotionDiagnostic[] = []\n const add = (code: CharacterMotionDiagnostic[\"code\"], severity: CharacterMotionDiagnostic[\"severity\"], ids: readonly string[], message: string) => result.push({ code, severity, ids, message })\n if (requested.length > CHARACTER_MOTION_MAX_PICKS) add(\"capacity\", \"warning\", requested, \"Only the first three selections contribute. Remove extra selections.\")\n const picks = requested.slice(0, CHARACTER_MOTION_MAX_PICKS)\n for (const id of picks) if (!getCharacterMotion(id)) add(\"unknown\", \"error\", [id], `Motion “${id}” is unavailable and contributes no fragment. Remove or replace it.`)\n const entries = picks.flatMap(id => { const entry = getCharacterMotion(id); return entry?.promptHint ? [entry] : [] })\n const active = entries.filter(e => !bindings.subjectMinor || !e.adultOnly)\n if (bindings.selfPairing && active.some(e => e.twoPerson || e.counterpart)) add(\"roles\", \"error\", active.filter(e => e.twoPerson || e.counterpart).map(e => e.id), \"The same reference is connected as Target and Partner. Connect distinct participants before running this interaction.\")\n const omitted = entries.filter(e => bindings.subjectMinor && e.adultOnly)\n if (omitted.length) add(\"omitted\", active.length ? \"warning\" : \"error\", omitted.map(e => e.id), `${omitted.map(e => e.label).join(\", \")} omitted for a connected minor. ${active.length ? \"Replace these selections.\" : \"No selected motion contributes a fragment.\"}`)\n if ((bindings.targetNames?.length ?? 0) > 1) add(\"multiple-targets\", \"warning\", picks, \"Each target performs a separate copy of the sequence. Use separate motion nodes for coordinated choreography.\")\n for (const entry of active) {\n if (entry.deprecated) add(\"retired\", \"warning\", [entry.id], `${entry.label} is retired from new choices but still resolves in saved workflows.${entry.replacementId ? ` Use ${getCharacterMotion(entry.replacementId)?.label ?? entry.replacementId}.` : \"\"}`)\n if (entry.fixedPace && timing?.pace && timing.pace !== \"auto\") add(\"pace\", \"warning\", [entry.id], `${entry.label} sets its own timing. Set Pace to Auto or replace the motion.`)\n if (entry.requires?.length) add(\"requirements\", \"info\", [entry.id], `${entry.label} requires: ${entry.requires.join(\", \")}.${entry.twoPerson || entry.counterpart ? bindings.partnerNames?.length ? ` Partner reference: ${bindings.partnerNames.join(\", \")}; confirm it matches the required recipient.` : \" Connect a Partner reference to identify the recipient; otherwise the model chooses it.\" : \" Establish these in the scene or prompt; the fragment does not supply reference media.\"}`)\n }\n for (let i = 1; i < active.length; i++) {\n const before = active[i - 1]!, after = active[i]!, ids = [before.id, after.id]\n if (before.endVisibility === \"out-of-frame\") add(\"visibility\", \"warning\", ids, `${before.label} ends out of view before ${after.label}. Reorder or add an entrance.`)\n if (before.endPose && after.startPose && before.endPose !== \"any\" && after.startPose !== \"any\" && before.endPose !== after.startPose) add(\"pose\", \"warning\", ids, `${before.label} ends ${before.endPose}; ${after.label} starts ${after.startPose}. Add a transition or replace a motion.`)\n if (before.handsAfter && before.handsAfter !== \"free\" && after.needsFreeHands) add(\"hands\", \"warning\", ids, `${before.label} leaves hands occupied; ${after.label} needs free hands. Add a release first.`)\n }\n const compound = active.filter(e => e.kind === \"compound\")\n if (compound.length) add(\"compound\", \"warning\", compound.map(e => e.id), `${compound.length} selection${compound.length === 1 ? \" is\" : \"s are\"} compound choreography. Short clips may not fit every phase; test the sequence before adding more actions.`)\n return result\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { CHARACTER_MOTION_MAX_PICKS, getCharacterMotion } from './chunk-SXXW4LCR.js';
1
+ import { CHARACTER_MOTION_MAX_PICKS, getCharacterMotion } from './chunk-CYMIXKFT.js';
2
2
  import { pickIds } from '@nodaro/shared/catalogs';
3
3
 
4
4
  var WARDROBE_DIMENSION_ORDER = [
@@ -196,5 +196,5 @@ function getCharacterMotionDiagnostics(value, timing, bindings = {}) {
196
196
  }
197
197
 
198
198
  export { WARDROBE, WARDROBE_CATEGORY_LABELS, WARDROBE_DIMENSION_ORDER, WARDROBE_FIELD_BY_DIMENSION, buildWardrobeHints, getCharacterMotionDiagnostics, getWardrobeEntriesByDimension, getWardrobeEntry, getWardrobePromptHint };
199
- //# sourceMappingURL=chunk-JOHYGDUU.js.map
200
- //# sourceMappingURL=chunk-JOHYGDUU.js.map
199
+ //# sourceMappingURL=chunk-IFRFYBGE.js.map
200
+ //# sourceMappingURL=chunk-IFRFYBGE.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/wardrobe.ts","../src/character-motion-diagnostics.ts"],"names":["id","h"],"mappings":"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","file":"chunk-JOHYGDUU.js","sourcesContent":["import { pickIds } from \"@nodaro/shared/catalogs\"\n\nexport type WardrobeDimension =\n | \"archetype\" | \"top\" | \"bottom\" | \"outerwear\" | \"footwear\"\n | \"headwear\" | \"accessories\" | \"color-palette\" | \"material\" | \"era\"\n\nexport interface WardrobeEntry {\n readonly id: string\n readonly label: string\n readonly dimension: WardrobeDimension\n readonly promptHint: string\n}\n\nexport interface WardrobeValue {\n archetype?: string\n top?: string\n bottom?: string\n outerwear?: string\n footwear?: string\n headwear?: string | ReadonlyArray<string>\n accessories?: string | ReadonlyArray<string>\n colorPalette?: string\n material?: string\n era?: string\n}\n\nexport const WARDROBE_DIMENSION_ORDER: ReadonlyArray<WardrobeDimension> = [\n \"archetype\", \"top\", \"bottom\", \"outerwear\", \"footwear\",\n \"headwear\", \"accessories\", \"color-palette\", \"material\", \"era\",\n]\n\nexport const WARDROBE_CATEGORY_LABELS: Readonly<Record<WardrobeDimension, string>> = {\n archetype: \"Archetype\", top: \"Top\", bottom: \"Bottom\", outerwear: \"Outerwear\",\n footwear: \"Footwear\", headwear: \"Headwear\", accessories: \"Accessories\",\n \"color-palette\": \"Color Palette\", material: \"Material\", era: \"Era\",\n}\n\nexport const WARDROBE_FIELD_BY_DIMENSION: Record<WardrobeDimension, keyof WardrobeValue> = {\n archetype: \"archetype\", top: \"top\", bottom: \"bottom\", outerwear: \"outerwear\",\n footwear: \"footwear\", headwear: \"headwear\", accessories: \"accessories\",\n \"color-palette\": \"colorPalette\", material: \"material\", era: \"era\",\n}\n\n/** Multi-pick dims emit each picked entry independently. */\nconst MULTI_PICK: ReadonlySet<WardrobeDimension> = new Set([\"headwear\", \"accessories\"])\n/** Sentinel ids that mean \"nothing here\" and emit no hint. */\nconst NONE_IDS: ReadonlySet<string> = new Set([\"wd-outer-none\"])\n\nexport const WARDROBE: ReadonlyArray<WardrobeEntry> = [\n // archetype\n { id: \"wd-casual\", label: \"Casual\", dimension: \"archetype\", promptHint: \"in casual everyday clothing\" },\n { id: \"wd-business\", label: \"Business\", dimension: \"archetype\", promptHint: \"in smart business attire\" },\n { id: \"wd-formal\", label: \"Formal\", dimension: \"archetype\", promptHint: \"in elegant formal wear\" },\n { id: \"wd-streetwear\", label: \"Streetwear\", dimension: \"archetype\", promptHint: \"in contemporary streetwear\" },\n { id: \"wd-athletic\", label: \"Athletic\", dimension: \"archetype\", promptHint: \"in athletic sportswear\" },\n { id: \"wd-fantasy\", label: \"Fantasy\", dimension: \"archetype\", promptHint: \"in fantasy costume\" },\n { id: \"wd-scifi\", label: \"Sci-Fi\", dimension: \"archetype\", promptHint: \"in futuristic sci-fi attire\" },\n { id: \"wd-historical\", label: \"Historical\", dimension: \"archetype\", promptHint: \"in period historical dress\" },\n { id: \"wd-uniform\", label: \"Uniform\", dimension: \"archetype\", promptHint: \"in a uniform\" },\n { id: \"wd-loungewear\", label: \"Loungewear\", dimension: \"archetype\", promptHint: \"in relaxed loungewear\" },\n // top\n { id: \"wd-tshirt\", label: \"T-Shirt\", dimension: \"top\", promptHint: \"wearing a t-shirt\" },\n { id: \"wd-blouse\", label: \"Blouse\", dimension: \"top\", promptHint: \"wearing a blouse\" },\n { id: \"wd-hoodie\", label: \"Hoodie\", dimension: \"top\", promptHint: \"wearing a hoodie\" },\n { id: \"wd-buttondown\", label: \"Button-down\", dimension: \"top\", promptHint: \"wearing a button-down shirt\" },\n { id: \"wd-tank\", label: \"Tank\", dimension: \"top\", promptHint: \"wearing a tank top\" },\n { id: \"wd-sweater\", label: \"Sweater\", dimension: \"top\", promptHint: \"wearing a sweater\" },\n { id: \"wd-turtleneck\", label: \"Turtleneck\", dimension: \"top\", promptHint: \"wearing a turtleneck\" },\n // bottom\n { id: \"wd-jeans\", label: \"Jeans\", dimension: \"bottom\", promptHint: \"wearing jeans\" },\n { id: \"wd-trousers\", label: \"Trousers\", dimension: \"bottom\", promptHint: \"wearing tailored trousers\" },\n { id: \"wd-skirt\", label: \"Skirt\", dimension: \"bottom\", promptHint: \"wearing a skirt\" },\n { id: \"wd-shorts\", label: \"Shorts\", dimension: \"bottom\", promptHint: \"wearing shorts\" },\n { id: \"wd-leggings\", label: \"Leggings\", dimension: \"bottom\", promptHint: \"wearing leggings\" },\n { id: \"wd-cargo\", label: \"Cargo\", dimension: \"bottom\", promptHint: \"wearing cargo pants\" },\n // outerwear\n { id: \"wd-outer-none\", label: \"None\", dimension: \"outerwear\", promptHint: \"\" },\n { id: \"wd-leatherjkt\", label: \"Leather Jacket\", dimension: \"outerwear\", promptHint: \"in a leather jacket\" },\n { id: \"wd-blazer\", label: \"Blazer\", dimension: \"outerwear\", promptHint: \"in a blazer\" },\n { id: \"wd-trench\", label: \"Trench Coat\", dimension: \"outerwear\", promptHint: \"in a trench coat\" },\n { id: \"wd-parka\", label: \"Parka\", dimension: \"outerwear\", promptHint: \"in a parka\" },\n { id: \"wd-cloak\", label: \"Cloak\", dimension: \"outerwear\", promptHint: \"in a flowing cloak\" },\n { id: \"wd-denimjkt\", label: \"Denim Jacket\", dimension: \"outerwear\", promptHint: \"in a denim jacket\" },\n { id: \"wd-cardigan\", label: \"Cardigan\", dimension: \"outerwear\", promptHint: \"in a cardigan\" },\n // footwear\n { id: \"wd-sneakers\", label: \"Sneakers\", dimension: \"footwear\", promptHint: \"wearing sneakers\" },\n { id: \"wd-boots\", label: \"Boots\", dimension: \"footwear\", promptHint: \"wearing boots\" },\n { id: \"wd-heels\", label: \"Heels\", dimension: \"footwear\", promptHint: \"wearing heels\" },\n { id: \"wd-sandals\", label: \"Sandals\", dimension: \"footwear\", promptHint: \"wearing sandals\" },\n { id: \"wd-dressshoe\", label: \"Dress Shoes\", dimension: \"footwear\", promptHint: \"wearing dress shoes\" },\n { id: \"wd-barefoot\", label: \"Barefoot\", dimension: \"footwear\", promptHint: \"barefoot\" },\n // headwear (multi)\n { id: \"wd-cap\", label: \"Cap\", dimension: \"headwear\", promptHint: \"wearing a cap\" },\n { id: \"wd-beanie\", label: \"Beanie\", dimension: \"headwear\", promptHint: \"wearing a beanie\" },\n { id: \"wd-widehat\", label: \"Wide-brim Hat\", dimension: \"headwear\", promptHint: \"wearing a wide-brim hat\" },\n { id: \"wd-hood\", label: \"Hood\", dimension: \"headwear\", promptHint: \"with the hood up\" },\n { id: \"wd-crown\", label: \"Crown\", dimension: \"headwear\", promptHint: \"wearing a crown\" },\n { id: \"wd-helmet\", label: \"Helmet\", dimension: \"headwear\", promptHint: \"wearing a helmet\" },\n // accessories (multi)\n { id: \"wd-glasses\", label: \"Glasses\", dimension: \"accessories\", promptHint: \"wearing glasses\" },\n { id: \"wd-sunglasses\", label: \"Sunglasses\", dimension: \"accessories\", promptHint: \"wearing sunglasses\" },\n { id: \"wd-scarf\", label: \"Scarf\", dimension: \"accessories\", promptHint: \"wearing a scarf\" },\n { id: \"wd-gloves\", label: \"Gloves\", dimension: \"accessories\", promptHint: \"wearing gloves\" },\n { id: \"wd-jewelry\", label: \"Jewelry\", dimension: \"accessories\", promptHint: \"wearing statement jewelry\" },\n { id: \"wd-belt\", label: \"Belt\", dimension: \"accessories\", promptHint: \"with a belt\" },\n { id: \"wd-watch\", label: \"Watch\", dimension: \"accessories\", promptHint: \"wearing a watch\" },\n // color-palette\n { id: \"wd-neutral\", label: \"Neutral\", dimension: \"color-palette\", promptHint: \"in a neutral color palette\" },\n { id: \"wd-all-black\", label: \"All Black\", dimension: \"color-palette\", promptHint: \"in an all-black palette\" },\n { id: \"wd-earth\", label: \"Earth Tones\", dimension: \"color-palette\", promptHint: \"in earth-tone colors\" },\n { id: \"wd-pastel\", label: \"Pastel\", dimension: \"color-palette\", promptHint: \"in pastel colors\" },\n { id: \"wd-jewel\", label: \"Jewel Tones\", dimension: \"color-palette\", promptHint: \"in rich jewel-tone colors\" },\n { id: \"wd-neon\", label: \"Neon\", dimension: \"color-palette\", promptHint: \"in vivid neon colors\" },\n { id: \"wd-all-white\", label: \"All White\", dimension: \"color-palette\", promptHint: \"in an all-white palette\" },\n // material\n { id: \"wd-cotton\", label: \"Cotton\", dimension: \"material\", promptHint: \"in cotton fabric\" },\n { id: \"wd-denim\", label: \"Denim\", dimension: \"material\", promptHint: \"in denim\" },\n { id: \"wd-leather\", label: \"Leather\", dimension: \"material\", promptHint: \"in leather\" },\n { id: \"wd-silk\", label: \"Silk\", dimension: \"material\", promptHint: \"in silk\" },\n { id: \"wd-wool\", label: \"Wool\", dimension: \"material\", promptHint: \"in wool\" },\n { id: \"wd-latex\", label: \"Latex\", dimension: \"material\", promptHint: \"in latex\" },\n { id: \"wd-linen\", label: \"Linen\", dimension: \"material\", promptHint: \"in linen\" },\n // era\n { id: \"wd-contemporary\", label: \"Contemporary\", dimension: \"era\", promptHint: \"in contemporary fashion\" },\n { id: \"wd-1920s\", label: \"1920s\", dimension: \"era\", promptHint: \"in 1920s fashion\" },\n { id: \"wd-1950s\", label: \"1950s\", dimension: \"era\", promptHint: \"in 1950s fashion\" },\n { id: \"wd-1980s\", label: \"1980s\", dimension: \"era\", promptHint: \"in 1980s fashion\" },\n { id: \"wd-victorian\", label: \"Victorian\", dimension: \"era\", promptHint: \"in Victorian-era dress\" },\n { id: \"wd-medieval\", label: \"Medieval\", dimension: \"era\", promptHint: \"in medieval dress\" },\n { id: \"wd-futuristic\", label: \"Futuristic\", dimension: \"era\", promptHint: \"in futuristic clothing\" },\n] as const\n\nconst BY_ID: Map<string, WardrobeEntry> = new Map(WARDROBE.map((e) => [e.id, e]))\n\n/** Entries grouped by dimension — precomputed once so per-dimension lookups\n * (the picker calls one per dimension per render) are O(1) with stable array\n * refs, instead of a full WARDROBE scan each call. */\nconst BY_DIMENSION: Map<WardrobeDimension, WardrobeEntry[]> = (() => {\n const map = new Map<WardrobeDimension, WardrobeEntry[]>()\n for (const e of WARDROBE) {\n const list = map.get(e.dimension)\n if (list) list.push(e)\n else map.set(e.dimension, [e])\n }\n return map\n})()\n\nexport function getWardrobeEntry(id: string | undefined | null): WardrobeEntry | undefined {\n return id ? BY_ID.get(id) : undefined\n}\n\nexport function getWardrobePromptHint(id: string | undefined | null): string {\n return getWardrobeEntry(id)?.promptHint ?? \"\"\n}\n\nexport function getWardrobeEntriesByDimension(dim: WardrobeDimension): WardrobeEntry[] {\n return BY_DIMENSION.get(dim) ?? []\n}\n\nexport function buildWardrobeHints(value: Record<string, unknown> & WardrobeValue): string[] {\n const hints: string[] = []\n for (const dimension of WARDROBE_DIMENSION_ORDER) {\n const field = WARDROBE_FIELD_BY_DIMENSION[dimension]\n const raw = value[field]\n if (MULTI_PICK.has(dimension)) {\n for (const id of pickIds(raw)) {\n if (NONE_IDS.has(id)) continue\n const h = getWardrobePromptHint(id)\n if (h) hints.push(h)\n }\n continue\n }\n const id = typeof raw === \"string\" ? raw : undefined\n if (!id || NONE_IDS.has(id)) continue\n const h = getWardrobePromptHint(id)\n if (h) hints.push(h)\n }\n return hints\n}\n","import { getCharacterMotion, CHARACTER_MOTION_MAX_PICKS, type CharacterMotionTiming } from \"./character-motion.js\"\n\nexport interface CharacterMotionDiagnostic {\n readonly code: \"unknown\" | \"omitted\" | \"retired\" | \"pose\" | \"visibility\" | \"hands\" | \"pace\" | \"requirements\" | \"compound\" | \"capacity\" | \"multiple-targets\" | \"roles\"\n readonly severity: \"error\" | \"warning\" | \"info\"\n readonly ids: readonly string[]\n readonly message: string\n}\nexport interface CharacterMotionBindings {\n readonly selfPairing?: boolean\n readonly subjectMinor?: boolean\n readonly partnerNames?: readonly string[]\n readonly targetNames?: readonly string[]\n}\n\n/** Shared by editor, API clients and local review. Missing metadata means\n * unknown; this never certifies a sequence or predicts clip duration. */\nexport function getCharacterMotionDiagnostics(\n value: string | readonly string[] | null | undefined,\n timing?: CharacterMotionTiming,\n bindings: CharacterMotionBindings = {},\n): readonly CharacterMotionDiagnostic[] {\n const requested = typeof value === \"string\" ? [value] : Array.isArray(value) ? [...new Set(value)] : []\n const result: CharacterMotionDiagnostic[] = []\n const add = (code: CharacterMotionDiagnostic[\"code\"], severity: CharacterMotionDiagnostic[\"severity\"], ids: readonly string[], message: string) => result.push({ code, severity, ids, message })\n if (requested.length > CHARACTER_MOTION_MAX_PICKS) add(\"capacity\", \"warning\", requested, \"Only the first three selections contribute. Remove extra selections.\")\n const picks = requested.slice(0, CHARACTER_MOTION_MAX_PICKS)\n for (const id of picks) if (!getCharacterMotion(id)) add(\"unknown\", \"error\", [id], `Motion “${id}” is unavailable and contributes no fragment. Remove or replace it.`)\n const entries = picks.flatMap(id => { const entry = getCharacterMotion(id); return entry?.promptHint ? [entry] : [] })\n const active = entries.filter(e => !bindings.subjectMinor || !e.adultOnly)\n if (bindings.selfPairing && active.some(e => e.twoPerson || e.counterpart)) add(\"roles\", \"error\", active.filter(e => e.twoPerson || e.counterpart).map(e => e.id), \"The same reference is connected as Target and Partner. Connect distinct participants before running this interaction.\")\n const omitted = entries.filter(e => bindings.subjectMinor && e.adultOnly)\n if (omitted.length) add(\"omitted\", active.length ? \"warning\" : \"error\", omitted.map(e => e.id), `${omitted.map(e => e.label).join(\", \")} omitted for a connected minor. ${active.length ? \"Replace these selections.\" : \"No selected motion contributes a fragment.\"}`)\n if ((bindings.targetNames?.length ?? 0) > 1) add(\"multiple-targets\", \"warning\", picks, \"Each target performs a separate copy of the sequence. Use separate motion nodes for coordinated choreography.\")\n for (const entry of active) {\n if (entry.deprecated) add(\"retired\", \"warning\", [entry.id], `${entry.label} is retired from new choices but still resolves in saved workflows.${entry.replacementId ? ` Use ${getCharacterMotion(entry.replacementId)?.label ?? entry.replacementId}.` : \"\"}`)\n if (entry.fixedPace && timing?.pace && timing.pace !== \"auto\") add(\"pace\", \"warning\", [entry.id], `${entry.label} sets its own timing. Set Pace to Auto or replace the motion.`)\n if (entry.requires?.length) add(\"requirements\", \"info\", [entry.id], `${entry.label} requires: ${entry.requires.join(\", \")}.${entry.twoPerson || entry.counterpart ? bindings.partnerNames?.length ? ` Partner reference: ${bindings.partnerNames.join(\", \")}; confirm it matches the required recipient.` : \" Connect a Partner reference to identify the recipient; otherwise the model chooses it.\" : \" Establish these in the scene or prompt; the fragment does not supply reference media.\"}`)\n }\n for (let i = 1; i < active.length; i++) {\n const before = active[i - 1]!, after = active[i]!, ids = [before.id, after.id]\n if (before.endVisibility === \"out-of-frame\") add(\"visibility\", \"warning\", ids, `${before.label} ends out of view before ${after.label}. Reorder or add an entrance.`)\n if (before.endPose && after.startPose && before.endPose !== \"any\" && after.startPose !== \"any\" && before.endPose !== after.startPose) add(\"pose\", \"warning\", ids, `${before.label} ends ${before.endPose}; ${after.label} starts ${after.startPose}. Add a transition or replace a motion.`)\n if (before.handsAfter && before.handsAfter !== \"free\" && after.needsFreeHands) add(\"hands\", \"warning\", ids, `${before.label} leaves hands occupied; ${after.label} needs free hands. Add a release first.`)\n }\n const compound = active.filter(e => e.kind === \"compound\")\n if (compound.length) add(\"compound\", \"warning\", compound.map(e => e.id), `${compound.length} selection${compound.length === 1 ? \" is\" : \"s are\"} compound choreography. Short clips may not fit every phase; test the sequence before adding more actions.`)\n return result\n}\n"]}
1
+ {"version":3,"sources":["../src/wardrobe.ts","../src/character-motion-diagnostics.ts"],"names":["id","h"],"mappings":"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","file":"chunk-IFRFYBGE.js","sourcesContent":["import { pickIds } from \"@nodaro/shared/catalogs\"\n\nexport type WardrobeDimension =\n | \"archetype\" | \"top\" | \"bottom\" | \"outerwear\" | \"footwear\"\n | \"headwear\" | \"accessories\" | \"color-palette\" | \"material\" | \"era\"\n\nexport interface WardrobeEntry {\n readonly id: string\n readonly label: string\n readonly dimension: WardrobeDimension\n readonly promptHint: string\n}\n\nexport interface WardrobeValue {\n archetype?: string\n top?: string\n bottom?: string\n outerwear?: string\n footwear?: string\n headwear?: string | ReadonlyArray<string>\n accessories?: string | ReadonlyArray<string>\n colorPalette?: string\n material?: string\n era?: string\n}\n\nexport const WARDROBE_DIMENSION_ORDER: ReadonlyArray<WardrobeDimension> = [\n \"archetype\", \"top\", \"bottom\", \"outerwear\", \"footwear\",\n \"headwear\", \"accessories\", \"color-palette\", \"material\", \"era\",\n]\n\nexport const WARDROBE_CATEGORY_LABELS: Readonly<Record<WardrobeDimension, string>> = {\n archetype: \"Archetype\", top: \"Top\", bottom: \"Bottom\", outerwear: \"Outerwear\",\n footwear: \"Footwear\", headwear: \"Headwear\", accessories: \"Accessories\",\n \"color-palette\": \"Color Palette\", material: \"Material\", era: \"Era\",\n}\n\nexport const WARDROBE_FIELD_BY_DIMENSION: Record<WardrobeDimension, keyof WardrobeValue> = {\n archetype: \"archetype\", top: \"top\", bottom: \"bottom\", outerwear: \"outerwear\",\n footwear: \"footwear\", headwear: \"headwear\", accessories: \"accessories\",\n \"color-palette\": \"colorPalette\", material: \"material\", era: \"era\",\n}\n\n/** Multi-pick dims emit each picked entry independently. */\nconst MULTI_PICK: ReadonlySet<WardrobeDimension> = new Set([\"headwear\", \"accessories\"])\n/** Sentinel ids that mean \"nothing here\" and emit no hint. */\nconst NONE_IDS: ReadonlySet<string> = new Set([\"wd-outer-none\"])\n\nexport const WARDROBE: ReadonlyArray<WardrobeEntry> = [\n // archetype\n { id: \"wd-casual\", label: \"Casual\", dimension: \"archetype\", promptHint: \"in casual everyday clothing\" },\n { id: \"wd-business\", label: \"Business\", dimension: \"archetype\", promptHint: \"in smart business attire\" },\n { id: \"wd-formal\", label: \"Formal\", dimension: \"archetype\", promptHint: \"in elegant formal wear\" },\n { id: \"wd-streetwear\", label: \"Streetwear\", dimension: \"archetype\", promptHint: \"in contemporary streetwear\" },\n { id: \"wd-athletic\", label: \"Athletic\", dimension: \"archetype\", promptHint: \"in athletic sportswear\" },\n { id: \"wd-fantasy\", label: \"Fantasy\", dimension: \"archetype\", promptHint: \"in fantasy costume\" },\n { id: \"wd-scifi\", label: \"Sci-Fi\", dimension: \"archetype\", promptHint: \"in futuristic sci-fi attire\" },\n { id: \"wd-historical\", label: \"Historical\", dimension: \"archetype\", promptHint: \"in period historical dress\" },\n { id: \"wd-uniform\", label: \"Uniform\", dimension: \"archetype\", promptHint: \"in a uniform\" },\n { id: \"wd-loungewear\", label: \"Loungewear\", dimension: \"archetype\", promptHint: \"in relaxed loungewear\" },\n // top\n { id: \"wd-tshirt\", label: \"T-Shirt\", dimension: \"top\", promptHint: \"wearing a t-shirt\" },\n { id: \"wd-blouse\", label: \"Blouse\", dimension: \"top\", promptHint: \"wearing a blouse\" },\n { id: \"wd-hoodie\", label: \"Hoodie\", dimension: \"top\", promptHint: \"wearing a hoodie\" },\n { id: \"wd-buttondown\", label: \"Button-down\", dimension: \"top\", promptHint: \"wearing a button-down shirt\" },\n { id: \"wd-tank\", label: \"Tank\", dimension: \"top\", promptHint: \"wearing a tank top\" },\n { id: \"wd-sweater\", label: \"Sweater\", dimension: \"top\", promptHint: \"wearing a sweater\" },\n { id: \"wd-turtleneck\", label: \"Turtleneck\", dimension: \"top\", promptHint: \"wearing a turtleneck\" },\n // bottom\n { id: \"wd-jeans\", label: \"Jeans\", dimension: \"bottom\", promptHint: \"wearing jeans\" },\n { id: \"wd-trousers\", label: \"Trousers\", dimension: \"bottom\", promptHint: \"wearing tailored trousers\" },\n { id: \"wd-skirt\", label: \"Skirt\", dimension: \"bottom\", promptHint: \"wearing a skirt\" },\n { id: \"wd-shorts\", label: \"Shorts\", dimension: \"bottom\", promptHint: \"wearing shorts\" },\n { id: \"wd-leggings\", label: \"Leggings\", dimension: \"bottom\", promptHint: \"wearing leggings\" },\n { id: \"wd-cargo\", label: \"Cargo\", dimension: \"bottom\", promptHint: \"wearing cargo pants\" },\n // outerwear\n { id: \"wd-outer-none\", label: \"None\", dimension: \"outerwear\", promptHint: \"\" },\n { id: \"wd-leatherjkt\", label: \"Leather Jacket\", dimension: \"outerwear\", promptHint: \"in a leather jacket\" },\n { id: \"wd-blazer\", label: \"Blazer\", dimension: \"outerwear\", promptHint: \"in a blazer\" },\n { id: \"wd-trench\", label: \"Trench Coat\", dimension: \"outerwear\", promptHint: \"in a trench coat\" },\n { id: \"wd-parka\", label: \"Parka\", dimension: \"outerwear\", promptHint: \"in a parka\" },\n { id: \"wd-cloak\", label: \"Cloak\", dimension: \"outerwear\", promptHint: \"in a flowing cloak\" },\n { id: \"wd-denimjkt\", label: \"Denim Jacket\", dimension: \"outerwear\", promptHint: \"in a denim jacket\" },\n { id: \"wd-cardigan\", label: \"Cardigan\", dimension: \"outerwear\", promptHint: \"in a cardigan\" },\n // footwear\n { id: \"wd-sneakers\", label: \"Sneakers\", dimension: \"footwear\", promptHint: \"wearing sneakers\" },\n { id: \"wd-boots\", label: \"Boots\", dimension: \"footwear\", promptHint: \"wearing boots\" },\n { id: \"wd-heels\", label: \"Heels\", dimension: \"footwear\", promptHint: \"wearing heels\" },\n { id: \"wd-sandals\", label: \"Sandals\", dimension: \"footwear\", promptHint: \"wearing sandals\" },\n { id: \"wd-dressshoe\", label: \"Dress Shoes\", dimension: \"footwear\", promptHint: \"wearing dress shoes\" },\n { id: \"wd-barefoot\", label: \"Barefoot\", dimension: \"footwear\", promptHint: \"barefoot\" },\n // headwear (multi)\n { id: \"wd-cap\", label: \"Cap\", dimension: \"headwear\", promptHint: \"wearing a cap\" },\n { id: \"wd-beanie\", label: \"Beanie\", dimension: \"headwear\", promptHint: \"wearing a beanie\" },\n { id: \"wd-widehat\", label: \"Wide-brim Hat\", dimension: \"headwear\", promptHint: \"wearing a wide-brim hat\" },\n { id: \"wd-hood\", label: \"Hood\", dimension: \"headwear\", promptHint: \"with the hood up\" },\n { id: \"wd-crown\", label: \"Crown\", dimension: \"headwear\", promptHint: \"wearing a crown\" },\n { id: \"wd-helmet\", label: \"Helmet\", dimension: \"headwear\", promptHint: \"wearing a helmet\" },\n // accessories (multi)\n { id: \"wd-glasses\", label: \"Glasses\", dimension: \"accessories\", promptHint: \"wearing glasses\" },\n { id: \"wd-sunglasses\", label: \"Sunglasses\", dimension: \"accessories\", promptHint: \"wearing sunglasses\" },\n { id: \"wd-scarf\", label: \"Scarf\", dimension: \"accessories\", promptHint: \"wearing a scarf\" },\n { id: \"wd-gloves\", label: \"Gloves\", dimension: \"accessories\", promptHint: \"wearing gloves\" },\n { id: \"wd-jewelry\", label: \"Jewelry\", dimension: \"accessories\", promptHint: \"wearing statement jewelry\" },\n { id: \"wd-belt\", label: \"Belt\", dimension: \"accessories\", promptHint: \"with a belt\" },\n { id: \"wd-watch\", label: \"Watch\", dimension: \"accessories\", promptHint: \"wearing a watch\" },\n // color-palette\n { id: \"wd-neutral\", label: \"Neutral\", dimension: \"color-palette\", promptHint: \"in a neutral color palette\" },\n { id: \"wd-all-black\", label: \"All Black\", dimension: \"color-palette\", promptHint: \"in an all-black palette\" },\n { id: \"wd-earth\", label: \"Earth Tones\", dimension: \"color-palette\", promptHint: \"in earth-tone colors\" },\n { id: \"wd-pastel\", label: \"Pastel\", dimension: \"color-palette\", promptHint: \"in pastel colors\" },\n { id: \"wd-jewel\", label: \"Jewel Tones\", dimension: \"color-palette\", promptHint: \"in rich jewel-tone colors\" },\n { id: \"wd-neon\", label: \"Neon\", dimension: \"color-palette\", promptHint: \"in vivid neon colors\" },\n { id: \"wd-all-white\", label: \"All White\", dimension: \"color-palette\", promptHint: \"in an all-white palette\" },\n // material\n { id: \"wd-cotton\", label: \"Cotton\", dimension: \"material\", promptHint: \"in cotton fabric\" },\n { id: \"wd-denim\", label: \"Denim\", dimension: \"material\", promptHint: \"in denim\" },\n { id: \"wd-leather\", label: \"Leather\", dimension: \"material\", promptHint: \"in leather\" },\n { id: \"wd-silk\", label: \"Silk\", dimension: \"material\", promptHint: \"in silk\" },\n { id: \"wd-wool\", label: \"Wool\", dimension: \"material\", promptHint: \"in wool\" },\n { id: \"wd-latex\", label: \"Latex\", dimension: \"material\", promptHint: \"in latex\" },\n { id: \"wd-linen\", label: \"Linen\", dimension: \"material\", promptHint: \"in linen\" },\n // era\n { id: \"wd-contemporary\", label: \"Contemporary\", dimension: \"era\", promptHint: \"in contemporary fashion\" },\n { id: \"wd-1920s\", label: \"1920s\", dimension: \"era\", promptHint: \"in 1920s fashion\" },\n { id: \"wd-1950s\", label: \"1950s\", dimension: \"era\", promptHint: \"in 1950s fashion\" },\n { id: \"wd-1980s\", label: \"1980s\", dimension: \"era\", promptHint: \"in 1980s fashion\" },\n { id: \"wd-victorian\", label: \"Victorian\", dimension: \"era\", promptHint: \"in Victorian-era dress\" },\n { id: \"wd-medieval\", label: \"Medieval\", dimension: \"era\", promptHint: \"in medieval dress\" },\n { id: \"wd-futuristic\", label: \"Futuristic\", dimension: \"era\", promptHint: \"in futuristic clothing\" },\n] as const\n\nconst BY_ID: Map<string, WardrobeEntry> = new Map(WARDROBE.map((e) => [e.id, e]))\n\n/** Entries grouped by dimension — precomputed once so per-dimension lookups\n * (the picker calls one per dimension per render) are O(1) with stable array\n * refs, instead of a full WARDROBE scan each call. */\nconst BY_DIMENSION: Map<WardrobeDimension, WardrobeEntry[]> = (() => {\n const map = new Map<WardrobeDimension, WardrobeEntry[]>()\n for (const e of WARDROBE) {\n const list = map.get(e.dimension)\n if (list) list.push(e)\n else map.set(e.dimension, [e])\n }\n return map\n})()\n\nexport function getWardrobeEntry(id: string | undefined | null): WardrobeEntry | undefined {\n return id ? BY_ID.get(id) : undefined\n}\n\nexport function getWardrobePromptHint(id: string | undefined | null): string {\n return getWardrobeEntry(id)?.promptHint ?? \"\"\n}\n\nexport function getWardrobeEntriesByDimension(dim: WardrobeDimension): WardrobeEntry[] {\n return BY_DIMENSION.get(dim) ?? []\n}\n\nexport function buildWardrobeHints(value: Record<string, unknown> & WardrobeValue): string[] {\n const hints: string[] = []\n for (const dimension of WARDROBE_DIMENSION_ORDER) {\n const field = WARDROBE_FIELD_BY_DIMENSION[dimension]\n const raw = value[field]\n if (MULTI_PICK.has(dimension)) {\n for (const id of pickIds(raw)) {\n if (NONE_IDS.has(id)) continue\n const h = getWardrobePromptHint(id)\n if (h) hints.push(h)\n }\n continue\n }\n const id = typeof raw === \"string\" ? raw : undefined\n if (!id || NONE_IDS.has(id)) continue\n const h = getWardrobePromptHint(id)\n if (h) hints.push(h)\n }\n return hints\n}\n","import { getCharacterMotion, CHARACTER_MOTION_MAX_PICKS, type CharacterMotionTiming } from \"./character-motion.js\"\n\nexport interface CharacterMotionDiagnostic {\n readonly code: \"unknown\" | \"omitted\" | \"retired\" | \"pose\" | \"visibility\" | \"hands\" | \"pace\" | \"requirements\" | \"compound\" | \"capacity\" | \"multiple-targets\" | \"roles\"\n readonly severity: \"error\" | \"warning\" | \"info\"\n readonly ids: readonly string[]\n readonly message: string\n}\nexport interface CharacterMotionBindings {\n readonly selfPairing?: boolean\n readonly subjectMinor?: boolean\n readonly partnerNames?: readonly string[]\n readonly targetNames?: readonly string[]\n}\n\n/** Shared by editor, API clients and local review. Missing metadata means\n * unknown; this never certifies a sequence or predicts clip duration. */\nexport function getCharacterMotionDiagnostics(\n value: string | readonly string[] | null | undefined,\n timing?: CharacterMotionTiming,\n bindings: CharacterMotionBindings = {},\n): readonly CharacterMotionDiagnostic[] {\n const requested = typeof value === \"string\" ? [value] : Array.isArray(value) ? [...new Set(value)] : []\n const result: CharacterMotionDiagnostic[] = []\n const add = (code: CharacterMotionDiagnostic[\"code\"], severity: CharacterMotionDiagnostic[\"severity\"], ids: readonly string[], message: string) => result.push({ code, severity, ids, message })\n if (requested.length > CHARACTER_MOTION_MAX_PICKS) add(\"capacity\", \"warning\", requested, \"Only the first three selections contribute. Remove extra selections.\")\n const picks = requested.slice(0, CHARACTER_MOTION_MAX_PICKS)\n for (const id of picks) if (!getCharacterMotion(id)) add(\"unknown\", \"error\", [id], `Motion “${id}” is unavailable and contributes no fragment. Remove or replace it.`)\n const entries = picks.flatMap(id => { const entry = getCharacterMotion(id); return entry?.promptHint ? [entry] : [] })\n const active = entries.filter(e => !bindings.subjectMinor || !e.adultOnly)\n if (bindings.selfPairing && active.some(e => e.twoPerson || e.counterpart)) add(\"roles\", \"error\", active.filter(e => e.twoPerson || e.counterpart).map(e => e.id), \"The same reference is connected as Target and Partner. Connect distinct participants before running this interaction.\")\n const omitted = entries.filter(e => bindings.subjectMinor && e.adultOnly)\n if (omitted.length) add(\"omitted\", active.length ? \"warning\" : \"error\", omitted.map(e => e.id), `${omitted.map(e => e.label).join(\", \")} omitted for a connected minor. ${active.length ? \"Replace these selections.\" : \"No selected motion contributes a fragment.\"}`)\n if ((bindings.targetNames?.length ?? 0) > 1) add(\"multiple-targets\", \"warning\", picks, \"Each target performs a separate copy of the sequence. Use separate motion nodes for coordinated choreography.\")\n for (const entry of active) {\n if (entry.deprecated) add(\"retired\", \"warning\", [entry.id], `${entry.label} is retired from new choices but still resolves in saved workflows.${entry.replacementId ? ` Use ${getCharacterMotion(entry.replacementId)?.label ?? entry.replacementId}.` : \"\"}`)\n if (entry.fixedPace && timing?.pace && timing.pace !== \"auto\") add(\"pace\", \"warning\", [entry.id], `${entry.label} sets its own timing. Set Pace to Auto or replace the motion.`)\n if (entry.requires?.length) add(\"requirements\", \"info\", [entry.id], `${entry.label} requires: ${entry.requires.join(\", \")}.${entry.twoPerson || entry.counterpart ? bindings.partnerNames?.length ? ` Partner reference: ${bindings.partnerNames.join(\", \")}; confirm it matches the required recipient.` : \" Connect a Partner reference to identify the recipient; otherwise the model chooses it.\" : \" Establish these in the scene or prompt; the fragment does not supply reference media.\"}`)\n }\n for (let i = 1; i < active.length; i++) {\n const before = active[i - 1]!, after = active[i]!, ids = [before.id, after.id]\n if (before.endVisibility === \"out-of-frame\") add(\"visibility\", \"warning\", ids, `${before.label} ends out of view before ${after.label}. Reorder or add an entrance.`)\n if (before.endPose && after.startPose && before.endPose !== \"any\" && after.startPose !== \"any\" && before.endPose !== after.startPose) add(\"pose\", \"warning\", ids, `${before.label} ends ${before.endPose}; ${after.label} starts ${after.startPose}. Add a transition or replace a motion.`)\n if (before.handsAfter && before.handsAfter !== \"free\" && after.needsFreeHands) add(\"hands\", \"warning\", ids, `${before.label} leaves hands occupied; ${after.label} needs free hands. Add a release first.`)\n }\n const compound = active.filter(e => e.kind === \"compound\")\n if (compound.length) add(\"compound\", \"warning\", compound.map(e => e.id), `${compound.length} selection${compound.length === 1 ? \" is\" : \"s are\"} compound choreography. Short clips may not fit every phase; test the sequence before adding more actions.`)\n return result\n}\n"]}