@adminide-stack/yantra-mobile 12.0.69-alpha.9 → 12.0.70-alpha.0

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 +166 -0
  170. package/lib/features/chat/ConnectorConnectCard.js.map +1 -0
  171. package/lib/features/chat/ConnectorConnectPrompt.js +272 -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 +207 -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,76 @@
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;
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
+ function inferCanvasChatLane(text) {
18
+ const t = text.toLowerCase();
19
+ if (/\b(videos?|clips?|footage|mp4|reels?|animat(?:e|ion|ing)|make a film|short film)\b/.test(t)) {
20
+ return "video";
21
+ }
22
+ if (/\b(audio|voiceover|soundtrack|music|song|podcast|narrat(?:e|ion)|speech|soundscape)\b/.test(t)) {
23
+ return "audio";
24
+ }
25
+ return "image";
26
+ }
27
+ function attachmentMediaKind(file) {
28
+ var _a;
29
+ const mime = (file.mimeType || "").toLowerCase();
30
+ const name = (file.name || "").toLowerCase();
31
+ if (mime.startsWith("video/") || /\.(mp4|mov|webm)$/i.test(name)) return "video";
32
+ if (mime.startsWith("audio/") || /\.(mp3|wav|m4a|aac)$/i.test(name)) return "audio";
33
+ if (mime.startsWith("image/") || file.type === "screenshot" || /\.(png|jpe?g|gif|webp)$/i.test(name) || Boolean((_a = file.dataUrl) == null ? void 0 : _a.startsWith("data:image"))) {
34
+ return "image";
35
+ }
36
+ if (file.url || file.dataUrl) return "image";
37
+ return null;
38
+ }
39
+ function attachmentSrc(file) {
40
+ const src = file.url || file.dataUrl;
41
+ return (src == null ? void 0 : src.trim()) ? src : null;
42
+ }
43
+ async function generateCanvasChatMedia(opts) {
44
+ var _a, _b;
45
+ const text = opts.prompt.trim();
46
+ const aspect = opts.aspect || "16:9";
47
+ const model = (_a = opts.model) == null ? void 0 : _a.trim();
48
+ const still = opts.referenceImageUrl ? unwrapProxyUrl(opts.referenceImageUrl) : void 0;
49
+ if (opts.lane === "image") {
50
+ const result2 = await opts.runAction("yantra-image-generation", "YANTRA_GEMINI_IMAGE_GENERATE", __spreadValues({
51
+ prompt: text,
52
+ aspectRatio: aspect
53
+ }, model ? {
54
+ model
55
+ } : {}));
56
+ return generationImageUrl(result2);
57
+ }
58
+ if (opts.lane === "audio") {
59
+ const result2 = await opts.runAction("yantra-audio", "YANTRA_AUDIO_RUN_PROMPT", __spreadValues({
60
+ prompt: text
61
+ }, model ? {
62
+ model
63
+ } : {}));
64
+ return resultUrl(result2, "YANTRA_AUDIO_RUN_PROMPT");
65
+ }
66
+ const result = await opts.runAction("yantra-video-generation", "YANTRA_VIDEO_GENERATION_GENERATE", buildVideoGenerateParams({
67
+ prompt: text,
68
+ aspectRatio: aspect,
69
+ model: model || ((_b = STATIC_VIDEO_MODELS[0]) == null ? void 0 : _b.id),
70
+ referenceImageUrl: still
71
+ }));
72
+ return generationMediaUrl(result);
73
+ }
74
+ function canvasChatGenerateError(err, lane) {
75
+ return friendlyMediaError(err, `${lane} generation`);
76
+ }export{attachmentMediaKind,attachmentSrc,canvasChatGenerateError,generateCanvasChatMedia,inferCanvasChatLane};//# sourceMappingURL=canvasAgentChat.js.map
@@ -0,0 +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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"}
@@ -0,0 +1,59 @@
1
+ import {gql}from'@apollo/client/index.js';const CANVAS_BOARD_PAGE_SIZE = 10;
2
+ const NATIVE_CANVAS_BOARDS_QUERY = gql`
3
+ query NativeCanvasBoards($filter: NativeCanvasBoardFilter) {
4
+ nativeCanvasBoards(filter: $filter) {
5
+ __typename
6
+ nodes {
7
+ __typename
8
+ channelId
9
+ title
10
+ savedAt
11
+ itemCount
12
+ board
13
+ }
14
+ }
15
+ }
16
+ `;
17
+ function canvasBoardsFilter(offset = 0, limit = CANVAS_BOARD_PAGE_SIZE) {
18
+ return {
19
+ offset,
20
+ limit
21
+ };
22
+ }
23
+ function readCachedCanvasBoards(client) {
24
+ var _a, _b;
25
+ if (!client) return [];
26
+ try {
27
+ const data = client.readQuery({
28
+ query: NATIVE_CANVAS_BOARDS_QUERY,
29
+ variables: {
30
+ filter: canvasBoardsFilter(0)
31
+ }
32
+ });
33
+ return ((_b = (_a = data == null ? void 0 : data.nativeCanvasBoards) == null ? void 0 : _a.nodes) != null ? _b : []).filter((row) => Boolean(row == null ? void 0 : row.channelId));
34
+ } catch (e) {
35
+ return [];
36
+ }
37
+ }
38
+ function writeCachedCanvasBoards(client, boards) {
39
+ if (!client) return;
40
+ client.writeQuery({
41
+ query: NATIVE_CANVAS_BOARDS_QUERY,
42
+ variables: {
43
+ filter: canvasBoardsFilter(0)
44
+ },
45
+ data: {
46
+ nativeCanvasBoards: {
47
+ __typename: "NativeCanvasBoardConnection",
48
+ nodes: boards.map((board) => ({
49
+ __typename: "NativeCanvasBoard",
50
+ channelId: board.channelId,
51
+ title: board.title,
52
+ savedAt: board.savedAt,
53
+ itemCount: board.itemCount,
54
+ board: board.board
55
+ }))
56
+ }
57
+ }
58
+ });
59
+ }export{CANVAS_BOARD_PAGE_SIZE,NATIVE_CANVAS_BOARDS_QUERY,canvasBoardsFilter,readCachedCanvasBoards,writeCachedCanvasBoards};//# sourceMappingURL=canvasBoardsCatalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvasBoardsCatalog.js","sources":["../../../src/features/canvas/canvasBoardsCatalog.ts"],"sourcesContent":["/**\n * Canvas board gallery cache — host Apollo + typePolicies, 10-at-a-time UI.\n * The surface index still returns the full list; we persist it under one\n * `nativeCanvasBoards` field (offset pages merge) so leaving and returning\n * Canvas is cache-first.\n */\nimport { gql } from '@apollo/client';\nimport type { ApolloClient } from '@apollo/client';\nimport type { CanvasBoardSummary } from './surfaceIndex';\n\nexport const CANVAS_BOARD_PAGE_SIZE = 10;\n\nexport const NATIVE_CANVAS_BOARDS_QUERY = gql`\n query NativeCanvasBoards($filter: NativeCanvasBoardFilter) {\n nativeCanvasBoards(filter: $filter) {\n __typename\n nodes {\n __typename\n channelId\n title\n savedAt\n itemCount\n board\n }\n }\n }\n`;\n\nexport function canvasBoardsFilter(offset = 0, limit = CANVAS_BOARD_PAGE_SIZE) {\n return { offset, limit };\n}\n\nexport type CanvasBoardsClient = Pick<ApolloClient<object>, 'readQuery' | 'writeQuery'>;\n\ninterface NativeCanvasBoardsData {\n nativeCanvasBoards?: { nodes?: CanvasBoardSummary[] | null } | null;\n}\n\nexport function readCachedCanvasBoards(client: CanvasBoardsClient | null | undefined): CanvasBoardSummary[] {\n if (!client) return [];\n try {\n const data = client.readQuery<NativeCanvasBoardsData>({\n query: NATIVE_CANVAS_BOARDS_QUERY,\n variables: { filter: canvasBoardsFilter(0) },\n });\n return (data?.nativeCanvasBoards?.nodes ?? []).filter((row): row is CanvasBoardSummary =>\n Boolean(row?.channelId),\n );\n } catch {\n return [];\n }\n}\n\nexport function writeCachedCanvasBoards(\n client: CanvasBoardsClient | null | undefined,\n boards: readonly CanvasBoardSummary[],\n) {\n if (!client) return;\n client.writeQuery({\n query: NATIVE_CANVAS_BOARDS_QUERY,\n variables: { filter: canvasBoardsFilter(0) },\n data: {\n nativeCanvasBoards: {\n __typename: 'NativeCanvasBoardConnection',\n nodes: boards.map((board) => ({\n __typename: 'NativeCanvasBoard',\n channelId: board.channelId,\n title: board.title,\n savedAt: board.savedAt,\n itemCount: board.itemCount,\n board: board.board,\n })),\n },\n },\n });\n}\n\nexport function pageCanvasBoards(\n boards: readonly CanvasBoardSummary[],\n offset: number,\n limit = CANVAS_BOARD_PAGE_SIZE,\n): { rows: CanvasBoardSummary[]; hasMore: boolean } {\n const rows = boards.slice(offset, offset + limit);\n return { rows, hasMore: offset + rows.length < boards.length };\n}\n"],"names":[],"mappings":"0CASO,MAAM,sBAAyB,GAAA;AAC/B,MAAM,0BAA6B,GAAA,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAenC,SAAS,kBAAmB,CAAA,MAAA,GAAS,CAAG,EAAA,KAAA,GAAQ,sBAAwB,EAAA;AAC7E,EAAO,OAAA;AAAA,IACL,MAAA;AAAA,IACA;AAAA,GACF;AACF;AAOO,SAAS,uBAAuB,MAAqE,EAAA;AArC5G,EAAA,IAAA,EAAA,EAAA,EAAA;AAsCE,EAAI,IAAA,CAAC,MAAQ,EAAA,OAAO,EAAC;AACrB,EAAI,IAAA;AACF,IAAM,MAAA,IAAA,GAAO,OAAO,SAAkC,CAAA;AAAA,MACpD,KAAO,EAAA,0BAAA;AAAA,MACP,SAAW,EAAA;AAAA,QACT,MAAA,EAAQ,mBAAmB,CAAC;AAAA;AAC9B,KACD,CAAA;AACD,IAAA,OAAA,CAAA,CAAQ,EAAM,GAAA,CAAA,EAAA,GAAA,IAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,IAAA,CAAA,kBAAA,KAAN,IAA0B,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,KAAA,KAA1B,IAAmC,GAAA,EAAA,GAAA,EAAI,EAAA,MAAA,CAAO,CAAC,GAAA,KAAmC,OAAQ,CAAA,GAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,GAAA,CAAK,SAAS,CAAC,CAAA;AAAA,GAC3G,CAAA,OAAA,CAAA,EAAA;AACN,IAAA,OAAO,EAAC;AAAA;AAEZ;AACgB,SAAA,uBAAA,CAAwB,QAA+C,MAAuC,EAAA;AAC5H,EAAA,IAAI,CAAC,MAAQ,EAAA;AACb,EAAA,MAAA,CAAO,UAAW,CAAA;AAAA,IAChB,KAAO,EAAA,0BAAA;AAAA,IACP,SAAW,EAAA;AAAA,MACT,MAAA,EAAQ,mBAAmB,CAAC;AAAA,KAC9B;AAAA,IACA,IAAM,EAAA;AAAA,MACJ,kBAAoB,EAAA;AAAA,QAClB,UAAY,EAAA,6BAAA;AAAA,QACZ,KAAA,EAAO,MAAO,CAAA,GAAA,CAAI,CAAU,KAAA,MAAA;AAAA,UAC1B,UAAY,EAAA,mBAAA;AAAA,UACZ,WAAW,KAAM,CAAA,SAAA;AAAA,UACjB,OAAO,KAAM,CAAA,KAAA;AAAA,UACb,SAAS,KAAM,CAAA,OAAA;AAAA,UACf,WAAW,KAAM,CAAA,SAAA;AAAA,UACjB,OAAO,KAAM,CAAA;AAAA,SACb,CAAA;AAAA;AACJ;AACF,GACD,CAAA;AACH"}
@@ -42,4 +42,17 @@ async function hydrateCanvasBoardsSnapshot(indexUrl) {
42
42
  } catch (e) {
43
43
  return null;
44
44
  }
