@nodaro/shared 1.4.2

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 (665) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +32 -0
  3. package/dist/index.cjs +12506 -0
  4. package/dist/index.cjs.map +1 -0
  5. package/dist/index.d.cts +12269 -0
  6. package/dist/index.d.ts +12269 -0
  7. package/dist/index.js +11831 -0
  8. package/dist/index.js.map +1 -0
  9. package/package.json +54 -0
  10. package/src/__tests__/__snapshots__/prompt-builder-segments.test.ts.snap +65 -0
  11. package/src/__tests__/ai-avatar-pricing.test.ts +321 -0
  12. package/src/__tests__/apply-video-negative-prompt.test.ts +76 -0
  13. package/src/__tests__/attach-columns.test.ts +28 -0
  14. package/src/__tests__/audio-crossfade-curves.test.ts +33 -0
  15. package/src/__tests__/build-model-menu.test.ts +58 -0
  16. package/src/__tests__/character-aspect-defaults.test.ts +142 -0
  17. package/src/__tests__/character-mention-slug.test.ts +199 -0
  18. package/src/__tests__/character-reference-photo-kinds.test.ts +32 -0
  19. package/src/__tests__/character-usage-mode.test.ts +147 -0
  20. package/src/__tests__/character-variant-assets.test.ts +142 -0
  21. package/src/__tests__/character-voice.test.ts +130 -0
  22. package/src/__tests__/cinematic-avatar-pricing.test.ts +119 -0
  23. package/src/__tests__/combine-transitions.test.ts +137 -0
  24. package/src/__tests__/component-types.test.ts +87 -0
  25. package/src/__tests__/condition-variables.test.ts +98 -0
  26. package/src/__tests__/credit-identifiers.test.ts +811 -0
  27. package/src/__tests__/default-video-provider.test.ts +63 -0
  28. package/src/__tests__/entity-image-handle.test.ts +43 -0
  29. package/src/__tests__/entity-variants.test.ts +33 -0
  30. package/src/__tests__/fal-lip-sync-sets.test.ts +31 -0
  31. package/src/__tests__/featured-entities.test.ts +33 -0
  32. package/src/__tests__/film-pricing.test.ts +64 -0
  33. package/src/__tests__/filter-condition.test.ts +285 -0
  34. package/src/__tests__/freecut-protocol.test.ts +35 -0
  35. package/src/__tests__/generate-text-items.test.ts +19 -0
  36. package/src/__tests__/generated-results.test.ts +50 -0
  37. package/src/__tests__/graph-utils.test.ts +618 -0
  38. package/src/__tests__/group-aggregation.test.ts +83 -0
  39. package/src/__tests__/i18n-locale-completeness.test.ts +156 -0
  40. package/src/__tests__/image-critic-node.test.ts +86 -0
  41. package/src/__tests__/image-mask-mode.test.ts +16 -0
  42. package/src/__tests__/image-ref-limit.test.ts +78 -0
  43. package/src/__tests__/inpaint-region.test.ts +24 -0
  44. package/src/__tests__/input-field-map-parity.test.ts +30 -0
  45. package/src/__tests__/json-evaluator.test.ts +289 -0
  46. package/src/__tests__/json-path.test.ts +64 -0
  47. package/src/__tests__/lip-sync-pricing.test.ts +142 -0
  48. package/src/__tests__/list-merge.test.ts +96 -0
  49. package/src/__tests__/list-sort.test.ts +134 -0
  50. package/src/__tests__/llm-models.test.ts +445 -0
  51. package/src/__tests__/location-mention-slug.test.ts +246 -0
  52. package/src/__tests__/locations-coverage-critic-schema.test.ts +92 -0
  53. package/src/__tests__/loop-delimiter.test.ts +39 -0
  54. package/src/__tests__/lottie-slots.test.ts +245 -0
  55. package/src/__tests__/model-catalog-flux2-resolutions.test.ts +21 -0
  56. package/src/__tests__/model-constants-location.test.ts +20 -0
  57. package/src/__tests__/model-constants.test.ts +122 -0
  58. package/src/__tests__/model-tree.test.ts +86 -0
  59. package/src/__tests__/no-internal-imports.test.ts +25 -0
  60. package/src/__tests__/node-default-mappings.test.ts +175 -0
  61. package/src/__tests__/node-mappable-fields.test.ts +7 -0
  62. package/src/__tests__/node-preset-export.test.ts +46 -0
  63. package/src/__tests__/node-preset-extract.test.ts +166 -0
  64. package/src/__tests__/node-refs-canonical.test.ts +54 -0
  65. package/src/__tests__/node-refs-combine.test.ts +54 -0
  66. package/src/__tests__/node-refs.test.ts +187 -0
  67. package/src/__tests__/node-runtime-keys.test.ts +99 -0
  68. package/src/__tests__/object-aspect-defaults.test.ts +59 -0
  69. package/src/__tests__/parameter-node-value.test.ts +137 -0
  70. package/src/__tests__/pinterest-url.test.ts +35 -0
  71. package/src/__tests__/pipeline-chat.test.ts +110 -0
  72. package/src/__tests__/pipeline-validation.test.ts +98 -0
  73. package/src/__tests__/presentation-utils.test.ts +1137 -0
  74. package/src/__tests__/producer-types.test.ts +47 -0
  75. package/src/__tests__/prompt-length-limits.test.ts +156 -0
  76. package/src/__tests__/provider-directive-defaults.test.ts +46 -0
  77. package/src/__tests__/reduce-strategy-registry.test.ts +43 -0
  78. package/src/__tests__/reference-board-templates.test.ts +33 -0
  79. package/src/__tests__/reference-roles.test.ts +36 -0
  80. package/src/__tests__/resolve-field-mappings.test.ts +110 -0
  81. package/src/__tests__/resolve-pipeline-model.test.ts +76 -0
  82. package/src/__tests__/scene-node-types.test.ts +80 -0
  83. package/src/__tests__/scraper-actors.test.ts +67 -0
  84. package/src/__tests__/seedance-2-catalog.test.ts +18 -0
  85. package/src/__tests__/seedance-2-credit-id.test.ts +23 -0
  86. package/src/__tests__/seedance-aspects.test.ts +52 -0
  87. package/src/__tests__/selector.test.ts +1151 -0
  88. package/src/__tests__/settled-with-limit.test.ts +214 -0
  89. package/src/__tests__/social-media-specs.test.ts +129 -0
  90. package/src/__tests__/sub-workflow-validation.test.ts +88 -0
  91. package/src/__tests__/switchx-pricing.test.ts +28 -0
  92. package/src/__tests__/to-connected-references.test.ts +153 -0
  93. package/src/__tests__/utilities.test.ts +541 -0
  94. package/src/__tests__/video-analysis-pricing.test.ts +58 -0
  95. package/src/__tests__/video-analysis.test.ts +63 -0
  96. package/src/__tests__/video-audio-capability.test.ts +204 -0
  97. package/src/__tests__/video-gen-providers.test.ts +28 -0
  98. package/src/__tests__/video-mode-aliases.test.ts +150 -0
  99. package/src/__tests__/video-ref-limits.test.ts +72 -0
  100. package/src/__tests__/video-utils.test.ts +303 -0
  101. package/src/__tests__/voice-changer-models.test.ts +33 -0
  102. package/src/__tests__/workflow-export-strip.test.ts +46 -0
  103. package/src/ai-avatar-pricing.ts +213 -0
  104. package/src/ancestor-refs.ts +48 -0
  105. package/src/animals.ts +231 -0
  106. package/src/audio-crossfade-curves.ts +73 -0
  107. package/src/audio-fx-presets.ts +64 -0
  108. package/src/avatar-payload-validators.ts +214 -0
  109. package/src/caption-styles.ts +31 -0
  110. package/src/character-aspect-defaults.ts +102 -0
  111. package/src/character-facets.ts +37 -0
  112. package/src/character-mention-slug.ts +166 -0
  113. package/src/character-usage-mode.ts +109 -0
  114. package/src/character-variant-assets.ts +121 -0
  115. package/src/character-voice.ts +151 -0
  116. package/src/cinematic-avatar-pricing.ts +111 -0
  117. package/src/clone-utils.ts +46 -0
  118. package/src/combine-transitions.ts +482 -0
  119. package/src/community.ts +112 -0
  120. package/src/component-types.ts +127 -0
  121. package/src/condition-variables.ts +65 -0
  122. package/src/credit-estimators/index.ts +15 -0
  123. package/src/credit-estimators/video-utils.ts +165 -0
  124. package/src/credit-identifiers.ts +304 -0
  125. package/src/entity-approval-types.ts +31 -0
  126. package/src/entity-aspect-defaults.ts +82 -0
  127. package/src/entity-asset-types.ts +296 -0
  128. package/src/entity-image-handle.ts +36 -0
  129. package/src/extra-refs.ts +139 -0
  130. package/src/featured-entities.ts +136 -0
  131. package/src/film-pricing.ts +117 -0
  132. package/src/filter-condition.ts +250 -0
  133. package/src/flux2-pricing.ts +18 -0
  134. package/src/freecut-protocol.ts +52 -0
  135. package/src/furniture.ts +167 -0
  136. package/src/generate-text-items.ts +15 -0
  137. package/src/generated-results.ts +63 -0
  138. package/src/group-aggregation.ts +75 -0
  139. package/src/hint-graph-types.ts +18 -0
  140. package/src/i18n/action-fx.ar.ts +89 -0
  141. package/src/i18n/action-fx.de.ts +89 -0
  142. package/src/i18n/action-fx.es.ts +89 -0
  143. package/src/i18n/action-fx.fr.ts +89 -0
  144. package/src/i18n/action-fx.he.ts +89 -0
  145. package/src/i18n/action-fx.hi.ts +89 -0
  146. package/src/i18n/action-fx.ja.ts +89 -0
  147. package/src/i18n/action-fx.ko.ts +89 -0
  148. package/src/i18n/action-fx.pt-BR.ts +89 -0
  149. package/src/i18n/action-fx.ru.ts +89 -0
  150. package/src/i18n/action-fx.zh-CN.ts +89 -0
  151. package/src/i18n/aesthetic.ar.ts +170 -0
  152. package/src/i18n/aesthetic.de.ts +48 -0
  153. package/src/i18n/aesthetic.es.ts +169 -0
  154. package/src/i18n/aesthetic.fr.ts +52 -0
  155. package/src/i18n/aesthetic.he.ts +169 -0
  156. package/src/i18n/aesthetic.hi.ts +55 -0
  157. package/src/i18n/aesthetic.ja.ts +165 -0
  158. package/src/i18n/aesthetic.ko.ts +169 -0
  159. package/src/i18n/aesthetic.pt-BR.ts +148 -0
  160. package/src/i18n/aesthetic.ru.ts +155 -0
  161. package/src/i18n/aesthetic.zh-CN.ts +172 -0
  162. package/src/i18n/animals.ar.ts +145 -0
  163. package/src/i18n/animals.de.ts +144 -0
  164. package/src/i18n/animals.es.ts +158 -0
  165. package/src/i18n/animals.fr.ts +144 -0
  166. package/src/i18n/animals.he.ts +155 -0
  167. package/src/i18n/animals.hi.ts +157 -0
  168. package/src/i18n/animals.ja.ts +159 -0
  169. package/src/i18n/animals.ko.ts +159 -0
  170. package/src/i18n/animals.pt-BR.ts +157 -0
  171. package/src/i18n/animals.ru.ts +155 -0
  172. package/src/i18n/animals.zh-CN.ts +155 -0
  173. package/src/i18n/atmosphere.ar.ts +49 -0
  174. package/src/i18n/atmosphere.de.ts +47 -0
  175. package/src/i18n/atmosphere.es.ts +50 -0
  176. package/src/i18n/atmosphere.fr.ts +47 -0
  177. package/src/i18n/atmosphere.he.ts +47 -0
  178. package/src/i18n/atmosphere.hi.ts +49 -0
  179. package/src/i18n/atmosphere.ja.ts +49 -0
  180. package/src/i18n/atmosphere.ko.ts +49 -0
  181. package/src/i18n/atmosphere.pt-BR.ts +49 -0
  182. package/src/i18n/atmosphere.ru.ts +47 -0
  183. package/src/i18n/atmosphere.zh-CN.ts +152 -0
  184. package/src/i18n/backdrop.ar.ts +53 -0
  185. package/src/i18n/backdrop.de.ts +46 -0
  186. package/src/i18n/backdrop.es.ts +54 -0
  187. package/src/i18n/backdrop.fr.ts +52 -0
  188. package/src/i18n/backdrop.he.ts +51 -0
  189. package/src/i18n/backdrop.hi.ts +59 -0
  190. package/src/i18n/backdrop.ja.ts +61 -0
  191. package/src/i18n/backdrop.ko.ts +59 -0
  192. package/src/i18n/backdrop.pt-BR.ts +59 -0
  193. package/src/i18n/backdrop.ru.ts +57 -0
  194. package/src/i18n/backdrop.zh-CN.ts +57 -0
  195. package/src/i18n/camera-format.ar.ts +40 -0
  196. package/src/i18n/camera-format.de.ts +37 -0
  197. package/src/i18n/camera-format.es.ts +41 -0
  198. package/src/i18n/camera-format.fr.ts +37 -0
  199. package/src/i18n/camera-format.he.ts +37 -0
  200. package/src/i18n/camera-format.hi.ts +42 -0
  201. package/src/i18n/camera-format.ja.ts +37 -0
  202. package/src/i18n/camera-format.ko.ts +37 -0
  203. package/src/i18n/camera-format.pt-BR.ts +46 -0
  204. package/src/i18n/camera-format.ru.ts +42 -0
  205. package/src/i18n/camera-format.zh-CN.ts +42 -0
  206. package/src/i18n/camera-motions.ar.ts +86 -0
  207. package/src/i18n/camera-motions.de.ts +74 -0
  208. package/src/i18n/camera-motions.es.ts +86 -0
  209. package/src/i18n/camera-motions.fr.ts +86 -0
  210. package/src/i18n/camera-motions.he.ts +86 -0
  211. package/src/i18n/camera-motions.hi.ts +99 -0
  212. package/src/i18n/camera-motions.ja.ts +99 -0
  213. package/src/i18n/camera-motions.ko.ts +99 -0
  214. package/src/i18n/camera-motions.pt-BR.ts +99 -0
  215. package/src/i18n/camera-motions.ru.ts +99 -0
  216. package/src/i18n/camera-motions.zh-CN.ts +99 -0
  217. package/src/i18n/character-fx.ar.ts +72 -0
  218. package/src/i18n/character-fx.de.ts +72 -0
  219. package/src/i18n/character-fx.es.ts +72 -0
  220. package/src/i18n/character-fx.fr.ts +72 -0
  221. package/src/i18n/character-fx.he.ts +72 -0
  222. package/src/i18n/character-fx.hi.ts +72 -0
  223. package/src/i18n/character-fx.ja.ts +72 -0
  224. package/src/i18n/character-fx.ko.ts +72 -0
  225. package/src/i18n/character-fx.pt-BR.ts +72 -0
  226. package/src/i18n/character-fx.ru.ts +72 -0
  227. package/src/i18n/character-fx.zh-CN.ts +72 -0
  228. package/src/i18n/color-look.ar.ts +50 -0
  229. package/src/i18n/color-look.de.ts +47 -0
  230. package/src/i18n/color-look.es.ts +50 -0
  231. package/src/i18n/color-look.fr.ts +50 -0
  232. package/src/i18n/color-look.he.ts +49 -0
  233. package/src/i18n/color-look.hi.ts +52 -0
  234. package/src/i18n/color-look.ja.ts +54 -0
  235. package/src/i18n/color-look.ko.ts +54 -0
  236. package/src/i18n/color-look.pt-BR.ts +54 -0
  237. package/src/i18n/color-look.ru.ts +52 -0
  238. package/src/i18n/color-look.zh-CN.ts +53 -0
  239. package/src/i18n/composition-effects.ar.ts +26 -0
  240. package/src/i18n/composition-effects.de.ts +25 -0
  241. package/src/i18n/composition-effects.es.ts +27 -0
  242. package/src/i18n/composition-effects.fr.ts +25 -0
  243. package/src/i18n/composition-effects.he.ts +25 -0
  244. package/src/i18n/composition-effects.hi.ts +27 -0
  245. package/src/i18n/composition-effects.ja.ts +27 -0
  246. package/src/i18n/composition-effects.ko.ts +27 -0
  247. package/src/i18n/composition-effects.pt-BR.ts +25 -0
  248. package/src/i18n/composition-effects.ru.ts +82 -0
  249. package/src/i18n/composition-effects.zh-CN.ts +25 -0
  250. package/src/i18n/era.ar.ts +37 -0
  251. package/src/i18n/era.de.ts +34 -0
  252. package/src/i18n/era.es.ts +37 -0
  253. package/src/i18n/era.fr.ts +37 -0
  254. package/src/i18n/era.he.ts +36 -0
  255. package/src/i18n/era.hi.ts +39 -0
  256. package/src/i18n/era.ja.ts +41 -0
  257. package/src/i18n/era.ko.ts +39 -0
  258. package/src/i18n/era.pt-BR.ts +41 -0
  259. package/src/i18n/era.ru.ts +121 -0
  260. package/src/i18n/era.zh-CN.ts +39 -0
  261. package/src/i18n/exposure-settings.ar.ts +28 -0
  262. package/src/i18n/exposure-settings.de.ts +26 -0
  263. package/src/i18n/exposure-settings.es.ts +28 -0
  264. package/src/i18n/exposure-settings.fr.ts +29 -0
  265. package/src/i18n/exposure-settings.he.ts +28 -0
  266. package/src/i18n/exposure-settings.hi.ts +31 -0
  267. package/src/i18n/exposure-settings.ja.ts +31 -0
  268. package/src/i18n/exposure-settings.ko.ts +31 -0
  269. package/src/i18n/exposure-settings.pt-BR.ts +31 -0
  270. package/src/i18n/exposure-settings.ru.ts +31 -0
  271. package/src/i18n/exposure-settings.zh-CN.ts +31 -0
  272. package/src/i18n/framing.ar.ts +78 -0
  273. package/src/i18n/framing.de.ts +73 -0
  274. package/src/i18n/framing.es.ts +78 -0
  275. package/src/i18n/framing.fr.ts +78 -0
  276. package/src/i18n/framing.he.ts +77 -0
  277. package/src/i18n/framing.hi.ts +82 -0
  278. package/src/i18n/framing.ja.ts +84 -0
  279. package/src/i18n/framing.ko.ts +82 -0
  280. package/src/i18n/framing.pt-BR.ts +84 -0
  281. package/src/i18n/framing.ru.ts +82 -0
  282. package/src/i18n/framing.zh-CN.ts +82 -0
  283. package/src/i18n/furniture.ar.ts +92 -0
  284. package/src/i18n/furniture.de.ts +93 -0
  285. package/src/i18n/furniture.es.ts +101 -0
  286. package/src/i18n/furniture.fr.ts +93 -0
  287. package/src/i18n/furniture.he.ts +101 -0
  288. package/src/i18n/furniture.hi.ts +101 -0
  289. package/src/i18n/furniture.ja.ts +101 -0
  290. package/src/i18n/furniture.ko.ts +101 -0
  291. package/src/i18n/furniture.pt-BR.ts +101 -0
  292. package/src/i18n/furniture.ru.ts +101 -0
  293. package/src/i18n/furniture.zh-CN.ts +101 -0
  294. package/src/i18n/held-prop.ar.ts +74 -0
  295. package/src/i18n/held-prop.de.ts +65 -0
  296. package/src/i18n/held-prop.es.ts +83 -0
  297. package/src/i18n/held-prop.fr.ts +74 -0
  298. package/src/i18n/held-prop.he.ts +73 -0
  299. package/src/i18n/held-prop.hi.ts +82 -0
  300. package/src/i18n/held-prop.ja.ts +84 -0
  301. package/src/i18n/held-prop.ko.ts +84 -0
  302. package/src/i18n/held-prop.pt-BR.ts +84 -0
  303. package/src/i18n/held-prop.ru.ts +82 -0
  304. package/src/i18n/held-prop.zh-CN.ts +82 -0
  305. package/src/i18n/index.ts +208 -0
  306. package/src/i18n/instrumentation.ar.ts +195 -0
  307. package/src/i18n/instrumentation.de.ts +195 -0
  308. package/src/i18n/instrumentation.es.ts +195 -0
  309. package/src/i18n/instrumentation.fr.ts +195 -0
  310. package/src/i18n/instrumentation.he.ts +195 -0
  311. package/src/i18n/instrumentation.hi.ts +195 -0
  312. package/src/i18n/instrumentation.ja.ts +195 -0
  313. package/src/i18n/instrumentation.ko.ts +195 -0
  314. package/src/i18n/instrumentation.pt-BR.ts +195 -0
  315. package/src/i18n/instrumentation.ru.ts +195 -0
  316. package/src/i18n/instrumentation.zh-CN.ts +195 -0
  317. package/src/i18n/lens.ar.ts +24 -0
  318. package/src/i18n/lens.de.ts +24 -0
  319. package/src/i18n/lens.es.ts +24 -0
  320. package/src/i18n/lens.fr.ts +24 -0
  321. package/src/i18n/lens.he.ts +24 -0
  322. package/src/i18n/lens.hi.ts +24 -0
  323. package/src/i18n/lens.ja.ts +24 -0
  324. package/src/i18n/lens.ko.ts +24 -0
  325. package/src/i18n/lens.pt-BR.ts +24 -0
  326. package/src/i18n/lens.ru.ts +25 -0
  327. package/src/i18n/lens.zh-CN.ts +24 -0
  328. package/src/i18n/lighting.ar.ts +86 -0
  329. package/src/i18n/lighting.de.ts +84 -0
  330. package/src/i18n/lighting.es.ts +89 -0
  331. package/src/i18n/lighting.fr.ts +84 -0
  332. package/src/i18n/lighting.he.ts +88 -0
  333. package/src/i18n/lighting.hi.ts +90 -0
  334. package/src/i18n/lighting.ja.ts +90 -0
  335. package/src/i18n/lighting.ko.ts +90 -0
  336. package/src/i18n/lighting.pt-BR.ts +90 -0
  337. package/src/i18n/lighting.ru.ts +88 -0
  338. package/src/i18n/lighting.zh-CN.ts +92 -0
  339. package/src/i18n/loop-subject.ar.ts +39 -0
  340. package/src/i18n/loop-subject.de.ts +39 -0
  341. package/src/i18n/loop-subject.es.ts +39 -0
  342. package/src/i18n/loop-subject.fr.ts +39 -0
  343. package/src/i18n/loop-subject.he.ts +39 -0
  344. package/src/i18n/loop-subject.hi.ts +39 -0
  345. package/src/i18n/loop-subject.ja.ts +39 -0
  346. package/src/i18n/loop-subject.ko.ts +39 -0
  347. package/src/i18n/loop-subject.pt-BR.ts +39 -0
  348. package/src/i18n/loop-subject.ru.ts +39 -0
  349. package/src/i18n/loop-subject.zh-CN.ts +39 -0
  350. package/src/i18n/materials.ar.ts +80 -0
  351. package/src/i18n/materials.de.ts +80 -0
  352. package/src/i18n/materials.es.ts +87 -0
  353. package/src/i18n/materials.fr.ts +80 -0
  354. package/src/i18n/materials.he.ts +86 -0
  355. package/src/i18n/materials.hi.ts +86 -0
  356. package/src/i18n/materials.ja.ts +88 -0
  357. package/src/i18n/materials.ko.ts +88 -0
  358. package/src/i18n/materials.pt-BR.ts +88 -0
  359. package/src/i18n/materials.ru.ts +86 -0
  360. package/src/i18n/materials.zh-CN.ts +86 -0
  361. package/src/i18n/mood.ar.ts +61 -0
  362. package/src/i18n/mood.de.ts +61 -0
  363. package/src/i18n/mood.es.ts +66 -0
  364. package/src/i18n/mood.fr.ts +61 -0
  365. package/src/i18n/mood.he.ts +64 -0
  366. package/src/i18n/mood.hi.ts +66 -0
  367. package/src/i18n/mood.ja.ts +66 -0
  368. package/src/i18n/mood.ko.ts +66 -0
  369. package/src/i18n/mood.pt-BR.ts +64 -0
  370. package/src/i18n/mood.ru.ts +64 -0
  371. package/src/i18n/mood.zh-CN.ts +64 -0
  372. package/src/i18n/music-genre.ar.ts +302 -0
  373. package/src/i18n/music-genre.de.ts +302 -0
  374. package/src/i18n/music-genre.es.ts +302 -0
  375. package/src/i18n/music-genre.fr.ts +302 -0
  376. package/src/i18n/music-genre.he.ts +302 -0
  377. package/src/i18n/music-genre.hi.ts +302 -0
  378. package/src/i18n/music-genre.ja.ts +302 -0
  379. package/src/i18n/music-genre.ko.ts +302 -0
  380. package/src/i18n/music-genre.pt-BR.ts +302 -0
  381. package/src/i18n/music-genre.ru.ts +302 -0
  382. package/src/i18n/music-genre.zh-CN.ts +302 -0
  383. package/src/i18n/music-mood.ar.ts +75 -0
  384. package/src/i18n/music-mood.de.ts +75 -0
  385. package/src/i18n/music-mood.es.ts +75 -0
  386. package/src/i18n/music-mood.fr.ts +75 -0
  387. package/src/i18n/music-mood.he.ts +75 -0
  388. package/src/i18n/music-mood.hi.ts +75 -0
  389. package/src/i18n/music-mood.ja.ts +75 -0
  390. package/src/i18n/music-mood.ko.ts +75 -0
  391. package/src/i18n/music-mood.pt-BR.ts +75 -0
  392. package/src/i18n/music-mood.ru.ts +75 -0
  393. package/src/i18n/music-mood.zh-CN.ts +75 -0
  394. package/src/i18n/person.ar.ts +638 -0
  395. package/src/i18n/person.de.ts +629 -0
  396. package/src/i18n/person.es.ts +645 -0
  397. package/src/i18n/person.fr.ts +621 -0
  398. package/src/i18n/person.he.ts +656 -0
  399. package/src/i18n/person.hi.ts +654 -0
  400. package/src/i18n/person.ja.ts +662 -0
  401. package/src/i18n/person.ko.ts +662 -0
  402. package/src/i18n/person.pt-BR.ts +656 -0
  403. package/src/i18n/person.ru.ts +656 -0
  404. package/src/i18n/person.zh-CN.ts +656 -0
  405. package/src/i18n/photo-genre.ar.ts +58 -0
  406. package/src/i18n/photo-genre.de.ts +52 -0
  407. package/src/i18n/photo-genre.es.ts +64 -0
  408. package/src/i18n/photo-genre.fr.ts +58 -0
  409. package/src/i18n/photo-genre.he.ts +62 -0
  410. package/src/i18n/photo-genre.hi.ts +63 -0
  411. package/src/i18n/photo-genre.ja.ts +65 -0
  412. package/src/i18n/photo-genre.ko.ts +63 -0
  413. package/src/i18n/photo-genre.pt-BR.ts +65 -0
  414. package/src/i18n/photo-genre.ru.ts +63 -0
  415. package/src/i18n/photo-genre.zh-CN.ts +63 -0
  416. package/src/i18n/photographer.ar.ts +75 -0
  417. package/src/i18n/photographer.de.ts +74 -0
  418. package/src/i18n/photographer.es.ts +77 -0
  419. package/src/i18n/photographer.fr.ts +77 -0
  420. package/src/i18n/photographer.he.ts +78 -0
  421. package/src/i18n/photographer.hi.ts +80 -0
  422. package/src/i18n/photographer.ja.ts +84 -0
  423. package/src/i18n/photographer.ko.ts +84 -0
  424. package/src/i18n/photographer.pt-BR.ts +83 -0
  425. package/src/i18n/photographer.ru.ts +78 -0
  426. package/src/i18n/photographer.zh-CN.ts +78 -0
  427. package/src/i18n/pose.ar.ts +95 -0
  428. package/src/i18n/pose.de.ts +96 -0
  429. package/src/i18n/pose.es.ts +104 -0
  430. package/src/i18n/pose.fr.ts +96 -0
  431. package/src/i18n/pose.he.ts +104 -0
  432. package/src/i18n/pose.hi.ts +104 -0
  433. package/src/i18n/pose.ja.ts +104 -0
  434. package/src/i18n/pose.ko.ts +104 -0
  435. package/src/i18n/pose.pt-BR.ts +104 -0
  436. package/src/i18n/pose.ru.ts +104 -0
  437. package/src/i18n/pose.zh-CN.ts +104 -0
  438. package/src/i18n/post-process-effects.ar.ts +25 -0
  439. package/src/i18n/post-process-effects.de.ts +24 -0
  440. package/src/i18n/post-process-effects.es.ts +26 -0
  441. package/src/i18n/post-process-effects.fr.ts +24 -0
  442. package/src/i18n/post-process-effects.he.ts +24 -0
  443. package/src/i18n/post-process-effects.hi.ts +26 -0
  444. package/src/i18n/post-process-effects.ja.ts +26 -0
  445. package/src/i18n/post-process-effects.ko.ts +26 -0
  446. package/src/i18n/post-process-effects.pt-BR.ts +24 -0
  447. package/src/i18n/post-process-effects.ru.ts +24 -0
  448. package/src/i18n/post-process-effects.zh-CN.ts +24 -0
  449. package/src/i18n/render-quality.ar.ts +34 -0
  450. package/src/i18n/render-quality.de.ts +30 -0
  451. package/src/i18n/render-quality.es.ts +35 -0
  452. package/src/i18n/render-quality.fr.ts +34 -0
  453. package/src/i18n/render-quality.he.ts +33 -0
  454. package/src/i18n/render-quality.hi.ts +39 -0
  455. package/src/i18n/render-quality.ja.ts +39 -0
  456. package/src/i18n/render-quality.ko.ts +39 -0
  457. package/src/i18n/render-quality.pt-BR.ts +37 -0
  458. package/src/i18n/render-quality.ru.ts +37 -0
  459. package/src/i18n/render-quality.zh-CN.ts +37 -0
  460. package/src/i18n/seasons.ar.ts +10 -0
  461. package/src/i18n/seasons.de.ts +10 -0
  462. package/src/i18n/seasons.es.ts +10 -0
  463. package/src/i18n/seasons.fr.ts +10 -0
  464. package/src/i18n/seasons.he.ts +10 -0
  465. package/src/i18n/seasons.hi.ts +10 -0
  466. package/src/i18n/seasons.ja.ts +10 -0
  467. package/src/i18n/seasons.ko.ts +10 -0
  468. package/src/i18n/seasons.pt-BR.ts +10 -0
  469. package/src/i18n/seasons.ru.ts +10 -0
  470. package/src/i18n/seasons.zh-CN.ts +10 -0
  471. package/src/i18n/setting.ar.ts +73 -0
  472. package/src/i18n/setting.de.ts +73 -0
  473. package/src/i18n/setting.es.ts +77 -0
  474. package/src/i18n/setting.fr.ts +73 -0
  475. package/src/i18n/setting.he.ts +76 -0
  476. package/src/i18n/setting.hi.ts +76 -0
  477. package/src/i18n/setting.ja.ts +78 -0
  478. package/src/i18n/setting.ko.ts +76 -0
  479. package/src/i18n/setting.pt-BR.ts +78 -0
  480. package/src/i18n/setting.ru.ts +76 -0
  481. package/src/i18n/setting.zh-CN.ts +76 -0
  482. package/src/i18n/style.ar.ts +55 -0
  483. package/src/i18n/style.de.ts +54 -0
  484. package/src/i18n/style.es.ts +54 -0
  485. package/src/i18n/style.fr.ts +54 -0
  486. package/src/i18n/style.he.ts +54 -0
  487. package/src/i18n/style.hi.ts +54 -0
  488. package/src/i18n/style.ja.ts +54 -0
  489. package/src/i18n/style.ko.ts +54 -0
  490. package/src/i18n/style.pt-BR.ts +56 -0
  491. package/src/i18n/style.ru.ts +54 -0
  492. package/src/i18n/style.zh-CN.ts +54 -0
  493. package/src/i18n/styling.ar.ts +295 -0
  494. package/src/i18n/styling.de.ts +285 -0
  495. package/src/i18n/styling.es.ts +317 -0
  496. package/src/i18n/styling.fr.ts +285 -0
  497. package/src/i18n/styling.he.ts +307 -0
  498. package/src/i18n/styling.hi.ts +323 -0
  499. package/src/i18n/styling.ja.ts +317 -0
  500. package/src/i18n/styling.ko.ts +311 -0
  501. package/src/i18n/styling.pt-BR.ts +301 -0
  502. package/src/i18n/styling.ru.ts +301 -0
  503. package/src/i18n/styling.zh-CN.ts +307 -0
  504. package/src/i18n/temporal.ar.ts +31 -0
  505. package/src/i18n/temporal.de.ts +24 -0
  506. package/src/i18n/temporal.es.ts +27 -0
  507. package/src/i18n/temporal.fr.ts +28 -0
  508. package/src/i18n/temporal.he.ts +31 -0
  509. package/src/i18n/temporal.hi.ts +31 -0
  510. package/src/i18n/temporal.ja.ts +31 -0
  511. package/src/i18n/temporal.ko.ts +31 -0
  512. package/src/i18n/temporal.pt-BR.ts +31 -0
  513. package/src/i18n/temporal.ru.ts +31 -0
  514. package/src/i18n/temporal.zh-CN.ts +31 -0
  515. package/src/i18n/transitions.ar.ts +97 -0
  516. package/src/i18n/transitions.de.ts +97 -0
  517. package/src/i18n/transitions.es.ts +97 -0
  518. package/src/i18n/transitions.fr.ts +97 -0
  519. package/src/i18n/transitions.he.ts +97 -0
  520. package/src/i18n/transitions.hi.ts +97 -0
  521. package/src/i18n/transitions.ja.ts +97 -0
  522. package/src/i18n/transitions.ko.ts +97 -0
  523. package/src/i18n/transitions.pt-BR.ts +97 -0
  524. package/src/i18n/transitions.ru.ts +97 -0
  525. package/src/i18n/transitions.zh-CN.ts +97 -0
  526. package/src/i18n/types.ts +158 -0
  527. package/src/i18n/vehicles.ar.ts +137 -0
  528. package/src/i18n/vehicles.de.ts +125 -0
  529. package/src/i18n/vehicles.es.ts +138 -0
  530. package/src/i18n/vehicles.fr.ts +125 -0
  531. package/src/i18n/vehicles.he.ts +136 -0
  532. package/src/i18n/vehicles.hi.ts +138 -0
  533. package/src/i18n/vehicles.ja.ts +138 -0
  534. package/src/i18n/vehicles.ko.ts +138 -0
  535. package/src/i18n/vehicles.pt-BR.ts +136 -0
  536. package/src/i18n/vehicles.ru.ts +136 -0
  537. package/src/i18n/vehicles.zh-CN.ts +136 -0
  538. package/src/i18n/voice-character.ar.ts +126 -0
  539. package/src/i18n/voice-character.de.ts +126 -0
  540. package/src/i18n/voice-character.es.ts +126 -0
  541. package/src/i18n/voice-character.fr.ts +126 -0
  542. package/src/i18n/voice-character.he.ts +126 -0
  543. package/src/i18n/voice-character.hi.ts +126 -0
  544. package/src/i18n/voice-character.ja.ts +126 -0
  545. package/src/i18n/voice-character.ko.ts +126 -0
  546. package/src/i18n/voice-character.pt-BR.ts +126 -0
  547. package/src/i18n/voice-character.ru.ts +126 -0
  548. package/src/i18n/voice-character.zh-CN.ts +126 -0
  549. package/src/i18n/voice-delivery.ar.ts +77 -0
  550. package/src/i18n/voice-delivery.de.ts +77 -0
  551. package/src/i18n/voice-delivery.es.ts +77 -0
  552. package/src/i18n/voice-delivery.fr.ts +77 -0
  553. package/src/i18n/voice-delivery.he.ts +77 -0
  554. package/src/i18n/voice-delivery.hi.ts +77 -0
  555. package/src/i18n/voice-delivery.ja.ts +77 -0
  556. package/src/i18n/voice-delivery.ko.ts +77 -0
  557. package/src/i18n/voice-delivery.pt-BR.ts +77 -0
  558. package/src/i18n/voice-delivery.ru.ts +77 -0
  559. package/src/i18n/voice-delivery.zh-CN.ts +77 -0
  560. package/src/i18n/weapons.ar.ts +115 -0
  561. package/src/i18n/weapons.de.ts +114 -0
  562. package/src/i18n/weapons.es.ts +116 -0
  563. package/src/i18n/weapons.fr.ts +103 -0
  564. package/src/i18n/weapons.he.ts +114 -0
  565. package/src/i18n/weapons.hi.ts +116 -0
  566. package/src/i18n/weapons.ja.ts +116 -0
  567. package/src/i18n/weapons.ko.ts +116 -0
  568. package/src/i18n/weapons.pt-BR.ts +114 -0
  569. package/src/i18n/weapons.ru.ts +114 -0
  570. package/src/i18n/weapons.zh-CN.ts +114 -0
  571. package/src/image-critic-node.ts +61 -0
  572. package/src/image-critic-types.ts +40 -0
  573. package/src/index.ts +866 -0
  574. package/src/inject-upstream.ts +15 -0
  575. package/src/inpaint-region.ts +51 -0
  576. package/src/json-evaluator.ts +732 -0
  577. package/src/json-path.ts +52 -0
  578. package/src/lip-sync-pricing.ts +90 -0
  579. package/src/list-merge.ts +40 -0
  580. package/src/list-sort.ts +122 -0
  581. package/src/list-source-resolver.ts +50 -0
  582. package/src/llm-models.ts +245 -0
  583. package/src/location-mention-slug.ts +291 -0
  584. package/src/location-preset-catalog-map.ts +128 -0
  585. package/src/loop-delimiter.ts +73 -0
  586. package/src/lora-routing.ts +95 -0
  587. package/src/lottie-overlay-catalog.ts +175 -0
  588. package/src/lottie-slots.ts +309 -0
  589. package/src/model-catalog.ts +2386 -0
  590. package/src/model-constants.ts +1910 -0
  591. package/src/model-tree.ts +120 -0
  592. package/src/monetization.ts +15 -0
  593. package/src/multi-pick.ts +42 -0
  594. package/src/node-default-mappings.ts +262 -0
  595. package/src/node-mappable-fields.ts +70 -0
  596. package/src/node-preset-export.ts +56 -0
  597. package/src/node-preset-extract.ts +147 -0
  598. package/src/node-refs.ts +253 -0
  599. package/src/node-runtime-keys.ts +117 -0
  600. package/src/object-aspect-defaults.ts +72 -0
  601. package/src/object-picker-types.ts +22 -0
  602. package/src/parameter-node-value.ts +284 -0
  603. package/src/pinterest-url.ts +28 -0
  604. package/src/pipeline-chat.ts +72 -0
  605. package/src/pipeline-defaults.ts +318 -0
  606. package/src/pipeline-events.ts +162 -0
  607. package/src/pipeline-state-types.ts +196 -0
  608. package/src/pipeline-types.ts +647 -0
  609. package/src/pipeline-validation.ts +87 -0
  610. package/src/presentation-types.ts +23 -0
  611. package/src/presentation-utils.ts +397 -0
  612. package/src/producer-types.ts +188 -0
  613. package/src/progress-curve.ts +99 -0
  614. package/src/provider-directive-defaults.ts +69 -0
  615. package/src/reduce-strategy-registry.ts +121 -0
  616. package/src/reference-board-templates.ts +81 -0
  617. package/src/reference-roles.ts +153 -0
  618. package/src/reference-sheet/__tests__/board-to-column.test.ts +20 -0
  619. package/src/reference-sheet/__tests__/catalog.test.ts +50 -0
  620. package/src/reference-sheet/__tests__/cost.test.ts +38 -0
  621. package/src/reference-sheet/__tests__/no-drift.test.ts +28 -0
  622. package/src/reference-sheet/__tests__/panel-plan.test.ts +61 -0
  623. package/src/reference-sheet/__tests__/panel-prompts.test.ts +17 -0
  624. package/src/reference-sheet/__tests__/plan-generation.test.ts +72 -0
  625. package/src/reference-sheet/__tests__/presets.test.ts +54 -0
  626. package/src/reference-sheet/__tests__/types.test.ts +24 -0
  627. package/src/reference-sheet/catalog.ts +144 -0
  628. package/src/reference-sheet/cost.ts +37 -0
  629. package/src/reference-sheet/credit-id.ts +7 -0
  630. package/src/reference-sheet/index.ts +8 -0
  631. package/src/reference-sheet/panel-plan.ts +65 -0
  632. package/src/reference-sheet/panel-prompts.ts +14 -0
  633. package/src/reference-sheet/plan-generation.ts +79 -0
  634. package/src/reference-sheet/presets.ts +77 -0
  635. package/src/reference-sheet/types.ts +92 -0
  636. package/src/repeat-types.ts +97 -0
  637. package/src/resolve-field-mappings.ts +119 -0
  638. package/src/route-filter.ts +80 -0
  639. package/src/scene-helper-types.ts +249 -0
  640. package/src/scene-node-types.ts +281 -0
  641. package/src/scraper-actors.ts +57 -0
  642. package/src/scraper-output-schemas.ts +25 -0
  643. package/src/seasons.ts +45 -0
  644. package/src/selector.ts +864 -0
  645. package/src/settled-with-limit.ts +42 -0
  646. package/src/shot-element.ts +43 -0
  647. package/src/social-media-specs.ts +121 -0
  648. package/src/social-post.ts +24 -0
  649. package/src/sub-workflow-validation.ts +78 -0
  650. package/src/supported-fonts.ts +40 -0
  651. package/src/surround.ts +113 -0
  652. package/src/switchx-pricing.ts +33 -0
  653. package/src/text-separators.ts +59 -0
  654. package/src/to-connected-references.ts +77 -0
  655. package/src/types.ts +272 -0
  656. package/src/variant-job-id.ts +17 -0
  657. package/src/vehicles.ts +213 -0
  658. package/src/video-analysis-pricing.ts +74 -0
  659. package/src/video-analysis.ts +127 -0
  660. package/src/video-duration.ts +25 -0
  661. package/src/voice-changer-models.ts +36 -0
  662. package/src/voice-matcher-types.ts +37 -0
  663. package/src/voices.ts +92 -0
  664. package/src/weapons.ts +190 -0
  665. package/src/workflow-export.ts +153 -0
