@clay-design-system/email 0.0.0-stage → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (268) hide show
  1. package/README.md +48 -2
  2. package/dist/build/asset-scoring.d.ts +48 -0
  3. package/dist/build/asset-scoring.d.ts.map +1 -0
  4. package/dist/build/asset-scoring.js +58 -0
  5. package/dist/build/asset-scoring.js.map +1 -0
  6. package/dist/build/braze-transform.d.ts +20 -0
  7. package/dist/build/braze-transform.d.ts.map +1 -0
  8. package/dist/build/braze-transform.js +26 -0
  9. package/dist/build/braze-transform.js.map +1 -0
  10. package/dist/build/catalog.d.ts +25 -0
  11. package/dist/build/catalog.d.ts.map +1 -0
  12. package/dist/build/catalog.js +3 -0
  13. package/dist/build/catalog.js.map +1 -0
  14. package/dist/build/cloudinary-env.d.ts +15 -0
  15. package/dist/build/cloudinary-env.d.ts.map +1 -0
  16. package/dist/build/cloudinary-env.js +36 -0
  17. package/dist/build/cloudinary-env.js.map +1 -0
  18. package/dist/build/cloudinary-manifest.d.ts +33 -0
  19. package/dist/build/cloudinary-manifest.d.ts.map +1 -0
  20. package/dist/build/cloudinary-manifest.js +36 -0
  21. package/dist/build/cloudinary-manifest.js.map +1 -0
  22. package/dist/build/compile.d.ts +11 -0
  23. package/dist/build/compile.d.ts.map +1 -0
  24. package/dist/build/compile.js +234 -0
  25. package/dist/build/compile.js.map +1 -0
  26. package/dist/build/email-config.d.ts +26 -0
  27. package/dist/build/email-config.d.ts.map +1 -0
  28. package/dist/build/email-config.js +17 -0
  29. package/dist/build/email-config.js.map +1 -0
  30. package/dist/build/email-list.d.ts +6 -0
  31. package/dist/build/email-list.d.ts.map +1 -0
  32. package/dist/build/email-list.js +17 -0
  33. package/dist/build/email-list.js.map +1 -0
  34. package/dist/build/email-tree.d.ts +23 -0
  35. package/dist/build/email-tree.d.ts.map +1 -0
  36. package/dist/build/email-tree.js +46 -0
  37. package/dist/build/email-tree.js.map +1 -0
  38. package/dist/build/export-braze.d.ts +22 -0
  39. package/dist/build/export-braze.d.ts.map +1 -0
  40. package/dist/build/export-braze.js +92 -0
  41. package/dist/build/export-braze.js.map +1 -0
  42. package/dist/build/generate-stock-library-map.d.ts +13 -0
  43. package/dist/build/generate-stock-library-map.d.ts.map +1 -0
  44. package/dist/build/generate-stock-library-map.js +202 -0
  45. package/dist/build/generate-stock-library-map.js.map +1 -0
  46. package/dist/build/icon-registry-map.d.ts +34 -0
  47. package/dist/build/icon-registry-map.d.ts.map +1 -0
  48. package/dist/build/icon-registry-map.js +44 -0
  49. package/dist/build/icon-registry-map.js.map +1 -0
  50. package/dist/build/import-examples.d.ts +14 -0
  51. package/dist/build/import-examples.d.ts.map +1 -0
  52. package/dist/build/import-examples.js +65 -0
  53. package/dist/build/import-examples.js.map +1 -0
  54. package/dist/build/persona-character-map.d.ts +32 -0
  55. package/dist/build/persona-character-map.d.ts.map +1 -0
  56. package/dist/build/persona-character-map.js +90 -0
  57. package/dist/build/persona-character-map.js.map +1 -0
  58. package/dist/build/stock-library-map.d.ts +57 -0
  59. package/dist/build/stock-library-map.d.ts.map +1 -0
  60. package/dist/build/stock-library-map.js +1261 -0
  61. package/dist/build/stock-library-map.js.map +1 -0
  62. package/dist/build/upload-assets.d.ts +20 -0
  63. package/dist/build/upload-assets.d.ts.map +1 -0
  64. package/dist/build/upload-assets.js +153 -0
  65. package/dist/build/upload-assets.js.map +1 -0
  66. package/dist/build/upload-library-assets.d.ts +21 -0
  67. package/dist/build/upload-library-assets.d.ts.map +1 -0
  68. package/dist/build/upload-library-assets.js +182 -0
  69. package/dist/build/upload-library-assets.js.map +1 -0
  70. package/dist/build/visual-resolver.d.ts +70 -0
  71. package/dist/build/visual-resolver.d.ts.map +1 -0
  72. package/dist/build/visual-resolver.js +375 -0
  73. package/dist/build/visual-resolver.js.map +1 -0
  74. package/dist/catalog.json +467 -0
  75. package/dist/emails/component-buttons-icons.html +435 -0
  76. package/dist/emails/component-buttons-integration.html +256 -0
  77. package/dist/emails/component-buttons-primary.html +269 -0
  78. package/dist/emails/component-buttons-secondary.html +255 -0
  79. package/dist/emails/component-buttons-two-integrations.html +310 -0
  80. package/dist/emails/component-images-card-280h.html +281 -0
  81. package/dist/emails/component-images-card-320h.html +281 -0
  82. package/dist/emails/component-images-card.html +281 -0
  83. package/dist/emails/component-images-full-bleed-280h.html +279 -0
  84. package/dist/emails/component-images-full-bleed-400h.html +279 -0
  85. package/dist/emails/component-images-full-bleed.html +279 -0
  86. package/dist/emails/component-text-h1.html +254 -0
  87. package/dist/emails/component-text-h2.html +230 -0
  88. package/dist/emails/component-text-h3.html +255 -0
  89. package/dist/emails/component-text-h4.html +255 -0
  90. package/dist/emails/component-text-h5.html +254 -0
  91. package/dist/emails/component-text-p2.html +253 -0
  92. package/dist/emails/component-text-p3.html +254 -0
  93. package/dist/emails/component-text-p4.html +254 -0
  94. package/dist/emails/container.html +250 -0
  95. package/dist/emails/section-changelog-icon-list.html +1201 -0
  96. package/dist/emails/section-divider-line.html +340 -0
  97. package/dist/emails/section-feature-highlight-reversed.html +377 -0
  98. package/dist/emails/section-feature-highlight.html +384 -0
  99. package/dist/emails/section-feature-rows.html +328 -0
  100. package/dist/emails/section-feature-story-row-reversed.html +381 -0
  101. package/dist/emails/section-feature-story-row.html +382 -0
  102. package/dist/emails/section-footer-lifecycle.html +650 -0
  103. package/dist/emails/section-footer-two-column-minimal.html +318 -0
  104. package/dist/emails/section-footer.html +413 -0
  105. package/dist/emails/section-header.html +290 -0
  106. package/dist/emails/section-hero.html +276 -0
  107. package/dist/emails/section-icon-feature-list.html +554 -0
  108. package/dist/emails/section-image-caption-block.html +313 -0
  109. package/dist/emails/section-image-hero.html +341 -0
  110. package/dist/emails/section-lesson-card.html +628 -0
  111. package/dist/emails/section-list-action-items.html +590 -0
  112. package/dist/emails/section-list-feature-items.html +713 -0
  113. package/dist/emails/section-list-icon-items.html +701 -0
  114. package/dist/emails/section-list-numbered-items.html +733 -0
  115. package/dist/emails/section-logo-header.html +288 -0
  116. package/dist/emails/section-newsletter-hero.html +393 -0
  117. package/dist/emails/section-product-ui-hero.html +496 -0
  118. package/dist/emails/section-promo-banner.html +308 -0
  119. package/dist/emails/section-qa-block.html +440 -0
  120. package/dist/emails/section-resource-link-list.html +481 -0
  121. package/dist/emails/section-signoff.html +279 -0
  122. package/dist/emails/section-single-column-author.html +453 -0
  123. package/dist/emails/section-single-column-feature-card.html +312 -0
  124. package/dist/emails/section-single-column-product-card.html +393 -0
  125. package/dist/emails/section-single-column-promo-card.html +306 -0
  126. package/dist/emails/section-spacer-fill.html +281 -0
  127. package/dist/emails/section-testimonial-dark-card.html +363 -0
  128. package/dist/emails/section-text-h1-regular.html +254 -0
  129. package/dist/emails/section-text-h2-regular.html +254 -0
  130. package/dist/emails/section-text-h3-regular.html +254 -0
  131. package/dist/emails/section-text-h4-regular.html +254 -0
  132. package/dist/emails/section-text-h5-regular.html +254 -0
  133. package/dist/emails/section-text-mixed-heading.html +269 -0
  134. package/dist/emails/section-text-overline-heading.html +281 -0
  135. package/dist/emails/section-text-p1-bold.html +254 -0
  136. package/dist/emails/section-text-p1-regular.html +255 -0
  137. package/dist/emails/section-text-paragraph.html +358 -0
  138. package/dist/emails/section-text-quote-card.html +269 -0
  139. package/dist/emails/section-text-quote.html +313 -0
  140. package/dist/emails/section-text-small-headline.html +279 -0
  141. package/dist/emails/section-three-column-content-cards.html +499 -0
  142. package/dist/emails/section-three-column-icon-cards.html +510 -0
  143. package/dist/emails/section-three-column-image-grid.html +466 -0
  144. package/dist/emails/section-three-up-icon-benefits.html +464 -0
  145. package/dist/emails/section-two-column-feature-cards.html +708 -0
  146. package/dist/emails/section-two-column-grid.html +1131 -0
  147. package/dist/emails/section-two-column-img-text.html +331 -0
  148. package/dist/emails/section-two-column-live-tags.html +367 -0
  149. package/dist/emails/section-two-column-stacked.html +629 -0
  150. package/dist/emails/section-upsell-cta.html +597 -0
  151. package/dist/emails/section-value-bullet-list.html +313 -0
  152. package/dist/examples/manifest.d.ts +21 -0
  153. package/dist/examples/manifest.d.ts.map +1 -0
  154. package/dist/examples/manifest.js +84 -0
  155. package/dist/examples/manifest.js.map +1 -0
  156. package/dist/exports/contact-sales/Images/Contact_sales_Image_16f4175c-d08c-43f6-9d4c-a0606383271d.png +0 -0
  157. package/dist/exports/contact-sales/Images/Contact_sales_Image_659b3091-1da9-40c2-86b0-04250982e529.png +0 -0
  158. package/dist/exports/contact-sales/Images/Contact_sales_Image_79c651f4-5f0f-4a7f-8354-1f6f95ae86d9.png +0 -0
  159. package/dist/exports/contact-sales/index.braze.html +837 -0
  160. package/dist/exports/contact-sales/index.html +837 -0
  161. package/dist/exports/event-confirmation/Images/Confirmation_Image_11938de2-4161-4ae8-8969-90ea0d8b45cb.png +0 -0
  162. package/dist/exports/event-confirmation/Images/Confirmation_Image_3c52e81f-5d4f-452c-bad1-0471a27598f1.png +0 -0
  163. package/dist/exports/event-confirmation/Images/Confirmation_Image_3ec1fec8-bf46-4068-8835-633567a715f9.png +0 -0
  164. package/dist/exports/event-confirmation/Images/Confirmation_Image_c4980c01-c270-4384-a56c-0bae74814cf9.png +0 -0
  165. package/dist/exports/event-confirmation/Images/Confirmation_Image_cde93e8c-0f96-434d-acaf-1b86503c66f0.png +0 -0
  166. package/dist/exports/event-confirmation/index.braze.html +1055 -0
  167. package/dist/exports/event-confirmation/index.html +1055 -0
  168. package/dist/exports/legal-update/Images/v2_Image_07bbcc13-0ab8-46e4-ab94-98f215f85f69.png +0 -0
  169. package/dist/exports/legal-update/Images/v2_Image_34394d50-acdf-4375-b254-eef1f84aaacb.png +0 -0
  170. package/dist/exports/legal-update/Images/v2_Image_4a25f2bd-6270-439b-86c5-4a968a1b104f.png +0 -0
  171. package/dist/exports/legal-update/Images/v2_Image_7e8e814f-3112-4d8c-af5b-4f4616d84d9c.png +0 -0
  172. package/dist/exports/legal-update/Images/v2_Image_b24a04c8-4af0-42a1-be0f-cd3f66595e47.png +0 -0
  173. package/dist/exports/legal-update/Images/v2_Image_b709b9fb-836e-4c20-82e5-a9cb9d702392.png +0 -0
  174. package/dist/exports/legal-update/Images/v2_Image_ed7b924b-35e6-4536-be0c-92ddc8a34fc2.png +0 -0
  175. package/dist/exports/legal-update/index.braze.html +1731 -0
  176. package/dist/exports/legal-update/index.html +1731 -0
  177. package/dist/exports/newsletter/Images/Status_update_-_July_26_Image_09be22f6-1f30-4c58-bf33-1df0494b8fc2.png +0 -0
  178. package/dist/exports/newsletter/Images/Status_update_-_July_26_Image_2dfb595e-6fe2-4e6e-a73a-942a085b38ab.png +0 -0
  179. package/dist/exports/newsletter/Images/Status_update_-_July_26_Image_544c971b-b4b5-4c89-a25a-8f0d92644009.png +0 -0
  180. package/dist/exports/newsletter/Images/Status_update_-_July_26_Image_5b6a9576-1c33-40c5-81e3-637514fb6c78.png +0 -0
  181. package/dist/exports/newsletter/Images/Status_update_-_July_26_Image_680c6193-793a-4a24-8288-4bb4046f4f5e.png +0 -0
  182. package/dist/exports/newsletter/Images/Status_update_-_July_26_Image_75818ba9-026a-45d7-91e4-f992d4ee7690.png +0 -0
  183. package/dist/exports/newsletter/Images/Status_update_-_July_26_Image_785f18e6-816d-44d1-8efb-ecc82510b540.png +0 -0
  184. package/dist/exports/newsletter/Images/Status_update_-_July_26_Image_8bf9141d-9d63-4601-9e81-5c9d726e17f8.png +0 -0
  185. package/dist/exports/newsletter/Images/Status_update_-_July_26_Image_9097d6e0-65d0-4237-9661-963751812786.png +0 -0
  186. package/dist/exports/newsletter/Images/Status_update_-_July_26_Image_a4ef2f53-2eaf-438a-bfef-61455ac0915e.png +0 -0
  187. package/dist/exports/newsletter/Images/Status_update_-_July_26_Image_b7748f87-a7b7-4a91-981a-16567683e4b4.png +0 -0
  188. package/dist/exports/newsletter/Images/Status_update_-_July_26_Image_bc9830a4-2911-4768-808a-32cbbc39215e.png +0 -0
  189. package/dist/exports/newsletter/Images/Status_update_-_July_26_Image_ef0e8e92-9075-43a9-991f-09a77ef6d6d4.png +0 -0
  190. package/dist/exports/newsletter/index.braze.html +125 -0
  191. package/dist/exports/newsletter/index.html +125 -0
  192. package/dist/exports/newsletter-ai-june-july/Images/newsletter-ai-blocks.png +0 -0
  193. package/dist/exports/newsletter-ai-june-july/Images/newsletter-ai-hero-mcp.png +0 -0
  194. package/dist/exports/newsletter-ai-june-july/Images/newsletter-ai-magic.png +0 -0
  195. package/dist/exports/newsletter-ai-june-july/Images/newsletter-ai-mcp.png +0 -0
  196. package/dist/exports/newsletter-ai-june-july/Images/newsletter-ai-portfolio.png +0 -0
  197. package/dist/exports/newsletter-ai-june-july/index.braze.html +1640 -0
  198. package/dist/exports/newsletter-ai-june-july/index.html +1640 -0
  199. package/dist/exports/survey/Images/EmailLove_Image_3b6f4a6f-7f5f-418b-be71-9371b25c20ce.png +0 -0
  200. package/dist/exports/survey/Images/EmailLove_Image_f659c728-2401-485d-8d90-98c962d28c0c.png +0 -0
  201. package/dist/exports/survey/index.braze.html +515 -0
  202. package/dist/exports/survey/index.html +515 -0
  203. package/dist/exports/trial-01-welcome/Images/tp1_-_welcome_Before_115ccc58-a47f-4eca-a1f2-c0d86e1e1cf4.png +0 -0
  204. package/dist/exports/trial-01-welcome/Images/tp1_-_welcome_Before_aec4d0d3-6057-4b8a-8d8f-46fbd024f182.png +0 -0
  205. package/dist/exports/trial-01-welcome/Images/tp1_-_welcome_Before_d139966a-6051-4383-bf8f-1e5138e1b030.png +0 -0
  206. package/dist/exports/trial-01-welcome/Images/tp1_-_welcome_Image_080fa361-a3f2-4593-9ac0-03cf3a7972ff.png +0 -0
  207. package/dist/exports/trial-01-welcome/Images/tp1_-_welcome_Image_5ebade34-8f1d-4c2c-9d27-5f9e843ce502.png +0 -0
  208. package/dist/exports/trial-01-welcome/Images/tp1_-_welcome_Image_aa5e4144-9ec8-4525-b01e-077d72f0bab6.png +0 -0
  209. package/dist/exports/trial-01-welcome/index.braze.html +941 -0
  210. package/dist/exports/trial-01-welcome/index.html +941 -0
  211. package/dist/exports/trial-02/Images/tp2_Image_5b0d9bc4-2e38-4252-8f20-d9f27d471c21.png +0 -0
  212. package/dist/exports/trial-02/Images/tp2_Image_b3f77c7c-cc8e-4db8-a5d9-072f4f621e72.png +0 -0
  213. package/dist/exports/trial-02/Images/tp2_Image_cafd1a17-1915-47cd-80f2-1c2d0b133cfe.png +0 -0
  214. package/dist/exports/trial-02/index.braze.html +923 -0
  215. package/dist/exports/trial-02/index.html +923 -0
  216. package/dist/exports/trial-03/Images/tp3_Image_1b96630c-fc4d-4aec-91fb-3c1d4d8544b3.png +0 -0
  217. package/dist/exports/trial-03/Images/tp3_Image_58f3a342-2193-4b5c-b30a-96f7f3338dd8.png +0 -0
  218. package/dist/exports/trial-03/Images/tp3_Image_6c4f307a-bac2-40e7-b4f1-9aa623c9eb8e.png +0 -0
  219. package/dist/exports/trial-03/Images/tp3_Image_848917ce-3f89-4538-a826-558b21f5fea7.png +0 -0
  220. package/dist/exports/trial-03/Images/tp3_Image_aae8410f-556f-4fb9-88f9-f276d75bafd2.png +0 -0
  221. package/dist/exports/trial-03/Images/tp3_Image_b4d5be39-509e-4f22-9601-dd070e4c6561.png +0 -0
  222. package/dist/exports/trial-03/index.braze.html +1129 -0
  223. package/dist/exports/trial-03/index.html +1129 -0
  224. package/dist/exports/trial-04/Images/tp4_Image_03bd5a56-25e3-4dcc-bef5-143bf12312d5.png +0 -0
  225. package/dist/exports/trial-04/Images/tp4_Image_0facbfca-b735-4199-a0d9-05a59341a1e3.gif +0 -0
  226. package/dist/exports/trial-04/Images/tp4_Image_171cee5f-cd3d-42f0-a180-995893d3742a.png +0 -0
  227. package/dist/exports/trial-04/Images/tp4_Image_3509d89d-1825-4817-8c1e-130fa294d0e1.png +0 -0
  228. package/dist/exports/trial-04/Images/tp4_Image_763a0f40-2985-4140-859b-ddd34f20a520.png +0 -0
  229. package/dist/exports/trial-04/Images/tp4_Image_cc2db4f5-b41d-45d7-a798-7a79e7b8d4d8.png +0 -0
  230. package/dist/exports/trial-04/index.braze.html +885 -0
  231. package/dist/exports/trial-04/index.html +885 -0
  232. package/dist/exports/trial-05/Images/tp5_Image_0248a517-5c60-4e84-ad1c-449dcf4f6a64.png +0 -0
  233. package/dist/exports/trial-05/Images/tp5_Image_4c1a2d5a-47d3-4801-bb3a-01c22decc108.png +0 -0
  234. package/dist/exports/trial-05/Images/tp5_Image_63ae77e7-cec7-4b4a-91e0-603b5a80929f.png +0 -0
  235. package/dist/exports/trial-05/Images/tp5_Image_7aa43530-6707-4308-ab0e-e4c38fc1b77d.png +0 -0
  236. package/dist/exports/trial-05/Images/tp5_Image_7efe5b6d-b360-4179-bee1-72908ba569bc.png +0 -0
  237. package/dist/exports/trial-05/Images/tp5_Image_b142bd84-c40a-4a29-b9d5-715b52fdd937.png +0 -0
  238. package/dist/exports/trial-05/Images/tp5_Image_c0c896ea-5b68-4f58-9e27-cdb4a1f1b438.png +0 -0
  239. package/dist/exports/trial-05/index.braze.html +1023 -0
  240. package/dist/exports/trial-05/index.html +1023 -0
  241. package/dist/exports/trial-06/Images/tp6_Image_2267a268-8a80-4e0d-8813-d4c75dbab6f2.png +0 -0
  242. package/dist/exports/trial-06/Images/tp6_Image_637a97b7-837e-478d-8ed1-6e8c2739fdc7.png +0 -0
  243. package/dist/exports/trial-06/Images/tp6_Image_a78df270-ad6f-41e6-8822-ba8ec38313a3.png +0 -0
  244. package/dist/exports/trial-06/index.braze.html +773 -0
  245. package/dist/exports/trial-06/index.html +773 -0
  246. package/dist/exports/winback/Images/_managers_Image_4587ac22-460c-487a-bc37-9dbc487e95a4.png +0 -0
  247. package/dist/exports/winback/Images/_managers_Image_8a77ec2c-ed49-480d-a1a1-7a38abad232a.png +0 -0
  248. package/dist/exports/winback/Images/_managers_Image_bb643775-8a2f-4e28-9dfb-6d1838c3561f.png +0 -0
  249. package/dist/exports/winback/Images/_managers_Image_f7d1bca5-0fcb-4d4c-abcd-40ce2d453b07.png +0 -0
  250. package/dist/exports/winback/index.braze.html +605 -0
  251. package/dist/exports/winback/index.html +605 -0
  252. package/dist/generated/email-tokens.d.ts +101 -0
  253. package/dist/generated/email-tokens.d.ts.map +1 -0
  254. package/dist/generated/email-tokens.js +104 -0
  255. package/dist/generated/email-tokens.js.map +1 -0
  256. package/dist/index.d.ts +9 -0
  257. package/dist/index.d.ts.map +1 -0
  258. package/dist/index.js +8 -0
  259. package/dist/index.js.map +1 -0
  260. package/dist/tokens/build-email-assets.d.ts +19 -0
  261. package/dist/tokens/build-email-assets.d.ts.map +1 -0
  262. package/dist/tokens/build-email-assets.js +186 -0
  263. package/dist/tokens/build-email-assets.js.map +1 -0
  264. package/dist/tokens/build-email-tokens.d.ts +17 -0
  265. package/dist/tokens/build-email-tokens.d.ts.map +1 -0
  266. package/dist/tokens/build-email-tokens.js +229 -0
  267. package/dist/tokens/build-email-tokens.js.map +1 -0
  268. package/package.json +41 -3
