@adminide-stack/yantra-mobile 12.0.121 → 12.0.123

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (175) hide show
  1. package/lib/features/apps/appArt.js +1 -1
  2. package/lib/features/apps/appArt.js.map +1 -1
  3. package/lib/features/apps/mobileAppCatalog.js +15 -11
  4. package/lib/features/apps/mobileAppCatalog.js.map +1 -1
  5. package/lib/features/canvas/CanvasAgentChatPane.js +82 -20
  6. package/lib/features/canvas/CanvasAgentChatPane.js.map +1 -1
  7. package/lib/features/canvas/CanvasBoardsGrid.js +291 -100
  8. package/lib/features/canvas/CanvasBoardsGrid.js.map +1 -1
  9. package/lib/features/canvas/CanvasEditToolsPanel.js +105 -12
  10. package/lib/features/canvas/CanvasEditToolsPanel.js.map +1 -1
  11. package/lib/features/canvas/CanvasExperience.js +266 -68
  12. package/lib/features/canvas/CanvasExperience.js.map +1 -1
  13. package/lib/features/canvas/CanvasGeneratePanel.js +204 -66
  14. package/lib/features/canvas/CanvasGeneratePanel.js.map +1 -1
  15. package/lib/features/canvas/CanvasLibrarySheet.js +31 -13
  16. package/lib/features/canvas/CanvasLibrarySheet.js.map +1 -1
  17. package/lib/features/canvas/CanvasModelPicker.js +176 -0
  18. package/lib/features/canvas/CanvasModelPicker.js.map +1 -0
  19. package/lib/features/canvas/CanvasTasksPanel.js +325 -29
  20. package/lib/features/canvas/CanvasTasksPanel.js.map +1 -1
  21. package/lib/features/canvas/CanvasTemplatesPanel.js +5 -4
  22. package/lib/features/canvas/CanvasTemplatesPanel.js.map +1 -1
  23. package/lib/features/canvas/CanvasToolDock.js +137 -61
  24. package/lib/features/canvas/CanvasToolDock.js.map +1 -1
  25. package/lib/features/canvas/FrameExtractorExperience.js +33 -2
  26. package/lib/features/canvas/FrameExtractorExperience.js.map +1 -1
  27. package/lib/features/canvas/GeneratorReferenceSlots.js +197 -0
  28. package/lib/features/canvas/GeneratorReferenceSlots.js.map +1 -0
  29. package/lib/features/canvas/NativeCanvasViewer.js +89 -11
  30. package/lib/features/canvas/NativeCanvasViewer.js.map +1 -1
  31. package/lib/features/canvas/PromoContextFields.js +55 -2
  32. package/lib/features/canvas/PromoContextFields.js.map +1 -1
  33. package/lib/features/canvas/SetStudioExperience.js +323 -13
  34. package/lib/features/canvas/SetStudioExperience.js.map +1 -1
  35. package/lib/features/canvas/VideoEditExperience.js +1 -53
  36. package/lib/features/canvas/VideoEditExperience.js.map +1 -1
  37. package/lib/features/canvas/VideoEditorExperience.js +697 -506
  38. package/lib/features/canvas/VideoEditorExperience.js.map +1 -1
  39. package/lib/features/canvas/VideoGeneratorExperience.js +22 -5
  40. package/lib/features/canvas/VideoGeneratorExperience.js.map +1 -1
  41. package/lib/features/canvas/canvasAgentChat.js +125 -11
  42. package/lib/features/canvas/canvasAgentChat.js.map +1 -1
  43. package/lib/features/canvas/canvasCore.js +117 -12
  44. package/lib/features/canvas/canvasCore.js.map +1 -1
  45. package/lib/features/canvas/canvasEditOps.js +148 -111
  46. package/lib/features/canvas/canvasEditOps.js.map +1 -1
  47. package/lib/features/canvas/canvasTaskSync.js +235 -0
  48. package/lib/features/canvas/canvasTaskSync.js.map +1 -0
  49. package/lib/features/canvas/canvasTasks.js +98 -11
  50. package/lib/features/canvas/canvasTasks.js.map +1 -1
  51. package/lib/features/canvas/createTiles.js +247 -0
  52. package/lib/features/canvas/createTiles.js.map +1 -0
  53. package/lib/features/canvas/deepLinks.js +83 -0
  54. package/lib/features/canvas/deepLinks.js.map +1 -0
  55. package/lib/features/canvas/frameExtract.js +13 -1
  56. package/lib/features/canvas/frameExtract.js.map +1 -1
  57. package/lib/features/canvas/generationModels.js +36 -8
  58. package/lib/features/canvas/generationModels.js.map +1 -1
  59. package/lib/features/canvas/generatorCommands.js +106 -0
  60. package/lib/features/canvas/generatorCommands.js.map +1 -0
  61. package/lib/features/canvas/generatorReferences.js +82 -0
  62. package/lib/features/canvas/generatorReferences.js.map +1 -0
  63. package/lib/features/canvas/homeWork.js +74 -0
  64. package/lib/features/canvas/homeWork.js.map +1 -0
  65. package/lib/features/canvas/linksRpc.js +130 -0
  66. package/lib/features/canvas/linksRpc.js.map +1 -0
  67. package/lib/features/canvas/mediaRecheck.js +176 -0
  68. package/lib/features/canvas/mediaRecheck.js.map +1 -0
  69. package/lib/features/canvas/mediaUrls.js +258 -0
  70. package/lib/features/canvas/mediaUrls.js.map +1 -0
  71. package/lib/features/canvas/nativeViewerRegistry.js.map +1 -1
  72. package/lib/features/canvas/promoProjectImport.js +80 -13
  73. package/lib/features/canvas/promoProjectImport.js.map +1 -1
  74. package/lib/features/canvas/promoVideo.js +106 -15
  75. package/lib/features/canvas/promoVideo.js.map +1 -1
  76. package/lib/features/canvas/reframe.js +228 -0
  77. package/lib/features/canvas/reframe.js.map +1 -0
  78. package/lib/features/canvas/serverTasks.js +697 -0
  79. package/lib/features/canvas/serverTasks.js.map +1 -0
  80. package/lib/features/canvas/set/SetViewportWebView.js +207 -28
  81. package/lib/features/canvas/set/SetViewportWebView.js.map +1 -1
  82. package/lib/features/canvas/set/agent/prompt.js +66 -0
  83. package/lib/features/canvas/set/agent/prompt.js.map +1 -0
  84. package/lib/features/canvas/set/agent/setOps.js +203 -0
  85. package/lib/features/canvas/set/agent/setOps.js.map +1 -0
  86. package/lib/features/canvas/set/agent/setTurn.js +128 -0
  87. package/lib/features/canvas/set/agent/setTurn.js.map +1 -0
  88. package/lib/features/canvas/set/agent/snapshot.js +43 -0
  89. package/lib/features/canvas/set/agent/snapshot.js.map +1 -0
  90. package/lib/features/canvas/set/agent/tools.js +580 -0
  91. package/lib/features/canvas/set/agent/tools.js.map +1 -0
  92. package/lib/features/canvas/set/setProject.js +43 -4
  93. package/lib/features/canvas/set/setProject.js.map +1 -1
  94. package/lib/features/canvas/set/supplyLibrary.js +397 -0
  95. package/lib/features/canvas/set/supplyLibrary.js.map +1 -0
  96. package/lib/features/canvas/storageLibrary.js +113 -52
  97. package/lib/features/canvas/storageLibrary.js.map +1 -1
  98. package/lib/features/canvas/studioCatalog.js +15 -2
  99. package/lib/features/canvas/studioCatalog.js.map +1 -1
  100. package/lib/features/canvas/studioLooks.js +1 -8
  101. package/lib/features/canvas/studioLooks.js.map +1 -1
  102. package/lib/features/canvas/useBoardMediaRefresh.js +66 -0
  103. package/lib/features/canvas/useBoardMediaRefresh.js.map +1 -0
  104. package/lib/features/canvas/useMediaSource.js +84 -0
  105. package/lib/features/canvas/useMediaSource.js.map +1 -0
  106. package/lib/features/canvas/video3d.js +11 -10
  107. package/lib/features/canvas/video3d.js.map +1 -1
  108. package/lib/features/canvas/videoEditor/BlurBoxOverlay.js +46 -0
  109. package/lib/features/canvas/videoEditor/BlurBoxOverlay.js.map +1 -0
  110. package/lib/features/canvas/videoEditor/ExportTaskCard.js +134 -0
  111. package/lib/features/canvas/videoEditor/ExportTaskCard.js.map +1 -0
  112. package/lib/features/canvas/videoEditor/agent/AgentCutPane.js +45 -7
  113. package/lib/features/canvas/videoEditor/agent/AgentCutPane.js.map +1 -1
  114. package/lib/features/canvas/videoEditor/agent/agentLoop.js +4 -2
  115. package/lib/features/canvas/videoEditor/agent/agentLoop.js.map +1 -1
  116. package/lib/features/canvas/videoEditor/agent/attachments.js +304 -0
  117. package/lib/features/canvas/videoEditor/agent/attachments.js.map +1 -0
  118. package/lib/features/canvas/videoEditor/agent/brainClient.js +3 -2
  119. package/lib/features/canvas/videoEditor/agent/brainClient.js.map +1 -1
  120. package/lib/features/canvas/videoEditor/agent/cutTools.js +207 -7
  121. package/lib/features/canvas/videoEditor/agent/cutTools.js.map +1 -1
  122. package/lib/features/canvas/videoEditor/blurBox.js +34 -0
  123. package/lib/features/canvas/videoEditor/blurBox.js.map +1 -0
  124. package/lib/features/canvas/videoEditor/compileTimeline.js +668 -0
  125. package/lib/features/canvas/videoEditor/compileTimeline.js.map +1 -0
  126. package/lib/features/canvas/videoEditor/editorModel.js +56 -22
  127. package/lib/features/canvas/videoEditor/editorModel.js.map +1 -1
  128. package/lib/features/canvas/videoEditor/exportPipeline.js +77 -0
  129. package/lib/features/canvas/videoEditor/exportPipeline.js.map +1 -0
  130. package/lib/features/canvas/videoEditor/exportRenderer.js +19 -12
  131. package/lib/features/canvas/videoEditor/exportRenderer.js.map +1 -1
  132. package/lib/features/canvas/videoEditor/exportTask.js +216 -0
  133. package/lib/features/canvas/videoEditor/exportTask.js.map +1 -0
  134. package/lib/features/canvas/videoEditor/formWidgets.js +142 -0
  135. package/lib/features/canvas/videoEditor/formWidgets.js.map +1 -0
  136. package/lib/features/canvas/videoEditor/produce/ProduceVideoSheet.js +195 -0
  137. package/lib/features/canvas/videoEditor/produce/ProduceVideoSheet.js.map +1 -0
  138. package/lib/features/canvas/videoEditor/produce/produceScenes.js +158 -0
  139. package/lib/features/canvas/videoEditor/produce/produceScenes.js.map +1 -0
  140. package/lib/features/canvas/videoEditor/remoteMediaClient.js +17 -5
  141. package/lib/features/canvas/videoEditor/remoteMediaClient.js.map +1 -1
  142. package/lib/features/canvas/videoEditor/renderTimeline.js +207 -0
  143. package/lib/features/canvas/videoEditor/renderTimeline.js.map +1 -0
  144. package/lib/features/canvas/videoEditor/renewLinks.js +64 -0
  145. package/lib/features/canvas/videoEditor/renewLinks.js.map +1 -0
  146. package/lib/features/canvas/videoEditor/sceneLayers.js +101 -0
  147. package/lib/features/canvas/videoEditor/sceneLayers.js.map +1 -0
  148. package/lib/features/canvas/videoEditor/tools/ToolsDrawer.js +283 -0
  149. package/lib/features/canvas/videoEditor/tools/ToolsDrawer.js.map +1 -0
  150. package/lib/features/canvas/videoEditor/tools/catalog.js +576 -0
  151. package/lib/features/canvas/videoEditor/tools/catalog.js.map +1 -0
  152. package/lib/features/canvas/videoEditor/videoProjectsStore.js +27 -3
  153. package/lib/features/canvas/videoEditor/videoProjectsStore.js.map +1 -1
  154. package/lib/features/webbuilder/WebBuilderExperience.js +29 -1
  155. package/lib/features/webbuilder/WebBuilderExperience.js.map +1 -1
  156. package/lib/features/webbuilder/buildFragments.js +8 -4
  157. package/lib/features/webbuilder/buildFragments.js.map +1 -1
  158. package/lib/features/webbuilder/codezenHandoff.js +108 -0
  159. package/lib/features/webbuilder/codezenHandoff.js.map +1 -0
  160. package/lib/features/webbuilder/workflow.js.map +1 -1
  161. package/lib/hooks/useChatApi.js +1 -2
  162. package/lib/hooks/useChatApi.js.map +1 -1
  163. package/lib/screens/CanvasBoard/index.js +12 -1
  164. package/lib/screens/CanvasBoard/index.js.map +1 -1
  165. package/lib/screens/Home/HomeScreen.js.map +1 -1
  166. package/lib/screens/Home/components/HomeSuggestions.js +3 -3
  167. package/lib/screens/Home/components/HomeSuggestions.js.map +1 -1
  168. package/lib/screens/WebBuilder/index.js +4 -2
  169. package/lib/screens/WebBuilder/index.js.map +1 -1
  170. package/lib/screens/WebBuilderNative/index.js +29 -2
  171. package/lib/screens/WebBuilderNative/index.js.map +1 -1
  172. package/lib/screens/WebBuilderNative/useWebBuilderHost.js +30 -6
  173. package/lib/screens/WebBuilderNative/useWebBuilderHost.js.map +1 -1
  174. package/package.json +3 -3
  175. /package/lib/assets/apps/{paper2poster.webp → poster.webp} +0 -0