@@ -0,0 +1,284 @@
1
+ /**
2
+ * Read the "primary value" of a parameter node directly from its data.
3
+ *
4
+ * Parameter nodes (framing, camera-motion, motion, tone, etc.) are pickers on
5
+ * canvas — they don't execute, so they produce no NodeExecutionState.output on
6
+ * the backend. Both the frontend extractNodeOutput fallthrough and the backend
7
+ * resolver adapter call this when a mapped source is a parameter node, so that
8
+ * fieldMappings on non-text fields (framing, cameraMotion, etc.) resolve
9
+ * correctly at execution time.
10
+ */
11
+
12
+ export const PARAMETER_NODE_TYPES: ReadonlySet<string> = new Set([
13
+ "text-prompt",
14
+ "tone",
15
+ "style-guide",
16
+ "motion",
17
+ "camera-motion",
18
+ "framing",
19
+ "lens",
20
+ "camera-format",
21
+ "lighting",
22
+ "color-look",
23
+ "atmosphere",
24
+ "style",
25
+ "setting",
26
+ "person",
27
+ "mood",
28
+ "photographer",
29
+ "aesthetic",
30
+ "era",
31
+ "pose",
32
+ "styling",
33
+ "temporal",
34
+ "material",
35
+ "animal",
36
+ "vehicle",
37
+ "weapon",
38
+ "furniture",
39
+ "photo-genre",
40
+ "backdrop",
41
+ "held-prop",
42
+ "exposure-settings",
43
+ "render-quality",
44
+ "composition-effects",
45
+ "post-process-effects",
46
+ "action-fx",
47
+ "character-fx",
48
+ "transition",
49
+ "loop-subject",
50
+ "scene-count",
51
+ "duration",
52
+ "aspect-ratio",
53
+ "music-genre",
54
+ "music-mood",
55
+ "instrumentation",
56
+ "voice-character",
57
+ "voice-delivery",
58
+ ])
59
+
60
+ export function getParameterValue(
61
+ data: Record<string, unknown>,
62
+ nodeType: string,
63
+ ): string | undefined {
64
+ switch (nodeType) {
65
+ case "text-prompt":
66
+ return trim(data.text)
67
+ case "tone":
68
+ return trim(data.tone)
69
+ case "style-guide":
70
+ return trim(data.text)
71
+ case "motion":
72
+ return trim(data.motion)
73
+ case "camera-motion":
74
+ return trim(data.cameraMotion)
75
+ case "framing":
76
+ // Multi-category: return the first set per-category value (used for
77
+ // single-string field-mapping resolution; full hint composition goes
78
+ // through buildFramingHints in the executors).
79
+ return (
80
+ trim(data.shotSize) ??
81
+ trim(data.angle) ??
82
+ trim(data.coverage) ??
83
+ trim(data.composition) ??
84
+ trim(data.vantage)
85
+ )
86
+ case "lens":
87
+ return trim(data.lens)
88
+ case "camera-format":
89
+ return trim(data.cameraFormat)
90
+ case "lighting":
91
+ // Multi-category: return the first set per-category value (used for
92
+ // single-string field-mapping resolution; full hint composition goes
93
+ // through buildLightingHints in the executors).
94
+ return (
95
+ trim(data.timeOfDay) ??
96
+ trim(data.lightingStyle) ??
97
+ trim(data.lightingDirection) ??
98
+ trim(data.lightingRatio) ??
99
+ trim(data.colorTemperature)
100
+ )
101
+ case "color-look":
102
+ return trim(data.colorLook)
103
+ case "music-genre":
104
+ return trim(data.subgenre) ?? trim(data.genre) ?? trim(data.era)
105
+ case "music-mood":
106
+ return trim(data.emotion) ?? trim(data.energy) ?? trim(data.vibe)
107
+ case "instrumentation":
108
+ return (
109
+ trim(data.production) ??
110
+ trim(data.instruments) ??
111
+ trim(data.vocalPresence) ??
112
+ trim(data.singingStyle)
113
+ )
114
+ case "voice-character":
115
+ return (
116
+ trim(data.timbre) ??
117
+ trim(data.accent) ??
118
+ trim(data.language) ??
119
+ trim(data.gender) ??
120
+ trim(data.age)
121
+ )
122
+ case "voice-delivery":
123
+ return trim(data.archetype) ?? trim(data.emotion) ?? trim(data.pace)
124
+ case "atmosphere":
125
+ return trim(data.atmosphere)
126
+ case "action-fx":
127
+ return trim(data.actionFx)
128
+ case "character-fx":
129
+ return trim(data.characterFx)
130
+ case "transition":
131
+ return trim(data.transition)
132
+ case "style":
133
+ return trim(data.style)
134
+ case "setting":
135
+ return trim(data.setting)
136
+ case "loop-subject":
137
+ return trim(data.loopSubject)
138
+ case "material":
139
+ return trim(data.material)
140
+ case "animal":
141
+ return trim(data.animal)
142
+ case "vehicle":
143
+ return trim(data.vehicle)
144
+ case "weapon":
145
+ return trim(data.weapon)
146
+ case "furniture":
147
+ return trim(data.furniture)
148
+ case "photo-genre":
149
+ return trim(data.photoGenre)
150
+ case "backdrop":
151
+ return trim(data.backdrop)
152
+ case "held-prop":
153
+ return trim(data.heldProp)
154
+ case "person":
155
+ // Multi-dimension: return the first set per-dimension value (used for
156
+ // single-string field-mapping resolution; full hint composition goes
157
+ // through buildPersonHints in the executors).
158
+ return (
159
+ trim(data.type) ??
160
+ trim(data.age) ??
161
+ trim(data.ethnicity) ??
162
+ trim(data.regionalAesthetic) ??
163
+ trim(data.frame) ??
164
+ trim(data.bodyMass) ??
165
+ trim(data.bust) ??
166
+ trim(data.waist) ??
167
+ trim(data.hips) ??
168
+ trim(data.silhouette) ??
169
+ trim(data.faceShape) ??
170
+ trim(data.jawline) ??
171
+ trim(data.cheekbones) ??
172
+ trim(data.facialFullness) ??
173
+ trim(data.eyeShape) ??
174
+ trim(data.eyelidType) ??
175
+ trim(data.canthalTilt) ??
176
+ trim(data.eyeSpacing) ??
177
+ trim(data.eyeSetBrow) ??
178
+ trim(data.nose) ??
179
+ trim(data.noseTip) ??
180
+ trim(data.lipFullness) ??
181
+ trim(data.lipShape) ??
182
+ trim(data.lips) ??
183
+ trim(data.hairColor) ??
184
+ trim(data.hairBase) ??
185
+ trim(data.eyebrows) ??
186
+ trim(data.skinTone) ??
187
+ trim(data.skinTexture) ??
188
+ trim(data.eyeColor) ??
189
+ trim(data.facialHair) ??
190
+ trim(data.distinctiveFeature) ??
191
+ trim(data.lipState) ??
192
+ trim(data.eyeState)
193
+ )
194
+ case "mood":
195
+ return trim(data.mood)
196
+ case "photographer":
197
+ return trim(data.photographer)
198
+ case "aesthetic":
199
+ return trim(data.aesthetic)
200
+ case "era":
201
+ return trim(data.era)
202
+ case "pose":
203
+ return (
204
+ trim(data.pose) ??
205
+ trim(data.handPosition) ??
206
+ trim(data.bodyLean) ??
207
+ trim(data.headTilt) ??
208
+ trim(data.activity)
209
+ )
210
+ case "styling":
211
+ // Multi-dimension: return the first set per-dimension value (used for
212
+ // single-string field-mapping resolution; full hint composition goes
213
+ // through buildStylingHints in the executors).
214
+ return (
215
+ trim(data.makeup) ??
216
+ trim(data.hairCut) ??
217
+ trim(data.hairTreatment) ??
218
+ trim(data.hairState) ??
219
+ trim(data.eyewear) ??
220
+ trim(data.headwear) ??
221
+ trim(data.jewelry) ??
222
+ trim(data.nails) ??
223
+ trim(data.facePaint) ??
224
+ trim(data.outfit) ??
225
+ trim(data.top) ??
226
+ trim(data.bottom) ??
227
+ trim(data.outerwear) ??
228
+ trim(data.legwear) ??
229
+ trim(data.footwear) ??
230
+ trim(data.fabric) ??
231
+ trim(data.wardrobeState)
232
+ )
233
+ case "temporal":
234
+ // Multi-category: return the first set per-category value (used for
235
+ // single-string field-mapping resolution; full hint composition goes
236
+ // through buildTemporalHints in the executors).
237
+ return (
238
+ trim(data.temporalSpeed) ??
239
+ trim(data.temporalFreeze) ??
240
+ trim(data.temporalDirection) ??
241
+ trim(data.temporalShutter)
242
+ )
243
+ case "exposure-settings":
244
+ return (
245
+ trim(data.aperture) ??
246
+ trim(data.shutterSpeed) ??
247
+ trim(data.isoValue)
248
+ )
249
+ case "render-quality":
250
+ return trim(data.renderQuality)
251
+ case "composition-effects":
252
+ return trim(data.compositionEffect)
253
+ case "post-process-effects":
254
+ return trim(data.postProcess)
255
+ case "scene-count":
256
+ return data.count != null ? String(data.count) : undefined
257
+ case "duration":
258
+ return data.seconds != null ? String(data.seconds) : undefined
259
+ case "aspect-ratio":
260
+ return trim(data.ratio)
261
+ default:
262
+ return undefined
263
+ }
264
+ }
265
+
266
+ function trim(v: unknown): string | undefined {
267
+ if (typeof v === "string") {
268
+ const s = v.trim()
269
+ return s.length > 0 ? s : undefined
270
+ }
271
+ // Multi-pick fields (ethnicity, mood, aesthetic) may be a string[]. The
272
+ // single-string field-mapping resolver only needs *some* value to indicate
273
+ // the field is set — return the first non-empty entry.
274
+ if (Array.isArray(v)) {
275
+ for (const item of v) {
276
+ if (typeof item === "string") {
277
+ const s = item.trim()
278
+ if (s.length > 0) return s
279
+ }
280
+ }
281
+ }
282
+ return undefined
283
+ }
284
+
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Auto-upgrade Pinterest CDN URLs to their highest-resolution variant.
3
+ *
4
+ * `i.pinimg.com` serves the same image at multiple sizes via a path-prefix
5
+ * segment: `/236x/`, `/474x/`, `/564x/`, `/736x/`, `/1200x/`, `/originals/`.
6
+ * The `originals` segment returns the source resolution — much better input
7
+ * for `describe-image`, `image-to-image`, `face-swap`, etc.
8
+ *
9
+ * Returns the input unchanged when:
10
+ * - the URL doesn't parse as a URL
11
+ * - the host isn't `i.pinimg.com`
12
+ * - the path doesn't start with a recognized size segment
13
+ *
14
+ * Used by the upload-image node when a user pastes a Pinterest URL, and by
15
+ * any backend describe-image-style fetch that wants the highest-res input.
16
+ */
17
+ export function normalizePinterestUrl(url: string): string {
18
+ try {
19
+ const u = new URL(url)
20
+ if (u.hostname !== "i.pinimg.com") return url
21
+ const next = u.pathname.replace(/^\/(?:\d+x|originals)\//, "/originals/")
22
+ if (next === u.pathname) return url
23
+ u.pathname = next
24
+ return u.toString()
25
+ } catch {
26
+ return url
27
+ }
28
+ }
@@ -0,0 +1,72 @@
1
+ import { z } from "zod"
2
+ import type { Operation } from "fast-json-patch"
3
+ import type { PipelineStageName } from "./pipeline-events.js"
4
+ import { ShowrunnerPlanSchema } from "./pipeline-types.js"
5
+
6
+ /** RFC 6902 JSON Patch operations. */
7
+ export type JsonPatch = Operation[]
8
+
9
+ /**
10
+ * Response from the chat-refine-showrunner LLM specialist. Either includes a
11
+ * concrete proposed change the user can apply, or none (chat-only reply).
12
+ *
13
+ * Two variants:
14
+ * - 'edit_artifact': JSON Patch operations to apply to the current stage
15
+ * artifact (Script stage = ShowrunnerPlan).
16
+ * - 'suggest_branch': the LLM thinks a deeper change is needed — recommend
17
+ * the user use the Branch flow (1D.3) from this stage instead of trying
18
+ * to patch inline.
19
+ */
20
+ export const ChatTurnResponseSchema = z.object({
21
+ reply: z.string().min(1).max(4000),
22
+ proposed_change: z
23
+ .discriminatedUnion("change_type", [
24
+ z.object({
25
+ change_type: z.literal("edit_artifact"),
26
+ json_patch: z
27
+ .array(
28
+ z.object({
29
+ op: z.enum(["add", "remove", "replace"]),
30
+ path: z.string().min(1),
31
+ value: z.unknown().optional(),
32
+ }),
33
+ )
34
+ .min(1)
35
+ .max(50),
36
+ summary: z.string().min(1).max(200),
37
+ }),
38
+ z.object({
39
+ change_type: z.literal("suggest_branch"),
40
+ from_stage: z.enum([
41
+ "script",
42
+ "characters",
43
+ "objects",
44
+ "locations",
45
+ "shot_list",
46
+ "scene_images",
47
+ "animate_audio_edit",
48
+ ]),
49
+ reason: z.string().min(1).max(300),
50
+ }),
51
+ ])
52
+ .nullable(),
53
+ })
54
+ export type ChatTurnResponse = z.infer<typeof ChatTurnResponseSchema>
55
+ export type ProposedChange = NonNullable<ChatTurnResponse["proposed_change"]>
56
+
57
+ /**
58
+ * Per-stage patch validation schema for `applyStageEdit`. Stages other than
59
+ * `script` don't have chat enabled in 1D.2b (per LLM spec v4.0 narrowing) —
60
+ * their entries are explicitly `null` to keep the type-check exhaustive when
61
+ * future stages are added.
62
+ */
63
+ export const STAGE_PATCH_SCHEMA: Record<PipelineStageName, z.ZodTypeAny | null> = {
64
+ script: ShowrunnerPlanSchema,
65
+ characters: null,
66
+ objects: null,
67
+ locations: null,
68
+ shot_list: null,
69
+ scene_images: null,
70
+ animate_audio_edit: null,
71
+ post_merge: null,
72
+ }
@@ -0,0 +1,318 @@
1
+ export const PIPELINE_TYPES = ["story_to_video", "song_to_music_video"] as const
2
+ export type PipelineType = (typeof PIPELINE_TYPES)[number]
3
+
4
+ export const PIPELINE_FORMATS = [
5
+ "trailer",
6
+ "short_film",
7
+ "music_video",
8
+ "reel",
9
+ "commercial",
10
+ ] as const
11
+ export type PipelineFormat = (typeof PIPELINE_FORMATS)[number]
12
+
13
+ export const PIPELINE_MODES = ["manual", "auto", "guided"] as const
14
+ export type PipelineMode = (typeof PIPELINE_MODES)[number]
15
+
16
+ export const PIPELINE_ACTIVATION_MODES = ["interactive", "programmatic"] as const
17
+ export type PipelineActivationMode = (typeof PIPELINE_ACTIVATION_MODES)[number]
18
+
19
+ export const PIPELINE_OUTPUT_RESOLUTIONS = ["480p", "720p", "1080p", "4K"] as const
20
+ export type PipelineOutputResolution = (typeof PIPELINE_OUTPUT_RESOLUTIONS)[number]
21
+
22
+ export const PER_FORMAT_DURATION_BOUNDS: Record<
23
+ PipelineFormat,
24
+ { min: number; max: number }
25
+ > = {
26
+ reel: { min: 7, max: 90 },
27
+ commercial: { min: 10, max: 90 },
28
+ trailer: { min: 30, max: 180 },
29
+ short_film: { min: 12, max: 600 },
30
+ music_video: { min: 30, max: 600 },
31
+ }
32
+
33
+ export const GLOBAL_MAX_DURATION_SECONDS = 600
34
+
35
+ export function validateDurationForFormat(
36
+ format: PipelineFormat,
37
+ seconds: number,
38
+ ): { ok: true } | { ok: false; reason: string } {
39
+ if (seconds > GLOBAL_MAX_DURATION_SECONDS) {
40
+ return { ok: false, reason: `target_duration_seconds must be <= ${GLOBAL_MAX_DURATION_SECONDS}` }
41
+ }
42
+ const bounds = PER_FORMAT_DURATION_BOUNDS[format]
43
+ if (seconds < bounds.min || seconds > bounds.max) {
44
+ return {
45
+ ok: false,
46
+ reason: `${format} requires duration in [${bounds.min}, ${bounds.max}] seconds`,
47
+ }
48
+ }
49
+ return { ok: true }
50
+ }
51
+
52
+ export function validateModeActivation(
53
+ mode: PipelineMode,
54
+ activation: PipelineActivationMode,
55
+ ): { ok: true } | { ok: false; reason: string } {
56
+ if (activation === "programmatic" && mode === "guided") {
57
+ return {
58
+ ok: false,
59
+ reason: "Programmatic activation cannot use guided mode (no user for chat turns)",
60
+ }
61
+ }
62
+ return { ok: true }
63
+ }
64
+
65
+ // Tier → max parallel pipelines (Architecture §5.4)
66
+ export const TIER_PIPELINE_PARALLELISM: Record<string, number> = {
67
+ free: 0,
68
+ basic: 1,
69
+ standard: 2,
70
+ pro: 3,
71
+ business: 5,
72
+ }
73
+
74
+ // Tier → default hard cost cap when max_cost_credits omitted (Architecture §6.6.3)
75
+ export const TIER_MAX_PIPELINE_COST_CREDITS: Record<string, number> = {
76
+ free: 0,
77
+ basic: 300,
78
+ standard: 800,
79
+ pro: 2000,
80
+ business: 5000,
81
+ }
82
+
83
+ // Per-stage soft timeout (matches workflow-orchestration)
84
+ export const PIPELINE_STAGE_TIMEOUT_MS = 30 * 60 * 1000
85
+ // Hard ceiling for a SINGLE orchestrator drive (pipeline-worker aborts the
86
+ // in-flight drive when this fires). One drive runs a whole stage's work; the
87
+ // heaviest is animate_audio_edit, which fans out every scene × every shot
88
+ // (KIE video gen + per-shot critic + audio + merge). For a multi-scene film
89
+ // that legitimately exceeds 90 min — the old value aborted such drives
90
+ // mid-fan-out, and before the scene-level resume short-circuit landed each
91
+ // retry restarted from scratch and tripped the resume cap (prod pipeline
92
+ // 64b76ed9). 4 h gives a heavy drive room to finish in one pass while staying
93
+ // well under the reconcile cron's 6 h abandon threshold. Worker concurrency is
94
+ // 5, so even a pathological long drive leaves 4 slots free.
95
+ export const PIPELINE_HARD_TIMEOUT_MS = 4 * 60 * 60 * 1000
96
+
97
+ /**
98
+ * Per-stage hard retry caps applied to image-gen for that stage.
99
+ * Pipeline-level credit cap (max_cost_credits) is the ultimate guard, but
100
+ * these prevent a single stage from sucking all the budget.
101
+ */
102
+ export const ENTITY_TOOL_RETRY_CAP = 3 // tool-level failure retries per entity
103
+
104
+ /**
105
+ * Default variant counts when ShowrunnerPlan doesn't suggest specifics.
106
+ */
107
+ export const DEFAULT_CHARACTER_ANGLE_COUNT = 3 // main + 2 variants for non-protagonist
108
+ export const DEFAULT_CHARACTER_EXPRESSION_COUNT = 2 // baseline expression variants
109
+
110
+ /**
111
+ * Short-film lean reference set. A few-shot film can't meaningfully consume
112
+ * 5-8 reference variants per character: each shot is animated from exactly ONE
113
+ * reference image (the video providers accept a single reference and drop the
114
+ * rest — see `allocateReferenceSlots`), so the extra angle/expression variants
115
+ * are pure wall-clock + KIE load with ~no quality return. For films at or under
116
+ * the threshold we generate only main + 1 angle + 1 expression; longer films
117
+ * keep the full plan-driven variant set unchanged.
118
+ *
119
+ * Measured impact: the characters stage was the joint-largest time sink (≈27
120
+ * min for a 40 s film — 23 character images at ~58 s each on KIE). Capping a
121
+ * ≤2 min film to 2 variants/character cuts that to ~12 images.
122
+ */
123
+ export const SHORT_FILM_VARIANT_THRESHOLD_SEC = 120
124
+ export const SHORT_FILM_ANGLE_COUNT = 2 // main + 1 angle variant
125
+ export const SHORT_FILM_EXPRESSION_COUNT = 1 // neutral only
126
+
127
+ /**
128
+ * Max location variants generated even if Showrunner suggests more — cost guard.
129
+ */
130
+ export const MAX_LOCATION_VARIANTS = 4
131
+
132
+ /**
133
+ * Maximum user-turn count per stage for the chat refine flow. Enforced by
134
+ * the chat POST route (counts existing `role='user'` rows and rejects when
135
+ * the cap is reached). 1D.2b ships **Script chat only** per the LLM Spec
136
+ * v4.0 narrowing — `shot_list` + `post_merge` caps are pre-declared so
137
+ * adding their chat surfaces in 1D.2d only needs route+UI wiring, not a
138
+ * type/constant change.
139
+ */
140
+ export const CHAT_TURN_CAPS = {
141
+ script: 20,
142
+ shot_list: 15,
143
+ post_merge: 8,
144
+ } as const
145
+
146
+ /**
147
+ * Pipeline entity error code emitted by Phase 1D.2c-a image critics
148
+ * (Stage 2 Characters + Stage 4 Locations) and any future image-level
149
+ * validators. Constant lets the frontend compare equality (not substring)
150
+ * and the backend writes a single canonical value.
151
+ *
152
+ * Written to `pipeline_entities.metadata.last_error` after the critic retry
153
+ * cap exhausts. Auto-mode's failure-aggregator (`detectImageCriticFailures`
154
+ * + `failPipelineForImageCriticUnresolvable`) reads this exact value.
155
+ */
156
+ export const IMAGE_CRITIC_UNRESOLVABLE = "image_critic_unresolvable"
157
+
158
+ /**
159
+ * Maximum critic-feedback retry budget per entity in Phase 1D.2c-a image
160
+ * critics. Each fail triggers a regeneration with critic suggestions injected
161
+ * into the prompt; after this many retries the entity is marked failed and
162
+ * surfaces in EntityCard with recovery buttons.
163
+ */
164
+ export const IMAGE_CRITIC_MAX_RETRIES = 2
165
+
166
+ /**
167
+ * Score threshold below which the critic's verdict is overridden to "fail"
168
+ * regardless of the verdict field. Defends against an overly lenient critic
169
+ * that says verdict='pass' on a borderline image. The numeric score (0-10)
170
+ * is enforced by the schema and the system prompt anchors the meaning.
171
+ */
172
+ export const IMAGE_CRITIC_MIN_ADHERENCE_SCORE = 5
173
+
174
+ /**
175
+ * Metadata keys written by the image-critic retry loop (Phase 1D.2c-a)
176
+ * onto `pipeline_entities.metadata` when an entity's critic budget is
177
+ * exhausted. The retry-image-generation route clears these to reset the
178
+ * entity to a fresh attempt; EntityCard reads them to render findings +
179
+ * the failed image.
180
+ *
181
+ * Single source of truth so the writer (`_image-critic-loop.ts`) and the
182
+ * clearer (`routes/pipelines.ts:retry-image-generation`) can't drift.
183
+ */
184
+ export const IMAGE_CRITIC_METADATA_KEYS = [
185
+ "last_error",
186
+ "last_error_at",
187
+ "critic_findings",
188
+ "last_attempted_image_url",
189
+ "last_attempted_asset_id",
190
+ "image_critic_retry_count",
191
+ ] as const
192
+
193
+ export type ImageCriticMetadataKey = (typeof IMAGE_CRITIC_METADATA_KEYS)[number]
194
+
195
+ /**
196
+ * Removes every {@link IMAGE_CRITIC_METADATA_KEYS} entry from a metadata
197
+ * blob, returning a shallow copy. Used by the retry-image-generation route
198
+ * to wipe critic-only state while preserving everything else (`name`,
199
+ * `voice_match`, `reject_count`, etc.).
200
+ */
201
+ export function clearImageCriticMetadata(
202
+ meta: Record<string, unknown> | null | undefined,
203
+ ): Record<string, unknown> {
204
+ if (!meta) return {}
205
+ const next: Record<string, unknown> = { ...meta }
206
+ for (const key of IMAGE_CRITIC_METADATA_KEYS) {
207
+ delete next[key]
208
+ }
209
+ return next
210
+ }
211
+
212
+ /**
213
+ * Phase 1D.2c-b-ii — Video Critic frame extraction modes.
214
+ * Each pipeline picks one via PipelineInput.video_critic_frame_count.
215
+ * Default 'first_last' uses the input keyframe + extractLastFrame output
216
+ * (both already produced by Stage 6 + extractLastFrame call), so no new
217
+ * frame extractions are needed in the default case.
218
+ */
219
+ export const VIDEO_CRITIC_FRAME_MODES = ["first_last", "first_middle_last", "five_evenly"] as const
220
+ export type VideoCriticFrameMode = (typeof VIDEO_CRITIC_FRAME_MODES)[number]
221
+
222
+ /** Cap=1 retry per shot — cost-aware (every retry is a full paid video
223
+ * generation, the priciest step in the loop). */
224
+ export const VIDEO_CRITIC_MAX_RETRIES = 1
225
+
226
+ /** Auto-fail threshold for both prompt_adherence_score and continuity_score. */
227
+ export const VIDEO_CRITIC_MIN_ADHERENCE_SCORE = 5
228
+
229
+ /**
230
+ * Phase 1D.2c-b-ii — Video Critic ShotSpec sibling field names that get
231
+ * persisted by the per-shot retry loop (`runVideoCriticLoopForShot` in
232
+ * `scene-internal-pipeline.ts`) and stripped by the retry-video-generation
233
+ * recovery route + the frontend Regenerate button.
234
+ *
235
+ * Single source of truth so the writer + clearer can't drift. Mirror of
236
+ * {@link IMAGE_CRITIC_METADATA_KEYS} for the entity-level image critic.
237
+ */
238
+ export const VIDEO_CRITIC_METADATA_KEYS = [
239
+ "video_critic_findings",
240
+ "video_critic_score",
241
+ "video_critic_continuity_score",
242
+ "video_critic_identified_action",
243
+ "video_critic_retry_count",
244
+ "video_critic_last_attempted_url",
245
+ "video_critic_failed",
246
+ "video_critic_verdict",
247
+ ] as const
248
+
249
+ export type VideoCriticMetadataKey = (typeof VIDEO_CRITIC_METADATA_KEYS)[number]
250
+
251
+ /**
252
+ * Returns a shallow copy of `shot` with all `video_critic_*` keys stripped.
253
+ * Used by the retry-video-generation route + frontend Regenerate handler to
254
+ * reset a shot to a fresh critic attempt while preserving everything else
255
+ * (camera, action, motion_prompt, …).
256
+ */
257
+ export function clearVideoCriticMetadata<T extends Record<string, unknown>>(
258
+ shot: T,
259
+ ): Omit<T, VideoCriticMetadataKey> {
260
+ const cleaned = { ...shot } as Record<string, unknown>
261
+ for (const key of VIDEO_CRITIC_METADATA_KEYS) {
262
+ delete cleaned[key]
263
+ }
264
+ return cleaned as Omit<T, VideoCriticMetadataKey>
265
+ }
266
+
267
+ /**
268
+ * Phase 1D.2 — single source of truth for chat-stage configuration.
269
+ *
270
+ * `wired: true` = the route has a specialist implemented + the LLM emits
271
+ * valid `ChatTurnResponse` for this stage's artifact.
272
+ * `wired: false` = stage is in the v0.5 spec but not yet implemented
273
+ * (the chat POST returns HTTP 501 `chat_not_wired_for_stage`).
274
+ *
275
+ * Per spec §5.12 v0.5: `script` + `shot_list` + `post_merge`.
276
+ *
277
+ * - `script`: wired in 1D.2b (chat-refine-showrunner)
278
+ * - `post_merge`: wired in 1D.2c (chat-refine-postmerge; suggest_branch only)
279
+ * - `shot_list`: pre-declared, ships in 1D.2d (blocked by v4.0 per-scene
280
+ * architecture)
281
+ *
282
+ * Prefer reading `CHAT_STAGES[stage].wired` directly in new code; the
283
+ * sibling `CHAT_ENABLED_STAGES` / `CHAT_WIRED_STAGES` exports below are
284
+ * derived and remain for backward compatibility with existing call sites.
285
+ */
286
+ export const CHAT_STAGES = {
287
+ script: { wired: true },
288
+ shot_list: { wired: false },
289
+ post_merge: { wired: true },
290
+ } as const
291
+
292
+ export type ChatEnabledStage = keyof typeof CHAT_STAGES
293
+
294
+ /**
295
+ * Ordered list of stages with chat enabled. Derived from {@link CHAT_STAGES}.
296
+ * **In 1D.2c, `script` AND `post_merge` have chat code paths wired** —
297
+ * post-merge ships with a dedicated `chat-refine-postmerge` specialist
298
+ * (suggest_branch only — see {@link STAGE_PATCH_SCHEMA}, `post_merge` stays
299
+ * `null` since the merged video isn't user-editable in place). `shot_list`
300
+ * is pre-declared for 1D.2d. The route's chat dispatch checks
301
+ * {@link CHAT_WIRED_STAGES} to decide which specialist to invoke (or 501
302
+ * for unwired stages).
303
+ */
304
+ export const CHAT_ENABLED_STAGES: readonly ChatEnabledStage[] = Object.keys(
305
+ CHAT_STAGES,
306
+ ) as ChatEnabledStage[]
307
+
308
+ /**
309
+ * Per-stage boolean map of whether chat code paths are actually wired
310
+ * end-to-end. Derived from {@link CHAT_STAGES}. The chat POST route reads
311
+ * this to decide whether to invoke a specialist (true) or return 501
312
+ * `chat_not_wired_for_stage` (false).
313
+ */
314
+ export const CHAT_WIRED_STAGES: Record<ChatEnabledStage, boolean> = {
315
+ script: CHAT_STAGES.script.wired,
316
+ shot_list: CHAT_STAGES.shot_list.wired,
317
+ post_merge: CHAT_STAGES.post_merge.wired,
318
+ }