@adminide-stack/yantra-mobile 12.0.69-alpha.8 → 12.0.69

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 (522) hide show
  1. package/lib/components/GatewayConnector/GatewayConnector.js +2 -2
  2. package/lib/components/GatewayConnector/GatewayConnector.js.map +1 -1
  3. package/lib/components/KeyboardComposerDock.js +8 -1
  4. package/lib/components/KeyboardComposerDock.js.map +1 -1
  5. package/lib/components/NavigationHeader/NavigationHeader.js +2 -2
  6. package/lib/components/NavigationHeader/NavigationHeader.js.map +1 -1
  7. package/lib/config/env-config.js +4 -0
  8. package/lib/config/env-config.js.map +1 -1
  9. package/lib/contexts/ChatLiveStreamContext.js +4 -1
  10. package/lib/contexts/ChatLiveStreamContext.js.map +1 -1
  11. package/lib/features/agent-chat/NativeAgentChat.js +2 -0
  12. package/lib/features/agent-chat/NativeAgentChat.js.map +1 -1
  13. package/lib/features/apps/AppsCatalog.js +2 -2
  14. package/lib/features/apps/AppsCatalog.js.map +1 -1
  15. package/lib/features/audio-input/MicErrorBoundary.js +2 -2
  16. package/lib/features/audio-input/MicErrorBoundary.js.map +1 -1
  17. package/lib/features/canvas/AudioEditorExperience.js +308 -0
  18. package/lib/features/canvas/AudioEditorExperience.js.map +1 -0
  19. package/lib/features/canvas/CanvasAgentChatPane.js +310 -0
  20. package/lib/features/canvas/CanvasAgentChatPane.js.map +1 -0
  21. package/lib/features/canvas/CanvasBoardsGrid.js +414 -0
  22. package/lib/features/canvas/CanvasBoardsGrid.js.map +1 -0
  23. package/lib/features/canvas/CanvasChatResultCard.js +113 -0
  24. package/lib/features/canvas/CanvasChatResultCard.js.map +1 -0
  25. package/lib/features/canvas/CanvasEditToolsPanel.js +179 -0
  26. package/lib/features/canvas/CanvasEditToolsPanel.js.map +1 -0
  27. package/lib/features/canvas/CanvasExperience.js +859 -0
  28. package/lib/features/canvas/CanvasExperience.js.map +1 -0
  29. package/lib/features/canvas/CanvasGeneratePanel.js +514 -0
  30. package/lib/features/canvas/CanvasGeneratePanel.js.map +1 -0
  31. package/lib/features/canvas/CanvasLibrarySheet.js +355 -0
  32. package/lib/features/canvas/CanvasLibrarySheet.js.map +1 -0
  33. package/lib/features/canvas/CanvasLooksPanel.js +184 -0
  34. package/lib/features/canvas/CanvasLooksPanel.js.map +1 -0
  35. package/lib/features/canvas/CanvasTasksPanel.js +138 -0
  36. package/lib/features/canvas/CanvasTasksPanel.js.map +1 -0
  37. package/lib/features/canvas/CanvasTemplatesPanel.js +226 -0
  38. package/lib/features/canvas/CanvasTemplatesPanel.js.map +1 -0
  39. package/lib/features/canvas/CanvasToolDock.js +423 -0
  40. package/lib/features/canvas/CanvasToolDock.js.map +1 -0
  41. package/lib/features/canvas/FrameExtractorExperience.js +242 -0
  42. package/lib/features/canvas/FrameExtractorExperience.js.map +1 -0
  43. package/lib/features/canvas/ImageEditorExperience.js +491 -0
  44. package/lib/features/canvas/ImageEditorExperience.js.map +1 -0
  45. package/lib/features/canvas/InfluencerStudioExperience.js +288 -0
  46. package/lib/features/canvas/InfluencerStudioExperience.js.map +1 -0
  47. package/lib/features/canvas/MoodboardExperience.js +205 -0
  48. package/lib/features/canvas/MoodboardExperience.js.map +1 -0
  49. package/lib/features/canvas/NativeCanvasViewer.js +929 -0
  50. package/lib/features/canvas/NativeCanvasViewer.js.map +1 -0
  51. package/lib/features/canvas/PromoContextFields.js +150 -0
  52. package/lib/features/canvas/PromoContextFields.js.map +1 -0
  53. package/lib/features/canvas/SetStudioExperience.js +323 -0
  54. package/lib/features/canvas/SetStudioExperience.js.map +1 -0
  55. package/lib/features/canvas/VideoClipsExperience.js +175 -0
  56. package/lib/features/canvas/VideoClipsExperience.js.map +1 -0
  57. package/lib/features/canvas/VideoEditExperience.js +824 -0
  58. package/lib/features/canvas/VideoEditExperience.js.map +1 -0
  59. package/lib/features/canvas/VideoEditorExperience.js +3050 -0
  60. package/lib/features/canvas/VideoEditorExperience.js.map +1 -0
  61. package/lib/features/canvas/VideoGeneratorExperience.js +415 -0
  62. package/lib/features/canvas/VideoGeneratorExperience.js.map +1 -0
  63. package/lib/features/canvas/aiEdit.js +53 -0
  64. package/lib/features/canvas/aiEdit.js.map +1 -0
  65. package/lib/features/canvas/canvasAgentChat.js +76 -0
  66. package/lib/features/canvas/canvasAgentChat.js.map +1 -0
  67. package/lib/features/canvas/canvasBoardsCatalog.js +59 -0
  68. package/lib/features/canvas/canvasBoardsCatalog.js.map +1 -0
  69. package/lib/features/canvas/canvasBoardsSnapshot.js +14 -1
  70. package/lib/features/canvas/canvasBoardsSnapshot.js.map +1 -1
  71. package/lib/features/canvas/canvasChatDisplay.js +38 -0
  72. package/lib/features/canvas/canvasChatDisplay.js.map +1 -0
  73. package/lib/features/canvas/canvasChatTemplates.js +219 -0
  74. package/lib/features/canvas/canvasChatTemplates.js.map +1 -0
  75. package/lib/features/canvas/canvasCore.js +138 -1
  76. package/lib/features/canvas/canvasCore.js.map +1 -1
  77. package/lib/features/canvas/canvasEditOps.js +224 -0
  78. package/lib/features/canvas/canvasEditOps.js.map +1 -0
  79. package/lib/features/canvas/canvasTasks.js +187 -0
  80. package/lib/features/canvas/canvasTasks.js.map +1 -0
  81. package/lib/features/canvas/designPromptTemplates.js +3084 -0
  82. package/lib/features/canvas/designPromptTemplates.js.map +1 -0
  83. package/lib/features/canvas/editTools.js +54 -0
  84. package/lib/features/canvas/editTools.js.map +1 -0
  85. package/lib/features/canvas/extendVideo.js +5 -0
  86. package/lib/features/canvas/extendVideo.js.map +1 -0
  87. package/lib/features/canvas/frameExtract.js +33 -0
  88. package/lib/features/canvas/frameExtract.js.map +1 -0
  89. package/lib/features/canvas/generationModels.js +201 -0
  90. package/lib/features/canvas/generationModels.js.map +1 -0
  91. package/lib/features/canvas/influencer/influencerPipeline.js +170 -0
  92. package/lib/features/canvas/influencer/influencerPipeline.js.map +1 -0
  93. package/lib/features/canvas/influencer/productReel.js +72 -0
  94. package/lib/features/canvas/influencer/productReel.js.map +1 -0
  95. package/lib/features/canvas/influencer/reelPlan.js +159 -0
  96. package/lib/features/canvas/influencer/reelPlan.js.map +1 -0
  97. package/lib/features/canvas/moodboardCore.js +13 -0
  98. package/lib/features/canvas/moodboardCore.js.map +1 -0
  99. package/lib/features/canvas/promoProjectImport.js +99 -0
  100. package/lib/features/canvas/promoProjectImport.js.map +1 -0
  101. package/lib/features/canvas/promoVideo.js +312 -0
  102. package/lib/features/canvas/promoVideo.js.map +1 -0
  103. package/lib/features/canvas/recorder/CameraRecorderExperience.js +109 -0
  104. package/lib/features/canvas/recorder/CameraRecorderExperience.js.map +1 -0
  105. package/lib/features/canvas/sessionIdentity.js +28 -1
  106. package/lib/features/canvas/sessionIdentity.js.map +1 -1
  107. package/lib/features/canvas/set/SetViewportWebView.js +133 -0
  108. package/lib/features/canvas/set/SetViewportWebView.js.map +1 -0
  109. package/lib/features/canvas/set/cameraPath.js +194 -0
  110. package/lib/features/canvas/set/cameraPath.js.map +1 -0
  111. package/lib/features/canvas/set/setProject.js +24 -0
  112. package/lib/features/canvas/set/setProject.js.map +1 -0
  113. package/lib/features/canvas/storageLibrary.js +184 -0
  114. package/lib/features/canvas/storageLibrary.js.map +1 -0
  115. package/lib/features/canvas/studioCatalog.js +129 -0
  116. package/lib/features/canvas/studioCatalog.js.map +1 -0
  117. package/lib/features/canvas/studioLooks.js +189 -0
  118. package/lib/features/canvas/studioLooks.js.map +1 -0
  119. package/lib/features/canvas/surfaceIndex.js +63 -1
  120. package/lib/features/canvas/surfaceIndex.js.map +1 -1
  121. package/lib/features/canvas/templateImport/invideoNative.js +221 -0
  122. package/lib/features/canvas/templateImport/invideoNative.js.map +1 -0
  123. package/lib/features/canvas/templateImport/loadTemplate.js +43 -0
  124. package/lib/features/canvas/templateImport/loadTemplate.js.map +1 -0
  125. package/lib/features/canvas/templateImport/renderConfig.js +93 -0
  126. package/lib/features/canvas/templateImport/renderConfig.js.map +1 -0
  127. package/lib/features/canvas/useStudioCatalogTemplates.js +134 -0
  128. package/lib/features/canvas/useStudioCatalogTemplates.js.map +1 -0
  129. package/lib/features/canvas/video3d.js +109 -0
  130. package/lib/features/canvas/video3d.js.map +1 -0
  131. package/lib/features/canvas/videoClips.js +42 -0
  132. package/lib/features/canvas/videoClips.js.map +1 -0
  133. package/lib/features/canvas/videoEditor/agent/AgentCutPane.js +120 -0
  134. package/lib/features/canvas/videoEditor/agent/AgentCutPane.js.map +1 -0
  135. package/lib/features/canvas/videoEditor/agent/agentLoop.js +69 -0
  136. package/lib/features/canvas/videoEditor/agent/agentLoop.js.map +1 -0
  137. package/lib/features/canvas/videoEditor/agent/brainClient.js +45 -0
  138. package/lib/features/canvas/videoEditor/agent/brainClient.js.map +1 -0
  139. package/lib/features/canvas/videoEditor/agent/cutTools.js +129 -0
  140. package/lib/features/canvas/videoEditor/agent/cutTools.js.map +1 -0
  141. package/lib/features/canvas/videoEditor/editorModel.js +346 -0
  142. package/lib/features/canvas/videoEditor/editorModel.js.map +1 -0
  143. package/lib/features/canvas/videoEditor/exportRenderer.js +214 -0
  144. package/lib/features/canvas/videoEditor/exportRenderer.js.map +1 -0
  145. package/lib/features/canvas/videoEditor/filters.js +41 -0
  146. package/lib/features/canvas/videoEditor/filters.js.map +1 -0
  147. package/lib/features/canvas/videoEditor/mediaActions.js +57 -0
  148. package/lib/features/canvas/videoEditor/mediaActions.js.map +1 -0
  149. package/lib/features/canvas/videoEditor/remoteMediaClient.js +129 -0
  150. package/lib/features/canvas/videoEditor/remoteMediaClient.js.map +1 -0
  151. package/lib/features/canvas/videoEditor/solidColorPng.js +115 -0
  152. package/lib/features/canvas/videoEditor/solidColorPng.js.map +1 -0
  153. package/lib/features/canvas/videoEditor/videoEditOps.js +191 -0
  154. package/lib/features/canvas/videoEditor/videoEditOps.js.map +1 -0
  155. package/lib/features/canvas/videoEditor/videoProjectsStore.js +82 -0
  156. package/lib/features/canvas/videoEditor/videoProjectsStore.js.map +1 -0
  157. package/lib/features/canvas/videoRenderer.js +8 -0
  158. package/lib/features/canvas/videoRenderer.js.map +1 -0
  159. package/lib/features/canvas/withRemoteSafeArea.js +2 -2
  160. package/lib/features/canvas/withRemoteSafeArea.js.map +1 -1
  161. package/lib/features/characters/characterStudioProps.js +14 -0
  162. package/lib/features/characters/characterStudioProps.js.map +1 -0
  163. package/lib/features/chat/ChatCodeBlock.js +7 -3
  164. package/lib/features/chat/ChatCodeBlock.js.map +1 -1
  165. package/lib/features/chat/ChatTranscript.js +7 -3
  166. package/lib/features/chat/ChatTranscript.js.map +1 -1
  167. package/lib/features/chat/ChatWidgetCard.js +13 -0
  168. package/lib/features/chat/ChatWidgetCard.js.map +1 -0
  169. package/lib/features/chat/ConnectorConnectCard.js +164 -0
  170. package/lib/features/chat/ConnectorConnectCard.js.map +1 -0
  171. package/lib/features/chat/ConnectorConnectPrompt.js +254 -0
  172. package/lib/features/chat/ConnectorConnectPrompt.js.map +1 -0
  173. package/lib/features/chat/MessageActionBar.js.map +1 -1
  174. package/lib/features/chat/QueuedFollowUps.js +71 -0
  175. package/lib/features/chat/QueuedFollowUps.js.map +1 -0
  176. package/lib/features/chat/chatWidgets.js +37 -0
  177. package/lib/features/chat/chatWidgets.js.map +1 -0
  178. package/lib/features/chat/connectorConnect.js +179 -0
  179. package/lib/features/chat/connectorConnect.js.map +1 -0
  180. package/lib/features/chat/connectorConnectHandbacks.js +55 -0
  181. package/lib/features/chat/connectorConnectHandbacks.js.map +1 -0
  182. package/lib/features/design/DesignEditorExperience.js +643 -0
  183. package/lib/features/design/DesignEditorExperience.js.map +1 -0
  184. package/lib/features/design/DesignExperience.js +444 -0
  185. package/lib/features/design/DesignExperience.js.map +1 -0
  186. package/lib/features/design/designCore.js +298 -0
  187. package/lib/features/design/designCore.js.map +1 -0
  188. package/lib/features/design/designIndex.js +150 -0
  189. package/lib/features/design/designIndex.js.map +1 -0
  190. package/lib/features/design/exportDesign.js +133 -0
  191. package/lib/features/design/exportDesign.js.map +1 -0
  192. package/lib/features/job-search/ApplicationsPanel.js +907 -0
  193. package/lib/features/job-search/ApplicationsPanel.js.map +1 -0
  194. package/lib/features/job-search/ContactsPanel.js +627 -0
  195. package/lib/features/job-search/ContactsPanel.js.map +1 -0
  196. package/lib/features/job-search/InsightsPanel.js +299 -0
  197. package/lib/features/job-search/InsightsPanel.js.map +1 -0
  198. package/lib/features/job-search/InterviewPanel.js +637 -0
  199. package/lib/features/job-search/InterviewPanel.js.map +1 -0
  200. package/lib/features/job-search/JdPastePrompt.js +130 -0
  201. package/lib/features/job-search/JdPastePrompt.js.map +1 -0
  202. package/lib/features/job-search/JobCard.js +199 -0
  203. package/lib/features/job-search/JobCard.js.map +1 -0
  204. package/lib/features/job-search/JobDetailSheet.js +255 -0
  205. package/lib/features/job-search/JobDetailSheet.js.map +1 -0
  206. package/lib/features/job-search/JobSearchAgentChatPane.js +377 -0
  207. package/lib/features/job-search/JobSearchAgentChatPane.js.map +1 -0
  208. package/lib/features/job-search/JobSearchExperience.js +1324 -0
  209. package/lib/features/job-search/JobSearchExperience.js.map +1 -0
  210. package/lib/features/job-search/JobSearchLocationField.js +231 -0
  211. package/lib/features/job-search/JobSearchLocationField.js.map +1 -0
  212. package/lib/features/job-search/ProfilePanel.js +679 -0
  213. package/lib/features/job-search/ProfilePanel.js.map +1 -0
  214. package/lib/features/job-search/RepliesPanel.js +344 -0
  215. package/lib/features/job-search/RepliesPanel.js.map +1 -0
  216. package/lib/features/job-search/SavedPanel.js +297 -0
  217. package/lib/features/job-search/SavedPanel.js.map +1 -0
  218. package/lib/features/job-search/chat/widgetContent.js +29 -0
  219. package/lib/features/job-search/chat/widgetContent.js.map +1 -0
  220. package/lib/features/job-search/cvText.js +91 -0
  221. package/lib/features/job-search/cvText.js.map +1 -0
  222. package/lib/features/job-search/jobAgentSwipe.js +7 -0
  223. package/lib/features/job-search/jobAgentSwipe.js.map +1 -0
  224. package/lib/features/job-search/jobSearchClient.js +184 -0
  225. package/lib/features/job-search/jobSearchClient.js.map +1 -0
  226. package/lib/features/job-search/jobSearchExec.js +14 -0
  227. package/lib/features/job-search/jobSearchExec.js.map +1 -0
  228. package/lib/features/job-search/jobSearchRuntime.js +50 -0
  229. package/lib/features/job-search/jobSearchRuntime.js.map +1 -0
  230. package/lib/features/job-search/jobSearchTheme.js +44 -0
  231. package/lib/features/job-search/jobSearchTheme.js.map +1 -0
  232. package/lib/features/job-search/savedJobs.js +85 -0
  233. package/lib/features/job-search/savedJobs.js.map +1 -0
  234. package/lib/features/job-search/searchHistory.js +117 -0
  235. package/lib/features/job-search/searchHistory.js.map +1 -0
  236. package/lib/features/job-search/types.js +36 -0
  237. package/lib/features/job-search/types.js.map +1 -0
  238. package/lib/features/job-search/useJobSearchSession.js +558 -0
  239. package/lib/features/job-search/useJobSearchSession.js.map +1 -0
  240. package/lib/features/messaging/ChatComponents.js +529 -0
  241. package/lib/features/messaging/ChatComponents.js.map +1 -0
  242. package/lib/features/messaging/ChatInviteDeepLink.js +116 -0
  243. package/lib/features/messaging/ChatInviteDeepLink.js.map +1 -0
  244. package/lib/features/messaging/ContactsScreen.js +288 -0
  245. package/lib/features/messaging/ContactsScreen.js.map +1 -0
  246. package/lib/features/messaging/ConversationListScreen.js +147 -0
  247. package/lib/features/messaging/ConversationListScreen.js.map +1 -0
  248. package/lib/features/messaging/MessageActions.js +290 -0
  249. package/lib/features/messaging/MessageActions.js.map +1 -0
  250. package/lib/features/messaging/NativeChatExperience.js +189 -0
  251. package/lib/features/messaging/NativeChatExperience.js.map +1 -0
  252. package/lib/features/messaging/RegistrationScreen.js +11 -14
  253. package/lib/features/messaging/RegistrationScreen.js.map +1 -1
  254. package/lib/features/messaging/ThreadScreen.js +215 -0
  255. package/lib/features/messaging/ThreadScreen.js.map +1 -0
  256. package/lib/features/messaging/chatInviteLink.js +52 -0
  257. package/lib/features/messaging/chatInviteLink.js.map +1 -0
  258. package/lib/features/messaging/chatModel.js +278 -0
  259. package/lib/features/messaging/chatModel.js.map +1 -0
  260. package/lib/features/messaging/chatOperations.js +106 -1
  261. package/lib/features/messaging/chatOperations.js.map +1 -1
  262. package/lib/features/messaging/emojiCatalog.js +60 -0
  263. package/lib/features/messaging/emojiCatalog.js.map +1 -0
  264. package/lib/features/messaging/emojiKeywords.js +1592 -0
  265. package/lib/features/messaging/emojiKeywords.js.map +1 -0
  266. package/lib/features/messaging/nativeChatChannelQuery.js +27 -0
  267. package/lib/features/messaging/nativeChatChannelQuery.js.map +1 -0
  268. package/lib/features/messaging/phoneNumbers.js +52 -1
  269. package/lib/features/messaging/phoneNumbers.js.map +1 -1
  270. package/lib/features/messaging/sha256.js +68 -0
  271. package/lib/features/messaging/sha256.js.map +1 -0
  272. package/lib/features/messaging/useChatData.js +421 -0
  273. package/lib/features/messaging/useChatData.js.map +1 -0
  274. package/lib/features/messaging/useContactMatches.js +191 -0
  275. package/lib/features/messaging/useContactMatches.js.map +1 -0
  276. package/lib/features/messaging/usePhoneVerification.js +12 -12
  277. package/lib/features/messaging/usePhoneVerification.js.map +1 -1
  278. package/lib/features/messaging/yantraChatOrg.js +8 -3
  279. package/lib/features/messaging/yantraChatOrg.js.map +1 -1
  280. package/lib/features/resume/AnnotateModal.js +100 -0
  281. package/lib/features/resume/AnnotateModal.js.map +1 -0
  282. package/lib/features/resume/AnnotationBar.js +69 -0
  283. package/lib/features/resume/AnnotationBar.js.map +1 -0
  284. package/lib/features/resume/ExportSheet.js +105 -0
  285. package/lib/features/resume/ExportSheet.js.map +1 -0
  286. package/lib/features/resume/ResumeAgentChatPane.js +95 -0
  287. package/lib/features/resume/ResumeAgentChatPane.js.map +1 -0
  288. package/lib/features/resume/ResumeEditor.js +676 -0
  289. package/lib/features/resume/ResumeEditor.js.map +1 -0
  290. package/lib/features/resume/ResumeExperience.js +235 -0
  291. package/lib/features/resume/ResumeExperience.js.map +1 -0
  292. package/lib/features/resume/ResumeListPanel.js +262 -0
  293. package/lib/features/resume/ResumeListPanel.js.map +1 -0
  294. package/lib/features/resume/ResumeToolbar.js +236 -0
  295. package/lib/features/resume/ResumeToolbar.js.map +1 -0
  296. package/lib/features/resume/annotations.js +17 -0
  297. package/lib/features/resume/annotations.js.map +1 -0
  298. package/lib/features/resume/documentCss.js +52 -0
  299. package/lib/features/resume/documentCss.js.map +1 -0
  300. package/lib/features/resume/draft.js +89 -0
  301. package/lib/features/resume/draft.js.map +1 -0
  302. package/lib/features/resume/exportResume.js +43 -0
  303. package/lib/features/resume/exportResume.js.map +1 -0
  304. package/lib/features/resume/pickResumePhoto.js +22 -0
  305. package/lib/features/resume/pickResumePhoto.js.map +1 -0
  306. package/lib/features/resume/renderResume.js +121 -0
  307. package/lib/features/resume/renderResume.js.map +1 -0
  308. package/lib/features/resume/resumeClient.js +69 -0
  309. package/lib/features/resume/resumeClient.js.map +1 -0
  310. package/lib/features/resume/resumeExec.js +14 -0
  311. package/lib/features/resume/resumeExec.js.map +1 -0
  312. package/lib/features/resume/resumeIndex.js +244 -0
  313. package/lib/features/resume/resumeIndex.js.map +1 -0
  314. package/lib/features/resume/resumeRuntime.js +50 -0
  315. package/lib/features/resume/resumeRuntime.js.map +1 -0
  316. package/lib/features/resume/resumeTheme.js +34 -0
  317. package/lib/features/resume/resumeTheme.js.map +1 -0
  318. package/lib/features/resume/resumeToolbox.js +49 -0
  319. package/lib/features/resume/resumeToolbox.js.map +1 -0
  320. package/lib/features/resume/templates.js +90 -0
  321. package/lib/features/resume/templates.js.map +1 -0
  322. package/lib/features/resume/types.js +10 -0
  323. package/lib/features/resume/types.js.map +1 -0
  324. package/lib/features/resume/useResumeSession.js +183 -0
  325. package/lib/features/resume/useResumeSession.js.map +1 -0
  326. package/lib/features/shopping/DealsPanel.js +254 -0
  327. package/lib/features/shopping/DealsPanel.js.map +1 -0
  328. package/lib/features/shopping/HistoryPanel.js +147 -0
  329. package/lib/features/shopping/HistoryPanel.js.map +1 -0
  330. package/lib/features/shopping/OrdersPanel.js +157 -0
  331. package/lib/features/shopping/OrdersPanel.js.map +1 -0
  332. package/lib/features/shopping/ProductCard.js +326 -0
  333. package/lib/features/shopping/ProductCard.js.map +1 -0
  334. package/lib/features/shopping/ProductDetailSheet.js +313 -0
  335. package/lib/features/shopping/ProductDetailSheet.js.map +1 -0
  336. package/lib/features/shopping/ProductFilterBar.js +153 -0
  337. package/lib/features/shopping/ProductFilterBar.js.map +1 -0
  338. package/lib/features/shopping/ProductPhoto.js +27 -0
  339. package/lib/features/shopping/ProductPhoto.js.map +1 -0
  340. package/lib/features/shopping/SavedPanel.js +139 -0
  341. package/lib/features/shopping/SavedPanel.js.map +1 -0
  342. package/lib/features/shopping/ShoppingAgentChatPane.js +436 -0
  343. package/lib/features/shopping/ShoppingAgentChatPane.js.map +1 -0
  344. package/lib/features/shopping/ShoppingExperience.js +888 -0
  345. package/lib/features/shopping/ShoppingExperience.js.map +1 -0
  346. package/lib/features/shopping/TrendingSections.js +199 -0
  347. package/lib/features/shopping/TrendingSections.js.map +1 -0
  348. package/lib/features/shopping/WatchlistPanel.js +148 -0
  349. package/lib/features/shopping/WatchlistPanel.js.map +1 -0
  350. package/lib/features/shopping/catalog.js +238 -0
  351. package/lib/features/shopping/catalog.js.map +1 -0
  352. package/lib/features/shopping/chat/ShoppingChatResultCard.js +175 -0
  353. package/lib/features/shopping/chat/ShoppingChatResultCard.js.map +1 -0
  354. package/lib/features/shopping/chat/streamAssistantReply.js +34 -0
  355. package/lib/features/shopping/chat/streamAssistantReply.js.map +1 -0
  356. package/lib/features/shopping/chat/widgetContent.js +233 -0
  357. package/lib/features/shopping/chat/widgetContent.js.map +1 -0
  358. package/lib/features/shopping/hooks/useTrendingProducts.js +162 -0
  359. package/lib/features/shopping/hooks/useTrendingProducts.js.map +1 -0
  360. package/lib/features/shopping/productImage.js +42 -0
  361. package/lib/features/shopping/productImage.js.map +1 -0
  362. package/lib/features/shopping/savedProducts.js +84 -0
  363. package/lib/features/shopping/savedProducts.js.map +1 -0
  364. package/lib/features/shopping/services/catalogActions.js +166 -0
  365. package/lib/features/shopping/services/catalogActions.js.map +1 -0
  366. package/lib/features/shopping/services/parsePriceCheckIntent.js +58 -0
  367. package/lib/features/shopping/services/parsePriceCheckIntent.js.map +1 -0
  368. package/lib/features/shopping/services/parseShoppingIntent.js +67 -0
  369. package/lib/features/shopping/services/parseShoppingIntent.js.map +1 -0
  370. package/lib/features/shopping/services/productAvailability.js +25 -0
  371. package/lib/features/shopping/services/productAvailability.js.map +1 -0
  372. package/lib/features/shopping/services/productFilters.js +72 -0
  373. package/lib/features/shopping/services/productFilters.js.map +1 -0
  374. package/lib/features/shopping/services/retailerUrl.js +75 -0
  375. package/lib/features/shopping/services/retailerUrl.js.map +1 -0
  376. package/lib/features/shopping/services/shoppingChatReply.js +46 -0
  377. package/lib/features/shopping/services/shoppingChatReply.js.map +1 -0
  378. package/lib/features/shopping/services/shoppingProductSearch.js +336 -0
  379. package/lib/features/shopping/services/shoppingProductSearch.js.map +1 -0
  380. package/lib/features/shopping/services/shoppingSearchConnectorClient.js +41 -0
  381. package/lib/features/shopping/services/shoppingSearchConnectorClient.js.map +1 -0
  382. package/lib/features/shopping/shopAgentSwipe.js +7 -0
  383. package/lib/features/shopping/shopAgentSwipe.js.map +1 -0
  384. package/lib/features/shopping/shoppingCart.js +116 -0
  385. package/lib/features/shopping/shoppingCart.js.map +1 -0
  386. package/lib/features/shopping/shoppingExec.js +14 -0
  387. package/lib/features/shopping/shoppingExec.js.map +1 -0
  388. package/lib/features/shopping/shoppingHistoryStore.js +176 -0
  389. package/lib/features/shopping/shoppingHistoryStore.js.map +1 -0
  390. package/lib/features/shopping/shoppingRuntime.js +63 -0
  391. package/lib/features/shopping/shoppingRuntime.js.map +1 -0
  392. package/lib/features/shopping/timeAgo.js +14 -0
  393. package/lib/features/shopping/timeAgo.js.map +1 -0
  394. package/lib/features/shopping/useShoppingSearch.js +262 -0
  395. package/lib/features/shopping/useShoppingSearch.js.map +1 -0
  396. package/lib/features/travel/BookHeaderGlow.js +48 -0
  397. package/lib/features/travel/BookHeaderGlow.js.map +1 -0
  398. package/lib/features/travel/BookingsPanel.js +29 -0
  399. package/lib/features/travel/BookingsPanel.js.map +1 -0
  400. package/lib/features/travel/DiscoverPanel.js +155 -0
  401. package/lib/features/travel/DiscoverPanel.js.map +1 -0
  402. package/lib/features/travel/FlightCompareBar.js +86 -0
  403. package/lib/features/travel/FlightCompareBar.js.map +1 -0
  404. package/lib/features/travel/FlightDealsBoard.js +100 -0
  405. package/lib/features/travel/FlightDealsBoard.js.map +1 -0
  406. package/lib/features/travel/HistoryPanel.js +82 -0
  407. package/lib/features/travel/HistoryPanel.js.map +1 -0
  408. package/lib/features/travel/PopularDestinations.js +144 -0
  409. package/lib/features/travel/PopularDestinations.js.map +1 -0
  410. package/lib/features/travel/SavedPanel.js +27 -0
  411. package/lib/features/travel/SavedPanel.js.map +1 -0
  412. package/lib/features/travel/TravelAgentChatPane.js +303 -0
  413. package/lib/features/travel/TravelAgentChatPane.js.map +1 -0
  414. package/lib/features/travel/TravelBookHero.js +425 -0
  415. package/lib/features/travel/TravelBookHero.js.map +1 -0
  416. package/lib/features/travel/TravelDatesField.js +234 -0
  417. package/lib/features/travel/TravelDatesField.js.map +1 -0
  418. package/lib/features/travel/TravelDetailSheet.js +106 -0
  419. package/lib/features/travel/TravelDetailSheet.js.map +1 -0
  420. package/lib/features/travel/TravelExperience.js +624 -0
  421. package/lib/features/travel/TravelExperience.js.map +1 -0
  422. package/lib/features/travel/TravelGuestsField.js +85 -0
  423. package/lib/features/travel/TravelGuestsField.js.map +1 -0
  424. package/lib/features/travel/TravelLanding.js +318 -0
  425. package/lib/features/travel/TravelLanding.js.map +1 -0
  426. package/lib/features/travel/TravelLocationField.js +179 -0
  427. package/lib/features/travel/TravelLocationField.js.map +1 -0
  428. package/lib/features/travel/TravelPropertyCard.js +266 -0
  429. package/lib/features/travel/TravelPropertyCard.js.map +1 -0
  430. package/lib/features/travel/TravelPropertyPhoto.js +22 -0
  431. package/lib/features/travel/TravelPropertyPhoto.js.map +1 -0
  432. package/lib/features/travel/TravelRailFlyout.js +79 -0
  433. package/lib/features/travel/TravelRailFlyout.js.map +1 -0
  434. package/lib/features/travel/TravelResultsMap.js +126 -0
  435. package/lib/features/travel/TravelResultsMap.js.map +1 -0
  436. package/lib/features/travel/WorkspacePanel.js +148 -0
  437. package/lib/features/travel/WorkspacePanel.js.map +1 -0
  438. package/lib/features/travel/appNav.js +244 -0
  439. package/lib/features/travel/appNav.js.map +1 -0
  440. package/lib/features/travel/calendarDays.js +50 -0
  441. package/lib/features/travel/calendarDays.js.map +1 -0
  442. package/lib/features/travel/catalog.js +72 -0
  443. package/lib/features/travel/catalog.js.map +1 -0
  444. package/lib/features/travel/chat/TravelChatResultCard.js +107 -0
  445. package/lib/features/travel/chat/TravelChatResultCard.js.map +1 -0
  446. package/lib/features/travel/chat/widgetContent.js +107 -0
  447. package/lib/features/travel/chat/widgetContent.js.map +1 -0
  448. package/lib/features/travel/flightDeals.js +65 -0
  449. package/lib/features/travel/flightDeals.js.map +1 -0
  450. package/lib/features/travel/mapCoordinates.js +36 -0
  451. package/lib/features/travel/mapCoordinates.js.map +1 -0
  452. package/lib/features/travel/parseTravelIntent.js +303 -0
  453. package/lib/features/travel/parseTravelIntent.js.map +1 -0
  454. package/lib/features/travel/savedStays.js +66 -0
  455. package/lib/features/travel/savedStays.js.map +1 -0
  456. package/lib/features/travel/services/flightDealsBoard.js +111 -0
  457. package/lib/features/travel/services/flightDealsBoard.js.map +1 -0
  458. package/lib/features/travel/services/flightSearchConnectorClient.js +42 -0
  459. package/lib/features/travel/services/flightSearchConnectorClient.js.map +1 -0
  460. package/lib/features/travel/services/geocodeLocation.js +79 -0
  461. package/lib/features/travel/services/geocodeLocation.js.map +1 -0
  462. package/lib/features/travel/services/placePredictions.js +113 -0
  463. package/lib/features/travel/services/placePredictions.js.map +1 -0
  464. package/lib/features/travel/services/resolveOriginCity.js +27 -0
  465. package/lib/features/travel/services/resolveOriginCity.js.map +1 -0
  466. package/lib/features/travel/services/resortifiConnectorClient.js +76 -0
  467. package/lib/features/travel/services/resortifiConnectorClient.js.map +1 -0
  468. package/lib/features/travel/services/travelFlightSearch.js +289 -0
  469. package/lib/features/travel/services/travelFlightSearch.js.map +1 -0
  470. package/lib/features/travel/services/travelPropertySearch.js +377 -0
  471. package/lib/features/travel/services/travelPropertySearch.js.map +1 -0
  472. package/lib/features/travel/travelAgentSwipe.js +7 -0
  473. package/lib/features/travel/travelAgentSwipe.js.map +1 -0
  474. package/lib/features/travel/travelExec.js +14 -0
  475. package/lib/features/travel/travelExec.js.map +1 -0
  476. package/lib/features/travel/travelHistoryStore.js +108 -0
  477. package/lib/features/travel/travelHistoryStore.js.map +1 -0
  478. package/lib/features/travel/travelRuntime.js +62 -0
  479. package/lib/features/travel/travelRuntime.js.map +1 -0
  480. package/lib/features/travel/types.js +9 -0
  481. package/lib/features/travel/types.js.map +1 -0
  482. package/lib/features/travel/useTravelSearch.js +330 -0
  483. package/lib/features/travel/useTravelSearch.js.map +1 -0
  484. package/lib/features/travel/workspaceContent.js +548 -0
  485. package/lib/features/travel/workspaceContent.js.map +1 -0
  486. package/lib/hooks/useCdecliChannel.js +128 -6
  487. package/lib/hooks/useCdecliChannel.js.map +1 -1
  488. package/lib/hooks/useChatApi.js +4 -2
  489. package/lib/hooks/useChatApi.js.map +1 -1
  490. package/lib/hooks/useChatStream.js +77 -63
  491. package/lib/hooks/useChatStream.js.map +1 -1
  492. package/lib/hooks/useHostConnectorCard.js +24 -0
  493. package/lib/hooks/useHostConnectorCard.js.map +1 -0
  494. package/lib/hooks/useObtainSystemToken.js +23 -5
  495. package/lib/hooks/useObtainSystemToken.js.map +1 -1
  496. package/lib/hooks/webViewRetentionPolicy.js +1 -0
  497. package/lib/hooks/webViewRetentionPolicy.js.map +1 -1
  498. package/lib/index.js +1 -1
  499. package/lib/index.js.map +1 -1
  500. package/lib/screens/Chat/index.js +51 -22
  501. package/lib/screens/Chat/index.js.map +1 -1
  502. package/lib/screens/ChatNative/index.js +13 -2
  503. package/lib/screens/ChatNative/index.js.map +1 -1
  504. package/lib/screens/Home/HomeScreen.js +3 -3
  505. package/lib/screens/Home/HomeScreen.js.map +1 -1
  506. package/lib/screens/Home/components/ChatHistoryLanding.js +32 -32
  507. package/lib/screens/Home/components/ChatHistoryLanding.js.map +1 -1
  508. package/lib/screens/JobSearchNative/useJobSearchHostChat.js +12 -6
  509. package/lib/screens/JobSearchNative/useJobSearchHostChat.js.map +1 -1
  510. package/lib/screens/ResumeNative/useResumeHostChat.js +12 -6
  511. package/lib/screens/ResumeNative/useResumeHostChat.js.map +1 -1
  512. package/lib/screens/ShoppingNative/useShoppingHostChat.js +12 -6
  513. package/lib/screens/ShoppingNative/useShoppingHostChat.js.map +1 -1
  514. package/lib/screens/TravelNative/useTravelHostChat.js +12 -6
  515. package/lib/screens/TravelNative/useTravelHostChat.js.map +1 -1
  516. package/lib/screens/WebBuilder/WebViewWithNavigation.js +2 -2
  517. package/lib/screens/WebBuilder/WebViewWithNavigation.js.map +1 -1
  518. package/lib/services/brainQuickReply.js +38 -1
  519. package/lib/services/brainQuickReply.js.map +1 -1
  520. package/lib/state/chatThreadMerge.js +6 -1
  521. package/lib/state/chatThreadMerge.js.map +1 -1
  522. package/package.json +6 -4