@@ -1,4 +1,4 @@
1
- import {jsxs,jsx}from'react/jsx-runtime';import {useState,useRef,useEffect}from'react';import {StyleSheet,View,Pressable,Text,ActivityIndicator,ScrollView,TextInput}from'react-native';import {useSafeInsets}from'./withRemoteSafeArea.js';import {MaterialCommunityIcons}from'@expo/vector-icons';import {Image}from'expo-image';import {useKeyboardLiftHeight,KeyboardAwareScreen,KeyboardComposerDock,COMPOSER_INPUT_NATIVE_ID}from'../../components/KeyboardComposerDock.js';import {dismissKeyboard}from'../../utils/keyboardController.js';import {resultUrl,friendlyMediaError,generationImageUrl,generationMediaUrl}from'./videoEditor/mediaActions.js';import {unwrapProxyUrl}from'./videoEditor/remoteMediaClient.js';import {STATIC_VIDEO_MODELS,normalizeModels,promptAudioModels,videoDurationOptions,buildVideoGenerateParams}from'./generationModels.js';import {DEFAULT_PROMO_PRESET,lookupPromoPreset,defaultNarration,EMPTY_PROMO_CONTEXT,PROMO_PRESETS,PROMO_DURATIONS,PROMO_PLAYBOOKS,PROMO_ASPECT_RATIOS,designPromoProject,PROMO_CONNECTOR,producePromoVideo}from'./promoVideo.js';import {PromoContextFields}from'./PromoContextFields.js';var __defProp = Object.defineProperty;
1
+ import {jsxs,jsx}from'react/jsx-runtime';import {useState,useRef,useEffect}from'react';import {StyleSheet,View,Pressable,Text,ActivityIndicator,ScrollView,TextInput}from'react-native';import {useSafeInsets}from'./withRemoteSafeArea.js';import {MaterialCommunityIcons}from'@expo/vector-icons';import {Image}from'expo-image';import {useKeyboardLiftHeight,KeyboardAwareScreen,KeyboardComposerDock,COMPOSER_INPUT_NATIVE_ID}from'../../components/KeyboardComposerDock.js';import {dismissKeyboard}from'../../utils/keyboardController.js';import {resultUrl,friendlyMediaError,generationImageUrl,generationMediaUrl}from'./videoEditor/mediaActions.js';import {unwrapProxyUrl}from'./videoEditor/remoteMediaClient.js';import {STATIC_VIDEO_MODELS,normalizeModels,promptAudioModels,videoDurationOptions,buildVideoGenerateParams}from'./generationModels.js';import {DEFAULT_PROMO_PRESET,lookupPromoPreset,defaultNarration,EMPTY_PROMO_CONTEXT,defaultPromoQuality,PROMO_PRESETS,PROMO_DURATIONS,PROMO_PLAYBOOKS,PROMO_ASPECT_RATIOS,designPromoProject,PROMO_CONNECTOR,producePromoVideo}from'./promoVideo.js';import {PromoContextFields,PromoProductionFields}from'./PromoContextFields.js';var __defProp = Object.defineProperty;
2
2
  var __defProps = Object.defineProperties;
