@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,136 @@
1
+ /**
2
+ * Featured entity starter catalog (north-star §6 ③ — the "Featured" tab of each
3
+ * entity Library).
4
+ *
5
+ * These are app-provided starter presets: a curated visual description per
6
+ * archetype that the user can drop into an entity's Generate field as a
7
+ * head-start, instead of writing one from scratch. They are intentionally
8
+ * ASSETLESS — they seed generation (the user still generates the image with
9
+ * their chosen model + style), so no hosted sample images are required. The
10
+ * "Mine" tab (reuse an already-saved image) and "+ New" (Upload / write your
11
+ * own) cover the other two on-ramps.
12
+ */
13
+ export interface FeaturedEntity {
14
+ /** Stable id (unique within its type). */
15
+ id: string
16
+ /** Short name shown on the chip. */
17
+ label: string
18
+ /** Curated visual description dropped into the Generate field. */
19
+ description: string
20
+ }
21
+
22
+ export const FEATURED_ENTITIES: Record<string, readonly FeaturedEntity[]> = {
23
+ character: [
24
+ {
25
+ id: "detective",
26
+ label: "Grizzled Detective",
27
+ description:
28
+ "A weathered private detective in his 50s, stubble, rumpled trench coat, tired but sharp eyes, film-noir presence",
29
+ },
30
+ {
31
+ id: "barista",
32
+ label: "Cheerful Barista",
33
+ description:
34
+ "A cheerful young barista with curly hair, apron over a casual shirt, warm welcoming smile, energetic and approachable",
35
+ },
36
+ {
37
+ id: "elder",
38
+ label: "Wise Elder",
39
+ description:
40
+ "A wise elderly mentor with long grey hair and beard, flowing robes, calm knowing expression, gentle authority",
41
+ },
42
+ {
43
+ id: "adventurer",
44
+ label: "Young Adventurer",
45
+ description:
46
+ "A young adventurer in practical travel gear with a worn backpack, determined expression, sun-weathered skin",
47
+ },
48
+ {
49
+ id: "scientist",
50
+ label: "Focused Scientist",
51
+ description:
52
+ "A focused scientist in a white lab coat, glasses, hair tied back, intelligent and intense demeanor",
53
+ },
54
+ {
55
+ id: "child",
56
+ label: "Curious Kid",
57
+ description:
58
+ "A curious 8-year-old child with bright eyes and colorful casual clothes, playful and full of wonder",
59
+ },
60
+ ],
61
+ location: [
62
+ {
63
+ id: "alley",
64
+ label: "Cyberpunk Alley",
65
+ description:
66
+ "A neon-lit cyberpunk alley at night, wet pavement reflecting signs, drifting steam, dense layered urban detail",
67
+ },
68
+ {
69
+ id: "cafe",
70
+ label: "Cozy Café",
71
+ description:
72
+ "A cozy coffee shop interior, warm wood surfaces, soft pendant lighting, hanging plants, a few relaxed patrons",
73
+ },
74
+ {
75
+ id: "forest",
76
+ label: "Misty Forest",
77
+ description:
78
+ "A misty ancient forest at dawn, tall trees, shafts of light through fog, ferns underfoot, ethereal stillness",
79
+ },
80
+ {
81
+ id: "office",
82
+ label: "Modern Office",
83
+ description:
84
+ "A sleek modern office with glass walls, a city skyline view, minimal furniture, bright natural daylight",
85
+ },
86
+ {
87
+ id: "beach",
88
+ label: "Golden Beach",
89
+ description:
90
+ "A tranquil tropical beach at golden hour, soft rolling waves, leaning palm trees, warm low sun",
91
+ },
92
+ {
93
+ id: "bridge",
94
+ label: "Spaceship Bridge",
95
+ description:
96
+ "A futuristic spaceship bridge, glowing control panels, a vast viewport onto a star field, cool blue light",
97
+ },
98
+ ],
99
+ object: [
100
+ {
101
+ id: "watch",
102
+ label: "Vintage Pocket Watch",
103
+ description:
104
+ "An ornate vintage gold pocket watch, intricate engraving, slightly worn, on a fine chain",
105
+ },
106
+ {
107
+ id: "sword",
108
+ label: "Enchanted Sword",
109
+ description:
110
+ "A glowing enchanted sword, faint runes etched along the blade, ornate hilt wrapped in leather",
111
+ },
112
+ {
113
+ id: "robot",
114
+ label: "Retro Robot",
115
+ description:
116
+ "A friendly retro-futuristic robot companion, rounded brushed-metal chassis, a single expressive lens eye",
117
+ },
118
+ {
119
+ id: "book",
120
+ label: "Ancient Spellbook",
121
+ description:
122
+ "An ancient leather-bound spellbook, gilded page edges, embossed cover, a faint mysterious glow",
123
+ },
124
+ {
125
+ id: "car",
126
+ label: "Classic Convertible",
127
+ description:
128
+ "A sleek classic convertible sports car, polished chrome trim, vivid glossy paint, whitewall tires",
129
+ },
130
+ ],
131
+ }
132
+
133
+ /** Featured presets for an entity type ("character" | "location" | "object"). */
134
+ export function getFeaturedEntities(type: string): readonly FeaturedEntity[] {
135
+ return FEATURED_ENTITIES[type] ?? []
136
+ }
@@ -0,0 +1,117 @@
1
+ /**
2
+ * Film cost ESTIMATION for the studio preview.
3
+ *
4
+ * This is display guidance only — it produces an approximate "this film will
5
+ * cost ≈ N credits" number so the user can see cost before committing to a
6
+ * length + model. The ACTUAL charge is still computed at generation time from
7
+ * `STATIC_CREDIT_COSTS` / the `model_pricing` table per job; this module never
8
+ * bills.
9
+ *
10
+ * Numbers are grounded in the KIE-calibrated per-clip credit costs in
11
+ * `backend/src/ee/billing/credits.ts` (each entry there is annotated with its
12
+ * KIE-credit + USD source). A backend test cross-checks `VIDEO_CLIP_CREDITS`
13
+ * against that source so the estimate can't silently drift from reality.
14
+ *
15
+ * Cost structure of a Story→Video film:
16
+ * total = BASE (duration-independent planning + assembly)
17
+ * + perShot × shotCount (the variable, model-driven bulk)
18
+ * where a shot = one keyframe image + one video clip + one video-critic pass,
19
+ * and shotCount ≈ ceil(duration / clipSeconds) for the chosen model.
20
+ */
21
+
22
+ /**
23
+ * Duration-independent overhead, in credits:
24
+ * script/showrunner LLM chain ~30 · music timeline 4 · editor LLM 3 ·
25
+ * final merge 3 · storyboard-cohesion critic 5 ≈ 45.
26
+ * Mirrors the fixed line items in `estimateUpfrontCredits`
27
+ * (backend/src/ee/pipelines/credits.ts).
28
+ */
29
+ export const FILM_BASE_CREDITS = 45
30
+
31
+ /** Per-shot keyframe image (nano-banana class) — see STATIC_CREDIT_COSTS. */
32
+ export const KEYFRAME_CREDITS_PER_SHOT = 2
33
+ /** Per-shot Video Critic pass (first_last frame mode) — see credits.ts. */
34
+ export const VIDEO_CRITIC_CREDITS_PER_SHOT = 2
35
+
36
+ export interface VideoClipCost {
37
+ /** Representative per-clip credit cost at the studio's default config
38
+ * (720p; for the Seedance 2 family this is the ref-image variant the
39
+ * studio uses for identity). Sourced from STATIC_CREDIT_COSTS. */
40
+ readonly credits: number
41
+ /** Representative clip length in seconds for shot-count estimation. */
42
+ readonly clipSeconds: number
43
+ }
44
+
45
+ /**
46
+ * Representative per-clip credit cost for each user-pinnable video model.
47
+ * Values are the KIE-calibrated credits from STATIC_CREDIT_COSTS at the
48
+ * studio's typical settings (720p; Seedance 2 = 8s 720p +ref). Keep in sync
49
+ * with that table — the backend cross-check test guards drift.
50
+ */
51
+ export const VIDEO_CLIP_CREDITS: Record<string, VideoClipCost> = {
52
+ "kling-turbo": { credits: 11, clipSeconds: 5 }, // kling-turbo:5s
53
+ "kling": { credits: 14, clipSeconds: 5 }, // kling:5s
54
+ "kling-3.0": { credits: 31, clipSeconds: 5 },
55
+ "seedance": { credits: 7, clipSeconds: 8 }, // seedance:8s
56
+ "seedance-2": { credits: 50, clipSeconds: 8 }, // seedance-2:8s:720p-ref
57
+ "seedance-2-fast": { credits: 40, clipSeconds: 8 }, // seedance-2-fast:8s:720p-ref
58
+ "seedance-2-mini": { credits: 25, clipSeconds: 8 }, // seedance-2-mini:8s:720p-ref
59
+ "veo3": { credits: 79, clipSeconds: 8 }, // flat per generation (VEO 3.1 Quality)
60
+ "veo3.1": { credits: 19, clipSeconds: 6 }, // veo3.1 @ 720p
61
+ "veo3_lite": { credits: 10, clipSeconds: 6 }, // veo3_lite @ 720p
62
+ "minimax": { credits: 18, clipSeconds: 6 }, // fixed ~6s
63
+ "hailuo-standard": { credits: 8, clipSeconds: 6 }, // hailuo-standard:6s
64
+ "wan-turbo": { credits: 13, clipSeconds: 5 }, // 5s 480p
65
+ "bytedance-lite": { credits: 6, clipSeconds: 5 },
66
+ "bytedance-pro": { credits: 18, clipSeconds: 5 },
67
+ }
68
+
69
+ /**
70
+ * Fallback when no model is pinned (Auto — the Scene Director picks per scene)
71
+ * or the model isn't in the table. kling-turbo is the cheap, common default
72
+ * the engine gravitates to, so it's a reasonable "≈" anchor.
73
+ */
74
+ export const DEFAULT_VIDEO_CLIP_COST: VideoClipCost = VIDEO_CLIP_CREDITS["kling-turbo"]!
75
+
76
+ export interface FilmCreditEstimate {
77
+ /** Total estimated credits for the whole film. */
78
+ readonly totalCredits: number
79
+ /** Fixed base portion (planning + assembly). */
80
+ readonly baseCredits: number
81
+ /** Variable portion (shots × per-shot). */
82
+ readonly variableCredits: number
83
+ /** Estimated number of shots (clips) generated. */
84
+ readonly shotCount: number
85
+ /** Average credits per second of film (totalCredits / duration). */
86
+ readonly creditsPerSecond: number
87
+ /** Whether a known model drove the estimate (false = Auto/fallback). */
88
+ readonly modelKnown: boolean
89
+ }
90
+
91
+ /**
92
+ * Estimate the credit cost of a Story→Video film of `durationSeconds` rendered
93
+ * with `videoModel`. Approximate, for the studio's cost preview only.
94
+ */
95
+ export function estimateFilmCredits(
96
+ durationSeconds: number,
97
+ videoModel?: string,
98
+ ): FilmCreditEstimate {
99
+ const seconds = Math.max(1, Math.round(durationSeconds))
100
+ const known = !!videoModel && videoModel in VIDEO_CLIP_CREDITS
101
+ const clip = known ? VIDEO_CLIP_CREDITS[videoModel!]! : DEFAULT_VIDEO_CLIP_COST
102
+
103
+ const shotCount = Math.max(1, Math.ceil(seconds / clip.clipSeconds))
104
+ const perShot =
105
+ clip.credits + KEYFRAME_CREDITS_PER_SHOT + VIDEO_CRITIC_CREDITS_PER_SHOT
106
+ const variableCredits = shotCount * perShot
107
+ const totalCredits = FILM_BASE_CREDITS + variableCredits
108
+
109
+ return {
110
+ totalCredits,
111
+ baseCredits: FILM_BASE_CREDITS,
112
+ variableCredits,
113
+ shotCount,
114
+ creditsPerSecond: Math.round((totalCredits / seconds) * 10) / 10,
115
+ modelKnown: known,
116
+ }
117
+ }
@@ -0,0 +1,250 @@
1
+ /** Pure condition evaluator shared by filter-list and router (conditional mode). */
2
+
3
+ import { evaluateJsonPath } from "./json-path.js"
4
+ import { resolveNodeRefs } from "./node-refs.js"
5
+
6
+ export type FilterListOperator =
7
+ | ">" | "<" | ">=" | "<="
8
+ | "=" | "!="
9
+ | "contains" | "not_contains"
10
+ | "starts_with" | "ends_with" | "regex"
11
+ | "exists" | "not_exists"
12
+
13
+ export interface FilterListCondition {
14
+ id?: string
15
+ field?: string
16
+ operator: FilterListOperator
17
+ value?: string
18
+ valueType?: "static" | "variable"
19
+ /** UI-only hint on the config panel — irrelevant to evaluation. */
20
+ mode?: "dropdown" | "custom"
21
+ }
22
+
23
+ /** AND/OR condition bundle used by the router's conditional mode. When a
24
+ * group matches, every routeId is added to activeRoutes. Multiple groups
25
+ * union (deduped). */
26
+ export interface RouterConditionGroup {
27
+ id?: string
28
+ conditions?: FilterListCondition[]
29
+ conditionLogic?: "AND" | "OR"
30
+ routeIds?: string[]
31
+ }
32
+
33
+ /**
34
+ * Options for `evaluateCondition` / `evaluateConditionGroup`.
35
+ */
36
+ export interface EvaluateConditionOptions {
37
+ /** When `false`, text operators (`contains`, `not_contains`, `starts_with`,
38
+ * `ends_with`, `=`, `!=`) compare case-insensitively using case-folded
39
+ * string equality.
40
+ *
41
+ * Note: `=` and `!=` lose their default numeric-coercion semantics under
42
+ * `caseSensitive: false`. Under the default (case-sensitive), `1 == "1.0"`
43
+ * via `valuesEqual`; under `caseSensitive: false`, comparison is pure
44
+ * case-folded string equality, so `"1" !== "1.0"`.
45
+ *
46
+ * Default (when undefined): `true` (case-sensitive) — preserves existing
47
+ * behavior for all callers.
48
+ *
49
+ * Non-text operators (`>`, `<`, `>=`, `<=`, `exists`, `not_exists`,
50
+ * `regex`) are unaffected by this flag. */
51
+ caseSensitive?: boolean
52
+ /** Label→output map for `{Node Label}` refs inside condition values.
53
+ * Populated from a filter-list / router node's `"variables"` target
54
+ * handle. Resolved via `resolveNodeRefs` — unknown labels preserve
55
+ * the original `{...}` text, so JSON-literal values stay intact. */
56
+ variables?: ReadonlyMap<string, string>
57
+ }
58
+
59
+ export function tryParseJson(item: unknown): unknown {
60
+ if (typeof item !== "string") return item
61
+ const trimmed = item.trim()
62
+ if (!trimmed) return item
63
+ const first = trimmed[0]
64
+ if (first !== "{" && first !== "[" && first !== "\"" && !/^-?\d/.test(trimmed) && trimmed !== "true" && trimmed !== "false" && trimmed !== "null") {
65
+ return item
66
+ }
67
+ try { return JSON.parse(trimmed) } catch { return item }
68
+ }
69
+
70
+ const HOUR_MS = 60 * 60 * 1000
71
+ const DAY_MS = 24 * HOUR_MS
72
+ const WEEK_MS = 7 * DAY_MS
73
+
74
+ /** Resolve a relative-window token like `last_N_hours:3` to an ISO timestamp
75
+ * N units before `Date.now()`. Returns undefined for malformed tokens. */
76
+ export function resolveRelativeWindowToken(key: string): string | undefined {
77
+ const m = /^last_N_(hours|days|weeks):(-?\d+)$/.exec(key)
78
+ if (!m) return undefined
79
+ const n = parseInt(m[2], 10)
80
+ if (!Number.isFinite(n)) return undefined
81
+ const unitMs = m[1] === "hours" ? HOUR_MS : m[1] === "days" ? DAY_MS : WEEK_MS
82
+ return new Date(Date.now() - n * unitMs).toISOString()
83
+ }
84
+
85
+ /**
86
+ * Substitute `{{...}}` template tokens — `{{now}}`, `{{trigger.<path>}}`,
87
+ * and relative-window tokens (`{{last_N_hours:N}}` / days / weeks). Reused
88
+ * by `resolveConditionValue` (filter-list / router) and `resolveSelectorRefs`
89
+ * (selector node) so token semantics stay identical across the workflow-engine
90
+ * ref-resolution surface.
91
+ *
92
+ * Pure: returns a new string. Strings with no `{{...}}` tokens pass through
93
+ * unchanged.
94
+ */
95
+ export function substituteTriggerTokens(
96
+ raw: string,
97
+ triggerData?: Record<string, unknown>,
98
+ ): string {
99
+ if (!/\{\{/.test(raw)) return raw
100
+ return raw.replace(/\{\{\s*([^}]+?)\s*\}\}/g, (_m, expr) => {
101
+ const key = String(expr).trim()
102
+ if (key === "now") return new Date().toISOString()
103
+ if (key === "trigger.last_triggered_at") {
104
+ const v = triggerData?.last_triggered_at
105
+ return v == null ? "" : String(v)
106
+ }
107
+ if (key.startsWith("trigger.")) {
108
+ const path = key.slice("trigger.".length)
109
+ const v = triggerData?.[path]
110
+ return v == null ? "" : String(v)
111
+ }
112
+ const relative = resolveRelativeWindowToken(key)
113
+ if (relative !== undefined) return relative
114
+ return ""
115
+ })
116
+ }
117
+
118
+ export function resolveConditionValue(
119
+ raw: string,
120
+ valueType: string | undefined,
121
+ triggerData?: Record<string, unknown>,
122
+ variables?: ReadonlyMap<string, string>,
123
+ ): string {
124
+ let value = raw
125
+ if (variables && variables.size > 0) {
126
+ value = resolveNodeRefs(value, variables)
127
+ }
128
+ const hasTemplate = /\{\{/.test(value)
129
+ if (valueType !== "variable" && !hasTemplate) return value
130
+ return substituteTriggerTokens(value, triggerData)
131
+ }
132
+
133
+ function asComparableNumber(v: unknown): number {
134
+ if (typeof v === "number") return v
135
+ if (typeof v === "boolean") return v ? 1 : 0
136
+ if (typeof v === "string") {
137
+ const trimmed = v.trim()
138
+ if (trimmed === "") return NaN
139
+ const n = Number(trimmed)
140
+ if (!isNaN(n)) return n
141
+ const d = Date.parse(trimmed)
142
+ if (!isNaN(d)) return d
143
+ }
144
+ return NaN
145
+ }
146
+
147
+ // Numeric-first ordering compare used by >, <, >=, <=. Falls back to
148
+ // localeCompare when either side can't be parsed as a number.
149
+ function compareValues(a: unknown, b: unknown): number {
150
+ const na = asComparableNumber(a)
151
+ const nb = asComparableNumber(b)
152
+ if (!isNaN(na) && !isNaN(nb)) return na - nb
153
+ return String(a ?? "").localeCompare(String(b ?? ""))
154
+ }
155
+
156
+ // Numeric-first equality used by = and !=. So "432" == 432, and 432 == "432".
157
+ // Falls back to strict string equality (null/undefined coerced to "") so
158
+ // alpha values still work.
159
+ function valuesEqual(a: unknown, b: unknown): boolean {
160
+ const na = asComparableNumber(a)
161
+ const nb = asComparableNumber(b)
162
+ if (!isNaN(na) && !isNaN(nb)) return na === nb
163
+ return String(a ?? "") === String(b ?? "")
164
+ }
165
+
166
+ function applyCase(s: string, caseSensitive: boolean): string {
167
+ return caseSensitive ? s : s.toLowerCase()
168
+ }
169
+
170
+ export function evaluateCondition(
171
+ parsedItem: unknown,
172
+ rawItem: string,
173
+ condition: FilterListCondition,
174
+ triggerData?: Record<string, unknown>,
175
+ options?: EvaluateConditionOptions,
176
+ ): boolean {
177
+ const path = (condition.field ?? "").trim()
178
+ let fieldValue: unknown
179
+ if (path === "") {
180
+ fieldValue = parsedItem ?? rawItem
181
+ } else {
182
+ const matches = evaluateJsonPath(parsedItem ?? rawItem, path)
183
+ fieldValue = matches.length > 0 ? matches[0] : undefined
184
+ }
185
+
186
+ const targetStr = resolveConditionValue(condition.value ?? "", condition.valueType, triggerData, options?.variables)
187
+ // Default to case-sensitive when the flag is not explicitly set. This
188
+ // preserves existing behavior for Router conditional mode and legacy
189
+ // Filter List nodes that don't carry the new `caseSensitive` field.
190
+ const cs = options?.caseSensitive ?? true
191
+ const fieldStr = String(fieldValue ?? "")
192
+
193
+ switch (condition.operator) {
194
+ case "exists":
195
+ return fieldValue !== undefined && fieldValue !== null
196
+ case "not_exists":
197
+ return fieldValue === undefined || fieldValue === null
198
+ case "contains":
199
+ return applyCase(fieldStr, cs).includes(applyCase(targetStr, cs))
200
+ case "not_contains":
201
+ return !applyCase(fieldStr, cs).includes(applyCase(targetStr, cs))
202
+ case "starts_with":
203
+ return applyCase(fieldStr, cs).startsWith(applyCase(targetStr, cs))
204
+ case "ends_with":
205
+ return applyCase(fieldStr, cs).endsWith(applyCase(targetStr, cs))
206
+ case "regex": {
207
+ if (!targetStr) return false
208
+ try {
209
+ return new RegExp(targetStr).test(fieldStr)
210
+ } catch {
211
+ return false
212
+ }
213
+ }
214
+ case "=":
215
+ return cs
216
+ ? valuesEqual(fieldValue, targetStr)
217
+ : applyCase(fieldStr, false) === applyCase(targetStr, false)
218
+ case "!=":
219
+ return cs
220
+ ? !valuesEqual(fieldValue, targetStr)
221
+ : applyCase(fieldStr, false) !== applyCase(targetStr, false)
222
+ case ">":
223
+ return compareValues(fieldValue, targetStr) > 0
224
+ case "<":
225
+ return compareValues(fieldValue, targetStr) < 0
226
+ case ">=":
227
+ return compareValues(fieldValue, targetStr) >= 0
228
+ case "<=":
229
+ return compareValues(fieldValue, targetStr) <= 0
230
+ default:
231
+ return false
232
+ }
233
+ }
234
+
235
+ /** Evaluate a single AND/OR-joined group against one item. Empty condition
236
+ * list evaluates to `true` — typical when the user has just added a group
237
+ * and hasn't configured any conditions yet. */
238
+ export function evaluateConditionGroup(
239
+ parsedItem: unknown,
240
+ rawItem: string,
241
+ conditions: readonly FilterListCondition[],
242
+ logic: "AND" | "OR",
243
+ triggerData?: Record<string, unknown>,
244
+ options?: EvaluateConditionOptions,
245
+ ): boolean {
246
+ const effective = conditions.filter((c) => c && c.operator)
247
+ if (effective.length === 0) return true
248
+ const results = effective.map((c) => evaluateCondition(parsedItem, rawItem, c, triggerData, options))
249
+ return logic === "OR" ? results.some(Boolean) : results.every(Boolean)
250
+ }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Model-id enum + UI resolution options for Replicate Flux 2 image models.
3
+ *
4
+ * The provider-$ rate table and the cost/credit FORMULAS derived from it live
5
+ * in `backend/src/lib/pricing/flux2-cost.ts` (core, not ee/ — the Replicate
6
+ * provider integration needs them regardless of edition). They were moved
7
+ * out of this package (published Apache-2.0 on npm — an irrevocable grant)
8
+ * per the 2026-07-06 public-flip IP audit, S5.
9
+ */
10
+
11
+ export type Flux2Model = "flux-2-klein" | "flux-2-pro" | "flux-2-max"
12
+
13
+ /** Megapixel tiers offered in the UI (strings; the value space for data.resolution). */
14
+ export const FLUX2_RES_MP = ["0.5", "1", "2", "4"] as const
15
+
16
+ export function isFlux2Model(m: string): m is Flux2Model {
17
+ return m === "flux-2-klein" || m === "flux-2-pro" || m === "flux-2-max"
18
+ }
@@ -0,0 +1,52 @@
1
+ // Single source of truth for the Nodaro <-> FreeCut iframe postMessage protocol.
2
+ // Imported by app's freecut-editor-modal and Studio's ported modal so the wire
3
+ // format cannot drift. The fork (Nodaro-ai/freecut-fork) mirrors these strings in
4
+ // src/features/embedded/services/embedded-message-handler.ts + use-send-back.ts.
5
+
6
+ // Nodaro (parent) -> FreeCut (iframe)
7
+ export const NODARO_LOAD_VIDEO = "NODARO_LOAD_VIDEO"
8
+ // Multi-clip analog of NODARO_LOAD_VIDEO: lay N ordered urls on the timeline as
9
+ // sequential clips (FreeCut fetches them itself). Used by Studio's production
10
+ // "Edit in FreeCut" to assemble the whole cut.
11
+ export const NODARO_LOAD_TIMELINE = "NODARO_LOAD_TIMELINE"
12
+ export const NODARO_IMPORT_FILES = "NODARO_IMPORT_FILES"
13
+ export const NODARO_RESET_PROJECT = "NODARO_RESET_PROJECT"
14
+
15
+ // FreeCut (iframe) -> Nodaro (parent)
16
+ export const FREECUT_READY = "FREECUT_READY"
17
+ export const FREECUT_EXPORT_COMPLETE = "FREECUT_EXPORT_COMPLETE"
18
+ export const FREECUT_EXPORT_PROGRESS = "FREECUT_EXPORT_PROGRESS" // reserved; fork emits it, v1 parents ignore it
19
+ export const FREECUT_REQUEST_IMPORT = "FREECUT_REQUEST_IMPORT"
20
+
21
+ export interface FreecutImportFile {
22
+ readonly name: string
23
+ readonly type: string
24
+ readonly size: number
25
+ readonly buffer: ArrayBuffer
26
+ }
27
+
28
+ export interface NodaroLoadVideoPayload {
29
+ readonly videoUrl: string
30
+ readonly videoBuffer?: ArrayBuffer
31
+ readonly projectJson?: unknown
32
+ readonly additionalFiles?: ReadonlyArray<FreecutImportFile>
33
+ }
34
+
35
+ export interface NodaroLoadTimelinePayload {
36
+ // Ordered clip urls; FreeCut fetches each and lays them end-to-end on the timeline.
37
+ readonly clips: ReadonlyArray<string>
38
+ }
39
+
40
+ export interface FreecutExportCompletePayload {
41
+ readonly videoBuffer: ArrayBuffer
42
+ readonly projectJson?: unknown
43
+ }
44
+
45
+ export interface FreecutExportProgressPayload {
46
+ readonly percent: number
47
+ }
48
+
49
+ export interface FreecutRequestImportPayload {
50
+ readonly accept?: string
51
+ readonly multiple?: boolean
52
+ }