@@ -0,0 +1,54 @@
1
+ const EDIT_TOOLS = ["reframe", "remove-background", "upscale", "edit-video", "match-look", "lip-sync", "extend-video"];
2
+ const EDIT_TOOL_META = {
3
+ reframe: {
4
+ label: "Reframe",
5
+ blurb: "Crop or fit to a new aspect, centred",
6
+ icon: "crop",
7
+ targets: ["image", "video"]
8
+ },
9
+ "remove-background": {
10
+ label: "Remove background",
11
+ blurb: "Key out a flat background",
12
+ icon: "eraser",
13
+ targets: ["image", "video"]
14
+ },
15
+ upscale: {
16
+ label: "Upscale",
17
+ blurb: "Scale up to 1080p, 2K or 4K",
18
+ icon: "arrow-expand-all",
19
+ targets: ["image", "video"]
20
+ },
21
+ "edit-video": {
22
+ label: "Edit video",
23
+ blurb: "Describe a change \u2014 opens video edit",
24
+ icon: "wand",
25
+ targets: ["video"]
26
+ },
27
+ "match-look": {
28
+ label: "Match look",
29
+ blurb: "Grade exposure, contrast and saturation",
30
+ icon: "palette-outline",
31
+ targets: ["image", "video"]
32
+ },
33
+ "extend-video": {
34
+ label: "Extend",
35
+ blurb: "Continue past the end from the last frame",
36
+ icon: "fast-forward",
37
+ targets: ["video"]
38
+ },
39
+ "lip-sync": {
40
+ label: "Lip sync",
41
+ blurb: "Re-time the mouth to speech",
42
+ icon: "microphone-outline",
43
+ targets: ["video"]
44
+ }
45
+ };
46
+ function toolAcceptsItem(tool, type) {
47
+ return type !== void 0 && EDIT_TOOL_META[tool].targets.includes(type);
48
+ }
49
+ function visibleEditTools(opts) {
50
+ return EDIT_TOOLS.filter((t) => t !== "edit-video" || opts.videoToVideo);
51
+ }
52
+ function editToolsForItem(type, opts) {
53
+ return visibleEditTools(opts).filter((t) => toolAcceptsItem(t, type));
54
+ }export{EDIT_TOOLS,EDIT_TOOL_META,editToolsForItem,toolAcceptsItem,visibleEditTools};//# sourceMappingURL=editTools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editTools.js","sources":["../../../src/features/canvas/editTools.ts"],"sourcesContent":["/**\n * Native twin of canvas-surface `components/generator/tools.ts`.\n * Create tools stay in CanvasGeneratePanel; these run on a selected board item.\n */\n\nexport type EditTool =\n | 'reframe'\n | 'remove-background'\n | 'upscale'\n | 'edit-video'\n | 'match-look'\n | 'lip-sync'\n | 'extend-video';\n\nexport const EDIT_TOOLS: readonly EditTool[] = [\n 'reframe',\n 'remove-background',\n 'upscale',\n 'edit-video',\n 'match-look',\n 'lip-sync',\n 'extend-video',\n];\n\nexport type MediaTarget = 'image' | 'video';\n\nexport interface EditToolMeta {\n label: string;\n blurb: string;\n icon: string;\n targets: readonly MediaTarget[];\n}\n\nexport const EDIT_TOOL_META: Record<EditTool, EditToolMeta> = {\n reframe: {\n label: 'Reframe',\n blurb: 'Crop or fit to a new aspect, centred',\n icon: 'crop',\n targets: ['image', 'video'],\n },\n 'remove-background': {\n label: 'Remove background',\n blurb: 'Key out a flat background',\n icon: 'eraser',\n targets: ['image', 'video'],\n },\n upscale: {\n label: 'Upscale',\n blurb: 'Scale up to 1080p, 2K or 4K',\n icon: 'arrow-expand-all',\n targets: ['image', 'video'],\n },\n 'edit-video': {\n label: 'Edit video',\n blurb: 'Describe a change — opens video edit',\n icon: 'wand',\n targets: ['video'],\n },\n 'match-look': {\n label: 'Match look',\n blurb: 'Grade exposure, contrast and saturation',\n icon: 'palette-outline',\n targets: ['image', 'video'],\n },\n 'extend-video': {\n label: 'Extend',\n blurb: 'Continue past the end from the last frame',\n icon: 'fast-forward',\n targets: ['video'],\n },\n 'lip-sync': {\n label: 'Lip sync',\n blurb: 'Re-time the mouth to speech',\n icon: 'microphone-outline',\n targets: ['video'],\n },\n};\n\nexport function toolAcceptsItem(tool: EditTool, type: string | undefined): type is MediaTarget {\n return type !== undefined && (EDIT_TOOL_META[tool].targets as readonly string[]).includes(type);\n}\n\nexport function visibleEditTools(opts: { videoToVideo: boolean }): EditTool[] {\n return EDIT_TOOLS.filter((t) => t !== 'edit-video' || opts.videoToVideo);\n}\n\nexport function editToolsForItem(type: string | undefined, opts: { videoToVideo: boolean }): EditTool[] {\n return visibleEditTools(opts).filter((t) => toolAcceptsItem(t, type));\n}\n"],"names":[],"mappings":"AAMa,MAAA,UAAA,GAAkC,CAAC,SAAW,EAAA,mBAAA,EAAqB,WAAW,YAAc,EAAA,YAAA,EAAc,YAAY,cAAc;AAQ1I,MAAM,cAAiD,GAAA;AAAA,EAC5D,OAAS,EAAA;AAAA,IACP,KAAO,EAAA,SAAA;AAAA,IACP,KAAO,EAAA,sCAAA;AAAA,IACP,IAAM,EAAA,MAAA;AAAA,IACN,OAAA,EAAS,CAAC,OAAA,EAAS,OAAO;AAAA,GAC5B;AAAA,EACA,mBAAqB,EAAA;AAAA,IACnB,KAAO,EAAA,mBAAA;AAAA,IACP,KAAO,EAAA,2BAAA;AAAA,IACP,IAAM,EAAA,QAAA;AAAA,IACN,OAAA,EAAS,CAAC,OAAA,EAAS,OAAO;AAAA,GAC5B;AAAA,EACA,OAAS,EAAA;AAAA,IACP,KAAO,EAAA,SAAA;AAAA,IACP,KAAO,EAAA,6BAAA;AAAA,IACP,IAAM,EAAA,kBAAA;AAAA,IACN,OAAA,EAAS,CAAC,OAAA,EAAS,OAAO;AAAA,GAC5B;AAAA,EACA,YAAc,EAAA;AAAA,IACZ,KAAO,EAAA,YAAA;AAAA,IACP,KAAO,EAAA,2CAAA;AAAA,IACP,IAAM,EAAA,MAAA;AAAA,IACN,OAAA,EAAS,CAAC,OAAO;AAAA,GACnB;AAAA,EACA,YAAc,EAAA;AAAA,IACZ,KAAO,EAAA,YAAA;AAAA,IACP,KAAO,EAAA,yCAAA;AAAA,IACP,IAAM,EAAA,iBAAA;AAAA,IACN,OAAA,EAAS,CAAC,OAAA,EAAS,OAAO;AAAA,GAC5B;AAAA,EACA,cAAgB,EAAA;AAAA,IACd,KAAO,EAAA,QAAA;AAAA,IACP,KAAO,EAAA,2CAAA;AAAA,IACP,IAAM,EAAA,cAAA;AAAA,IACN,OAAA,EAAS,CAAC,OAAO;AAAA,GACnB;AAAA,EACA,UAAY,EAAA;AAAA,IACV,KAAO,EAAA,UAAA;AAAA,IACP,KAAO,EAAA,6BAAA;AAAA,IACP,IAAM,EAAA,oBAAA;AAAA,IACN,OAAA,EAAS,CAAC,OAAO;AAAA;AAErB;AACgB,SAAA,eAAA,CAAgB,MAAgB,IAA+C,EAAA;AAC7F,EAAA,OAAO,SAAS,MAAc,IAAA,cAAA,CAAe,IAAI,CAAE,CAAA,OAAA,CAA8B,SAAS,IAAI,CAAA;AAChG;AACO,SAAS,iBAAiB,IAElB,EAAA;AACb,EAAA,OAAO,WAAW,MAAO,CAAA,CAAA,CAAA,KAAK,CAAM,KAAA,YAAA,IAAgB,KAAK,YAAY,CAAA;AACvE;AACgB,SAAA,gBAAA,CAAiB,MAA0B,IAE5C,EAAA;AACb,EAAO,OAAA,gBAAA,CAAiB,IAAI,CAAE,CAAA,MAAA,CAAO,OAAK,eAAgB,CAAA,CAAA,EAAG,IAAI,CAAC,CAAA;AACpE"}
@@ -0,0 +1,5 @@
1
+ function continuationPrompt(userPrompt) {
2
+ const base = userPrompt.trim();
3
+ const carry = "continue this exact shot from where it left off, same subject, same setting, same lighting and lens, seamless continuation";
4
+ return base ? `${base}. ${carry}` : carry;
5
+ }export{continuationPrompt};//# sourceMappingURL=extendVideo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extendVideo.js","sources":["../../../src/features/canvas/extendVideo.ts"],"sourcesContent":["/**\n * Extend-video prompt helpers — twin of web `generator/extendVideo.ts` (pure bits).\n */\n\nconst TAIL_BACKOFF_SECS = 0.08;\n\nexport function lastFrameTime(durationSecs: number): number {\n return Math.max(0, durationSecs - TAIL_BACKOFF_SECS);\n}\n\nexport function continuationPrompt(userPrompt: string): string {\n const base = userPrompt.trim();\n const carry =\n 'continue this exact shot from where it left off, same subject, same setting, same lighting and lens, seamless continuation';\n return base ? `${base}. ${carry}` : carry;\n}\n\nexport function joinedDuration(originalSecs: number, addedSecs: number): number {\n return Math.round((Math.max(0, originalSecs) + Math.max(0, addedSecs)) * 10) / 10;\n}\n\nexport function describeExtend(originalSecs: number, addedSecs: number): string {\n const total = joinedDuration(originalSecs, addedSecs);\n return `Extended the clip by about ${Math.round(addedSecs)}s, to roughly ${total}s, joined on the closing frame.`;\n}\n"],"names":[],"mappings":"AAQO,SAAS,mBAAmB,UAA4B,EAAA;AAC7D,EAAM,MAAA,IAAA,GAAO,WAAW,IAAK,EAAA;AAC7B,EAAA,MAAM,KAAQ,GAAA,4HAAA;AACd,EAAA,OAAO,IAAO,GAAA,CAAA,EAAG,IAAI,CAAA,EAAA,EAAK,KAAK,CAAK,CAAA,GAAA,KAAA;AACtC"}
@@ -0,0 +1,33 @@
1
+ import {resultUrl}from'./videoEditor/mediaActions.js';var __defProp = Object.defineProperty;
2
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
3
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
4
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
5
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
6
+ var __spreadValues = (a, b) => {
7
+ for (var prop in b || (b = {}))
8
+ if (__hasOwnProp.call(b, prop))
9
+ __defNormalProp(a, prop, b[prop]);
10
+ if (__getOwnPropSymbols)
11
+ for (var prop of __getOwnPropSymbols(b)) {
12
+ if (__propIsEnum.call(b, prop))
13
+ __defNormalProp(a, prop, b[prop]);
14
+ }
15
+ return a;
16
+ };
17
+ const VIDEO = "yantra-video-editing";
18
+ const EXTRACT = "YANTRA_VIDEO_EDIT_EXTRACT_FRAMES";
19
+ async function extractFramesViaRpc(run, inputUrl, options = {}) {
20
+ const result = await run(VIDEO, EXTRACT, __spreadValues(__spreadValues({
21
+ input_url: inputUrl
22
+ }, options.fps !== void 0 ? {
23
+ fps: options.fps
24
+ } : {}), options.maxFrames !== void 0 ? {
25
+ max_frames: options.maxFrames
26
+ } : {}));
27
+ const data = result.data && typeof result.data === "object" ? result.data : result;
28
+ const frames = Array.isArray(data.frames) ? data.frames.filter((url) => typeof url === "string" && url.length > 0) : [];
29
+ if (frames.length > 0) return frames;
30
+ const single = resultUrl(result, EXTRACT);
31
+ if (single) return [single];
32
+ throw new Error("The extractor returned no frames");
33
+ }export{extractFramesViaRpc};//# sourceMappingURL=frameExtract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frameExtract.js","sources":["../../../src/features/canvas/frameExtract.ts"],"sourcesContent":["/**\n * Native twin of canvas-surface `extractFramesViaRpc` — server-side stills\n * from a clip (phone cannot taint-read video pixels like the web canvas).\n */\nimport { resultUrl, type RunMediaAction } from './videoEditor/mediaActions';\n\nconst VIDEO = 'yantra-video-editing';\nconst EXTRACT = 'YANTRA_VIDEO_EDIT_EXTRACT_FRAMES';\n\nexport async function extractFramesViaRpc(\n run: RunMediaAction,\n inputUrl: string,\n options: { fps?: number; maxFrames?: number } = {},\n): Promise<string[]> {\n const result = await run(VIDEO, EXTRACT, {\n input_url: inputUrl,\n ...(options.fps !== undefined ? { fps: options.fps } : {}),\n ...(options.maxFrames !== undefined ? { max_frames: options.maxFrames } : {}),\n });\n const data = (result.data && typeof result.data === 'object' ? result.data : result) as Record<string, unknown>;\n const frames = Array.isArray(data.frames)\n ? data.frames.filter((url): url is string => typeof url === 'string' && url.length > 0)\n : [];\n if (frames.length > 0) return frames;\n const single = resultUrl(result, EXTRACT);\n if (single) return [single];\n throw new Error('The extractor returned no frames');\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAKA,MAAM,KAAQ,GAAA,sBAAA;AACd,MAAM,OAAU,GAAA,kCAAA;AAChB,eAAsB,mBAAoB,CAAA,GAAA,EAAqB,QAAkB,EAAA,OAAA,GAG7E,EAAuB,EAAA;AACzB,EAAA,MAAM,MAAS,GAAA,MAAM,GAAI,CAAA,KAAA,EAAO,OAAS,EAAA,cAAA,CAAA,cAAA,CAAA;AAAA,IACvC,SAAW,EAAA;AAAA,GACP,EAAA,OAAA,CAAQ,QAAQ,MAAY,GAAA;AAAA,IAC9B,KAAK,OAAQ,CAAA;AAAA,GACX,GAAA,EACA,CAAA,EAAA,OAAA,CAAQ,cAAc,MAAY,GAAA;AAAA,IACpC,YAAY,OAAQ,CAAA;AAAA,GACtB,GAAI,EACL,CAAA,CAAA;AACD,EAAM,MAAA,IAAA,GAAQ,OAAO,IAAQ,IAAA,OAAO,OAAO,IAAS,KAAA,QAAA,GAAW,OAAO,IAAO,GAAA,MAAA;AAC7E,EAAA,MAAM,SAAS,KAAM,CAAA,OAAA,CAAQ,KAAK,MAAM,CAAA,GAAI,KAAK,MAAO,CAAA,MAAA,CAAO,CAAC,GAAA,KAAuB,OAAO,GAAQ,KAAA,QAAA,IAAY,IAAI,MAAS,GAAA,CAAC,IAAI,EAAC;AACrI,EAAI,IAAA,MAAA,CAAO,MAAS,GAAA,CAAA,EAAU,OAAA,MAAA;AAC9B,EAAM,MAAA,MAAA,GAAS,SAAU,CAAA,MAAA,EAAQ,OAAO,CAAA;AACxC,EAAI,IAAA,MAAA,EAAe,OAAA,CAAC,MAAM,CAAA;AAC1B,EAAM,MAAA,IAAI,MAAM,kCAAkC,CAAA;AACpD"}
@@ -0,0 +1,201 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defProps = Object.defineProperties;
3
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
7
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
8
+ var __spreadValues = (a, b) => {
9
+ for (var prop in b || (b = {}))
10
+ if (__hasOwnProp.call(b, prop))
11
+ __defNormalProp(a, prop, b[prop]);
12
+ if (__getOwnPropSymbols)
13
+ for (var prop of __getOwnPropSymbols(b)) {
14
+ if (__propIsEnum.call(b, prop))
15
+ __defNormalProp(a, prop, b[prop]);
16
+ }
17
+ return a;
18
+ };
19
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
20
+ const VEO_ASPECTS = ["16:9", "9:16"];
21
+ const VEO_RESOLUTIONS = ["720p", "1080p"];
22
+ const VEO_DURATIONS = [4, 6, 8];
23
+ const STATIC_IMAGE_MODELS = [{
24
+ id: "gemini-3.1-flash-image-preview",
25
+ label: "Gemini Efficient",
26
+ provider: "google",
27
+ description: ""
28
+ }];
29
+ const STATIC_VIDEO_MODELS = [{
30
+ id: "veo-3.1-generate-preview",
31
+ label: "Veo 3.1 Preview",
32
+ provider: "google",
33
+ description: "",
34
+ supportedDurationsSeconds: VEO_DURATIONS,
35
+ defaultDurationSeconds: 8,
36
+ maxDurationSeconds: 8,
37
+ supportsImageToVideo: true,
38
+ supportsEndFrame: true,
39
+ supportsAudio: true,
40
+ aspectRatios: VEO_ASPECTS,
41
+ resolutions: VEO_RESOLUTIONS
42
+ }, {
43
+ id: "veo-3.1-fast-generate-preview",
44
+ label: "Veo 3.1 Fast Preview",
45
+ provider: "google",
46
+ description: "",
47
+ supportedDurationsSeconds: VEO_DURATIONS,
48
+ defaultDurationSeconds: 8,
49
+ maxDurationSeconds: 8,
50
+ supportsImageToVideo: true,
51
+ supportsEndFrame: true,
52
+ isFast: true,
53
+ aspectRatios: VEO_ASPECTS,
54
+ resolutions: VEO_RESOLUTIONS
55
+ }, {
56
+ id: "veo-3-generate-preview",
57
+ label: "Veo 3 Preview",
58
+ provider: "google",
59
+ description: "",
60
+ supportedDurationsSeconds: VEO_DURATIONS,
61
+ defaultDurationSeconds: 8,
62
+ maxDurationSeconds: 8,
63
+ supportsImageToVideo: true,
64
+ aspectRatios: VEO_ASPECTS,
65
+ resolutions: VEO_RESOLUTIONS
66
+ }, {
67
+ id: "veo-3-fast-generate-preview",
68
+ label: "Veo 3 Fast Preview",
69
+ provider: "google",
70
+ description: "",
71
+ supportedDurationsSeconds: VEO_DURATIONS,
72
+ defaultDurationSeconds: 8,
73
+ maxDurationSeconds: 8,
74
+ supportsImageToVideo: true,
75
+ isFast: true,
76
+ aspectRatios: VEO_ASPECTS,
77
+ resolutions: VEO_RESOLUTIONS
78
+ }, {
79
+ id: "veo-2.0-generate-001",
80
+ label: "Veo 2.0",
81
+ provider: "google",
82
+ description: "",
83
+ supportedDurationsSeconds: [5, 6, 7, 8],
84
+ defaultDurationSeconds: 8,
85
+ maxDurationSeconds: 8,
86
+ supportsImageToVideo: true,
87
+ aspectRatios: VEO_ASPECTS,
88
+ resolutions: VEO_RESOLUTIONS
89
+ }, {
90
+ id: "bytedance/seedance-2.0",
91
+ label: "Seedance 2.0",
92
+ provider: "openrouter",
93
+ description: "",
94
+ supportedDurationsSeconds: [4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],
95
+ defaultDurationSeconds: 5,
96
+ maxDurationSeconds: 15,
97
+ supportsImageToVideo: true
98
+ }, {
99
+ id: "bytedance/seedance-2.0-fast",
100
+ label: "Seedance 2.0 Fast",
101
+ provider: "openrouter",
102
+ description: "",
103
+ supportedDurationsSeconds: [4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],
104
+ defaultDurationSeconds: 5,
105
+ maxDurationSeconds: 15,
106
+ supportsImageToVideo: true,
107
+ isFast: true
108
+ }];
109
+ const AUDIO_PROMPT_TYPES = /* @__PURE__ */ new Set(["tts", "sfx", "music"]);
110
+ function durationList(raw) {
111
+ if (!Array.isArray(raw)) return [];
112
+ return raw.filter((s) => typeof s === "number" && Number.isFinite(s) && s > 0);
113
+ }
114
+ function duration(raw) {
115
+ return typeof raw === "number" && Number.isFinite(raw) && raw > 0 ? raw : void 0;
116
+ }
117
+ function videoDurationOptions(model) {
118
+ var _a;
119
+ return (_a = model == null ? void 0 : model.supportedDurationsSeconds) != null ? _a : [];
120
+ }
121
+ function promptAudioModels(models) {
122
+ return models.filter((m) => !m.type || AUDIO_PROMPT_TYPES.has(m.type));
123
+ }
124
+ function normalizeModels(raw) {
125
+ let payload = raw;
126
+ if (typeof payload === "string") {
127
+ try {
128
+ payload = JSON.parse(payload);
129
+ } catch (e) {
130
+ return [];
131
+ }
132
+ }
133
+ const record = payload && typeof payload === "object" ? payload : {};
134
+ const nested = record.data && typeof record.data === "object" ? record.data : record;
135
+ const list = Array.isArray(payload) ? payload : Array.isArray(nested.models) ? nested.models : Array.isArray(nested.data) ? nested.data : Array.isArray(record.models) ? record.models : [];
136
+ return list.map((m) => {
137
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k;
138
+ return __spreadValues(__spreadValues(__spreadProps(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues({
139
+ id: String((_c = (_b = (_a = m.id) != null ? _a : m.modelId) != null ? _b : m.name) != null ? _c : ""),
140
+ label: String((_h = (_g = (_f = (_e = (_d = m.displayName) != null ? _d : m.label) != null ? _e : m.title) != null ? _f : m.name) != null ? _g : m.id) != null ? _h : ""),
141
+ provider: String((_j = (_i = m.provider) != null ? _i : m.source) != null ? _j : ""),
142
+ description: String((_k = m.description) != null ? _k : "")
143
+ }, typeof m.supportsImageInput === "boolean" ? {
144
+ supportsImageInput: m.supportsImageInput
145
+ } : {}), typeof m.supportsVideoInput === "boolean" ? {
146
+ supportsVideoInput: m.supportsVideoInput
147
+ } : {}), typeof m.supportsImageToVideo === "boolean" ? {
148
+ supportsImageToVideo: m.supportsImageToVideo
149
+ } : {}), typeof m.supportsEndFrame === "boolean" ? {
150
+ supportsEndFrame: m.supportsEndFrame
151
+ } : {}), typeof m.supportsAudio === "boolean" ? {
152
+ supportsAudio: m.supportsAudio
153
+ } : {}), Array.isArray(m.aspectRatios) ? {
154
+ aspectRatios: m.aspectRatios.filter((s) => typeof s === "string")
155
+ } : {}), Array.isArray(m.resolutions) ? {
156
+ resolutions: m.resolutions.filter((s) => typeof s === "string")
157
+ } : {}), typeof m.type === "string" ? {
158
+ type: m.type
159
+ } : {}), {
160
+ supportedDurationsSeconds: durationList(m.supportedDurationsSeconds)
161
+ }), duration(m.defaultDurationSeconds) ? {
162
+ defaultDurationSeconds: Number(m.defaultDurationSeconds)
163
+ } : {}), duration(m.maxDurationSeconds) ? {
164
+ maxDurationSeconds: Number(m.maxDurationSeconds)
165
+ } : {});
166
+ }).filter((m) => Boolean(m.id));
167
+ }
168
+ function buildVideoGenerateParams(opts) {
169
+ return __spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues({
170
+ prompt: opts.prompt,
171
+ aspectRatio: opts.aspectRatio
172
+ }, opts.model ? {
173
+ model: opts.model
174
+ } : {}), opts.durationSeconds ? {
175
+ durationSeconds: opts.durationSeconds
176
+ } : {}), opts.referenceImageUrl ? {
177
+ referenceImageUrl: opts.referenceImageUrl
178
+ } : {}), opts.referenceVideoUrl ? {
179
+ referenceVideoUrl: opts.referenceVideoUrl
180
+ } : {}), opts.lastFrameUrl ? {
181
+ lastFrameUrl: opts.lastFrameUrl
182
+ } : {}), opts.resolution ? {
183
+ resolution: opts.resolution
184
+ } : {}), opts.generateAudio ? {
185
+ generateAudio: true
186
+ } : {}), opts.negativePrompt ? {
187
+ negativePrompt: opts.negativePrompt
188
+ } : {});
189
+ }
190
+ function generationCapabilities(model) {
191
+ var _a, _b, _c;
192
+ (model == null ? void 0 : model.provider) === "google";
193
+ return {
194
+ aspects: ((_a = model == null ? void 0 : model.aspectRatios) == null ? void 0 : _a.length) ? model.aspectRatios : ["16:9", "9:16"],
195
+ resolutions: (_b = model == null ? void 0 : model.resolutions) != null ? _b : [],
196
+ canAudio: Boolean(model == null ? void 0 : model.supportsAudio),
197
+ canStartFrame: (_c = model == null ? void 0 : model.supportsImageToVideo) != null ? _c : true,
198
+ canEndFrame: Boolean(model == null ? void 0 : model.supportsEndFrame),
199
+ canVideoInput: Boolean(model == null ? void 0 : model.supportsVideoInput)
200
+ };
201
+ }export{AUDIO_PROMPT_TYPES,STATIC_IMAGE_MODELS,STATIC_VIDEO_MODELS,buildVideoGenerateParams,generationCapabilities,normalizeModels,promptAudioModels,videoDurationOptions};//# sourceMappingURL=generationModels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generationModels.js","sources":["../../../src/features/canvas/generationModels.ts"],"sourcesContent":["/**\n * Native twin of canvas-surface `hooks/useModelList` — LIST_MODELS shapes\n * and duration gating. An out-of-range `durationSeconds` comes back as a\n * blank video, not an error (web issue #305).\n */\n\nexport interface ModelInfo {\n id: string;\n label: string;\n provider: string;\n description: string;\n supportsImageInput?: boolean;\n supportsVideoInput?: boolean;\n supportsImageToVideo?: boolean;\n supportsEndFrame?: boolean;\n supportsAudio?: boolean;\n isFast?: boolean;\n type?: string;\n supportedDurationsSeconds?: number[];\n defaultDurationSeconds?: number;\n maxDurationSeconds?: number;\n aspectRatios?: string[];\n resolutions?: string[];\n}\n\nconst VEO_ASPECTS = ['16:9', '9:16'];\nconst VEO_RESOLUTIONS = ['720p', '1080p'];\nconst VEO_DURATIONS = [4, 6, 8];\n\nexport const STATIC_IMAGE_MODELS: ModelInfo[] = [\n { id: 'gemini-3.1-flash-image-preview', label: 'Gemini Efficient', provider: 'google', description: '' },\n];\n\n/** Offline fallback — mirrors canvas-surface `hooks/useModelList` STATIC_VIDEO_MODELS. */\nexport const STATIC_VIDEO_MODELS: ModelInfo[] = [\n {\n id: 'veo-3.1-generate-preview',\n label: 'Veo 3.1 Preview',\n provider: 'google',\n description: '',\n supportedDurationsSeconds: VEO_DURATIONS,\n defaultDurationSeconds: 8,\n maxDurationSeconds: 8,\n supportsImageToVideo: true,\n supportsEndFrame: true,\n supportsAudio: true,\n aspectRatios: VEO_ASPECTS,\n resolutions: VEO_RESOLUTIONS,\n },\n {\n id: 'veo-3.1-fast-generate-preview',\n label: 'Veo 3.1 Fast Preview',\n provider: 'google',\n description: '',\n supportedDurationsSeconds: VEO_DURATIONS,\n defaultDurationSeconds: 8,\n maxDurationSeconds: 8,\n supportsImageToVideo: true,\n supportsEndFrame: true,\n isFast: true,\n aspectRatios: VEO_ASPECTS,\n resolutions: VEO_RESOLUTIONS,\n },\n {\n id: 'veo-3-generate-preview',\n label: 'Veo 3 Preview',\n provider: 'google',\n description: '',\n supportedDurationsSeconds: VEO_DURATIONS,\n defaultDurationSeconds: 8,\n maxDurationSeconds: 8,\n supportsImageToVideo: true,\n aspectRatios: VEO_ASPECTS,\n resolutions: VEO_RESOLUTIONS,\n },\n {\n id: 'veo-3-fast-generate-preview',\n label: 'Veo 3 Fast Preview',\n provider: 'google',\n description: '',\n supportedDurationsSeconds: VEO_DURATIONS,\n defaultDurationSeconds: 8,\n maxDurationSeconds: 8,\n supportsImageToVideo: true,\n isFast: true,\n aspectRatios: VEO_ASPECTS,\n resolutions: VEO_RESOLUTIONS,\n },\n {\n id: 'veo-2.0-generate-001',\n label: 'Veo 2.0',\n provider: 'google',\n description: '',\n supportedDurationsSeconds: [5, 6, 7, 8],\n defaultDurationSeconds: 8,\n maxDurationSeconds: 8,\n supportsImageToVideo: true,\n aspectRatios: VEO_ASPECTS,\n resolutions: VEO_RESOLUTIONS,\n },\n {\n id: 'bytedance/seedance-2.0',\n label: 'Seedance 2.0',\n provider: 'openrouter',\n description: '',\n supportedDurationsSeconds: [4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],\n defaultDurationSeconds: 5,\n maxDurationSeconds: 15,\n supportsImageToVideo: true,\n },\n {\n id: 'bytedance/seedance-2.0-fast',\n label: 'Seedance 2.0 Fast',\n provider: 'openrouter',\n description: '',\n supportedDurationsSeconds: [4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],\n defaultDurationSeconds: 5,\n maxDurationSeconds: 15,\n supportsImageToVideo: true,\n isFast: true,\n },\n];\n\nexport const AUDIO_PROMPT_TYPES = new Set(['tts', 'sfx', 'music']);\n\nfunction durationList(raw: unknown): number[] {\n if (!Array.isArray(raw)) return [];\n return raw.filter((s): s is number => typeof s === 'number' && Number.isFinite(s) && s > 0);\n}\n\nfunction duration(raw: unknown): number | undefined {\n return typeof raw === 'number' && Number.isFinite(raw) && raw > 0 ? raw : undefined;\n}\n\nexport function videoDurationOptions(model: ModelInfo | undefined): number[] {\n return model?.supportedDurationsSeconds ?? [];\n}\n\nexport function promptAudioModels(models: ModelInfo[]): ModelInfo[] {\n return models.filter((m) => !m.type || AUDIO_PROMPT_TYPES.has(m.type));\n}\n\nexport function normalizeModels(raw: unknown): ModelInfo[] {\n let payload: unknown = raw;\n if (typeof payload === 'string') {\n try {\n payload = JSON.parse(payload);\n } catch {\n return [];\n }\n }\n const record = payload && typeof payload === 'object' ? (payload as Record<string, unknown>) : {};\n const nested = record.data && typeof record.data === 'object' ? (record.data as Record<string, unknown>) : record;\n const list = Array.isArray(payload)\n ? payload\n : Array.isArray(nested.models)\n ? nested.models\n : Array.isArray(nested.data)\n ? nested.data\n : Array.isArray(record.models)\n ? record.models\n : [];\n return (list as Array<Record<string, unknown>>)\n .map((m) => ({\n id: String(m.id ?? m.modelId ?? m.name ?? ''),\n label: String(m.displayName ?? m.label ?? m.title ?? m.name ?? m.id ?? ''),\n provider: String(m.provider ?? m.source ?? ''),\n description: String(m.description ?? ''),\n ...(typeof m.supportsImageInput === 'boolean' ? { supportsImageInput: m.supportsImageInput } : {}),\n ...(typeof m.supportsVideoInput === 'boolean' ? { supportsVideoInput: m.supportsVideoInput } : {}),\n ...(typeof m.supportsImageToVideo === 'boolean' ? { supportsImageToVideo: m.supportsImageToVideo } : {}),\n ...(typeof m.supportsEndFrame === 'boolean' ? { supportsEndFrame: m.supportsEndFrame } : {}),\n ...(typeof m.supportsAudio === 'boolean' ? { supportsAudio: m.supportsAudio } : {}),\n ...(Array.isArray(m.aspectRatios)\n ? { aspectRatios: m.aspectRatios.filter((s): s is string => typeof s === 'string') }\n : {}),\n ...(Array.isArray(m.resolutions)\n ? { resolutions: m.resolutions.filter((s): s is string => typeof s === 'string') }\n : {}),\n ...(typeof m.type === 'string' ? { type: m.type } : {}),\n supportedDurationsSeconds: durationList(m.supportedDurationsSeconds),\n ...(duration(m.defaultDurationSeconds) ? { defaultDurationSeconds: Number(m.defaultDurationSeconds) } : {}),\n ...(duration(m.maxDurationSeconds) ? { maxDurationSeconds: Number(m.maxDurationSeconds) } : {}),\n }))\n .filter((m) => Boolean(m.id));\n}\n\nexport function buildVideoGenerateParams(opts: {\n prompt: string;\n aspectRatio: string;\n model?: string;\n durationSeconds?: number;\n referenceImageUrl?: string;\n referenceVideoUrl?: string;\n lastFrameUrl?: string;\n resolution?: string;\n generateAudio?: boolean;\n negativePrompt?: string;\n}): Record<string, unknown> {\n return {\n prompt: opts.prompt,\n aspectRatio: opts.aspectRatio,\n ...(opts.model ? { model: opts.model } : {}),\n ...(opts.durationSeconds ? { durationSeconds: opts.durationSeconds } : {}),\n ...(opts.referenceImageUrl ? { referenceImageUrl: opts.referenceImageUrl } : {}),\n ...(opts.referenceVideoUrl ? { referenceVideoUrl: opts.referenceVideoUrl } : {}),\n ...(opts.lastFrameUrl ? { lastFrameUrl: opts.lastFrameUrl } : {}),\n ...(opts.resolution ? { resolution: opts.resolution } : {}),\n ...(opts.generateAudio ? { generateAudio: true } : {}),\n ...(opts.negativePrompt ? { negativePrompt: opts.negativePrompt } : {}),\n };\n}\n\n/** Twin of canvas-surface `videoGenOptions.generationCapabilities`. */\nexport function generationCapabilities(model: ModelInfo | undefined): {\n aspects: string[];\n resolutions: string[];\n canAudio: boolean;\n canStartFrame: boolean;\n canEndFrame: boolean;\n canVideoInput: boolean;\n} {\n const google = model?.provider === 'google';\n return {\n aspects: model?.aspectRatios?.length ? model.aspectRatios : ['16:9', '9:16'],\n resolutions: model?.resolutions ?? [],\n canAudio: Boolean(model?.supportsAudio),\n canStartFrame: model?.supportsImageToVideo ?? true,\n canEndFrame: Boolean(model?.supportsEndFrame),\n canVideoInput: Boolean(model?.supportsVideoInput),\n };\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,170 @@
1
+ import {runLipSync}from'../canvasEditOps.js';import {buildVideoGenerateParams}from'../generationModels.js';import {generationMediaUrl,resultUrl}from'../videoEditor/mediaActions.js';import {progressLabel,scheduleProductShots,episodePlanFor,lengthNote}from'./productReel.js';import {planRenderJobs,parseEpisodePlan,speakingSeconds,allotRunSeconds}from'./reelPlan.js';var __defProp = Object.defineProperty;
2
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
3
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
4
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
5
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
6
+ var __spreadValues = (a, b) => {
7
+ for (var prop in b || (b = {}))
8
+ if (__hasOwnProp.call(b, prop))
9
+ __defNormalProp(a, prop, b[prop]);
10
+ if (__getOwnPropSymbols)
11
+ for (var prop of __getOwnPropSymbols(b)) {
12
+ if (__propIsEnum.call(b, prop))
13
+ __defNormalProp(a, prop, b[prop]);
14
+ }
15
+ return a;
16
+ };
17
+ const RUN_SYNC = {
18
+ model: "fal-ai/sync-lipsync",
19
+ syncMode: "bounce"
20
+ };
21
+ async function planEpisode(run, opts) {
22
+ var _a, _b;
23
+ const {
24
+ episodeCount,
25
+ durationSeconds
26
+ } = episodePlanFor((_a = opts.seconds) != null ? _a : 30);
27
+ const format = opts.format === "product" ? "talking-head" : (_b = opts.format) != null ? _b : "talking-head";
28
+ const call = () => run("yantra-character", "YANTRA_CHARACTER_STREAM_PLAN", {
29
+ brief: `${opts.brief}
30
+ ${lengthNote(durationSeconds)}`,
31
+ card: __spreadValues({
32
+ name: opts.persona.name
33
+ }, opts.persona.tagline ? {
34
+ tagline: opts.persona.tagline
35
+ } : {}),
36
+ episodeCount,
37
+ format,
38
+ durationSeconds
39
+ });
40
+ const result = await call().catch(call);
41
+ const beats = parseEpisodePlan(result);
42
+ if (beats.length === 0) throw new Error("The planner returned no beats for this brief");
43
+ return beats;
44
+ }
45
+ function baseTakePrompt(persona, beats) {
46
+ var _a;
47
+ const who = `${persona.name} speaking to camera, natural expression, steady framing`;
48
+ const scene = (_a = beats.find((b) => b.kind === "talking" && b.visual)) == null ? void 0 : _a.visual;
49
+ if (scene) return `${who}. ${scene}`;
50
+ return persona.tagline ? `${who}. ${persona.tagline}` : who;
51
+ }
52
+ async function renderTalkingRun(run, beats, baseTake, persona, onProgress) {
53
+ const lines = beats.map((b) => b.line);
54
+ onProgress(`Lip-syncing ${lines.length} line(s)\u2026`);
55
+ const videoUrl = await runLipSync(run, baseTake, {
56
+ text: lines.join(" "),
57
+ model: RUN_SYNC.model,
58
+ syncMode: RUN_SYNC.syncMode,
59
+ voiceId: persona.voiceId
60
+ });
61
+ const fallback = lines.reduce((sum, line) => sum + speakingSeconds(line), 0);
62
+ const sourceSeconds = fallback;
63
+ let offset = 0;
64
+ return allotRunSeconds(beats, sourceSeconds).map((seconds) => {
65
+ const clip = {
66
+ src: videoUrl,
67
+ seconds,
68
+ offset,
69
+ sourceSeconds
70
+ };
71
+ offset += seconds;
72
+ return clip;
73
+ });
74
+ }
75
+ async function renderBroll(run, beat, onProgress) {
76
+ onProgress(`B-roll: ${(beat.visual || beat.line).slice(0, 40)}\u2026`);
77
+ const result = await run("yantra-video-generation", "YANTRA_VIDEO_GENERATION_GENERATE", buildVideoGenerateParams({
78
+ prompt: beat.visual || beat.line || "B-roll establishing shot",
79
+ aspectRatio: "9:16",
80
+ durationSeconds: Math.min(6, Math.max(2, Math.round(beat.seconds)))
81
+ }));
82
+ const src = generationMediaUrl(result);
83
+ return {
84
+ src,
85
+ seconds: beat.seconds
86
+ };
87
+ }
88
+ async function burnProductShots(run, reelUrl, photoSrcs, reelSeconds, onProgress) {
89
+ const placements = scheduleProductShots(reelSeconds, photoSrcs, {
90
+ vertical: true
91
+ });
92
+ if (!placements.length) return reelUrl;
93
+ let current = reelUrl;
94
+ for (let i = 0; i < placements.length; i += 1) {
95
+ const shot = placements[i];
96
+ onProgress(`Product shot ${i + 1}/${placements.length}\u2026`);
97
+ try {
98
+ const result = await run("yantra-video-editing", "YANTRA_VIDEO_EDIT_OVERLAY_IMAGE", {
99
+ input_url: current,
100
+ overlay_image: shot.src,
101
+ x: `${shot.box.x}%`,
102
+ y: `${shot.box.y}%`,
103
+ width: `${shot.box.width}%`,
104
+ height: `${shot.box.height}%`,
105
+ start_sec: shot.startSec,
106
+ end_sec: shot.endSec,
107
+ fit: "contain"
108
+ });
109
+ current = resultUrl(result, "YANTRA_VIDEO_EDIT_OVERLAY_IMAGE");
110
+ } catch (e) {
111
+ }
112
+ }
113
+ return current;
114
+ }
115
+ async function renderInfluencerReel(run, opts) {
116
+ var _a, _b, _c, _d;
117
+ const onProgressRaw = (_a = opts.onProgress) != null ? _a : (() => void 0);
118
+ const onProgress = (msg) => onProgressRaw(progressLabel(msg, msg));
119
+ const seconds = (_b = opts.seconds) != null ? _b : 30;
120
+ onProgress("Planning the episode\u2026");
121
+ const beats = await planEpisode(run, {
122
+ persona: opts.persona,
123
+ brief: opts.brief,
124
+ format: (_c = opts.format) != null ? _c : opts.product ? "product" : "talking-head",
125
+ seconds
126
+ });
127
+ const jobs = planRenderJobs(beats);
128
+ onProgress(`Filming ${opts.persona.name}\u2026`);
129
+ const baseResult = await run("yantra-video-generation", "YANTRA_VIDEO_GENERATION_GENERATE", buildVideoGenerateParams({
130
+ prompt: baseTakePrompt(opts.persona, beats),
131
+ aspectRatio: "9:16",
132
+ referenceImageUrl: opts.persona.avatarUrl,
133
+ durationSeconds: 5
134
+ }));
135
+ const baseTake = generationMediaUrl(baseResult);
136
+ const clipsByIndex = beats.map(() => null);
137
+ for (const job of jobs) {
138
+ if (job.kind === "run") {
139
+ const runBeats = job.indexes.map((i) => beats[i]);
140
+ const clips = await renderTalkingRun(run, runBeats, baseTake, opts.persona, onProgress);
141
+ job.indexes.forEach((beatIndex, i) => {
142
+ var _a2;
143
+ clipsByIndex[beatIndex] = (_a2 = clips[i]) != null ? _a2 : null;
144
+ });
145
+ } else {
146
+ clipsByIndex[job.index] = await renderBroll(run, beats[job.index], onProgress);
147
+ }
148
+ }
149
+ const present = clipsByIndex.filter((c) => Boolean(c == null ? void 0 : c.src));
150
+ const urls = present.map((c) => c.src);
151
+ if (urls.length === 0) throw new Error("Reel render produced no clips");
152
+ let url = urls[0];
153
+ if (urls.length > 1) {
154
+ onProgress("Assembling the reel\u2026");
155
+ const concat = await run("yantra-video-editing", "YANTRA_VIDEO_EDIT_CONCAT", {
156
+ input_urls: urls
157
+ });
158
+ url = resultUrl(concat, "YANTRA_VIDEO_EDIT_CONCAT");
159
+ }
160
+ const productPhotos = ((_d = opts.productPhotoUrls) != null ? _d : []).filter(Boolean);
161
+ const estimatedSec = present.reduce((s, c) => s + (c.seconds || 0), 0) || seconds;
162
+ if (productPhotos.length) {
163
+ url = await burnProductShots(run, url, productPhotos, estimatedSec, onProgress);
164
+ }
165
+ return {
166
+ url,
167
+ beats,
168
+ productPhotos
169
+ };
170
+ }export{planEpisode,renderInfluencerReel};//# sourceMappingURL=influencerPipeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"influencerPipeline.js","sources":["../../../../src/features/canvas/influencer/influencerPipeline.ts"],"sourcesContent":["/**\n * Multi-beat influencer pipeline — twin of web `influencerRpc.ts` over RunMediaAction.\n */\nimport { runLipSync } from '../canvasEditOps';\nimport { buildVideoGenerateParams } from '../generationModels';\nimport { generationMediaUrl, resultUrl, type RunMediaAction } from '../videoEditor/mediaActions';\nimport { episodePlanFor, lengthNote, progressLabel, scheduleProductShots, type ProductBrief } from './productReel';\nimport {\n allotRunSeconds,\n parseEpisodePlan,\n planRenderJobs,\n speakingSeconds,\n type ReelBeat,\n type ReelClip,\n} from './reelPlan';\n\nexport interface Persona {\n id: string;\n name: string;\n avatarUrl: string;\n tagline?: string;\n voiceId?: string;\n}\n\nexport type ReelFormat = 'talking-head' | 'vlog' | 'tutorial' | 'reaction' | 'product';\n\n/** Sync model that stretches a short take over a long speech track (web twin). */\nconst RUN_SYNC = { model: 'fal-ai/sync-lipsync', syncMode: 'bounce' } as const;\n\nexport async function planEpisode(\n run: RunMediaAction,\n opts: { persona: Persona; brief: string; format?: ReelFormat; seconds?: number },\n): Promise<ReelBeat[]> {\n const { episodeCount, durationSeconds } = episodePlanFor(opts.seconds ?? 30);\n const format = opts.format === 'product' ? 'talking-head' : (opts.format ?? 'talking-head');\n const call = () =>\n run('yantra-character', 'YANTRA_CHARACTER_STREAM_PLAN', {\n brief: `${opts.brief}\\n${lengthNote(durationSeconds)}`,\n card: { name: opts.persona.name, ...(opts.persona.tagline ? { tagline: opts.persona.tagline } : {}) },\n episodeCount,\n format,\n durationSeconds,\n });\n const result = await call().catch(call);\n const beats = parseEpisodePlan(result);\n if (beats.length === 0) throw new Error('The planner returned no beats for this brief');\n return beats;\n}\n\nfunction baseTakePrompt(persona: Persona, beats: ReelBeat[]): string {\n const who = `${persona.name} speaking to camera, natural expression, steady framing`;\n const scene = beats.find((b) => b.kind === 'talking' && b.visual)?.visual;\n if (scene) return `${who}. ${scene}`;\n return persona.tagline ? `${who}. ${persona.tagline}` : who;\n}\n\n/**\n * One lip-sync over the joined lines, then windowed clips via allotRunSeconds\n * so the persona does not snap back between beats.\n */\nasync function renderTalkingRun(\n run: RunMediaAction,\n beats: ReelBeat[],\n baseTake: string,\n persona: Persona,\n onProgress: (msg: string) => void,\n): Promise<ReelClip[]> {\n const lines = beats.map((b) => b.line);\n onProgress(`Lip-syncing ${lines.length} line(s)…`);\n const videoUrl = await runLipSync(run, baseTake, {\n text: lines.join(' '),\n model: RUN_SYNC.model,\n syncMode: RUN_SYNC.syncMode,\n voiceId: persona.voiceId,\n });\n const fallback = lines.reduce((sum, line) => sum + speakingSeconds(line), 0);\n const sourceSeconds = fallback;\n let offset = 0;\n return allotRunSeconds(beats, sourceSeconds).map((seconds) => {\n const clip = { src: videoUrl, seconds, offset, sourceSeconds };\n offset += seconds;\n return clip;\n });\n}\n\nasync function renderBroll(run: RunMediaAction, beat: ReelBeat, onProgress: (msg: string) => void): Promise<ReelClip> {\n onProgress(`B-roll: ${(beat.visual || beat.line).slice(0, 40)}…`);\n const result = await run(\n 'yantra-video-generation',\n 'YANTRA_VIDEO_GENERATION_GENERATE',\n buildVideoGenerateParams({\n prompt: beat.visual || beat.line || 'B-roll establishing shot',\n aspectRatio: '9:16',\n durationSeconds: Math.min(6, Math.max(2, Math.round(beat.seconds))),\n }),\n );\n const src = generationMediaUrl(result);\n return { src, seconds: beat.seconds };\n}\n\nasync function burnProductShots(\n run: RunMediaAction,\n reelUrl: string,\n photoSrcs: string[],\n reelSeconds: number,\n onProgress: (msg: string) => void,\n): Promise<string> {\n const placements = scheduleProductShots(reelSeconds, photoSrcs, { vertical: true });\n if (!placements.length) return reelUrl;\n let current = reelUrl;\n for (let i = 0; i < placements.length; i += 1) {\n const shot = placements[i];\n onProgress(`Product shot ${i + 1}/${placements.length}…`);\n try {\n const result = await run('yantra-video-editing', 'YANTRA_VIDEO_EDIT_OVERLAY_IMAGE', {\n input_url: current,\n overlay_image: shot.src,\n x: `${shot.box.x}%`,\n y: `${shot.box.y}%`,\n width: `${shot.box.width}%`,\n height: `${shot.box.height}%`,\n start_sec: shot.startSec,\n end_sec: shot.endSec,\n fit: 'contain',\n });\n current = resultUrl(result, 'YANTRA_VIDEO_EDIT_OVERLAY_IMAGE');\n } catch {\n // Overlay timing may be unsupported; keep the reel without this shot.\n }\n }\n return current;\n}\n\n/** Plan → base take → talking runs + b-roll → concat (+ optional product overlays). */\nexport async function renderInfluencerReel(\n run: RunMediaAction,\n opts: {\n persona: Persona;\n brief: string;\n seconds?: number;\n format?: ReelFormat;\n product?: ProductBrief;\n productPhotoUrls?: string[];\n onProgress?: (message: string) => void;\n },\n): Promise<{ url: string; beats: ReelBeat[]; productPhotos: string[] }> {\n const onProgressRaw = opts.onProgress ?? (() => undefined);\n const onProgress = (msg: string) => onProgressRaw(progressLabel(msg, msg));\n const seconds = opts.seconds ?? 30;\n onProgress('Planning the episode…');\n const beats = await planEpisode(run, {\n persona: opts.persona,\n brief: opts.brief,\n format: opts.format ?? (opts.product ? 'product' : 'talking-head'),\n seconds,\n });\n const jobs = planRenderJobs(beats);\n\n onProgress(`Filming ${opts.persona.name}…`);\n const baseResult = await run(\n 'yantra-video-generation',\n 'YANTRA_VIDEO_GENERATION_GENERATE',\n buildVideoGenerateParams({\n prompt: baseTakePrompt(opts.persona, beats),\n aspectRatio: '9:16',\n referenceImageUrl: opts.persona.avatarUrl,\n durationSeconds: 5,\n }),\n );\n const baseTake = generationMediaUrl(baseResult);\n\n const clipsByIndex: Array<ReelClip | null> = beats.map(() => null);\n for (const job of jobs) {\n if (job.kind === 'run') {\n const runBeats = job.indexes.map((i) => beats[i]);\n const clips = await renderTalkingRun(run, runBeats, baseTake, opts.persona, onProgress);\n job.indexes.forEach((beatIndex, i) => {\n clipsByIndex[beatIndex] = clips[i] ?? null;\n });\n } else {\n clipsByIndex[job.index] = await renderBroll(run, beats[job.index], onProgress);\n }\n }\n\n const present = clipsByIndex.filter((c): c is ReelClip => Boolean(c?.src));\n const urls = present.map((c) => c.src);\n if (urls.length === 0) throw new Error('Reel render produced no clips');\n\n let url = urls[0];\n if (urls.length > 1) {\n onProgress('Assembling the reel…');\n const concat = await run('yantra-video-editing', 'YANTRA_VIDEO_EDIT_CONCAT', { input_urls: urls });\n url = resultUrl(concat, 'YANTRA_VIDEO_EDIT_CONCAT');\n }\n\n const productPhotos = (opts.productPhotoUrls ?? []).filter(Boolean);\n const estimatedSec = present.reduce((s, c) => s + (c.seconds || 0), 0) || seconds;\n if (productPhotos.length) {\n url = await burnProductShots(run, url, productPhotos, estimatedSec, onProgress);\n }\n\n return { url, beats, productPhotos };\n}\n"],"names":["_a"],"mappings":";;;;;;;;;;;;;;;;AAkBA,MAAM,QAAW,GAAA;AAAA,EACf,KAAO,EAAA,qBAAA;AAAA,EACP,QAAU,EAAA;AACZ,CAAA;AACsB,eAAA,WAAA,CAAY,KAAqB,IAK/B,EAAA;AA3BxB,EAAA,IAAA,EAAA,EAAA,EAAA;AA4BE,EAAM,MAAA;AAAA,IACJ,YAAA;AAAA,IACA;AAAA,GACE,GAAA,cAAA,CAAA,CAAe,EAAK,GAAA,IAAA,CAAA,OAAA,KAAL,YAAgB,EAAE,CAAA;AACrC,EAAA,MAAM,SAAS,IAAK,CAAA,MAAA,KAAW,YAAY,cAAiB,GAAA,CAAA,EAAA,GAAA,IAAA,CAAK,WAAL,IAAe,GAAA,EAAA,GAAA,cAAA;AAC3E,EAAA,MAAM,IAAO,GAAA,MAAM,GAAI,CAAA,kBAAA,EAAoB,8BAAgC,EAAA;AAAA,IACzE,KAAA,EAAO,CAAG,EAAA,IAAA,CAAK,KAAK;AAAA,EAAK,UAAA,CAAW,eAAe,CAAC,CAAA,CAAA;AAAA,IACpD,IAAM,EAAA,cAAA,CAAA;AAAA,MACJ,IAAA,EAAM,KAAK,OAAQ,CAAA;AAAA,KACf,EAAA,IAAA,CAAK,QAAQ,OAAU,GAAA;AAAA,MACzB,OAAA,EAAS,KAAK,OAAQ,CAAA;AAAA,QACpB,EAAC,CAAA;AAAA,IAEP,YAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACD,CAAA;AACD,EAAA,MAAM,MAAS,GAAA,MAAM,IAAK,EAAA,CAAE,MAAM,IAAI,CAAA;AACtC,EAAM,MAAA,KAAA,GAAQ,iBAAiB,MAAM,CAAA;AACrC,EAAA,IAAI,MAAM,MAAW,KAAA,CAAA,EAAS,MAAA,IAAI,MAAM,8CAA8C,CAAA;AACtF,EAAO,OAAA,KAAA;AACT;AACA,SAAS,cAAA,CAAe,SAAkB,KAA2B,EAAA;AAlDrE,EAAA,IAAA,EAAA;AAmDE,EAAM,MAAA,GAAA,GAAM,CAAG,EAAA,OAAA,CAAQ,IAAI,CAAA,uDAAA,CAAA;AAC3B,EAAM,MAAA,KAAA,GAAA,CAAQ,EAAM,GAAA,KAAA,CAAA,IAAA,CAAK,CAAK,CAAA,KAAA,CAAA,CAAE,SAAS,SAAa,IAAA,CAAA,CAAE,MAAM,CAAA,KAAhD,IAAmD,GAAA,MAAA,GAAA,EAAA,CAAA,MAAA;AACjE,EAAA,IAAI,KAAO,EAAA,OAAO,CAAG,EAAA,GAAG,KAAK,KAAK,CAAA,CAAA;AAClC,EAAA,OAAO,QAAQ,OAAU,GAAA,CAAA,EAAG,GAAG,CAAK,EAAA,EAAA,OAAA,CAAQ,OAAO,CAAK,CAAA,GAAA,GAAA;AAC1D;AAMA,eAAe,gBAAiB,CAAA,GAAA,EAAqB,KAAmB,EAAA,QAAA,EAAkB,SAAkB,UAAwD,EAAA;AAClK,EAAA,MAAM,KAAQ,GAAA,KAAA,CAAM,GAAI,CAAA,CAAA,CAAA,KAAK,EAAE,IAAI,CAAA;AACnC,EAAW,UAAA,CAAA,CAAA,YAAA,EAAe,KAAM,CAAA,MAAM,CAAW,cAAA,CAAA,CAAA;AACjD,EAAA,MAAM,QAAW,GAAA,MAAM,UAAW,CAAA,GAAA,EAAK,QAAU,EAAA;AAAA,IAC/C,IAAA,EAAM,KAAM,CAAA,IAAA,CAAK,GAAG,CAAA;AAAA,IACpB,OAAO,QAAS,CAAA,KAAA;AAAA,IAChB,UAAU,QAAS,CAAA,QAAA;AAAA,IACnB,SAAS,OAAQ,CAAA;AAAA,GAClB,CAAA;AACD,EAAM,MAAA,QAAA,GAAW,KAAM,CAAA,MAAA,CAAO,CAAC,GAAA,EAAK,SAAS,GAAM,GAAA,eAAA,CAAgB,IAAI,CAAA,EAAG,CAAC,CAAA;AAC3E,EAAA,MAAM,aAAgB,GAAA,QAAA;AACtB,EAAA,IAAI,MAAS,GAAA,CAAA;AACb,EAAA,OAAO,eAAgB,CAAA,KAAA,EAAO,aAAa,CAAA,CAAE,IAAI,CAAW,OAAA,KAAA;AAC1D,IAAA,MAAM,IAAO,GAAA;AAAA,MACX,GAAK,EAAA,QAAA;AAAA,MACL,OAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACF;AACA,IAAU,MAAA,IAAA,OAAA;AACV,IAAO,OAAA,IAAA;AAAA,GACR,CAAA;AACH;AACA,eAAe,WAAA,CAAY,GAAqB,EAAA,IAAA,EAAgB,UAAsD,EAAA;AACpH,EAAW,UAAA,CAAA,CAAA,QAAA,EAAA,CAAY,KAAK,MAAU,IAAA,IAAA,CAAK,MAAM,KAAM,CAAA,CAAA,EAAG,EAAE,CAAC,CAAG,MAAA,CAAA,CAAA;AAChE,EAAA,MAAM,MAAS,GAAA,MAAM,GAAI,CAAA,yBAAA,EAA2B,oCAAoC,wBAAyB,CAAA;AAAA,IAC/G,MAAQ,EAAA,IAAA,CAAK,MAAU,IAAA,IAAA,CAAK,IAAQ,IAAA,0BAAA;AAAA,IACpC,WAAa,EAAA,MAAA;AAAA,IACb,eAAiB,EAAA,IAAA,CAAK,GAAI,CAAA,CAAA,EAAG,IAAK,CAAA,GAAA,CAAI,CAAG,EAAA,IAAA,CAAK,KAAM,CAAA,IAAA,CAAK,OAAO,CAAC,CAAC;AAAA,GACnE,CAAC,CAAA;AACF,EAAM,MAAA,GAAA,GAAM,mBAAmB,MAAM,CAAA;AACrC,EAAO,OAAA;AAAA,IACL,GAAA;AAAA,IACA,SAAS,IAAK,CAAA;AAAA,GAChB;AACF;AACA,eAAe,gBAAiB,CAAA,GAAA,EAAqB,OAAiB,EAAA,SAAA,EAAqB,aAAqB,UAAoD,EAAA;AAClK,EAAM,MAAA,UAAA,GAAa,oBAAqB,CAAA,WAAA,EAAa,SAAW,EAAA;AAAA,IAC9D,QAAU,EAAA;AAAA,GACX,CAAA;AACD,EAAI,IAAA,CAAC,UAAW,CAAA,MAAA,EAAe,OAAA,OAAA;AAC/B,EAAA,IAAI,OAAU,GAAA,OAAA;AACd,EAAA,KAAA,IAAS,IAAI,CAAG,EAAA,CAAA,GAAI,UAAW,CAAA,MAAA,EAAQ,KAAK,CAAG,EAAA;AAC7C,IAAM,MAAA,IAAA,GAAO,WAAW,CAAC,CAAA;AACzB,IAAA,UAAA,CAAW,gBAAgB,CAAI,GAAA,CAAC,CAAI,CAAA,EAAA,UAAA,CAAW,MAAM,CAAG,MAAA,CAAA,CAAA;AACxD,IAAI,IAAA;AACF,MAAA,MAAM,MAAS,GAAA,MAAM,GAAI,CAAA,sBAAA,EAAwB,iCAAmC,EAAA;AAAA,QAClF,SAAW,EAAA,OAAA;AAAA,QACX,eAAe,IAAK,CAAA,GAAA;AAAA,QACpB,CAAG,EAAA,CAAA,EAAG,IAAK,CAAA,GAAA,CAAI,CAAC,CAAA,CAAA,CAAA;AAAA,QAChB,CAAG,EAAA,CAAA,EAAG,IAAK,CAAA,GAAA,CAAI,CAAC,CAAA,CAAA,CAAA;AAAA,QAChB,KAAO,EAAA,CAAA,EAAG,IAAK,CAAA,GAAA,CAAI,KAAK,CAAA,CAAA,CAAA;AAAA,QACxB,MAAQ,EAAA,CAAA,EAAG,IAAK,CAAA,GAAA,CAAI,MAAM,CAAA,CAAA,CAAA;AAAA,QAC1B,WAAW,IAAK,CAAA,QAAA;AAAA,QAChB,SAAS,IAAK,CAAA,MAAA;AAAA,QACd,GAAK,EAAA;AAAA,OACN,CAAA;AACD,MAAU,OAAA,GAAA,SAAA,CAAU,QAAQ,iCAAiC,CAAA;AAAA,KACvD,CAAA,OAAA,CAAA,EAAA;AAAA;AAER;AAEF,EAAO,OAAA,OAAA;AACT;AAGsB,eAAA,oBAAA,CAAqB,KAAqB,IAY7D,EAAA;AA3IH,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AA4IE,EAAA,MAAM,aAAgB,GAAA,CAAA,EAAA,GAAA,IAAA,CAAK,UAAL,KAAA,IAAA,GAAA,EAAA,IAAoB,MAAM,MAAA,CAAA;AAChD,EAAA,MAAM,aAAa,CAAC,GAAA,KAAgB,cAAc,aAAc,CAAA,GAAA,EAAK,GAAG,CAAC,CAAA;AACzE,EAAM,MAAA,OAAA,GAAA,CAAU,EAAK,GAAA,IAAA,CAAA,OAAA,KAAL,IAAgB,GAAA,EAAA,GAAA,EAAA;AAChC,EAAA,UAAA,CAAW,4BAAuB,CAAA;AAClC,EAAM,MAAA,KAAA,GAAQ,MAAM,WAAA,CAAY,GAAK,EAAA;AAAA,IACnC,SAAS,IAAK,CAAA,OAAA;AAAA,IACd,OAAO,IAAK,CAAA,KAAA;AAAA,IACZ,SAAQ,EAAK,GAAA,IAAA,CAAA,MAAA,KAAL,IAAgB,GAAA,EAAA,GAAA,IAAA,CAAK,UAAU,SAAY,GAAA,cAAA;AAAA,IACnD;AAAA,GACD,CAAA;AACD,EAAM,MAAA,IAAA,GAAO,eAAe,KAAK,CAAA;AACjC,EAAA,UAAA,CAAW,CAAW,QAAA,EAAA,IAAA,CAAK,OAAQ,CAAA,IAAI,CAAG,MAAA,CAAA,CAAA;AAC1C,EAAA,MAAM,UAAa,GAAA,MAAM,GAAI,CAAA,yBAAA,EAA2B,oCAAoC,wBAAyB,CAAA;AAAA,IACnH,MAAQ,EAAA,cAAA,CAAe,IAAK,CAAA,OAAA,EAAS,KAAK,CAAA;AAAA,IAC1C,WAAa,EAAA,MAAA;AAAA,IACb,iBAAA,EAAmB,KAAK,OAAQ,CAAA,SAAA;AAAA,IAChC,eAAiB,EAAA;AAAA,GAClB,CAAC,CAAA;AACF,EAAM,MAAA,QAAA,GAAW,mBAAmB,UAAU,CAAA;AAC9C,EAAA,MAAM,YAAuC,GAAA,KAAA,CAAM,GAAI,CAAA,MAAM,IAAI,CAAA;AACjE,EAAA,KAAA,MAAW,OAAO,IAAM,EAAA;AACtB,IAAI,IAAA,GAAA,CAAI,SAAS,KAAO,EAAA;AACtB,MAAA,MAAM,WAAW,GAAI,CAAA,OAAA,CAAQ,IAAI,CAAK,CAAA,KAAA,KAAA,CAAM,CAAC,CAAC,CAAA;AAC9C,MAAM,MAAA,KAAA,GAAQ,MAAM,gBAAiB,CAAA,GAAA,EAAK,UAAU,QAAU,EAAA,IAAA,CAAK,SAAS,UAAU,CAAA;AACtF,MAAA,GAAA,CAAI,OAAQ,CAAA,OAAA,CAAQ,CAAC,SAAA,EAAW,CAAM,KAAA;AApK5C,QAAAA,IAAAA,GAAAA;AAqKQ,QAAA,YAAA,CAAa,SAAS,CAAIA,GAAAA,CAAAA,GAAAA,GAAA,MAAM,CAAC,CAAA,KAAP,OAAAA,GAAY,GAAA,IAAA;AAAA,OACvC,CAAA;AAAA,KACI,MAAA;AACL,MAAa,YAAA,CAAA,GAAA,CAAI,KAAK,CAAA,GAAI,MAAM,WAAA,CAAY,KAAK,KAAM,CAAA,GAAA,CAAI,KAAK,CAAA,EAAG,UAAU,CAAA;AAAA;AAC/E;AAEF,EAAM,MAAA,OAAA,GAAU,aAAa,MAAO,CAAA,CAAC,MAAqB,OAAQ,CAAA,CAAA,IAAA,IAAA,GAAA,MAAA,GAAA,CAAA,CAAG,GAAG,CAAC,CAAA;AACzE,EAAA,MAAM,IAAO,GAAA,OAAA,CAAQ,GAAI,CAAA,CAAA,CAAA,KAAK,EAAE,GAAG,CAAA;AACnC,EAAA,IAAI,KAAK,MAAW,KAAA,CAAA,EAAS,MAAA,IAAI,MAAM,+BAA+B,CAAA;AACtE,EAAI,IAAA,GAAA,GAAM,KAAK,CAAC,CAAA;AAChB,EAAI,IAAA,IAAA,CAAK,SAAS,CAAG,EAAA;AACnB,IAAA,UAAA,CAAW,2BAAsB,CAAA;AACjC,IAAA,MAAM,MAAS,GAAA,MAAM,GAAI,CAAA,sBAAA,EAAwB,0BAA4B,EAAA;AAAA,MAC3E,UAAY,EAAA;AAAA,KACb,CAAA;AACD,IAAM,GAAA,GAAA,SAAA,CAAU,QAAQ,0BAA0B,CAAA;AAAA;AAEpD,EAAA,MAAM,kBAAiB,EAAK,GAAA,IAAA,CAAA,gBAAA,KAAL,YAAyB,EAAC,EAAG,OAAO,OAAO,CAAA;AAClE,EAAM,MAAA,YAAA,GAAe,OAAQ,CAAA,MAAA,CAAO,CAAC,CAAA,EAAG,CAAM,KAAA,CAAA,IAAK,CAAE,CAAA,OAAA,IAAW,CAAI,CAAA,EAAA,CAAC,CAAK,IAAA,OAAA;AAC1E,EAAA,IAAI,cAAc,MAAQ,EAAA;AACxB,IAAA,GAAA,GAAM,MAAM,gBAAiB,CAAA,GAAA,EAAK,GAAK,EAAA,aAAA,EAAe,cAAc,UAAU,CAAA;AAAA;AAEhF,EAAO,OAAA;AAAA,IACL,GAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACF;AACF"}
@@ -0,0 +1,72 @@
1
+ const REEL_LENGTHS = [15, 30, 45, 60, 90, 120, 180];
2
+ const MAX_EPISODE_SECONDS = 60;
3
+ function lengthLabel(seconds) {
4
+ if (seconds < 60) return `${seconds}s`;
5
+ const m = Math.floor(seconds / 60);
6
+ const s = seconds % 60;
7
+ return s ? `${m}:${String(s).padStart(2, "0")}` : `${m} min`;
8
+ }
9
+ function episodePlanFor(seconds) {
10
+ const total = Math.min(REEL_LENGTHS[REEL_LENGTHS.length - 1], Math.max(8, Math.round(seconds)));
11
+ const episodeCount = Math.max(1, Math.ceil(total / MAX_EPISODE_SECONDS));
12
+ return {
13
+ episodeCount,
14
+ durationSeconds: Math.round(total / episodeCount)
15
+ };
16
+ }
17
+ const WORDS_PER_SECOND = 2.6;
18
+ function lengthNote(durationSeconds) {
19
+ const low = Math.round(durationSeconds * WORDS_PER_SECOND * 0.9);
20
+ const high = Math.round(durationSeconds * WORDS_PER_SECOND * 1.05);
21
+ return `Length: each episode's spoken_line must be ${low} to ${high} words - a full ${durationSeconds} seconds spoken aloud. Do not stop short; keep talking through the point in detail.`;
22
+ }
23
+ function productBrief(product, seconds) {
24
+ var _a, _b, _c;
25
+ const points = product.points.map((p) => p.trim()).filter(Boolean);
26
+ const arc = ["a hook that names the problem it solves", "what it is and who it is for", ...points.length ? [`each of these points, in this order: ${points.map((p, i) => `(${i + 1}) ${p}`).join("; ")}`] : [], "how it is actually used, as if showing it", ...((_a = product.offer) == null ? void 0 : _a.trim()) ? [`the offer, exactly: ${product.offer.trim()}`] : [], `end on the call to action: ${((_b = product.callToAction) == null ? void 0 : _b.trim()) || "where to get it"}`];
27
+ return [`Present the product "${product.name.trim()}" to camera, first person, as its host - a ${lengthLabel(seconds)} pitch.`, `Walk this arc across the whole run, in order: ${arc.join("; ")}.`, "Speak only facts given here; do not invent features, numbers or claims. Keep every line sayable in one breath.", ...((_c = product.notes) == null ? void 0 : _c.trim()) ? [`About the angle: ${product.notes.trim()}`] : []].join("\n");
28
+ }
29
+ function scheduleProductShots(reelSeconds, photoSrcs, opts = {}) {
30
+ var _a, _b, _c, _d;
31
+ const photos = photoSrcs.filter(Boolean);
32
+ if (!photos.length || !(reelSeconds > 0)) return [];
33
+ const every = (_a = opts.every) != null ? _a : 12;
34
+ const length = (_b = opts.seconds) != null ? _b : 4;
35
+ const lead = (_c = opts.lead) != null ? _c : 3;
36
+ const tail = (_d = opts.tail) != null ? _d : 3;
37
+ const vertical = opts.vertical !== false;
38
+ const box = vertical ? {
39
+ x: 10,
40
+ y: 14,
41
+ width: 80,
42
+ height: 50
43
+ } : {
44
+ x: 25,
45
+ y: 8,
46
+ width: 50,
47
+ height: 84
48
+ };
49
+ const out = [];
50
+ let nextAt = lead;
51
+ let shot = 0;
52
+ while (nextAt < reelSeconds - tail) {
53
+ const start = Math.max(lead, Math.min(nextAt, reelSeconds - tail - length));
54
+ const end = Math.min(start + length, reelSeconds - tail);
55
+ if (end - start < 1.5) break;
56
+ out.push({
57
+ src: photos[shot % photos.length],
58
+ startSec: start,
59
+ endSec: end,
60
+ box
61
+ });
62
+ shot += 1;
63
+ nextAt = start + every;
64
+ }
65
+ return out;
66
+ }
67
+ function progressLabel(message, fallback) {
68
+ const text = message.replace(/\s+/g, " ").trim();
69
+ if (!text) return fallback;
70
+ if (/[{}\[\]"=]/.test(text) || text.length > 90 || /\?/.test(text)) return fallback;
71
+ return text;
72
+ }export{MAX_EPISODE_SECONDS,REEL_LENGTHS,episodePlanFor,lengthLabel,lengthNote,productBrief,progressLabel,scheduleProductShots};//# sourceMappingURL=productReel.js.map