3
3
  var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
4
  var __getOwnPropSymbols = Object.getOwnPropertySymbols;
@@ -44,6 +44,10 @@ function VideoGeneratorExperience({
44
44
  const [promoNarration, setPromoNarration] = useState(defaultNarration(DEFAULT_PROMO_PRESET));
45
45
  const [promoContext, setPromoContext] = useState(EMPTY_PROMO_CONTEXT);
46
46
  const [promoPlaybook, setPromoPlaybook] = useState("");
47
+ const [promoQuality, setPromoQuality] = useState(() => defaultPromoQuality(mode === "promo" && (item == null ? void 0 : item.type) === "video" ? "footage-remix" : DEFAULT_PROMO_PRESET));
48
+ const [promoNarrator, setPromoNarrator] = useState("");
49
+ const [promoUseCases, setPromoUseCases] = useState("");
50
+ const [promoDesignModel, setPromoDesignModel] = useState("");
47
51
  const [promoLogoUrl, setPromoLogoUrl] = useState(mode === "promo" && (item == null ? void 0 : item.type) === "image" ? unwrapProxyUrl(item.src) : null);
48
52
  const [busy, setBusy] = useState(false);
49
53
  const [notice, setNotice] = useState(null);
@@ -131,7 +135,7 @@ ${err instanceof Error ? err.message : String(err)}`.slice(0, 280));
131
135
  prompt: text
132
136
  }, selectedModel ? {
133
137
  model: selectedModel
134
- } : {})).then((result) => resultUrl(result, "YANTRA_AUDIO_RUN_PROMPT")) : mode === "promo" ? producePromoVideo((action, params) => runAction(PROMO_CONNECTOR, action, params), __spreadValues(__spreadValues(__spreadValues(__spreadProps(__spreadValues(__spreadValues({
138
+ } : {})).then((result) => resultUrl(result, "YANTRA_AUDIO_RUN_PROMPT")) : mode === "promo" ? producePromoVideo((action, params) => runAction(PROMO_CONNECTOR, action, params), __spreadValues(__spreadValues(__spreadProps(__spreadValues(__spreadValues(__spreadValues(__spreadProps(__spreadValues(__spreadValues({
135
139
  prompt: text,
136
140
  preset: promoPreset,
137
141
  durationSeconds: promoDuration,
@@ -147,6 +151,12 @@ ${err instanceof Error ? err.message : String(err)}`.slice(0, 280));
147
151
  logoUrl: promoLogoUrl
148
152
  } : {}), promoContext), promoPlaybook ? {
149
153
  stylePlaybook: promoPlaybook
154
+ } : {}), {
155
+ quality: promoQuality
156
+ }), promoNarrator ? {
157
+ narratorVoice: promoNarrator
158
+ } : {}), promoUseCases.trim() ? {
159
+ useCases: promoUseCases
150
160
  } : {}), (msg) => setPromoProgress(msg), void 0, () => cancelledRef.current).then((promo) => promo.url) : runAction("yantra-video-generation", "YANTRA_VIDEO_GENERATION_GENERATE", buildVideoGenerateParams({
151
161
  prompt: text,
152
162
  aspectRatio: aspect,
@@ -207,6 +217,7 @@ ${err instanceof Error ? err.message : String(err)}`.slice(0, 280));
207
217
  setPromoPreset(preset.id);
208
218
  setPromoDuration(preset.defaultDurationSeconds);
209
219
  setPromoNarration(defaultNarration(preset.id));
220
+ setPromoQuality(defaultPromoQuality(preset.id));
210
221
  }, style: [styles.chip, promoPreset === preset.id && styles.chipOn], accessibilityRole: "button", children: /* @__PURE__ */ jsx(Text, { style: [styles.chipLabel, promoPreset === preset.id && styles.chipLabelOn], children: preset.name }) }, preset.id)) }),
211
222
  /* @__PURE__ */ jsx(View, { style: styles.aspectRow, children: PROMO_DURATIONS.map((secs) => /* @__PURE__ */ jsx(Pressable, { onPress: () => setPromoDuration(secs), style: [styles.chip, promoDuration === secs && styles.chipOn], accessibilityRole: "button", children: /* @__PURE__ */ jsxs(Text, { style: [styles.chipLabel, promoDuration === secs && styles.chipLabelOn], children: [
212
223
  secs,
@@ -217,7 +228,11 @@ ${err instanceof Error ? err.message : String(err)}`.slice(0, 280));
217
228
  /* @__PURE__ */ jsx(Pressable, { onPress: () => setPromoNarration((v) => !v), style: [styles.chip, promoNarration && styles.chipOn], accessibilityRole: "button", children: /* @__PURE__ */ jsx(Text, { style: [styles.chipLabel, promoNarration && styles.chipLabelOn], children: "Narration" }) })
218
229
  ] }),
