@nodaro/shared 1.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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,284 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Read the "primary value" of a parameter node directly from its data.
|
|
3
|
+
*
|
|
4
|
+
* Parameter nodes (framing, camera-motion, motion, tone, etc.) are pickers on
|
|
5
|
+
* canvas — they don't execute, so they produce no NodeExecutionState.output on
|
|
6
|
+
* the backend. Both the frontend extractNodeOutput fallthrough and the backend
|
|
7
|
+
* resolver adapter call this when a mapped source is a parameter node, so that
|
|
8
|
+
* fieldMappings on non-text fields (framing, cameraMotion, etc.) resolve
|
|
9
|
+
* correctly at execution time.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
export const PARAMETER_NODE_TYPES: ReadonlySet<string> = new Set([
|
|
13
|
+
"text-prompt",
|
|
14
|
+
"tone",
|
|
15
|
+
"style-guide",
|
|
16
|
+
"motion",
|
|
17
|
+
"camera-motion",
|
|
18
|
+
"framing",
|
|
19
|
+
"lens",
|
|
20
|
+
"camera-format",
|
|
21
|
+
"lighting",
|
|
22
|
+
"color-look",
|
|
23
|
+
"atmosphere",
|
|
24
|
+
"style",
|
|
25
|
+
"setting",
|
|
26
|
+
"person",
|
|
27
|
+
"mood",
|
|
28
|
+
"photographer",
|
|
29
|
+
"aesthetic",
|
|
30
|
+
"era",
|
|
31
|
+
"pose",
|
|
32
|
+
"styling",
|
|
33
|
+
"temporal",
|
|
34
|
+
"material",
|
|
35
|
+
"animal",
|
|
36
|
+
"vehicle",
|
|
37
|
+
"weapon",
|
|
38
|
+
"furniture",
|
|
39
|
+
"photo-genre",
|
|
40
|
+
"backdrop",
|
|
41
|
+
"held-prop",
|
|
42
|
+
"exposure-settings",
|
|
43
|
+
"render-quality",
|
|
44
|
+
"composition-effects",
|
|
45
|
+
"post-process-effects",
|
|
46
|
+
"action-fx",
|
|
47
|
+
"character-fx",
|
|
48
|
+
"transition",
|
|
49
|
+
"loop-subject",
|
|
50
|
+
"scene-count",
|
|
51
|
+
"duration",
|
|
52
|
+
"aspect-ratio",
|
|
53
|
+
"music-genre",
|
|
54
|
+
"music-mood",
|
|
55
|
+
"instrumentation",
|
|
56
|
+
"voice-character",
|
|
57
|
+
"voice-delivery",
|
|
58
|
+
])
|
|
59
|
+
|
|
60
|
+
export function getParameterValue(
|
|
61
|
+
data: Record<string, unknown>,
|
|
62
|
+
nodeType: string,
|
|
63
|
+
): string | undefined {
|
|
64
|
+
switch (nodeType) {
|
|
65
|
+
case "text-prompt":
|
|
66
|
+
return trim(data.text)
|
|
67
|
+
case "tone":
|
|
68
|
+
return trim(data.tone)
|
|
69
|
+
case "style-guide":
|
|
70
|
+
return trim(data.text)
|
|
71
|
+
case "motion":
|
|
72
|
+
return trim(data.motion)
|
|
73
|
+
case "camera-motion":
|
|
74
|
+
return trim(data.cameraMotion)
|
|
75
|
+
case "framing":
|
|
76
|
+
// Multi-category: return the first set per-category value (used for
|
|
77
|
+
// single-string field-mapping resolution; full hint composition goes
|
|
78
|
+
// through buildFramingHints in the executors).
|
|
79
|
+
return (
|
|
80
|
+
trim(data.shotSize) ??
|
|
81
|
+
trim(data.angle) ??
|
|
82
|
+
trim(data.coverage) ??
|
|
83
|
+
trim(data.composition) ??
|
|
84
|
+
trim(data.vantage)
|
|
85
|
+
)
|
|
86
|
+
case "lens":
|
|
87
|
+
return trim(data.lens)
|
|
88
|
+
case "camera-format":
|
|
89
|
+
return trim(data.cameraFormat)
|
|
90
|
+
case "lighting":
|
|
91
|
+
// Multi-category: return the first set per-category value (used for
|
|
92
|
+
// single-string field-mapping resolution; full hint composition goes
|
|
93
|
+
// through buildLightingHints in the executors).
|
|
94
|
+
return (
|
|
95
|
+
trim(data.timeOfDay) ??
|
|
96
|
+
trim(data.lightingStyle) ??
|
|
97
|
+
trim(data.lightingDirection) ??
|
|
98
|
+
trim(data.lightingRatio) ??
|
|
99
|
+
trim(data.colorTemperature)
|
|
100
|
+
)
|
|
101
|
+
case "color-look":
|
|
102
|
+
return trim(data.colorLook)
|
|
103
|
+
case "music-genre":
|
|
104
|
+
return trim(data.subgenre) ?? trim(data.genre) ?? trim(data.era)
|
|
105
|
+
case "music-mood":
|
|
106
|
+
return trim(data.emotion) ?? trim(data.energy) ?? trim(data.vibe)
|
|
107
|
+
case "instrumentation":
|
|
108
|
+
return (
|
|
109
|
+
trim(data.production) ??
|
|
110
|
+
trim(data.instruments) ??
|
|
111
|
+
trim(data.vocalPresence) ??
|
|
112
|
+
trim(data.singingStyle)
|
|
113
|
+
)
|
|
114
|
+
case "voice-character":
|
|
115
|
+
return (
|
|
116
|
+
trim(data.timbre) ??
|
|
117
|
+
trim(data.accent) ??
|
|
118
|
+
trim(data.language) ??
|
|
119
|
+
trim(data.gender) ??
|
|
120
|
+
trim(data.age)
|
|
121
|
+
)
|
|
122
|
+
case "voice-delivery":
|
|
123
|
+
return trim(data.archetype) ?? trim(data.emotion) ?? trim(data.pace)
|
|
124
|
+
case "atmosphere":
|
|
125
|
+
return trim(data.atmosphere)
|
|
126
|
+
case "action-fx":
|
|
127
|
+
return trim(data.actionFx)
|
|
128
|
+
case "character-fx":
|
|
129
|
+
return trim(data.characterFx)
|
|
130
|
+
case "transition":
|
|
131
|
+
return trim(data.transition)
|
|
132
|
+
case "style":
|
|
133
|
+
return trim(data.style)
|
|
134
|
+
case "setting":
|
|
135
|
+
return trim(data.setting)
|
|
136
|
+
case "loop-subject":
|
|
137
|
+
return trim(data.loopSubject)
|
|
138
|
+
case "material":
|
|
139
|
+
return trim(data.material)
|
|
140
|
+
case "animal":
|
|
141
|
+
return trim(data.animal)
|
|
142
|
+
case "vehicle":
|
|
143
|
+
return trim(data.vehicle)
|
|
144
|
+
case "weapon":
|
|
145
|
+
return trim(data.weapon)
|
|
146
|
+
case "furniture":
|
|
147
|
+
return trim(data.furniture)
|
|
148
|
+
case "photo-genre":
|
|
149
|
+
return trim(data.photoGenre)
|
|
150
|
+
case "backdrop":
|
|
151
|
+
return trim(data.backdrop)
|
|
152
|
+
case "held-prop":
|
|
153
|
+
return trim(data.heldProp)
|
|
154
|
+
case "person":
|
|
155
|
+
// Multi-dimension: return the first set per-dimension value (used for
|
|
156
|
+
// single-string field-mapping resolution; full hint composition goes
|
|
157
|
+
// through buildPersonHints in the executors).
|
|
158
|
+
return (
|
|
159
|
+
trim(data.type) ??
|
|
160
|
+
trim(data.age) ??
|
|
161
|
+
trim(data.ethnicity) ??
|
|
162
|
+
trim(data.regionalAesthetic) ??
|
|
163
|
+
trim(data.frame) ??
|
|
164
|
+
trim(data.bodyMass) ??
|
|
165
|
+
trim(data.bust) ??
|
|
166
|
+
trim(data.waist) ??
|
|
167
|
+
trim(data.hips) ??
|
|
168
|
+
trim(data.silhouette) ??
|
|
169
|
+
trim(data.faceShape) ??
|
|
170
|
+
trim(data.jawline) ??
|
|
171
|
+
trim(data.cheekbones) ??
|
|
172
|
+
trim(data.facialFullness) ??
|
|
173
|
+
trim(data.eyeShape) ??
|
|
174
|
+
trim(data.eyelidType) ??
|
|
175
|
+
trim(data.canthalTilt) ??
|
|
176
|
+
trim(data.eyeSpacing) ??
|
|
177
|
+
trim(data.eyeSetBrow) ??
|
|
178
|
+
trim(data.nose) ??
|
|
179
|
+
trim(data.noseTip) ??
|
|
180
|
+
trim(data.lipFullness) ??
|
|
181
|
+
trim(data.lipShape) ??
|
|
182
|
+
trim(data.lips) ??
|
|
183
|
+
trim(data.hairColor) ??
|
|
184
|
+
trim(data.hairBase) ??
|
|
185
|
+
trim(data.eyebrows) ??
|
|
186
|
+
trim(data.skinTone) ??
|
|
187
|
+
trim(data.skinTexture) ??
|
|
188
|
+
trim(data.eyeColor) ??
|
|
189
|
+
trim(data.facialHair) ??
|
|
190
|
+
trim(data.distinctiveFeature) ??
|
|
191
|
+
trim(data.lipState) ??
|
|
192
|
+
trim(data.eyeState)
|
|
193
|
+
)
|
|
194
|
+
case "mood":
|
|
195
|
+
return trim(data.mood)
|
|
196
|
+
case "photographer":
|
|
197
|
+
return trim(data.photographer)
|
|
198
|
+
case "aesthetic":
|
|
199
|
+
return trim(data.aesthetic)
|
|
200
|
+
case "era":
|
|
201
|
+
return trim(data.era)
|
|
202
|
+
case "pose":
|
|
203
|
+
return (
|
|
204
|
+
trim(data.pose) ??
|
|
205
|
+
trim(data.handPosition) ??
|
|
206
|
+
trim(data.bodyLean) ??
|
|
207
|
+
trim(data.headTilt) ??
|
|
208
|
+
trim(data.activity)
|
|
209
|
+
)
|
|
210
|
+
case "styling":
|
|
211
|
+
// Multi-dimension: return the first set per-dimension value (used for
|
|
212
|
+
// single-string field-mapping resolution; full hint composition goes
|
|
213
|
+
// through buildStylingHints in the executors).
|
|
214
|
+
return (
|
|
215
|
+
trim(data.makeup) ??
|
|
216
|
+
trim(data.hairCut) ??
|
|
217
|
+
trim(data.hairTreatment) ??
|
|
218
|
+
trim(data.hairState) ??
|
|
219
|
+
trim(data.eyewear) ??
|
|
220
|
+
trim(data.headwear) ??
|
|
221
|
+
trim(data.jewelry) ??
|
|
222
|
+
trim(data.nails) ??
|
|
223
|
+
trim(data.facePaint) ??
|
|
224
|
+
trim(data.outfit) ??
|
|
225
|
+
trim(data.top) ??
|
|
226
|
+
trim(data.bottom) ??
|
|
227
|
+
trim(data.outerwear) ??
|
|
228
|
+
trim(data.legwear) ??
|
|
229
|
+
trim(data.footwear) ??
|
|
230
|
+
trim(data.fabric) ??
|
|
231
|
+
trim(data.wardrobeState)
|
|
232
|
+
)
|
|
233
|
+
case "temporal":
|
|
234
|
+
// Multi-category: return the first set per-category value (used for
|
|
235
|
+
// single-string field-mapping resolution; full hint composition goes
|
|
236
|
+
// through buildTemporalHints in the executors).
|
|
237
|
+
return (
|
|
238
|
+
trim(data.temporalSpeed) ??
|
|
239
|
+
trim(data.temporalFreeze) ??
|
|
240
|
+
trim(data.temporalDirection) ??
|
|
241
|
+
trim(data.temporalShutter)
|
|
242
|
+
)
|
|
243
|
+
case "exposure-settings":
|
|
244
|
+
return (
|
|
245
|
+
trim(data.aperture) ??
|
|
246
|
+
trim(data.shutterSpeed) ??
|
|
247
|
+
trim(data.isoValue)
|
|
248
|
+
)
|
|
249
|
+
case "render-quality":
|
|
250
|
+
return trim(data.renderQuality)
|
|
251
|
+
case "composition-effects":
|
|
252
|
+
return trim(data.compositionEffect)
|
|
253
|
+
case "post-process-effects":
|
|
254
|
+
return trim(data.postProcess)
|
|
255
|
+
case "scene-count":
|
|
256
|
+
return data.count != null ? String(data.count) : undefined
|
|
257
|
+
case "duration":
|
|
258
|
+
return data.seconds != null ? String(data.seconds) : undefined
|
|
259
|
+
case "aspect-ratio":
|
|
260
|
+
return trim(data.ratio)
|
|
261
|
+
default:
|
|
262
|
+
return undefined
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
function trim(v: unknown): string | undefined {
|
|
267
|
+
if (typeof v === "string") {
|
|
268
|
+
const s = v.trim()
|
|
269
|
+
return s.length > 0 ? s : undefined
|
|
270
|
+
}
|
|
271
|
+
// Multi-pick fields (ethnicity, mood, aesthetic) may be a string[]. The
|
|
272
|
+
// single-string field-mapping resolver only needs *some* value to indicate
|
|
273
|
+
// the field is set — return the first non-empty entry.
|
|
274
|
+
if (Array.isArray(v)) {
|
|
275
|
+
for (const item of v) {
|
|
276
|
+
if (typeof item === "string") {
|
|
277
|
+
const s = item.trim()
|
|
278
|
+
if (s.length > 0) return s
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
return undefined
|
|
283
|
+
}
|
|
284
|
+
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-upgrade Pinterest CDN URLs to their highest-resolution variant.
|
|
3
|
+
*
|
|
4
|
+
* `i.pinimg.com` serves the same image at multiple sizes via a path-prefix
|
|
5
|
+
* segment: `/236x/`, `/474x/`, `/564x/`, `/736x/`, `/1200x/`, `/originals/`.
|
|
6
|
+
* The `originals` segment returns the source resolution — much better input
|
|
7
|
+
* for `describe-image`, `image-to-image`, `face-swap`, etc.
|
|
8
|
+
*
|
|
9
|
+
* Returns the input unchanged when:
|
|
10
|
+
* - the URL doesn't parse as a URL
|
|
11
|
+
* - the host isn't `i.pinimg.com`
|
|
12
|
+
* - the path doesn't start with a recognized size segment
|
|
13
|
+
*
|
|
14
|
+
* Used by the upload-image node when a user pastes a Pinterest URL, and by
|
|
15
|
+
* any backend describe-image-style fetch that wants the highest-res input.
|
|
16
|
+
*/
|
|
17
|
+
export function normalizePinterestUrl(url: string): string {
|
|
18
|
+
try {
|
|
19
|
+
const u = new URL(url)
|
|
20
|
+
if (u.hostname !== "i.pinimg.com") return url
|
|
21
|
+
const next = u.pathname.replace(/^\/(?:\d+x|originals)\//, "/originals/")
|
|
22
|
+
if (next === u.pathname) return url
|
|
23
|
+
u.pathname = next
|
|
24
|
+
return u.toString()
|
|
25
|
+
} catch {
|
|
26
|
+
return url
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { z } from "zod"
|
|
2
|
+
import type { Operation } from "fast-json-patch"
|
|
3
|
+
import type { PipelineStageName } from "./pipeline-events.js"
|
|
4
|
+
import { ShowrunnerPlanSchema } from "./pipeline-types.js"
|
|
5
|
+
|
|
6
|
+
/** RFC 6902 JSON Patch operations. */
|
|
7
|
+
export type JsonPatch = Operation[]
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Response from the chat-refine-showrunner LLM specialist. Either includes a
|
|
11
|
+
* concrete proposed change the user can apply, or none (chat-only reply).
|
|
12
|
+
*
|
|
13
|
+
* Two variants:
|
|
14
|
+
* - 'edit_artifact': JSON Patch operations to apply to the current stage
|
|
15
|
+
* artifact (Script stage = ShowrunnerPlan).
|
|
16
|
+
* - 'suggest_branch': the LLM thinks a deeper change is needed — recommend
|
|
17
|
+
* the user use the Branch flow (1D.3) from this stage instead of trying
|
|
18
|
+
* to patch inline.
|
|
19
|
+
*/
|
|
20
|
+
export const ChatTurnResponseSchema = z.object({
|
|
21
|
+
reply: z.string().min(1).max(4000),
|
|
22
|
+
proposed_change: z
|
|
23
|
+
.discriminatedUnion("change_type", [
|
|
24
|
+
z.object({
|
|
25
|
+
change_type: z.literal("edit_artifact"),
|
|
26
|
+
json_patch: z
|
|
27
|
+
.array(
|
|
28
|
+
z.object({
|
|
29
|
+
op: z.enum(["add", "remove", "replace"]),
|
|
30
|
+
path: z.string().min(1),
|
|
31
|
+
value: z.unknown().optional(),
|
|
32
|
+
}),
|
|
33
|
+
)
|
|
34
|
+
.min(1)
|
|
35
|
+
.max(50),
|
|
36
|
+
summary: z.string().min(1).max(200),
|
|
37
|
+
}),
|
|
38
|
+
z.object({
|
|
39
|
+
change_type: z.literal("suggest_branch"),
|
|
40
|
+
from_stage: z.enum([
|
|
41
|
+
"script",
|
|
42
|
+
"characters",
|
|
43
|
+
"objects",
|
|
44
|
+
"locations",
|
|
45
|
+
"shot_list",
|
|
46
|
+
"scene_images",
|
|
47
|
+
"animate_audio_edit",
|
|
48
|
+
]),
|
|
49
|
+
reason: z.string().min(1).max(300),
|
|
50
|
+
}),
|
|
51
|
+
])
|
|
52
|
+
.nullable(),
|
|
53
|
+
})
|
|
54
|
+
export type ChatTurnResponse = z.infer<typeof ChatTurnResponseSchema>
|
|
55
|
+
export type ProposedChange = NonNullable<ChatTurnResponse["proposed_change"]>
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Per-stage patch validation schema for `applyStageEdit`. Stages other than
|
|
59
|
+
* `script` don't have chat enabled in 1D.2b (per LLM spec v4.0 narrowing) —
|
|
60
|
+
* their entries are explicitly `null` to keep the type-check exhaustive when
|
|
61
|
+
* future stages are added.
|
|
62
|
+
*/
|
|
63
|
+
export const STAGE_PATCH_SCHEMA: Record<PipelineStageName, z.ZodTypeAny | null> = {
|
|
64
|
+
script: ShowrunnerPlanSchema,
|
|
65
|
+
characters: null,
|
|
66
|
+
objects: null,
|
|
67
|
+
locations: null,
|
|
68
|
+
shot_list: null,
|
|
69
|
+
scene_images: null,
|
|
70
|
+
animate_audio_edit: null,
|
|
71
|
+
post_merge: null,
|
|
72
|
+
}
|
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
export const PIPELINE_TYPES = ["story_to_video", "song_to_music_video"] as const
|
|
2
|
+
export type PipelineType = (typeof PIPELINE_TYPES)[number]
|
|
3
|
+
|
|
4
|
+
export const PIPELINE_FORMATS = [
|
|
5
|
+
"trailer",
|
|
6
|
+
"short_film",
|
|
7
|
+
"music_video",
|
|
8
|
+
"reel",
|
|
9
|
+
"commercial",
|
|
10
|
+
] as const
|
|
11
|
+
export type PipelineFormat = (typeof PIPELINE_FORMATS)[number]
|
|
12
|
+
|
|
13
|
+
export const PIPELINE_MODES = ["manual", "auto", "guided"] as const
|
|
14
|
+
export type PipelineMode = (typeof PIPELINE_MODES)[number]
|
|
15
|
+
|
|
16
|
+
export const PIPELINE_ACTIVATION_MODES = ["interactive", "programmatic"] as const
|
|
17
|
+
export type PipelineActivationMode = (typeof PIPELINE_ACTIVATION_MODES)[number]
|
|
18
|
+
|
|
19
|
+
export const PIPELINE_OUTPUT_RESOLUTIONS = ["480p", "720p", "1080p", "4K"] as const
|
|
20
|
+
export type PipelineOutputResolution = (typeof PIPELINE_OUTPUT_RESOLUTIONS)[number]
|
|
21
|
+
|
|
22
|
+
export const PER_FORMAT_DURATION_BOUNDS: Record<
|
|
23
|
+
PipelineFormat,
|
|
24
|
+
{ min: number; max: number }
|
|
25
|
+
> = {
|
|
26
|
+
reel: { min: 7, max: 90 },
|
|
27
|
+
commercial: { min: 10, max: 90 },
|
|
28
|
+
trailer: { min: 30, max: 180 },
|
|
29
|
+
short_film: { min: 12, max: 600 },
|
|
30
|
+
music_video: { min: 30, max: 600 },
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export const GLOBAL_MAX_DURATION_SECONDS = 600
|
|
34
|
+
|
|
35
|
+
export function validateDurationForFormat(
|
|
36
|
+
format: PipelineFormat,
|
|
37
|
+
seconds: number,
|
|
38
|
+
): { ok: true } | { ok: false; reason: string } {
|
|
39
|
+
if (seconds > GLOBAL_MAX_DURATION_SECONDS) {
|
|
40
|
+
return { ok: false, reason: `target_duration_seconds must be <= ${GLOBAL_MAX_DURATION_SECONDS}` }
|
|
41
|
+
}
|
|
42
|
+
const bounds = PER_FORMAT_DURATION_BOUNDS[format]
|
|
43
|
+
if (seconds < bounds.min || seconds > bounds.max) {
|
|
44
|
+
return {
|
|
45
|
+
ok: false,
|
|
46
|
+
reason: `${format} requires duration in [${bounds.min}, ${bounds.max}] seconds`,
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return { ok: true }
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export function validateModeActivation(
|
|
53
|
+
mode: PipelineMode,
|
|
54
|
+
activation: PipelineActivationMode,
|
|
55
|
+
): { ok: true } | { ok: false; reason: string } {
|
|
56
|
+
if (activation === "programmatic" && mode === "guided") {
|
|
57
|
+
return {
|
|
58
|
+
ok: false,
|
|
59
|
+
reason: "Programmatic activation cannot use guided mode (no user for chat turns)",
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return { ok: true }
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// Tier → max parallel pipelines (Architecture §5.4)
|
|
66
|
+
export const TIER_PIPELINE_PARALLELISM: Record<string, number> = {
|
|
67
|
+
free: 0,
|
|
68
|
+
basic: 1,
|
|
69
|
+
standard: 2,
|
|
70
|
+
pro: 3,
|
|
71
|
+
business: 5,
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// Tier → default hard cost cap when max_cost_credits omitted (Architecture §6.6.3)
|
|
75
|
+
export const TIER_MAX_PIPELINE_COST_CREDITS: Record<string, number> = {
|
|
76
|
+
free: 0,
|
|
77
|
+
basic: 300,
|
|
78
|
+
standard: 800,
|
|
79
|
+
pro: 2000,
|
|
80
|
+
business: 5000,
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// Per-stage soft timeout (matches workflow-orchestration)
|
|
84
|
+
export const PIPELINE_STAGE_TIMEOUT_MS = 30 * 60 * 1000
|
|
85
|
+
// Hard ceiling for a SINGLE orchestrator drive (pipeline-worker aborts the
|
|
86
|
+
// in-flight drive when this fires). One drive runs a whole stage's work; the
|
|
87
|
+
// heaviest is animate_audio_edit, which fans out every scene × every shot
|
|
88
|
+
// (KIE video gen + per-shot critic + audio + merge). For a multi-scene film
|
|
89
|
+
// that legitimately exceeds 90 min — the old value aborted such drives
|
|
90
|
+
// mid-fan-out, and before the scene-level resume short-circuit landed each
|
|
91
|
+
// retry restarted from scratch and tripped the resume cap (prod pipeline
|
|
92
|
+
// 64b76ed9). 4 h gives a heavy drive room to finish in one pass while staying
|
|
93
|
+
// well under the reconcile cron's 6 h abandon threshold. Worker concurrency is
|
|
94
|
+
// 5, so even a pathological long drive leaves 4 slots free.
|
|
95
|
+
export const PIPELINE_HARD_TIMEOUT_MS = 4 * 60 * 60 * 1000
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Per-stage hard retry caps applied to image-gen for that stage.
|
|
99
|
+
* Pipeline-level credit cap (max_cost_credits) is the ultimate guard, but
|
|
100
|
+
* these prevent a single stage from sucking all the budget.
|
|
101
|
+
*/
|
|
102
|
+
export const ENTITY_TOOL_RETRY_CAP = 3 // tool-level failure retries per entity
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Default variant counts when ShowrunnerPlan doesn't suggest specifics.
|
|
106
|
+
*/
|
|
107
|
+
export const DEFAULT_CHARACTER_ANGLE_COUNT = 3 // main + 2 variants for non-protagonist
|
|
108
|
+
export const DEFAULT_CHARACTER_EXPRESSION_COUNT = 2 // baseline expression variants
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Short-film lean reference set. A few-shot film can't meaningfully consume
|
|
112
|
+
* 5-8 reference variants per character: each shot is animated from exactly ONE
|
|
113
|
+
* reference image (the video providers accept a single reference and drop the
|
|
114
|
+
* rest — see `allocateReferenceSlots`), so the extra angle/expression variants
|
|
115
|
+
* are pure wall-clock + KIE load with ~no quality return. For films at or under
|
|
116
|
+
* the threshold we generate only main + 1 angle + 1 expression; longer films
|
|
117
|
+
* keep the full plan-driven variant set unchanged.
|
|
118
|
+
*
|
|
119
|
+
* Measured impact: the characters stage was the joint-largest time sink (≈27
|
|
120
|
+
* min for a 40 s film — 23 character images at ~58 s each on KIE). Capping a
|
|
121
|
+
* ≤2 min film to 2 variants/character cuts that to ~12 images.
|
|
122
|
+
*/
|
|
123
|
+
export const SHORT_FILM_VARIANT_THRESHOLD_SEC = 120
|
|
124
|
+
export const SHORT_FILM_ANGLE_COUNT = 2 // main + 1 angle variant
|
|
125
|
+
export const SHORT_FILM_EXPRESSION_COUNT = 1 // neutral only
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Max location variants generated even if Showrunner suggests more — cost guard.
|
|
129
|
+
*/
|
|
130
|
+
export const MAX_LOCATION_VARIANTS = 4
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Maximum user-turn count per stage for the chat refine flow. Enforced by
|
|
134
|
+
* the chat POST route (counts existing `role='user'` rows and rejects when
|
|
135
|
+
* the cap is reached). 1D.2b ships **Script chat only** per the LLM Spec
|
|
136
|
+
* v4.0 narrowing — `shot_list` + `post_merge` caps are pre-declared so
|
|
137
|
+
* adding their chat surfaces in 1D.2d only needs route+UI wiring, not a
|
|
138
|
+
* type/constant change.
|
|
139
|
+
*/
|
|
140
|
+
export const CHAT_TURN_CAPS = {
|
|
141
|
+
script: 20,
|
|
142
|
+
shot_list: 15,
|
|
143
|
+
post_merge: 8,
|
|
144
|
+
} as const
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Pipeline entity error code emitted by Phase 1D.2c-a image critics
|
|
148
|
+
* (Stage 2 Characters + Stage 4 Locations) and any future image-level
|
|
149
|
+
* validators. Constant lets the frontend compare equality (not substring)
|
|
150
|
+
* and the backend writes a single canonical value.
|
|
151
|
+
*
|
|
152
|
+
* Written to `pipeline_entities.metadata.last_error` after the critic retry
|
|
153
|
+
* cap exhausts. Auto-mode's failure-aggregator (`detectImageCriticFailures`
|
|
154
|
+
* + `failPipelineForImageCriticUnresolvable`) reads this exact value.
|
|
155
|
+
*/
|
|
156
|
+
export const IMAGE_CRITIC_UNRESOLVABLE = "image_critic_unresolvable"
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* Maximum critic-feedback retry budget per entity in Phase 1D.2c-a image
|
|
160
|
+
* critics. Each fail triggers a regeneration with critic suggestions injected
|
|
161
|
+
* into the prompt; after this many retries the entity is marked failed and
|
|
162
|
+
* surfaces in EntityCard with recovery buttons.
|
|
163
|
+
*/
|
|
164
|
+
export const IMAGE_CRITIC_MAX_RETRIES = 2
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Score threshold below which the critic's verdict is overridden to "fail"
|
|
168
|
+
* regardless of the verdict field. Defends against an overly lenient critic
|
|
169
|
+
* that says verdict='pass' on a borderline image. The numeric score (0-10)
|
|
170
|
+
* is enforced by the schema and the system prompt anchors the meaning.
|
|
171
|
+
*/
|
|
172
|
+
export const IMAGE_CRITIC_MIN_ADHERENCE_SCORE = 5
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Metadata keys written by the image-critic retry loop (Phase 1D.2c-a)
|
|
176
|
+
* onto `pipeline_entities.metadata` when an entity's critic budget is
|
|
177
|
+
* exhausted. The retry-image-generation route clears these to reset the
|
|
178
|
+
* entity to a fresh attempt; EntityCard reads them to render findings +
|
|
179
|
+
* the failed image.
|
|
180
|
+
*
|
|
181
|
+
* Single source of truth so the writer (`_image-critic-loop.ts`) and the
|
|
182
|
+
* clearer (`routes/pipelines.ts:retry-image-generation`) can't drift.
|
|
183
|
+
*/
|
|
184
|
+
export const IMAGE_CRITIC_METADATA_KEYS = [
|
|
185
|
+
"last_error",
|
|
186
|
+
"last_error_at",
|
|
187
|
+
"critic_findings",
|
|
188
|
+
"last_attempted_image_url",
|
|
189
|
+
"last_attempted_asset_id",
|
|
190
|
+
"image_critic_retry_count",
|
|
191
|
+
] as const
|
|
192
|
+
|
|
193
|
+
export type ImageCriticMetadataKey = (typeof IMAGE_CRITIC_METADATA_KEYS)[number]
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Removes every {@link IMAGE_CRITIC_METADATA_KEYS} entry from a metadata
|
|
197
|
+
* blob, returning a shallow copy. Used by the retry-image-generation route
|
|
198
|
+
* to wipe critic-only state while preserving everything else (`name`,
|
|
199
|
+
* `voice_match`, `reject_count`, etc.).
|
|
200
|
+
*/
|
|
201
|
+
export function clearImageCriticMetadata(
|
|
202
|
+
meta: Record<string, unknown> | null | undefined,
|
|
203
|
+
): Record<string, unknown> {
|
|
204
|
+
if (!meta) return {}
|
|
205
|
+
const next: Record<string, unknown> = { ...meta }
|
|
206
|
+
for (const key of IMAGE_CRITIC_METADATA_KEYS) {
|
|
207
|
+
delete next[key]
|
|
208
|
+
}
|
|
209
|
+
return next
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* Phase 1D.2c-b-ii — Video Critic frame extraction modes.
|
|
214
|
+
* Each pipeline picks one via PipelineInput.video_critic_frame_count.
|
|
215
|
+
* Default 'first_last' uses the input keyframe + extractLastFrame output
|
|
216
|
+
* (both already produced by Stage 6 + extractLastFrame call), so no new
|
|
217
|
+
* frame extractions are needed in the default case.
|
|
218
|
+
*/
|
|
219
|
+
export const VIDEO_CRITIC_FRAME_MODES = ["first_last", "first_middle_last", "five_evenly"] as const
|
|
220
|
+
export type VideoCriticFrameMode = (typeof VIDEO_CRITIC_FRAME_MODES)[number]
|
|
221
|
+
|
|
222
|
+
/** Cap=1 retry per shot — cost-aware (every retry is a full paid video
|
|
223
|
+
* generation, the priciest step in the loop). */
|
|
224
|
+
export const VIDEO_CRITIC_MAX_RETRIES = 1
|
|
225
|
+
|
|
226
|
+
/** Auto-fail threshold for both prompt_adherence_score and continuity_score. */
|
|
227
|
+
export const VIDEO_CRITIC_MIN_ADHERENCE_SCORE = 5
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* Phase 1D.2c-b-ii — Video Critic ShotSpec sibling field names that get
|
|
231
|
+
* persisted by the per-shot retry loop (`runVideoCriticLoopForShot` in
|
|
232
|
+
* `scene-internal-pipeline.ts`) and stripped by the retry-video-generation
|
|
233
|
+
* recovery route + the frontend Regenerate button.
|
|
234
|
+
*
|
|
235
|
+
* Single source of truth so the writer + clearer can't drift. Mirror of
|
|
236
|
+
* {@link IMAGE_CRITIC_METADATA_KEYS} for the entity-level image critic.
|
|
237
|
+
*/
|
|
238
|
+
export const VIDEO_CRITIC_METADATA_KEYS = [
|
|
239
|
+
"video_critic_findings",
|
|
240
|
+
"video_critic_score",
|
|
241
|
+
"video_critic_continuity_score",
|
|
242
|
+
"video_critic_identified_action",
|
|
243
|
+
"video_critic_retry_count",
|
|
244
|
+
"video_critic_last_attempted_url",
|
|
245
|
+
"video_critic_failed",
|
|
246
|
+
"video_critic_verdict",
|
|
247
|
+
] as const
|
|
248
|
+
|
|
249
|
+
export type VideoCriticMetadataKey = (typeof VIDEO_CRITIC_METADATA_KEYS)[number]
|
|
250
|
+
|
|
251
|
+
/**
|
|
252
|
+
* Returns a shallow copy of `shot` with all `video_critic_*` keys stripped.
|
|
253
|
+
* Used by the retry-video-generation route + frontend Regenerate handler to
|
|
254
|
+
* reset a shot to a fresh critic attempt while preserving everything else
|
|
255
|
+
* (camera, action, motion_prompt, …).
|
|
256
|
+
*/
|
|
257
|
+
export function clearVideoCriticMetadata<T extends Record<string, unknown>>(
|
|
258
|
+
shot: T,
|
|
259
|
+
): Omit<T, VideoCriticMetadataKey> {
|
|
260
|
+
const cleaned = { ...shot } as Record<string, unknown>
|
|
261
|
+
for (const key of VIDEO_CRITIC_METADATA_KEYS) {
|
|
262
|
+
delete cleaned[key]
|
|
263
|
+
}
|
|
264
|
+
return cleaned as Omit<T, VideoCriticMetadataKey>
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
/**
|
|
268
|
+
* Phase 1D.2 — single source of truth for chat-stage configuration.
|
|
269
|
+
*
|
|
270
|
+
* `wired: true` = the route has a specialist implemented + the LLM emits
|
|
271
|
+
* valid `ChatTurnResponse` for this stage's artifact.
|
|
272
|
+
* `wired: false` = stage is in the v0.5 spec but not yet implemented
|
|
273
|
+
* (the chat POST returns HTTP 501 `chat_not_wired_for_stage`).
|
|
274
|
+
*
|
|
275
|
+
* Per spec §5.12 v0.5: `script` + `shot_list` + `post_merge`.
|
|
276
|
+
*
|
|
277
|
+
* - `script`: wired in 1D.2b (chat-refine-showrunner)
|
|
278
|
+
* - `post_merge`: wired in 1D.2c (chat-refine-postmerge; suggest_branch only)
|
|
279
|
+
* - `shot_list`: pre-declared, ships in 1D.2d (blocked by v4.0 per-scene
|
|
280
|
+
* architecture)
|
|
281
|
+
*
|
|
282
|
+
* Prefer reading `CHAT_STAGES[stage].wired` directly in new code; the
|
|
283
|
+
* sibling `CHAT_ENABLED_STAGES` / `CHAT_WIRED_STAGES` exports below are
|
|
284
|
+
* derived and remain for backward compatibility with existing call sites.
|
|
285
|
+
*/
|
|
286
|
+
export const CHAT_STAGES = {
|
|
287
|
+
script: { wired: true },
|
|
288
|
+
shot_list: { wired: false },
|
|
289
|
+
post_merge: { wired: true },
|
|
290
|
+
} as const
|
|
291
|
+
|
|
292
|
+
export type ChatEnabledStage = keyof typeof CHAT_STAGES
|
|
293
|
+
|
|
294
|
+
/**
|
|
295
|
+
* Ordered list of stages with chat enabled. Derived from {@link CHAT_STAGES}.
|
|
296
|
+
* **In 1D.2c, `script` AND `post_merge` have chat code paths wired** —
|
|
297
|
+
* post-merge ships with a dedicated `chat-refine-postmerge` specialist
|
|
298
|
+
* (suggest_branch only — see {@link STAGE_PATCH_SCHEMA}, `post_merge` stays
|
|
299
|
+
* `null` since the merged video isn't user-editable in place). `shot_list`
|
|
300
|
+
* is pre-declared for 1D.2d. The route's chat dispatch checks
|
|
301
|
+
* {@link CHAT_WIRED_STAGES} to decide which specialist to invoke (or 501
|
|
302
|
+
* for unwired stages).
|
|
303
|
+
*/
|
|
304
|
+
export const CHAT_ENABLED_STAGES: readonly ChatEnabledStage[] = Object.keys(
|
|
305
|
+
CHAT_STAGES,
|
|
306
|
+
) as ChatEnabledStage[]
|
|
307
|
+
|
|
308
|
+
/**
|
|
309
|
+
* Per-stage boolean map of whether chat code paths are actually wired
|
|
310
|
+
* end-to-end. Derived from {@link CHAT_STAGES}. The chat POST route reads
|
|
311
|
+
* this to decide whether to invoke a specialist (true) or return 501
|
|
312
|
+
* `chat_not_wired_for_stage` (false).
|
|
313
|
+
*/
|
|
314
|
+
export const CHAT_WIRED_STAGES: Record<ChatEnabledStage, boolean> = {
|
|
315
|
+
script: CHAT_STAGES.script.wired,
|
|
316
|
+
shot_list: CHAT_STAGES.shot_list.wired,
|
|
317
|
+
post_merge: CHAT_STAGES.post_merge.wired,
|
|
318
|
+
}
|