@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.
- package/LICENSE +202 -0
- package/README.md +32 -0
- package/dist/index.cjs +12506 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +12269 -0
- package/dist/index.d.ts +12269 -0
- package/dist/index.js +11831 -0
- package/dist/index.js.map +1 -0
- package/package.json +54 -0
- package/src/__tests__/__snapshots__/prompt-builder-segments.test.ts.snap +65 -0
- package/src/__tests__/ai-avatar-pricing.test.ts +321 -0
- package/src/__tests__/apply-video-negative-prompt.test.ts +76 -0
- package/src/__tests__/attach-columns.test.ts +28 -0
- package/src/__tests__/audio-crossfade-curves.test.ts +33 -0
- package/src/__tests__/build-model-menu.test.ts +58 -0
- package/src/__tests__/character-aspect-defaults.test.ts +142 -0
- package/src/__tests__/character-mention-slug.test.ts +199 -0
- package/src/__tests__/character-reference-photo-kinds.test.ts +32 -0
- package/src/__tests__/character-usage-mode.test.ts +147 -0
- package/src/__tests__/character-variant-assets.test.ts +142 -0
- package/src/__tests__/character-voice.test.ts +130 -0
- package/src/__tests__/cinematic-avatar-pricing.test.ts +119 -0
- package/src/__tests__/combine-transitions.test.ts +137 -0
- package/src/__tests__/component-types.test.ts +87 -0
- package/src/__tests__/condition-variables.test.ts +98 -0
- package/src/__tests__/credit-identifiers.test.ts +811 -0
- package/src/__tests__/default-video-provider.test.ts +63 -0
- package/src/__tests__/entity-image-handle.test.ts +43 -0
- package/src/__tests__/entity-variants.test.ts +33 -0
- package/src/__tests__/fal-lip-sync-sets.test.ts +31 -0
- package/src/__tests__/featured-entities.test.ts +33 -0
- package/src/__tests__/film-pricing.test.ts +64 -0
- package/src/__tests__/filter-condition.test.ts +285 -0
- package/src/__tests__/freecut-protocol.test.ts +35 -0
- package/src/__tests__/generate-text-items.test.ts +19 -0
- package/src/__tests__/generated-results.test.ts +50 -0
- package/src/__tests__/graph-utils.test.ts +618 -0
- package/src/__tests__/group-aggregation.test.ts +83 -0
- package/src/__tests__/i18n-locale-completeness.test.ts +156 -0
- package/src/__tests__/image-critic-node.test.ts +86 -0
- package/src/__tests__/image-mask-mode.test.ts +16 -0
- package/src/__tests__/image-ref-limit.test.ts +78 -0
- package/src/__tests__/inpaint-region.test.ts +24 -0
- package/src/__tests__/input-field-map-parity.test.ts +30 -0
- package/src/__tests__/json-evaluator.test.ts +289 -0
- package/src/__tests__/json-path.test.ts +64 -0
- package/src/__tests__/lip-sync-pricing.test.ts +142 -0
- package/src/__tests__/list-merge.test.ts +96 -0
- package/src/__tests__/list-sort.test.ts +134 -0
- package/src/__tests__/llm-models.test.ts +445 -0
- package/src/__tests__/location-mention-slug.test.ts +246 -0
- package/src/__tests__/locations-coverage-critic-schema.test.ts +92 -0
- package/src/__tests__/loop-delimiter.test.ts +39 -0
- package/src/__tests__/lottie-slots.test.ts +245 -0
- package/src/__tests__/model-catalog-flux2-resolutions.test.ts +21 -0
- package/src/__tests__/model-constants-location.test.ts +20 -0
- package/src/__tests__/model-constants.test.ts +122 -0
- package/src/__tests__/model-tree.test.ts +86 -0
- package/src/__tests__/no-internal-imports.test.ts +25 -0
- package/src/__tests__/node-default-mappings.test.ts +175 -0
- package/src/__tests__/node-mappable-fields.test.ts +7 -0
- package/src/__tests__/node-preset-export.test.ts +46 -0
- package/src/__tests__/node-preset-extract.test.ts +166 -0
- package/src/__tests__/node-refs-canonical.test.ts +54 -0
- package/src/__tests__/node-refs-combine.test.ts +54 -0
- package/src/__tests__/node-refs.test.ts +187 -0
- package/src/__tests__/node-runtime-keys.test.ts +99 -0
- package/src/__tests__/object-aspect-defaults.test.ts +59 -0
- package/src/__tests__/parameter-node-value.test.ts +137 -0
- package/src/__tests__/pinterest-url.test.ts +35 -0
- package/src/__tests__/pipeline-chat.test.ts +110 -0
- package/src/__tests__/pipeline-validation.test.ts +98 -0
- package/src/__tests__/presentation-utils.test.ts +1137 -0
- package/src/__tests__/producer-types.test.ts +47 -0
- package/src/__tests__/prompt-length-limits.test.ts +156 -0
- package/src/__tests__/provider-directive-defaults.test.ts +46 -0
- package/src/__tests__/reduce-strategy-registry.test.ts +43 -0
- package/src/__tests__/reference-board-templates.test.ts +33 -0
- package/src/__tests__/reference-roles.test.ts +36 -0
- package/src/__tests__/resolve-field-mappings.test.ts +110 -0
- package/src/__tests__/resolve-pipeline-model.test.ts +76 -0
- package/src/__tests__/scene-node-types.test.ts +80 -0
- package/src/__tests__/scraper-actors.test.ts +67 -0
- package/src/__tests__/seedance-2-catalog.test.ts +18 -0
- package/src/__tests__/seedance-2-credit-id.test.ts +23 -0
- package/src/__tests__/seedance-aspects.test.ts +52 -0
- package/src/__tests__/selector.test.ts +1151 -0
- package/src/__tests__/settled-with-limit.test.ts +214 -0
- package/src/__tests__/social-media-specs.test.ts +129 -0
- package/src/__tests__/sub-workflow-validation.test.ts +88 -0
- package/src/__tests__/switchx-pricing.test.ts +28 -0
- package/src/__tests__/to-connected-references.test.ts +153 -0
- package/src/__tests__/utilities.test.ts +541 -0
- package/src/__tests__/video-analysis-pricing.test.ts +58 -0
- package/src/__tests__/video-analysis.test.ts +63 -0
- package/src/__tests__/video-audio-capability.test.ts +204 -0
- package/src/__tests__/video-gen-providers.test.ts +28 -0
- package/src/__tests__/video-mode-aliases.test.ts +150 -0
- package/src/__tests__/video-ref-limits.test.ts +72 -0
- package/src/__tests__/video-utils.test.ts +303 -0
- package/src/__tests__/voice-changer-models.test.ts +33 -0
- package/src/__tests__/workflow-export-strip.test.ts +46 -0
- package/src/ai-avatar-pricing.ts +213 -0
- package/src/ancestor-refs.ts +48 -0
- package/src/animals.ts +231 -0
- package/src/audio-crossfade-curves.ts +73 -0
- package/src/audio-fx-presets.ts +64 -0
- package/src/avatar-payload-validators.ts +214 -0
- package/src/caption-styles.ts +31 -0
- package/src/character-aspect-defaults.ts +102 -0
- package/src/character-facets.ts +37 -0
- package/src/character-mention-slug.ts +166 -0
- package/src/character-usage-mode.ts +109 -0
- package/src/character-variant-assets.ts +121 -0
- package/src/character-voice.ts +151 -0
- package/src/cinematic-avatar-pricing.ts +111 -0
- package/src/clone-utils.ts +46 -0
- package/src/combine-transitions.ts +482 -0
- package/src/community.ts +112 -0
- package/src/component-types.ts +127 -0
- package/src/condition-variables.ts +65 -0
- package/src/credit-estimators/index.ts +15 -0
- package/src/credit-estimators/video-utils.ts +165 -0
- package/src/credit-identifiers.ts +304 -0
- package/src/entity-approval-types.ts +31 -0
- package/src/entity-aspect-defaults.ts +82 -0
- package/src/entity-asset-types.ts +296 -0
- package/src/entity-image-handle.ts +36 -0
- package/src/extra-refs.ts +139 -0
- package/src/featured-entities.ts +136 -0
- package/src/film-pricing.ts +117 -0
- package/src/filter-condition.ts +250 -0
- package/src/flux2-pricing.ts +18 -0
- package/src/freecut-protocol.ts +52 -0
- package/src/furniture.ts +167 -0
- package/src/generate-text-items.ts +15 -0
- package/src/generated-results.ts +63 -0
- package/src/group-aggregation.ts +75 -0
- package/src/hint-graph-types.ts +18 -0
- package/src/i18n/action-fx.ar.ts +89 -0
- package/src/i18n/action-fx.de.ts +89 -0
- package/src/i18n/action-fx.es.ts +89 -0
- package/src/i18n/action-fx.fr.ts +89 -0
- package/src/i18n/action-fx.he.ts +89 -0
- package/src/i18n/action-fx.hi.ts +89 -0
- package/src/i18n/action-fx.ja.ts +89 -0
- package/src/i18n/action-fx.ko.ts +89 -0
- package/src/i18n/action-fx.pt-BR.ts +89 -0
- package/src/i18n/action-fx.ru.ts +89 -0
- package/src/i18n/action-fx.zh-CN.ts +89 -0
- package/src/i18n/aesthetic.ar.ts +170 -0
- package/src/i18n/aesthetic.de.ts +48 -0
- package/src/i18n/aesthetic.es.ts +169 -0
- package/src/i18n/aesthetic.fr.ts +52 -0
- package/src/i18n/aesthetic.he.ts +169 -0
- package/src/i18n/aesthetic.hi.ts +55 -0
- package/src/i18n/aesthetic.ja.ts +165 -0
- package/src/i18n/aesthetic.ko.ts +169 -0
- package/src/i18n/aesthetic.pt-BR.ts +148 -0
- package/src/i18n/aesthetic.ru.ts +155 -0
- package/src/i18n/aesthetic.zh-CN.ts +172 -0
- package/src/i18n/animals.ar.ts +145 -0
- package/src/i18n/animals.de.ts +144 -0
- package/src/i18n/animals.es.ts +158 -0
- package/src/i18n/animals.fr.ts +144 -0
- package/src/i18n/animals.he.ts +155 -0
- package/src/i18n/animals.hi.ts +157 -0
- package/src/i18n/animals.ja.ts +159 -0
- package/src/i18n/animals.ko.ts +159 -0
- package/src/i18n/animals.pt-BR.ts +157 -0
- package/src/i18n/animals.ru.ts +155 -0
- package/src/i18n/animals.zh-CN.ts +155 -0
- package/src/i18n/atmosphere.ar.ts +49 -0
- package/src/i18n/atmosphere.de.ts +47 -0
- package/src/i18n/atmosphere.es.ts +50 -0
- package/src/i18n/atmosphere.fr.ts +47 -0
- package/src/i18n/atmosphere.he.ts +47 -0
- package/src/i18n/atmosphere.hi.ts +49 -0
- package/src/i18n/atmosphere.ja.ts +49 -0
- package/src/i18n/atmosphere.ko.ts +49 -0
- package/src/i18n/atmosphere.pt-BR.ts +49 -0
- package/src/i18n/atmosphere.ru.ts +47 -0
- package/src/i18n/atmosphere.zh-CN.ts +152 -0
- package/src/i18n/backdrop.ar.ts +53 -0
- package/src/i18n/backdrop.de.ts +46 -0
- package/src/i18n/backdrop.es.ts +54 -0
- package/src/i18n/backdrop.fr.ts +52 -0
- package/src/i18n/backdrop.he.ts +51 -0
- package/src/i18n/backdrop.hi.ts +59 -0
- package/src/i18n/backdrop.ja.ts +61 -0
- package/src/i18n/backdrop.ko.ts +59 -0
- package/src/i18n/backdrop.pt-BR.ts +59 -0
- package/src/i18n/backdrop.ru.ts +57 -0
- package/src/i18n/backdrop.zh-CN.ts +57 -0
- package/src/i18n/camera-format.ar.ts +40 -0
- package/src/i18n/camera-format.de.ts +37 -0
- package/src/i18n/camera-format.es.ts +41 -0
- package/src/i18n/camera-format.fr.ts +37 -0
- package/src/i18n/camera-format.he.ts +37 -0
- package/src/i18n/camera-format.hi.ts +42 -0
- package/src/i18n/camera-format.ja.ts +37 -0
- package/src/i18n/camera-format.ko.ts +37 -0
- package/src/i18n/camera-format.pt-BR.ts +46 -0
- package/src/i18n/camera-format.ru.ts +42 -0
- package/src/i18n/camera-format.zh-CN.ts +42 -0
- package/src/i18n/camera-motions.ar.ts +86 -0
- package/src/i18n/camera-motions.de.ts +74 -0
- package/src/i18n/camera-motions.es.ts +86 -0
- package/src/i18n/camera-motions.fr.ts +86 -0
- package/src/i18n/camera-motions.he.ts +86 -0
- package/src/i18n/camera-motions.hi.ts +99 -0
- package/src/i18n/camera-motions.ja.ts +99 -0
- package/src/i18n/camera-motions.ko.ts +99 -0
- package/src/i18n/camera-motions.pt-BR.ts +99 -0
- package/src/i18n/camera-motions.ru.ts +99 -0
- package/src/i18n/camera-motions.zh-CN.ts +99 -0
- package/src/i18n/character-fx.ar.ts +72 -0
- package/src/i18n/character-fx.de.ts +72 -0
- package/src/i18n/character-fx.es.ts +72 -0
- package/src/i18n/character-fx.fr.ts +72 -0
- package/src/i18n/character-fx.he.ts +72 -0
- package/src/i18n/character-fx.hi.ts +72 -0
- package/src/i18n/character-fx.ja.ts +72 -0
- package/src/i18n/character-fx.ko.ts +72 -0
- package/src/i18n/character-fx.pt-BR.ts +72 -0
- package/src/i18n/character-fx.ru.ts +72 -0
- package/src/i18n/character-fx.zh-CN.ts +72 -0
- package/src/i18n/color-look.ar.ts +50 -0
- package/src/i18n/color-look.de.ts +47 -0
- package/src/i18n/color-look.es.ts +50 -0
- package/src/i18n/color-look.fr.ts +50 -0
- package/src/i18n/color-look.he.ts +49 -0
- package/src/i18n/color-look.hi.ts +52 -0
- package/src/i18n/color-look.ja.ts +54 -0
- package/src/i18n/color-look.ko.ts +54 -0
- package/src/i18n/color-look.pt-BR.ts +54 -0
- package/src/i18n/color-look.ru.ts +52 -0
- package/src/i18n/color-look.zh-CN.ts +53 -0
- package/src/i18n/composition-effects.ar.ts +26 -0
- package/src/i18n/composition-effects.de.ts +25 -0
- package/src/i18n/composition-effects.es.ts +27 -0
- package/src/i18n/composition-effects.fr.ts +25 -0
- package/src/i18n/composition-effects.he.ts +25 -0
- package/src/i18n/composition-effects.hi.ts +27 -0
- package/src/i18n/composition-effects.ja.ts +27 -0
- package/src/i18n/composition-effects.ko.ts +27 -0
- package/src/i18n/composition-effects.pt-BR.ts +25 -0
- package/src/i18n/composition-effects.ru.ts +82 -0
- package/src/i18n/composition-effects.zh-CN.ts +25 -0
- package/src/i18n/era.ar.ts +37 -0
- package/src/i18n/era.de.ts +34 -0
- package/src/i18n/era.es.ts +37 -0
- package/src/i18n/era.fr.ts +37 -0
- package/src/i18n/era.he.ts +36 -0
- package/src/i18n/era.hi.ts +39 -0
- package/src/i18n/era.ja.ts +41 -0
- package/src/i18n/era.ko.ts +39 -0
- package/src/i18n/era.pt-BR.ts +41 -0
- package/src/i18n/era.ru.ts +121 -0
- package/src/i18n/era.zh-CN.ts +39 -0
- package/src/i18n/exposure-settings.ar.ts +28 -0
- package/src/i18n/exposure-settings.de.ts +26 -0
- package/src/i18n/exposure-settings.es.ts +28 -0
- package/src/i18n/exposure-settings.fr.ts +29 -0
- package/src/i18n/exposure-settings.he.ts +28 -0
- package/src/i18n/exposure-settings.hi.ts +31 -0
- package/src/i18n/exposure-settings.ja.ts +31 -0
- package/src/i18n/exposure-settings.ko.ts +31 -0
- package/src/i18n/exposure-settings.pt-BR.ts +31 -0
- package/src/i18n/exposure-settings.ru.ts +31 -0
- package/src/i18n/exposure-settings.zh-CN.ts +31 -0
- package/src/i18n/framing.ar.ts +78 -0
- package/src/i18n/framing.de.ts +73 -0
- package/src/i18n/framing.es.ts +78 -0
- package/src/i18n/framing.fr.ts +78 -0
- package/src/i18n/framing.he.ts +77 -0
- package/src/i18n/framing.hi.ts +82 -0
- package/src/i18n/framing.ja.ts +84 -0
- package/src/i18n/framing.ko.ts +82 -0
- package/src/i18n/framing.pt-BR.ts +84 -0
- package/src/i18n/framing.ru.ts +82 -0
- package/src/i18n/framing.zh-CN.ts +82 -0
- package/src/i18n/furniture.ar.ts +92 -0
- package/src/i18n/furniture.de.ts +93 -0
- package/src/i18n/furniture.es.ts +101 -0
- package/src/i18n/furniture.fr.ts +93 -0
- package/src/i18n/furniture.he.ts +101 -0
- package/src/i18n/furniture.hi.ts +101 -0
- package/src/i18n/furniture.ja.ts +101 -0
- package/src/i18n/furniture.ko.ts +101 -0
- package/src/i18n/furniture.pt-BR.ts +101 -0
- package/src/i18n/furniture.ru.ts +101 -0
- package/src/i18n/furniture.zh-CN.ts +101 -0
- package/src/i18n/held-prop.ar.ts +74 -0
- package/src/i18n/held-prop.de.ts +65 -0
- package/src/i18n/held-prop.es.ts +83 -0
- package/src/i18n/held-prop.fr.ts +74 -0
- package/src/i18n/held-prop.he.ts +73 -0
- package/src/i18n/held-prop.hi.ts +82 -0
- package/src/i18n/held-prop.ja.ts +84 -0
- package/src/i18n/held-prop.ko.ts +84 -0
- package/src/i18n/held-prop.pt-BR.ts +84 -0
- package/src/i18n/held-prop.ru.ts +82 -0
- package/src/i18n/held-prop.zh-CN.ts +82 -0
- package/src/i18n/index.ts +208 -0
- package/src/i18n/instrumentation.ar.ts +195 -0
- package/src/i18n/instrumentation.de.ts +195 -0
- package/src/i18n/instrumentation.es.ts +195 -0
- package/src/i18n/instrumentation.fr.ts +195 -0
- package/src/i18n/instrumentation.he.ts +195 -0
- package/src/i18n/instrumentation.hi.ts +195 -0
- package/src/i18n/instrumentation.ja.ts +195 -0
- package/src/i18n/instrumentation.ko.ts +195 -0
- package/src/i18n/instrumentation.pt-BR.ts +195 -0
- package/src/i18n/instrumentation.ru.ts +195 -0
- package/src/i18n/instrumentation.zh-CN.ts +195 -0
- package/src/i18n/lens.ar.ts +24 -0
- package/src/i18n/lens.de.ts +24 -0
- package/src/i18n/lens.es.ts +24 -0
- package/src/i18n/lens.fr.ts +24 -0
- package/src/i18n/lens.he.ts +24 -0
- package/src/i18n/lens.hi.ts +24 -0
- package/src/i18n/lens.ja.ts +24 -0
- package/src/i18n/lens.ko.ts +24 -0
- package/src/i18n/lens.pt-BR.ts +24 -0
- package/src/i18n/lens.ru.ts +25 -0
- package/src/i18n/lens.zh-CN.ts +24 -0
- package/src/i18n/lighting.ar.ts +86 -0
- package/src/i18n/lighting.de.ts +84 -0
- package/src/i18n/lighting.es.ts +89 -0
- package/src/i18n/lighting.fr.ts +84 -0
- package/src/i18n/lighting.he.ts +88 -0
- package/src/i18n/lighting.hi.ts +90 -0
- package/src/i18n/lighting.ja.ts +90 -0
- package/src/i18n/lighting.ko.ts +90 -0
- package/src/i18n/lighting.pt-BR.ts +90 -0
- package/src/i18n/lighting.ru.ts +88 -0
- package/src/i18n/lighting.zh-CN.ts +92 -0
- package/src/i18n/loop-subject.ar.ts +39 -0
- package/src/i18n/loop-subject.de.ts +39 -0
- package/src/i18n/loop-subject.es.ts +39 -0
- package/src/i18n/loop-subject.fr.ts +39 -0
- package/src/i18n/loop-subject.he.ts +39 -0
- package/src/i18n/loop-subject.hi.ts +39 -0
- package/src/i18n/loop-subject.ja.ts +39 -0
- package/src/i18n/loop-subject.ko.ts +39 -0
- package/src/i18n/loop-subject.pt-BR.ts +39 -0
- package/src/i18n/loop-subject.ru.ts +39 -0
- package/src/i18n/loop-subject.zh-CN.ts +39 -0
- package/src/i18n/materials.ar.ts +80 -0
- package/src/i18n/materials.de.ts +80 -0
- package/src/i18n/materials.es.ts +87 -0
- package/src/i18n/materials.fr.ts +80 -0
- package/src/i18n/materials.he.ts +86 -0
- package/src/i18n/materials.hi.ts +86 -0
- package/src/i18n/materials.ja.ts +88 -0
- package/src/i18n/materials.ko.ts +88 -0
- package/src/i18n/materials.pt-BR.ts +88 -0
- package/src/i18n/materials.ru.ts +86 -0
- package/src/i18n/materials.zh-CN.ts +86 -0
- package/src/i18n/mood.ar.ts +61 -0
- package/src/i18n/mood.de.ts +61 -0
- package/src/i18n/mood.es.ts +66 -0
- package/src/i18n/mood.fr.ts +61 -0
- package/src/i18n/mood.he.ts +64 -0
- package/src/i18n/mood.hi.ts +66 -0
- package/src/i18n/mood.ja.ts +66 -0
- package/src/i18n/mood.ko.ts +66 -0
- package/src/i18n/mood.pt-BR.ts +64 -0
- package/src/i18n/mood.ru.ts +64 -0
- package/src/i18n/mood.zh-CN.ts +64 -0
- package/src/i18n/music-genre.ar.ts +302 -0
- package/src/i18n/music-genre.de.ts +302 -0
- package/src/i18n/music-genre.es.ts +302 -0
- package/src/i18n/music-genre.fr.ts +302 -0
- package/src/i18n/music-genre.he.ts +302 -0
- package/src/i18n/music-genre.hi.ts +302 -0
- package/src/i18n/music-genre.ja.ts +302 -0
- package/src/i18n/music-genre.ko.ts +302 -0
- package/src/i18n/music-genre.pt-BR.ts +302 -0
- package/src/i18n/music-genre.ru.ts +302 -0
- package/src/i18n/music-genre.zh-CN.ts +302 -0
- package/src/i18n/music-mood.ar.ts +75 -0
- package/src/i18n/music-mood.de.ts +75 -0
- package/src/i18n/music-mood.es.ts +75 -0
- package/src/i18n/music-mood.fr.ts +75 -0
- package/src/i18n/music-mood.he.ts +75 -0
- package/src/i18n/music-mood.hi.ts +75 -0
- package/src/i18n/music-mood.ja.ts +75 -0
- package/src/i18n/music-mood.ko.ts +75 -0
- package/src/i18n/music-mood.pt-BR.ts +75 -0
- package/src/i18n/music-mood.ru.ts +75 -0
- package/src/i18n/music-mood.zh-CN.ts +75 -0
- package/src/i18n/person.ar.ts +638 -0
- package/src/i18n/person.de.ts +629 -0
- package/src/i18n/person.es.ts +645 -0
- package/src/i18n/person.fr.ts +621 -0
- package/src/i18n/person.he.ts +656 -0
- package/src/i18n/person.hi.ts +654 -0
- package/src/i18n/person.ja.ts +662 -0
- package/src/i18n/person.ko.ts +662 -0
- package/src/i18n/person.pt-BR.ts +656 -0
- package/src/i18n/person.ru.ts +656 -0
- package/src/i18n/person.zh-CN.ts +656 -0
- package/src/i18n/photo-genre.ar.ts +58 -0
- package/src/i18n/photo-genre.de.ts +52 -0
- package/src/i18n/photo-genre.es.ts +64 -0
- package/src/i18n/photo-genre.fr.ts +58 -0
- package/src/i18n/photo-genre.he.ts +62 -0
- package/src/i18n/photo-genre.hi.ts +63 -0
- package/src/i18n/photo-genre.ja.ts +65 -0
- package/src/i18n/photo-genre.ko.ts +63 -0
- package/src/i18n/photo-genre.pt-BR.ts +65 -0
- package/src/i18n/photo-genre.ru.ts +63 -0
- package/src/i18n/photo-genre.zh-CN.ts +63 -0
- package/src/i18n/photographer.ar.ts +75 -0
- package/src/i18n/photographer.de.ts +74 -0
- package/src/i18n/photographer.es.ts +77 -0
- package/src/i18n/photographer.fr.ts +77 -0
- package/src/i18n/photographer.he.ts +78 -0
- package/src/i18n/photographer.hi.ts +80 -0
- package/src/i18n/photographer.ja.ts +84 -0
- package/src/i18n/photographer.ko.ts +84 -0
- package/src/i18n/photographer.pt-BR.ts +83 -0
- package/src/i18n/photographer.ru.ts +78 -0
- package/src/i18n/photographer.zh-CN.ts +78 -0
- package/src/i18n/pose.ar.ts +95 -0
- package/src/i18n/pose.de.ts +96 -0
- package/src/i18n/pose.es.ts +104 -0
- package/src/i18n/pose.fr.ts +96 -0
- package/src/i18n/pose.he.ts +104 -0
- package/src/i18n/pose.hi.ts +104 -0
- package/src/i18n/pose.ja.ts +104 -0
- package/src/i18n/pose.ko.ts +104 -0
- package/src/i18n/pose.pt-BR.ts +104 -0
- package/src/i18n/pose.ru.ts +104 -0
- package/src/i18n/pose.zh-CN.ts +104 -0
- package/src/i18n/post-process-effects.ar.ts +25 -0
- package/src/i18n/post-process-effects.de.ts +24 -0
- package/src/i18n/post-process-effects.es.ts +26 -0
- package/src/i18n/post-process-effects.fr.ts +24 -0
- package/src/i18n/post-process-effects.he.ts +24 -0
- package/src/i18n/post-process-effects.hi.ts +26 -0
- package/src/i18n/post-process-effects.ja.ts +26 -0
- package/src/i18n/post-process-effects.ko.ts +26 -0
- package/src/i18n/post-process-effects.pt-BR.ts +24 -0
- package/src/i18n/post-process-effects.ru.ts +24 -0
- package/src/i18n/post-process-effects.zh-CN.ts +24 -0
- package/src/i18n/render-quality.ar.ts +34 -0
- package/src/i18n/render-quality.de.ts +30 -0
- package/src/i18n/render-quality.es.ts +35 -0
- package/src/i18n/render-quality.fr.ts +34 -0
- package/src/i18n/render-quality.he.ts +33 -0
- package/src/i18n/render-quality.hi.ts +39 -0
- package/src/i18n/render-quality.ja.ts +39 -0
- package/src/i18n/render-quality.ko.ts +39 -0
- package/src/i18n/render-quality.pt-BR.ts +37 -0
- package/src/i18n/render-quality.ru.ts +37 -0
- package/src/i18n/render-quality.zh-CN.ts +37 -0
- package/src/i18n/seasons.ar.ts +10 -0
- package/src/i18n/seasons.de.ts +10 -0
- package/src/i18n/seasons.es.ts +10 -0
- package/src/i18n/seasons.fr.ts +10 -0
- package/src/i18n/seasons.he.ts +10 -0
- package/src/i18n/seasons.hi.ts +10 -0
- package/src/i18n/seasons.ja.ts +10 -0
- package/src/i18n/seasons.ko.ts +10 -0
- package/src/i18n/seasons.pt-BR.ts +10 -0
- package/src/i18n/seasons.ru.ts +10 -0
- package/src/i18n/seasons.zh-CN.ts +10 -0
- package/src/i18n/setting.ar.ts +73 -0
- package/src/i18n/setting.de.ts +73 -0
- package/src/i18n/setting.es.ts +77 -0
- package/src/i18n/setting.fr.ts +73 -0
- package/src/i18n/setting.he.ts +76 -0
- package/src/i18n/setting.hi.ts +76 -0
- package/src/i18n/setting.ja.ts +78 -0
- package/src/i18n/setting.ko.ts +76 -0
- package/src/i18n/setting.pt-BR.ts +78 -0
- package/src/i18n/setting.ru.ts +76 -0
- package/src/i18n/setting.zh-CN.ts +76 -0
- package/src/i18n/style.ar.ts +55 -0
- package/src/i18n/style.de.ts +54 -0
- package/src/i18n/style.es.ts +54 -0
- package/src/i18n/style.fr.ts +54 -0
- package/src/i18n/style.he.ts +54 -0
- package/src/i18n/style.hi.ts +54 -0
- package/src/i18n/style.ja.ts +54 -0
- package/src/i18n/style.ko.ts +54 -0
- package/src/i18n/style.pt-BR.ts +56 -0
- package/src/i18n/style.ru.ts +54 -0
- package/src/i18n/style.zh-CN.ts +54 -0
- package/src/i18n/styling.ar.ts +295 -0
- package/src/i18n/styling.de.ts +285 -0
- package/src/i18n/styling.es.ts +317 -0
- package/src/i18n/styling.fr.ts +285 -0
- package/src/i18n/styling.he.ts +307 -0
- package/src/i18n/styling.hi.ts +323 -0
- package/src/i18n/styling.ja.ts +317 -0
- package/src/i18n/styling.ko.ts +311 -0
- package/src/i18n/styling.pt-BR.ts +301 -0
- package/src/i18n/styling.ru.ts +301 -0
- package/src/i18n/styling.zh-CN.ts +307 -0
- package/src/i18n/temporal.ar.ts +31 -0
- package/src/i18n/temporal.de.ts +24 -0
- package/src/i18n/temporal.es.ts +27 -0
- package/src/i18n/temporal.fr.ts +28 -0
- package/src/i18n/temporal.he.ts +31 -0
- package/src/i18n/temporal.hi.ts +31 -0
- package/src/i18n/temporal.ja.ts +31 -0
- package/src/i18n/temporal.ko.ts +31 -0
- package/src/i18n/temporal.pt-BR.ts +31 -0
- package/src/i18n/temporal.ru.ts +31 -0
- package/src/i18n/temporal.zh-CN.ts +31 -0
- package/src/i18n/transitions.ar.ts +97 -0
- package/src/i18n/transitions.de.ts +97 -0
- package/src/i18n/transitions.es.ts +97 -0
- package/src/i18n/transitions.fr.ts +97 -0
- package/src/i18n/transitions.he.ts +97 -0
- package/src/i18n/transitions.hi.ts +97 -0
- package/src/i18n/transitions.ja.ts +97 -0
- package/src/i18n/transitions.ko.ts +97 -0
- package/src/i18n/transitions.pt-BR.ts +97 -0
- package/src/i18n/transitions.ru.ts +97 -0
- package/src/i18n/transitions.zh-CN.ts +97 -0
- package/src/i18n/types.ts +158 -0
- package/src/i18n/vehicles.ar.ts +137 -0
- package/src/i18n/vehicles.de.ts +125 -0
- package/src/i18n/vehicles.es.ts +138 -0
- package/src/i18n/vehicles.fr.ts +125 -0
- package/src/i18n/vehicles.he.ts +136 -0
- package/src/i18n/vehicles.hi.ts +138 -0
- package/src/i18n/vehicles.ja.ts +138 -0
- package/src/i18n/vehicles.ko.ts +138 -0
- package/src/i18n/vehicles.pt-BR.ts +136 -0
- package/src/i18n/vehicles.ru.ts +136 -0
- package/src/i18n/vehicles.zh-CN.ts +136 -0
- package/src/i18n/voice-character.ar.ts +126 -0
- package/src/i18n/voice-character.de.ts +126 -0
- package/src/i18n/voice-character.es.ts +126 -0
- package/src/i18n/voice-character.fr.ts +126 -0
- package/src/i18n/voice-character.he.ts +126 -0
- package/src/i18n/voice-character.hi.ts +126 -0
- package/src/i18n/voice-character.ja.ts +126 -0
- package/src/i18n/voice-character.ko.ts +126 -0
- package/src/i18n/voice-character.pt-BR.ts +126 -0
- package/src/i18n/voice-character.ru.ts +126 -0
- package/src/i18n/voice-character.zh-CN.ts +126 -0
- package/src/i18n/voice-delivery.ar.ts +77 -0
- package/src/i18n/voice-delivery.de.ts +77 -0
- package/src/i18n/voice-delivery.es.ts +77 -0
- package/src/i18n/voice-delivery.fr.ts +77 -0
- package/src/i18n/voice-delivery.he.ts +77 -0
- package/src/i18n/voice-delivery.hi.ts +77 -0
- package/src/i18n/voice-delivery.ja.ts +77 -0
- package/src/i18n/voice-delivery.ko.ts +77 -0
- package/src/i18n/voice-delivery.pt-BR.ts +77 -0
- package/src/i18n/voice-delivery.ru.ts +77 -0
- package/src/i18n/voice-delivery.zh-CN.ts +77 -0
- package/src/i18n/weapons.ar.ts +115 -0
- package/src/i18n/weapons.de.ts +114 -0
- package/src/i18n/weapons.es.ts +116 -0
- package/src/i18n/weapons.fr.ts +103 -0
- package/src/i18n/weapons.he.ts +114 -0
- package/src/i18n/weapons.hi.ts +116 -0
- package/src/i18n/weapons.ja.ts +116 -0
- package/src/i18n/weapons.ko.ts +116 -0
- package/src/i18n/weapons.pt-BR.ts +114 -0
- package/src/i18n/weapons.ru.ts +114 -0
- package/src/i18n/weapons.zh-CN.ts +114 -0
- package/src/image-critic-node.ts +61 -0
- package/src/image-critic-types.ts +40 -0
- package/src/index.ts +866 -0
- package/src/inject-upstream.ts +15 -0
- package/src/inpaint-region.ts +51 -0
- package/src/json-evaluator.ts +732 -0
- package/src/json-path.ts +52 -0
- package/src/lip-sync-pricing.ts +90 -0
- package/src/list-merge.ts +40 -0
- package/src/list-sort.ts +122 -0
- package/src/list-source-resolver.ts +50 -0
- package/src/llm-models.ts +245 -0
- package/src/location-mention-slug.ts +291 -0
- package/src/location-preset-catalog-map.ts +128 -0
- package/src/loop-delimiter.ts +73 -0
- package/src/lora-routing.ts +95 -0
- package/src/lottie-overlay-catalog.ts +175 -0
- package/src/lottie-slots.ts +309 -0
- package/src/model-catalog.ts +2386 -0
- package/src/model-constants.ts +1910 -0
- package/src/model-tree.ts +120 -0
- package/src/monetization.ts +15 -0
- package/src/multi-pick.ts +42 -0
- package/src/node-default-mappings.ts +262 -0
- package/src/node-mappable-fields.ts +70 -0
- package/src/node-preset-export.ts +56 -0
- package/src/node-preset-extract.ts +147 -0
- package/src/node-refs.ts +253 -0
- package/src/node-runtime-keys.ts +117 -0
- package/src/object-aspect-defaults.ts +72 -0
- package/src/object-picker-types.ts +22 -0
- package/src/parameter-node-value.ts +284 -0
- package/src/pinterest-url.ts +28 -0
- package/src/pipeline-chat.ts +72 -0
- package/src/pipeline-defaults.ts +318 -0
- package/src/pipeline-events.ts +162 -0
- package/src/pipeline-state-types.ts +196 -0
- package/src/pipeline-types.ts +647 -0
- package/src/pipeline-validation.ts +87 -0
- package/src/presentation-types.ts +23 -0
- package/src/presentation-utils.ts +397 -0
- package/src/producer-types.ts +188 -0
- package/src/progress-curve.ts +99 -0
- package/src/provider-directive-defaults.ts +69 -0
- package/src/reduce-strategy-registry.ts +121 -0
- package/src/reference-board-templates.ts +81 -0
- package/src/reference-roles.ts +153 -0
- package/src/reference-sheet/__tests__/board-to-column.test.ts +20 -0
- package/src/reference-sheet/__tests__/catalog.test.ts +50 -0
- package/src/reference-sheet/__tests__/cost.test.ts +38 -0
- package/src/reference-sheet/__tests__/no-drift.test.ts +28 -0
- package/src/reference-sheet/__tests__/panel-plan.test.ts +61 -0
- package/src/reference-sheet/__tests__/panel-prompts.test.ts +17 -0
- package/src/reference-sheet/__tests__/plan-generation.test.ts +72 -0
- package/src/reference-sheet/__tests__/presets.test.ts +54 -0
- package/src/reference-sheet/__tests__/types.test.ts +24 -0
- package/src/reference-sheet/catalog.ts +144 -0
- package/src/reference-sheet/cost.ts +37 -0
- package/src/reference-sheet/credit-id.ts +7 -0
- package/src/reference-sheet/index.ts +8 -0
- package/src/reference-sheet/panel-plan.ts +65 -0
- package/src/reference-sheet/panel-prompts.ts +14 -0
- package/src/reference-sheet/plan-generation.ts +79 -0
- package/src/reference-sheet/presets.ts +77 -0
- package/src/reference-sheet/types.ts +92 -0
- package/src/repeat-types.ts +97 -0
- package/src/resolve-field-mappings.ts +119 -0
- package/src/route-filter.ts +80 -0
- package/src/scene-helper-types.ts +249 -0
- package/src/scene-node-types.ts +281 -0
- package/src/scraper-actors.ts +57 -0
- package/src/scraper-output-schemas.ts +25 -0
- package/src/seasons.ts +45 -0
- package/src/selector.ts +864 -0
- package/src/settled-with-limit.ts +42 -0
- package/src/shot-element.ts +43 -0
- package/src/social-media-specs.ts +121 -0
- package/src/social-post.ts +24 -0
- package/src/sub-workflow-validation.ts +78 -0
- package/src/supported-fonts.ts +40 -0
- package/src/surround.ts +113 -0
- package/src/switchx-pricing.ts +33 -0
- package/src/text-separators.ts +59 -0
- package/src/to-connected-references.ts +77 -0
- package/src/types.ts +272 -0
- package/src/variant-job-id.ts +17 -0
- package/src/vehicles.ts +213 -0
- package/src/video-analysis-pricing.ts +74 -0
- package/src/video-analysis.ts +127 -0
- package/src/video-duration.ts +25 -0
- package/src/voice-changer-models.ts +36 -0
- package/src/voice-matcher-types.ts +37 -0
- package/src/voices.ts +92 -0
- package/src/weapons.ts +190 -0
- 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
|
+
}
|