219
230
  /* @__PURE__ */ jsx(View, { style: styles.aspectRow, children: PROMO_PLAYBOOKS.map((p) => /* @__PURE__ */ jsx(Pressable, { onPress: () => setPromoPlaybook(p.id), style: [styles.chip, promoPlaybook === p.id && styles.chipOn], accessibilityRole: "button", children: /* @__PURE__ */ jsx(Text, { style: [styles.chipLabel, promoPlaybook === p.id && styles.chipLabelOn], children: p.name }) }, p.id || "default")) }),
220
- /* @__PURE__ */ jsx(PromoContextFields, { value: promoContext, onChange: (patch) => setPromoContext((prev) => __spreadValues(__spreadValues({}, prev), patch)), logoUrl: promoLogoUrl, onPickLogo: (item == null ? void 0 : item.type) === "image" ? () => setPromoLogoUrl(unwrapProxyUrl(item.src)) : void 0, onClearLogo: () => setPromoLogoUrl(null) })
231
+ /* @__PURE__ */ jsx(PromoContextFields, { value: promoContext, onChange: (patch) => setPromoContext((prev) => __spreadValues(__spreadValues({}, prev), patch)), logoUrl: promoLogoUrl, onPickLogo: (item == null ? void 0 : item.type) === "image" ? () => setPromoLogoUrl(unwrapProxyUrl(item.src)) : void 0, onClearLogo: () => setPromoLogoUrl(null) }),
232
+ /* @__PURE__ */ jsx(PromoProductionFields, __spreadValues({ quality: promoQuality, onQuality: setPromoQuality, narrator: promoNarrator, onNarrator: setPromoNarrator, useCases: promoUseCases, onUseCases: setPromoUseCases }, onPromoDesigned && !lookupPromoPreset(promoPreset).produceOnly ? {
233
+ designModel: promoDesignModel,
234
+ onDesignModel: setPromoDesignModel
235
+ } : {}))
221
236
  ] }) : null,
222
237
  mode !== "promo" && models.length > 0 && !keyboardOpen ? /* @__PURE__ */ jsx(ScrollView, { horizontal: true, showsHorizontalScrollIndicator: false, contentContainerStyle: styles.aspectRow, children: models.map((model) => {
223
238
  const blocked = Boolean(videoSourceUrl) && !model.supportsVideoInput;
@@ -236,11 +251,11 @@ ${err instanceof Error ? err.message : String(err)}`.slice(0, 280));
236
251
  return (_a = inputRef.current) == null ? void 0 : _a.focus();
237
252
  }, children: /* @__PURE__ */ jsxs(View, { style: styles.composer, children: [
238
253
  /* @__PURE__ */ jsx(TextInput, { ref: inputRef, nativeID: COMPOSER_INPUT_NATIVE_ID, value: prompt, onChangeText: setPrompt, placeholder: mode === "image" ? "Describe the image\u2026" : mode === "audio" ? "Describe the audio\u2026" : mode === "promo" ? "Describe the promo\u2026" : "Describe the video\u2026", placeholderTextColor: "#7A7A88", style: styles.input, multiline: true, editable: !busy }),
239
- mode === "promo" && onPromoDesigned ? /* @__PURE__ */ jsx(Pressable, { onPress: () => {
254
+ mode === "promo" && onPromoDesigned && !lookupPromoPreset(promoPreset).produceOnly ? /* @__PURE__ */ jsx(Pressable, { onPress: () => {
240
255
  if (!runAction || busy || !prompt.trim()) return;
241
256
  setBusy(true);
242
257
  setNotice(null);
243
- designPromoProject((action, params) => runAction(PROMO_CONNECTOR, action, params), __spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues({
258
+ designPromoProject((action, params) => runAction(PROMO_CONNECTOR, action, params), __spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues({
244
259
  prompt: prompt.trim(),
245
260
  preset: promoPreset,
246
261
  durationSeconds: promoDuration,
@@ -253,6 +268,8 @@ ${err instanceof Error ? err.message : String(err)}`.slice(0, 280));
253
268
  logoUrl: promoLogoUrl
254
269
  } : {}), promoContext), promoPlaybook ? {
255
270
  stylePlaybook: promoPlaybook
271
+ } : {}), promoDesignModel ? {
272
+ model: promoDesignModel
256
273
  } : {})).then((designed) => onPromoDesigned(designed)).catch((err) => setNotice(friendlyMediaError(err, "promo design"))).finally(() => setBusy(false));
257
274
  }, disabled: busy || capturing || !prompt.trim(), style: [styles.designSend, (!prompt.trim() || busy || capturing) && styles.sendDisabled], accessibilityRole: "button", accessibilityLabel: "Design editable cut", children: /* @__PURE__ */ jsx(Text, { style: styles.designSendLabel, children: "Design" }) }) : null,
258
275
  /* @__PURE__ */ jsx(Pressable, { onPress: generate, disabled: busy || capturing || !prompt.trim(), style: [styles.send, (!prompt.trim() || busy || capturing) && styles.sendDisabled], accessibilityRole: "button", accessibilityLabel: `Generate ${mode}`, children: busy ? /* @__PURE__ */ jsx(ActivityIndicator, { color: "#0A0A0C" }) : /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "arrow-right", size: 20, color: "#0A0A0C" }) })
@@ -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 lookupPromoPreset,\n producePromoVideo,\n type DesignedPromo,\n type PromoContext,\n} from './promoVideo';\nimport { PromoContextFields } 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 [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 },\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 }}\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 </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 ? (\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 })\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, 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,4 +1,4 @@
1
- import {generationImageUrl,resultUrl,generationMediaUrl,friendlyMediaError}from'./videoEditor/mediaActions.js';import {unwrapProxyUrl}from'./videoEditor/remoteMediaClient.js';import {buildVideoGenerateParams,STATIC_VIDEO_MODELS}from'./generationModels.js';var __defProp = Object.defineProperty;
1
+ import {generationImageUrl,resultUrl,generationMediaUrl,friendlyMediaError}from'./videoEditor/mediaActions.js';import {unwrapProxyUrl}from'./videoEditor/remoteMediaClient.js';import {STATIC_VIDEO_MODELS,buildVideoGenerateParams}from'./generationModels.js';import {imageLaneCall}from'./generatorReferences.js';import {ensureFetchableMediaUrl}from'./mediaUrls.js';var __defProp = Object.defineProperty;
2
2
  var __getOwnPropSymbols = Object.getOwnPropertySymbols;
3
3
  var __hasOwnProp = Object.prototype.hasOwnProperty;
4
4
  var __propIsEnum = Object.prototype.propertyIsEnumerable;
@@ -14,6 +14,22 @@ var __spreadValues = (a, b) => {
14
14
  }
