@adminide-stack/yantra-mobile 12.0.125-alpha.1 → 12.0.126
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/lib/features/canvas/AudioEditorExperience.js +207 -109
- package/lib/features/canvas/AudioEditorExperience.js.map +1 -1
- package/lib/features/canvas/CanvasAgentChatPane.js +87 -72
- package/lib/features/canvas/CanvasAgentChatPane.js.map +1 -1
- package/lib/features/canvas/CanvasBoardsGrid.js +494 -387
- package/lib/features/canvas/CanvasBoardsGrid.js.map +1 -1
- package/lib/features/canvas/CanvasChatResultCard.js +78 -59
- package/lib/features/canvas/CanvasChatResultCard.js.map +1 -1
- package/lib/features/canvas/CanvasEditToolsPanel.js +126 -84
- package/lib/features/canvas/CanvasEditToolsPanel.js.map +1 -1
- package/lib/features/canvas/CanvasExperience.js +108 -126
- package/lib/features/canvas/CanvasExperience.js.map +1 -1
- package/lib/features/canvas/CanvasGeneratePanel.js +178 -166
- package/lib/features/canvas/CanvasGeneratePanel.js.map +1 -1
- package/lib/features/canvas/CanvasLibrarySheet.js +119 -123
- package/lib/features/canvas/CanvasLibrarySheet.js.map +1 -1
- package/lib/features/canvas/CanvasLooksPanel.js +113 -89
- package/lib/features/canvas/CanvasLooksPanel.js.map +1 -1
- package/lib/features/canvas/CanvasModelPicker.js +79 -79
- package/lib/features/canvas/CanvasModelPicker.js.map +1 -1
- package/lib/features/canvas/CanvasTasksPanel.js +193 -128
- package/lib/features/canvas/CanvasTasksPanel.js.map +1 -1
- package/lib/features/canvas/CanvasTemplatesPanel.js +106 -94
- package/lib/features/canvas/CanvasTemplatesPanel.js.map +1 -1
- package/lib/features/canvas/CanvasToolDock.js +195 -127
- package/lib/features/canvas/CanvasToolDock.js.map +1 -1
- package/lib/features/canvas/FrameExtractorExperience.js +163 -100
- package/lib/features/canvas/FrameExtractorExperience.js.map +1 -1
- package/lib/features/canvas/GeneratorReferenceSlots.js +132 -69
- package/lib/features/canvas/GeneratorReferenceSlots.js.map +1 -1
- package/lib/features/canvas/ImageEditorExperience.js +278 -209
- package/lib/features/canvas/ImageEditorExperience.js.map +1 -1
- package/lib/features/canvas/InfluencerStudioExperience.js +167 -125
- package/lib/features/canvas/InfluencerStudioExperience.js.map +1 -1
- package/lib/features/canvas/MoodboardExperience.js +102 -85
- package/lib/features/canvas/MoodboardExperience.js.map +1 -1
- package/lib/features/canvas/NativeCanvasViewer.js +203 -192
- package/lib/features/canvas/NativeCanvasViewer.js.map +1 -1
- package/lib/features/canvas/PromoContextFields.js +125 -92
- package/lib/features/canvas/PromoContextFields.js.map +1 -1
- package/lib/features/canvas/SetStudioExperience.js +225 -143
- package/lib/features/canvas/SetStudioExperience.js.map +1 -1
- package/lib/features/canvas/VideoClipsExperience.js +126 -92
- package/lib/features/canvas/VideoClipsExperience.js.map +1 -1
- package/lib/features/canvas/VideoEditExperience.js +154 -142
- package/lib/features/canvas/VideoEditExperience.js.map +1 -1
- package/lib/features/canvas/VideoEditorExperience.js +551 -492
- package/lib/features/canvas/VideoEditorExperience.js.map +1 -1
- package/lib/features/canvas/VideoGeneratorExperience.js +284 -131
- package/lib/features/canvas/VideoGeneratorExperience.js.map +1 -1
- package/lib/features/canvas/canvasTasks.js +7 -3
- package/lib/features/canvas/canvasTasks.js.map +1 -1
- package/lib/features/canvas/canvasTheme.js +265 -0
- package/lib/features/canvas/canvasTheme.js.map +1 -0
- package/lib/features/canvas/canvasUi.js +381 -0
- package/lib/features/canvas/canvasUi.js.map +1 -0
- package/lib/features/canvas/recorder/CameraRecorderExperience.js +109 -52
- package/lib/features/canvas/recorder/CameraRecorderExperience.js.map +1 -1
- package/lib/features/canvas/serverTasks.js +1 -1
- package/lib/features/canvas/serverTasks.js.map +1 -1
- package/lib/features/canvas/set/SetViewportWebView.js +1 -1
- package/lib/features/canvas/set/SetViewportWebView.js.map +1 -1
- package/lib/features/canvas/videoEditor/BlurBoxOverlay.js +8 -7
- package/lib/features/canvas/videoEditor/BlurBoxOverlay.js.map +1 -1
- package/lib/features/canvas/videoEditor/ExportTaskCard.js +44 -41
- package/lib/features/canvas/videoEditor/ExportTaskCard.js.map +1 -1
- package/lib/features/canvas/videoEditor/agent/AgentCutPane.js +50 -45
- package/lib/features/canvas/videoEditor/agent/AgentCutPane.js.map +1 -1
- package/lib/features/canvas/videoEditor/exportTask.js +3 -2
- package/lib/features/canvas/videoEditor/exportTask.js.map +1 -1
- package/lib/features/canvas/videoEditor/formWidgets.js +116 -64
- package/lib/features/canvas/videoEditor/formWidgets.js.map +1 -1
- package/lib/features/canvas/videoEditor/produce/ProduceVideoSheet.js +77 -63
- package/lib/features/canvas/videoEditor/produce/ProduceVideoSheet.js.map +1 -1
- package/lib/features/canvas/videoEditor/tools/ToolsDrawer.js +95 -79
- package/lib/features/canvas/videoEditor/tools/ToolsDrawer.js.map +1 -1
- package/lib/features/design/DesignEditorExperience.js +241 -160
- package/lib/features/design/DesignEditorExperience.js.map +1 -1
- package/lib/features/design/DesignExperience.js +300 -143
- package/lib/features/design/DesignExperience.js.map +1 -1
- package/lib/features/health/HealthSyncRunner.js +9 -1
- package/lib/features/health/HealthSyncRunner.js.map +1 -1
- package/lib/features/health/backgroundSync.js +41 -0
- package/lib/features/health/backgroundSync.js.map +1 -0
- package/lib/features/health/healthConnectBackground.js +32 -0
- package/lib/features/health/healthConnectBackground.js.map +1 -0
- package/lib/features/health/healthConnectReader.js +16 -2
- package/lib/features/health/healthConnectReader.js.map +1 -1
- package/lib/features/health/healthSync.js +31 -3
- package/lib/features/health/healthSync.js.map +1 -1
- package/lib/features/health/healthSyncStore.js +89 -5
- package/lib/features/health/healthSyncStore.js.map +1 -1
- package/lib/features/health/healthkitBackground.js +17 -0
- package/lib/features/health/healthkitBackground.js.map +1 -0
- package/lib/features/health/reader.js.map +1 -1
- package/lib/features/health/sessionVault.js +38 -0
- package/lib/features/health/sessionVault.js.map +1 -0
- package/lib/features/health/syncState.js.map +1 -1
- package/lib/features/webbuilder/WebBuilderExperience.js +1 -1
- package/lib/features/webbuilder/WebBuilderExperience.js.map +1 -1
- package/lib/features/webbuilder/buildFragments.js +3 -2
- package/lib/features/webbuilder/buildFragments.js.map +1 -1
- package/lib/features/webbuilder/components/PublishSheet.js +1 -1
- package/lib/features/webbuilder/components/PublishSheet.js.map +1 -1
- package/lib/features/webbuilder/webbuilderPrompts.js +2 -5
- package/lib/features/webbuilder/webbuilderPrompts.js.map +1 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/screens/Health/index.js +12 -2
- package/lib/screens/Health/index.js.map +1 -1
- package/lib/screens/WebBuilderNative/sandboxProxyApi.js +120 -0
- package/lib/screens/WebBuilderNative/sandboxProxyApi.js.map +1 -0
- package/lib/screens/WebBuilderNative/useRestoredSandboxes.js.map +1 -1
- package/lib/screens/WebBuilderNative/useWebBuilderHost.js +26 -4
- package/lib/screens/WebBuilderNative/useWebBuilderHost.js.map +1 -1
- package/lib/screens/WebBuilderNative/webbuilderTransport.js +110 -7
- package/lib/screens/WebBuilderNative/webbuilderTransport.js.map +1 -1
- package/package.json +6 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VideoGeneratorExperience.js","sources":["../../../src/features/canvas/VideoGeneratorExperience.tsx"],"sourcesContent":["/**\n * Native twin of web canvas generator panel (bottom-dock Image / Video / Audio,\n * plus toolbar \"Create Video\").\n *\n * Web: `openGeneratorPanel(mode)` then `generateImageViaExec` /\n * `generateVideoViaExec` / `generateAudioViaExec`. A selected image/video only\n * seeds the video lane as `referenceImageUrl`.\n */\nimport React, { useEffect, useRef, useState } from 'react';\nimport { ActivityIndicator, Pressable, ScrollView, StyleSheet, Text, TextInput, View } from 'react-native';\n// NEVER import react-native-safe-area-context here: this module ships OTA in\n// the federated canvas remote, where a top-level import of that library can be\n// fatal at eval (duplicate RNCSafeAreaProvider registration) or throw at\n// render (foreign insets context). useSafeInsets degrades gracefully instead.\nimport { useSafeInsets } from './withRemoteSafeArea';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { Image } from 'expo-image';\nimport {\n COMPOSER_INPUT_NATIVE_ID,\n KeyboardAwareScreen,\n KeyboardComposerDock,\n useKeyboardLiftHeight,\n} from '../../components/KeyboardComposerDock';\nimport { dismissKeyboard } from '../../utils/keyboardController';\nimport type { CanvasItem } from './canvasCore';\nimport {\n friendlyMediaError,\n generationImageUrl,\n generationMediaUrl,\n resultUrl,\n type RunMediaAction,\n} from './videoEditor/mediaActions';\nimport { unwrapProxyUrl } from './videoEditor/remoteMediaClient';\nimport {\n STATIC_VIDEO_MODELS,\n buildVideoGenerateParams,\n normalizeModels,\n promptAudioModels,\n videoDurationOptions,\n type ModelInfo,\n} from './generationModels';\nimport {\n DEFAULT_PROMO_PRESET,\n EMPTY_PROMO_CONTEXT,\n PROMO_ASPECT_RATIOS,\n PROMO_CONNECTOR,\n PROMO_DURATIONS,\n PROMO_PLAYBOOKS,\n PROMO_PRESETS,\n defaultNarration,\n designPromoProject,\n defaultPromoQuality,\n lookupPromoPreset,\n producePromoVideo,\n type DesignedPromo,\n type PromoContext,\n type PromoQuality,\n} from './promoVideo';\nimport { PromoContextFields, PromoProductionFields } from './PromoContextFields';\n\nconst ASPECTS = ['16:9', '9:16', '1:1'] as const;\n\nexport type GeneratorMode = 'image' | 'video' | 'audio' | 'promo';\n\nexport interface VideoGeneratorExperienceProps {\n mode?: GeneratorMode;\n item?: CanvasItem | null;\n /** Web \"Restyle\": video-to-video. Create Video on a clip still captures a still. */\n restyle?: boolean;\n /** Home composer / Looks seed. */\n initialPrompt?: string;\n runAction?: RunMediaAction;\n onClose: () => void;\n onGenerated: (url: string, meta: { prompt: string; aspect: string; mode: GeneratorMode }) => void;\n /** Promo design lane → open video editor (CanvasExperience wires this). */\n onPromoDesigned?: (designed: DesignedPromo) => void;\n}\n\nexport function VideoGeneratorExperience({\n mode = 'video',\n item,\n restyle = false,\n initialPrompt = '',\n runAction,\n onClose,\n onGenerated,\n onPromoDesigned,\n}: VideoGeneratorExperienceProps) {\n const imageReference =\n (mode === 'video' || mode === 'promo') && item?.type === 'image' ? unwrapProxyUrl(item.src) : null;\n const [referenceUrl, setReferenceUrl] = useState<string | null>(imageReference);\n const [videoSourceUrl, setVideoSourceUrl] = useState<string | null>(\n restyle && item?.type === 'video' ? unwrapProxyUrl(item.src) : null,\n );\n const [capturing, setCapturing] = useState(mode === 'video' && item?.type === 'video' && !restyle);\n const [frameSec, setFrameSec] = useState(1);\n const [models, setModels] = useState<ModelInfo[]>(mode === 'video' ? STATIC_VIDEO_MODELS : []);\n const [selectedModel, setSelectedModel] = useState('');\n const [videoDuration, setVideoDuration] = useState(0);\n const [prompt, setPrompt] = useState(initialPrompt);\n const [aspect, setAspect] = useState<(typeof ASPECTS)[number]>(mode === 'image' ? '1:1' : '16:9');\n const [promoPreset, setPromoPreset] = useState(\n mode === 'promo' && item?.type === 'video' ? 'footage-remix' : DEFAULT_PROMO_PRESET,\n );\n const [promoDuration, setPromoDuration] = useState<(typeof PROMO_DURATIONS)[number]>(\n lookupPromoPreset(mode === 'promo' && item?.type === 'video' ? 'footage-remix' : DEFAULT_PROMO_PRESET)\n .defaultDurationSeconds as (typeof PROMO_DURATIONS)[number],\n );\n const [promoCaptions, setPromoCaptions] = useState(true);\n const [promoNarration, setPromoNarration] = useState(defaultNarration(DEFAULT_PROMO_PRESET));\n const [promoContext, setPromoContext] = useState<PromoContext>(EMPTY_PROMO_CONTEXT);\n const [promoPlaybook, setPromoPlaybook] = useState('');\n const [promoQuality, setPromoQuality] = useState<PromoQuality>(() =>\n defaultPromoQuality(mode === 'promo' && item?.type === 'video' ? 'footage-remix' : DEFAULT_PROMO_PRESET),\n );\n const [promoNarrator, setPromoNarrator] = useState('');\n const [promoUseCases, setPromoUseCases] = useState('');\n const [promoDesignModel, setPromoDesignModel] = useState('');\n const [promoLogoUrl, setPromoLogoUrl] = useState<string | null>(\n mode === 'promo' && item?.type === 'image' ? unwrapProxyUrl(item.src) : null,\n );\n const [busy, setBusy] = useState(false);\n const [notice, setNotice] = useState<string | null>(null);\n // The promo lane's step text under the busy spinner. A 9/2 merge dropped\n // this line and kept its uses: every generation from this screen threw\n // \"Property 'promoProgress' doesn't exist\" on its first busy render.\n const [promoProgress, setPromoProgress] = useState<string | null>(null);\n const insets = useSafeInsets();\n const inputRef = useRef<TextInput>(null);\n const cancelledRef = useRef(false);\n const keyboardHeight = useKeyboardLiftHeight();\n const keyboardOpen = keyboardHeight > 0;\n\n useEffect(() => {\n cancelledRef.current = false;\n return () => {\n cancelledRef.current = true;\n };\n }, []);\n\n useEffect(() => {\n if (mode !== 'video' || restyle || item?.type !== 'video' || !runAction) {\n setCapturing(false);\n return;\n }\n let cancelled = false;\n setCapturing(true);\n runAction('yantra-video-editing', 'YANTRA_VIDEO_EDIT_THUMBNAIL', {\n input_url: item.src,\n time_secs: frameSec,\n })\n .then((result) => {\n if (cancelled) return;\n setReferenceUrl(resultUrl(result, 'YANTRA_VIDEO_EDIT_THUMBNAIL'));\n })\n .catch((err: unknown) => {\n if (cancelled) return;\n setNotice(\n `Could not capture a still from this clip — generating without a reference.\\n\\n${\n err instanceof Error ? err.message : String(err)\n }`.slice(0, 280),\n );\n })\n .finally(() => {\n if (!cancelled) setCapturing(false);\n });\n return () => {\n cancelled = true;\n };\n }, [frameSec, item?.src, item?.type, mode, restyle, runAction]);\n\n useEffect(() => {\n if (!runAction || mode === 'promo') return undefined;\n let cancelled = false;\n const job =\n mode === 'image'\n ? runAction('yantra-image-generation', 'YANTRA_GEMINI_IMAGE_LIST_MODELS', {})\n : mode === 'audio'\n ? runAction('yantra-audio', 'YANTRA_AUDIO_LIST_MODELS', {})\n : runAction('yantra-video-generation', 'YANTRA_VIDEO_GENERATION_LIST_MODELS', {});\n job.then((result) => {\n if (cancelled) return;\n let list = normalizeModels(result);\n if (mode === 'audio') list = promptAudioModels(list);\n if (mode === 'video' && list.length === 0) list = STATIC_VIDEO_MODELS;\n setModels(list);\n const prefer = restyle && mode === 'video' ? list.find((m) => m.supportsVideoInput)?.id : list[0]?.id;\n if (prefer) setSelectedModel((current) => current || prefer);\n }).catch(() => {\n if (cancelled) return;\n if (mode === 'video') {\n setModels(STATIC_VIDEO_MODELS);\n setSelectedModel((current) => current || STATIC_VIDEO_MODELS[0].id);\n }\n });\n return () => {\n cancelled = true;\n };\n }, [mode, restyle, runAction]);\n\n const selectedModelInfo = models.find((m) => m.id === selectedModel);\n const durationChoices = mode === 'video' ? videoDurationOptions(selectedModelInfo) : [];\n\n useEffect(() => {\n if (videoDuration && !durationChoices.includes(videoDuration)) setVideoDuration(0);\n }, [durationChoices, videoDuration]);\n\n const generate = () => {\n const text = prompt.trim();\n if (!text || busy || capturing) return;\n if (!runAction) {\n setNotice('Generation needs the host connector — not wired in this host.');\n return;\n }\n setBusy(true);\n setNotice(null);\n const job =\n mode === 'image'\n ? runAction('yantra-image-generation', 'YANTRA_GEMINI_IMAGE_GENERATE', {\n prompt: text,\n aspectRatio: aspect,\n ...(selectedModel ? { model: selectedModel } : {}),\n }).then((result) => generationImageUrl(result))\n : mode === 'audio'\n ? runAction('yantra-audio', 'YANTRA_AUDIO_RUN_PROMPT', {\n prompt: text,\n ...(selectedModel ? { model: selectedModel } : {}),\n }).then((result) => resultUrl(result, 'YANTRA_AUDIO_RUN_PROMPT'))\n : mode === 'promo'\n ? producePromoVideo(\n (action, params) => runAction(PROMO_CONNECTOR, action, params),\n {\n prompt: text,\n preset: promoPreset,\n durationSeconds: promoDuration,\n aspectRatio: aspect,\n ...(referenceUrl ? { referenceImageUrls: [unwrapProxyUrl(referenceUrl)] } : {}),\n ...(item?.type === 'video' ? { sourceVideoUrl: unwrapProxyUrl(item.src) } : {}),\n captions: promoCaptions,\n narration: promoNarration,\n ...(promoLogoUrl ? { logoUrl: promoLogoUrl } : {}),\n ...promoContext,\n ...(promoPlaybook ? { stylePlaybook: promoPlaybook } : {}),\n quality: promoQuality,\n ...(promoNarrator ? { narratorVoice: promoNarrator } : {}),\n ...(promoUseCases.trim() ? { useCases: promoUseCases } : {}),\n },\n (msg) => setPromoProgress(msg),\n undefined,\n () => cancelledRef.current,\n ).then((promo) => promo.url)\n : runAction(\n 'yantra-video-generation',\n 'YANTRA_VIDEO_GENERATION_GENERATE',\n buildVideoGenerateParams({\n prompt: text,\n aspectRatio: aspect,\n model: selectedModel || undefined,\n durationSeconds: videoDuration || undefined,\n referenceImageUrl: referenceUrl ? unwrapProxyUrl(referenceUrl) : undefined,\n referenceVideoUrl: videoSourceUrl ? unwrapProxyUrl(videoSourceUrl) : undefined,\n }),\n ).then((result) => generationMediaUrl(result));\n job.then((url) => onGenerated(url, { prompt: text, aspect, mode }))\n .catch((err: unknown) => {\n if (cancelledRef.current || (err instanceof Error && err.message === 'cancelled')) return;\n setNotice(friendlyMediaError(err, `${mode} generation`));\n })\n .finally(() => {\n setBusy(false);\n setPromoProgress(null);\n });\n };\n\n const title =\n mode === 'image'\n ? 'Create image'\n : mode === 'audio'\n ? 'Create audio'\n : mode === 'promo'\n ? 'Marketing video'\n : restyle\n ? 'Restyle this clip'\n : item?.type === 'video'\n ? 'Continue this clip'\n : 'Create video';\n const hint =\n mode === 'image'\n ? 'Describe the image you want on this board.'\n : mode === 'audio'\n ? 'Describe the audio you want on this board.'\n : mode === 'promo'\n ? item?.type === 'video'\n ? 'This clip is the footage. Describe the promo you want cut from it.'\n : 'Describe the marketing video — brand, offer, and who it is for.'\n : restyle\n ? 'This footage is the source. Describe how it should look after the restyle.'\n : item?.type === 'video'\n ? 'The new clip starts from a still of this video. Describe what happens next.'\n : item?.type === 'image'\n ? 'This image is the reference. Describe the motion you want.'\n : 'Describe the video you want on this board.';\n const stageIcon =\n mode === 'image'\n ? 'image-outline'\n : mode === 'audio'\n ? 'microphone-outline'\n : mode === 'promo'\n ? 'bullhorn-outline'\n : 'video-outline';\n\n return (\n <KeyboardAwareScreen style={styles.root} testID=\"media-generator\">\n <View style={styles.header}>\n <Pressable\n onPress={() => {\n dismissKeyboard();\n onClose();\n }}\n hitSlop={10}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Close\"\n >\n <MaterialCommunityIcons name=\"close\" size={22} color=\"#F7F7FA\" />\n </Pressable>\n <Text style={styles.headerTitle}>{title}</Text>\n <View style={{ width: 22 }} />\n </View>\n\n <Pressable style={styles.stage} onPress={dismissKeyboard} accessible={false}>\n {referenceUrl ? (\n <Image source={{ uri: referenceUrl }} style={StyleSheet.absoluteFill} contentFit=\"contain\" />\n ) : (\n <MaterialCommunityIcons name={stageIcon} size={56} color=\"#2A2440\" />\n )}\n {(busy || capturing) && (\n <View style={styles.busyVeil}>\n <ActivityIndicator color=\"#F7F7FA\" />\n <Text style={styles.busyLabel}>\n {capturing\n ? 'Capturing frame…'\n : promoProgress || `Generating ${mode === 'promo' ? 'promo' : mode}…`}\n </Text>\n </View>\n )}\n </Pressable>\n\n {mode === 'video' && item?.type === 'video' && !restyle && !keyboardOpen ? (\n <View style={styles.frameScrub}>\n <Text style={styles.frameScrubLabel}>Frame · {frameSec.toFixed(1)}s</Text>\n <View style={styles.aspectRow}>\n {[0.5, 1, 2, 3, 5].map((sec) => (\n <Pressable\n key={sec}\n onPress={() => setFrameSec(sec)}\n style={[styles.chip, frameSec === sec && styles.chipOn]}\n >\n <Text style={[styles.chipLabel, frameSec === sec && styles.chipLabelOn]}>{sec}s</Text>\n </Pressable>\n ))}\n </View>\n </View>\n ) : null}\n\n {keyboardOpen ? null : (\n <Pressable onPress={dismissKeyboard} accessible={false}>\n <Text style={styles.hint}>{hint}</Text>\n </Pressable>\n )}\n\n {mode === 'promo' && !keyboardOpen ? (\n <View style={styles.promoBlock}>\n <View style={styles.aspectRow}>\n {PROMO_PRESETS.map((preset) => (\n <Pressable\n key={preset.id}\n onPress={() => {\n setPromoPreset(preset.id);\n setPromoDuration(preset.defaultDurationSeconds as (typeof PROMO_DURATIONS)[number]);\n setPromoNarration(defaultNarration(preset.id));\n setPromoQuality(defaultPromoQuality(preset.id));\n }}\n style={[styles.chip, promoPreset === preset.id && styles.chipOn]}\n accessibilityRole=\"button\"\n >\n <Text style={[styles.chipLabel, promoPreset === preset.id && styles.chipLabelOn]}>\n {preset.name}\n </Text>\n </Pressable>\n ))}\n </View>\n <View style={styles.aspectRow}>\n {PROMO_DURATIONS.map((secs) => (\n <Pressable\n key={secs}\n onPress={() => setPromoDuration(secs)}\n style={[styles.chip, promoDuration === secs && styles.chipOn]}\n accessibilityRole=\"button\"\n >\n <Text style={[styles.chipLabel, promoDuration === secs && styles.chipLabelOn]}>\n {secs}s\n </Text>\n </Pressable>\n ))}\n </View>\n <View style={styles.aspectRow}>\n <Pressable\n onPress={() => setPromoCaptions((v) => !v)}\n style={[styles.chip, promoCaptions && styles.chipOn]}\n accessibilityRole=\"button\"\n >\n <Text style={[styles.chipLabel, promoCaptions && styles.chipLabelOn]}>Captions</Text>\n </Pressable>\n <Pressable\n onPress={() => setPromoNarration((v) => !v)}\n style={[styles.chip, promoNarration && styles.chipOn]}\n accessibilityRole=\"button\"\n >\n <Text style={[styles.chipLabel, promoNarration && styles.chipLabelOn]}>Narration</Text>\n </Pressable>\n </View>\n <View style={styles.aspectRow}>\n {PROMO_PLAYBOOKS.map((p) => (\n <Pressable\n key={p.id || 'default'}\n onPress={() => setPromoPlaybook(p.id)}\n style={[styles.chip, promoPlaybook === p.id && styles.chipOn]}\n accessibilityRole=\"button\"\n >\n <Text style={[styles.chipLabel, promoPlaybook === p.id && styles.chipLabelOn]}>\n {p.name}\n </Text>\n </Pressable>\n ))}\n </View>\n <PromoContextFields\n value={promoContext}\n onChange={(patch) => setPromoContext((prev) => ({ ...prev, ...patch }))}\n logoUrl={promoLogoUrl}\n onPickLogo={\n item?.type === 'image' ? () => setPromoLogoUrl(unwrapProxyUrl(item.src)) : undefined\n }\n onClearLogo={() => setPromoLogoUrl(null)}\n />\n <PromoProductionFields\n quality={promoQuality}\n onQuality={setPromoQuality}\n narrator={promoNarrator}\n onNarrator={setPromoNarrator}\n useCases={promoUseCases}\n onUseCases={setPromoUseCases}\n {...(onPromoDesigned && !lookupPromoPreset(promoPreset).produceOnly\n ? { designModel: promoDesignModel, onDesignModel: setPromoDesignModel }\n : {})}\n />\n </View>\n ) : null}\n\n {mode !== 'promo' && models.length > 0 && !keyboardOpen ? (\n <ScrollView horizontal showsHorizontalScrollIndicator={false} contentContainerStyle={styles.aspectRow}>\n {models.map((model) => {\n const blocked = Boolean(videoSourceUrl) && !model.supportsVideoInput;\n return (\n <Pressable\n key={model.id}\n onPress={() => !blocked && setSelectedModel(model.id)}\n disabled={blocked}\n style={[\n styles.chip,\n selectedModel === model.id && styles.chipOn,\n blocked && styles.chipBlocked,\n ]}\n accessibilityRole=\"button\"\n >\n <Text\n style={[\n styles.chipLabel,\n selectedModel === model.id && styles.chipLabelOn,\n blocked && styles.chipLabelBlocked,\n ]}\n numberOfLines={1}\n >\n {model.label || model.id}\n </Text>\n </Pressable>\n );\n })}\n </ScrollView>\n ) : null}\n\n {mode === 'video' && durationChoices.length > 0 && !keyboardOpen ? (\n <View style={styles.aspectRow}>\n <Pressable\n onPress={() => setVideoDuration(0)}\n style={[styles.chip, videoDuration === 0 && styles.chipOn]}\n accessibilityRole=\"button\"\n >\n <Text style={[styles.chipLabel, videoDuration === 0 && styles.chipLabelOn]}>\n {selectedModelInfo?.defaultDurationSeconds\n ? `Auto (${selectedModelInfo.defaultDurationSeconds}s)`\n : 'Auto'}\n </Text>\n </Pressable>\n {durationChoices.map((secs) => (\n <Pressable\n key={secs}\n onPress={() => setVideoDuration(secs)}\n style={[styles.chip, videoDuration === secs && styles.chipOn]}\n accessibilityRole=\"button\"\n >\n <Text style={[styles.chipLabel, videoDuration === secs && styles.chipLabelOn]}>\n {secs}s\n </Text>\n </Pressable>\n ))}\n </View>\n ) : null}\n\n {mode !== 'audio' ? (\n <View style={styles.aspectRow}>\n {(mode === 'promo' ? PROMO_ASPECT_RATIOS : ASPECTS).map((value) => (\n <Pressable\n key={value}\n onPress={() => setAspect(value as (typeof ASPECTS)[number])}\n style={[styles.chip, aspect === value && styles.chipOn]}\n accessibilityRole=\"button\"\n >\n <Text style={[styles.chipLabel, aspect === value && styles.chipLabelOn]}>{value}</Text>\n </Pressable>\n ))}\n </View>\n ) : null}\n\n <KeyboardComposerDock closedInset={insets.bottom} onSwipeUp={() => inputRef.current?.focus()}>\n <View style={styles.composer}>\n <TextInput\n ref={inputRef}\n nativeID={COMPOSER_INPUT_NATIVE_ID}\n value={prompt}\n onChangeText={setPrompt}\n placeholder={\n mode === 'image'\n ? 'Describe the image…'\n : mode === 'audio'\n ? 'Describe the audio…'\n : mode === 'promo'\n ? 'Describe the promo…'\n : 'Describe the video…'\n }\n placeholderTextColor=\"#7A7A88\"\n style={styles.input}\n multiline\n editable={!busy}\n />\n {mode === 'promo' && onPromoDesigned && !lookupPromoPreset(promoPreset).produceOnly ? (\n <Pressable\n onPress={() => {\n if (!runAction || busy || !prompt.trim()) return;\n setBusy(true);\n setNotice(null);\n designPromoProject((action, params) => runAction(PROMO_CONNECTOR, action, params), {\n prompt: prompt.trim(),\n preset: promoPreset,\n durationSeconds: promoDuration,\n aspectRatio: aspect,\n ...(referenceUrl ? { referenceImageUrls: [unwrapProxyUrl(referenceUrl)] } : {}),\n ...(item?.type === 'video' ? { sourceVideoUrl: unwrapProxyUrl(item.src) } : {}),\n ...(promoLogoUrl ? { logoUrl: promoLogoUrl } : {}),\n ...promoContext,\n ...(promoPlaybook ? { stylePlaybook: promoPlaybook } : {}),\n ...(promoDesignModel ? { model: promoDesignModel } : {}),\n })\n .then((designed) => onPromoDesigned(designed))\n .catch((err: unknown) => setNotice(friendlyMediaError(err, 'promo design')))\n .finally(() => setBusy(false));\n }}\n disabled={busy || capturing || !prompt.trim()}\n style={[styles.designSend, (!prompt.trim() || busy || capturing) && styles.sendDisabled]}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Design editable cut\"\n >\n <Text style={styles.designSendLabel}>Design</Text>\n </Pressable>\n ) : null}\n <Pressable\n onPress={generate}\n disabled={busy || capturing || !prompt.trim()}\n style={[styles.send, (!prompt.trim() || busy || capturing) && styles.sendDisabled]}\n accessibilityRole=\"button\"\n accessibilityLabel={`Generate ${mode}`}\n >\n {busy ? (\n <ActivityIndicator color=\"#0A0A0C\" />\n ) : (\n <MaterialCommunityIcons name=\"arrow-right\" size={20} color=\"#0A0A0C\" />\n )}\n </Pressable>\n </View>\n </KeyboardComposerDock>\n\n {notice ? (\n <View style={styles.notice}>\n <Text style={styles.noticeText}>{notice}</Text>\n <Pressable onPress={() => setNotice(null)} hitSlop={8}>\n <Text style={styles.noticeDismiss}>OK</Text>\n </Pressable>\n </View>\n ) : null}\n </KeyboardAwareScreen>\n );\n}\n\nconst styles = StyleSheet.create({\n root: { flex: 1, backgroundColor: '#0A0A0C' },\n header: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n paddingHorizontal: 16,\n paddingVertical: 12,\n },\n headerTitle: { color: '#F7F7FA', fontSize: 15, fontWeight: '600' },\n stage: {\n flex: 1,\n marginHorizontal: 14,\n borderRadius: 18,\n backgroundColor: '#0F0F14',\n overflow: 'hidden',\n alignItems: 'center',\n justifyContent: 'center',\n },\n busyVeil: {\n ...StyleSheet.absoluteFillObject,\n alignItems: 'center',\n justifyContent: 'center',\n gap: 10,\n backgroundColor: 'rgba(10, 10, 12, 0.55)',\n },\n busyLabel: { color: '#E8E8EE', fontSize: 12.5 },\n hint: { color: '#9A9AA5', fontSize: 12.5, paddingHorizontal: 18, paddingTop: 12 },\n frameScrub: { paddingTop: 8, gap: 4 },\n frameScrubLabel: { color: '#9A9AA5', fontSize: 11, paddingHorizontal: 18 },\n promoBlock: { paddingTop: 4 },\n aspectRow: { flexDirection: 'row', flexWrap: 'wrap', gap: 8, paddingHorizontal: 16, paddingTop: 10 },\n chip: {\n paddingHorizontal: 12,\n paddingVertical: 7,\n borderRadius: 9,\n backgroundColor: '#1F1F24',\n },\n chipOn: { backgroundColor: '#8B7CFF' },\n chipBlocked: { opacity: 0.4 },\n chipLabel: { color: '#F7F7FA', fontSize: 12.5, fontWeight: '500' },\n chipLabelOn: { color: '#0A0A0C' },\n chipLabelBlocked: { color: '#7A7A88' },\n composer: {\n flexDirection: 'row',\n alignItems: 'flex-end',\n gap: 10,\n paddingHorizontal: 14,\n paddingTop: 12,\n paddingBottom: 8,\n },\n input: {\n flex: 1,\n minHeight: 44,\n maxHeight: 120,\n borderRadius: 12,\n paddingHorizontal: 14,\n paddingVertical: 10,\n backgroundColor: '#1F1F24',\n color: '#F7F7FA',\n fontSize: 15,\n },\n send: {\n width: 44,\n height: 44,\n borderRadius: 22,\n backgroundColor: '#8B7CFF',\n alignItems: 'center',\n justifyContent: 'center',\n },\n designSend: {\n paddingHorizontal: 12,\n height: 44,\n borderRadius: 22,\n backgroundColor: '#FDE8D8',\n alignItems: 'center',\n justifyContent: 'center',\n },\n designSendLabel: { fontSize: 13, fontWeight: '700', color: '#9a3412' },\n sendDisabled: { opacity: 0.4 },\n notice: {\n position: 'absolute',\n left: 20,\n right: 20,\n bottom: 24,\n flexDirection: 'row',\n alignItems: 'center',\n gap: 12,\n paddingHorizontal: 14,\n paddingVertical: 11,\n borderRadius: 12,\n backgroundColor: 'rgba(248, 250, 252, 0.96)',\n },\n noticeText: { flex: 1, color: '#0f172a', fontSize: 13 },\n noticeDismiss: { color: '#6C5CE7', fontSize: 13, fontWeight: '600' },\n});\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"VideoGeneratorExperience.js","sources":["../../../src/features/canvas/VideoGeneratorExperience.tsx"],"sourcesContent":["/**\n * Native twin of web canvas generator panel (bottom-dock Image / Video / Audio,\n * plus toolbar \"Create Video\").\n *\n * Web: `openGeneratorPanel(mode)` then `generateImageViaExec` /\n * `generateVideoViaExec` / `generateAudioViaExec`. A selected image/video only\n * seeds the video lane as `referenceImageUrl`.\n */\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { ActivityIndicator, ScrollView, StyleSheet, Text, TextInput, View } from 'react-native';\n// NEVER import react-native-safe-area-context here: this module ships OTA in\n// the federated canvas remote, where a top-level import of that library can be\n// fatal at eval (duplicate RNCSafeAreaProvider registration) or throw at\n// render (foreign insets context). useSafeInsets degrades gracefully instead.\nimport { useSafeInsets } from './withRemoteSafeArea';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { Image } from 'expo-image';\nimport {\n COMPOSER_INPUT_NATIVE_ID,\n KeyboardAwareScreen,\n KeyboardComposerDock,\n useKeyboardLiftHeight,\n} from '../../components/KeyboardComposerDock';\nimport { dismissKeyboard } from '../../utils/keyboardController';\nimport type { CanvasItem } from './canvasCore';\nimport {\n friendlyMediaError,\n generationImageUrl,\n generationMediaUrl,\n resultUrl,\n type RunMediaAction,\n} from './videoEditor/mediaActions';\nimport { unwrapProxyUrl } from './videoEditor/remoteMediaClient';\nimport {\n STATIC_VIDEO_MODELS,\n buildVideoGenerateParams,\n normalizeModels,\n promptAudioModels,\n videoDurationOptions,\n type ModelInfo,\n} from './generationModels';\nimport {\n DEFAULT_PROMO_PRESET,\n EMPTY_PROMO_CONTEXT,\n PROMO_ASPECT_RATIOS,\n PROMO_CONNECTOR,\n PROMO_DURATIONS,\n PROMO_PLAYBOOKS,\n PROMO_PRESETS,\n defaultNarration,\n designPromoProject,\n defaultPromoQuality,\n lookupPromoPreset,\n producePromoVideo,\n type DesignedPromo,\n type PromoContext,\n type PromoQuality,\n} from './promoVideo';\nimport { PromoContextFields, PromoProductionFields } from './PromoContextFields';\nimport { useCanvasTheme, themedStyles, type CanvasPalette } from './canvasTheme';\nimport { Pressable, HIT, RADIUS, SPACE, Segmented, TYPE, pressedStyle } from './canvasUi';\n\n/** RN gives a horizontal ScrollView flexGrow 1: on a fixed-height screen a chip row swells into empty space. */\nconst HSCROLL = { flexGrow: 0 } as const;\n\nconst ASPECTS = ['16:9', '9:16', '1:1'] as const;\n\nexport type GeneratorMode = 'image' | 'video' | 'audio' | 'promo';\n\nexport interface VideoGeneratorExperienceProps {\n mode?: GeneratorMode;\n item?: CanvasItem | null;\n /** Web \"Restyle\": video-to-video. Create Video on a clip still captures a still. */\n restyle?: boolean;\n /** Home composer / Looks seed. */\n initialPrompt?: string;\n runAction?: RunMediaAction;\n onClose: () => void;\n onGenerated: (url: string, meta: { prompt: string; aspect: string; mode: GeneratorMode }) => void;\n /** Promo design lane → open video editor (CanvasExperience wires this). */\n onPromoDesigned?: (designed: DesignedPromo) => void;\n}\n\nexport function VideoGeneratorExperience({\n mode = 'video',\n item,\n restyle = false,\n initialPrompt = '',\n runAction,\n onClose,\n onGenerated,\n onPromoDesigned,\n}: VideoGeneratorExperienceProps) {\n const theme = useCanvasTheme();\n const styles = useMemo(() => makeStyles(theme), [theme]);\n const imageReference =\n (mode === 'video' || mode === 'promo') && item?.type === 'image' ? unwrapProxyUrl(item.src) : null;\n const [referenceUrl, setReferenceUrl] = useState<string | null>(imageReference);\n const [videoSourceUrl, setVideoSourceUrl] = useState<string | null>(\n restyle && item?.type === 'video' ? unwrapProxyUrl(item.src) : null,\n );\n const [capturing, setCapturing] = useState(mode === 'video' && item?.type === 'video' && !restyle);\n const [frameSec, setFrameSec] = useState(1);\n const [models, setModels] = useState<ModelInfo[]>(mode === 'video' ? STATIC_VIDEO_MODELS : []);\n const [selectedModel, setSelectedModel] = useState('');\n const [videoDuration, setVideoDuration] = useState(0);\n const [prompt, setPrompt] = useState(initialPrompt);\n const [aspect, setAspect] = useState<(typeof ASPECTS)[number]>(mode === 'image' ? '1:1' : '16:9');\n const [promoPreset, setPromoPreset] = useState(\n mode === 'promo' && item?.type === 'video' ? 'footage-remix' : DEFAULT_PROMO_PRESET,\n );\n const [promoDuration, setPromoDuration] = useState<(typeof PROMO_DURATIONS)[number]>(\n lookupPromoPreset(mode === 'promo' && item?.type === 'video' ? 'footage-remix' : DEFAULT_PROMO_PRESET)\n .defaultDurationSeconds as (typeof PROMO_DURATIONS)[number],\n );\n const [promoCaptions, setPromoCaptions] = useState(true);\n const [promoNarration, setPromoNarration] = useState(defaultNarration(DEFAULT_PROMO_PRESET));\n const [promoContext, setPromoContext] = useState<PromoContext>(EMPTY_PROMO_CONTEXT);\n const [promoPlaybook, setPromoPlaybook] = useState('');\n const [promoQuality, setPromoQuality] = useState<PromoQuality>(() =>\n defaultPromoQuality(mode === 'promo' && item?.type === 'video' ? 'footage-remix' : DEFAULT_PROMO_PRESET),\n );\n const [promoNarrator, setPromoNarrator] = useState('');\n const [promoUseCases, setPromoUseCases] = useState('');\n const [promoDesignModel, setPromoDesignModel] = useState('');\n const [promoLogoUrl, setPromoLogoUrl] = useState<string | null>(\n mode === 'promo' && item?.type === 'image' ? unwrapProxyUrl(item.src) : null,\n );\n const [busy, setBusy] = useState(false);\n const [notice, setNotice] = useState<string | null>(null);\n // The promo lane's step text under the busy spinner. A 9/2 merge dropped\n // this line and kept its uses: every generation from this screen threw\n // \"Property 'promoProgress' doesn't exist\" on its first busy render.\n const [promoProgress, setPromoProgress] = useState<string | null>(null);\n const insets = useSafeInsets();\n const inputRef = useRef<TextInput>(null);\n const cancelledRef = useRef(false);\n const keyboardHeight = useKeyboardLiftHeight();\n const keyboardOpen = keyboardHeight > 0;\n\n useEffect(() => {\n cancelledRef.current = false;\n return () => {\n cancelledRef.current = true;\n };\n }, []);\n\n useEffect(() => {\n if (mode !== 'video' || restyle || item?.type !== 'video' || !runAction) {\n setCapturing(false);\n return;\n }\n let cancelled = false;\n setCapturing(true);\n runAction('yantra-video-editing', 'YANTRA_VIDEO_EDIT_THUMBNAIL', {\n input_url: item.src,\n time_secs: frameSec,\n })\n .then((result) => {\n if (cancelled) return;\n setReferenceUrl(resultUrl(result, 'YANTRA_VIDEO_EDIT_THUMBNAIL'));\n })\n .catch((err: unknown) => {\n if (cancelled) return;\n setNotice(\n `Could not capture a still from this clip, so generating without a reference.\\n\\n${\n err instanceof Error ? err.message : String(err)\n }`.slice(0, 280),\n );\n })\n .finally(() => {\n if (!cancelled) setCapturing(false);\n });\n return () => {\n cancelled = true;\n };\n }, [frameSec, item?.src, item?.type, mode, restyle, runAction]);\n\n useEffect(() => {\n if (!runAction || mode === 'promo') return undefined;\n let cancelled = false;\n const job =\n mode === 'image'\n ? runAction('yantra-image-generation', 'YANTRA_GEMINI_IMAGE_LIST_MODELS', {})\n : mode === 'audio'\n ? runAction('yantra-audio', 'YANTRA_AUDIO_LIST_MODELS', {})\n : runAction('yantra-video-generation', 'YANTRA_VIDEO_GENERATION_LIST_MODELS', {});\n job.then((result) => {\n if (cancelled) return;\n let list = normalizeModels(result);\n if (mode === 'audio') list = promptAudioModels(list);\n if (mode === 'video' && list.length === 0) list = STATIC_VIDEO_MODELS;\n setModels(list);\n const prefer = restyle && mode === 'video' ? list.find((m) => m.supportsVideoInput)?.id : list[0]?.id;\n if (prefer) setSelectedModel((current) => current || prefer);\n }).catch(() => {\n if (cancelled) return;\n if (mode === 'video') {\n setModels(STATIC_VIDEO_MODELS);\n setSelectedModel((current) => current || STATIC_VIDEO_MODELS[0].id);\n }\n });\n return () => {\n cancelled = true;\n };\n }, [mode, restyle, runAction]);\n\n const selectedModelInfo = models.find((m) => m.id === selectedModel);\n const durationChoices = mode === 'video' ? videoDurationOptions(selectedModelInfo) : [];\n\n useEffect(() => {\n if (videoDuration && !durationChoices.includes(videoDuration)) setVideoDuration(0);\n }, [durationChoices, videoDuration]);\n\n const generate = () => {\n const text = prompt.trim();\n if (!text || busy || capturing) return;\n if (!runAction) {\n setNotice('Generation needs the host connector, which this host has not wired up.');\n return;\n }\n setBusy(true);\n setNotice(null);\n const job =\n mode === 'image'\n ? runAction('yantra-image-generation', 'YANTRA_GEMINI_IMAGE_GENERATE', {\n prompt: text,\n aspectRatio: aspect,\n ...(selectedModel ? { model: selectedModel } : {}),\n }).then((result) => generationImageUrl(result))\n : mode === 'audio'\n ? runAction('yantra-audio', 'YANTRA_AUDIO_RUN_PROMPT', {\n prompt: text,\n ...(selectedModel ? { model: selectedModel } : {}),\n }).then((result) => resultUrl(result, 'YANTRA_AUDIO_RUN_PROMPT'))\n : mode === 'promo'\n ? producePromoVideo(\n (action, params) => runAction(PROMO_CONNECTOR, action, params),\n {\n prompt: text,\n preset: promoPreset,\n durationSeconds: promoDuration,\n aspectRatio: aspect,\n ...(referenceUrl ? { referenceImageUrls: [unwrapProxyUrl(referenceUrl)] } : {}),\n ...(item?.type === 'video' ? { sourceVideoUrl: unwrapProxyUrl(item.src) } : {}),\n captions: promoCaptions,\n narration: promoNarration,\n ...(promoLogoUrl ? { logoUrl: promoLogoUrl } : {}),\n ...promoContext,\n ...(promoPlaybook ? { stylePlaybook: promoPlaybook } : {}),\n quality: promoQuality,\n ...(promoNarrator ? { narratorVoice: promoNarrator } : {}),\n ...(promoUseCases.trim() ? { useCases: promoUseCases } : {}),\n },\n (msg) => setPromoProgress(msg),\n undefined,\n () => cancelledRef.current,\n ).then((promo) => promo.url)\n : runAction(\n 'yantra-video-generation',\n 'YANTRA_VIDEO_GENERATION_GENERATE',\n buildVideoGenerateParams({\n prompt: text,\n aspectRatio: aspect,\n model: selectedModel || undefined,\n durationSeconds: videoDuration || undefined,\n referenceImageUrl: referenceUrl ? unwrapProxyUrl(referenceUrl) : undefined,\n referenceVideoUrl: videoSourceUrl ? unwrapProxyUrl(videoSourceUrl) : undefined,\n }),\n ).then((result) => generationMediaUrl(result));\n job.then((url) => onGenerated(url, { prompt: text, aspect, mode }))\n .catch((err: unknown) => {\n if (cancelledRef.current || (err instanceof Error && err.message === 'cancelled')) return;\n setNotice(friendlyMediaError(err, `${mode} generation`));\n })\n .finally(() => {\n setBusy(false);\n setPromoProgress(null);\n });\n };\n\n const title =\n mode === 'image'\n ? 'Create image'\n : mode === 'audio'\n ? 'Create audio'\n : mode === 'promo'\n ? 'Marketing video'\n : restyle\n ? 'Restyle this clip'\n : item?.type === 'video'\n ? 'Continue this clip'\n : 'Create video';\n const hint =\n mode === 'image'\n ? 'Describe the image you want on this board.'\n : mode === 'audio'\n ? 'Describe the audio you want on this board.'\n : mode === 'promo'\n ? item?.type === 'video'\n ? 'This clip is the footage. Describe the promo you want cut from it.'\n : 'Describe the marketing video: brand, offer, and who it is for.'\n : restyle\n ? 'This footage is the source. Describe how it should look after the restyle.'\n : item?.type === 'video'\n ? 'The new clip starts from a still of this video. Describe what happens next.'\n : item?.type === 'image'\n ? 'This image is the reference. Describe the motion you want.'\n : 'Describe the video you want on this board.';\n const stageIcon =\n mode === 'image'\n ? 'image-outline'\n : mode === 'audio'\n ? 'microphone-outline'\n : mode === 'promo'\n ? 'bullhorn-outline'\n : 'video-outline';\n\n return (\n <KeyboardAwareScreen style={styles.root} testID=\"media-generator\">\n <View style={styles.header}>\n <Pressable\n onPress={() => {\n dismissKeyboard();\n onClose();\n }}\n hitSlop={4}\n style={({ pressed }) => [styles.headerButton, pressedStyle(pressed)]}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Close\"\n >\n <MaterialCommunityIcons name=\"close\" size={20} color={theme.foreground} />\n </Pressable>\n <Text style={styles.headerTitle}>{title}</Text>\n <View style={styles.headerSpacer} />\n </View>\n\n <Pressable\n style={[styles.stage, mode === 'promo' && styles.stageCompact]}\n onPress={dismissKeyboard}\n accessible={false}\n >\n {referenceUrl ? (\n <Image source={{ uri: referenceUrl }} style={StyleSheet.absoluteFill} contentFit=\"contain\" />\n ) : (\n <MaterialCommunityIcons name={stageIcon} size={48} color=\"rgba(255,255,255,0.22)\" />\n )}\n {(busy || capturing) && (\n <View style={styles.busyVeil}>\n <ActivityIndicator color=\"#F7F7FA\" />\n <Text style={styles.busyLabel}>\n {capturing\n ? 'Capturing frame…'\n : promoProgress || `Generating ${mode === 'promo' ? 'promo' : mode}…`}\n </Text>\n </View>\n )}\n </Pressable>\n\n {mode === 'video' && item?.type === 'video' && !restyle && !keyboardOpen ? (\n <View style={styles.frameScrub}>\n <Text style={styles.frameScrubLabel}>Frame · {frameSec.toFixed(1)}s</Text>\n <View style={styles.aspectRow}>\n {[0.5, 1, 2, 3, 5].map((sec) => (\n <Pressable\n key={sec}\n onPress={() => setFrameSec(sec)}\n style={({ pressed }) => [\n styles.chip,\n frameSec === sec && styles.chipOn,\n pressedStyle(pressed),\n ]}\n >\n <Text style={[styles.chipLabel, frameSec === sec && styles.chipLabelOn]}>{sec}s</Text>\n </Pressable>\n ))}\n </View>\n </View>\n ) : null}\n\n {keyboardOpen ? null : (\n <Pressable onPress={dismissKeyboard} accessible={false}>\n <Text style={styles.hint}>{hint}</Text>\n </Pressable>\n )}\n\n {mode === 'promo' && !keyboardOpen ? (\n // Promo has many settings: they scroll in their own region, grouped and labelled,\n // so the wall of chips becomes a short form.\n <ScrollView\n style={styles.promoScroll}\n contentContainerStyle={styles.promoBlock}\n keyboardShouldPersistTaps=\"handled\"\n >\n <Text style={styles.groupLabel}>Format</Text>\n <ScrollView\n style={HSCROLL}\n horizontal\n showsHorizontalScrollIndicator={false}\n contentContainerStyle={styles.railRow}\n >\n {PROMO_PRESETS.map((preset) => {\n const on = promoPreset === preset.id;\n return (\n <Pressable\n key={preset.id}\n onPress={() => {\n setPromoPreset(preset.id);\n setPromoDuration(\n preset.defaultDurationSeconds as (typeof PROMO_DURATIONS)[number],\n );\n setPromoNarration(defaultNarration(preset.id));\n setPromoQuality(defaultPromoQuality(preset.id));\n }}\n style={({ pressed }) => [\n styles.presetCard,\n on && styles.presetCardOn,\n pressedStyle(pressed),\n ]}\n accessibilityRole=\"button\"\n accessibilityState={{ selected: on }}\n >\n <View style={styles.presetHead}>\n <Text style={[styles.presetName, on && styles.presetNameOn]} numberOfLines={1}>\n {preset.name}\n </Text>\n {on ? (\n <MaterialCommunityIcons\n name=\"check-circle\"\n size={16}\n color={theme.background}\n />\n ) : null}\n </View>\n <Text style={[styles.presetDesc, on && styles.presetDescOn]} numberOfLines={3}>\n {preset.description}\n </Text>\n </Pressable>\n );\n })}\n </ScrollView>\n\n <View style={styles.groupRow}>\n <View style={styles.groupCol}>\n <Text style={styles.groupLabel}>Length</Text>\n <Segmented\n options={PROMO_DURATIONS.map((secs) => ({ id: String(secs), label: `${secs}s` }))}\n value={String(promoDuration)}\n onChange={(id) => setPromoDuration(Number(id) as (typeof PROMO_DURATIONS)[number])}\n style={styles.padded}\n />\n </View>\n </View>\n\n <Text style={styles.groupLabel}>Style</Text>\n <ScrollView\n style={HSCROLL}\n horizontal\n showsHorizontalScrollIndicator={false}\n contentContainerStyle={styles.railRow}\n >\n {PROMO_PLAYBOOKS.map((p) => (\n <Pressable\n key={p.id || 'default'}\n onPress={() => setPromoPlaybook(p.id)}\n style={({ pressed }) => [\n styles.chip,\n promoPlaybook === p.id && styles.chipOn,\n pressedStyle(pressed),\n ]}\n accessibilityRole=\"button\"\n >\n <Text style={[styles.chipLabel, promoPlaybook === p.id && styles.chipLabelOn]}>\n {p.name}\n </Text>\n </Pressable>\n ))}\n </ScrollView>\n\n <Text style={styles.groupLabel}>Extras</Text>\n <View style={styles.railRowWrap}>\n {(\n [\n ['Captions', promoCaptions, () => setPromoCaptions((v) => !v)],\n ['Narration', promoNarration, () => setPromoNarration((v) => !v)],\n ] as const\n ).map(([label, on, toggle]) => (\n <Pressable\n key={label}\n onPress={toggle}\n style={({ pressed }) => [\n styles.chip,\n styles.toggleChip,\n on && styles.chipOn,\n pressedStyle(pressed),\n ]}\n accessibilityRole=\"switch\"\n accessibilityState={{ checked: on }}\n >\n <MaterialCommunityIcons\n name={on ? 'check' : 'plus'}\n size={16}\n color={on ? theme.background : theme.mutedForeground}\n />\n <Text style={[styles.chipLabel, on && styles.chipLabelOn]}>{label}</Text>\n </Pressable>\n ))}\n </View>\n\n <View style={styles.promoFields}>\n <PromoContextFields\n value={promoContext}\n onChange={(patch) => setPromoContext((prev) => ({ ...prev, ...patch }))}\n logoUrl={promoLogoUrl}\n onPickLogo={\n item?.type === 'image' ? () => setPromoLogoUrl(unwrapProxyUrl(item.src)) : undefined\n }\n onClearLogo={() => setPromoLogoUrl(null)}\n />\n <PromoProductionFields\n quality={promoQuality}\n onQuality={setPromoQuality}\n narrator={promoNarrator}\n onNarrator={setPromoNarrator}\n useCases={promoUseCases}\n onUseCases={setPromoUseCases}\n {...(onPromoDesigned && !lookupPromoPreset(promoPreset).produceOnly\n ? { designModel: promoDesignModel, onDesignModel: setPromoDesignModel }\n : {})}\n />\n </View>\n </ScrollView>\n ) : null}\n\n {mode !== 'promo' && models.length > 0 && !keyboardOpen ? (\n <ScrollView\n style={HSCROLL}\n horizontal\n showsHorizontalScrollIndicator={false}\n contentContainerStyle={styles.aspectRow}\n >\n {models.map((model) => {\n const blocked = Boolean(videoSourceUrl) && !model.supportsVideoInput;\n return (\n <Pressable\n key={model.id}\n onPress={() => !blocked && setSelectedModel(model.id)}\n disabled={blocked}\n style={({ pressed }) => [\n styles.chip,\n selectedModel === model.id && styles.chipOn,\n blocked && styles.chipBlocked,\n pressedStyle(pressed && !blocked),\n ]}\n accessibilityRole=\"button\"\n >\n <Text\n style={[\n styles.chipLabel,\n selectedModel === model.id && styles.chipLabelOn,\n blocked && styles.chipLabelBlocked,\n ]}\n numberOfLines={1}\n >\n {model.label || model.id}\n </Text>\n </Pressable>\n );\n })}\n </ScrollView>\n ) : null}\n\n {mode === 'video' && durationChoices.length > 0 && !keyboardOpen ? (\n <View style={styles.aspectRow}>\n <Pressable\n onPress={() => setVideoDuration(0)}\n style={({ pressed }) => [\n styles.chip,\n videoDuration === 0 && styles.chipOn,\n pressedStyle(pressed),\n ]}\n accessibilityRole=\"button\"\n >\n <Text style={[styles.chipLabel, videoDuration === 0 && styles.chipLabelOn]}>\n {selectedModelInfo?.defaultDurationSeconds\n ? `Auto (${selectedModelInfo.defaultDurationSeconds}s)`\n : 'Auto'}\n </Text>\n </Pressable>\n {durationChoices.map((secs) => (\n <Pressable\n key={secs}\n onPress={() => setVideoDuration(secs)}\n style={({ pressed }) => [\n styles.chip,\n videoDuration === secs && styles.chipOn,\n pressedStyle(pressed),\n ]}\n accessibilityRole=\"button\"\n >\n <Text style={[styles.chipLabel, videoDuration === secs && styles.chipLabelOn]}>\n {secs}s\n </Text>\n </Pressable>\n ))}\n </View>\n ) : null}\n\n {mode !== 'audio' ? (\n <View style={styles.segmentRow}>\n <Segmented\n options={(mode === 'promo' ? PROMO_ASPECT_RATIOS : ASPECTS).map((value) => ({\n id: value as string,\n label: value,\n }))}\n value={aspect as string}\n onChange={(value) => setAspect(value as (typeof ASPECTS)[number])}\n style={styles.segmented}\n />\n </View>\n ) : null}\n\n <KeyboardComposerDock closedInset={insets.bottom} onSwipeUp={() => inputRef.current?.focus()}>\n <View style={styles.composer}>\n <View style={styles.composerField}>\n <TextInput\n ref={inputRef}\n nativeID={COMPOSER_INPUT_NATIVE_ID}\n value={prompt}\n onChangeText={setPrompt}\n placeholder={\n mode === 'image'\n ? 'Describe the image…'\n : mode === 'audio'\n ? 'Describe the audio…'\n : mode === 'promo'\n ? 'Describe the promo…'\n : 'Describe the video…'\n }\n placeholderTextColor={theme.mutedForeground}\n style={styles.input}\n multiline\n editable={!busy}\n />\n {mode === 'promo' && onPromoDesigned && !lookupPromoPreset(promoPreset).produceOnly ? (\n <Pressable\n onPress={() => {\n if (!runAction || busy || !prompt.trim()) return;\n setBusy(true);\n setNotice(null);\n designPromoProject((action, params) => runAction(PROMO_CONNECTOR, action, params), {\n prompt: prompt.trim(),\n preset: promoPreset,\n durationSeconds: promoDuration,\n aspectRatio: aspect,\n ...(referenceUrl ? { referenceImageUrls: [unwrapProxyUrl(referenceUrl)] } : {}),\n ...(item?.type === 'video' ? { sourceVideoUrl: unwrapProxyUrl(item.src) } : {}),\n ...(promoLogoUrl ? { logoUrl: promoLogoUrl } : {}),\n ...promoContext,\n ...(promoPlaybook ? { stylePlaybook: promoPlaybook } : {}),\n ...(promoDesignModel ? { model: promoDesignModel } : {}),\n })\n .then((designed) => onPromoDesigned(designed))\n .catch((err: unknown) => setNotice(friendlyMediaError(err, 'promo design')))\n .finally(() => setBusy(false));\n }}\n disabled={busy || capturing || !prompt.trim()}\n style={({ pressed }) => [\n styles.designSend,\n (!prompt.trim() || busy || capturing) && styles.sendDisabled,\n pressedStyle(pressed && !busy),\n ]}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Design editable cut\"\n >\n <Text style={styles.designSendLabel}>Design</Text>\n </Pressable>\n ) : null}\n <Pressable\n onPress={generate}\n disabled={busy || capturing || !prompt.trim()}\n style={({ pressed }) => [\n styles.send,\n (!prompt.trim() || busy || capturing) && styles.sendDisabled,\n pressedStyle(pressed && !busy),\n ]}\n accessibilityRole=\"button\"\n accessibilityLabel={`Generate ${mode}`}\n >\n {busy ? (\n <ActivityIndicator color={theme.primaryForeground} />\n ) : (\n <MaterialCommunityIcons name=\"arrow-up\" size={20} color={theme.primaryForeground} />\n )}\n </Pressable>\n </View>\n </View>\n </KeyboardComposerDock>\n\n {notice ? (\n <View style={styles.notice}>\n <Text style={styles.noticeText}>{notice}</Text>\n <Pressable onPress={() => setNotice(null)} hitSlop={8}>\n <Text style={styles.noticeDismiss}>OK</Text>\n </Pressable>\n </View>\n ) : null}\n </KeyboardAwareScreen>\n );\n}\n\nconst makeStyles = themedStyles((theme: CanvasPalette) =>\n StyleSheet.create({\n root: { flex: 1, backgroundColor: theme.background },\n header: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n paddingHorizontal: SPACE.md,\n paddingVertical: SPACE.sm,\n },\n headerButton: {\n width: 40,\n height: 40,\n borderRadius: 20,\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: theme.card,\n },\n headerSpacer: { width: 40 },\n headerTitle: { ...TYPE.title, color: theme.foreground },\n stage: {\n flex: 1,\n marginHorizontal: SPACE.lg,\n marginTop: SPACE.xs,\n borderRadius: RADIUS.xl,\n backgroundColor: '#0F0F12', // media stage stays dark\n overflow: 'hidden',\n alignItems: 'center',\n justifyContent: 'center',\n },\n // Promo's settings need the height; its stage is a strip that still shows a reference or progress.\n stageCompact: { flex: 0, height: 120 },\n promoScroll: { flex: 1 },\n groupLabel: {\n ...TYPE.label,\n color: theme.mutedForeground,\n paddingHorizontal: SPACE.lg,\n marginTop: SPACE.lg,\n marginBottom: SPACE.sm,\n },\n groupRow: { flexDirection: 'row' },\n groupCol: { flex: 1 },\n padded: { marginHorizontal: SPACE.lg },\n railRow: { paddingHorizontal: SPACE.lg, gap: SPACE.sm },\n railRowWrap: { flexDirection: 'row', flexWrap: 'wrap', gap: SPACE.sm, paddingHorizontal: SPACE.lg },\n toggleChip: { flexDirection: 'row', alignItems: 'center', gap: SPACE.xs + 2 },\n presetCard: {\n width: 176,\n minHeight: 96,\n padding: SPACE.md,\n borderRadius: RADIUS.lg,\n backgroundColor: theme.card,\n gap: SPACE.xs,\n },\n presetCardOn: { backgroundColor: theme.foreground },\n presetHead: { flexDirection: 'row', alignItems: 'center', justifyContent: 'space-between', gap: SPACE.xs },\n presetName: { ...TYPE.label, fontSize: 14, color: theme.foreground, flexShrink: 1 },\n presetNameOn: { color: theme.background },\n presetDesc: { ...TYPE.caption, fontWeight: '400', lineHeight: 16, color: theme.mutedForeground },\n presetDescOn: { color: theme.isDark ? '#3f3f46' : '#d4d4d8' },\n promoFields: { paddingHorizontal: SPACE.lg, paddingTop: SPACE.lg, paddingBottom: SPACE.xl },\n busyVeil: {\n ...StyleSheet.absoluteFillObject,\n alignItems: 'center',\n justifyContent: 'center',\n gap: SPACE.md,\n backgroundColor: 'rgba(10, 10, 12, 0.55)',\n },\n busyLabel: { ...TYPE.label, color: '#fafafa' },\n hint: {\n ...TYPE.body,\n fontSize: 14,\n lineHeight: 20,\n color: theme.mutedForeground,\n paddingHorizontal: SPACE.xl - 4,\n paddingTop: SPACE.md + 2,\n },\n frameScrub: { paddingTop: SPACE.md, gap: SPACE.xs },\n frameScrubLabel: { ...TYPE.label, color: theme.foreground, paddingHorizontal: SPACE.lg },\n promoBlock: { paddingBottom: SPACE.lg },\n aspectRow: {\n flexDirection: 'row',\n flexWrap: 'wrap',\n gap: SPACE.sm - 2,\n paddingHorizontal: SPACE.lg,\n paddingTop: SPACE.md - 2,\n },\n segmentRow: { paddingHorizontal: SPACE.lg, paddingTop: SPACE.md },\n segmented: { flexGrow: 0, alignSelf: 'flex-start' },\n chip: {\n minHeight: 36,\n justifyContent: 'center',\n paddingHorizontal: SPACE.md + 2,\n borderRadius: RADIUS.pill,\n backgroundColor: theme.card,\n },\n chipOn: { backgroundColor: theme.foreground },\n chipBlocked: { opacity: 0.4 },\n chipLabel: { ...TYPE.label, color: theme.foreground },\n chipLabelOn: { color: theme.background },\n chipLabelBlocked: { color: theme.mutedForeground },\n // The keyboard dock does not stretch its child: without a width the row collapses to the send button.\n composer: {\n alignSelf: 'stretch',\n width: '100%',\n paddingHorizontal: SPACE.lg,\n paddingTop: SPACE.md,\n paddingBottom: SPACE.sm,\n },\n composerField: {\n flexDirection: 'row',\n alignItems: 'flex-end',\n gap: SPACE.sm,\n minHeight: 56,\n paddingLeft: SPACE.lg,\n paddingRight: SPACE.sm - 2,\n paddingVertical: SPACE.sm - 2,\n borderRadius: RADIUS.xl,\n backgroundColor: theme.card,\n borderWidth: StyleSheet.hairlineWidth,\n borderColor: theme.border,\n },\n input: {\n flex: 1,\n minHeight: HIT,\n maxHeight: 132,\n paddingTop: SPACE.md - 1,\n paddingBottom: SPACE.md - 1,\n color: theme.foreground,\n fontSize: 15,\n lineHeight: 21,\n },\n send: {\n width: HIT,\n height: HIT,\n borderRadius: HIT / 2,\n backgroundColor: theme.primary,\n alignItems: 'center',\n justifyContent: 'center',\n },\n designSend: {\n paddingHorizontal: SPACE.md + 2,\n height: HIT,\n borderRadius: HIT / 2,\n backgroundColor: theme.isDark ? theme.secondary : theme.surface,\n alignItems: 'center',\n justifyContent: 'center',\n },\n designSendLabel: { ...TYPE.label, color: theme.foreground },\n sendDisabled: { opacity: 0.4 },\n notice: {\n position: 'absolute',\n left: SPACE.lg,\n right: SPACE.lg,\n bottom: SPACE.xl,\n flexDirection: 'row',\n alignItems: 'center',\n gap: SPACE.md,\n paddingHorizontal: SPACE.lg,\n paddingVertical: SPACE.md,\n borderRadius: RADIUS.lg,\n backgroundColor: theme.foreground,\n },\n noticeText: { ...TYPE.body, fontSize: 14, flex: 1, color: theme.background },\n noticeDismiss: { ...TYPE.label, fontSize: 14, color: theme.background },\n }),\n);\n"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import AsyncStorage from'@react-native-async-storage/async-storage';import {promoPollMaxMs,PROMO_CONNECTOR,PRODUCE_STATUS_ACTION,parsePollResult,PROMO_POLL_EVERY_MS,promoRunTimeoutMs,PRODUCE_SUBMIT_ACTION,buildPromoRunParams,parseSubmitResult}from'./promoVideo.js';import {
|
|
1
|
+
import AsyncStorage from'@react-native-async-storage/async-storage';import {promoPollMaxMs,PROMO_CONNECTOR,PRODUCE_STATUS_ACTION,parsePollResult,PROMO_POLL_EVERY_MS,promoRunTimeoutMs,PRODUCE_SUBMIT_ACTION,buildPromoRunParams,parseSubmitResult}from'./promoVideo.js';import {serverJobId,lookupRemoteJobId,awaitAgentVerdict,serverProgressLine,promoVideoFromVerdict,forgetServerJob,canvasJobKey,jobDeadlineAt,PROMO_FOLLOW_SLACK_MS,registerPromoJob,runWithJob}from'./serverTasks.js';var __defProp = Object.defineProperty;
|
|
2
2
|
var __defProps = Object.defineProperties;
|
|
3
3
|
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
4
4
|
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
@@ -260,9 +260,13 @@ async function startPromoTask(run, input) {
|
|
|
260
260
|
}
|
|
261
261
|
return tasks.find((t) => t.id === id);
|
|
262
262
|
}
|
|
263
|
+
const taskResumers = /* @__PURE__ */ new Set();
|
|
264
|
+
function registerTaskResumer(resume) {
|
|
265
|
+
taskResumers.add(resume);
|
|
266
|
+
}
|
|
263
267
|
function resumePromoTasks(run) {
|
|
264
268
|
void hydrateCanvasTasks().then(() => {
|
|
265
|
-
|
|
269
|
+
taskResumers.forEach((resume) => resume(run));
|
|
266
270
|
for (const task of tasks) {
|
|
267
271
|
if (task.kind !== "promo") continue;
|
|
268
272
|
if ((task.state === "running" || task.state === "submitting") && task.handle && !pollers.has(task.id)) {
|
|
@@ -271,4 +275,4 @@ function resumePromoTasks(run) {
|
|
|
271
275
|
}
|
|
272
276
|
}
|
|
273
277
|
});
|
|
274
|
-
}export{addCanvasTask,applyServerPatch,coerceTask,dismissTask,getCanvasTask,hydrateCanvasTasks,isTerminal,listCanvasTasks,markTaskDelivered,patchCanvasTask,resumePromoTasks,runningTaskCount,startPromoTask,subscribeCanvasTasks};//# sourceMappingURL=canvasTasks.js.map
|
|
278
|
+
}export{addCanvasTask,applyServerPatch,coerceTask,dismissTask,getCanvasTask,hydrateCanvasTasks,isTerminal,listCanvasTasks,markTaskDelivered,patchCanvasTask,registerTaskResumer,resumePromoTasks,runningTaskCount,startPromoTask,subscribeCanvasTasks};//# sourceMappingURL=canvasTasks.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"canvasTasks.js","sources":["../../../src/features/canvas/canvasTasks.ts"],"sourcesContent":["/**\n * Background canvas tasks — native twin of canvas-surface `tasks/taskStore` + `promoTask`.\n * Promo productions outlive the generate sheet; More → Tasks shows progress.\n */\nimport AsyncStorage from '@react-native-async-storage/async-storage';\nimport {\n PRODUCE_STATUS_ACTION,\n PRODUCE_SUBMIT_ACTION,\n PROMO_CONNECTOR,\n PROMO_POLL_EVERY_MS,\n buildPromoRunParams,\n promoPollMaxMs,\n promoRunTimeoutMs,\n parsePollResult,\n parseSubmitResult,\n type PromoRunOptions,\n type PromoRunResult,\n type PromoSubmitHandle,\n} from './promoVideo';\nimport type { RunMediaAction } from './videoEditor/mediaActions';\nimport type { RenderHandle, RenderPoll } from './videoEditor/renderTimeline';\n// Cycle by design: exportTask drives tasks through this store's public API.\nimport { resumeExportTasks } from './videoEditor/exportTask';\nimport {\n PROMO_FOLLOW_SLACK_MS,\n awaitAgentVerdict,\n canvasJobKey,\n forgetServerJob,\n jobDeadlineAt,\n lookupRemoteJobId,\n promoVideoFromVerdict,\n registerPromoJob,\n runWithJob,\n serverJobId,\n serverProgressLine,\n} from './serverTasks';\n\nexport type TaskState = 'submitting' | 'running' | 'succeeded' | 'failed';\n\n/**\n * 'promo' - marketing production (PRODUCE_SUBMIT/STATUS): `handle` + `request`.\n * 'export' - the video editor's detached timeline render (videoEditor/exportTask,\n * RENDER_TIMELINE_SUBMIT/STATUS): `render`, `step`, `notice`,\n * `warnings`, `local`, and `result.url` = the finished mp4. Its\n * `request` is a descriptive stub (preset 'export') - never\n * resubmit it as a promo.\n */\nexport type CanvasTaskKind = 'promo' | 'export';\n\nexport interface CanvasTask {\n id: string;\n kind: CanvasTaskKind;\n title: string;\n brief: string;\n boardId: string;\n state: TaskState;\n createdAt: number;\n startedAt?: number;\n endedAt?: number;\n handle?: PromoSubmitHandle;\n lastLine?: string;\n request: PromoRunOptions;\n result?: PromoRunResult;\n error?: string;\n delivered?: boolean;\n /** Past this a task still running has stopped responding (its budget + the follow slack + grace). */\n deadlineAt?: number;\n /** The SUBMIT carried the server job: the agent follows the run and reports to its row (./serverTasks). */\n agentReports?: boolean;\n /** Who gave the terminal state, when it came from the server row. */\n verdictBy?: 'agent' | 'browser' | 'deadline';\n // ── kind 'export' only (optional; promo tasks never carry them) ──\n /** The detached render's handle (sandbox/run ids, output url, projected time, lease). */\n render?: RenderHandle;\n /** Latest render progress from STATUS. */\n step?: RenderPoll['step'];\n /** The connector's word on the render time limit, shown to the person. */\n notice?: string;\n /** Compile warnings (a transition that overlaps footage, ...). */\n warnings?: string[];\n /** Rendering through the in-app client chain (SUBMIT unavailable): dies with the app. */\n local?: boolean;\n}\n\nconst STORAGE_KEY = 'canvas.tasks.v1';\nconst MAX_FINISHED = 20;\nconst listeners = new Set<() => void>();\nlet tasks: CanvasTask[] = [];\nlet hydrated = false;\nconst pollers = new Map<string, Promise<void>>();\n\nexport const isTerminal = (state: TaskState): boolean => state === 'succeeded' || state === 'failed';\n\nfunction emit() {\n listeners.forEach((l) => l());\n}\n\nfunction persist() {\n void AsyncStorage.setItem(STORAGE_KEY, JSON.stringify(tasks)).catch(() => undefined);\n}\n\nexport function coerceTask(value: unknown): CanvasTask | null {\n if (!value || typeof value !== 'object') return null;\n const t = value as Record<string, unknown>;\n if (typeof t.id !== 'string' || !t.id || (t.kind !== 'promo' && t.kind !== 'export')) return null;\n if (typeof t.state !== 'string') return null;\n if (!['submitting', 'running', 'succeeded', 'failed'].includes(t.state)) return null;\n if (!t.request || typeof t.request !== 'object' || typeof t.boardId !== 'string') return null;\n return {\n ...(t as unknown as CanvasTask),\n title: typeof t.title === 'string' ? t.title : t.kind === 'export' ? 'Video export' : 'Marketing video',\n brief: typeof t.brief === 'string' ? t.brief : '',\n createdAt: typeof t.createdAt === 'number' ? t.createdAt : 0,\n };\n}\n\nexport async function hydrateCanvasTasks(): Promise<void> {\n if (hydrated) return;\n hydrated = true;\n try {\n const raw = await AsyncStorage.getItem(STORAGE_KEY);\n if (!raw) return;\n const parsed = JSON.parse(raw);\n tasks = Array.isArray(parsed) ? parsed.map(coerceTask).filter((t): t is CanvasTask => t !== null) : [];\n emit();\n } catch {\n tasks = [];\n }\n}\n\nexport function getCanvasTask(id: string): CanvasTask | undefined {\n return tasks.find((t) => t.id === id);\n}\n\n/** Patch one task (no-op for an unknown id) - used by the export runner. */\nexport function patchCanvasTask(id: string, patch: Partial<CanvasTask>) {\n if (!tasks.some((t) => t.id === id)) return;\n patchTask(id, patch);\n}\n\n/** Register a new task (newest first) - used by the export runner. */\nexport function addCanvasTask(task: CanvasTask) {\n tasks = [task, ...tasks.filter((t) => t.id !== task.id)];\n persist();\n emit();\n}\n\nexport function listCanvasTasks(): CanvasTask[] {\n return tasks;\n}\n\nexport function subscribeCanvasTasks(listener: () => void): () => void {\n listeners.add(listener);\n return () => listeners.delete(listener);\n}\n\nexport function runningTaskCount(): number {\n return tasks.filter((t) => t.state === 'submitting' || t.state === 'running').length;\n}\n\nfunction pruneFinished(list: CanvasTask[]): CanvasTask[] {\n const finished = list.filter((t) => isTerminal(t.state)).sort((a, b) => b.createdAt - a.createdAt);\n const keep = new Set(finished.slice(0, MAX_FINISHED).map((t) => t.id));\n return list.filter((t) => !isTerminal(t.state) || keep.has(t.id));\n}\n\nfunction patchTask(id: string, patch: Partial<CanvasTask>) {\n tasks = pruneFinished(tasks.map((t) => (t.id === id ? { ...t, ...patch } : t)));\n persist();\n emit();\n}\n\nexport function dismissTask(id: string) {\n tasks = tasks.filter((t) => t.id !== id);\n persist();\n emit();\n}\n\nexport function markTaskDelivered(id: string) {\n patchTask(id, { delivered: true });\n}\n\n/** A patch from the task's server row (./canvasTaskSync reconcile). No-op for an unknown id. */\nexport function applyServerPatch(id: string, patch: Partial<CanvasTask>) {\n if (!tasks.some((t) => t.id === id)) return;\n patchTask(id, patch);\n}\n\nlet seq = 0;\nconst newId = () => `task-${Date.now().toString(36)}-${(seq++).toString(36)}`;\n\n/**\n * Wait on the agent's verdict for a run it was handed, instead of polling\n * STATUS beside it (a promo sandbox dies on the first terminal answer, so two\n * pollers race). True when the row settled the task; false to poll as before.\n */\nasync function awaitAgentFor(id: string): Promise<boolean> {\n const task = tasks.find((t) => t.id === id);\n if (!task?.agentReports) return false;\n // After a restart the token is gone (memory only) but the row is not: find it in the listing.\n const remoteId = serverJobId(canvasJobKey(id)) ?? (await lookupRemoteJobId(id).catch(() => undefined));\n if (!remoteId) return false;\n try {\n const verdict = await awaitAgentVerdict(remoteId, {\n submittedAt: task.startedAt ?? task.createdAt,\n deadlineAt: task.deadlineAt ?? Date.now() + promoPollMaxMs(task.request),\n onProgress: (row) => {\n const line = serverProgressLine(row);\n if (line) patchTask(id, { state: 'running', lastLine: line });\n },\n });\n if (!verdict) {\n patchTask(id, { agentReports: false });\n return false;\n }\n const video = verdict.state === 'succeeded' ? promoVideoFromVerdict(verdict) : undefined;\n patchTask(id, {\n ...(video\n ? {\n state: 'succeeded' as const,\n result: {\n url: video.url,\n title: video.title || 'Marketing video',\n projectId: task.handle?.projectId ?? '',\n preset: task.request.preset,\n pipeline: '',\n },\n lastLine: 'Ready',\n }\n : {\n state: 'failed' as const,\n error:\n verdict.error ||\n (verdict.state === 'succeeded'\n ? 'Production finished but returned no video'\n : 'Production failed'),\n }),\n endedAt: verdict.endedAt ?? Date.now(),\n ...(verdict.verdictBy ? { verdictBy: verdict.verdictBy } : {}),\n });\n forgetServerJob(canvasJobKey(id));\n return true;\n } catch (err: unknown) {\n patchTask(id, {\n state: 'failed',\n endedAt: Date.now(),\n error: err instanceof Error ? err.message : String(err),\n });\n return true;\n }\n}\n\nasync function pollTask(run: RunMediaAction, id: string) {\n if (await awaitAgentFor(id)) return;\n const started = Date.now();\n // A studio production runs ~100 min; its wait has to outlast that.\n const request = tasks.find((t) => t.id === id)?.request;\n const pollMax = request ? promoPollMaxMs(request) : promoPollMaxMs({ preset: '' });\n while (Date.now() - started < pollMax) {\n const task = tasks.find((t) => t.id === id);\n if (!task?.handle) return;\n try {\n const raw = await run(PROMO_CONNECTOR, PRODUCE_STATUS_ACTION, {\n projectId: task.handle.projectId,\n sandboxId: task.handle.sandboxId,\n });\n const poll = parsePollResult(raw);\n if (poll.state === 'succeeded' && poll.result) {\n patchTask(id, {\n state: 'succeeded',\n endedAt: Date.now(),\n result: poll.result,\n lastLine: poll.progress.at(-1) || 'Done',\n });\n return;\n }\n if (poll.state === 'failed') {\n patchTask(id, {\n state: 'failed',\n endedAt: Date.now(),\n error: poll.error || 'Production failed',\n lastLine: poll.error || 'Failed',\n });\n return;\n }\n patchTask(id, {\n state: 'running',\n lastLine: poll.progress.at(-1) || 'Working…',\n });\n } catch (err: unknown) {\n patchTask(id, {\n lastLine: err instanceof Error ? err.message : 'Poll error — retrying',\n });\n }\n await new Promise((r) => setTimeout(r, PROMO_POLL_EVERY_MS));\n }\n patchTask(id, {\n state: 'failed',\n endedAt: Date.now(),\n error: 'Timed out waiting for the marketing video',\n });\n}\n\n/** Submit promo and poll in the background (does not block the UI). */\nexport async function startPromoTask(\n run: RunMediaAction,\n input: { request: PromoRunOptions; boardId: string; brief: string },\n): Promise<CanvasTask> {\n await hydrateCanvasTasks();\n const id = newId();\n const createdAt = Date.now();\n const task: CanvasTask = {\n id,\n kind: 'promo',\n title: 'Marketing video',\n brief: input.brief,\n boardId: input.boardId,\n state: 'submitting',\n createdAt,\n // The run's own budget, the follow's slack past it, then the grace.\n deadlineAt: jobDeadlineAt(createdAt, promoRunTimeoutMs(input.request) + PROMO_FOLLOW_SLACK_MS),\n request: input.request,\n lastLine: 'Submitting…',\n };\n tasks = [task, ...tasks];\n persist();\n emit();\n\n try {\n // Recorded before the submit (two seconds at most), so the SUBMIT can hand the agent the job.\n const job = await registerPromoJob(task, () => tasks.some((t) => t.id === id)).catch(() => undefined);\n const { result: raw, handed } = await runWithJob(\n run,\n PROMO_CONNECTOR,\n PRODUCE_SUBMIT_ACTION,\n buildPromoRunParams(input.request),\n job,\n );\n const handle = parseSubmitResult(raw);\n if (!handle) throw new Error('No production handle returned');\n patchTask(id, {\n state: 'running',\n handle,\n startedAt: Date.now(),\n lastLine: 'Queued',\n ...(handed ? { agentReports: true } : {}),\n });\n if (!pollers.has(id)) {\n const job = pollTask(run, id).finally(() => pollers.delete(id));\n pollers.set(id, job);\n }\n } catch (err: unknown) {\n patchTask(id, {\n state: 'failed',\n endedAt: Date.now(),\n error: err instanceof Error ? err.message : String(err),\n lastLine: 'Submit failed',\n });\n }\n return tasks.find((t) => t.id === id)!;\n}\n\n/** Resume any incomplete tasks after app open (promo productions and video exports). */\nexport function resumePromoTasks(run: RunMediaAction) {\n void hydrateCanvasTasks().then(() => {\n resumeExportTasks(run);\n for (const task of tasks) {\n if (task.kind !== 'promo') continue;\n if ((task.state === 'running' || task.state === 'submitting') && task.handle && !pollers.has(task.id)) {\n const job = pollTask(run, task.id).finally(() => pollers.delete(task.id));\n pollers.set(task.id, job);\n }\n }\n });\n}\n"],"names":["job"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"canvasTasks.js","sources":["../../../src/features/canvas/canvasTasks.ts"],"sourcesContent":["/**\n * Background canvas tasks — native twin of canvas-surface `tasks/taskStore` + `promoTask`.\n * Promo productions outlive the generate sheet; More → Tasks shows progress.\n */\nimport AsyncStorage from '@react-native-async-storage/async-storage';\nimport {\n PRODUCE_STATUS_ACTION,\n PRODUCE_SUBMIT_ACTION,\n PROMO_CONNECTOR,\n PROMO_POLL_EVERY_MS,\n buildPromoRunParams,\n promoPollMaxMs,\n promoRunTimeoutMs,\n parsePollResult,\n parseSubmitResult,\n type PromoRunOptions,\n type PromoRunResult,\n type PromoSubmitHandle,\n} from './promoVideo';\nimport type { RunMediaAction } from './videoEditor/mediaActions';\nimport type { RenderHandle, RenderPoll } from './videoEditor/renderTimeline';\n// Cycle by design: exportTask drives tasks through this store's public API.\nimport {\n PROMO_FOLLOW_SLACK_MS,\n awaitAgentVerdict,\n canvasJobKey,\n forgetServerJob,\n jobDeadlineAt,\n lookupRemoteJobId,\n promoVideoFromVerdict,\n registerPromoJob,\n runWithJob,\n serverJobId,\n serverProgressLine,\n} from './serverTasks';\n\nexport type TaskState = 'submitting' | 'running' | 'succeeded' | 'failed';\n\n/**\n * 'promo' - marketing production (PRODUCE_SUBMIT/STATUS): `handle` + `request`.\n * 'export' - the video editor's detached timeline render (videoEditor/exportTask,\n * RENDER_TIMELINE_SUBMIT/STATUS): `render`, `step`, `notice`,\n * `warnings`, `local`, and `result.url` = the finished mp4. Its\n * `request` is a descriptive stub (preset 'export') - never\n * resubmit it as a promo.\n */\nexport type CanvasTaskKind = 'promo' | 'export';\n\nexport interface CanvasTask {\n id: string;\n kind: CanvasTaskKind;\n title: string;\n brief: string;\n boardId: string;\n state: TaskState;\n createdAt: number;\n startedAt?: number;\n endedAt?: number;\n handle?: PromoSubmitHandle;\n lastLine?: string;\n request: PromoRunOptions;\n result?: PromoRunResult;\n error?: string;\n delivered?: boolean;\n /** Past this a task still running has stopped responding (its budget + the follow slack + grace). */\n deadlineAt?: number;\n /** The SUBMIT carried the server job: the agent follows the run and reports to its row (./serverTasks). */\n agentReports?: boolean;\n /** Who gave the terminal state, when it came from the server row. */\n verdictBy?: 'agent' | 'browser' | 'deadline';\n // ── kind 'export' only (optional; promo tasks never carry them) ──\n /** The detached render's handle (sandbox/run ids, output url, projected time, lease). */\n render?: RenderHandle;\n /** Latest render progress from STATUS. */\n step?: RenderPoll['step'];\n /** The connector's word on the render time limit, shown to the person. */\n notice?: string;\n /** Compile warnings (a transition that overlaps footage, ...). */\n warnings?: string[];\n /** Rendering through the in-app client chain (SUBMIT unavailable): dies with the app. */\n local?: boolean;\n}\n\nconst STORAGE_KEY = 'canvas.tasks.v1';\nconst MAX_FINISHED = 20;\nconst listeners = new Set<() => void>();\nlet tasks: CanvasTask[] = [];\nlet hydrated = false;\nconst pollers = new Map<string, Promise<void>>();\n\nexport const isTerminal = (state: TaskState): boolean => state === 'succeeded' || state === 'failed';\n\nfunction emit() {\n listeners.forEach((l) => l());\n}\n\nfunction persist() {\n void AsyncStorage.setItem(STORAGE_KEY, JSON.stringify(tasks)).catch(() => undefined);\n}\n\nexport function coerceTask(value: unknown): CanvasTask | null {\n if (!value || typeof value !== 'object') return null;\n const t = value as Record<string, unknown>;\n if (typeof t.id !== 'string' || !t.id || (t.kind !== 'promo' && t.kind !== 'export')) return null;\n if (typeof t.state !== 'string') return null;\n if (!['submitting', 'running', 'succeeded', 'failed'].includes(t.state)) return null;\n if (!t.request || typeof t.request !== 'object' || typeof t.boardId !== 'string') return null;\n return {\n ...(t as unknown as CanvasTask),\n title: typeof t.title === 'string' ? t.title : t.kind === 'export' ? 'Video export' : 'Marketing video',\n brief: typeof t.brief === 'string' ? t.brief : '',\n createdAt: typeof t.createdAt === 'number' ? t.createdAt : 0,\n };\n}\n\nexport async function hydrateCanvasTasks(): Promise<void> {\n if (hydrated) return;\n hydrated = true;\n try {\n const raw = await AsyncStorage.getItem(STORAGE_KEY);\n if (!raw) return;\n const parsed = JSON.parse(raw);\n tasks = Array.isArray(parsed) ? parsed.map(coerceTask).filter((t): t is CanvasTask => t !== null) : [];\n emit();\n } catch {\n tasks = [];\n }\n}\n\nexport function getCanvasTask(id: string): CanvasTask | undefined {\n return tasks.find((t) => t.id === id);\n}\n\n/** Patch one task (no-op for an unknown id) - used by the export runner. */\nexport function patchCanvasTask(id: string, patch: Partial<CanvasTask>) {\n if (!tasks.some((t) => t.id === id)) return;\n patchTask(id, patch);\n}\n\n/** Register a new task (newest first) - used by the export runner. */\nexport function addCanvasTask(task: CanvasTask) {\n tasks = [task, ...tasks.filter((t) => t.id !== task.id)];\n persist();\n emit();\n}\n\nexport function listCanvasTasks(): CanvasTask[] {\n return tasks;\n}\n\nexport function subscribeCanvasTasks(listener: () => void): () => void {\n listeners.add(listener);\n return () => listeners.delete(listener);\n}\n\nexport function runningTaskCount(): number {\n return tasks.filter((t) => t.state === 'submitting' || t.state === 'running').length;\n}\n\nfunction pruneFinished(list: CanvasTask[]): CanvasTask[] {\n const finished = list.filter((t) => isTerminal(t.state)).sort((a, b) => b.createdAt - a.createdAt);\n const keep = new Set(finished.slice(0, MAX_FINISHED).map((t) => t.id));\n return list.filter((t) => !isTerminal(t.state) || keep.has(t.id));\n}\n\nfunction patchTask(id: string, patch: Partial<CanvasTask>) {\n tasks = pruneFinished(tasks.map((t) => (t.id === id ? { ...t, ...patch } : t)));\n persist();\n emit();\n}\n\nexport function dismissTask(id: string) {\n tasks = tasks.filter((t) => t.id !== id);\n persist();\n emit();\n}\n\nexport function markTaskDelivered(id: string) {\n patchTask(id, { delivered: true });\n}\n\n/** A patch from the task's server row (./canvasTaskSync reconcile). No-op for an unknown id. */\nexport function applyServerPatch(id: string, patch: Partial<CanvasTask>) {\n if (!tasks.some((t) => t.id === id)) return;\n patchTask(id, patch);\n}\n\nlet seq = 0;\nconst newId = () => `task-${Date.now().toString(36)}-${(seq++).toString(36)}`;\n\n/**\n * Wait on the agent's verdict for a run it was handed, instead of polling\n * STATUS beside it (a promo sandbox dies on the first terminal answer, so two\n * pollers race). True when the row settled the task; false to poll as before.\n */\nasync function awaitAgentFor(id: string): Promise<boolean> {\n const task = tasks.find((t) => t.id === id);\n if (!task?.agentReports) return false;\n // After a restart the token is gone (memory only) but the row is not: find it in the listing.\n const remoteId = serverJobId(canvasJobKey(id)) ?? (await lookupRemoteJobId(id).catch(() => undefined));\n if (!remoteId) return false;\n try {\n const verdict = await awaitAgentVerdict(remoteId, {\n submittedAt: task.startedAt ?? task.createdAt,\n deadlineAt: task.deadlineAt ?? Date.now() + promoPollMaxMs(task.request),\n onProgress: (row) => {\n const line = serverProgressLine(row);\n if (line) patchTask(id, { state: 'running', lastLine: line });\n },\n });\n if (!verdict) {\n patchTask(id, { agentReports: false });\n return false;\n }\n const video = verdict.state === 'succeeded' ? promoVideoFromVerdict(verdict) : undefined;\n patchTask(id, {\n ...(video\n ? {\n state: 'succeeded' as const,\n result: {\n url: video.url,\n title: video.title || 'Marketing video',\n projectId: task.handle?.projectId ?? '',\n preset: task.request.preset,\n pipeline: '',\n },\n lastLine: 'Ready',\n }\n : {\n state: 'failed' as const,\n error:\n verdict.error ||\n (verdict.state === 'succeeded'\n ? 'Production finished but returned no video'\n : 'Production failed'),\n }),\n endedAt: verdict.endedAt ?? Date.now(),\n ...(verdict.verdictBy ? { verdictBy: verdict.verdictBy } : {}),\n });\n forgetServerJob(canvasJobKey(id));\n return true;\n } catch (err: unknown) {\n patchTask(id, {\n state: 'failed',\n endedAt: Date.now(),\n error: err instanceof Error ? err.message : String(err),\n });\n return true;\n }\n}\n\nasync function pollTask(run: RunMediaAction, id: string) {\n if (await awaitAgentFor(id)) return;\n const started = Date.now();\n // A studio production runs ~100 min; its wait has to outlast that.\n const request = tasks.find((t) => t.id === id)?.request;\n const pollMax = request ? promoPollMaxMs(request) : promoPollMaxMs({ preset: '' });\n while (Date.now() - started < pollMax) {\n const task = tasks.find((t) => t.id === id);\n if (!task?.handle) return;\n try {\n const raw = await run(PROMO_CONNECTOR, PRODUCE_STATUS_ACTION, {\n projectId: task.handle.projectId,\n sandboxId: task.handle.sandboxId,\n });\n const poll = parsePollResult(raw);\n if (poll.state === 'succeeded' && poll.result) {\n patchTask(id, {\n state: 'succeeded',\n endedAt: Date.now(),\n result: poll.result,\n lastLine: poll.progress.at(-1) || 'Done',\n });\n return;\n }\n if (poll.state === 'failed') {\n patchTask(id, {\n state: 'failed',\n endedAt: Date.now(),\n error: poll.error || 'Production failed',\n lastLine: poll.error || 'Failed',\n });\n return;\n }\n patchTask(id, {\n state: 'running',\n lastLine: poll.progress.at(-1) || 'Working…',\n });\n } catch (err: unknown) {\n patchTask(id, {\n lastLine: err instanceof Error ? err.message : 'Poll error — retrying',\n });\n }\n await new Promise((r) => setTimeout(r, PROMO_POLL_EVERY_MS));\n }\n patchTask(id, {\n state: 'failed',\n endedAt: Date.now(),\n error: 'Timed out waiting for the marketing video',\n });\n}\n\n/** Submit promo and poll in the background (does not block the UI). */\nexport async function startPromoTask(\n run: RunMediaAction,\n input: { request: PromoRunOptions; boardId: string; brief: string },\n): Promise<CanvasTask> {\n await hydrateCanvasTasks();\n const id = newId();\n const createdAt = Date.now();\n const task: CanvasTask = {\n id,\n kind: 'promo',\n title: 'Marketing video',\n brief: input.brief,\n boardId: input.boardId,\n state: 'submitting',\n createdAt,\n // The run's own budget, the follow's slack past it, then the grace.\n deadlineAt: jobDeadlineAt(createdAt, promoRunTimeoutMs(input.request) + PROMO_FOLLOW_SLACK_MS),\n request: input.request,\n lastLine: 'Submitting…',\n };\n tasks = [task, ...tasks];\n persist();\n emit();\n\n try {\n // Recorded before the submit (two seconds at most), so the SUBMIT can hand the agent the job.\n const job = await registerPromoJob(task, () => tasks.some((t) => t.id === id)).catch(() => undefined);\n const { result: raw, handed } = await runWithJob(\n run,\n PROMO_CONNECTOR,\n PRODUCE_SUBMIT_ACTION,\n buildPromoRunParams(input.request),\n job,\n );\n const handle = parseSubmitResult(raw);\n if (!handle) throw new Error('No production handle returned');\n patchTask(id, {\n state: 'running',\n handle,\n startedAt: Date.now(),\n lastLine: 'Queued',\n ...(handed ? { agentReports: true } : {}),\n });\n if (!pollers.has(id)) {\n const job = pollTask(run, id).finally(() => pollers.delete(id));\n pollers.set(id, job);\n }\n } catch (err: unknown) {\n patchTask(id, {\n state: 'failed',\n endedAt: Date.now(),\n error: err instanceof Error ? err.message : String(err),\n lastLine: 'Submit failed',\n });\n }\n return tasks.find((t) => t.id === id)!;\n}\n\n/** Resume any incomplete tasks after app open (promo productions and video exports). */\n/**\n * Other task kinds resume themselves through this registry instead of being\n * imported here: `videoEditor/exportTask` imports this module, so importing it\n * back made a require cycle that can hand either side an undefined export.\n */\nconst taskResumers = new Set<(run: RunMediaAction) => void>();\n\nexport function registerTaskResumer(resume: (run: RunMediaAction) => void): void {\n taskResumers.add(resume);\n}\n\nexport function resumePromoTasks(run: RunMediaAction) {\n void hydrateCanvasTasks().then(() => {\n taskResumers.forEach((resume) => resume(run));\n for (const task of tasks) {\n if (task.kind !== 'promo') continue;\n if ((task.state === 'running' || task.state === 'submitting') && task.handle && !pollers.has(task.id)) {\n const job = pollTask(run, task.id).finally(() => pollers.delete(task.id));\n pollers.set(task.id, job);\n }\n }\n });\n}\n"],"names":["job"],"mappings":";;;;;;;;;;;;;;;;;;;AAuDA,MAAM,WAAc,GAAA,iBAAA;AACpB,MAAM,YAAe,GAAA,EAAA;AACrB,MAAM,SAAA,uBAAgB,GAAgB,EAAA;AACtC,IAAI,QAAsB,EAAC;AAC3B,IAAI,QAAW,GAAA,KAAA;AACf,MAAM,OAAA,uBAAc,GAA2B,EAAA;AACxC,MAAM,UAAa,GAAA,CAAC,KAA8B,KAAA,KAAA,KAAU,eAAe,KAAU,KAAA;AAC5F,SAAS,IAAO,GAAA;AACd,EAAU,SAAA,CAAA,OAAA,CAAQ,CAAK,CAAA,KAAA,CAAA,EAAG,CAAA;AAC5B;AACA,SAAS,OAAU,GAAA;AACjB,EAAK,KAAA,YAAA,CAAa,OAAQ,CAAA,WAAA,EAAa,IAAK,CAAA,SAAA,CAAU,KAAK,CAAC,CAAA,CAAE,KAAM,CAAA,MAAM,MAAS,CAAA;AACrF;AACO,SAAS,WAAW,KAAmC,EAAA;AAC5D,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,UAAiB,OAAA,IAAA;AAChD,EAAA,MAAM,CAAI,GAAA,KAAA;AACV,EAAA,IAAI,OAAO,CAAA,CAAE,EAAO,KAAA,QAAA,IAAY,CAAC,CAAA,CAAE,EAAM,IAAA,CAAA,CAAE,IAAS,KAAA,OAAA,IAAW,CAAE,CAAA,IAAA,KAAS,UAAiB,OAAA,IAAA;AAC3F,EAAA,IAAI,OAAO,CAAA,CAAE,KAAU,KAAA,QAAA,EAAiB,OAAA,IAAA;AACxC,EAAI,IAAA,CAAC,CAAC,YAAA,EAAc,SAAW,EAAA,WAAA,EAAa,QAAQ,CAAA,CAAE,QAAS,CAAA,CAAA,CAAE,KAAK,CAAA,EAAU,OAAA,IAAA;AAChF,EAAI,IAAA,CAAC,CAAE,CAAA,OAAA,IAAW,OAAO,CAAA,CAAE,OAAY,KAAA,QAAA,IAAY,OAAO,CAAA,CAAE,OAAY,KAAA,QAAA,EAAiB,OAAA,IAAA;AACzF,EAAA,OAAO,iCACD,CADC,CAAA,EAAA;AAAA,IAEL,KAAA,EAAO,OAAO,CAAA,CAAE,KAAU,KAAA,QAAA,GAAW,EAAE,KAAQ,GAAA,CAAA,CAAE,IAAS,KAAA,QAAA,GAAW,cAAiB,GAAA,iBAAA;AAAA,IACtF,OAAO,OAAO,CAAA,CAAE,KAAU,KAAA,QAAA,GAAW,EAAE,KAAQ,GAAA,EAAA;AAAA,IAC/C,WAAW,OAAO,CAAA,CAAE,SAAc,KAAA,QAAA,GAAW,EAAE,SAAY,GAAA;AAAA,GAC7D,CAAA;AACF;AACA,eAAsB,kBAAoC,GAAA;AACxD,EAAA,IAAI,QAAU,EAAA;AACd,EAAW,QAAA,GAAA,IAAA;AACX,EAAI,IAAA;AACF,IAAA,MAAM,GAAM,GAAA,MAAM,YAAa,CAAA,OAAA,CAAQ,WAAW,CAAA;AAClD,IAAA,IAAI,CAAC,GAAK,EAAA;AACV,IAAM,MAAA,MAAA,GAAS,IAAK,CAAA,KAAA,CAAM,GAAG,CAAA;AAC7B,IAAA,KAAA,GAAQ,KAAM,CAAA,OAAA,CAAQ,MAAM,CAAA,GAAI,OAAO,GAAI,CAAA,UAAU,CAAE,CAAA,MAAA,CAAO,CAAC,CAAA,KAAuB,CAAM,KAAA,IAAI,IAAI,EAAC;AACrG,IAAK,IAAA,EAAA;AAAA,GACC,CAAA,OAAA,CAAA,EAAA;AACN,IAAA,KAAA,GAAQ,EAAC;AAAA;AAEb;AACO,SAAS,cAAc,EAAoC,EAAA;AAChE,EAAA,OAAO,KAAM,CAAA,IAAA,CAAK,CAAK,CAAA,KAAA,CAAA,CAAE,OAAO,EAAE,CAAA;AACpC;AAGgB,SAAA,eAAA,CAAgB,IAAY,KAA4B,EAAA;AACtE,EAAA,IAAI,CAAC,KAAM,CAAA,IAAA,CAAK,OAAK,CAAE,CAAA,EAAA,KAAO,EAAE,CAAG,EAAA;AACnC,EAAA,SAAA,CAAU,IAAI,KAAK,CAAA;AACrB;AAGO,SAAS,cAAc,IAAkB,EAAA;AAC9C,EAAQ,KAAA,GAAA,CAAC,IAAM,EAAA,GAAG,KAAM,CAAA,MAAA,CAAO,OAAK,CAAE,CAAA,EAAA,KAAO,IAAK,CAAA,EAAE,CAAC,CAAA;AACrD,EAAQ,OAAA,EAAA;AACR,EAAK,IAAA,EAAA;AACP;AACO,SAAS,eAAgC,GAAA;AAC9C,EAAO,OAAA,KAAA;AACT;AACO,SAAS,qBAAqB,QAAkC,EAAA;AACrE,EAAA,SAAA,CAAU,IAAI,QAAQ,CAAA;AACtB,EAAO,OAAA,MAAM,SAAU,CAAA,MAAA,CAAO,QAAQ,CAAA;AACxC;AACO,SAAS,gBAA2B,GAAA;AACzC,EAAO,OAAA,KAAA,CAAM,OAAO,CAAK,CAAA,KAAA,CAAA,CAAE,UAAU,YAAgB,IAAA,CAAA,CAAE,KAAU,KAAA,SAAS,CAAE,CAAA,MAAA;AAC9E;AACA,SAAS,cAAc,IAAkC,EAAA;AACvD,EAAA,MAAM,WAAW,IAAK,CAAA,MAAA,CAAO,CAAK,CAAA,KAAA,UAAA,CAAW,EAAE,KAAK,CAAC,CAAE,CAAA,IAAA,CAAK,CAAC,CAAG,EAAA,CAAA,KAAM,CAAE,CAAA,SAAA,GAAY,EAAE,SAAS,CAAA;AAC/F,EAAA,MAAM,IAAO,GAAA,IAAI,GAAI,CAAA,QAAA,CAAS,KAAM,CAAA,CAAA,EAAG,YAAY,CAAA,CAAE,GAAI,CAAA,CAAA,CAAA,KAAK,CAAE,CAAA,EAAE,CAAC,CAAA;AACnE,EAAA,OAAO,IAAK,CAAA,MAAA,CAAO,CAAK,CAAA,KAAA,CAAC,UAAW,CAAA,CAAA,CAAE,KAAK,CAAA,IAAK,IAAK,CAAA,GAAA,CAAI,CAAE,CAAA,EAAE,CAAC,CAAA;AAChE;AACA,SAAS,SAAA,CAAU,IAAY,KAA4B,EAAA;AACzD,EAAQ,KAAA,GAAA,aAAA,CAAc,KAAM,CAAA,GAAA,CAAI,CAAK,CAAA,KAAA,CAAA,CAAE,EAAO,KAAA,EAAA,GAAK,cAC9C,CAAA,cAAA,CAAA,EAAA,EAAA,CAAA,CAAA,EACA,KACD,CAAA,GAAA,CAAC,CAAC,CAAA;AACN,EAAQ,OAAA,EAAA;AACR,EAAK,IAAA,EAAA;AACP;AACO,SAAS,YAAY,EAAY,EAAA;AACtC,EAAA,KAAA,GAAQ,KAAM,CAAA,MAAA,CAAO,CAAK,CAAA,KAAA,CAAA,CAAE,OAAO,EAAE,CAAA;AACrC,EAAQ,OAAA,EAAA;AACR,EAAK,IAAA,EAAA;AACP;AACO,SAAS,kBAAkB,EAAY,EAAA;AAC5C,EAAA,SAAA,CAAU,EAAI,EAAA;AAAA,IACZ,SAAW,EAAA;AAAA,GACZ,CAAA;AACH;AAGgB,SAAA,gBAAA,CAAiB,IAAY,KAA4B,EAAA;AACvE,EAAA,IAAI,CAAC,KAAM,CAAA,IAAA,CAAK,OAAK,CAAE,CAAA,EAAA,KAAO,EAAE,CAAG,EAAA;AACnC,EAAA,SAAA,CAAU,IAAI,KAAK,CAAA;AACrB;AACA,IAAI,GAAM,GAAA,CAAA;AACV,MAAM,KAAQ,GAAA,MAAM,CAAQ,KAAA,EAAA,IAAA,CAAK,GAAI,EAAA,CAAE,QAAS,CAAA,EAAE,CAAC,CAAA,CAAA,EAAA,CAAK,GAAO,EAAA,EAAA,QAAA,CAAS,EAAE,CAAC,CAAA,CAAA;AAO3E,eAAe,cAAc,EAA8B,EAAA;AA9J3D,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AA+JE,EAAA,MAAM,OAAO,KAAM,CAAA,IAAA,CAAK,CAAK,CAAA,KAAA,CAAA,CAAE,OAAO,EAAE,CAAA;AACxC,EAAI,IAAA,EAAC,IAAM,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA,CAAA,YAAA,CAAA,EAAqB,OAAA,KAAA;AAEhC,EAAA,MAAM,QAAW,GAAA,CAAA,EAAA,GAAA,WAAA,CAAY,YAAa,CAAA,EAAE,CAAC,CAAA,KAA5B,IAAkC,GAAA,EAAA,GAAA,MAAM,iBAAkB,CAAA,EAAE,CAAE,CAAA,KAAA,CAAM,MAAM,MAAS,CAAA;AACpG,EAAI,IAAA,CAAC,UAAiB,OAAA,KAAA;AACtB,EAAI,IAAA;AACF,IAAM,MAAA,OAAA,GAAU,MAAM,iBAAA,CAAkB,QAAU,EAAA;AAAA,MAChD,WAAa,EAAA,CAAA,EAAA,GAAA,IAAA,CAAK,SAAL,KAAA,IAAA,GAAA,EAAA,GAAkB,IAAK,CAAA,SAAA;AAAA,MACpC,UAAA,EAAA,CAAY,UAAK,UAAL,KAAA,IAAA,GAAA,EAAA,GAAmB,KAAK,GAAI,EAAA,GAAI,cAAe,CAAA,IAAA,CAAK,OAAO,CAAA;AAAA,MACvE,YAAY,CAAO,GAAA,KAAA;AACjB,QAAM,MAAA,IAAA,GAAO,mBAAmB,GAAG,CAAA;AACnC,QAAI,IAAA,IAAA,YAAgB,EAAI,EAAA;AAAA,UACtB,KAAO,EAAA,SAAA;AAAA,UACP,QAAU,EAAA;AAAA,SACX,CAAA;AAAA;AACH,KACD,CAAA;AACD,IAAA,IAAI,CAAC,OAAS,EAAA;AACZ,MAAA,SAAA,CAAU,EAAI,EAAA;AAAA,QACZ,YAAc,EAAA;AAAA,OACf,CAAA;AACD,MAAO,OAAA,KAAA;AAAA;AAET,IAAA,MAAM,QAAQ,OAAQ,CAAA,KAAA,KAAU,WAAc,GAAA,qBAAA,CAAsB,OAAO,CAAI,GAAA,KAAA,CAAA;AAC/E,IAAU,SAAA,CAAA,EAAA,EAAI,gDACR,KAAQ,GAAA;AAAA,MACV,KAAO,EAAA,WAAA;AAAA,MACP,MAAQ,EAAA;AAAA,QACN,KAAK,KAAM,CAAA,GAAA;AAAA,QACX,KAAA,EAAO,MAAM,KAAS,IAAA,iBAAA;AAAA,QACtB,SAAW,EAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,IAAA,CAAK,MAAL,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAa,cAAb,IAA0B,GAAA,EAAA,GAAA,EAAA;AAAA,QACrC,MAAA,EAAQ,KAAK,OAAQ,CAAA,MAAA;AAAA,QACrB,QAAU,EAAA;AAAA,OACZ;AAAA,MACA,QAAU,EAAA;AAAA,KACR,GAAA;AAAA,MACF,KAAO,EAAA,QAAA;AAAA,MACP,OAAO,OAAQ,CAAA,KAAA,KAAU,OAAQ,CAAA,KAAA,KAAU,cAAc,2CAA8C,GAAA,mBAAA;AAAA,KAb7F,CAAA,EAAA;AAAA,MAeZ,OAAS,EAAA,CAAA,EAAA,GAAA,OAAA,CAAQ,OAAR,KAAA,IAAA,GAAA,EAAA,GAAmB,KAAK,GAAI;AAAA,KAAA,CAAA,EACjC,QAAQ,SAAY,GAAA;AAAA,MACtB,WAAW,OAAQ,CAAA;AAAA,KACrB,GAAI,EACL,CAAA,CAAA;AACD,IAAgB,eAAA,CAAA,YAAA,CAAa,EAAE,CAAC,CAAA;AAChC,IAAO,OAAA,IAAA;AAAA,WACA,GAAc,EAAA;AACrB,IAAA,SAAA,CAAU,EAAI,EAAA;AAAA,MACZ,KAAO,EAAA,QAAA;AAAA,MACP,OAAA,EAAS,KAAK,GAAI,EAAA;AAAA,MAClB,OAAO,GAAe,YAAA,KAAA,GAAQ,GAAI,CAAA,OAAA,GAAU,OAAO,GAAG;AAAA,KACvD,CAAA;AACD,IAAO,OAAA,IAAA;AAAA;AAEX;AACA,eAAe,QAAA,CAAS,KAAqB,EAAY,EAAA;AAtNzD,EAAA,IAAA,EAAA;AAuNE,EAAI,IAAA,MAAM,aAAc,CAAA,EAAE,CAAG,EAAA;AAC7B,EAAM,MAAA,OAAA,GAAU,KAAK,GAAI,EAAA;AAEzB,EAAM,MAAA,OAAA,GAAA,CAAU,WAAM,IAAK,CAAA,CAAA,CAAA,KAAK,EAAE,EAAO,KAAA,EAAE,MAA3B,IAA8B,GAAA,MAAA,GAAA,EAAA,CAAA,OAAA;AAC9C,EAAA,MAAM,OAAU,GAAA,OAAA,GAAU,cAAe,CAAA,OAAO,IAAI,cAAe,CAAA;AAAA,IACjE,MAAQ,EAAA;AAAA,GACT,CAAA;AACD,EAAA,OAAO,IAAK,CAAA,GAAA,EAAQ,GAAA,OAAA,GAAU,OAAS,EAAA;AACrC,IAAA,MAAM,OAAO,KAAM,CAAA,IAAA,CAAK,CAAK,CAAA,KAAA,CAAA,CAAE,OAAO,EAAE,CAAA;AACxC,IAAI,IAAA,EAAC,6BAAM,MAAQ,CAAA,EAAA;AACnB,IAAI,IAAA;AACF,MAAA,MAAM,GAAM,GAAA,MAAM,GAAI,CAAA,eAAA,EAAiB,qBAAuB,EAAA;AAAA,QAC5D,SAAA,EAAW,KAAK,MAAO,CAAA,SAAA;AAAA,QACvB,SAAA,EAAW,KAAK,MAAO,CAAA;AAAA,OACxB,CAAA;AACD,MAAM,MAAA,IAAA,GAAO,gBAAgB,GAAG,CAAA;AAChC,MAAA,IAAI,IAAK,CAAA,KAAA,KAAU,WAAe,IAAA,IAAA,CAAK,MAAQ,EAAA;AAC7C,QAAA,SAAA,CAAU,EAAI,EAAA;AAAA,UACZ,KAAO,EAAA,WAAA;AAAA,UACP,OAAA,EAAS,KAAK,GAAI,EAAA;AAAA,UAClB,QAAQ,IAAK,CAAA,MAAA;AAAA,UACb,QAAU,EAAA,IAAA,CAAK,QAAS,CAAA,EAAA,CAAG,EAAE,CAAK,IAAA;AAAA,SACnC,CAAA;AACD,QAAA;AAAA;AAEF,MAAI,IAAA,IAAA,CAAK,UAAU,QAAU,EAAA;AAC3B,QAAA,SAAA,CAAU,EAAI,EAAA;AAAA,UACZ,KAAO,EAAA,QAAA;AAAA,UACP,OAAA,EAAS,KAAK,GAAI,EAAA;AAAA,UAClB,KAAA,EAAO,KAAK,KAAS,IAAA,mBAAA;AAAA,UACrB,QAAA,EAAU,KAAK,KAAS,IAAA;AAAA,SACzB,CAAA;AACD,QAAA;AAAA;AAEF,MAAA,SAAA,CAAU,EAAI,EAAA;AAAA,QACZ,KAAO,EAAA,SAAA;AAAA,QACP,QAAU,EAAA,IAAA,CAAK,QAAS,CAAA,EAAA,CAAG,EAAE,CAAK,IAAA;AAAA,OACnC,CAAA;AAAA,aACM,GAAc,EAAA;AACrB,MAAA,SAAA,CAAU,EAAI,EAAA;AAAA,QACZ,QAAU,EAAA,GAAA,YAAe,KAAQ,GAAA,GAAA,CAAI,OAAU,GAAA;AAAA,OAChD,CAAA;AAAA;AAEH,IAAA,MAAM,IAAI,OAAQ,CAAA,CAAA,CAAA,KAAK,UAAW,CAAA,CAAA,EAAG,mBAAmB,CAAC,CAAA;AAAA;AAE3D,EAAA,SAAA,CAAU,EAAI,EAAA;AAAA,IACZ,KAAO,EAAA,QAAA;AAAA,IACP,OAAA,EAAS,KAAK,GAAI,EAAA;AAAA,IAClB,KAAO,EAAA;AAAA,GACR,CAAA;AACH;AAGsB,eAAA,cAAA,CAAe,KAAqB,KAIlC,EAAA;AACtB,EAAA,MAAM,kBAAmB,EAAA;AACzB,EAAA,MAAM,KAAK,KAAM,EAAA;AACjB,EAAM,MAAA,SAAA,GAAY,KAAK,GAAI,EAAA;AAC3B,EAAA,MAAM,IAAmB,GAAA;AAAA,IACvB,EAAA;AAAA,IACA,IAAM,EAAA,OAAA;AAAA,IACN,KAAO,EAAA,iBAAA;AAAA,IACP,OAAO,KAAM,CAAA,KAAA;AAAA,IACb,SAAS,KAAM,CAAA,OAAA;AAAA,IACf,KAAO,EAAA,YAAA;AAAA,IACP,SAAA;AAAA;AAAA,IAEA,YAAY,aAAc,CAAA,SAAA,EAAW,kBAAkB,KAAM,CAAA,OAAO,IAAI,qBAAqB,CAAA;AAAA,IAC7F,SAAS,KAAM,CAAA,OAAA;AAAA,IACf,QAAU,EAAA;AAAA,GACZ;AACA,EAAQ,KAAA,GAAA,CAAC,IAAM,EAAA,GAAG,KAAK,CAAA;AACvB,EAAQ,OAAA,EAAA;AACR,EAAK,IAAA,EAAA;AACL,EAAI,IAAA;AAEF,IAAA,MAAM,GAAM,GAAA,MAAM,gBAAiB,CAAA,IAAA,EAAM,MAAM,KAAM,CAAA,IAAA,CAAK,CAAK,CAAA,KAAA,CAAA,CAAE,OAAO,EAAE,CAAC,CAAE,CAAA,KAAA,CAAM,MAAM,KAAS,CAAA,CAAA;AAClG,IAAM,MAAA;AAAA,MACJ,MAAQ,EAAA,GAAA;AAAA,MACR;AAAA,KACF,GAAI,MAAM,UAAA,CAAW,GAAK,EAAA,eAAA,EAAiB,uBAAuB,mBAAoB,CAAA,KAAA,CAAM,OAAO,CAAA,EAAG,GAAG,CAAA;AACzG,IAAM,MAAA,MAAA,GAAS,kBAAkB,GAAG,CAAA;AACpC,IAAA,IAAI,CAAC,MAAA,EAAc,MAAA,IAAI,MAAM,+BAA+B,CAAA;AAC5D,IAAA,SAAA,CAAU,EAAI,EAAA,cAAA,CAAA;AAAA,MACZ,KAAO,EAAA,SAAA;AAAA,MACP,MAAA;AAAA,MACA,SAAA,EAAW,KAAK,GAAI,EAAA;AAAA,MACpB,QAAU,EAAA;AAAA,KAAA,EACN,MAAS,GAAA;AAAA,MACX,YAAc,EAAA;AAAA,KAChB,GAAI,EACL,CAAA,CAAA;AACD,IAAA,IAAI,CAAC,OAAA,CAAQ,GAAI,CAAA,EAAE,CAAG,EAAA;AACpB,MAAMA,MAAAA,IAAAA,GAAM,QAAS,CAAA,GAAA,EAAK,EAAE,CAAA,CAAE,QAAQ,MAAM,OAAA,CAAQ,MAAO,CAAA,EAAE,CAAC,CAAA;AAC9D,MAAQ,OAAA,CAAA,GAAA,CAAI,IAAIA,IAAG,CAAA;AAAA;AACrB,WACO,GAAc,EAAA;AACrB,IAAA,SAAA,CAAU,EAAI,EAAA;AAAA,MACZ,KAAO,EAAA,QAAA;AAAA,MACP,OAAA,EAAS,KAAK,GAAI,EAAA;AAAA,MAClB,OAAO,GAAe,YAAA,KAAA,GAAQ,GAAI,CAAA,OAAA,GAAU,OAAO,GAAG,CAAA;AAAA,MACtD,QAAU,EAAA;AAAA,KACX,CAAA;AAAA;AAEH,EAAA,OAAO,KAAM,CAAA,IAAA,CAAK,CAAK,CAAA,KAAA,CAAA,CAAE,OAAO,EAAE,CAAA;AACpC;AAQA,MAAM,YAAA,uBAAmB,GAAmC,EAAA;AACrD,SAAS,oBAAoB,MAA6C,EAAA;AAC/E,EAAA,YAAA,CAAa,IAAI,MAAM,CAAA;AACzB;AACO,SAAS,iBAAiB,GAAqB,EAAA;AACpD,EAAK,KAAA,kBAAA,EAAqB,CAAA,IAAA,CAAK,MAAM;AACnC,IAAA,YAAA,CAAa,OAAQ,CAAA,CAAA,MAAA,KAAU,MAAO,CAAA,GAAG,CAAC,CAAA;AAC1C,IAAA,KAAA,MAAW,QAAQ,KAAO,EAAA;AACxB,MAAI,IAAA,IAAA,CAAK,SAAS,OAAS,EAAA;AAC3B,MAAA,IAAA,CAAK,IAAK,CAAA,KAAA,KAAU,SAAa,IAAA,IAAA,CAAK,KAAU,KAAA,YAAA,KAAiB,IAAK,CAAA,MAAA,IAAU,CAAC,OAAA,CAAQ,GAAI,CAAA,IAAA,CAAK,EAAE,CAAG,EAAA;AACrG,QAAA,MAAM,GAAM,GAAA,QAAA,CAAS,GAAK,EAAA,IAAA,CAAK,EAAE,CAAA,CAAE,OAAQ,CAAA,MAAM,OAAQ,CAAA,MAAA,CAAO,IAAK,CAAA,EAAE,CAAC,CAAA;AACxE,QAAQ,OAAA,CAAA,GAAA,CAAI,IAAK,CAAA,EAAA,EAAI,GAAG,CAAA;AAAA;AAC1B;AACF,GACD,CAAA;AACH"}
|