@adminide-stack/yantra-mobile 12.0.129-alpha.0 → 12.0.129

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
@@ -0,0 +1,161 @@
1
+ import {isChatTurn}from'./agentTurn.js';import {creationKey}from'./designBoard.js';import {briefWithReference}from'./designChat.js';import {designEditMessage,toArtifact,editDesign,designGenerateMessage,generateDesign,DesignQuestionError}from'./designConnector.js';import {looksLikeDocument,extractDocument,renderableHtml}from'./designDocument.js';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
+ async function durablePage(ctx, message, model, onChunk, hooks) {
21
+ var _a, _b;
22
+ if (!ctx.agent || !ctx.channelId) return null;
23
+ try {
24
+ const {
25
+ text,
26
+ sessionId
27
+ } = await ctx.agent.turn(message, {
28
+ raw: true,
29
+ channelId: ctx.channelId,
30
+ sessionId: ctx.sessionId,
31
+ model,
32
+ signal: hooks.signal,
33
+ onStatus: hooks.onStatus,
34
+ onDelta: onChunk
35
+ });
36
+ (_a = ctx.onSession) == null ? void 0 : _a.call(ctx, sessionId);
37
+ const page = looksLikeDocument(text) ? text : extractDocument(text);
38
+ return page || null;
39
+ } catch (err) {
40
+ if (((_b = hooks.signal) == null ? void 0 : _b.aborted) || err instanceof DesignQuestionError) throw err;
41
+ return null;
42
+ }
43
+ }
44
+ function laneOf(send) {
45
+ if (send.editTarget) return "edit";
46
+ if (send.reference) return "reference";
47
+ return isChatTurn({
48
+ templateId: send.templateId,
49
+ systemId: send.systemId
50
+ }) ? "chat" : "generate";
51
+ }
52
+ async function runDesignSend(ctx, send, hooks = {}) {
53
+ var _a, _b, _c, _d;
54
+ let streamed = "";
55
+ const onChunk = (chunk) => {
56
+ var _a2;
57
+ streamed += chunk;
58
+ const page2 = renderableHtml(streamed);
59
+ if (page2) (_a2 = hooks.onPartial) == null ? void 0 : _a2.call(hooks, page2);
60
+ };
61
+ const lane = laneOf(send);
62
+ if (lane === "edit") {
63
+ const target = send.editTarget;
64
+ const params = __spreadProps(__spreadValues({
65
+ html: target.html,
66
+ instruction: send.text
67
+ }, target.id ? {
68
+ id: target.id
69
+ } : {}), {
70
+ title: target.title,
71
+ systemId: (_a = send.systemId) != null ? _a : target.systemId,
72
+ templateId: target.templateId,
73
+ model: send.modelId
74
+ });
75
+ const durable = await durablePage(ctx, designEditMessage(params), send.modelId, onChunk, hooks);
76
+ if (!durable) streamed = "";
77
+ const edited = durable ? toArtifact(durable, {}, {
78
+ title: target.title,
79
+ id: target.id,
80
+ systemId: params.systemId,
81
+ templateId: target.templateId
82
+ }) : await editDesign(ctx.exec, params, onChunk, hooks.signal);
83
+ return {
84
+ kind: "page",
85
+ artifact: __spreadProps(__spreadValues({}, edited), {
86
+ id: (_b = edited.id) != null ? _b : target.id
87
+ }),
88
+ replaces: creationKey(target),
89
+ replaced: target
90
+ };
91
+ }
92
+ if (lane === "reference" || lane === "generate") {
93
+ const reference = send.reference;
94
+ const params = {
95
+ brief: reference ? briefWithReference(send.text, reference) : send.text,
96
+ templateId: send.templateId,
97
+ systemId: (_c = send.systemId) != null ? _c : reference == null ? void 0 : reference.systemId,
98
+ model: send.modelId
99
+ };
100
+ const durable = await durablePage(ctx, designGenerateMessage(params), send.modelId, onChunk, hooks);
101
+ if (!durable) streamed = "";
102
+ const artifact = durable ? toArtifact(durable, {}, {
103
+ brief: send.text,
104
+ systemId: params.systemId,
105
+ templateId: params.templateId
106
+ }) : await generateDesign(ctx.exec, params, onChunk, hooks.signal);
107
+ return {
108
+ kind: "page",
109
+ artifact: reference && !/<title>/i.test(artifact.html) ? __spreadProps(__spreadValues({}, artifact), {
110
+ title: send.text.slice(0, 60)
111
+ }) : artifact
112
+ };
113
+ }
114
+ if (!ctx.agent && send.control) return {
115
+ kind: "reply",
116
+ text: ""
117
+ };
118
+ if (!ctx.agent) {
119
+ const artifact = await generateDesign(ctx.exec, {
120
+ brief: send.text,
121
+ model: send.modelId
122
+ }, onChunk, hooks.signal);
123
+ return {
124
+ kind: "page",
125
+ artifact
126
+ };
127
+ }
128
+ let reply = "";
129
+ const {
130
+ text,
131
+ sessionId
132
+ } = await ctx.agent.turn(send.text, __spreadProps(__spreadValues(__spreadProps(__spreadValues({}, send.control ? {
133
+ raw: true
134
+ } : {}), {
135
+ sessionId: ctx.sessionId
136
+ }), ctx.channelId ? {
137
+ channelId: ctx.channelId
138
+ } : {}), {
139
+ model: send.modelId,
140
+ signal: hooks.signal,
141
+ onStatus: hooks.onStatus,
142
+ onDelta: (delta) => {
143
+ var _a2;
144
+ reply += delta;
145
+ onChunk(delta);
146
+ (_a2 = hooks.onReply) == null ? void 0 : _a2.call(hooks, reply);
147
+ }
148
+ }));
149
+ (_d = ctx.onSession) == null ? void 0 : _d.call(ctx, sessionId);
150
+ const page = looksLikeDocument(text) ? text : extractDocument(text);
151
+ if (page) return {
152
+ kind: "page",
153
+ artifact: toArtifact(page, {}, {
154
+ brief: send.text
155
+ })
156
+ };
157
+ return {
158
+ kind: "reply",
159
+ text: text.trim()
160
+ };
161
+ }export{laneOf,runDesignSend};//# sourceMappingURL=designRun.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"designRun.js","sources":["../../../../src/features/design/surface/designRun.ts"],"sourcesContent":["/**\n * One composer send, routed to its lane - native twin of the send routing in\n * design-surface `standalone/standaloneServices.tsx` (+ `designMachine`):\n *\n * edit target YANTRA_DESIGN_EDIT on the open page, landing over it\n * reference a new page generated from the open one (its system kept)\n * template/system YANTRA_DESIGN_GENERATE with those picks\n * bare text the agent chat turn; the skill answers or designs\n *\n * With the board's chat channel at hand, the page-making lanes run on the\n * DURABLE lane first - an agent turn bound to the channel carrying the web's\n * pinned directive - so the turn is stored in the board's conversation, then\n * fall back to the direct exec lane on any failure, exactly as the web does.\n *\n * Pure apart from the injected transports: runs under jest as-is.\n */\nimport { isChatTurn, type AgentTurnTransport } from './agentTurn';\nimport { creationKey, type DesignArtifact } from './designBoard';\nimport { briefWithReference } from './designChat';\nimport {\n DesignQuestionError,\n designEditMessage,\n designGenerateMessage,\n editDesign,\n generateDesign,\n toArtifact,\n type EditParams,\n type GenerateParams,\n} from './designConnector';\nimport { extractDocument, looksLikeDocument, renderableHtml } from './designDocument';\nimport type { ExecTransport } from './execStream';\n\nexport interface DesignSend {\n text: string;\n modelId?: string;\n templateId?: string;\n systemId?: string;\n /** The open design, edited in place. */\n editTarget?: DesignArtifact;\n /** The open design, used as reference for a NEW one (\"New from this\"). */\n reference?: DesignArtifact;\n /** A card's answer (`[CONNECTOR_CONNECTED:…]`): sent to the agent as is, no routing note. */\n control?: boolean;\n}\n\nexport type DesignRunResult =\n | { kind: 'page'; artifact: DesignArtifact; replaces?: string; replaced?: DesignArtifact }\n | { kind: 'reply'; text: string };\n\nexport interface DesignRunHooks {\n /** The page so far, as it streams - the generating tile draws it. */\n onPartial?: (html: string) => void;\n /** Reply prose so far (chat lane). */\n onReply?: (text: string) => void;\n onStatus?: (status: string) => void;\n signal?: AbortSignal;\n}\n\nexport interface DesignRunContext {\n exec: ExecTransport;\n agent?: AgentTurnTransport;\n /** The board's agent session, reused across its chat turns. */\n sessionId?: string | null;\n onSession?: (sessionId: string) => void;\n /** The board's chat channel: turns are stored there, and page-making tries the durable lane first. */\n channelId?: string;\n}\n\n/**\n * A page-making turn on the durable lane, or null when that lane did not yield\n * a page (no agent, no channel, a failure) - the caller then runs direct exec.\n * A stop or a question is final, not a reason to retry.\n */\nasync function durablePage(\n ctx: DesignRunContext,\n message: string,\n model: string | undefined,\n onChunk: (chunk: string) => void,\n hooks: DesignRunHooks,\n): Promise<string | null> {\n if (!ctx.agent || !ctx.channelId) return null;\n try {\n const { text, sessionId } = await ctx.agent.turn(message, {\n raw: true,\n channelId: ctx.channelId,\n sessionId: ctx.sessionId,\n model,\n signal: hooks.signal,\n onStatus: hooks.onStatus,\n onDelta: onChunk,\n });\n ctx.onSession?.(sessionId);\n const page = looksLikeDocument(text) ? text : extractDocument(text);\n return page || null;\n } catch (err) {\n if (hooks.signal?.aborted || err instanceof DesignQuestionError) throw err;\n return null;\n }\n}\n\n/** The lane a send takes. */\nexport function laneOf(send: DesignSend): 'edit' | 'reference' | 'generate' | 'chat' {\n if (send.editTarget) return 'edit';\n if (send.reference) return 'reference';\n return isChatTurn({ templateId: send.templateId, systemId: send.systemId }) ? 'chat' : 'generate';\n}\n\nexport async function runDesignSend(\n ctx: DesignRunContext,\n send: DesignSend,\n hooks: DesignRunHooks = {},\n): Promise<DesignRunResult> {\n let streamed = '';\n const onChunk = (chunk: string) => {\n streamed += chunk;\n const page = renderableHtml(streamed);\n if (page) hooks.onPartial?.(page);\n };\n const lane = laneOf(send);\n\n if (lane === 'edit') {\n const target = send.editTarget!;\n const params: EditParams = {\n html: target.html,\n instruction: send.text,\n ...(target.id ? { id: target.id } : {}),\n title: target.title,\n systemId: send.systemId ?? target.systemId,\n templateId: target.templateId,\n model: send.modelId,\n };\n const durable = await durablePage(ctx, designEditMessage(params), send.modelId, onChunk, hooks);\n // The failed attempt's prose is not the retry's page.\n if (!durable) streamed = '';\n const edited = durable\n ? toArtifact(\n durable,\n {},\n { title: target.title, id: target.id, systemId: params.systemId, templateId: target.templateId },\n )\n : await editDesign(ctx.exec, params, onChunk, hooks.signal);\n // The id is kept so the open creation updates in place instead of a new one landing.\n return {\n kind: 'page',\n artifact: { ...edited, id: edited.id ?? target.id },\n replaces: creationKey(target),\n replaced: target,\n };\n }\n\n if (lane === 'reference' || lane === 'generate') {\n const reference = send.reference;\n const params: GenerateParams = {\n brief: reference ? briefWithReference(send.text, reference) : send.text,\n templateId: send.templateId,\n systemId: send.systemId ?? reference?.systemId,\n model: send.modelId,\n };\n const durable = await durablePage(ctx, designGenerateMessage(params), send.modelId, onChunk, hooks);\n if (!durable) streamed = '';\n const artifact = durable\n ? toArtifact(durable, {}, { brief: send.text, systemId: params.systemId, templateId: params.templateId })\n : await generateDesign(ctx.exec, params, onChunk, hooks.signal);\n // A reference brief is long; the creation is titled by what was asked, not by the scaffolding.\n return {\n kind: 'page',\n artifact:\n reference && !/<title>/i.test(artifact.html)\n ? { ...artifact, title: send.text.slice(0, 60) }\n : artifact,\n };\n }\n\n if (!ctx.agent && send.control) return { kind: 'reply', text: '' };\n if (!ctx.agent) {\n // No agent lane on this build: a bare send designs, as the old surface did.\n const artifact = await generateDesign(\n ctx.exec,\n { brief: send.text, model: send.modelId },\n onChunk,\n hooks.signal,\n );\n return { kind: 'page', artifact };\n }\n let reply = '';\n const { text, sessionId } = await ctx.agent.turn(send.text, {\n ...(send.control ? { raw: true } : {}),\n sessionId: ctx.sessionId,\n ...(ctx.channelId ? { channelId: ctx.channelId } : {}),\n model: send.modelId,\n signal: hooks.signal,\n onStatus: hooks.onStatus,\n onDelta: (delta) => {\n reply += delta;\n onChunk(delta);\n hooks.onReply?.(reply);\n },\n });\n ctx.onSession?.(sessionId);\n const page = looksLikeDocument(text) ? text : extractDocument(text);\n if (page) return { kind: 'page', artifact: toArtifact(page, {}, { brief: send.text }) };\n return { kind: 'reply', text: text.trim() };\n}\n"],"names":["_a","page"],"mappings":"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"}
@@ -0,0 +1,119 @@
1
+ const rgba = (rgb) => (alpha) => `rgba(${rgb},${alpha})`;
2
+ const DESIGN_THEME_PAINTS = {
3
+ light: ["#02677f", "#ffb500", "#309b42", "#d3451e", "#03a2bc"],
4
+ dark: ["#1b8fa5", "#eaaa2c", "#30893e", "#cd5537", "#5db4bf"]
5
+ };
6
+ const DESIGN_LIGHT = {
7
+ background: "#f5fafb",
8
+ foreground: "#081e24",
9
+ card: "#fcffff",
10
+ cardForeground: "#030d11",
11
+ popover: "#fcffff",
12
+ popoverForeground: "#030d11",
13
+ primary: "#02677f",
14
+ primaryForeground: "#ffffff",
15
+ secondary: "#ffb500",
16
+ secondaryForeground: "#321c04",
17
+ muted: "#e4eef0",
18
+ mutedForeground: "#5a6569",
19
+ accent: "#03a2bc",
20
+ accentForeground: "#ffffff",
21
+ destructive: "#d3451e",
22
+ destructiveForeground: "#ffffff",
23
+ border: "#d4e1e4",
24
+ input: "#b3c0c4",
25
+ ring: "#02677f",
26
+ surface: "#fcffff",
27
+ inkSoft: "#2d3b40",
28
+ borderStrong: "#b3c0c4",
29
+ primaryText: "#02677f",
30
+ destructiveText: "#b23a18",
31
+ destructiveSoft: "#fbe9e4",
32
+ backgroundAlpha: rgba("245,250,251"),
33
+ tint: rgba("8,30,36")
34
+ };
35
+ const DESIGN_DARK = {
36
+ background: "#020608",
37
+ foreground: "#d2d9da",
38
+ card: "#060e11",
39
+ cardForeground: "#d2d9da",
40
+ popover: "#060e11",
41
+ popoverForeground: "#d2d9da",
42
+ primary: "#03a2bc",
43
+ primaryForeground: "#010406",
44
+ secondary: "#eaaa2c",
45
+ secondaryForeground: "#221202",
46
+ muted: "#111d20",
47
+ mutedForeground: "#80888a",
48
+ accent: "#084150",
49
+ accentForeground: "#d6e9ec",
50
+ destructive: "#e45937",
51
+ destructiveForeground: "#eeeeee",
52
+ border: "#1e2b30",
53
+ input: "#28353a",
54
+ ring: "#008095",
55
+ surface: "#060e11",
56
+ inkSoft: "#b4bec0",
57
+ borderStrong: "#28353a",
58
+ primaryText: "#5db4bf",
59
+ destructiveText: "#f08a70",
60
+ destructiveSoft: "#2a120b",
61
+ backgroundAlpha: rgba("2,6,8"),
62
+ tint: rgba("210,217,218")
63
+ };
64
+ const DESIGN_RADIUS = 0;
65
+ const HEX = /#([0-9a-f]{6}|[0-9a-f]{3})\b/gi;
66
+ function saturationLightness(hex) {
67
+ const n = parseInt(hex, 16);
68
+ const [r, g, b] = [n >> 16 & 255, n >> 8 & 255, n & 255].map((v) => v / 255);
69
+ const max = Math.max(r, g, b);
70
+ const min = Math.min(r, g, b);
71
+ const l = (max + min) / 2;
72
+ const s = max === min ? 0 : (max - min) / (1 - Math.abs(2 * l - 1));
73
+ return {
74
+ s,
75
+ l
76
+ };
77
+ }
78
+ function paintsFromPreviews(previews, perDesign = 2, max = 16) {
79
+ var _a;
80
+ const out = /* @__PURE__ */ new Set();
81
+ for (const html of previews) {
82
+ const counts = /* @__PURE__ */ new Map();
83
+ HEX.lastIndex = 0;
84
+ let m;
85
+ while (m = HEX.exec(html)) {
86
+ const raw = m[1].toLowerCase();
87
+ const hex = raw.length === 3 ? [...raw].map((c) => c + c).join("") : raw;
88
+ const {
89
+ s,
90
+ l
91
+ } = saturationLightness(hex);
92
+ if (s < 0.35 || l < 0.18 || l > 0.82) continue;
93
+ counts.set(hex, ((_a = counts.get(hex)) != null ? _a : 0) + 1);
94
+ }
95
+ for (const [hex] of [...counts].sort((a, b) => b[1] - a[1]).slice(0, perDesign)) out.add(`#${hex}`);
96
+ if (out.size >= max) break;
97
+ }
98
+ return [...out].slice(0, max);
99
+ }
100
+ const MINUTE = 6e4;
101
+ const HOUR = 60 * MINUTE;
102
+ const DAY = 24 * HOUR;
103
+ const MONTHS = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
104
+ function editedAgo(ts, now = Date.now()) {
105
+ const ago = now - ts;
106
+ const unit = (n, word) => `${n} ${word}${n === 1 ? "" : "s"} ago`;
107
+ if (ago < HOUR) return unit(Math.max(1, Math.round(ago / MINUTE)), "minute");
108
+ if (ago < DAY) {
109
+ const h = Math.round(ago / HOUR);
110
+ return h >= 24 ? "yesterday" : unit(h, "hour");
111
+ }
112
+ if (ago < 30 * DAY) {
113
+ const d = Math.round(ago / DAY);
114
+ return d === 1 ? "yesterday" : unit(d, "day");
115
+ }
116
+ const date = new Date(ts);
117
+ const sameYear = date.getFullYear() === new Date(now).getFullYear();
118
+ return `${MONTHS[date.getMonth()]} ${date.getDate()}${sameYear ? "" : `, ${date.getFullYear()}`}`;
119
+ }export{DESIGN_DARK,DESIGN_LIGHT,DESIGN_RADIUS,DESIGN_THEME_PAINTS,editedAgo,paintsFromPreviews};//# sourceMappingURL=designTheme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"designTheme.js","sources":["../../../../src/features/design/surface/designTheme.ts"],"sourcesContent":["/**\n * The Design surface's own look - native twin of design-surface\n * `styles/theme.css`: teal primary on a cool white, amber secondary, square\n * corners (`--radius: 0`), its own chart colours for the paint.\n *\n * The tokens, mapped onto the canvas palette's shape; `designPalette.ts`\n * builds the full palette every screen reads through `CanvasThemeProvider`.\n * Pure: runs under jest as-is.\n */\nimport type { CanvasPalette, CanvasThemeMode } from '../../canvas/canvasTheme';\n\nconst rgba = (rgb: string) => (alpha: number) => `rgba(${rgb},${alpha})`;\n\n/** `--chart-1..5`: the paint the hero falls back to before there are designs to mix it from. */\nexport const DESIGN_THEME_PAINTS: Record<CanvasThemeMode, string[]> = {\n light: ['#02677f', '#ffb500', '#309b42', '#d3451e', '#03a2bc'],\n dark: ['#1b8fa5', '#eaaa2c', '#30893e', '#cd5537', '#5db4bf'],\n};\n\nexport const DESIGN_LIGHT: Partial<CanvasPalette> = {\n background: '#f5fafb',\n foreground: '#081e24',\n card: '#fcffff',\n cardForeground: '#030d11',\n popover: '#fcffff',\n popoverForeground: '#030d11',\n primary: '#02677f',\n primaryForeground: '#ffffff',\n secondary: '#ffb500',\n secondaryForeground: '#321c04',\n muted: '#e4eef0',\n mutedForeground: '#5a6569',\n accent: '#03a2bc',\n accentForeground: '#ffffff',\n destructive: '#d3451e',\n destructiveForeground: '#ffffff',\n border: '#d4e1e4',\n input: '#b3c0c4',\n ring: '#02677f',\n surface: '#fcffff',\n inkSoft: '#2d3b40',\n borderStrong: '#b3c0c4',\n primaryText: '#02677f',\n destructiveText: '#b23a18',\n destructiveSoft: '#fbe9e4',\n backgroundAlpha: rgba('245,250,251'),\n tint: rgba('8,30,36'),\n};\n\nexport const DESIGN_DARK: Partial<CanvasPalette> = {\n background: '#020608',\n foreground: '#d2d9da',\n card: '#060e11',\n cardForeground: '#d2d9da',\n popover: '#060e11',\n popoverForeground: '#d2d9da',\n primary: '#03a2bc',\n primaryForeground: '#010406',\n secondary: '#eaaa2c',\n secondaryForeground: '#221202',\n muted: '#111d20',\n mutedForeground: '#80888a',\n accent: '#084150',\n accentForeground: '#d6e9ec',\n destructive: '#e45937',\n destructiveForeground: '#eeeeee',\n border: '#1e2b30',\n input: '#28353a',\n ring: '#008095',\n surface: '#060e11',\n inkSoft: '#b4bec0',\n borderStrong: '#28353a',\n primaryText: '#5db4bf',\n destructiveText: '#f08a70',\n destructiveSoft: '#2a120b',\n backgroundAlpha: rgba('2,6,8'),\n tint: rgba('210,217,218'),\n};\n\n/** `--radius: 0`: panels, tiles and buttons are square; pills stay pills. */\nexport const DESIGN_RADIUS = 0;\n\nconst HEX = /#([0-9a-f]{6}|[0-9a-f]{3})\\b/gi;\n\nfunction saturationLightness(hex: string): { s: number; l: number } {\n const n = parseInt(hex, 16);\n const [r, g, b] = [(n >> 16) & 255, (n >> 8) & 255, n & 255].map((v) => v / 255);\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const l = (max + min) / 2;\n const s = max === min ? 0 : (max - min) / (1 - Math.abs(2 * l - 1));\n return { s, l };\n}\n\n/**\n * The most-used saturated colours in each saved page, `perDesign` apiece -\n * the hero's paint is mixed from your own designs (web `paintsFromPreviews`).\n */\nexport function paintsFromPreviews(previews: readonly string[], perDesign = 2, max = 16): string[] {\n const out = new Set<string>();\n for (const html of previews) {\n const counts = new Map<string, number>();\n HEX.lastIndex = 0;\n let m: RegExpExecArray | null;\n while ((m = HEX.exec(html))) {\n const raw = m[1].toLowerCase();\n const hex = raw.length === 3 ? [...raw].map((c) => c + c).join('') : raw;\n const { s, l } = saturationLightness(hex);\n // Paint, not page: greys, near-black ink and near-white grounds carry no colour.\n if (s < 0.35 || l < 0.18 || l > 0.82) continue;\n counts.set(hex, (counts.get(hex) ?? 0) + 1);\n }\n for (const [hex] of [...counts].sort((a, b) => b[1] - a[1]).slice(0, perDesign)) out.add(`#${hex}`);\n if (out.size >= max) break;\n }\n return [...out].slice(0, max);\n}\n\nconst MINUTE = 60_000;\nconst HOUR = 60 * MINUTE;\nconst DAY = 24 * HOUR;\nconst MONTHS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n\n/**\n * \"2 hours ago\", \"yesterday\", then a short date past a month - web `editedAgo`\n * (Intl.RelativeTimeFormat with numeric: 'auto'), spelled out because Hermes\n * does not ship RelativeTimeFormat.\n */\nexport function editedAgo(ts: number, now = Date.now()): string {\n const ago = now - ts;\n const unit = (n: number, word: string) => `${n} ${word}${n === 1 ? '' : 's'} ago`;\n if (ago < HOUR) return unit(Math.max(1, Math.round(ago / MINUTE)), 'minute');\n if (ago < DAY) {\n const h = Math.round(ago / HOUR);\n return h >= 24 ? 'yesterday' : unit(h, 'hour');\n }\n if (ago < 30 * DAY) {\n const d = Math.round(ago / DAY);\n return d === 1 ? 'yesterday' : unit(d, 'day');\n }\n const date = new Date(ts);\n const sameYear = date.getFullYear() === new Date(now).getFullYear();\n return `${MONTHS[date.getMonth()]} ${date.getDate()}${sameYear ? '' : `, ${date.getFullYear()}`}`;\n}\n"],"names":[],"mappings":"AAUA,MAAM,IAAA,GAAO,CAAC,GAAgB,KAAA,CAAC,UAAkB,CAAQ,KAAA,EAAA,GAAG,IAAI,KAAK,CAAA,CAAA,CAAA;AAG9D,MAAM,mBAAyD,GAAA;AAAA,EACpE,OAAO,CAAC,SAAA,EAAW,SAAW,EAAA,SAAA,EAAW,WAAW,SAAS,CAAA;AAAA,EAC7D,MAAM,CAAC,SAAA,EAAW,SAAW,EAAA,SAAA,EAAW,WAAW,SAAS;AAC9D;AACO,MAAM,YAAuC,GAAA;AAAA,EAClD,UAAY,EAAA,SAAA;AAAA,EACZ,UAAY,EAAA,SAAA;AAAA,EACZ,IAAM,EAAA,SAAA;AAAA,EACN,cAAgB,EAAA,SAAA;AAAA,EAChB,OAAS,EAAA,SAAA;AAAA,EACT,iBAAmB,EAAA,SAAA;AAAA,EACnB,OAAS,EAAA,SAAA;AAAA,EACT,iBAAmB,EAAA,SAAA;AAAA,EACnB,SAAW,EAAA,SAAA;AAAA,EACX,mBAAqB,EAAA,SAAA;AAAA,EACrB,KAAO,EAAA,SAAA;AAAA,EACP,eAAiB,EAAA,SAAA;AAAA,EACjB,MAAQ,EAAA,SAAA;AAAA,EACR,gBAAkB,EAAA,SAAA;AAAA,EAClB,WAAa,EAAA,SAAA;AAAA,EACb,qBAAuB,EAAA,SAAA;AAAA,EACvB,MAAQ,EAAA,SAAA;AAAA,EACR,KAAO,EAAA,SAAA;AAAA,EACP,IAAM,EAAA,SAAA;AAAA,EACN,OAAS,EAAA,SAAA;AAAA,EACT,OAAS,EAAA,SAAA;AAAA,EACT,YAAc,EAAA,SAAA;AAAA,EACd,WAAa,EAAA,SAAA;AAAA,EACb,eAAiB,EAAA,SAAA;AAAA,EACjB,eAAiB,EAAA,SAAA;AAAA,EACjB,eAAA,EAAiB,KAAK,aAAa,CAAA;AAAA,EACnC,IAAA,EAAM,KAAK,SAAS;AACtB;AACO,MAAM,WAAsC,GAAA;AAAA,EACjD,UAAY,EAAA,SAAA;AAAA,EACZ,UAAY,EAAA,SAAA;AAAA,EACZ,IAAM,EAAA,SAAA;AAAA,EACN,cAAgB,EAAA,SAAA;AAAA,EAChB,OAAS,EAAA,SAAA;AAAA,EACT,iBAAmB,EAAA,SAAA;AAAA,EACnB,OAAS,EAAA,SAAA;AAAA,EACT,iBAAmB,EAAA,SAAA;AAAA,EACnB,SAAW,EAAA,SAAA;AAAA,EACX,mBAAqB,EAAA,SAAA;AAAA,EACrB,KAAO,EAAA,SAAA;AAAA,EACP,eAAiB,EAAA,SAAA;AAAA,EACjB,MAAQ,EAAA,SAAA;AAAA,EACR,gBAAkB,EAAA,SAAA;AAAA,EAClB,WAAa,EAAA,SAAA;AAAA,EACb,qBAAuB,EAAA,SAAA;AAAA,EACvB,MAAQ,EAAA,SAAA;AAAA,EACR,KAAO,EAAA,SAAA;AAAA,EACP,IAAM,EAAA,SAAA;AAAA,EACN,OAAS,EAAA,SAAA;AAAA,EACT,OAAS,EAAA,SAAA;AAAA,EACT,YAAc,EAAA,SAAA;AAAA,EACd,WAAa,EAAA,SAAA;AAAA,EACb,eAAiB,EAAA,SAAA;AAAA,EACjB,eAAiB,EAAA,SAAA;AAAA,EACjB,eAAA,EAAiB,KAAK,OAAO,CAAA;AAAA,EAC7B,IAAA,EAAM,KAAK,aAAa;AAC1B;AAGO,MAAM,aAAgB,GAAA;AAC7B,MAAM,GAAM,GAAA,gCAAA;AACZ,SAAS,oBAAoB,GAG3B,EAAA;AACA,EAAM,MAAA,CAAA,GAAI,QAAS,CAAA,GAAA,EAAK,EAAE,CAAA;AAC1B,EAAA,MAAM,CAAC,CAAG,EAAA,CAAA,EAAG,CAAC,CAAI,GAAA,CAAC,KAAK,EAAK,GAAA,GAAA,EAAK,CAAK,IAAA,CAAA,GAAI,KAAK,CAAI,GAAA,GAAG,EAAE,GAAI,CAAA,CAAA,CAAA,KAAK,IAAI,GAAG,CAAA;AACzE,EAAA,MAAM,GAAM,GAAA,IAAA,CAAK,GAAI,CAAA,CAAA,EAAG,GAAG,CAAC,CAAA;AAC5B,EAAA,MAAM,GAAM,GAAA,IAAA,CAAK,GAAI,CAAA,CAAA,EAAG,GAAG,CAAC,CAAA;AAC5B,EAAM,MAAA,CAAA,GAAA,CAAK,MAAM,GAAO,IAAA,CAAA;AACxB,EAAM,MAAA,CAAA,GAAI,GAAQ,KAAA,GAAA,GAAM,CAAK,GAAA,CAAA,GAAA,GAAM,GAAQ,KAAA,CAAA,GAAI,IAAK,CAAA,GAAA,CAAI,CAAI,GAAA,CAAA,GAAI,CAAC,CAAA,CAAA;AACjE,EAAO,OAAA;AAAA,IACL,CAAA;AAAA,IACA;AAAA,GACF;AACF;AAMO,SAAS,kBAAmB,CAAA,QAAA,EAA6B,SAAY,GAAA,CAAA,EAAG,MAAM,EAAc,EAAA;AAnGnG,EAAA,IAAA,EAAA;AAoGE,EAAM,MAAA,GAAA,uBAAU,GAAY,EAAA;AAC5B,EAAA,KAAA,MAAW,QAAQ,QAAU,EAAA;AAC3B,IAAM,MAAA,MAAA,uBAAa,GAAoB,EAAA;AACvC,IAAA,GAAA,CAAI,SAAY,GAAA,CAAA;AAChB,IAAI,IAAA,CAAA;AACJ,IAAA,OAAO,CAAI,GAAA,GAAA,CAAI,IAAK,CAAA,IAAI,CAAG,EAAA;AACzB,MAAA,MAAM,GAAM,GAAA,CAAA,CAAE,CAAC,CAAA,CAAE,WAAY,EAAA;AAC7B,MAAA,MAAM,GAAM,GAAA,GAAA,CAAI,MAAW,KAAA,CAAA,GAAI,CAAC,GAAG,GAAG,CAAE,CAAA,GAAA,CAAI,OAAK,CAAI,GAAA,CAAC,CAAE,CAAA,IAAA,CAAK,EAAE,CAAI,GAAA,GAAA;AACnE,MAAM,MAAA;AAAA,QACJ,CAAA;AAAA,QACA;AAAA,OACF,GAAI,oBAAoB,GAAG,CAAA;AAE3B,MAAA,IAAI,CAAI,GAAA,IAAA,IAAQ,CAAI,GAAA,IAAA,IAAQ,IAAI,IAAM,EAAA;AACtC,MAAO,MAAA,CAAA,GAAA,CAAI,OAAM,EAAO,GAAA,MAAA,CAAA,GAAA,CAAI,GAAG,CAAd,KAAA,IAAA,GAAA,EAAA,GAAmB,KAAK,CAAC,CAAA;AAAA;AAE5C,IAAW,KAAA,MAAA,CAAC,GAAG,CAAA,IAAK,CAAC,GAAG,MAAM,CAAA,CAAE,IAAK,CAAA,CAAC,CAAG,EAAA,CAAA,KAAM,CAAE,CAAA,CAAC,IAAI,CAAE,CAAA,CAAC,CAAC,CAAA,CAAE,KAAM,CAAA,CAAA,EAAG,SAAS,CAAA,EAAO,GAAA,CAAA,GAAA,CAAI,CAAI,CAAA,EAAA,GAAG,CAAE,CAAA,CAAA;AAClG,IAAI,IAAA,GAAA,CAAI,QAAQ,GAAK,EAAA;AAAA;AAEvB,EAAA,OAAO,CAAC,GAAG,GAAG,CAAE,CAAA,KAAA,CAAM,GAAG,GAAG,CAAA;AAC9B;AACA,MAAM,MAAS,GAAA,GAAA;AACf,MAAM,OAAO,EAAK,GAAA,MAAA;AAClB,MAAM,MAAM,EAAK,GAAA,IAAA;AACjB,MAAM,MAAS,GAAA,CAAC,KAAO,EAAA,KAAA,EAAO,KAAO,EAAA,KAAA,EAAO,KAAO,EAAA,KAAA,EAAO,KAAO,EAAA,KAAA,EAAO,KAAO,EAAA,KAAA,EAAO,OAAO,KAAK,CAAA;AAO3F,SAAS,SAAU,CAAA,EAAA,EAAY,GAAM,GAAA,IAAA,CAAK,KAAe,EAAA;AAC9D,EAAA,MAAM,MAAM,GAAM,GAAA,EAAA;AAClB,EAAA,MAAM,IAAO,GAAA,CAAC,CAAW,EAAA,IAAA,KAAiB,CAAG,EAAA,CAAC,CAAI,CAAA,EAAA,IAAI,CAAG,EAAA,CAAA,KAAM,CAAI,GAAA,EAAA,GAAK,GAAG,CAAA,IAAA,CAAA;AAC3E,EAAA,IAAI,GAAM,GAAA,IAAA,EAAa,OAAA,IAAA,CAAK,IAAK,CAAA,GAAA,CAAI,CAAG,EAAA,IAAA,CAAK,KAAM,CAAA,GAAA,GAAM,MAAM,CAAC,GAAG,QAAQ,CAAA;AAC3E,EAAA,IAAI,MAAM,GAAK,EAAA;AACb,IAAA,MAAM,CAAI,GAAA,IAAA,CAAK,KAAM,CAAA,GAAA,GAAM,IAAI,CAAA;AAC/B,IAAA,OAAO,CAAK,IAAA,EAAA,GAAK,WAAc,GAAA,IAAA,CAAK,GAAG,MAAM,CAAA;AAAA;AAE/C,EAAI,IAAA,GAAA,GAAM,KAAK,GAAK,EAAA;AAClB,IAAA,MAAM,CAAI,GAAA,IAAA,CAAK,KAAM,CAAA,GAAA,GAAM,GAAG,CAAA;AAC9B,IAAA,OAAO,CAAM,KAAA,CAAA,GAAI,WAAc,GAAA,IAAA,CAAK,GAAG,KAAK,CAAA;AAAA;AAE9C,EAAM,MAAA,IAAA,GAAO,IAAI,IAAA,CAAK,EAAE,CAAA;AACxB,EAAM,MAAA,QAAA,GAAW,KAAK,WAAY,EAAA,KAAM,IAAI,IAAK,CAAA,GAAG,EAAE,WAAY,EAAA;AAClE,EAAA,OAAO,GAAG,MAAO,CAAA,IAAA,CAAK,QAAS,EAAC,CAAC,CAAI,CAAA,EAAA,IAAA,CAAK,OAAQ,EAAC,GAAG,QAAW,GAAA,EAAA,GAAK,KAAK,IAAK,CAAA,WAAA,EAAa,CAAE,CAAA,CAAA,CAAA;AACjG"}
@@ -0,0 +1,206 @@
1
+ import {deriveAgentEndpoint,deriveBackendGraphqlUrl}from'../../canvas/videoEditor/remoteMediaClient.js';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
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
21
+ function execBody(connector, action, params, timeoutMs) {
22
+ return {
23
+ args: ["connector", "run", "-c", connector, "-a", action, "--params", JSON.stringify(params)],
24
+ stream: true,
25
+ timeout_ms: timeoutMs
26
+ };
27
+ }
28
+ const RESULT_SENTINEL = "__CDECLI_RESULT__";
29
+ function parseTokenStreamResult(tokens) {
30
+ const joined = tokens.join("");
31
+ const parse = (text) => {
32
+ try {
33
+ const v = JSON.parse(text.trim());
34
+ if (Array.isArray(v)) return {
35
+ data: v
36
+ };
37
+ return v && typeof v === "object" ? v : null;
38
+ } catch (e) {
39
+ return null;
40
+ }
41
+ };
42
+ const end = joined.lastIndexOf(RESULT_SENTINEL);
43
+ const start = end > 0 ? joined.lastIndexOf(RESULT_SENTINEL, end - 1) : -1;
44
+ if (start >= 0) return parse(joined.slice(start + RESULT_SENTINEL.length, end));
45
+ const open = joined.search(/[{[]/);
46
+ return open >= 0 ? parse(joined.slice(open)) : null;
47
+ }
48
+ class ExecStreamParser {
49
+ constructor(onProgress) {
50
+ this.onProgress = onProgress;
51
+ __publicField(this, "buf", "");
52
+ __publicField(this, "jsonTokens", []);
53
+ __publicField(this, "capturing", false);
54
+ __publicField(this, "depth", 0);
55
+ __publicField(this, "jsonDone", false);
56
+ __publicField(this, "resultFrame");
57
+ __publicField(this, "stderr", "");
58
+ __publicField(this, "progress", "");
59
+ __publicField(this, "exitCode");
60
+ __publicField(this, "done", false);
61
+ }
62
+ /** Feed the next piece of the body; a partial last line waits for the rest. */
63
+ feed(text) {
64
+ var _a;
65
+ this.buf += text;
66
+ const lines = this.buf.split("\n");
67
+ this.buf = (_a = lines.pop()) != null ? _a : "";
68
+ for (const line of lines) this.line(line);
69
+ }
70
+ /** The body ended: read whatever was left without a newline. */
71
+ end() {
72
+ if (this.buf) this.line(this.buf);
73
+ this.buf = "";
74
+ }
75
+ line(raw) {
76
+ var _a;
77
+ if (this.done) return;
78
+ const trimmed = raw.startsWith("data: ") ? raw.slice(6).trim() : raw.trim();
79
+ if (!trimmed) return;
80
+ let ev;
81
+ try {
82
+ ev = JSON.parse(trimmed);
83
+ } catch (e) {
84
+ return;
85
+ }
86
+ if (typeof ev.exit_code === "number") this.exitCode = ev.exit_code;
87
+ if (ev.error) this.stderr += (this.stderr && !this.stderr.endsWith("\n") ? "\n" : "") + ev.error;
88
+ if (ev.type === "result" && ev.data != null) {
89
+ this.resultFrame = ev.data;
90
+ } else if ((ev.type === "error" || ev.type === "stderr") && typeof ev.data === "string") {
91
+ this.stderr += ev.data;
92
+ } else if (ev.type === "token" && typeof ev.data === "string" && ev.data) {
93
+ const d = ev.data;
94
+ if (!this.capturing && /^\s*[{[]/.test(d)) this.capturing = true;
95
+ if (this.capturing && !this.jsonDone) {
96
+ this.jsonTokens.push(d);
97
+ for (const ch of d) {
98
+ if (ch === "{" || ch === "[") this.depth += 1;
99
+ else if (ch === "}" || ch === "]") this.depth -= 1;
100
+ }
101
+ if (this.depth <= 0) this.jsonDone = true;
102
+ } else {
103
+ this.progress += d;
104
+ (_a = this.onProgress) == null ? void 0 : _a.call(this, d);
105
+ }
106
+ } else if (ev.type === "done" || ev.type === "exit") {
107
+ this.done = true;
108
+ }
109
+ }
110
+ /** The call's outcome; throws the readable reason on failure. */
111
+ result(label) {
112
+ if (this.exitCode !== void 0 && this.exitCode !== 0) {
113
+ const reason = this.stderr.replace(/Executing:[^\n]*\n?/g, "").trim();
114
+ throw new ExecStreamError(reason || this.progress.trim().slice(-300) || (this.exitCode === -1 ? `${label} was killed on the agent before it produced any output. Try again.` : `${label} failed (exit code ${this.exitCode})`), this.progress);
115
+ }
116
+ const fromFrame = typeof this.resultFrame === "string" ? parseTokenStreamResult([this.resultFrame]) : this.resultFrame;
117
+ const result = fromFrame != null ? fromFrame : parseTokenStreamResult(this.jsonTokens);
118
+ if (!result) {
119
+ throw new ExecStreamError(this.stderr.trim() || this.progress.trim().slice(-300) || `${label} returned no result`, this.progress);
120
+ }
121
+ return result;
122
+ }
123
+ }
124
+ class ExecStreamError extends Error {
125
+ constructor(message, progress) {
126
+ super(message);
127
+ this.progress = progress;
128
+ this.name = "ExecStreamError";
129
+ }
130
+ }
131
+ const CLIENT_ABORT_GRACE_MS = 2e4;
132
+ function createExecTransport(token, indexUrl) {
133
+ const endpoint = `${deriveAgentEndpoint(indexUrl)}/v1/cdecli/exec/stream`;
134
+ const backend = deriveBackendGraphqlUrl(indexUrl);
135
+ return {
136
+ run: (body, label, onProgress, signal) => new Promise((resolve, reject) => {
137
+ var _a;
138
+ const parser = new ExecStreamParser(onProgress);
139
+ const xhr = new XMLHttpRequest();
140
+ let seen = 0;
141
+ let settled = false;
142
+ const settle = (fn) => {
143
+ var _a2;
144
+ if (settled) return;
145
+ settled = true;
146
+ clearTimeout(timer);
147
+ (_a2 = signal == null ? void 0 : signal.removeEventListener) == null ? void 0 : _a2.call(signal, "abort", onAbort);
148
+ fn();
149
+ };
150
+ const pump = () => {
151
+ var _a2;
152
+ const text = (_a2 = xhr.responseText) != null ? _a2 : "";
153
+ if (text.length > seen) {
154
+ const chunk = text.slice(seen);
155
+ seen = text.length;
156
+ try {
157
+ parser.feed(chunk);
158
+ } catch (err) {
159
+ xhr.abort();
160
+ settle(() => reject(err));
161
+ }
162
+ }
163
+ };
164
+ const onAbort = () => {
165
+ xhr.abort();
166
+ settle(() => reject(new ExecStreamError(`${label} was stopped`, parser.progress)));
167
+ };
168
+ const timer = setTimeout(() => {
169
+ xhr.abort();
170
+ settle(() => reject(new ExecStreamError(`${label} timed out`, parser.progress)));
171
+ }, body.timeout_ms + CLIENT_ABORT_GRACE_MS);
172
+ (_a = signal == null ? void 0 : signal.addEventListener) == null ? void 0 : _a.call(signal, "abort", onAbort);
173
+ xhr.open("POST", endpoint);
174
+ xhr.setRequestHeader("Content-Type", "application/json");
175
+ xhr.setRequestHeader("Authorization", `Bearer ${token}`);
176
+ xhr.onprogress = pump;
177
+ xhr.onreadystatechange = () => {
178
+ if (xhr.readyState === 3) pump();
179
+ };
180
+ xhr.onerror = () => settle(() => reject(new ExecStreamError(`${label}: could not reach the design service. Check your connection.`, parser.progress)));
181
+ xhr.onload = () => {
182
+ var _a2;
183
+ pump();
184
+ parser.end();
185
+ if (xhr.status === 401 || xhr.status === 403) {
186
+ settle(() => reject(new ExecStreamError("Your session expired. Sign in again to design.", parser.progress)));
187
+ return;
188
+ }
189
+ if (xhr.status < 200 || xhr.status >= 300) {
190
+ const detail = ((_a2 = xhr.responseText) != null ? _a2 : "").slice(0, 200);
191
+ settle(() => reject(new ExecStreamError(`${label} failed (HTTP ${xhr.status}) ${detail}`.trim(), parser.progress)));
192
+ return;
193
+ }
194
+ try {
195
+ const result = parser.result(label);
196
+ settle(() => resolve(result));
197
+ } catch (err) {
198
+ settle(() => reject(err));
199
+ }
200
+ };
201
+ xhr.send(JSON.stringify(backend ? __spreadProps(__spreadValues({}, body), {
202
+ backend_graphql_url: backend
203
+ }) : body));
204
+ })
205
+ };
206
+ }export{ExecStreamError,ExecStreamParser,createExecTransport,execBody,parseTokenStreamResult};//# sourceMappingURL=execStream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execStream.js","sources":["../../../../src/features/design/surface/execStream.ts"],"sourcesContent":["/**\n * The cdecli agent's `exec/stream` lane, streamed - native twin of surface-kit\n * `agent-exec` (`execBody`, `postExecStream`, `consumeExecStream`).\n *\n * canvas's `remoteMediaClient` reads the whole response at the end, which is\n * fine for a media job but leaves a design generation (minutes long) with no\n * sign of life. RN's `fetch` cannot read a body as it arrives; its\n * XMLHttpRequest can - `responseText` grows on every `progress` event - so the\n * page streams onto the generating tile exactly as it does on the web.\n *\n * `ExecStreamParser` is the kit's frame rules, pure (jest-tested):\n * - `token` frames are the connector's stdout. One that opens with `{` / `[`\n * starts the JSON payload, captured until its braces close; every other\n * token is progress prose (for the design connector: the page itself).\n * - a `result` frame is the authoritative output and wins over tokens.\n * - `stderr` / `error` frames and `error` fields collect the failure reason.\n * - `exit_code` non-zero fails the call.\n */\nimport { deriveAgentEndpoint, deriveBackendGraphqlUrl } from '../../canvas/videoEditor/remoteMediaClient';\n\nexport interface ExecBody {\n args: string[];\n stream: true;\n timeout_ms: number;\n backend_graphql_url?: string;\n}\n\n/** The connector-run request (kit `execBody`). */\nexport function execBody(\n connector: string,\n action: string,\n params: Record<string, unknown>,\n timeoutMs: number,\n): ExecBody {\n return {\n args: ['connector', 'run', '-c', connector, '-a', action, '--params', JSON.stringify(params)],\n stream: true,\n timeout_ms: timeoutMs,\n };\n}\n\nconst RESULT_SENTINEL = '__CDECLI_RESULT__';\n\n/** The JSON a token stream carried (sentinel-wrapped, or bare after progress text). */\nexport function parseTokenStreamResult(tokens: readonly string[]): Record<string, unknown> | null {\n const joined = tokens.join('');\n const parse = (text: string): Record<string, unknown> | null => {\n try {\n const v: unknown = JSON.parse(text.trim());\n if (Array.isArray(v)) return { data: v };\n return v && typeof v === 'object' ? (v as Record<string, unknown>) : null;\n } catch {\n return null;\n }\n };\n const end = joined.lastIndexOf(RESULT_SENTINEL);\n const start = end > 0 ? joined.lastIndexOf(RESULT_SENTINEL, end - 1) : -1;\n if (start >= 0) return parse(joined.slice(start + RESULT_SENTINEL.length, end));\n const open = joined.search(/[{[]/);\n return open >= 0 ? parse(joined.slice(open)) : null;\n}\n\n/** Frame-by-frame reader of an exec/stream body. Feed it text as it arrives. */\nexport class ExecStreamParser {\n private buf = '';\n private jsonTokens: string[] = [];\n private capturing = false;\n private depth = 0;\n private jsonDone = false;\n private resultFrame: unknown = undefined;\n stderr = '';\n progress = '';\n exitCode: number | undefined;\n done = false;\n\n constructor(private readonly onProgress?: (chunk: string) => void) {}\n\n /** Feed the next piece of the body; a partial last line waits for the rest. */\n feed(text: string): void {\n this.buf += text;\n const lines = this.buf.split('\\n');\n this.buf = lines.pop() ?? '';\n for (const line of lines) this.line(line);\n }\n\n /** The body ended: read whatever was left without a newline. */\n end(): void {\n if (this.buf) this.line(this.buf);\n this.buf = '';\n }\n\n private line(raw: string): void {\n if (this.done) return;\n const trimmed = raw.startsWith('data: ') ? raw.slice(6).trim() : raw.trim();\n if (!trimmed) return;\n let ev: { type?: string; data?: unknown; error?: string; exit_code?: number };\n try {\n ev = JSON.parse(trimmed);\n } catch {\n return;\n }\n if (typeof ev.exit_code === 'number') this.exitCode = ev.exit_code;\n if (ev.error) this.stderr += (this.stderr && !this.stderr.endsWith('\\n') ? '\\n' : '') + ev.error;\n if (ev.type === 'result' && ev.data != null) {\n this.resultFrame = ev.data;\n } else if ((ev.type === 'error' || ev.type === 'stderr') && typeof ev.data === 'string') {\n this.stderr += ev.data;\n } else if (ev.type === 'token' && typeof ev.data === 'string' && ev.data) {\n const d = ev.data;\n if (!this.capturing && /^\\s*[{[]/.test(d)) this.capturing = true;\n if (this.capturing && !this.jsonDone) {\n this.jsonTokens.push(d);\n // Capture stops at the closing brace: connectors keep printing prose after their payload.\n for (const ch of d) {\n if (ch === '{' || ch === '[') this.depth += 1;\n else if (ch === '}' || ch === ']') this.depth -= 1;\n }\n if (this.depth <= 0) this.jsonDone = true;\n } else {\n this.progress += d;\n this.onProgress?.(d);\n }\n } else if (ev.type === 'done' || ev.type === 'exit') {\n this.done = true;\n }\n }\n\n /** The call's outcome; throws the readable reason on failure. */\n result(label: string): Record<string, unknown> {\n if (this.exitCode !== undefined && this.exitCode !== 0) {\n const reason = this.stderr.replace(/Executing:[^\\n]*\\n?/g, '').trim();\n throw new ExecStreamError(\n reason ||\n this.progress.trim().slice(-300) ||\n (this.exitCode === -1\n ? `${label} was killed on the agent before it produced any output. Try again.`\n : `${label} failed (exit code ${this.exitCode})`),\n this.progress,\n );\n }\n const fromFrame =\n typeof this.resultFrame === 'string'\n ? parseTokenStreamResult([this.resultFrame])\n : (this.resultFrame as Record<string, unknown> | undefined);\n const result = fromFrame ?? parseTokenStreamResult(this.jsonTokens);\n if (!result) {\n throw new ExecStreamError(\n this.stderr.trim() || this.progress.trim().slice(-300) || `${label} returned no result`,\n this.progress,\n );\n }\n return result;\n }\n}\n\n/** A failed exec, carrying the prose that streamed before it (a cut-off page can still be recovered). */\nexport class ExecStreamError extends Error {\n constructor(\n message: string,\n readonly progress: string,\n ) {\n super(message);\n this.name = 'ExecStreamError';\n }\n}\n\n/** Grace on top of the agent's own timeout before the phone gives up. */\nconst CLIENT_ABORT_GRACE_MS = 20_000;\n\nexport interface ExecTransport {\n /** POST one exec body, streaming progress prose; resolves to the result. */\n run: (\n body: ExecBody,\n label: string,\n onProgress?: (chunk: string) => void,\n signal?: AbortSignal,\n ) => Promise<Record<string, unknown>>;\n}\n\n/**\n * The transport a phone uses: the agent endpoint and backend this environment's\n * index URL names (`remoteMediaClient`'s derivation), the session's bearer.\n */\nexport function createExecTransport(token: string, indexUrl: string): ExecTransport {\n const endpoint = `${deriveAgentEndpoint(indexUrl)}/v1/cdecli/exec/stream`;\n const backend = deriveBackendGraphqlUrl(indexUrl);\n return {\n run: (body, label, onProgress, signal) =>\n new Promise((resolve, reject) => {\n const parser = new ExecStreamParser(onProgress);\n const xhr = new XMLHttpRequest();\n let seen = 0;\n let settled = false;\n const settle = (fn: () => void) => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n signal?.removeEventListener?.('abort', onAbort);\n fn();\n };\n const pump = () => {\n const text = xhr.responseText ?? '';\n if (text.length > seen) {\n const chunk = text.slice(seen);\n seen = text.length;\n try {\n parser.feed(chunk);\n } catch (err) {\n // A progress handler threw (a question in the stream): stop here.\n xhr.abort();\n settle(() => reject(err));\n }\n }\n };\n const onAbort = () => {\n xhr.abort();\n settle(() => reject(new ExecStreamError(`${label} was stopped`, parser.progress)));\n };\n const timer = setTimeout(() => {\n xhr.abort();\n settle(() => reject(new ExecStreamError(`${label} timed out`, parser.progress)));\n }, body.timeout_ms + CLIENT_ABORT_GRACE_MS);\n signal?.addEventListener?.('abort', onAbort);\n xhr.open('POST', endpoint);\n xhr.setRequestHeader('Content-Type', 'application/json');\n xhr.setRequestHeader('Authorization', `Bearer ${token}`);\n xhr.onprogress = pump;\n xhr.onreadystatechange = () => {\n if (xhr.readyState === 3) pump();\n };\n xhr.onerror = () =>\n settle(() =>\n reject(\n new ExecStreamError(\n `${label}: could not reach the design service. Check your connection.`,\n parser.progress,\n ),\n ),\n );\n xhr.onload = () => {\n pump();\n parser.end();\n if (xhr.status === 401 || xhr.status === 403) {\n settle(() =>\n reject(\n new ExecStreamError('Your session expired. Sign in again to design.', parser.progress),\n ),\n );\n return;\n }\n if (xhr.status < 200 || xhr.status >= 300) {\n const detail = (xhr.responseText ?? '').slice(0, 200);\n settle(() =>\n reject(\n new ExecStreamError(\n `${label} failed (HTTP ${xhr.status}) ${detail}`.trim(),\n parser.progress,\n ),\n ),\n );\n return;\n }\n try {\n const result = parser.result(label);\n settle(() => resolve(result));\n } catch (err) {\n settle(() => reject(err));\n }\n };\n xhr.send(JSON.stringify(backend ? { ...body, backend_graphql_url: backend } : body));\n }),\n };\n}\n"],"names":["_a"],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ const GOO_GAP = 28;
2
+ const f = (n) => n.toFixed(1);
3
+ function metaballNeck(a, b, v = 0.5, handle = 2.4) {
4
+ const d = Math.hypot(b.x - a.x, b.y - a.y);
5
+ const maxDist = a.r + b.r + GOO_GAP;
6
+ if (d === 0 || d > maxDist || d <= Math.abs(a.r - b.r)) return null;
7
+ const r1 = a.r;
8
+ const r2 = b.r;
9
+ const u1 = d < r1 + r2 ? Math.acos((r1 * r1 + d * d - r2 * r2) / (2 * r1 * d)) : 0;
10
+ const u2 = d < r1 + r2 ? Math.acos((r2 * r2 + d * d - r1 * r1) / (2 * r2 * d)) : 0;
11
+ const angle = Math.atan2(b.y - a.y, b.x - a.x);
12
+ const spread = Math.acos(Math.min(1, Math.max(-1, (r1 - r2) / d)));
13
+ const a1 = angle + u1 + (spread - u1) * v;
14
+ const a2 = angle - u1 - (spread - u1) * v;
15
+ const a3 = angle + Math.PI - u2 - (Math.PI - u2 - spread) * v;
16
+ const a4 = angle - Math.PI + u2 + (Math.PI - u2 - spread) * v;
17
+ const p1 = [a.x + Math.cos(a1) * r1, a.y + Math.sin(a1) * r1];
18
+ const p2 = [a.x + Math.cos(a2) * r1, a.y + Math.sin(a2) * r1];
19
+ const p3 = [b.x + Math.cos(a3) * r2, b.y + Math.sin(a3) * r2];
20
+ const p4 = [b.x + Math.cos(a4) * r2, b.y + Math.sin(a4) * r2];
21
+ const totalRadius = r1 + r2;
22
+ const d2Base = Math.min(v * handle, Math.hypot(p1[0] - p3[0], p1[1] - p3[1]) / totalRadius);
23
+ const d2 = d2Base * Math.min(1, d * 2 / (r1 + r2));
24
+ const h1 = r1 * d2;
25
+ const h2 = r2 * d2;
26
+ const half = Math.PI / 2;
27
+ const c1 = [p1[0] + Math.cos(a1 - half) * h1, p1[1] + Math.sin(a1 - half) * h1];
28
+ const c2 = [p2[0] + Math.cos(a2 + half) * h1, p2[1] + Math.sin(a2 + half) * h1];
29
+ const c3 = [p3[0] + Math.cos(a3 + half) * h2, p3[1] + Math.sin(a3 + half) * h2];
30
+ const c4 = [p4[0] + Math.cos(a4 - half) * h2, p4[1] + Math.sin(a4 - half) * h2];
31
+ return `M${f(p1[0])} ${f(p1[1])}C${f(c1[0])} ${f(c1[1])} ${f(c3[0])} ${f(c3[1])} ${f(p3[0])} ${f(p3[1])}L${f(p4[0])} ${f(p4[1])}C${f(c4[0])} ${f(c4[1])} ${f(c2[0])} ${f(c2[1])} ${f(p2[0])} ${f(p2[1])}Z`;
32
+ }
33
+ function metaballNecks(blobs) {
34
+ const out = [];
35
+ for (let i = 0; i < blobs.length; i += 1) {
36
+ for (let j = i + 1; j < blobs.length; j += 1) {
37
+ const a = blobs[i];
38
+ const b = blobs[j];
39
+ const d = metaballNeck(a, b);
40
+ if (d) out.push({
41
+ key: `${a.key}-${b.key}`,
42
+ d,
43
+ fill: a.r >= b.r ? a.fill : b.fill
44
+ });
45
+ }
46
+ }
47
+ return out;
48
+ }export{GOO_GAP,metaballNeck,metaballNecks};//# sourceMappingURL=metaball.js.map