@@ -0,0 +1,375 @@
1
+ /**
2
+ * Visual-brief resolver (OPEN-QUESTIONS.md M3 + D6/D8/D21; BRIEF-HANDOVER.md §3).
3
+ *
4
+ * Takes the 4-field per-slot visual brief (slot / intent / source / assetRef) and resolves each
5
+ * slot to exactly one of three outcomes, per the priority order already documented in
6
+ * skills/email-assets/SKILL.md Process step 2 — this module executes those already-decided rules
7
+ * in code instead of leaving them as prose a human has to walk by hand:
8
+ *
9
+ * - 'resolved' — a real asset: AgentVisual (tier 1, mandatory for a standalone agent
10
+ * portrait), a shared logo or local campaign asset (tier 3), a hosted match
11
+ * from the Cloudinary stock library (tier 5 — D5.6, board item Clay
12
+ * Lifecycle D5; product-ui/abstract only, see that branch below for why not
13
+ * logo), or a match against the ~600-icon Clay registry (tier 6 — D6, board
14
+ * item Clay Lifecycle D6; `icon` source only).
15
+ * - 'placeholder' — a LEGITIMATE gap: a composite agent+UI scene (tier 2 — no dedicated
16
+ * library yet, see knowledge/hero-pipeline.md) or anything else tier 3/5/6
17
+ * didn't find (tier 4).
18
+ * - 'gap' — NOT legitimate: a standalone agent portrait naming an agent the repo's
19
+ * AgentVisual library doesn't have, or a must-use:<file> the brief names
20
+ * that doesn't actually exist anywhere. email-assets/SKILL.md is explicit
21
+ * that a placeholder is never an acceptable substitute for either of these —
22
+ * they need a human decision, not a silent swap.
23
+ *
24
+ * Every slot gets exactly one of the three statuses above — never nothing. That's the literal
25
+ * "no silent gaps" contract from OPEN-QUESTIONS.md M3's "Done when".
26
+ *
27
+ * Usage: tsx src/build/visual-resolver.ts --brief=<path-to-visual-brief.json>
28
+ */
29
+ import { existsSync, readdirSync, readFileSync } from 'node:fs';
30
+ import { basename, dirname, join, resolve } from 'node:path';
31
+ import { fileURLToPath, pathToFileURL } from 'node:url';
32
+ import { assetsDir } from './email-tree';
33
+ import { findIconByName, findIconEntry } from './icon-registry-map';
34
+ import { findPersonaEntry } from './persona-character-map';
35
+ import { findStockLibraryEntry } from './stock-library-map';
36
+ const __dirname = dirname(fileURLToPath(import.meta.url));
37
+ /** Cross-package: the repo's one real agent-portrait library lives under packages/react. */
38
+ const AGENTS_IMAGES_DIR = resolve(__dirname, '../../../../packages/react/src/visuals/agents/images');
39
+ /** Cross-package: the repo's one real Clay icon registry (~600 icons, source SVGs). */
40
+ const ICONS_SVG_DIR = resolve(__dirname, '../../../../packages/react/src/icons/svg');
41
+ const SHARED_LOOKUP_DIRS = ['logos', 'icons', 'integrations', 'placeholders'];
42
+ // A standalone portrait slot names ONLY the agent — the moment the intent also describes UI
43
+ // elements around it, it's a composite scene (tier 2), which AgentVisual does not cover.
44
+ const COMPOSITE_SIGNAL_WORDS = [
45
+ 'board',
46
+ 'table',
47
+ 'dashboard',
48
+ 'screen',
49
+ 'chip',
50
+ 'notification',
51
+ 'panel',
52
+ 'ui',
53
+ 'interface',
54
+ 'mockup',
55
+ 'widget',
56
+ 'app',
57
+ 'automation',
58
+ 'workflow',
59
+ 'column',
60
+ 'item',
61
+ 'pulse',
62
+ ];
63
+ /**
64
+ * Word-boundary match, not substring — a naive .includes('board') false-positives on
65
+ * "onboarding", and .includes('din') false-positives on "onboarding" too (the "din" in
66
+ * "onboar-DIN-g"). Every fuzzy text match in this module goes through this.
67
+ */
68
+ function containsWord(haystackLower, word) {
69
+ const escaped = word.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
70
+ return new RegExp(`\\b${escaped}\\b`).test(haystackLower);
71
+ }
72
+ function isCompositeIntent(intent) {
73
+ const lower = intent.toLowerCase();
74
+ return COMPOSITE_SIGNAL_WORDS.some((word) => containsWord(lower, word));
75
+ }
76
+ /**
77
+ * A slot's rough layout shape — derived automatically from the slot spec, never hand-authored in
78
+ * a brief. `slot` is formatted "<section/touchpoint> → <field label>" (e.g. "product-ui-hero →
79
+ * Image", "tp1a-library → hero image"), so a keyword search over it catches both a literal
80
+ * section-component name and a free-text touchpoint field label. Passed to findStockLibraryEntry
81
+ * as a stage-2 tie-breaker only (see stock-library-map.ts) — it never gates a match on its own.
82
+ */
83
+ export function deriveSlotShape(spec) {
84
+ if (spec.source === 'icon')
85
+ return 'icon';
86
+ const lower = spec.slot.toLowerCase();
87
+ if (containsWord(lower, 'banner'))
88
+ return 'banner';
89
+ if (containsWord(lower, 'hero'))
90
+ return 'hero';
91
+ if (containsWord(lower, 'card'))
92
+ return 'card';
93
+ return 'unknown';
94
+ }
95
+ /** Mirrors packages/react/src/visuals/agents/index.ts's own slugify — same source files, same rule. */
96
+ function slugifyAgentFile(fileName) {
97
+ return fileName
98
+ .replace(/\.png$/i, '')
99
+ .trim()
100
+ .toLowerCase()
101
+ .replace(/[^a-z0-9]+/g, '-')
102
+ .replace(/^-+|-+$/g, '');
103
+ }
104
+ /** slug → filename, read straight off disk (Node-safe — the real registry is Vite-glob-only). */
105
+ function loadAgentSlugs() {
106
+ const map = new Map();
107
+ if (!existsSync(AGENTS_IMAGES_DIR))
108
+ return map;
109
+ for (const file of readdirSync(AGENTS_IMAGES_DIR)) {
110
+ if (!file.toLowerCase().endsWith('.png'))
111
+ continue;
112
+ map.set(slugifyAgentFile(file), file);
113
+ }
114
+ return map;
115
+ }
116
+ const agentSlugs = loadAgentSlugs();
117
+ function parseAgentAssetRef(assetRef) {
118
+ if (!assetRef)
119
+ return undefined;
120
+ const m = assetRef.match(/agentImageMap:\s*(.+)/i);
121
+ return (m ? m[1] : assetRef).trim();
122
+ }
123
+ /**
124
+ * assetRef (exact slug, or slugifiable name) first; else a single unambiguous character name in
125
+ * intent; else a persona/feature name (assetRef or intent) resolved via persona-character-map.ts
126
+ * — only when that persona's real character actually has an AgentVisual illustration.
127
+ */
128
+ function resolveAgentSlug(assetRef, intent) {
129
+ const ref = parseAgentAssetRef(assetRef);
130
+ if (ref) {
131
+ const direct = agentSlugs.get(ref.toLowerCase());
132
+ if (direct)
133
+ return { slug: ref.toLowerCase(), file: direct, confidence: 'assetRef' };
134
+ const slugged = slugifyAgentFile(`${ref}.png`);
135
+ const bySlug = agentSlugs.get(slugged);
136
+ if (bySlug)
137
+ return { slug: slugged, file: bySlug, confidence: 'assetRef' };
138
+ }
139
+ const lowerIntent = intent.toLowerCase();
140
+ const candidates = [];
141
+ for (const [slug, file] of agentSlugs) {
142
+ const displayName = file.replace(/\.png$/i, '').toLowerCase();
143
+ if (containsWord(lowerIntent, displayName))
144
+ candidates.push({ slug, file, confidence: 'fuzzy' });
145
+ }
146
+ if (candidates.length === 1)
147
+ return candidates[0];
148
+ const persona = (ref ? findPersonaEntry(ref) : null) ?? findPersonaEntry(intent);
149
+ if (persona?.agentSlug) {
150
+ const file = agentSlugs.get(persona.agentSlug);
151
+ if (file)
152
+ return { slug: persona.agentSlug, file, confidence: 'persona-map' };
153
+ }
154
+ return null;
155
+ }
156
+ /** Fuzzy local-folder match: assetRef filename first, else a single unambiguous filename-in-intent match. */
157
+ function findLocalMatch(dir, assetRef, intent) {
158
+ if (!existsSync(dir))
159
+ return null;
160
+ const files = readdirSync(dir).filter((f) => !f.startsWith('.'));
161
+ if (assetRef) {
162
+ const wanted = basename(assetRef).toLowerCase();
163
+ const exact = files.find((f) => f.toLowerCase() === wanted);
164
+ if (exact)
165
+ return join(dir, exact);
166
+ const wantedStem = wanted.replace(/\.[a-z0-9]+$/i, '');
167
+ const byStem = files.find((f) => f.toLowerCase().startsWith(wantedStem));
168
+ if (byStem)
169
+ return join(dir, byStem);
170
+ }
171
+ const lowerIntent = intent.toLowerCase();
172
+ const scored = files
173
+ .map((f) => ({ f, stem: f.replace(/\.[a-z0-9]+$/i, '').toLowerCase().replace(/[-_]/g, ' ') }))
174
+ .filter(({ stem }) => stem.length > 2 && containsWord(lowerIntent, stem));
175
+ return scored.length === 1 ? join(dir, scored[0].f) : null;
176
+ }
177
+ /** Exact-only match for must-use:<file> — an explicit filename should never resolve fuzzily. */
178
+ function findExactFile(dir, filename) {
179
+ if (!existsSync(dir))
180
+ return null;
181
+ const wanted = basename(filename).toLowerCase();
182
+ const files = readdirSync(dir);
183
+ const exact = files.find((f) => f.toLowerCase() === wanted);
184
+ if (exact)
185
+ return join(dir, exact);
186
+ const wantedStem = wanted.replace(/\.[a-z0-9]+$/i, '');
187
+ const byStem = files.find((f) => f.toLowerCase().replace(/\.[a-z0-9]+$/i, '') === wantedStem);
188
+ return byStem ? join(dir, byStem) : null;
189
+ }
190
+ function pickPlaceholderSvg() {
191
+ const preferred = join(assetsDir, 'placeholders', 'placeholder-560x315.svg');
192
+ if (existsSync(preferred))
193
+ return preferred;
194
+ const dir = join(assetsDir, 'placeholders');
195
+ const files = existsSync(dir) ? readdirSync(dir) : [];
196
+ return files.length ? join(dir, files[0]) : '';
197
+ }
198
+ /** Resolve one visual-brief slot. `campaign` scopes tier-3 local-folder lookups. */
199
+ export function resolveVisualSlot(spec, campaign) {
200
+ const { slot, intent, source, assetRef } = spec;
201
+ if (source === 'agent-portrait') {
202
+ if (isCompositeIntent(intent)) {
203
+ return {
204
+ slot,
205
+ status: 'placeholder',
206
+ tier: 2,
207
+ placeholderSvg: pickPlaceholderSvg(),
208
+ placeholderComment: `[PLACEHOLDER: composite agent+UI scene — ${intent}. No dedicated library yet; see knowledge/hero-pipeline.md for the Hero pipeline fallback.]`,
209
+ detail: 'Classified as composite (intent mentions UI/product elements) — tier 1 AgentVisual only covers standalone portraits. Tier 2 (Hero pipeline) has no ready library yet, so placeholder is legitimate per email-assets/SKILL.md.',
210
+ };
211
+ }
212
+ const match = resolveAgentSlug(assetRef, intent);
213
+ if (match) {
214
+ const via = match.confidence === 'assetRef'
215
+ ? 'from assetRef'
216
+ : match.confidence === 'persona-map'
217
+ ? 'via persona-character-map.ts'
218
+ : 'fuzzy-matched from intent';
219
+ return {
220
+ slot,
221
+ status: 'resolved',
222
+ tier: 1,
223
+ assetPath: join(AGENTS_IMAGES_DIR, match.file),
224
+ detail: `Standalone agent portrait resolved to AgentVisual slug "${match.slug}" (${via} — mandatory tier, no placeholder allowed for this case).`,
225
+ };
226
+ }
227
+ const persona = (assetRef ? findPersonaEntry(assetRef) : null) ?? findPersonaEntry(intent);
228
+ if (persona && !persona.agentSlug) {
229
+ return {
230
+ slot,
231
+ status: 'gap',
232
+ tier: 1,
233
+ gapReason: 'known-persona-no-bank-character',
234
+ detail: `"${persona.persona}"'s real character is ${persona.character} (${persona.source}), but ${persona.character} has no illustration in packages/react/src/visuals/agents yet. Per campaign-brief/references/agents-catalog.md rule 4, never substitute a different bank character — this needs either a new AgentVisual illustration for ${persona.character}, or a Figma-sourced composite asset (email-assets/SKILL.md tier 2/3), not a silent swap to an unrelated character.`,
235
+ };
236
+ }
237
+ return {
238
+ slot,
239
+ status: 'gap',
240
+ tier: 1,
241
+ gapReason: 'standalone-agent-not-in-library',
242
+ detail: `Standalone agent portrait requested (intent: "${intent}", assetRef: ${assetRef ?? '(none)'}) but no matching character was found in agentImageMap, and no known persona/feature name matched persona-character-map.ts either. This is a genuine gap, not a placeholder-legitimate case — email-assets/SKILL.md is explicit that placeholder is never legitimate here. Either the brief needs a real character slug, or this should be reclassified (e.g. a feature/persona name with no character asset yet).`,
243
+ };
244
+ }
245
+ if (source === 'logo') {
246
+ const shared = findLocalMatch(join(assetsDir, 'logos'), assetRef, intent);
247
+ if (shared)
248
+ return { slot, status: 'resolved', tier: 3, assetPath: shared, detail: 'Matched a shared email logo asset.' };
249
+ const local = findLocalMatch(join(assetsDir, campaign), assetRef, intent);
250
+ if (local)
251
+ return { slot, status: 'resolved', tier: 3, assetPath: local, detail: 'Matched a campaign-local logo asset.' };
252
+ return {
253
+ slot,
254
+ status: 'placeholder',
255
+ tier: 4,
256
+ placeholderSvg: pickPlaceholderSvg(),
257
+ placeholderComment: `[PLACEHOLDER: logo — ${intent}. No repo-hosted customer/integration logo registry exists yet for email.]`,
258
+ detail: 'No shared or campaign-local logo file matched. Legitimate placeholder — no repo-hosted registry for arbitrary customer/integration logos yet (email-assets/SKILL.md tier 4).',
259
+ };
260
+ }
261
+ if (source === 'product-ui' || source === 'abstract') {
262
+ const local = findLocalMatch(join(assetsDir, campaign), assetRef, intent);
263
+ if (local)
264
+ return { slot, status: 'resolved', tier: 3, assetPath: local, detail: `Matched a campaign-local ${source} asset.` };
265
+ // Tier 5 — the Cloudinary stock library (D5.5/D5.6). Deliberately not checked for `logo`:
266
+ // every entry in stock-library-map.ts is a marketing hero/card illustration (dashboards,
267
+ // agent-feature cards, exchanges), not an actual brand/product logo — wiring it into the
268
+ // logo branch would only add a chance of a wrong match for zero real coverage gain.
269
+ const stockMatch = findStockLibraryEntry({ intent, shape: deriveSlotShape(spec), campaign });
270
+ if (stockMatch) {
271
+ const { entry, disambiguatedBy } = stockMatch;
272
+ const disambiguationNote = disambiguatedBy.length ? ` (disambiguated by: ${disambiguatedBy.join(', ')})` : '';
273
+ return {
274
+ slot,
275
+ status: 'resolved',
276
+ tier: 5,
277
+ assetPath: entry.cloudinaryUrl,
278
+ detail: `Matched stock-library entry "${entry.slug}" (tags: ${entry.tags.join(', ')})${disambiguationNote} — already hosted, no upload step needed.`,
279
+ };
280
+ }
281
+ return {
282
+ slot,
283
+ status: 'placeholder',
284
+ tier: 4,
285
+ placeholderSvg: pickPlaceholderSvg(),
286
+ placeholderComment: `[PLACEHOLDER: ${source} — ${intent}. Generation prompt: "${intent}".]`,
287
+ detail: `No campaign-local asset and no unambiguous stock-library match. Legitimate placeholder — ${source === 'product-ui' ? 'no repo-hosted product-screenshot library exists yet' : 'abstract art has no registry'} beyond the stock library (email-assets/SKILL.md tier 4).`,
288
+ };
289
+ }
290
+ if (source === 'icon') {
291
+ const exact = assetRef ? findIconByName(assetRef) : null;
292
+ const fuzzy = exact ? null : findIconEntry(intent);
293
+ const match = exact ?? fuzzy?.entry ?? null;
294
+ const disambiguatedBy = fuzzy?.disambiguatedBy ?? [];
295
+ if (match) {
296
+ const svgPath = join(ICONS_SVG_DIR, `${match.name}.svg`);
297
+ if (existsSync(svgPath)) {
298
+ const disambiguationNote = disambiguatedBy.length ? ` (disambiguated by: ${disambiguatedBy.join(', ')})` : '';
299
+ return {
300
+ slot,
301
+ status: 'resolved',
302
+ tier: 6,
303
+ assetPath: svgPath,
304
+ detail: exact
305
+ ? `Matched Clay icon "${match.name}" via exact assetRef, from the ~600-icon registry (packages/react/src/icons).`
306
+ : `Matched Clay icon "${match.name}" (tags: ${match.tags.join(', ')})${disambiguationNote} from the ~600-icon registry (packages/react/src/icons).`,
307
+ };
308
+ }
309
+ }
310
+ return {
311
+ slot,
312
+ status: 'placeholder',
313
+ tier: 4,
314
+ placeholderSvg: pickPlaceholderSvg(),
315
+ placeholderComment: `[PLACEHOLDER: icon — ${intent}. No matching icon in the Clay registry.]`,
316
+ detail: 'No icon in the ~600-icon Clay registry (packages/react/src/icons) matched by exact name or an unambiguous tag. Legitimate placeholder — not every requested icon concept exists in the registry (email-assets/SKILL.md tier 4).',
317
+ };
318
+ }
319
+ if (source.startsWith('must-use:')) {
320
+ const wanted = source.slice('must-use:'.length).trim() || assetRef || '';
321
+ const searchDirs = [join(assetsDir, campaign), ...SHARED_LOOKUP_DIRS.map((d) => join(assetsDir, d)), assetsDir];
322
+ for (const dir of searchDirs) {
323
+ const found = wanted && findExactFile(dir, wanted);
324
+ if (found)
325
+ return { slot, status: 'resolved', tier: 3, assetPath: found, detail: `must-use file "${wanted}" found.` };
326
+ }
327
+ return {
328
+ slot,
329
+ status: 'gap',
330
+ tier: 3,
331
+ gapReason: 'must-use-file-not-found',
332
+ detail: `Brief explicitly named "${wanted}" via must-use, but no matching file exists under src/assets/ (campaign-local, logos, icons, integrations, placeholders, or the flat assets root). This is a genuine gap, not placeholder-legitimate — a named must-use asset that doesn't exist needs a human fix (typo, or the file hasn't been supplied yet), not a silent swap to a generic placeholder.`,
333
+ };
334
+ }
335
+ return {
336
+ slot,
337
+ status: 'gap',
338
+ tier: 4,
339
+ gapReason: 'unrecognized-source',
340
+ detail: `Unrecognized source "${source}" — expected one of agent-portrait | product-ui | logo | abstract | must-use:<file> (BRIEF-HANDOVER.md §3).`,
341
+ };
342
+ }
343
+ const STATUS_ICON = { resolved: '✓', placeholder: '◻', gap: '✗' };
344
+ function formatResolution(r) {
345
+ const label = r.status === 'resolved' ? r.assetPath : r.status === 'placeholder' ? r.placeholderComment : `GAP (${r.gapReason})`;
346
+ return ` ${STATUS_ICON[r.status]} ${r.slot}\n ${label}\n ${r.detail}`;
347
+ }
348
+ async function main() {
349
+ const briefArg = process.argv.find((a) => a.startsWith('--brief='));
350
+ if (!briefArg) {
351
+ console.error('Usage: tsx src/build/visual-resolver.ts --brief=<path-to-visual-brief.json>');
352
+ process.exitCode = 1;
353
+ return;
354
+ }
355
+ const briefPath = resolve(briefArg.slice('--brief='.length));
356
+ const brief = JSON.parse(readFileSync(briefPath, 'utf-8'));
357
+ const results = brief.slots.map((spec) => resolveVisualSlot(spec, brief.campaign));
358
+ console.log(`\nVisual brief resolution — ${brief.campaign} (${results.length} slots)\n`);
359
+ for (const r of results)
360
+ console.log(formatResolution(r) + '\n');
361
+ const resolved = results.filter((r) => r.status === 'resolved').length;
362
+ const placeholders = results.filter((r) => r.status === 'placeholder').length;
363
+ const gaps = results.filter((r) => r.status === 'gap').length;
364
+ console.log(`${resolved} resolved, ${placeholders} placeholder, ${gaps} gap`);
365
+ if (gaps > 0)
366
+ process.exitCode = 1;
367
+ }
368
+ const isMain = process.argv[1] !== undefined && import.meta.url === pathToFileURL(process.argv[1]).href;
369
+ if (isMain) {
370
+ main().catch((err) => {
371
+ console.error(err.message);
372
+ process.exit(1);
373
+ });
374
+ }
375
+ //# sourceMappingURL=visual-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"visual-resolver.js","sourceRoot":"","sources":["../../src/build/visual-resolver.ts"],"names":[],"mappings":"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"}