@adminide-stack/yantra-mobile 12.0.128 → 12.0.129-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (360) hide show
  1. package/lib/compute.js +57 -1
  2. package/lib/compute.js.map +1 -1
  3. package/lib/features/agent-chat/NativeAgentChat.js +3 -2
  4. package/lib/features/agent-chat/NativeAgentChat.js.map +1 -1
  5. package/lib/features/apps/AppsCatalog.js +10 -0
  6. package/lib/features/apps/AppsCatalog.js.map +1 -1
  7. package/lib/features/apps/mobileAppCatalog.js +11 -0
  8. package/lib/features/apps/mobileAppCatalog.js.map +1 -1
  9. package/lib/features/canvas/AudioEditorExperience.js +448 -105
  10. package/lib/features/canvas/AudioEditorExperience.js.map +1 -1
  11. package/lib/features/canvas/CanvasAgentChatPane.js +33 -14
  12. package/lib/features/canvas/CanvasAgentChatPane.js.map +1 -1
  13. package/lib/features/canvas/CanvasBoardsGrid.js +493 -41
  14. package/lib/features/canvas/CanvasBoardsGrid.js.map +1 -1
  15. package/lib/features/canvas/CanvasChatResultCard.js.map +1 -1
  16. package/lib/features/canvas/CanvasEditToolsPanel.js +37 -1
  17. package/lib/features/canvas/CanvasEditToolsPanel.js.map +1 -1
  18. package/lib/features/canvas/CanvasExperience.js +237 -22
  19. package/lib/features/canvas/CanvasExperience.js.map +1 -1
  20. package/lib/features/canvas/CanvasGeneratePanel.js +119 -26
  21. package/lib/features/canvas/CanvasGeneratePanel.js.map +1 -1
  22. package/lib/features/canvas/CanvasLooksPanel.js +17 -6
  23. package/lib/features/canvas/CanvasLooksPanel.js.map +1 -1
  24. package/lib/features/canvas/CanvasTasksPanel.js +18 -1
  25. package/lib/features/canvas/CanvasTasksPanel.js.map +1 -1
  26. package/lib/features/canvas/DesignCategoryGallery.js +423 -0
  27. package/lib/features/canvas/DesignCategoryGallery.js.map +1 -0
  28. package/lib/features/canvas/ImageEditorExperience.js +763 -187
  29. package/lib/features/canvas/ImageEditorExperience.js.map +1 -1
  30. package/lib/features/canvas/SetStudioExperience.js +199 -11
  31. package/lib/features/canvas/SetStudioExperience.js.map +1 -1
  32. package/lib/features/canvas/VideoEditorExperience.js +59 -40
  33. package/lib/features/canvas/VideoEditorExperience.js.map +1 -1
  34. package/lib/features/canvas/VideoGeneratorExperience.js +134 -34
  35. package/lib/features/canvas/VideoGeneratorExperience.js.map +1 -1
  36. package/lib/features/canvas/aiEdit.js +4 -2
  37. package/lib/features/canvas/aiEdit.js.map +1 -1
  38. package/lib/features/canvas/audioEditor/AudioWaveform.js +96 -0
  39. package/lib/features/canvas/audioEditor/AudioWaveform.js.map +1 -0
  40. package/lib/features/canvas/audioEditor/audioPeaks.js +93 -0
  41. package/lib/features/canvas/audioEditor/audioPeaks.js.map +1 -0
  42. package/lib/features/canvas/canvasTaskSync.js +34 -7
  43. package/lib/features/canvas/canvasTaskSync.js.map +1 -1
  44. package/lib/features/canvas/canvasTasks.js +23 -3
  45. package/lib/features/canvas/canvasTasks.js.map +1 -1
  46. package/lib/features/canvas/canvasTheme.js +10 -24
  47. package/lib/features/canvas/canvasTheme.js.map +1 -1
  48. package/lib/features/canvas/canvasUi.js +1 -1
  49. package/lib/features/canvas/canvasUi.js.map +1 -1
  50. package/lib/features/canvas/createTiles.js +17 -9
  51. package/lib/features/canvas/createTiles.js.map +1 -1
  52. package/lib/features/canvas/deepLinks.js +35 -5
  53. package/lib/features/canvas/deepLinks.js.map +1 -1
  54. package/lib/features/canvas/designCatalog.js +165 -0
  55. package/lib/features/canvas/designCatalog.js.map +1 -0
  56. package/lib/features/canvas/designCategories.js +262 -0
  57. package/lib/features/canvas/designCategories.js.map +1 -0
  58. package/lib/features/canvas/editorControls.js +406 -0
  59. package/lib/features/canvas/editorControls.js.map +1 -0
  60. package/lib/features/canvas/generationModels.js +5 -3
  61. package/lib/features/canvas/generationModels.js.map +1 -1
  62. package/lib/features/canvas/generationTasks.js +162 -0
  63. package/lib/features/canvas/generationTasks.js.map +1 -0
  64. package/lib/features/canvas/generator/BottomSheet.js +167 -0
  65. package/lib/features/canvas/generator/BottomSheet.js.map +1 -0
  66. package/lib/features/canvas/generator/BusinessCardChatCard.js +155 -0
  67. package/lib/features/canvas/generator/BusinessCardChatCard.js.map +1 -0
  68. package/lib/features/canvas/generator/DirectorSheet.js +163 -0
  69. package/lib/features/canvas/generator/DirectorSheet.js.map +1 -0
  70. package/lib/features/canvas/generator/ReframePreview.js +122 -0
  71. package/lib/features/canvas/generator/ReframePreview.js.map +1 -0
  72. package/lib/features/canvas/generator/RunLogCard.js +119 -0
  73. package/lib/features/canvas/generator/RunLogCard.js.map +1 -0
  74. package/lib/features/canvas/generator/ShotPanel.js +261 -0
  75. package/lib/features/canvas/generator/ShotPanel.js.map +1 -0
  76. package/lib/features/canvas/generator/businessCardWidget.js +117 -0
  77. package/lib/features/canvas/generator/businessCardWidget.js.map +1 -0
  78. package/lib/features/canvas/generator/cameraVocabulary.js +142 -0
  79. package/lib/features/canvas/generator/cameraVocabulary.js.map +1 -0
  80. package/lib/features/canvas/generator/cinematicVocabulary.js +416 -0
  81. package/lib/features/canvas/generator/cinematicVocabulary.js.map +1 -0
  82. package/lib/features/canvas/generator/direction.js +41 -0
  83. package/lib/features/canvas/generator/direction.js.map +1 -0
  84. package/lib/features/canvas/generator/reframeGeometry.js +108 -0
  85. package/lib/features/canvas/generator/reframeGeometry.js.map +1 -0
  86. package/lib/features/canvas/generator/runLog.js +71 -0
  87. package/lib/features/canvas/generator/runLog.js.map +1 -0
  88. package/lib/features/canvas/generator/shot.js +133 -0
  89. package/lib/features/canvas/generator/shot.js.map +1 -0
  90. package/lib/features/canvas/generator/useShotSpec.js +87 -0
  91. package/lib/features/canvas/generator/useShotSpec.js.map +1 -0
  92. package/lib/features/canvas/home/HeroComposer.js +214 -0
  93. package/lib/features/canvas/home/HeroComposer.js.map +1 -0
  94. package/lib/features/canvas/home/HeroMonitor.js +225 -0
  95. package/lib/features/canvas/home/HeroMonitor.js.map +1 -0
  96. package/lib/features/canvas/home/LookDetail.js +185 -0
  97. package/lib/features/canvas/home/LookDetail.js.map +1 -0
  98. package/lib/features/canvas/home/LoopingVideo.js +37 -0
  99. package/lib/features/canvas/home/LoopingVideo.js.map +1 -0
  100. package/lib/features/canvas/home/TemplatesGallery.js +253 -0
  101. package/lib/features/canvas/home/TemplatesGallery.js.map +1 -0
  102. package/lib/features/canvas/home/heroShots.js +100 -0
  103. package/lib/features/canvas/home/heroShots.js.map +1 -0
  104. package/lib/features/canvas/homeWork.js +62 -3
  105. package/lib/features/canvas/homeWork.js.map +1 -1
  106. package/lib/features/canvas/imageEditor/ImageMarkup.js +195 -0
  107. package/lib/features/canvas/imageEditor/ImageMarkup.js.map +1 -0
  108. package/lib/features/canvas/imageEditor/imageEditOps.js +367 -0
  109. package/lib/features/canvas/imageEditor/imageEditOps.js.map +1 -0
  110. package/lib/features/canvas/nativeViewerRegistry.js.map +1 -1
  111. package/lib/features/canvas/rankedCatalogSearch.js +375 -0
  112. package/lib/features/canvas/rankedCatalogSearch.js.map +1 -0
  113. package/lib/features/canvas/recorder/CameraRecorderExperience.js +68 -20
  114. package/lib/features/canvas/recorder/CameraRecorderExperience.js.map +1 -1
  115. package/lib/features/canvas/recorder/RecordingReview.js +272 -0
  116. package/lib/features/canvas/recorder/RecordingReview.js.map +1 -0
  117. package/lib/features/canvas/recorder/RecordingsList.js +179 -0
  118. package/lib/features/canvas/recorder/RecordingsList.js.map +1 -0
  119. package/lib/features/canvas/recorder/recorderOps.js +99 -0
  120. package/lib/features/canvas/recorder/recorderOps.js.map +1 -0
  121. package/lib/features/canvas/seedanceShowcase.js +314 -0
  122. package/lib/features/canvas/seedanceShowcase.js.map +1 -0
  123. package/lib/features/canvas/serverTasks.js +149 -15
  124. package/lib/features/canvas/serverTasks.js.map +1 -1
  125. package/lib/features/canvas/sessionRenewal.js +114 -0
  126. package/lib/features/canvas/sessionRenewal.js.map +1 -0
  127. package/lib/features/canvas/set/SetViewportWebView.js +34 -1
  128. package/lib/features/canvas/set/SetViewportWebView.js.map +1 -1
  129. package/lib/features/canvas/set/agent/setTurn.js +4 -2
  130. package/lib/features/canvas/set/agent/setTurn.js.map +1 -1
  131. package/lib/features/canvas/set/setPresets.js +85 -0
  132. package/lib/features/canvas/set/setPresets.js.map +1 -0
  133. package/lib/features/canvas/set/setProject.js +4 -1
  134. package/lib/features/canvas/set/setProject.js.map +1 -1
  135. package/lib/features/canvas/studioCatalog.js +59 -4
  136. package/lib/features/canvas/studioCatalog.js.map +1 -1
  137. package/lib/features/canvas/studioLooks.js +31 -4
  138. package/lib/features/canvas/studioLooks.js.map +1 -1
  139. package/lib/features/canvas/surfaceIndex.js +1 -14
  140. package/lib/features/canvas/surfaceIndex.js.map +1 -1
  141. package/lib/features/canvas/templateSearch.js +489 -0
  142. package/lib/features/canvas/templateSearch.js.map +1 -0
  143. package/lib/features/canvas/useCanvasSession.js +28 -6
  144. package/lib/features/canvas/useCanvasSession.js.map +1 -1
  145. package/lib/features/canvas/useStudioCatalogTemplates.js +41 -5
  146. package/lib/features/canvas/useStudioCatalogTemplates.js.map +1 -1
  147. package/lib/features/canvas/videoEditor/EditorPanels.js +531 -0
  148. package/lib/features/canvas/videoEditor/EditorPanels.js.map +1 -0
  149. package/lib/features/canvas/videoEditor/agent/AgentCutPane.js +48 -4
  150. package/lib/features/canvas/videoEditor/agent/AgentCutPane.js.map +1 -1
  151. package/lib/features/canvas/videoEditor/agent/agentLoop.js +2 -0
  152. package/lib/features/canvas/videoEditor/agent/agentLoop.js.map +1 -1
  153. package/lib/features/canvas/videoEditor/agent/brainClient.js +97 -27
  154. package/lib/features/canvas/videoEditor/agent/brainClient.js.map +1 -1
  155. package/lib/features/canvas/videoEditor/agent/cutTools.js +707 -3
  156. package/lib/features/canvas/videoEditor/agent/cutTools.js.map +1 -1
  157. package/lib/features/canvas/videoEditor/audioServices.js +165 -0
  158. package/lib/features/canvas/videoEditor/audioServices.js.map +1 -0
  159. package/lib/features/canvas/videoEditor/captions.js +144 -0
  160. package/lib/features/canvas/videoEditor/captions.js.map +1 -0
  161. package/lib/features/canvas/videoEditor/compileTimeline.js +24 -16
  162. package/lib/features/canvas/videoEditor/compileTimeline.js.map +1 -1
  163. package/lib/features/canvas/videoEditor/editorModel.js +12 -2
  164. package/lib/features/canvas/videoEditor/editorModel.js.map +1 -1
  165. package/lib/features/canvas/videoEditor/exportTask.js +89 -7
  166. package/lib/features/canvas/videoEditor/exportTask.js.map +1 -1
  167. package/lib/features/canvas/videoEditor/layers.js +117 -0
  168. package/lib/features/canvas/videoEditor/layers.js.map +1 -0
  169. package/lib/features/canvas/videoEditor/remoteMediaClient.js +45 -18
  170. package/lib/features/canvas/videoEditor/remoteMediaClient.js.map +1 -1
  171. package/lib/features/canvas/videoEditor/renderTimeline.js +18 -6
  172. package/lib/features/canvas/videoEditor/renderTimeline.js.map +1 -1
  173. package/lib/features/canvas/videoEditor/revoice.js +138 -0
  174. package/lib/features/canvas/videoEditor/revoice.js.map +1 -0
  175. package/lib/features/canvas/videoEditor/storageUpload.js +34 -0
  176. package/lib/features/canvas/videoEditor/storageUpload.js.map +1 -0
  177. package/lib/features/canvas/videoEditor/textMotion.js +109 -0
  178. package/lib/features/canvas/videoEditor/textMotion.js.map +1 -0
  179. package/lib/features/canvas/videoEditor/transitions.js +31 -0
  180. package/lib/features/canvas/videoEditor/transitions.js.map +1 -0
  181. package/lib/features/chat/TemplatesChatCards.js +8 -3
  182. package/lib/features/chat/TemplatesChatCards.js.map +1 -1
  183. package/lib/features/design/DesignEditorExperience.js +674 -644
  184. package/lib/features/design/DesignEditorExperience.js.map +1 -1
  185. package/lib/features/design/DesignExperience.js +285 -538
  186. package/lib/features/design/DesignExperience.js.map +1 -1
  187. package/lib/features/design/designCore.js +2 -212
  188. package/lib/features/design/designCore.js.map +1 -1
  189. package/lib/features/design/designIndex.js +1 -50
  190. package/lib/features/design/designIndex.js.map +1 -1
  191. package/lib/features/design/doc/aiDesign.js +247 -0
  192. package/lib/features/design/doc/aiDesign.js.map +1 -0
  193. package/lib/features/design/doc/artifacts.js +280 -0
  194. package/lib/features/design/doc/artifacts.js.map +1 -0
  195. package/lib/features/design/doc/chart.js +98 -0
  196. package/lib/features/design/doc/chart.js.map +1 -0
  197. package/lib/features/design/doc/crop.js +104 -0
  198. package/lib/features/design/doc/crop.js.map +1 -0
  199. package/lib/features/design/doc/curve.js +49 -0
  200. package/lib/features/design/doc/curve.js.map +1 -0
  201. package/lib/features/design/doc/docOps.js +397 -0
  202. package/lib/features/design/doc/docOps.js.map +1 -0
  203. package/lib/features/design/doc/findReplace.js +112 -0
  204. package/lib/features/design/doc/findReplace.js.map +1 -0
  205. package/lib/features/design/doc/fonts.js +79 -0
  206. package/lib/features/design/doc/fonts.js.map +1 -0
  207. package/lib/features/design/doc/frames.js +17 -0
  208. package/lib/features/design/doc/frames.js.map +1 -0
  209. package/lib/features/design/doc/geometry.js +133 -0
  210. package/lib/features/design/doc/geometry.js.map +1 -0
  211. package/lib/features/design/doc/imageAdjust.js +203 -0
  212. package/lib/features/design/doc/imageAdjust.js.map +1 -0
  213. package/lib/features/design/doc/legacyDoc.js +107 -0
  214. package/lib/features/design/doc/legacyDoc.js.map +1 -0
  215. package/lib/features/design/doc/newDoc.js +335 -0
  216. package/lib/features/design/doc/newDoc.js.map +1 -0
  217. package/lib/features/design/doc/pageRange.js +17 -0
  218. package/lib/features/design/doc/pageRange.js.map +1 -0
  219. package/lib/features/design/doc/pathScale.js +68 -0
  220. package/lib/features/design/doc/pathScale.js.map +1 -0
  221. package/lib/features/design/doc/qr.js +62 -0
  222. package/lib/features/design/doc/qr.js.map +1 -0
  223. package/lib/features/design/doc/shapes.js +366 -0
  224. package/lib/features/design/doc/shapes.js.map +1 -0
  225. package/lib/features/design/doc/sizes.js +230 -0
  226. package/lib/features/design/doc/sizes.js.map +1 -0
  227. package/lib/features/design/doc/textEffects.js +134 -0
  228. package/lib/features/design/doc/textEffects.js.map +1 -0
  229. package/lib/features/design/doc/textLayout.js +182 -0
  230. package/lib/features/design/doc/textLayout.js.map +1 -0
  231. package/lib/features/design/doc/types.js +30 -0
  232. package/lib/features/design/doc/types.js.map +1 -0
  233. package/lib/features/design/editor/AiPanel.js +194 -0
  234. package/lib/features/design/editor/AiPanel.js.map +1 -0
  235. package/lib/features/design/editor/ChartDataPanel.js +182 -0
  236. package/lib/features/design/editor/ChartDataPanel.js.map +1 -0
  237. package/lib/features/design/editor/CropOverlay.js +199 -0
  238. package/lib/features/design/editor/CropOverlay.js.map +1 -0
  239. package/lib/features/design/editor/DesignCanvas.js +363 -0
  240. package/lib/features/design/editor/DesignCanvas.js.map +1 -0
  241. package/lib/features/design/editor/ExportSheet.js +123 -0
  242. package/lib/features/design/editor/ExportSheet.js.map +1 -0
  243. package/lib/features/design/editor/FindReplacePanel.js +93 -0
  244. package/lib/features/design/editor/FindReplacePanel.js.map +1 -0
  245. package/lib/features/design/editor/ImageTools.js +188 -0
  246. package/lib/features/design/editor/ImageTools.js.map +1 -0
  247. package/lib/features/design/editor/LayerTools.js +485 -0
  248. package/lib/features/design/editor/LayerTools.js.map +1 -0
  249. package/lib/features/design/editor/PageStrip.js +203 -0
  250. package/lib/features/design/editor/PageStrip.js.map +1 -0
  251. package/lib/features/design/editor/Slideshow.js +97 -0
  252. package/lib/features/design/editor/Slideshow.js.map +1 -0
  253. package/lib/features/design/editor/ToolPanels.js +695 -0
  254. package/lib/features/design/editor/ToolPanels.js.map +1 -0
  255. package/lib/features/design/editor/controls.js +630 -0
  256. package/lib/features/design/editor/controls.js.map +1 -0
  257. package/lib/features/design/editor/useDesignSave.js +91 -0
  258. package/lib/features/design/editor/useDesignSave.js.map +1 -0
  259. package/lib/features/design/export/exportDesign.js +170 -0
  260. package/lib/features/design/export/exportDesign.js.map +1 -0
  261. package/lib/features/design/export/pdf.js +143 -0
  262. package/lib/features/design/export/pdf.js.map +1 -0
  263. package/lib/features/design/home/DesignHome.js +688 -0
  264. package/lib/features/design/home/DesignHome.js.map +1 -0
  265. package/lib/features/design/home/studioHome.js +61 -0
  266. package/lib/features/design/home/studioHome.js.map +1 -0
  267. package/lib/features/design/pickDesignImage.js +60 -0
  268. package/lib/features/design/pickDesignImage.js.map +1 -0
  269. package/lib/features/design/render/DesignPageView.js +69 -0
  270. package/lib/features/design/render/DesignPageView.js.map +1 -0
  271. package/lib/features/design/render/PageCapture.js +288 -0
  272. package/lib/features/design/render/PageCapture.js.map +1 -0
  273. package/lib/features/design/render/TextMeasure.js +115 -0
  274. package/lib/features/design/render/TextMeasure.js.map +1 -0
  275. package/lib/features/design/render/fontRegistry.js +110 -0
  276. package/lib/features/design/render/fontRegistry.js.map +1 -0
  277. package/lib/features/design/render/layers.js +392 -0
  278. package/lib/features/design/render/layers.js.map +1 -0
  279. package/lib/features/design/render/svg.js +35 -0
  280. package/lib/features/design/render/svg.js.map +1 -0
  281. package/lib/features/design/render/svgParts.js +435 -0
  282. package/lib/features/design/render/svgParts.js.map +1 -0
  283. package/lib/features/design/surface/BoardScreen.js +529 -0
  284. package/lib/features/design/surface/BoardScreen.js.map +1 -0
  285. package/lib/features/design/surface/CompareView.js +138 -0
  286. package/lib/features/design/surface/CompareView.js.map +1 -0
  287. package/lib/features/design/surface/CreationScreen.js +294 -0
  288. package/lib/features/design/surface/CreationScreen.js.map +1 -0
  289. package/lib/features/design/surface/DesignAgentChatPane.js +444 -0
  290. package/lib/features/design/surface/DesignAgentChatPane.js.map +1 -0
  291. package/lib/features/design/surface/DesignBoards.js +441 -0
  292. package/lib/features/design/surface/DesignBoards.js.map +1 -0
  293. package/lib/features/design/surface/DesignPreview.js +159 -0
  294. package/lib/features/design/surface/DesignPreview.js.map +1 -0
  295. package/lib/features/design/surface/DesignSurfaceExperience.js +80 -0
  296. package/lib/features/design/surface/DesignSurfaceExperience.js.map +1 -0
  297. package/lib/features/design/surface/FullScreenPreview.js +59 -0
  298. package/lib/features/design/surface/FullScreenPreview.js.map +1 -0
  299. package/lib/features/design/surface/NewSystemDialog.js +122 -0
  300. package/lib/features/design/surface/NewSystemDialog.js.map +1 -0
  301. package/lib/features/design/surface/PickerSheet.js +175 -0
  302. package/lib/features/design/surface/PickerSheet.js.map +1 -0
  303. package/lib/features/design/surface/TemplatesGallery.js +156 -0
  304. package/lib/features/design/surface/TemplatesGallery.js.map +1 -0
  305. package/lib/features/design/surface/WetPaint.js +140 -0
  306. package/lib/features/design/surface/WetPaint.js.map +1 -0
  307. package/lib/features/design/surface/agentTurn.js +229 -0
  308. package/lib/features/design/surface/agentTurn.js.map +1 -0
  309. package/lib/features/design/surface/designBoard.js +218 -0
  310. package/lib/features/design/surface/designBoard.js.map +1 -0
  311. package/lib/features/design/surface/designChannel.js +186 -0
  312. package/lib/features/design/surface/designChannel.js.map +1 -0
  313. package/lib/features/design/surface/designChat.js +141 -0
  314. package/lib/features/design/surface/designChat.js.map +1 -0
  315. package/lib/features/design/surface/designConnector.js +266 -0
  316. package/lib/features/design/surface/designConnector.js.map +1 -0
  317. package/lib/features/design/surface/designDocument.js +40 -0
  318. package/lib/features/design/surface/designDocument.js.map +1 -0
  319. package/lib/features/design/surface/designExport.js +55 -0
  320. package/lib/features/design/surface/designExport.js.map +1 -0
  321. package/lib/features/design/surface/designLinks.js +64 -0
  322. package/lib/features/design/surface/designLinks.js.map +1 -0
  323. package/lib/features/design/surface/designPalette.js +24 -0
  324. package/lib/features/design/surface/designPalette.js.map +1 -0
  325. package/lib/features/design/surface/designRun.js +161 -0
  326. package/lib/features/design/surface/designRun.js.map +1 -0
  327. package/lib/features/design/surface/designTheme.js +119 -0
  328. package/lib/features/design/surface/designTheme.js.map +1 -0
  329. package/lib/features/design/surface/execStream.js +206 -0
  330. package/lib/features/design/surface/execStream.js.map +1 -0
  331. package/lib/features/design/surface/metaball.js +48 -0
  332. package/lib/features/design/surface/metaball.js.map +1 -0
  333. package/lib/features/design/surface/pickReferenceFiles.js +35 -0
  334. package/lib/features/design/surface/pickReferenceFiles.js.map +1 -0
  335. package/lib/features/design/surface/useDesignSurface.js +379 -0
  336. package/lib/features/design/surface/useDesignSurface.js.map +1 -0
  337. package/lib/features/docs/DocBlockRow.js +336 -0
  338. package/lib/features/docs/DocBlockRow.js.map +1 -0
  339. package/lib/features/docs/DocsEditorExperience.js +949 -0
  340. package/lib/features/docs/DocsEditorExperience.js.map +1 -0
  341. package/lib/features/docs/DocsToolbar.js +247 -0
  342. package/lib/features/docs/DocsToolbar.js.map +1 -0
  343. package/lib/features/docs/blocks.js +560 -0
  344. package/lib/features/docs/blocks.js.map +1 -0
  345. package/lib/features/docs/docArtifacts.js +129 -0
  346. package/lib/features/docs/docArtifacts.js.map +1 -0
  347. package/lib/features/docs/docEdits.js +201 -0
  348. package/lib/features/docs/docEdits.js.map +1 -0
  349. package/lib/features/docs/docExport.js +235 -0
  350. package/lib/features/docs/docExport.js.map +1 -0
  351. package/lib/features/docs/docShare.js +62 -0
  352. package/lib/features/docs/docShare.js.map +1 -0
  353. package/lib/features/links/openInApp.js +38 -2
  354. package/lib/features/links/openInApp.js.map +1 -1
  355. package/lib/routes.json +54 -0
  356. package/lib/screens/DesignNative/index.js +35 -0
  357. package/lib/screens/DesignNative/index.js.map +1 -0
  358. package/package.json +4 -4
  359. package/lib/features/design/exportDesign.js +0 -133
  360. package/lib/features/design/exportDesign.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"studioLooks.js","sources":["../../../src/features/canvas/studioLooks.ts"],"sourcesContent":["/**\n * Native twin of canvas-surface `rpc/studioLooksRpc` — browse-first video recipes.\n *\n * Prefer a direct `formTemplateSubmissions` read (same as web studio templates).\n * The agent-pod connector often 400s with \"Studio catalog read failed\"; never\n * fall through to it after a successful empty catalog page.\n */\nimport type { RunMediaAction } from './videoEditor/mediaActions';\nimport { deriveBackendGraphqlUrl } from './videoEditor/remoteMediaClient';\nimport {\n STUDIO_CATALOG_QUERY,\n catalogRowToStudioTemplate,\n studioCatalogFilter,\n type StudioCatalogRow,\n} from './studioCatalog';\nimport type { StudioCatalogClient } from './useStudioCatalogTemplates';\n\nexport const LOOKS_PAGE_SIZE = 24;\n\nexport interface StudioLook {\n id: string;\n name: string;\n description: string;\n cover: string;\n coverVideo: string;\n prompt: string;\n aspect: string;\n category: string;\n tags: string[];\n}\n\nexport interface ListStudioLooksOptions {\n client?: StudioCatalogClient | null;\n token?: string | null;\n indexUrl?: string | null;\n}\n\nconst str = (v: unknown): string => (typeof v === 'string' ? v : '');\n\nconst SUBMISSIONS_QUERY =\n 'query($filter: FormTemplateSubmissionFilter){ formTemplateSubmissions(filter:$filter){ nodes { id name description category tags formData } } }';\n\nfunction normalize(raw: unknown): { looks: StudioLook[]; hasMore: boolean } {\n const outer = (raw ?? {}) as Record<string, unknown>;\n const body = (outer.data ?? outer) as Record<string, unknown>;\n const list = Array.isArray(body.templates) ? body.templates : [];\n const looks = (list as Array<Record<string, unknown>>)\n .map((t) => ({\n id: str(t.id),\n name: str(t.name) || str(t.id),\n description: str(t.description),\n cover: str(t.cover),\n coverVideo: str(t.coverVideo),\n prompt: str(t.prompt),\n aspect: str(t.aspect),\n category: str(t.category),\n tags: Array.isArray(t.tags) ? t.tags.filter((x): x is string => typeof x === 'string') : [],\n }))\n .filter((l) => Boolean(l.id) && Boolean(l.prompt));\n return { looks, hasMore: Boolean(body.hasMore) };\n}\n\nfunction looksFromCatalogNodes(\n nodes: StudioCatalogRow[] | null | undefined,\n pageSize: number,\n): { looks: StudioLook[]; hasMore: boolean } {\n const looks = (nodes ?? [])\n .map(catalogRowToStudioTemplate)\n .filter((row): row is NonNullable<typeof row> => row !== null && Boolean(row.prompt))\n .map(\n (row): StudioLook => ({\n id: row.id,\n name: row.title,\n description: row.description || '',\n cover: row.cover || '',\n coverVideo: row.coverVideo || '',\n prompt: row.prompt,\n aspect: row.aspect || '',\n category: row.category || '',\n tags: row.tags || [],\n }),\n );\n return { looks, hasMore: (nodes?.length ?? 0) >= pageSize };\n}\n\nasync function listViaCatalog(\n client: StudioCatalogClient,\n params: { query?: string; offset?: number; limit?: number },\n): Promise<{ looks: StudioLook[]; hasMore: boolean }> {\n const limit = params.limit ?? LOOKS_PAGE_SIZE;\n const offset = params.offset ?? 0;\n const { data } = await client.query({\n query: STUDIO_CATALOG_QUERY,\n variables: { filter: studioCatalogFilter(params.query ?? '', offset, limit) },\n fetchPolicy: 'network-only',\n });\n const nodes = (data as { formTemplateSubmissions?: { nodes?: StudioCatalogRow[] | null } } | null)\n ?.formTemplateSubmissions?.nodes;\n return looksFromCatalogNodes(nodes, limit);\n}\n\n/** Web `readViaBackend` — skip the agent pod entirely. */\nasync function listViaBackendFetch(\n graphqlUrl: string,\n token: string,\n params: { query?: string; offset?: number; limit?: number },\n): Promise<{ looks: StudioLook[]; hasMore: boolean }> {\n const limit = params.limit ?? LOOKS_PAGE_SIZE;\n const offset = params.offset ?? 0;\n const res = await fetch(graphqlUrl, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n authorization: `Bearer ${token}`,\n },\n body: JSON.stringify({\n query: SUBMISSIONS_QUERY,\n variables: { filter: studioCatalogFilter(params.query ?? '', offset, limit) },\n }),\n });\n if (!res.ok) throw new Error(`Studio catalog read failed (${res.status})`);\n const json = (await res.json().catch(() => ({}))) as {\n data?: { formTemplateSubmissions?: { nodes?: StudioCatalogRow[] | null } };\n errors?: Array<{ message?: string }>;\n };\n if (json.errors?.length) {\n throw new Error(\n json.errors\n .map((e) => e?.message)\n .filter(Boolean)\n .join('; ') || 'Studio catalog read failed',\n );\n }\n const nodes = json.data?.formTemplateSubmissions?.nodes;\n if (!Array.isArray(nodes)) throw new Error('Backend returned no formTemplateSubmissions');\n return looksFromCatalogNodes(nodes, limit);\n}\n\nexport async function listStudioLooks(\n run: RunMediaAction | undefined,\n params: { query?: string; offset?: number; limit?: number } = {},\n options: ListStudioLooksOptions | StudioCatalogClient | null = {},\n): Promise<{ looks: StudioLook[]; hasMore: boolean }> {\n // Back-compat: third arg used to be apolloClient alone.\n const isLegacyClient =\n options != null &&\n typeof options === 'object' &&\n typeof (options as StudioCatalogClient).readQuery === 'function';\n const opts: ListStudioLooksOptions = isLegacyClient\n ? { client: options as StudioCatalogClient }\n : ((options as ListStudioLooksOptions | null) ?? {});\n\n const limit = params.limit ?? LOOKS_PAGE_SIZE;\n const offset = params.offset ?? 0;\n const query = params.query?.trim();\n const graphqlUrl = opts.indexUrl ? deriveBackendGraphqlUrl(opts.indexUrl) : null;\n\n if (opts.token && graphqlUrl) {\n try {\n return await listViaBackendFetch(graphqlUrl, opts.token, { query, offset, limit });\n } catch {\n // Apollo / connector fallbacks.\n }\n }\n\n if (opts.client) {\n try {\n // Successful empty page is final — do not escalate to the broken connector.\n return await listViaCatalog(opts.client, { query, offset, limit });\n } catch {\n // Connector fallback.\n }\n }\n\n if (!run) return { looks: [], hasMore: false };\n\n try {\n const result = await run('yantra-video-generation', 'YANTRA_VIDEO_LIST_STUDIO_TEMPLATES', {\n limit,\n offset,\n ...(query ? { query } : {}),\n });\n const page = normalize(result);\n return { looks: page.looks, hasMore: page.hasMore || page.looks.length >= limit };\n } catch {\n return { looks: [], hasMore: false };\n }\n}\n\nexport function nearestAspect(aspect: string, supported: readonly string[]): string | undefined {\n const wanted = aspect.trim();\n if (!wanted) return undefined;\n if (supported.includes(wanted)) return wanted;\n const ratio = (value: string): number | undefined => {\n const [w, h] = value.split(':').map(Number);\n return Number.isFinite(w) && Number.isFinite(h) && h > 0 ? w / h : undefined;\n };\n const target = ratio(wanted);\n if (target === undefined) return undefined;\n const portrait = target < 1;\n const sameOrientation = supported.filter((option) => {\n const r = ratio(option);\n return r !== undefined && (portrait ? r < 1 : r >= 1);\n });\n const pool = sameOrientation.length > 0 ? sameOrientation : supported;\n let best: string | undefined;\n let bestGap = Infinity;\n for (const option of pool) {\n const r = ratio(option);\n if (r === undefined) continue;\n const gap = Math.abs(r - target);\n if (gap < bestGap) {\n bestGap = gap;\n best = option;\n }\n }\n return best;\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"studioLooks.js","sources":["../../../src/features/canvas/studioLooks.ts"],"sourcesContent":["/**\n * Native twin of canvas-surface `rpc/studioLooksRpc` — browse-first video recipes.\n *\n * Prefer a direct `formTemplateSubmissions` read (same as web studio templates).\n * The agent-pod connector often 400s with \"Studio catalog read failed\"; never\n * fall through to it after a successful empty catalog page.\n */\nimport type { RunMediaAction } from './videoEditor/mediaActions';\nimport { deriveBackendGraphqlUrl } from './videoEditor/remoteMediaClient';\nimport type { CanvasPromptTemplate } from './canvasChatTemplates';\nimport {\n STUDIO_CATALOG_QUERY,\n apolloCatalogRead,\n catalogRowToStudioTemplate,\n fetchCatalogRead,\n isRankedStudioSearch,\n rankedStudioCatalogPage,\n studioCatalogFilter,\n type CatalogGraphqlRead,\n type StudioCatalogRow,\n} from './studioCatalog';\nimport type { StudioCatalogClient } from './useStudioCatalogTemplates';\n\nexport const LOOKS_PAGE_SIZE = 24;\n\nexport interface StudioLook {\n id: string;\n name: string;\n description: string;\n cover: string;\n coverVideo: string;\n prompt: string;\n aspect: string;\n category: string;\n tags: string[];\n}\n\nexport interface ListStudioLooksOptions {\n client?: StudioCatalogClient | null;\n token?: string | null;\n indexUrl?: string | null;\n}\n\nconst str = (v: unknown): string => (typeof v === 'string' ? v : '');\n\nconst SUBMISSIONS_QUERY =\n 'query($filter: FormTemplateSubmissionFilter){ formTemplateSubmissions(filter:$filter){ nodes { id name description category tags formData } } }';\n\nfunction normalize(raw: unknown): { looks: StudioLook[]; hasMore: boolean } {\n const outer = (raw ?? {}) as Record<string, unknown>;\n const body = (outer.data ?? outer) as Record<string, unknown>;\n const list = Array.isArray(body.templates) ? body.templates : [];\n const looks = (list as Array<Record<string, unknown>>)\n .map((t) => ({\n id: str(t.id),\n name: str(t.name) || str(t.id),\n description: str(t.description),\n cover: str(t.cover),\n coverVideo: str(t.coverVideo),\n prompt: str(t.prompt),\n aspect: str(t.aspect),\n category: str(t.category),\n tags: Array.isArray(t.tags) ? t.tags.filter((x): x is string => typeof x === 'string') : [],\n }))\n .filter((l) => Boolean(l.id) && Boolean(l.prompt));\n return { looks, hasMore: Boolean(body.hasMore) };\n}\n\nfunction looksFromTemplates(rows: ReadonlyArray<CanvasPromptTemplate | null>): StudioLook[] {\n return rows\n .filter((row): row is CanvasPromptTemplate => row !== null && Boolean(row.prompt))\n .map(\n (row): StudioLook => ({\n id: row.id,\n name: row.title,\n description: row.description || '',\n cover: row.cover || '',\n coverVideo: row.coverVideo || '',\n prompt: row.prompt,\n aspect: row.aspect || '',\n category: row.category || '',\n tags: row.tags || [],\n }),\n );\n}\n\nfunction looksFromCatalogNodes(\n nodes: StudioCatalogRow[] | null | undefined,\n pageSize: number,\n): { looks: StudioLook[]; hasMore: boolean } {\n const looks = looksFromTemplates((nodes ?? []).map(catalogRowToStudioTemplate));\n return { looks, hasMore: (nodes?.length ?? 0) >= pageSize };\n}\n\n/**\n * A typed search, ranked (surface-kit 0.43): the matches best first, then the\n * catalog's own looks. `next` is the offset of the following page (not a count).\n */\nasync function listRanked(\n read: CatalogGraphqlRead,\n params: { query: string; offset: number; limit: number },\n): Promise<{ looks: StudioLook[]; hasMore: boolean; next?: number }> {\n const page = await rankedStudioCatalogPage(params.query, params.offset, read, params.limit);\n return {\n looks: looksFromTemplates(page.rows),\n hasMore: page.next !== null,\n ...(page.next !== null ? { next: page.next } : {}),\n };\n}\n\nasync function listViaCatalog(\n client: StudioCatalogClient,\n params: { query?: string; offset?: number; limit?: number },\n): Promise<{ looks: StudioLook[]; hasMore: boolean }> {\n const limit = params.limit ?? LOOKS_PAGE_SIZE;\n const offset = params.offset ?? 0;\n const { data } = await client.query({\n query: STUDIO_CATALOG_QUERY,\n variables: { filter: studioCatalogFilter(params.query ?? '', offset, limit) },\n fetchPolicy: 'network-only',\n });\n const nodes = (data as { formTemplateSubmissions?: { nodes?: StudioCatalogRow[] | null } } | null)\n ?.formTemplateSubmissions?.nodes;\n return looksFromCatalogNodes(nodes, limit);\n}\n\n/** Web `readViaBackend` — skip the agent pod entirely. */\nasync function listViaBackendFetch(\n graphqlUrl: string,\n token: string,\n params: { query?: string; offset?: number; limit?: number },\n): Promise<{ looks: StudioLook[]; hasMore: boolean }> {\n const limit = params.limit ?? LOOKS_PAGE_SIZE;\n const offset = params.offset ?? 0;\n const res = await fetch(graphqlUrl, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n authorization: `Bearer ${token}`,\n },\n body: JSON.stringify({\n query: SUBMISSIONS_QUERY,\n variables: { filter: studioCatalogFilter(params.query ?? '', offset, limit) },\n }),\n });\n if (!res.ok) throw new Error(`Studio catalog read failed (${res.status})`);\n const json = (await res.json().catch(() => ({}))) as {\n data?: { formTemplateSubmissions?: { nodes?: StudioCatalogRow[] | null } };\n errors?: Array<{ message?: string }>;\n };\n if (json.errors?.length) {\n throw new Error(\n json.errors\n .map((e) => e?.message)\n .filter(Boolean)\n .join('; ') || 'Studio catalog read failed',\n );\n }\n const nodes = json.data?.formTemplateSubmissions?.nodes;\n if (!Array.isArray(nodes)) throw new Error('Backend returned no formTemplateSubmissions');\n return looksFromCatalogNodes(nodes, limit);\n}\n\nexport async function listStudioLooks(\n run: RunMediaAction | undefined,\n params: { query?: string; offset?: number; limit?: number } = {},\n options: ListStudioLooksOptions | StudioCatalogClient | null = {},\n): Promise<{ looks: StudioLook[]; hasMore: boolean; next?: number }> {\n // Back-compat: third arg used to be apolloClient alone.\n const isLegacyClient =\n options != null &&\n typeof options === 'object' &&\n typeof (options as StudioCatalogClient).readQuery === 'function';\n const opts: ListStudioLooksOptions = isLegacyClient\n ? { client: options as StudioCatalogClient }\n : ((options as ListStudioLooksOptions | null) ?? {});\n\n const limit = params.limit ?? LOOKS_PAGE_SIZE;\n const offset = params.offset ?? 0;\n const query = params.query?.trim();\n const graphqlUrl = opts.indexUrl ? deriveBackendGraphqlUrl(opts.indexUrl) : null;\n\n if (query && isRankedStudioSearch(query)) {\n const reads: CatalogGraphqlRead[] = [];\n if (opts.token && graphqlUrl) reads.push(fetchCatalogRead(graphqlUrl, opts.token));\n if (opts.client) reads.push(apolloCatalogRead(opts.client));\n for (const read of reads) {\n try {\n return await listRanked(read, { query, offset, limit });\n } catch {\n // Next transport, then the plain lanes below.\n }\n }\n }\n\n if (opts.token && graphqlUrl) {\n try {\n return await listViaBackendFetch(graphqlUrl, opts.token, { query, offset, limit });\n } catch {\n // Apollo / connector fallbacks.\n }\n }\n\n if (opts.client) {\n try {\n // Successful empty page is final — do not escalate to the broken connector.\n return await listViaCatalog(opts.client, { query, offset, limit });\n } catch {\n // Connector fallback.\n }\n }\n\n if (!run) return { looks: [], hasMore: false };\n\n try {\n const result = await run('yantra-video-generation', 'YANTRA_VIDEO_LIST_STUDIO_TEMPLATES', {\n limit,\n offset,\n ...(query ? { query } : {}),\n });\n const page = normalize(result);\n return { looks: page.looks, hasMore: page.hasMore || page.looks.length >= limit };\n } catch {\n return { looks: [], hasMore: false };\n }\n}\n\nexport function nearestAspect(aspect: string, supported: readonly string[]): string | undefined {\n const wanted = aspect.trim();\n if (!wanted) return undefined;\n if (supported.includes(wanted)) return wanted;\n const ratio = (value: string): number | undefined => {\n const [w, h] = value.split(':').map(Number);\n return Number.isFinite(w) && Number.isFinite(h) && h > 0 ? w / h : undefined;\n };\n const target = ratio(wanted);\n if (target === undefined) return undefined;\n const portrait = target < 1;\n const sameOrientation = supported.filter((option) => {\n const r = ratio(option);\n return r !== undefined && (portrait ? r < 1 : r >= 1);\n });\n const pool = sameOrientation.length > 0 ? sameOrientation : supported;\n let best: string | undefined;\n let bestGap = Infinity;\n for (const option of pool) {\n const r = ratio(option);\n if (r === undefined) continue;\n const gap = Math.abs(r - target);\n if (gap < bestGap) {\n bestGap = gap;\n best = option;\n }\n }\n return best;\n}\n"],"names":[],"mappings":"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"}
@@ -203,17 +203,4 @@ function coerceMetadata(value) {
203
203
  } catch (e) {
204
204
  return null;
205
205
  }
206
- }
207
- function newBoardChannelId() {
208
- var _a, _b;
209
- const rand = () => Math.random().toString(36).slice(2, 10);
210
- try {
211
- const bytes = new Uint8Array(8);
212
- (_b = (_a = globalThis.crypto) == null ? void 0 : _a.getRandomValues) == null ? void 0 : _b.call(_a, bytes);
213
- if (bytes.some((b) => b !== 0)) {
214
- return `canvas-${Array.from(bytes, (b) => b.toString(16).padStart(2, "0")).join("")}`;
215
- }
216
- } catch (e) {
217
- }
218
- return `canvas-${rand()}${rand()}`;
219
- }export{clearCachedCanvasBoards,fetchMyCanvasBoards,getCachedCanvasBoards,newBoardChannelId,pushCanvasBoard,setCachedCanvasBoards,surfaceIndexUrl,surfaceIndexUrlFromTemplate};//# sourceMappingURL=surfaceIndex.js.map
206
+ }export{clearCachedCanvasBoards,fetchMyCanvasBoards,getCachedCanvasBoards,pushCanvasBoard,setCachedCanvasBoards,surfaceIndexUrl,surfaceIndexUrlFromTemplate};//# sourceMappingURL=surfaceIndex.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"surfaceIndex.js","sources":["../../../src/features/canvas/surfaceIndex.ts"],"sourcesContent":["/**\n * Native reader for the canvas boards in the SurfaceChannel index.\n *\n * The index (`servers/surface-index-subgraph-server`) is the ONLY store for a\n * canvas: the whole `PersistedCanvasState` rides in the row's `metadata`, and\n * `mySurfaceChannels` enumerates the caller's boards. Rows are per-USER, so the\n * phone — signed in as the same user — sees exactly what the web surface sees.\n *\n * This is the native twin of `@yantra/canvas-surface`'s `state/boards.ts`\n * (`pullBoards`). It is copied rather than imported for the same reason\n * `canvasCore.ts` is: that package builds for the DOM (vite, `import.meta.env`,\n * `window.location`), and importing it would drag the web toolchain into Metro.\n * The contract that matters is the wire shape, which both sides pin.\n *\n * Reads are best-effort: an unreachable index yields an error string for the UI\n * rather than throwing, matching how the web surface degrades.\n */\nimport { emptyBoardState, parseBoardState, type PersistedCanvasState } from './canvasCore';\n\n/** Fields the index returns for a channel row (mirror of CHANNEL_FIELDS). */\nconst CHANNEL_FIELDS = 'id surface channelId title metadata updatedAt';\n\n/**\n * The web surface's `/c/new` scratch board. It is not a real board (no host\n * session backs it), and `pullBoards` skips it — so must this, or an empty\n * scratch row would shadow the user's actual canvases.\n */\nconst SCRATCH_BOARD_ID = 'global';\n\nexport interface CanvasBoardSummary {\n channelId: string;\n title?: string;\n savedAt: number;\n itemCount: number;\n board: PersistedCanvasState;\n}\n\n/**\n * Where the index lives for this environment.\n *\n * Mirrors the surface-kit fallback: the index is a sibling host of the backend,\n * so drop the backend's first label and prefix `surface-index-backend.`\n * (`ideback.yantra-app-v1.cdebase.dev` -> `surface-index-backend.yantra-app-v1.cdebase.dev`).\n * An explicit URL always wins, so a non-standard environment sets one env var\n * instead of needing a code change.\n */\nexport function surfaceIndexUrl(graphqlUrl: string, explicit?: string): string {\n const override = (explicit || '').trim();\n if (override) return override;\n\n const base = (graphqlUrl || '').trim();\n if (!base) return '';\n try {\n const { protocol, host } = parseOrigin(base);\n const labels = host.split('.');\n if (labels.length < 3) return '';\n return `${protocol}//surface-index-backend.${labels.slice(1).join('.')}/graphql`;\n } catch {\n return '';\n }\n}\n\n/**\n * Index GraphQL URL from the same SURFACE_URL_TEMPLATE the native remotes use\n * (`https://{slug}-surface.<cluster>/` → `https://surface-index-backend.<cluster>/graphql`).\n * Local GRAPHQL_URL cannot derive a host; this is the develop-lane fallback.\n */\nexport function surfaceIndexUrlFromTemplate(template: string): string {\n const trimmed = (template || '').trim();\n const match = trimmed.match(/^(https?):\\/\\/\\{slug\\}-surface\\.([^/]+)/i);\n if (!match) return '';\n const host = match[2].replace(/\\/+$/, '');\n if (!host) return '';\n return `${match[1].toLowerCase()}://surface-index-backend.${host}/graphql`;\n}\n\nfunction parseOrigin(url: string): { protocol: string; host: string } {\n // RN has URL via react-native-url-polyfill (imported in the app entry), but\n // this module is also loaded by jest and the surface build, so parse by hand.\n const match = url.match(/^(https?:)\\/\\/([^/]+)/i);\n if (!match) throw new Error(`unparseable url: ${url}`);\n return { protocol: match[1].toLowerCase(), host: match[2].toLowerCase() };\n}\n\nexport interface FetchBoardsOptions {\n url: string;\n token?: string | null;\n signal?: AbortSignal;\n}\n\nexport interface FetchBoardsResult {\n boards: CanvasBoardSummary[];\n /** Plain sentence for the UI; null when the read succeeded. */\n error: string | null;\n}\n\n/** In-memory board list so revisiting Canvas Native does not re-flash the spinner. */\nlet boardsCache: { url: string; boards: CanvasBoardSummary[] } | null = null;\n\nexport function getCachedCanvasBoards(url: string): CanvasBoardSummary[] | null {\n if (!url || !boardsCache || boardsCache.url !== url) return null;\n return boardsCache.boards;\n}\n\n/**\n * Drop the in-memory board cache. Boards are re-fetchable from the surface\n * index, so this is safe to call under memory pressure - the next read simply\n * goes to the network. Registered as a memory reclaimer (see features/memory).\n */\nexport function clearCachedCanvasBoards(): void {\n boardsCache = null;\n}\n\nexport function setCachedCanvasBoards(url: string, boards: CanvasBoardSummary[]): void {\n if (!url) return;\n boardsCache = { url, boards };\n}\n\n/**\n * The caller's canvases, newest first.\n *\n * Empty boards are dropped, matching web `pullBoards` — the grid only shows\n * canvases with media. Only the scratch `global` row is skipped for the same\n * reason as web (it would merge every `/c/new` scratch into one shared row).\n */\nexport async function fetchMyCanvasBoards(opts: FetchBoardsOptions): Promise<FetchBoardsResult> {\n if (!opts.url) {\n return { boards: [], error: 'No canvas index configured for this build.' };\n }\n\n let payload: SurfaceIndexResponse;\n try {\n const response = await fetch(opts.url, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n ...(opts.token ? { authorization: `Bearer ${opts.token}` } : {}),\n },\n body: JSON.stringify({\n query: `query MySurfaceChannels($surface: SurfaceType) {\n mySurfaceChannels(surface: $surface) { ${CHANNEL_FIELDS} }\n }`,\n variables: { surface: 'canvas' },\n }),\n signal: opts.signal,\n });\n\n if (response.status === 401 || response.status === 403) {\n return { boards: [], error: 'Your session expired. Sign in again to see your canvases.' };\n }\n if (!response.ok) {\n return { boards: [], error: `The canvas index is unreachable (HTTP ${response.status}).` };\n }\n payload = (await response.json()) as SurfaceIndexResponse;\n } catch (err) {\n if (err instanceof Error && err.name === 'AbortError') {\n return { boards: [], error: null };\n }\n return { boards: [], error: 'Could not reach the canvas index. Check your connection.' };\n }\n\n if (payload?.errors?.length) {\n // GraphQL errors arrive with HTTP 200. The index reports an unauthenticated\n // caller as \"Missing tenantId in userContext\", which is a developer\n // sentence - say what the user can actually do about it.\n const raw = payload.errors[0]?.message || '';\n const isAuth = /tenantid|unauthenticated|unauthorized|not authorised|forbidden/i.test(raw);\n return {\n boards: [],\n error: isAuth\n ? 'Your session expired. Sign in again to see your canvases.'\n : raw || 'The canvas index rejected the request.',\n };\n }\n\n const rows = payload?.data?.mySurfaceChannels ?? [];\n const boards: CanvasBoardSummary[] = [];\n for (const row of rows) {\n const channelId = typeof row?.channelId === 'string' ? row.channelId : '';\n if (!channelId || channelId === SCRATCH_BOARD_ID) continue;\n const title = typeof row?.title === 'string' ? row.title : undefined;\n const board = parseBoardState(coerceMetadata(row?.metadata)) ?? emptyBoardState(title);\n if (board.items.length === 0) continue;\n boards.push({\n channelId,\n title: board.title || title,\n savedAt: board.savedAt,\n itemCount: board.items.length,\n board,\n });\n }\n\n boards.sort((a, b) => b.savedAt - a.savedAt);\n setCachedCanvasBoards(opts.url, boards);\n return { boards, error: null };\n}\n\nexport interface PushBoardOptions {\n url: string;\n token?: string | null;\n channelId: string;\n state: PersistedCanvasState;\n}\n\n/**\n * Write one board to the index. Twin of canvas-surface `pushBoard`:\n * `registerSurfaceChannel` is the idempotent upsert (update throws when the\n * row does not exist). Metadata is replaced wholesale — send the complete state.\n *\n * Returns false when the id is unsyncable (`global` / empty) or the write fails.\n * Never throws.\n */\nexport async function pushCanvasBoard(opts: PushBoardOptions): Promise<boolean> {\n const channelId = opts.channelId?.trim();\n if (!channelId || channelId === SCRATCH_BOARD_ID) return false;\n if (!opts.url) return false;\n\n try {\n const response = await fetch(opts.url, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n ...(opts.token ? { authorization: `Bearer ${opts.token}` } : {}),\n },\n body: JSON.stringify({\n query: `mutation RegisterSurfaceChannel($input: RegisterSurfaceChannelInput!) {\n registerSurfaceChannel(input: $input) { ${CHANNEL_FIELDS} }\n }`,\n variables: {\n input: {\n surface: 'canvas',\n channelId,\n sessionId: channelId,\n ...(opts.state.title ? { title: opts.state.title } : {}),\n metadata: opts.state,\n },\n },\n }),\n });\n if (!response.ok) return false;\n const payload = (await response.json()) as {\n data?: { registerSurfaceChannel?: { id?: string } | null };\n errors?: Array<{ message?: string }>;\n };\n if (payload?.errors?.length) {\n if (__DEV__) {\n // eslint-disable-next-line no-console\n console.warn('[pushCanvasBoard]', payload.errors[0]?.message);\n }\n return false;\n }\n return Boolean(payload?.data?.registerSurfaceChannel?.id);\n } catch (err) {\n if (__DEV__) {\n // eslint-disable-next-line no-console\n console.warn('[pushCanvasBoard] failed:', err);\n }\n return false;\n }\n}\n\n/**\n * `metadata` is a JSON scalar, which arrives decoded — but a backend that types\n * it as a String hands back the encoded text instead, and a board that silently\n * fails to parse looks exactly like an empty canvas. Accept both.\n */\nfunction coerceMetadata(value: unknown): unknown {\n if (typeof value !== 'string') return value;\n try {\n return JSON.parse(value);\n } catch {\n return null;\n }\n}\n\ninterface SurfaceIndexResponse {\n data?: { mySurfaceChannels?: Array<Record<string, unknown>> | null } | null;\n errors?: Array<{ message?: string }>;\n}\n\n/** Mint a board id the same way the web does: the board IS its channel. */\nexport function newBoardChannelId(): string {\n const rand = () => Math.random().toString(36).slice(2, 10);\n try {\n const bytes = new Uint8Array(8);\n (globalThis.crypto as Crypto | undefined)?.getRandomValues?.(bytes);\n if (bytes.some((b) => b !== 0)) {\n return `canvas-${Array.from(bytes, (b) => b.toString(16).padStart(2, '0')).join('')}`;\n }\n } catch {\n // fall through to Math.random\n }\n return `canvas-${rand()}${rand()}`;\n}\n\n/**\n * Write one board to the index - the native twin of the web's `pushBoard`.\n * `registerSurfaceChannel` because it is the idempotent upsert (update throws\n * when the row does not exist). `metadata` is REPLACED wholesale by the\n * backend, so the complete state goes every time; never send a patch.\n */\nexport async function saveCanvasBoard(opts: {\n url: string;\n token?: string | null;\n channelId: string;\n board: PersistedCanvasState;\n}): Promise<{ ok: boolean; error: string | null }> {\n if (!opts.url) return { ok: false, error: 'No canvas index configured for this build.' };\n try {\n const response = await fetch(opts.url, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n ...(opts.token ? { authorization: `Bearer ${opts.token}` } : {}),\n },\n body: JSON.stringify({\n query: `mutation RegisterSurfaceChannel($input: RegisterSurfaceChannelInput!) {\n registerSurfaceChannel(input: $input) { id channelId }\n }`,\n variables: {\n input: {\n surface: 'canvas',\n channelId: opts.channelId,\n title: opts.board.title || 'Untitled canvas',\n metadata: opts.board,\n },\n },\n }),\n });\n if (!response.ok) return { ok: false, error: `Save failed (HTTP ${response.status}).` };\n const payload = (await response.json()) as { errors?: Array<{ message?: string }> };\n if (payload?.errors?.length) return { ok: false, error: payload.errors[0]?.message || 'Save rejected.' };\n return { ok: true, error: null };\n } catch {\n return { ok: false, error: 'Could not reach the canvas index to save.' };\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"surfaceIndex.js","sources":["../../../src/features/canvas/surfaceIndex.ts"],"sourcesContent":["/**\n * Native reader for the canvas boards in the SurfaceChannel index.\n *\n * The index (`servers/surface-index-subgraph-server`) is the ONLY store for a\n * canvas: the whole `PersistedCanvasState` rides in the row's `metadata`, and\n * `mySurfaceChannels` enumerates the caller's boards. Rows are per-USER, so the\n * phone — signed in as the same user — sees exactly what the web surface sees.\n *\n * This is the native twin of `@yantra/canvas-surface`'s `state/boards.ts`\n * (`pullBoards`). It is copied rather than imported for the same reason\n * `canvasCore.ts` is: that package builds for the DOM (vite, `import.meta.env`,\n * `window.location`), and importing it would drag the web toolchain into Metro.\n * The contract that matters is the wire shape, which both sides pin.\n *\n * Reads are best-effort: an unreachable index yields an error string for the UI\n * rather than throwing, matching how the web surface degrades.\n */\nimport { emptyBoardState, parseBoardState, type PersistedCanvasState } from './canvasCore';\n\n/** Fields the index returns for a channel row (mirror of CHANNEL_FIELDS). */\nconst CHANNEL_FIELDS = 'id surface channelId title metadata updatedAt';\n\n/**\n * The web surface's `/c/new` scratch board. It is not a real board (no host\n * session backs it), and `pullBoards` skips it — so must this, or an empty\n * scratch row would shadow the user's actual canvases.\n */\nconst SCRATCH_BOARD_ID = 'global';\n\nexport interface CanvasBoardSummary {\n channelId: string;\n title?: string;\n savedAt: number;\n itemCount: number;\n board: PersistedCanvasState;\n}\n\n/**\n * Where the index lives for this environment.\n *\n * Mirrors the surface-kit fallback: the index is a sibling host of the backend,\n * so drop the backend's first label and prefix `surface-index-backend.`\n * (`ideback.yantra-app-v1.cdebase.dev` -> `surface-index-backend.yantra-app-v1.cdebase.dev`).\n * An explicit URL always wins, so a non-standard environment sets one env var\n * instead of needing a code change.\n */\nexport function surfaceIndexUrl(graphqlUrl: string, explicit?: string): string {\n const override = (explicit || '').trim();\n if (override) return override;\n\n const base = (graphqlUrl || '').trim();\n if (!base) return '';\n try {\n const { protocol, host } = parseOrigin(base);\n const labels = host.split('.');\n if (labels.length < 3) return '';\n return `${protocol}//surface-index-backend.${labels.slice(1).join('.')}/graphql`;\n } catch {\n return '';\n }\n}\n\n/**\n * Index GraphQL URL from the same SURFACE_URL_TEMPLATE the native remotes use\n * (`https://{slug}-surface.<cluster>/` → `https://surface-index-backend.<cluster>/graphql`).\n * Local GRAPHQL_URL cannot derive a host; this is the develop-lane fallback.\n */\nexport function surfaceIndexUrlFromTemplate(template: string): string {\n const trimmed = (template || '').trim();\n const match = trimmed.match(/^(https?):\\/\\/\\{slug\\}-surface\\.([^/]+)/i);\n if (!match) return '';\n const host = match[2].replace(/\\/+$/, '');\n if (!host) return '';\n return `${match[1].toLowerCase()}://surface-index-backend.${host}/graphql`;\n}\n\nfunction parseOrigin(url: string): { protocol: string; host: string } {\n // RN has URL via react-native-url-polyfill (imported in the app entry), but\n // this module is also loaded by jest and the surface build, so parse by hand.\n const match = url.match(/^(https?:)\\/\\/([^/]+)/i);\n if (!match) throw new Error(`unparseable url: ${url}`);\n return { protocol: match[1].toLowerCase(), host: match[2].toLowerCase() };\n}\n\nexport interface FetchBoardsOptions {\n url: string;\n token?: string | null;\n signal?: AbortSignal;\n}\n\nexport interface FetchBoardsResult {\n boards: CanvasBoardSummary[];\n /** Plain sentence for the UI; null when the read succeeded. */\n error: string | null;\n}\n\n/** In-memory board list so revisiting Canvas Native does not re-flash the spinner. */\nlet boardsCache: { url: string; boards: CanvasBoardSummary[] } | null = null;\n\nexport function getCachedCanvasBoards(url: string): CanvasBoardSummary[] | null {\n if (!url || !boardsCache || boardsCache.url !== url) return null;\n return boardsCache.boards;\n}\n\n/**\n * Drop the in-memory board cache. Boards are re-fetchable from the surface\n * index, so this is safe to call under memory pressure - the next read simply\n * goes to the network. Registered as a memory reclaimer (see features/memory).\n */\nexport function clearCachedCanvasBoards(): void {\n boardsCache = null;\n}\n\nexport function setCachedCanvasBoards(url: string, boards: CanvasBoardSummary[]): void {\n if (!url) return;\n boardsCache = { url, boards };\n}\n\n/**\n * The caller's canvases, newest first.\n *\n * Empty boards are dropped, matching web `pullBoards` — the grid only shows\n * canvases with media. Only the scratch `global` row is skipped for the same\n * reason as web (it would merge every `/c/new` scratch into one shared row).\n */\nexport async function fetchMyCanvasBoards(opts: FetchBoardsOptions): Promise<FetchBoardsResult> {\n if (!opts.url) {\n return { boards: [], error: 'No canvas index configured for this build.' };\n }\n\n let payload: SurfaceIndexResponse;\n try {\n const response = await fetch(opts.url, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n ...(opts.token ? { authorization: `Bearer ${opts.token}` } : {}),\n },\n body: JSON.stringify({\n query: `query MySurfaceChannels($surface: SurfaceType) {\n mySurfaceChannels(surface: $surface) { ${CHANNEL_FIELDS} }\n }`,\n variables: { surface: 'canvas' },\n }),\n signal: opts.signal,\n });\n\n if (response.status === 401 || response.status === 403) {\n return { boards: [], error: 'Your session expired. Sign in again to see your canvases.' };\n }\n if (!response.ok) {\n return { boards: [], error: `The canvas index is unreachable (HTTP ${response.status}).` };\n }\n payload = (await response.json()) as SurfaceIndexResponse;\n } catch (err) {\n if (err instanceof Error && err.name === 'AbortError') {\n return { boards: [], error: null };\n }\n return { boards: [], error: 'Could not reach the canvas index. Check your connection.' };\n }\n\n if (payload?.errors?.length) {\n // GraphQL errors arrive with HTTP 200. The index reports an unauthenticated\n // caller as \"Missing tenantId in userContext\", which is a developer\n // sentence - say what the user can actually do about it.\n const raw = payload.errors[0]?.message || '';\n const isAuth = /tenantid|unauthenticated|unauthorized|not authorised|forbidden/i.test(raw);\n return {\n boards: [],\n error: isAuth\n ? 'Your session expired. Sign in again to see your canvases.'\n : raw || 'The canvas index rejected the request.',\n };\n }\n\n const rows = payload?.data?.mySurfaceChannels ?? [];\n const boards: CanvasBoardSummary[] = [];\n for (const row of rows) {\n const channelId = typeof row?.channelId === 'string' ? row.channelId : '';\n if (!channelId || channelId === SCRATCH_BOARD_ID) continue;\n const title = typeof row?.title === 'string' ? row.title : undefined;\n const board = parseBoardState(coerceMetadata(row?.metadata)) ?? emptyBoardState(title);\n if (board.items.length === 0) continue;\n boards.push({\n channelId,\n title: board.title || title,\n savedAt: board.savedAt,\n itemCount: board.items.length,\n board,\n });\n }\n\n boards.sort((a, b) => b.savedAt - a.savedAt);\n setCachedCanvasBoards(opts.url, boards);\n return { boards, error: null };\n}\n\nexport interface PushBoardOptions {\n url: string;\n token?: string | null;\n channelId: string;\n state: PersistedCanvasState;\n}\n\n/**\n * Write one board to the index. Twin of canvas-surface `pushBoard`:\n * `registerSurfaceChannel` is the idempotent upsert (update throws when the\n * row does not exist). Metadata is replaced wholesale — send the complete state.\n *\n * Returns false when the id is unsyncable (`global` / empty) or the write fails.\n * Never throws.\n */\nexport async function pushCanvasBoard(opts: PushBoardOptions): Promise<boolean> {\n const channelId = opts.channelId?.trim();\n if (!channelId || channelId === SCRATCH_BOARD_ID) return false;\n if (!opts.url) return false;\n\n try {\n const response = await fetch(opts.url, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n ...(opts.token ? { authorization: `Bearer ${opts.token}` } : {}),\n },\n body: JSON.stringify({\n query: `mutation RegisterSurfaceChannel($input: RegisterSurfaceChannelInput!) {\n registerSurfaceChannel(input: $input) { ${CHANNEL_FIELDS} }\n }`,\n variables: {\n input: {\n surface: 'canvas',\n channelId,\n sessionId: channelId,\n ...(opts.state.title ? { title: opts.state.title } : {}),\n metadata: opts.state,\n },\n },\n }),\n });\n if (!response.ok) return false;\n const payload = (await response.json()) as {\n data?: { registerSurfaceChannel?: { id?: string } | null };\n errors?: Array<{ message?: string }>;\n };\n if (payload?.errors?.length) {\n if (__DEV__) {\n // eslint-disable-next-line no-console\n console.warn('[pushCanvasBoard]', payload.errors[0]?.message);\n }\n return false;\n }\n return Boolean(payload?.data?.registerSurfaceChannel?.id);\n } catch (err) {\n if (__DEV__) {\n // eslint-disable-next-line no-console\n console.warn('[pushCanvasBoard] failed:', err);\n }\n return false;\n }\n}\n\n/**\n * `metadata` is a JSON scalar, which arrives decoded — but a backend that types\n * it as a String hands back the encoded text instead, and a board that silently\n * fails to parse looks exactly like an empty canvas. Accept both.\n */\nfunction coerceMetadata(value: unknown): unknown {\n if (typeof value !== 'string') return value;\n try {\n return JSON.parse(value);\n } catch {\n return null;\n }\n}\n\ninterface SurfaceIndexResponse {\n data?: { mySurfaceChannels?: Array<Record<string, unknown>> | null } | null;\n errors?: Array<{ message?: string }>;\n}\n\n/** Mint a board id the same way the web does: the board IS its channel. */\nexport function newBoardChannelId(): string {\n const rand = () => Math.random().toString(36).slice(2, 10);\n try {\n const bytes = new Uint8Array(8);\n (globalThis.crypto as Crypto | undefined)?.getRandomValues?.(bytes);\n if (bytes.some((b) => b !== 0)) {\n return `canvas-${Array.from(bytes, (b) => b.toString(16).padStart(2, '0')).join('')}`;\n }\n } catch {\n // fall through to Math.random\n }\n return `canvas-${rand()}${rand()}`;\n}\n"],"names":[],"mappings":"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"}