15
15
  return a;
16
16
  };
17
+ function groupCanvasChatModels(models) {
18
+ const order = [];
19
+ const byGroup = /* @__PURE__ */ new Map();
20
+ for (const m of models) {
21
+ const key = m.group || "Models";
22
+ if (!byGroup.has(key)) {
23
+ order.push(key);
24
+ byGroup.set(key, []);
25
+ }
26
+ byGroup.get(key).push(m);
27
+ }
28
+ return order.map((group) => ({
29
+ group,
30
+ options: byGroup.get(group)
31
+ }));
32
+ }
17
33
  function inferCanvasChatLane(text) {
18
34
  const t = text.toLowerCase();
19
35
  if (/\b(videos?|clips?|footage|mp4|reels?|animat(?:e|ion|ing)|make a film|short film)\b/.test(t)) {
@@ -41,18 +57,21 @@ function attachmentSrc(file) {
41
57
  return (src == null ? void 0 : src.trim()) ? src : null;
42
58
  }
43
59
  async function generateCanvasChatMedia(opts) {
44
- var _a, _b;
60
+ var _a, _b, _c;
45
61
  const text = opts.prompt.trim();
46
62
  const aspect = opts.aspect || "16:9";
47
63
  const model = (_a = opts.model) == null ? void 0 : _a.trim();
48
- const still = opts.referenceImageUrl ? unwrapProxyUrl(opts.referenceImageUrl) : void 0;
64
+ const still = opts.referenceImageUrl ? await ensureFetchableMediaUrl(opts.runAction, unwrapProxyUrl(opts.referenceImageUrl)) : void 0;
65
+ const endStill = opts.referenceEndImageUrl ? await ensureFetchableMediaUrl(opts.runAction, unwrapProxyUrl(opts.referenceEndImageUrl)) : void 0;
49
66
  if (opts.lane === "image") {
50
- const result2 = await opts.runAction("yantra-image-generation", "YANTRA_GEMINI_IMAGE_GENERATE", __spreadValues({
67
+ const call = imageLaneCall({
51
68
  prompt: text,
52
- aspectRatio: aspect
53
- }, model ? {
54
- model
55
- } : {}));
69
+ aspectRatio: aspect,
70
+ model,
71
+ stills: still ? [still] : [],
72
+ role: (_b = opts.imageRole) != null ? _b : "source"
73
+ });
74
+ const result2 = await opts.runAction("yantra-image-generation", call.action, call.params);
56
75
  return generationImageUrl(result2);
57
76
  }
58
77
  if (opts.lane === "audio") {
@@ -66,11 +85,106 @@ async function generateCanvasChatMedia(opts) {
66
85
  const result = await opts.runAction("yantra-video-generation", "YANTRA_VIDEO_GENERATION_GENERATE", buildVideoGenerateParams({
67
86
  prompt: text,
68
87
  aspectRatio: aspect,
69
- model: model || ((_b = STATIC_VIDEO_MODELS[0]) == null ? void 0 : _b.id),
70
- referenceImageUrl: still
88
+ model: model || ((_c = STATIC_VIDEO_MODELS[0]) == null ? void 0 : _c.id),
89
+ referenceImageUrl: still,
90
+ referenceEndImageUrl: endStill
71
91
  }));
72
92
  return generationMediaUrl(result);
73
93
  }
74
94
  function canvasChatGenerateError(err, lane) {
75
95
  return friendlyMediaError(err, `${lane} generation`);
76
- }export{attachmentMediaKind,attachmentSrc,canvasChatGenerateError,generateCanvasChatMedia,inferCanvasChatLane};//# sourceMappingURL=canvasAgentChat.js.map
96
+ }
97
+ function laneTakesEndFrame(lane, model) {
98
+ var _a, _b;
99
+ if (lane !== "video") return false;
100
+ const id = ((_a = STATIC_VIDEO_MODELS[0]) == null ? void 0 : _a.id);
101
+ return Boolean((_b = STATIC_VIDEO_MODELS.find((m) => m.id === id)) == null ? void 0 : _b.supportsEndFrame);
102
+ }
103
+ function asksForVideo(text) {
104
+ return /\b(videos?|clips?(?!\s+art)|films?|movies?|reels?|footage|animated?|animation)\b/i.test(text);
105
+ }
106
+ function planAttachments(attachments, {
107
+ endFrame = false
108
+ } = {}) {
109
+ const plan = {
110
+ place: [],
111
+ unusable: []
112
+ };
113
+ for (const attachment of attachments != null ? attachments : []) {
114
+ const mime = (attachment.mimeType || "").toLowerCase();
115
+ const declaredOther = Boolean(mime) && !/^(image|video|audio)\//.test(mime);
116
+ const type = attachmentSrc(attachment) && !declaredOther ? attachmentMediaKind(attachment) : null;
117
+ if (!type) plan.unusable.push(attachment.name || "file");
118
+ else if (type === "image" && !plan.referenceImage) plan.referenceImage = attachment;
119
+ else if (type === "image" && endFrame && !plan.endImage) plan.endImage = attachment;
120
+ else plan.place.push({
121
+ attachment,
122
+ type
123
+ });
124
+ }
125
+ return plan;
126
+ }
127
+ function unusableAttachmentsReply(names) {
128
+ if (!names.length) return null;
129
+ return `Couldn't use ${names.join(", ")} \u2014 attach images, video or audio.`;
130
+ }
131
+ const SERVER_DEFAULT_MODEL_ID = "server-default";
132
+ const AGENT_MODELS = [{
133
+ id: SERVER_DEFAULT_MODEL_ID,
134
+ title: "Server default",
135
+ description: "Uses the agent server\u2019s configured model."
136
+ }, {
137
+ id: "codex-efficient",
138
+ title: "Codex (Local)",
139
+ group: "Local",
140
+ description: "Uses the agent server\u2019s Codex login."
141
+ }, {
142
+ id: "local-claude-code/claude-opus-5-5",
143
+ title: "Claude Opus 5.5",
144
+ group: "Local",
145
+ description: "Most capable, for long and complex work."
146
+ }, {
147
+ id: "yantra-router/fast",
148
+ title: "Yantra Fast",
149
+ group: "Yantra Router",
150
+ description: "Cheapest, quickest."
151
+ }, {
152
+ id: "yantra-router/medium",
153
+ title: "Yantra Medium (Balanced)",
154
+ group: "Yantra Router"
155
+ }, {
156
+ id: "yantra-router/complex",
157
+ title: "Yantra Pro",
158
+ group: "Yantra Router",
159
+ description: "Highest quality."
160
+ }];
161
+ const AGENT_MODEL_STORAGE_KEY = "canvas.agentModel";
162
+ function agentModelForRequest(id) {
163
+ const model = id == null ? void 0 : id.trim();
164
+ return model && model !== SERVER_DEFAULT_MODEL_ID ? model : void 0;
165
+ }
166
+ function resolveAgentModelId(models, picked) {
167
+ return picked && models.some((m) => m.id === picked) ? picked : SERVER_DEFAULT_MODEL_ID;
168
+ }
169
+ function defaultAgentModelStorage() {
170
+ var _a;
171
+ try {
172
+ return (_a = require("@react-native-async-storage/async-storage").default) != null ? _a : null;
173
+ } catch (e) {
174
+ return null;
175
+ }
176
+ }
177
+ async function readStoredAgentModel(storage = defaultAgentModelStorage()) {
178
+ try {
179
+ return await (storage == null ? void 0 : storage.getItem(AGENT_MODEL_STORAGE_KEY)) || void 0;
180
+ } catch (e) {
181
+ return void 0;
182
+ }
183
+ }
184
+ async function writeStoredAgentModel(id, storage = defaultAgentModelStorage()) {
185
+ try {
186
+ if (agentModelForRequest(id)) await (storage == null ? void 0 : storage.setItem(AGENT_MODEL_STORAGE_KEY, id));
187
+ else await (storage == null ? void 0 : storage.removeItem(AGENT_MODEL_STORAGE_KEY));
188
+ } catch (e) {
189
+ }
190
+ }export{AGENT_MODELS,AGENT_MODEL_STORAGE_KEY,SERVER_DEFAULT_MODEL_ID,agentModelForRequest,asksForVideo,attachmentMediaKind,attachmentSrc,canvasChatGenerateError,generateCanvasChatMedia,groupCanvasChatModels,inferCanvasChatLane,laneTakesEndFrame,planAttachments,readStoredAgentModel,resolveAgentModelId,unusableAttachmentsReply,writeStoredAgentModel};//# sourceMappingURL=canvasAgentChat.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"canvasAgentChat.js","sources":["../../../src/features/canvas/canvasAgentChat.ts"],"sourcesContent":["/**\n * Native twin of canvas-surface `useCanvasChat` + Generate connectors.\n * Web routes a durable skill turn; native places files then runs the same\n * image/video/audio connectors as the Generate dock so media lands on the board.\n */\nimport type { MessageAttachment } from '../../hooks/useChatStream';\nimport {\n friendlyMediaError,\n generationImageUrl,\n generationMediaUrl,\n resultUrl,\n type RunMediaAction,\n} from './videoEditor/mediaActions';\nimport { unwrapProxyUrl } from './videoEditor/remoteMediaClient';\nimport { STATIC_IMAGE_MODELS, STATIC_VIDEO_MODELS, buildVideoGenerateParams, type ModelInfo } from './generationModels';\n\n/** Composer Auto — canvas-surface `AUTO_MODEL_ID`. */\nexport const AUTO_MODEL_ID = 'auto:';\n\nexport interface CanvasChatModelOption {\n id: string;\n title: string;\n description?: string;\n group: string;\n}\n\nexport interface CanvasChatModelPick {\n kind: CanvasChatLane;\n id: string;\n}\n\n/** `<kind>:<id>` from the composer picker → an override; Auto is undefined. */\nexport function parseCanvasChatModel(value: string | undefined): CanvasChatModelPick | undefined {\n if (!value) return undefined;\n const sep = value.indexOf(':');\n const kind = value.slice(0, sep);\n const id = value.slice(sep + 1);\n if (!id || (kind !== 'image' && kind !== 'video' && kind !== 'audio')) return undefined;\n return { kind, id };\n}\n\n/** Auto first, then one group per kind (ids `<kind>:<id>`). */\nexport function buildCanvasChatModels(\n image: readonly ModelInfo[],\n video: readonly ModelInfo[],\n audio: readonly ModelInfo[],\n): CanvasChatModelOption[] {\n const row = (kind: CanvasChatLane, m: ModelInfo, group: string): CanvasChatModelOption => ({\n id: `${kind}:${m.id}`,\n title: m.label || m.id,\n description: m.description || m.provider,\n group,\n });\n return [\n { id: AUTO_MODEL_ID, title: 'Auto', description: 'Let the media skill choose', group: 'Automatic' },\n ...image.map((m) => row('image', m, 'Image')),\n ...video.map((m) => row('video', m, 'Video')),\n ...audio.map((m) => row('audio', m, 'Audio')),\n ];\n}\n\nexport function groupCanvasChatModels(\n models: readonly CanvasChatModelOption[],\n): Array<{ group: string; options: CanvasChatModelOption[] }> {\n const order: string[] = [];\n const byGroup = new Map<string, CanvasChatModelOption[]>();\n for (const m of models) {\n const key = m.group || 'Models';\n if (!byGroup.has(key)) {\n order.push(key);\n byGroup.set(key, []);\n }\n byGroup.get(key)!.push(m);\n }\n return order.map((group) => ({ group, options: byGroup.get(group)! }));\n}\n\nexport type CanvasChatLane = 'image' | 'video' | 'audio';\n\nexport function inferCanvasChatLane(text: string): CanvasChatLane {\n const t = text.toLowerCase();\n // \"cinematic\" / \"film grain\" are still-image language. Require an explicit\n // moving-picture ask so Agent chips like Golden-hour skyline stay on image\n // (and do not hit Veo studio credits).\n if (/\\b(videos?|clips?|footage|mp4|reels?|animat(?:e|ion|ing)|make a film|short film)\\b/.test(t)) {\n return 'video';\n }\n if (/\\b(audio|voiceover|soundtrack|music|song|podcast|narrat(?:e|ion)|speech|soundscape)\\b/.test(t)) {\n return 'audio';\n }\n return 'image';\n}\n\nexport function attachmentMediaKind(file: MessageAttachment): CanvasChatLane | null {\n const mime = (file.mimeType || '').toLowerCase();\n const name = (file.name || '').toLowerCase();\n if (mime.startsWith('video/') || /\\.(mp4|mov|webm)$/i.test(name)) return 'video';\n if (mime.startsWith('audio/') || /\\.(mp3|wav|m4a|aac)$/i.test(name)) return 'audio';\n if (\n mime.startsWith('image/') ||\n file.type === 'screenshot' ||\n /\\.(png|jpe?g|gif|webp)$/i.test(name) ||\n Boolean(file.dataUrl?.startsWith('data:image'))\n ) {\n return 'image';\n }\n if (file.url || file.dataUrl) return 'image';\n return null;\n}\n\nexport function attachmentSrc(file: MessageAttachment): string | null {\n const src = file.url || file.dataUrl;\n return src?.trim() ? src : null;\n}\n\nexport async function generateCanvasChatMedia(opts: {\n runAction: RunMediaAction;\n prompt: string;\n lane: CanvasChatLane;\n model?: string;\n aspect?: string;\n referenceImageUrl?: string;\n}): Promise<string> {\n const text = opts.prompt.trim();\n const aspect = opts.aspect || '16:9';\n const model = opts.model?.trim();\n const still = opts.referenceImageUrl ? unwrapProxyUrl(opts.referenceImageUrl) : undefined;\n if (opts.lane === 'image') {\n const result = await opts.runAction('yantra-image-generation', 'YANTRA_GEMINI_IMAGE_GENERATE', {\n prompt: text,\n aspectRatio: aspect,\n ...(model ? { model } : {}),\n });\n return generationImageUrl(result);\n }\n if (opts.lane === 'audio') {\n const result = await opts.runAction('yantra-audio', 'YANTRA_AUDIO_RUN_PROMPT', {\n prompt: text,\n ...(model ? { model } : {}),\n });\n return resultUrl(result, 'YANTRA_AUDIO_RUN_PROMPT');\n }\n const result = await opts.runAction(\n 'yantra-video-generation',\n 'YANTRA_VIDEO_GENERATION_GENERATE',\n buildVideoGenerateParams({\n prompt: text,\n aspectRatio: aspect,\n model: model || STATIC_VIDEO_MODELS[0]?.id,\n referenceImageUrl: still,\n }),\n );\n return generationMediaUrl(result);\n}\n\nexport function canvasChatGenerateError(err: unknown, lane: CanvasChatLane): string {\n return friendlyMediaError(err, `${lane} generation`);\n}\n\nexport function defaultModelForLane(lane: CanvasChatLane): string {\n if (lane === 'video') return STATIC_VIDEO_MODELS[0]?.id ?? '';\n if (lane === 'image') return STATIC_IMAGE_MODELS[0]?.id ?? '';\n return '';\n}\n"],"names":["result"],"mappings":"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"}
1
+ {"version":3,"file":"canvasAgentChat.js","sources":["../../../src/features/canvas/canvasAgentChat.ts"],"sourcesContent":["/**\n * Native twin of canvas-surface `useCanvasChat` + Generate connectors.\n * Web routes a durable skill turn; native places files then runs the same\n * image/video/audio connectors as the Generate dock so media lands on the board.\n */\nimport type { MessageAttachment } from '../../hooks/useChatStream';\nimport {\n friendlyMediaError,\n generationImageUrl,\n generationMediaUrl,\n resultUrl,\n type RunMediaAction,\n} from './videoEditor/mediaActions';\nimport { unwrapProxyUrl } from './videoEditor/remoteMediaClient';\nimport { STATIC_IMAGE_MODELS, STATIC_VIDEO_MODELS, buildVideoGenerateParams, type ModelInfo } from './generationModels';\nimport { imageLaneCall, type StillRole } from './generatorReferences';\nimport { ensureFetchableMediaUrl } from './mediaUrls';\n\n/** Composer Auto — canvas-surface `AUTO_MODEL_ID`. */\nexport const AUTO_MODEL_ID = 'auto:';\n\nexport interface CanvasChatModelOption {\n id: string;\n title: string;\n description?: string;\n group: string;\n}\n\nexport interface CanvasChatModelPick {\n kind: CanvasChatLane;\n id: string;\n}\n\n/** `<kind>:<id>` from the composer picker → an override; Auto is undefined. */\nexport function parseCanvasChatModel(value: string | undefined): CanvasChatModelPick | undefined {\n if (!value) return undefined;\n const sep = value.indexOf(':');\n const kind = value.slice(0, sep);\n const id = value.slice(sep + 1);\n if (!id || (kind !== 'image' && kind !== 'video' && kind !== 'audio')) return undefined;\n return { kind, id };\n}\n\n/** Auto first, then one group per kind (ids `<kind>:<id>`). */\nexport function buildCanvasChatModels(\n image: readonly ModelInfo[],\n video: readonly ModelInfo[],\n audio: readonly ModelInfo[],\n): CanvasChatModelOption[] {\n const row = (kind: CanvasChatLane, m: ModelInfo, group: string): CanvasChatModelOption => ({\n id: `${kind}:${m.id}`,\n title: m.label || m.id,\n description: m.description || m.provider,\n group,\n });\n return [\n { id: AUTO_MODEL_ID, title: 'Auto', description: 'Let the media skill choose', group: 'Automatic' },\n ...image.map((m) => row('image', m, 'Image')),\n ...video.map((m) => row('video', m, 'Video')),\n ...audio.map((m) => row('audio', m, 'Audio')),\n ];\n}\n\nexport function groupCanvasChatModels(\n models: readonly CanvasChatModelOption[],\n): Array<{ group: string; options: CanvasChatModelOption[] }> {\n const order: string[] = [];\n const byGroup = new Map<string, CanvasChatModelOption[]>();\n for (const m of models) {\n const key = m.group || 'Models';\n if (!byGroup.has(key)) {\n order.push(key);\n byGroup.set(key, []);\n }\n byGroup.get(key)!.push(m);\n }\n return order.map((group) => ({ group, options: byGroup.get(group)! }));\n}\n\nexport type CanvasChatLane = 'image' | 'video' | 'audio';\n\nexport function inferCanvasChatLane(text: string): CanvasChatLane {\n const t = text.toLowerCase();\n // \"cinematic\" / \"film grain\" are still-image language. Require an explicit\n // moving-picture ask so Agent chips like Golden-hour skyline stay on image\n // (and do not hit Veo studio credits).\n if (/\\b(videos?|clips?|footage|mp4|reels?|animat(?:e|ion|ing)|make a film|short film)\\b/.test(t)) {\n return 'video';\n }\n if (/\\b(audio|voiceover|soundtrack|music|song|podcast|narrat(?:e|ion)|speech|soundscape)\\b/.test(t)) {\n return 'audio';\n }\n return 'image';\n}\n\nexport function attachmentMediaKind(file: MessageAttachment): CanvasChatLane | null {\n const mime = (file.mimeType || '').toLowerCase();\n const name = (file.name || '').toLowerCase();\n if (mime.startsWith('video/') || /\\.(mp4|mov|webm)$/i.test(name)) return 'video';\n if (mime.startsWith('audio/') || /\\.(mp3|wav|m4a|aac)$/i.test(name)) return 'audio';\n if (\n mime.startsWith('image/') ||\n file.type === 'screenshot' ||\n /\\.(png|jpe?g|gif|webp)$/i.test(name) ||\n Boolean(file.dataUrl?.startsWith('data:image'))\n ) {\n return 'image';\n }\n if (file.url || file.dataUrl) return 'image';\n return null;\n}\n\nexport function attachmentSrc(file: MessageAttachment): string | null {\n const src = file.url || file.dataUrl;\n return src?.trim() ? src : null;\n}\n\nexport async function generateCanvasChatMedia(opts: {\n runAction: RunMediaAction;\n prompt: string;\n lane: CanvasChatLane;\n model?: string;\n aspect?: string;\n referenceImageUrl?: string;\n /** Video lane: the frame the clip ends on (models with `supportsEndFrame`). */\n referenceEndImageUrl?: string;\n /** Image lane: what the reference still is for — Edit (default) or Reference. */\n imageRole?: StillRole;\n}): Promise<string> {\n const text = opts.prompt.trim();\n const aspect = opts.aspect || '16:9';\n const model = opts.model?.trim();\n const still = opts.referenceImageUrl\n ? await ensureFetchableMediaUrl(opts.runAction, unwrapProxyUrl(opts.referenceImageUrl))\n : undefined;\n const endStill = opts.referenceEndImageUrl\n ? await ensureFetchableMediaUrl(opts.runAction, unwrapProxyUrl(opts.referenceEndImageUrl))\n : undefined;\n if (opts.lane === 'image') {\n const call = imageLaneCall({\n prompt: text,\n aspectRatio: aspect,\n model,\n stills: still ? [still] : [],\n role: opts.imageRole ?? 'source',\n });\n const result = await opts.runAction('yantra-image-generation', call.action, call.params);\n return generationImageUrl(result);\n }\n if (opts.lane === 'audio') {\n const result = await opts.runAction('yantra-audio', 'YANTRA_AUDIO_RUN_PROMPT', {\n prompt: text,\n ...(model ? { model } : {}),\n });\n return resultUrl(result, 'YANTRA_AUDIO_RUN_PROMPT');\n }\n const result = await opts.runAction(\n 'yantra-video-generation',\n 'YANTRA_VIDEO_GENERATION_GENERATE',\n buildVideoGenerateParams({\n prompt: text,\n aspectRatio: aspect,\n model: model || STATIC_VIDEO_MODELS[0]?.id,\n referenceImageUrl: still,\n referenceEndImageUrl: endStill,\n }),\n );\n return generationMediaUrl(result);\n}\n\nexport function canvasChatGenerateError(err: unknown, lane: CanvasChatLane): string {\n return friendlyMediaError(err, `${lane} generation`);\n}\n\n/** Whether the lane's default model ends on a frame (a 2nd image becomes the end frame). */\nexport function laneTakesEndFrame(lane: CanvasChatLane, model?: string): boolean {\n if (lane !== 'video') return false;\n const id = model || STATIC_VIDEO_MODELS[0]?.id;\n return Boolean(STATIC_VIDEO_MODELS.find((m) => m.id === id)?.supportsEndFrame);\n}\n\nexport function defaultModelForLane(lane: CanvasChatLane): string {\n if (lane === 'video') return STATIC_VIDEO_MODELS[0]?.id ?? '';\n if (lane === 'image') return STATIC_IMAGE_MODELS[0]?.id ?? '';\n return '';\n}\n\n// ── Attachments (web `utils/chatAttachments.ts`) ─────────────────────────────\n\nexport interface CanvasAttachmentPlan {\n /** First image — the turn's reference input (image edit / img2video). Not placed on the board. */\n referenceImage?: MessageAttachment;\n /** Second image, when the turn's video model ends on a frame. */\n endImage?: MessageAttachment;\n /** Other media — dropped on the canvas as-is. */\n place: { attachment: MessageAttachment; type: CanvasChatLane }[];\n /** Names of files no lane handles — reported back instead of silently dropped. */\n unusable: string[];\n}\n\n/** Whether a chat prompt asks for moving footage rather than a still. */\nexport function asksForVideo(text: string): boolean {\n return /\\b(videos?|clips?(?!\\s+art)|films?|movies?|reels?|footage|animated?|animation)\\b/i.test(text);\n}\n\nexport function planAttachments(\n attachments?: readonly MessageAttachment[],\n { endFrame = false }: { endFrame?: boolean } = {},\n): CanvasAttachmentPlan {\n const plan: CanvasAttachmentPlan = { place: [], unusable: [] };\n for (const attachment of attachments ?? []) {\n // A declared non-media type (PDF, CSV…) is unusable, not a guessed image.\n const mime = (attachment.mimeType || '').toLowerCase();\n const declaredOther = Boolean(mime) && !/^(image|video|audio)\\//.test(mime);\n const type = attachmentSrc(attachment) && !declaredOther ? attachmentMediaKind(attachment) : null;\n if (!type) plan.unusable.push(attachment.name || 'file');\n else if (type === 'image' && !plan.referenceImage) plan.referenceImage = attachment;\n else if (type === 'image' && endFrame && !plan.endImage) plan.endImage = attachment;\n else plan.place.push({ attachment, type });\n }\n return plan;\n}\n\n/** \"Couldn't use notes.pdf, data.csv — attach images, video or audio.\" */\nexport function unusableAttachmentsReply(names: readonly string[]): string | null {\n if (!names.length) return null;\n return `Couldn't use ${names.join(', ')} — attach images, video or audio.`;\n}\n\n// ── Agent model (surface-kit `agentModels.ts`) ───────────────────────────────\n\nexport interface AgentModelOption {\n id: string;\n title: string;\n group?: string;\n description?: string;\n}\n\n/** \"No override\": the turn goes out with no `model` at all. */\nexport const SERVER_DEFAULT_MODEL_ID = 'server-default';\n\nexport const AGENT_MODELS: readonly AgentModelOption[] = [\n { id: SERVER_DEFAULT_MODEL_ID, title: 'Server default', description: 'Uses the agent server’s configured model.' },\n {\n id: 'codex-efficient',\n title: 'Codex (Local)',\n group: 'Local',\n description: 'Uses the agent server’s Codex login.',\n },\n {\n id: 'local-claude-code/claude-opus-5-5',\n title: 'Claude Opus 5.5',\n group: 'Local',\n description: 'Most capable, for long and complex work.',\n },\n { id: 'yantra-router/fast', title: 'Yantra Fast', group: 'Yantra Router', description: 'Cheapest, quickest.' },\n { id: 'yantra-router/medium', title: 'Yantra Medium (Balanced)', group: 'Yantra Router' },\n { id: 'yantra-router/complex', title: 'Yantra Pro', group: 'Yantra Router', description: 'Highest quality.' },\n];\n\nexport const AGENT_MODEL_STORAGE_KEY = 'canvas.agentModel';\n\n/** The `model` a turn should send for a pick: nothing for the server default (or no pick). */\nexport function agentModelForRequest(id: string | null | undefined): string | undefined {\n const model = id?.trim();\n return model && model !== SERVER_DEFAULT_MODEL_ID ? model : undefined;\n}\n\n/** The stored pick while the list still offers it, else the server default. */\nexport function resolveAgentModelId(models: readonly AgentModelOption[], picked: string | null | undefined): string {\n return picked && models.some((m) => m.id === picked) ? picked : SERVER_DEFAULT_MODEL_ID;\n}\n\ntype AgentModelStorage = {\n getItem(key: string): Promise<string | null>;\n setItem(key: string, value: string): Promise<void>;\n removeItem(key: string): Promise<void>;\n};\n\n// Guarded require (see canvasBoardsSnapshot): the native module may be absent on older host binaries.\nfunction defaultAgentModelStorage(): AgentModelStorage | null {\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports, global-require\n return require('@react-native-async-storage/async-storage').default ?? null;\n } catch {\n return null;\n }\n}\n\nexport async function readStoredAgentModel(\n storage: AgentModelStorage | null = defaultAgentModelStorage(),\n): Promise<string | undefined> {\n try {\n return (await storage?.getItem(AGENT_MODEL_STORAGE_KEY)) || undefined;\n } catch {\n return undefined;\n }\n}\n\n/** The server default is stored as no key at all. */\nexport async function writeStoredAgentModel(\n id: string,\n storage: AgentModelStorage | null = defaultAgentModelStorage(),\n): Promise<void> {\n try {\n if (agentModelForRequest(id)) await storage?.setItem(AGENT_MODEL_STORAGE_KEY, id);\n else await storage?.removeItem(AGENT_MODEL_STORAGE_KEY);\n } catch {\n // Storage unavailable: the pick holds for this session only.\n }\n}\n"],"names":["result"],"mappings":"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"}