45
- }export{hydrateCanvasBoardsSnapshot,parseCanvasBoardsSnapshot};//# sourceMappingURL=canvasBoardsSnapshot.js.map
45
+ }
46
+ function persistCanvasBoardsSnapshot(indexUrl, boards) {
47
+ const trimmed = (indexUrl || "").trim();
48
+ if (!trimmed) return;
49
+ setCachedCanvasBoards(trimmed, boards);
50
+ const raw = JSON.stringify({
51
+ url: trimmed,
52
+ boards
53
+ });
54
+ if (raw === lastWritten) return;
55
+ lastWritten = raw;
56
+ void (AsyncStorage == null ? void 0 : AsyncStorage.setItem(SNAPSHOT_KEY, raw).catch(() => {
57
+ }));
58
+ }export{hydrateCanvasBoardsSnapshot,parseCanvasBoardsSnapshot,persistCanvasBoardsSnapshot};//# sourceMappingURL=canvasBoardsSnapshot.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"canvasBoardsSnapshot.js","sources":["../../../src/features/canvas/canvasBoardsSnapshot.ts"],"sourcesContent":["import { getCachedCanvasBoards, setCachedCanvasBoards, type CanvasBoardSummary } from './surfaceIndex';\n\n// Guarded require, not a top-level import: this module ships OTA inside the\n// federated canvas remote onto host binaries we do not control, and\n// @react-native-async-storage/async-storage THROWS AT MODULE EVAL when its\n// native module is absent (\"NativeModule: AsyncStorage is null\") - which took\n// the whole remote down on binaries built before the dependency existed. Same\n// lesson as the expo-video renderer (ViewerExpose try/require): storage is a\n// best-effort cache, so degrade to memory-only instead of crashing.\ntype StorageLike = { getItem(key: string): Promise<string | null>; setItem(key: string, value: string): Promise<void> };\nlet AsyncStorage: StorageLike | null = null;\ntry {\n // eslint-disable-next-line @typescript-eslint/no-require-imports, global-require\n AsyncStorage = require('@react-native-async-storage/async-storage').default ?? null;\n} catch {\n AsyncStorage = null;\n}\n\nconst SNAPSHOT_KEY = 'yantra.canvas-boards.snapshot.v1';\n\ntype StoredSnapshot = {\n url: string;\n boards: CanvasBoardSummary[];\n};\n\nlet lastWritten = '';\n\nfunction isBoardSummary(value: unknown): value is CanvasBoardSummary {\n if (!value || typeof value !== 'object') return false;\n const row = value as CanvasBoardSummary;\n return typeof row.channelId === 'string' && row.channelId.length > 0 && Boolean(row.board);\n}\n\nexport function parseCanvasBoardsSnapshot(raw: string | null | undefined): StoredSnapshot | null {\n if (!raw) return null;\n try {\n const parsed = JSON.parse(raw) as StoredSnapshot;\n if (!parsed?.url || !Array.isArray(parsed.boards)) return null;\n const boards = parsed.boards.filter(isBoardSummary);\n return { url: parsed.url, boards };\n } catch {\n return null;\n }\n}\n\nexport async function hydrateCanvasBoardsSnapshot(indexUrl: string): Promise<CanvasBoardSummary[] | null> {\n const trimmed = (indexUrl || '').trim();\n if (!trimmed) return null;\n const memory = getCachedCanvasBoards(trimmed);\n if (memory) return memory;\n if (!AsyncStorage) return null;\n try {\n const raw = await AsyncStorage.getItem(SNAPSHOT_KEY);\n const parsed = parseCanvasBoardsSnapshot(raw);\n if (!parsed || parsed.url !== trimmed) return null;\n setCachedCanvasBoards(trimmed, parsed.boards);\n lastWritten = raw ?? lastWritten;\n return parsed.boards;\n } catch {\n return null;\n }\n}\n\nexport function persistCanvasBoardsSnapshot(indexUrl: string, boards: CanvasBoardSummary[]): void {\n const trimmed = (indexUrl || '').trim();\n if (!trimmed) return;\n setCachedCanvasBoards(trimmed, boards);\n const raw = JSON.stringify({ url: trimmed, boards } satisfies StoredSnapshot);\n if (raw === lastWritten) return;\n lastWritten = raw;\n void AsyncStorage?.setItem(SNAPSHOT_KEY, raw).catch(() => {\n /* disk write is best-effort */\n });\n}\n"],"names":[],"mappings":"4EAAA,IAAA,EAAA;AAaA,IAAI,YAAmC,GAAA,IAAA;AACvC,IAAI;AAEF,EAAA,YAAA,GAAA,CAAe,EAAQ,GAAA,OAAA,CAAA,2CAA2C,CAAE,CAAA,OAAA,KAArD,IAAgE,GAAA,EAAA,GAAA,IAAA;AACjF,CAAQ,CAAA,OAAA,CAAA,EAAA;AACN,EAAe,YAAA,GAAA,IAAA;AACjB;AACA,MAAM,YAAe,GAAA,kCAAA;AAKrB,IAAI,WAAc,GAAA,EAAA;AAClB,SAAS,eAAe,KAA6C,EAAA;AACnE,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,UAAiB,OAAA,KAAA;AAChD,EAAA,MAAM,GAAM,GAAA,KAAA;AACZ,EAAO,OAAA,OAAO,GAAI,CAAA,SAAA,KAAc,QAAY,IAAA,GAAA,CAAI,UAAU,MAAS,GAAA,CAAA,IAAK,OAAQ,CAAA,GAAA,CAAI,KAAK,CAAA;AAC3F;AACO,SAAS,0BAA0B,GAAuD,EAAA;AAC/F,EAAI,IAAA,CAAC,KAAY,OAAA,IAAA;AACjB,EAAI,IAAA;AACF,IAAM,MAAA,MAAA,GAAS,IAAK,CAAA,KAAA,CAAM,GAAG,CAAA;AAC7B,IAAI,IAAA,EAAC,iCAAQ,GAAO,CAAA,IAAA,CAAC,MAAM,OAAQ,CAAA,MAAA,CAAO,MAAM,CAAA,EAAU,OAAA,IAAA;AAC1D,IAAA,MAAM,MAAS,GAAA,MAAA,CAAO,MAAO,CAAA,MAAA,CAAO,cAAc,CAAA;AAClD,IAAO,OAAA;AAAA,MACL,KAAK,MAAO,CAAA,GAAA;AAAA,MACZ;AAAA,KACF;AAAA,GACM,CAAA,OAAA,CAAA,EAAA;AACN,IAAO,OAAA,IAAA;AAAA;AAEX;AACA,eAAsB,4BAA4B,QAAwD,EAAA;AACxG,EAAM,MAAA,OAAA,GAAA,CAAW,QAAY,IAAA,EAAA,EAAI,IAAK,EAAA;AACtC,EAAI,IAAA,CAAC,SAAgB,OAAA,IAAA;AACrB,EAAM,MAAA,MAAA,GAAS,sBAAsB,OAAO,CAAA;AAC5C,EAAA,IAAI,QAAe,OAAA,MAAA;AACnB,EAAI,IAAA,CAAC,cAAqB,OAAA,IAAA;AAC1B,EAAI,IAAA;AACF,IAAA,MAAM,GAAM,GAAA,MAAM,YAAa,CAAA,OAAA,CAAQ,YAAY,CAAA;AACnD,IAAM,MAAA,MAAA,GAAS,0BAA0B,GAAG,CAAA;AAC5C,IAAA,IAAI,CAAC,MAAA,IAAU,MAAO,CAAA,GAAA,KAAQ,SAAgB,OAAA,IAAA;AAC9C,IAAsB,qBAAA,CAAA,OAAA,EAAS,OAAO,MAAM,CAAA;AAC5C,IAAA,WAAA,GAAc,GAAO,IAAA,IAAA,GAAA,GAAA,GAAA,WAAA;AACrB,IAAA,OAAO,MAAO,CAAA,MAAA;AAAA,GACR,CAAA,OAAA,CAAA,EAAA;AACN,IAAO,OAAA,IAAA;AAAA;AAEX"}
1
+ {"version":3,"file":"canvasBoardsSnapshot.js","sources":["../../../src/features/canvas/canvasBoardsSnapshot.ts"],"sourcesContent":["import { getCachedCanvasBoards, setCachedCanvasBoards, type CanvasBoardSummary } from './surfaceIndex';\n\n// Guarded require, not a top-level import: this module ships OTA inside the\n// federated canvas remote onto host binaries we do not control, and\n// @react-native-async-storage/async-storage THROWS AT MODULE EVAL when its\n// native module is absent (\"NativeModule: AsyncStorage is null\") - which took\n// the whole remote down on binaries built before the dependency existed. Same\n// lesson as the expo-video renderer (ViewerExpose try/require): storage is a\n// best-effort cache, so degrade to memory-only instead of crashing.\ntype StorageLike = { getItem(key: string): Promise<string | null>; setItem(key: string, value: string): Promise<void> };\nlet AsyncStorage: StorageLike | null = null;\ntry {\n // eslint-disable-next-line @typescript-eslint/no-require-imports, global-require\n AsyncStorage = require('@react-native-async-storage/async-storage').default ?? null;\n} catch {\n AsyncStorage = null;\n}\n\nconst SNAPSHOT_KEY = 'yantra.canvas-boards.snapshot.v1';\n\ntype StoredSnapshot = {\n url: string;\n boards: CanvasBoardSummary[];\n};\n\nlet lastWritten = '';\n\nfunction isBoardSummary(value: unknown): value is CanvasBoardSummary {\n if (!value || typeof value !== 'object') return false;\n const row = value as CanvasBoardSummary;\n return typeof row.channelId === 'string' && row.channelId.length > 0 && Boolean(row.board);\n}\n\nexport function parseCanvasBoardsSnapshot(raw: string | null | undefined): StoredSnapshot | null {\n if (!raw) return null;\n try {\n const parsed = JSON.parse(raw) as StoredSnapshot;\n if (!parsed?.url || !Array.isArray(parsed.boards)) return null;\n const boards = parsed.boards.filter(isBoardSummary);\n return { url: parsed.url, boards };\n } catch {\n return null;\n }\n}\n\nexport async function hydrateCanvasBoardsSnapshot(indexUrl: string): Promise<CanvasBoardSummary[] | null> {\n const trimmed = (indexUrl || '').trim();\n if (!trimmed) return null;\n const memory = getCachedCanvasBoards(trimmed);\n if (memory) return memory;\n if (!AsyncStorage) return null;\n try {\n const raw = await AsyncStorage.getItem(SNAPSHOT_KEY);\n const parsed = parseCanvasBoardsSnapshot(raw);\n if (!parsed || parsed.url !== trimmed) return null;\n setCachedCanvasBoards(trimmed, parsed.boards);\n lastWritten = raw ?? lastWritten;\n return parsed.boards;\n } catch {\n return null;\n }\n}\n\nexport function persistCanvasBoardsSnapshot(indexUrl: string, boards: CanvasBoardSummary[]): void {\n const trimmed = (indexUrl || '').trim();\n if (!trimmed) return;\n setCachedCanvasBoards(trimmed, boards);\n const raw = JSON.stringify({ url: trimmed, boards } satisfies StoredSnapshot);\n if (raw === lastWritten) return;\n lastWritten = raw;\n void AsyncStorage?.setItem(SNAPSHOT_KEY, raw).catch(() => {\n /* disk write is best-effort */\n });\n}\n"],"names":[],"mappings":"4EAAA,IAAA,EAAA;AAaA,IAAI,YAAmC,GAAA,IAAA;AACvC,IAAI;AAEF,EAAA,YAAA,GAAA,CAAe,EAAQ,GAAA,OAAA,CAAA,2CAA2C,CAAE,CAAA,OAAA,KAArD,IAAgE,GAAA,EAAA,GAAA,IAAA;AACjF,CAAQ,CAAA,OAAA,CAAA,EAAA;AACN,EAAe,YAAA,GAAA,IAAA;AACjB;AACA,MAAM,YAAe,GAAA,kCAAA;AAKrB,IAAI,WAAc,GAAA,EAAA;AAClB,SAAS,eAAe,KAA6C,EAAA;AACnE,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,UAAiB,OAAA,KAAA;AAChD,EAAA,MAAM,GAAM,GAAA,KAAA;AACZ,EAAO,OAAA,OAAO,GAAI,CAAA,SAAA,KAAc,QAAY,IAAA,GAAA,CAAI,UAAU,MAAS,GAAA,CAAA,IAAK,OAAQ,CAAA,GAAA,CAAI,KAAK,CAAA;AAC3F;AACO,SAAS,0BAA0B,GAAuD,EAAA;AAC/F,EAAI,IAAA,CAAC,KAAY,OAAA,IAAA;AACjB,EAAI,IAAA;AACF,IAAM,MAAA,MAAA,GAAS,IAAK,CAAA,KAAA,CAAM,GAAG,CAAA;AAC7B,IAAI,IAAA,EAAC,iCAAQ,GAAO,CAAA,IAAA,CAAC,MAAM,OAAQ,CAAA,MAAA,CAAO,MAAM,CAAA,EAAU,OAAA,IAAA;AAC1D,IAAA,MAAM,MAAS,GAAA,MAAA,CAAO,MAAO,CAAA,MAAA,CAAO,cAAc,CAAA;AAClD,IAAO,OAAA;AAAA,MACL,KAAK,MAAO,CAAA,GAAA;AAAA,MACZ;AAAA,KACF;AAAA,GACM,CAAA,OAAA,CAAA,EAAA;AACN,IAAO,OAAA,IAAA;AAAA;AAEX;AACA,eAAsB,4BAA4B,QAAwD,EAAA;AACxG,EAAM,MAAA,OAAA,GAAA,CAAW,QAAY,IAAA,EAAA,EAAI,IAAK,EAAA;AACtC,EAAI,IAAA,CAAC,SAAgB,OAAA,IAAA;AACrB,EAAM,MAAA,MAAA,GAAS,sBAAsB,OAAO,CAAA;AAC5C,EAAA,IAAI,QAAe,OAAA,MAAA;AACnB,EAAI,IAAA,CAAC,cAAqB,OAAA,IAAA;AAC1B,EAAI,IAAA;AACF,IAAA,MAAM,GAAM,GAAA,MAAM,YAAa,CAAA,OAAA,CAAQ,YAAY,CAAA;AACnD,IAAM,MAAA,MAAA,GAAS,0BAA0B,GAAG,CAAA;AAC5C,IAAA,IAAI,CAAC,MAAA,IAAU,MAAO,CAAA,GAAA,KAAQ,SAAgB,OAAA,IAAA;AAC9C,IAAsB,qBAAA,CAAA,OAAA,EAAS,OAAO,MAAM,CAAA;AAC5C,IAAA,WAAA,GAAc,GAAO,IAAA,IAAA,GAAA,GAAA,GAAA,WAAA;AACrB,IAAA,OAAO,MAAO,CAAA,MAAA;AAAA,GACR,CAAA,OAAA,CAAA,EAAA;AACN,IAAO,OAAA,IAAA;AAAA;AAEX;AACgB,SAAA,2BAAA,CAA4B,UAAkB,MAAoC,EAAA;AAChG,EAAM,MAAA,OAAA,GAAA,CAAW,QAAY,IAAA,EAAA,EAAI,IAAK,EAAA;AACtC,EAAA,IAAI,CAAC,OAAS,EAAA;AACd,EAAA,qBAAA,CAAsB,SAAS,MAAM,CAAA;AACrC,EAAM,MAAA,GAAA,GAAM,KAAK,SAAU,CAAA;AAAA,IACzB,GAAK,EAAA,OAAA;AAAA,IACL;AAAA,GACwB,CAAA;AAC1B,EAAA,IAAI,QAAQ,WAAa,EAAA;AACzB,EAAc,WAAA,GAAA,GAAA;AACd,EAAA,MAAK,YAAc,IAAA,IAAA,GAAA,MAAA,GAAA,YAAA,CAAA,OAAA,CAAQ,YAAc,EAAA,GAAA,CAAA,CAAK,MAAM,MAAM;AAAA,GAE1D,CAAA,CAAA;AACF"}
@@ -0,0 +1,38 @@
1
+ function isStructuredCanvasPrompt(text) {
2
+ const t = text.trim();
3
+ if (t.startsWith("{") && /"(instruction|type|prompt)"/.test(t)) return true;
4
+ return t.length > 280;
5
+ }
6
+ function canvasComposerSeed(template) {
7
+ if (isStructuredCanvasPrompt(template.prompt)) {
8
+ return (template.description || template.title).trim();
9
+ }
10
+ return template.prompt;
11
+ }
12
+ function canvasUserTurnLabel(text, fallbackTitle) {
13
+ const t = text.trim();
14
+ if (fallbackTitle && (isStructuredCanvasPrompt(t) || t === fallbackTitle)) return fallbackTitle;
15
+ if (t.startsWith("{")) {
16
+ try {
17
+ const parsed = JSON.parse(t);
18
+ const instruction = typeof parsed.instruction === "string" ? parsed.instruction.trim() : "";
19
+ if (instruction) return instruction.length > 160 ? `${instruction.slice(0, 157)}\u2026` : instruction;
20
+ if (typeof parsed.type === "string" && parsed.type.trim()) return parsed.type.trim();
21
+ } catch (e) {
22
+ }
23
+ return fallbackTitle || "Template prompt";
24
+ }
25
+ if (t.length > 220) return `${t.slice(0, 180).trim()}\u2026`;
26
+ return t;
27
+ }
28
+ function canvasAssistantReply(lane, title) {
29
+ const label = title.trim() || lane;
30
+ if (lane === "video") return `Here's your video \u2014 \u201C${label}\u201D landed on the canvas. Want me to tweak anything?`;
31
+ if (lane === "audio") return `Here's your audio \u2014 \u201C${label}\u201D landed on the canvas. Want me to tweak anything?`;
32
+ return `Here's your ${label} \u2014 it landed on the canvas. Want me to tweak anything?`;
33
+ }
34
+ function mimeForCanvasLane(lane) {
35
+ if (lane === "video") return "video/mp4";
36
+ if (lane === "audio") return "audio/mpeg";
37
+ return "image/png";
38
+ }export{canvasAssistantReply,canvasComposerSeed,canvasUserTurnLabel,isStructuredCanvasPrompt,mimeForCanvasLane};//# sourceMappingURL=canvasChatDisplay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvasChatDisplay.js","sources":["../../../src/features/canvas/canvasChatDisplay.ts"],"sourcesContent":["import type { CanvasChatLane } from './canvasAgentChat';\n\nexport function isStructuredCanvasPrompt(text: string): boolean {\n const t = text.trim();\n if (t.startsWith('{') && /\"(instruction|type|prompt)\"/.test(t)) return true;\n return t.length > 280;\n}\n\nexport function canvasComposerSeed(template: { title: string; description?: string; prompt: string }): string {\n if (isStructuredCanvasPrompt(template.prompt)) {\n return (template.description || template.title).trim();\n }\n return template.prompt;\n}\n\nexport function canvasUserTurnLabel(text: string, fallbackTitle?: string): string {\n const t = text.trim();\n if (fallbackTitle && (isStructuredCanvasPrompt(t) || t === fallbackTitle)) return fallbackTitle;\n if (t.startsWith('{')) {\n try {\n const parsed = JSON.parse(t) as { instruction?: unknown; type?: unknown };\n const instruction = typeof parsed.instruction === 'string' ? parsed.instruction.trim() : '';\n if (instruction) return instruction.length > 160 ? `${instruction.slice(0, 157)}…` : instruction;\n if (typeof parsed.type === 'string' && parsed.type.trim()) return parsed.type.trim();\n } catch {\n /* not json */\n }\n return fallbackTitle || 'Template prompt';\n }\n if (t.length > 220) return `${t.slice(0, 180).trim()}…`;\n return t;\n}\n\nexport function canvasAssistantReply(lane: CanvasChatLane, title: string): string {\n const label = title.trim() || lane;\n if (lane === 'video') return `Here's your video — “${label}” landed on the canvas. Want me to tweak anything?`;\n if (lane === 'audio') return `Here's your audio — “${label}” landed on the canvas. Want me to tweak anything?`;\n return `Here's your ${label} — it landed on the canvas. Want me to tweak anything?`;\n}\n\nexport function mimeForCanvasLane(lane: CanvasChatLane): string {\n if (lane === 'video') return 'video/mp4';\n if (lane === 'audio') return 'audio/mpeg';\n return 'image/png';\n}\n"],"names":[],"mappings":"AACO,SAAS,yBAAyB,IAAuB,EAAA;AAC9D,EAAM,MAAA,CAAA,GAAI,KAAK,IAAK,EAAA;AACpB,EAAI,IAAA,CAAA,CAAE,WAAW,GAAG,CAAA,IAAK,8BAA8B,IAAK,CAAA,CAAC,GAAU,OAAA,IAAA;AACvE,EAAA,OAAO,EAAE,MAAS,GAAA,GAAA;AACpB;AACO,SAAS,mBAAmB,QAIxB,EAAA;AACT,EAAI,IAAA,wBAAA,CAAyB,QAAS,CAAA,MAAM,CAAG,EAAA;AAC7C,IAAA,OAAA,CAAQ,QAAS,CAAA,WAAA,IAAe,QAAS,CAAA,KAAA,EAAO,IAAK,EAAA;AAAA;AAEvD,EAAA,OAAO,QAAS,CAAA,MAAA;AAClB;AACgB,SAAA,mBAAA,CAAoB,MAAc,aAAgC,EAAA;AAChF,EAAM,MAAA,CAAA,GAAI,KAAK,IAAK,EAAA;AACpB,EAAA,IAAI,kBAAkB,wBAAyB,CAAA,CAAC,CAAK,IAAA,CAAA,KAAM,gBAAuB,OAAA,aAAA;AAClF,EAAI,IAAA,CAAA,CAAE,UAAW,CAAA,GAAG,CAAG,EAAA;AACrB,IAAI,IAAA;AACF,MAAM,MAAA,MAAA,GAAS,IAAK,CAAA,KAAA,CAAM,CAAC,CAAA;AAI3B,MAAM,MAAA,WAAA,GAAc,OAAO,MAAO,CAAA,WAAA,KAAgB,WAAW,MAAO,CAAA,WAAA,CAAY,MAAS,GAAA,EAAA;AACzF,MAAI,IAAA,WAAA,EAAoB,OAAA,WAAA,CAAY,MAAS,GAAA,GAAA,GAAM,CAAG,EAAA,WAAA,CAAY,KAAM,CAAA,CAAA,EAAG,GAAG,CAAC,CAAM,MAAA,CAAA,GAAA,WAAA;AACrF,MAAI,IAAA,OAAO,MAAO,CAAA,IAAA,KAAS,QAAY,IAAA,MAAA,CAAO,IAAK,CAAA,IAAA,EAAQ,EAAA,OAAO,MAAO,CAAA,IAAA,CAAK,IAAK,EAAA;AAAA,KAC7E,CAAA,OAAA,CAAA,EAAA;AAAA;AAGR,IAAA,OAAO,aAAiB,IAAA,iBAAA;AAAA;AAE1B,EAAI,IAAA,CAAA,CAAE,MAAS,GAAA,GAAA,EAAY,OAAA,CAAA,EAAG,CAAE,CAAA,KAAA,CAAM,CAAG,EAAA,GAAG,CAAE,CAAA,IAAA,EAAM,CAAA,MAAA,CAAA;AACpD,EAAO,OAAA,CAAA;AACT;AACgB,SAAA,oBAAA,CAAqB,MAAsB,KAAuB,EAAA;AAChF,EAAM,MAAA,KAAA,GAAQ,KAAM,CAAA,IAAA,EAAU,IAAA,IAAA;AAC9B,EAAA,IAAI,IAAS,KAAA,OAAA,EAAgB,OAAA,CAAA,+BAAA,EAAwB,KAAK,CAAA,uDAAA,CAAA;AAC1D,EAAA,IAAI,IAAS,KAAA,OAAA,EAAgB,OAAA,CAAA,+BAAA,EAAwB,KAAK,CAAA,uDAAA,CAAA;AAC1D,EAAA,OAAO,eAAe,KAAK,CAAA,2DAAA,CAAA;AAC7B;AACO,SAAS,kBAAkB,IAA8B,EAAA;AAC9D,EAAI,IAAA,IAAA,KAAS,SAAgB,OAAA,WAAA;AAC7B,EAAI,IAAA,IAAA,KAAS,SAAgB,OAAA,YAAA;AAC7B,EAAO,OAAA,WAAA;AACT"}
@@ -0,0 +1,219 @@
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 TEMPLATE_SOURCES = {
21
+ image: {
22
+ label: "Image",
23
+ connector: "yantra-image-generation",
24
+ action: "YANTRA_IMAGE_LIST_TEMPLATES",
25
+ configKey: "marketplace.templates.imageGeneration"
26
+ },
27
+ video: {
28
+ label: "Video",
29
+ connector: "yantra-video-generation",
30
+ action: "YANTRA_VIDEO_LIST_TEMPLATES",
31
+ configKey: "marketplace.templates.videoGeneration"
32
+ },
33
+ audio: {
34
+ label: "Audio",
35
+ connector: "yantra-audio",
36
+ action: "YANTRA_AUDIO_LIST_TEMPLATES",
37
+ configKey: "marketplace.templates.audioGeneration"
38
+ }
39
+ };
40
+ const STREAM_HOST = /cloudflarestream|videodelivery\.net/i;
41
+ const PROGRESSIVE_SAMPLE = /amazonaws\.com|\.mp4(?:\?|#|$)/i;
42
+ function stripPreviewFragment(url) {
43
+ const hash = url.indexOf("#");
44
+ return hash >= 0 ? url.slice(0, hash) : url;
45
+ }
46
+ function playableTemplatePreviewUrl(...candidates) {
47
+ const urls = candidates.map((value) => typeof value === "string" ? value.trim() : "").filter(Boolean);
48
+ const picked = urls.find((url) => PROGRESSIVE_SAMPLE.test(url) && !STREAM_HOST.test(url)) || urls.find((url) => !STREAM_HOST.test(url));
49
+ return picked ? stripPreviewFragment(picked) : void 0;
50
+ }
51
+ const CANVAS_AUDIO_TEMPLATES = [{
52
+ id: "audio-podcast-intro",
53
+ kind: "audio",
54
+ title: "Podcast intro",
55
+ description: "Short upbeat intro sting with a modern feel",
56
+ prompt: "An upbeat 10-second podcast intro sting, modern electronic feel, warm synth chords, light percussion build, clean ending"
57
+ }, {
58
+ id: "audio-ambient-loop",
59
+ kind: "audio",
60
+ title: "Ambient loop",
61
+ description: "Calm loopable background bed",
62
+ prompt: "A calm ambient background loop, soft evolving pads, gentle piano accents, vinyl warmth, loopable, relaxing focus music"
63
+ }, {
64
+ id: "audio-voiceover-line",
65
+ kind: "audio",
66
+ title: "Voiceover line",
67
+ description: "Natural narration of a line you provide",
68
+ prompt: 'A natural, warm voiceover narration saying: "[your line here]", medium pace, friendly professional tone'
69
+ }];
70
+ const str = (v) => typeof v === "string" ? v : "";
71
+ function normalizeMarketplaceTemplates(raw) {
72
+ var _a;
73
+ const data = raw != null ? raw : {};
74
+ const inner = (_a = data.data) != null ? _a : data;
75
+ const list = Array.isArray(inner.templates) ? inner.templates : Array.isArray(inner) ? inner : [];
76
+ return list.map((t) => ({
77
+ id: str(t.id) || str(t.templateId),
78
+ title: str(t.title) || str(t.name) || str(t.id) || "Template",
79
+ description: str(t.description) || void 0,
80
+ cover: str(t.cover) || str(t.coverImageUrl) || void 0,
81
+ prompt: str(t.prompt) || void 0
82
+ })).filter((t) => Boolean(t.id));
83
+ }
84
+ function matchCanvasTemplates(list, query) {
85
+ const q = (query != null ? query : "").trim().toLowerCase();
86
+ if (!q) return list;
87
+ return list.filter((t) => {
88
+ var _a, _b, _c;
89
+ return [t.title, (_a = t.description) != null ? _a : "", t.prompt, (_b = t.category) != null ? _b : "", ...(_c = t.tags) != null ? _c : []].some((s) => s.toLowerCase().includes(q));
90
+ });
91
+ }
92
+ function mapDesignCorpus(kind, corpus) {
93
+ return corpus.filter((t) => t.kind === kind).map((t) => ({
94
+ id: t.id,
95
+ kind: t.kind,
96
+ title: t.title,
97
+ description: t.description,
98
+ cover: t.cover,
99
+ coverVideo: playableTemplatePreviewUrl(t.previewVideoUrl),
100
+ prompt: t.prompt,
101
+ category: t.category,
102
+ tags: t.tags
103
+ }));
104
+ }
105
+ function mergeTemplateLane(kind, marketplace, corpus) {
106
+ const source = TEMPLATE_SOURCES[kind];
107
+ const remote = marketplace.map((t) => ({
108
+ id: t.id,
109
+ kind,
110
+ title: t.title,
111
+ description: t.description,
112
+ cover: t.cover,
113
+ configKey: source.configKey,
114
+ prompt: t.prompt || t.description || t.title
115
+ }));
116
+ const ids = new Set(remote.map((t) => t.id));
117
+ return [...remote, ...corpus.filter((t) => !ids.has(t.id))];
118
+ }
119
+ async function loadCanvasTemplateLane(kind, query, runAction, corpus) {
120
+ const source = TEMPLATE_SOURCES[kind];
121
+ let marketplace = [];
122
+ if (runAction) {
123
+ try {
124
+ const raw = await runAction(source.connector, source.action, {});
125
+ marketplace = normalizeMarketplaceTemplates(raw);
126
+ } catch (err) {
127
+ if (corpus.length === 0) throw err;
128
+ marketplace = [];
129
+ }
130
+ }
131
+ return matchCanvasTemplates(mergeTemplateLane(kind, marketplace, corpus), query);
132
+ }
133
+ const STUDIO_TEMPLATE_PAGE_SIZE = 10;
134
+ function pageTemplateList(list, query, offset, limit = STUDIO_TEMPLATE_PAGE_SIZE) {
135
+ const matched = matchCanvasTemplates([...list], query);
136
+ const rows = matched.slice(offset, offset + limit);
137
+ return {
138
+ rows,
139
+ hasMore: offset + rows.length < matched.length
140
+ };
141
+ }
142
+ function normalizeStudioTemplatePage(raw, pageSize = STUDIO_TEMPLATE_PAGE_SIZE) {
143
+ var _a;
144
+ const data = raw != null ? raw : {};
145
+ const inner = (_a = data.data) != null ? _a : data;
146
+ const list = Array.isArray(inner.templates) ? inner.templates : Array.isArray(inner) ? inner : [];
147
+ const rows = list.map((t) => ({
148
+ id: str(t.id) || str(t.templateId),
149
+ kind: "video",
150
+ title: str(t.name) || str(t.title) || str(t.id) || "Template",
151
+ description: str(t.description) || void 0,
152
+ cover: str(t.cover) || str(t.coverImageUrl) || void 0,
153
+ coverVideo: playableTemplatePreviewUrl(str(t.coverVideo), str(t.previewVideoUrl), str(t.videoUrl)),
154
+ aspect: str(t.aspect) || void 0,
155
+ prompt: str(t.prompt) || str(t.description) || str(t.name) || str(t.title),
156
+ category: str(t.category) || void 0,
157
+ tags: Array.isArray(t.tags) ? t.tags.filter((tag) => typeof tag === "string") : void 0
158
+ })).filter((t) => Boolean(t.id));
159
+ const hasMore = inner.hasMore === true || rows.length >= pageSize;
160
+ return {
161
+ rows,
162
+ hasMore
163
+ };
164
+ }
165
+ function uniqueTemplatePage(already, incoming, corpus, query, pageSize = STUDIO_TEMPLATE_PAGE_SIZE) {
166
+ const seen = new Set(already.map((row) => row.id));
167
+ const unique = incoming.filter((row) => !seen.has(row.id));
168
+ if (unique.length > 0) {
169
+ return {
170
+ rows: unique,
171
+ hasMore: incoming.length >= pageSize
172
+ };
173
+ }
174
+ const rest = matchCanvasTemplates([...corpus], query).filter((row) => !seen.has(row.id));
175
+ return {
176
+ rows: rest.slice(0, pageSize),
177
+ hasMore: rest.length > pageSize
178
+ };
179
+ }
180
+ async function loadStudioTemplatePage(query, offset, runAction, corpus, limit = STUDIO_TEMPLATE_PAGE_SIZE) {
181
+ const needle = (query == null ? void 0 : query.trim()) || void 0;
182
+ if (runAction) {
183
+ try {
184
+ const raw = await runAction("yantra-video-generation", "YANTRA_VIDEO_LIST_STUDIO_TEMPLATES", __spreadProps(__spreadValues({}, needle ? {
185
+ query: needle
186
+ } : {}), {
187
+ limit,
188
+ offset,
189
+ skip: offset,
190
+ page: Math.floor(offset / limit) + 1
191
+ }));
192
+ const page = normalizeStudioTemplatePage(raw, limit);
193
+ if (offset === 0 && page.rows.length === 0 && !needle) {
194
+ return pageTemplateList(corpus, needle, offset, limit);
195
+ }
196
+ return page;
197
+ } catch (e) {
198
+ if (offset === 0) return pageTemplateList(corpus, needle, offset, limit);
199
+ return {
200
+ rows: [],
201
+ hasMore: false
202
+ };
203
+ }
204
+ }
205
+ return pageTemplateList(corpus, needle, offset, limit);
206
+ }
207
+ const CANVAS_SUGGESTIONS = [{
208
+ id: "sky",
209
+ label: "Golden-hour skyline",
210
+ prompt: "A cinematic city skyline at golden hour, warm light, drifting clouds, 16:9"
211
+ }, {
212
+ id: "product",
213
+ label: "Minimal product shot",
214
+ prompt: "A minimal studio shot of matte-black wireless headphones on a light gray backdrop, soft shadows"
215
+ }, {
216
+ id: "nook",
217
+ label: "Cozy reading nook",
218
+ prompt: "A cozy reading nook by a rainy window, warm lamp light, soft film grain"
219
+ }];export{CANVAS_AUDIO_TEMPLATES,CANVAS_SUGGESTIONS,STUDIO_TEMPLATE_PAGE_SIZE,TEMPLATE_SOURCES,loadCanvasTemplateLane,loadStudioTemplatePage,mapDesignCorpus,matchCanvasTemplates,mergeTemplateLane,normalizeMarketplaceTemplates,normalizeStudioTemplatePage,pageTemplateList,playableTemplatePreviewUrl,stripPreviewFragment,uniqueTemplatePage};//# sourceMappingURL=canvasChatTemplates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvasChatTemplates.js","sources":["../../../src/features/canvas/canvasChatTemplates.ts"],"sourcesContent":["/**\n * Canvas agent prompt templates — twin of canvas-surface `canvasChatData` + `templatesRpc`.\n */\nimport type { CanvasChatLane } from './canvasAgentChat';\nimport type { RunMediaAction } from './videoEditor/mediaActions';\nimport type { DesignPromptTemplate } from './designPromptTemplates';\n\nexport const TEMPLATE_SOURCES: Record<\n CanvasChatLane,\n {\n label: string;\n connector: 'yantra-image-generation' | 'yantra-video-generation' | 'yantra-audio';\n action: string;\n configKey: string;\n }\n> = {\n image: {\n label: 'Image',\n connector: 'yantra-image-generation',\n action: 'YANTRA_IMAGE_LIST_TEMPLATES',\n configKey: 'marketplace.templates.imageGeneration',\n },\n video: {\n label: 'Video',\n connector: 'yantra-video-generation',\n action: 'YANTRA_VIDEO_LIST_TEMPLATES',\n configKey: 'marketplace.templates.videoGeneration',\n },\n audio: {\n label: 'Audio',\n connector: 'yantra-audio',\n action: 'YANTRA_AUDIO_LIST_TEMPLATES',\n configKey: 'marketplace.templates.audioGeneration',\n },\n};\n\nexport interface CanvasPromptTemplate {\n id: string;\n kind: CanvasChatLane;\n title: string;\n description?: string;\n prompt: string;\n cover?: string;\n coverVideo?: string;\n /** Studio catalog aspect (`9:16` / `16:9`) — same field web GENERATE sends. */\n aspect?: string;\n category?: string;\n tags?: string[];\n configKey?: string;\n /** Full InVideo config when the catalog row embeds it. */\n renderConfig?: Record<string, unknown>;\n /** Per-aspect CDN links when the row only carries a summary. */\n configUrls?: Record<string, string>;\n defaultAspect?: string;\n}\n\n/**\n * Phone players cannot use Cloudflare Stream's `/downloads/default.mp4`\n * (those URLs 404). HLS `manifest/video.m3u8` is the playable twin; leave\n * other hosts (GitHub, HeyGen, storage) unchanged.\n */\nexport function nativeStudioPreviewUrl(src: string): string {\n const id = cloudflareStreamId(src);\n if (id) return `https://videodelivery.net/${id}/manifest/video.m3u8`;\n return src;\n}\n\nexport function cloudflareStreamId(src: string): string | null {\n return (\n src.match(/iframe\\.videodelivery\\.net\\/([a-f0-9]{32})/i)?.[1] ??\n src.match(/(?:cloudflarestream\\.com|videodelivery\\.net)\\/([a-f0-9]{32})/i)?.[1] ??\n null\n );\n}\n\nconst STREAM_HOST = /cloudflarestream|videodelivery\\.net/i;\nconst PROGRESSIVE_SAMPLE = /amazonaws\\.com|\\.mp4(?:\\?|#|$)/i;\n\n/** Twin of canvas `stripPreviewFragment` — iOS will not fetch `file.mp4#preview`. */\nexport function stripPreviewFragment(url: string): string {\n const hash = url.indexOf('#');\n return hash >= 0 ? url.slice(0, hash) : url;\n}\n\n/**\n * Web PreviewStage plays a progressive mp4 (S3 `…mp4#preview`). Stream hosts\n * 404 or domain-lock on the phone — never use them when an mp4 exists, and\n * never return a Stream URL (that is the slashed-play / domain-error player).\n */\nexport function playableTemplatePreviewUrl(...candidates: Array<string | undefined>): string | undefined {\n const urls = candidates.map((value) => (typeof value === 'string' ? value.trim() : '')).filter(Boolean);\n const picked =\n urls.find((url) => PROGRESSIVE_SAMPLE.test(url) && !STREAM_HOST.test(url)) ||\n urls.find((url) => !STREAM_HOST.test(url));\n return picked ? stripPreviewFragment(picked) : undefined;\n}\n\n/** Cloudflare Stream's HTML player — the web lane's working path, not AVPlayer. */\nexport function studioPreviewIframeUrl(src: string): string | null {\n const id = cloudflareStreamId(src);\n if (!id) return null;\n return `https://iframe.videodelivery.net/${id}?autoplay=true&loop=true&controls=true&preload=auto`;\n}\n\nexport const CANVAS_AUDIO_TEMPLATES: CanvasPromptTemplate[] = [\n {\n id: 'audio-podcast-intro',\n kind: 'audio',\n title: 'Podcast intro',\n description: 'Short upbeat intro sting with a modern feel',\n prompt: 'An upbeat 10-second podcast intro sting, modern electronic feel, warm synth chords, light percussion build, clean ending',\n },\n {\n id: 'audio-ambient-loop',\n kind: 'audio',\n title: 'Ambient loop',\n description: 'Calm loopable background bed',\n prompt: 'A calm ambient background loop, soft evolving pads, gentle piano accents, vinyl warmth, loopable, relaxing focus music',\n },\n {\n id: 'audio-voiceover-line',\n kind: 'audio',\n title: 'Voiceover line',\n description: 'Natural narration of a line you provide',\n prompt: 'A natural, warm voiceover narration saying: \"[your line here]\", medium pace, friendly professional tone',\n },\n];\n\nconst str = (v: unknown): string => (typeof v === 'string' ? v : '');\n\nexport function normalizeMarketplaceTemplates(raw: unknown): Array<{\n id: string;\n title: string;\n description?: string;\n cover?: string;\n prompt?: string;\n}> {\n const data = (raw ?? {}) as Record<string, unknown>;\n const inner = (data.data ?? data) as Record<string, unknown>;\n const list = Array.isArray(inner.templates) ? inner.templates : Array.isArray(inner) ? inner : [];\n return (list as Array<Record<string, unknown>>)\n .map((t) => ({\n id: str(t.id) || str(t.templateId),\n title: str(t.title) || str(t.name) || str(t.id) || 'Template',\n description: str(t.description) || undefined,\n cover: str(t.cover) || str(t.coverImageUrl) || undefined,\n prompt: str(t.prompt) || undefined,\n }))\n .filter((t) => Boolean(t.id));\n}\n\nexport function matchCanvasTemplates(list: CanvasPromptTemplate[], query?: string): CanvasPromptTemplate[] {\n const q = (query ?? '').trim().toLowerCase();\n if (!q) return list;\n return list.filter((t) =>\n [t.title, t.description ?? '', t.prompt, t.category ?? '', ...(t.tags ?? [])].some((s) =>\n s.toLowerCase().includes(q),\n ),\n );\n}\n\nexport function mapDesignCorpus(\n kind: 'image' | 'video',\n corpus: readonly DesignPromptTemplate[],\n): CanvasPromptTemplate[] {\n return corpus\n .filter((t) => t.kind === kind)\n .map((t) => ({\n id: t.id,\n kind: t.kind,\n title: t.title,\n description: t.description,\n cover: t.cover,\n coverVideo: playableTemplatePreviewUrl(t.previewVideoUrl),\n prompt: t.prompt,\n category: t.category,\n tags: t.tags,\n }));\n}\n\nexport function mergeTemplateLane(\n kind: CanvasChatLane,\n marketplace: ReturnType<typeof normalizeMarketplaceTemplates>,\n corpus: CanvasPromptTemplate[],\n): CanvasPromptTemplate[] {\n const source = TEMPLATE_SOURCES[kind];\n const remote: CanvasPromptTemplate[] = marketplace.map((t) => ({\n id: t.id,\n kind,\n title: t.title,\n description: t.description,\n cover: t.cover,\n configKey: source.configKey,\n prompt: t.prompt || t.description || t.title,\n }));\n const ids = new Set(remote.map((t) => t.id));\n return [...remote, ...corpus.filter((t) => !ids.has(t.id))];\n}\n\nexport async function loadCanvasTemplateLane(\n kind: CanvasChatLane,\n query: string | undefined,\n runAction: RunMediaAction | undefined,\n corpus: CanvasPromptTemplate[],\n): Promise<CanvasPromptTemplate[]> {\n const source = TEMPLATE_SOURCES[kind];\n let marketplace: ReturnType<typeof normalizeMarketplaceTemplates> = [];\n if (runAction) {\n try {\n const raw = await runAction(source.connector, source.action, {});\n marketplace = normalizeMarketplaceTemplates(raw);\n } catch (err) {\n if (corpus.length === 0) throw err;\n marketplace = [];\n }\n }\n return matchCanvasTemplates(mergeTemplateLane(kind, marketplace, corpus), query);\n}\n\n/** Native Templates sheet: 10 rows per fetch; scroll loads the next page. */\nexport const STUDIO_TEMPLATE_PAGE_SIZE = 10;\n\nexport function pageTemplateList(\n list: readonly CanvasPromptTemplate[],\n query: string | undefined,\n offset: number,\n limit = STUDIO_TEMPLATE_PAGE_SIZE,\n): { rows: CanvasPromptTemplate[]; hasMore: boolean } {\n const matched = matchCanvasTemplates([...list], query);\n const rows = matched.slice(offset, offset + limit);\n return { rows, hasMore: offset + rows.length < matched.length };\n}\n\nexport function normalizeStudioTemplatePage(\n raw: unknown,\n pageSize = STUDIO_TEMPLATE_PAGE_SIZE,\n): { rows: CanvasPromptTemplate[]; hasMore: boolean } {\n const data = (raw ?? {}) as Record<string, unknown>;\n const inner = (data.data ?? data) as Record<string, unknown>;\n const list = Array.isArray(inner.templates) ? inner.templates : Array.isArray(inner) ? inner : [];\n const rows: CanvasPromptTemplate[] = (list as Array<Record<string, unknown>>)\n .map((t) => ({\n id: str(t.id) || str(t.templateId),\n kind: 'video' as const,\n title: str(t.name) || str(t.title) || str(t.id) || 'Template',\n description: str(t.description) || undefined,\n cover: str(t.cover) || str(t.coverImageUrl) || undefined,\n coverVideo: playableTemplatePreviewUrl(str(t.coverVideo), str(t.previewVideoUrl), str(t.videoUrl)),\n aspect: str(t.aspect) || undefined,\n prompt: str(t.prompt) || str(t.description) || str(t.name) || str(t.title),\n category: str(t.category) || undefined,\n tags: Array.isArray(t.tags) ? t.tags.filter((tag): tag is string => typeof tag === 'string') : undefined,\n }))\n .filter((t) => Boolean(t.id));\n // A full page means another fetch. Ignore `hasMore: false` on a full page —\n // the native exec wrapper often omits/flips that flag and stopped the list at 10.\n const hasMore = inner.hasMore === true || rows.length >= pageSize;\n return { rows, hasMore };\n}\n\n/**\n * Paged video-studio catalog (web TemplatesPanel). Marketplace first; corpus\n * only on an empty first page — never splice the bundled corpus into a live\n * marketplace list (that made native show different templates after Load more).\n */\nexport function uniqueTemplatePage(\n already: readonly CanvasPromptTemplate[],\n incoming: readonly CanvasPromptTemplate[],\n corpus: readonly CanvasPromptTemplate[],\n query: string | undefined,\n pageSize = STUDIO_TEMPLATE_PAGE_SIZE,\n): { rows: CanvasPromptTemplate[]; hasMore: boolean } {\n const seen = new Set(already.map((row) => row.id));\n const unique = incoming.filter((row) => !seen.has(row.id));\n if (unique.length > 0) {\n return { rows: unique, hasMore: incoming.length >= pageSize };\n }\n const rest = matchCanvasTemplates([...corpus], query).filter((row) => !seen.has(row.id));\n return { rows: rest.slice(0, pageSize), hasMore: rest.length > pageSize };\n}\n\nexport async function loadStudioTemplatePage(\n query: string | undefined,\n offset: number,\n runAction: RunMediaAction | undefined,\n corpus: CanvasPromptTemplate[],\n limit = STUDIO_TEMPLATE_PAGE_SIZE,\n): Promise<{ rows: CanvasPromptTemplate[]; hasMore: boolean }> {\n const needle = query?.trim() || undefined;\n if (runAction) {\n try {\n const raw = await runAction('yantra-video-generation', 'YANTRA_VIDEO_LIST_STUDIO_TEMPLATES', {\n ...(needle ? { query: needle } : {}),\n limit,\n offset,\n skip: offset,\n page: Math.floor(offset / limit) + 1,\n });\n const page = normalizeStudioTemplatePage(raw, limit);\n if (offset === 0 && page.rows.length === 0 && !needle) {\n return pageTemplateList(corpus, needle, offset, limit);\n }\n return page;\n } catch {\n if (offset === 0) return pageTemplateList(corpus, needle, offset, limit);\n return { rows: [], hasMore: false };\n }\n }\n return pageTemplateList(corpus, needle, offset, limit);\n}\n\nexport const CANVAS_SUGGESTIONS = [\n {\n id: 'sky',\n label: 'Golden-hour skyline',\n prompt: 'A cinematic city skyline at golden hour, warm light, drifting clouds, 16:9',\n },\n {\n id: 'product',\n label: 'Minimal product shot',\n prompt: 'A minimal studio shot of matte-black wireless headphones on a light gray backdrop, soft shadows',\n },\n {\n id: 'nook',\n label: 'Cozy reading nook',\n prompt: 'A cozy reading nook by a rainy window, warm lamp light, soft film grain',\n },\n] as const;\n"],"names":[],"mappings":"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"}