@adminide-stack/yantra-mobile 12.0.129-alpha.0 → 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.
- package/lib/compute.js +57 -1
- package/lib/compute.js.map +1 -1
- package/lib/features/agent-chat/NativeAgentChat.js +3 -2
- package/lib/features/agent-chat/NativeAgentChat.js.map +1 -1
- package/lib/features/apps/AppsCatalog.js +10 -0
- package/lib/features/apps/AppsCatalog.js.map +1 -1
- package/lib/features/apps/mobileAppCatalog.js +11 -0
- package/lib/features/apps/mobileAppCatalog.js.map +1 -1
- package/lib/features/canvas/AudioEditorExperience.js +448 -105
- package/lib/features/canvas/AudioEditorExperience.js.map +1 -1
- package/lib/features/canvas/CanvasAgentChatPane.js +33 -14
- package/lib/features/canvas/CanvasAgentChatPane.js.map +1 -1
- package/lib/features/canvas/CanvasBoardsGrid.js +493 -41
- package/lib/features/canvas/CanvasBoardsGrid.js.map +1 -1
- package/lib/features/canvas/CanvasChatResultCard.js.map +1 -1
- package/lib/features/canvas/CanvasEditToolsPanel.js +37 -1
- package/lib/features/canvas/CanvasEditToolsPanel.js.map +1 -1
- package/lib/features/canvas/CanvasExperience.js +237 -22
- package/lib/features/canvas/CanvasExperience.js.map +1 -1
- package/lib/features/canvas/CanvasGeneratePanel.js +119 -26
- package/lib/features/canvas/CanvasGeneratePanel.js.map +1 -1
- package/lib/features/canvas/CanvasLooksPanel.js +17 -6
- package/lib/features/canvas/CanvasLooksPanel.js.map +1 -1
- package/lib/features/canvas/CanvasTasksPanel.js +18 -1
- package/lib/features/canvas/CanvasTasksPanel.js.map +1 -1
- package/lib/features/canvas/DesignCategoryGallery.js +423 -0
- package/lib/features/canvas/DesignCategoryGallery.js.map +1 -0
- package/lib/features/canvas/ImageEditorExperience.js +763 -187
- package/lib/features/canvas/ImageEditorExperience.js.map +1 -1
- package/lib/features/canvas/SetStudioExperience.js +199 -11
- package/lib/features/canvas/SetStudioExperience.js.map +1 -1
- package/lib/features/canvas/VideoEditorExperience.js +59 -40
- package/lib/features/canvas/VideoEditorExperience.js.map +1 -1
- package/lib/features/canvas/VideoGeneratorExperience.js +134 -34
- package/lib/features/canvas/VideoGeneratorExperience.js.map +1 -1
- package/lib/features/canvas/aiEdit.js +4 -2
- package/lib/features/canvas/aiEdit.js.map +1 -1
- package/lib/features/canvas/audioEditor/AudioWaveform.js +96 -0
- package/lib/features/canvas/audioEditor/AudioWaveform.js.map +1 -0
- package/lib/features/canvas/audioEditor/audioPeaks.js +93 -0
- package/lib/features/canvas/audioEditor/audioPeaks.js.map +1 -0
- package/lib/features/canvas/canvasTaskSync.js +34 -7
- package/lib/features/canvas/canvasTaskSync.js.map +1 -1
- package/lib/features/canvas/canvasTasks.js +23 -3
- package/lib/features/canvas/canvasTasks.js.map +1 -1
- package/lib/features/canvas/canvasTheme.js +10 -24
- package/lib/features/canvas/canvasTheme.js.map +1 -1
- package/lib/features/canvas/canvasUi.js +1 -1
- package/lib/features/canvas/canvasUi.js.map +1 -1
- package/lib/features/canvas/createTiles.js +17 -9
- package/lib/features/canvas/createTiles.js.map +1 -1
- package/lib/features/canvas/deepLinks.js +35 -5
- package/lib/features/canvas/deepLinks.js.map +1 -1
- package/lib/features/canvas/designCatalog.js +165 -0
- package/lib/features/canvas/designCatalog.js.map +1 -0
- package/lib/features/canvas/designCategories.js +262 -0
- package/lib/features/canvas/designCategories.js.map +1 -0
- package/lib/features/canvas/editorControls.js +406 -0
- package/lib/features/canvas/editorControls.js.map +1 -0
- package/lib/features/canvas/generationModels.js +5 -3
- package/lib/features/canvas/generationModels.js.map +1 -1
- package/lib/features/canvas/generationTasks.js +162 -0
- package/lib/features/canvas/generationTasks.js.map +1 -0
- package/lib/features/canvas/generator/BottomSheet.js +167 -0
- package/lib/features/canvas/generator/BottomSheet.js.map +1 -0
- package/lib/features/canvas/generator/BusinessCardChatCard.js +155 -0
- package/lib/features/canvas/generator/BusinessCardChatCard.js.map +1 -0
- package/lib/features/canvas/generator/DirectorSheet.js +163 -0
- package/lib/features/canvas/generator/DirectorSheet.js.map +1 -0
- package/lib/features/canvas/generator/ReframePreview.js +122 -0
- package/lib/features/canvas/generator/ReframePreview.js.map +1 -0
- package/lib/features/canvas/generator/RunLogCard.js +119 -0
- package/lib/features/canvas/generator/RunLogCard.js.map +1 -0
- package/lib/features/canvas/generator/ShotPanel.js +261 -0
- package/lib/features/canvas/generator/ShotPanel.js.map +1 -0
- package/lib/features/canvas/generator/businessCardWidget.js +117 -0
- package/lib/features/canvas/generator/businessCardWidget.js.map +1 -0
- package/lib/features/canvas/generator/cameraVocabulary.js +142 -0
- package/lib/features/canvas/generator/cameraVocabulary.js.map +1 -0
- package/lib/features/canvas/generator/cinematicVocabulary.js +416 -0
- package/lib/features/canvas/generator/cinematicVocabulary.js.map +1 -0
- package/lib/features/canvas/generator/direction.js +41 -0
- package/lib/features/canvas/generator/direction.js.map +1 -0
- package/lib/features/canvas/generator/reframeGeometry.js +108 -0
- package/lib/features/canvas/generator/reframeGeometry.js.map +1 -0
- package/lib/features/canvas/generator/runLog.js +71 -0
- package/lib/features/canvas/generator/runLog.js.map +1 -0
- package/lib/features/canvas/generator/shot.js +133 -0
- package/lib/features/canvas/generator/shot.js.map +1 -0
- package/lib/features/canvas/generator/useShotSpec.js +87 -0
- package/lib/features/canvas/generator/useShotSpec.js.map +1 -0
- package/lib/features/canvas/home/HeroComposer.js +214 -0
- package/lib/features/canvas/home/HeroComposer.js.map +1 -0
- package/lib/features/canvas/home/HeroMonitor.js +225 -0
- package/lib/features/canvas/home/HeroMonitor.js.map +1 -0
- package/lib/features/canvas/home/LookDetail.js +185 -0
- package/lib/features/canvas/home/LookDetail.js.map +1 -0
- package/lib/features/canvas/home/LoopingVideo.js +37 -0
- package/lib/features/canvas/home/LoopingVideo.js.map +1 -0
- package/lib/features/canvas/home/TemplatesGallery.js +253 -0
- package/lib/features/canvas/home/TemplatesGallery.js.map +1 -0
- package/lib/features/canvas/home/heroShots.js +100 -0
- package/lib/features/canvas/home/heroShots.js.map +1 -0
- package/lib/features/canvas/homeWork.js +62 -3
- package/lib/features/canvas/homeWork.js.map +1 -1
- package/lib/features/canvas/imageEditor/ImageMarkup.js +195 -0
- package/lib/features/canvas/imageEditor/ImageMarkup.js.map +1 -0
- package/lib/features/canvas/imageEditor/imageEditOps.js +367 -0
- package/lib/features/canvas/imageEditor/imageEditOps.js.map +1 -0
- package/lib/features/canvas/nativeViewerRegistry.js.map +1 -1
- package/lib/features/canvas/rankedCatalogSearch.js +375 -0
- package/lib/features/canvas/rankedCatalogSearch.js.map +1 -0
- package/lib/features/canvas/recorder/CameraRecorderExperience.js +68 -20
- package/lib/features/canvas/recorder/CameraRecorderExperience.js.map +1 -1
- package/lib/features/canvas/recorder/RecordingReview.js +272 -0
- package/lib/features/canvas/recorder/RecordingReview.js.map +1 -0
- package/lib/features/canvas/recorder/RecordingsList.js +179 -0
- package/lib/features/canvas/recorder/RecordingsList.js.map +1 -0
- package/lib/features/canvas/recorder/recorderOps.js +99 -0
- package/lib/features/canvas/recorder/recorderOps.js.map +1 -0
- package/lib/features/canvas/seedanceShowcase.js +314 -0
- package/lib/features/canvas/seedanceShowcase.js.map +1 -0
- package/lib/features/canvas/serverTasks.js +149 -15
- package/lib/features/canvas/serverTasks.js.map +1 -1
- package/lib/features/canvas/sessionRenewal.js +114 -0
- package/lib/features/canvas/sessionRenewal.js.map +1 -0
- package/lib/features/canvas/set/SetViewportWebView.js +34 -1
- package/lib/features/canvas/set/SetViewportWebView.js.map +1 -1
- package/lib/features/canvas/set/agent/setTurn.js +4 -2
- package/lib/features/canvas/set/agent/setTurn.js.map +1 -1
- package/lib/features/canvas/set/setPresets.js +85 -0
- package/lib/features/canvas/set/setPresets.js.map +1 -0
- package/lib/features/canvas/set/setProject.js +4 -1
- package/lib/features/canvas/set/setProject.js.map +1 -1
- package/lib/features/canvas/studioCatalog.js +59 -4
- package/lib/features/canvas/studioCatalog.js.map +1 -1
- package/lib/features/canvas/studioLooks.js +31 -4
- package/lib/features/canvas/studioLooks.js.map +1 -1
- package/lib/features/canvas/surfaceIndex.js +1 -14
- package/lib/features/canvas/surfaceIndex.js.map +1 -1
- package/lib/features/canvas/templateSearch.js +489 -0
- package/lib/features/canvas/templateSearch.js.map +1 -0
- package/lib/features/canvas/useCanvasSession.js +28 -6
- package/lib/features/canvas/useCanvasSession.js.map +1 -1
- package/lib/features/canvas/useStudioCatalogTemplates.js +41 -5
- package/lib/features/canvas/useStudioCatalogTemplates.js.map +1 -1
- package/lib/features/canvas/videoEditor/EditorPanels.js +531 -0
- package/lib/features/canvas/videoEditor/EditorPanels.js.map +1 -0
- package/lib/features/canvas/videoEditor/agent/AgentCutPane.js +48 -4
- package/lib/features/canvas/videoEditor/agent/AgentCutPane.js.map +1 -1
- package/lib/features/canvas/videoEditor/agent/agentLoop.js +2 -0
- package/lib/features/canvas/videoEditor/agent/agentLoop.js.map +1 -1
- package/lib/features/canvas/videoEditor/agent/brainClient.js +97 -27
- package/lib/features/canvas/videoEditor/agent/brainClient.js.map +1 -1
- package/lib/features/canvas/videoEditor/agent/cutTools.js +707 -3
- package/lib/features/canvas/videoEditor/agent/cutTools.js.map +1 -1
- package/lib/features/canvas/videoEditor/audioServices.js +165 -0
- package/lib/features/canvas/videoEditor/audioServices.js.map +1 -0
- package/lib/features/canvas/videoEditor/captions.js +144 -0
- package/lib/features/canvas/videoEditor/captions.js.map +1 -0
- package/lib/features/canvas/videoEditor/compileTimeline.js +24 -16
- package/lib/features/canvas/videoEditor/compileTimeline.js.map +1 -1
- package/lib/features/canvas/videoEditor/editorModel.js +12 -2
- package/lib/features/canvas/videoEditor/editorModel.js.map +1 -1
- package/lib/features/canvas/videoEditor/exportTask.js +89 -7
- package/lib/features/canvas/videoEditor/exportTask.js.map +1 -1
- package/lib/features/canvas/videoEditor/layers.js +117 -0
- package/lib/features/canvas/videoEditor/layers.js.map +1 -0
- package/lib/features/canvas/videoEditor/remoteMediaClient.js +45 -18
- package/lib/features/canvas/videoEditor/remoteMediaClient.js.map +1 -1
- package/lib/features/canvas/videoEditor/renderTimeline.js +18 -6
- package/lib/features/canvas/videoEditor/renderTimeline.js.map +1 -1
- package/lib/features/canvas/videoEditor/revoice.js +138 -0
- package/lib/features/canvas/videoEditor/revoice.js.map +1 -0
- package/lib/features/canvas/videoEditor/storageUpload.js +34 -0
- package/lib/features/canvas/videoEditor/storageUpload.js.map +1 -0
- package/lib/features/canvas/videoEditor/textMotion.js +109 -0
- package/lib/features/canvas/videoEditor/textMotion.js.map +1 -0
- package/lib/features/canvas/videoEditor/transitions.js +31 -0
- package/lib/features/canvas/videoEditor/transitions.js.map +1 -0
- package/lib/features/chat/TemplatesChatCards.js +8 -3
- package/lib/features/chat/TemplatesChatCards.js.map +1 -1
- package/lib/features/design/DesignEditorExperience.js +674 -644
- package/lib/features/design/DesignEditorExperience.js.map +1 -1
- package/lib/features/design/DesignExperience.js +285 -538
- package/lib/features/design/DesignExperience.js.map +1 -1
- package/lib/features/design/designCore.js +2 -212
- package/lib/features/design/designCore.js.map +1 -1
- package/lib/features/design/designIndex.js +1 -50
- package/lib/features/design/designIndex.js.map +1 -1
- package/lib/features/design/doc/aiDesign.js +247 -0
- package/lib/features/design/doc/aiDesign.js.map +1 -0
- package/lib/features/design/doc/artifacts.js +280 -0
- package/lib/features/design/doc/artifacts.js.map +1 -0
- package/lib/features/design/doc/chart.js +98 -0
- package/lib/features/design/doc/chart.js.map +1 -0
- package/lib/features/design/doc/crop.js +104 -0
- package/lib/features/design/doc/crop.js.map +1 -0
- package/lib/features/design/doc/curve.js +49 -0
- package/lib/features/design/doc/curve.js.map +1 -0
- package/lib/features/design/doc/docOps.js +397 -0
- package/lib/features/design/doc/docOps.js.map +1 -0
- package/lib/features/design/doc/findReplace.js +112 -0
- package/lib/features/design/doc/findReplace.js.map +1 -0
- package/lib/features/design/doc/fonts.js +79 -0
- package/lib/features/design/doc/fonts.js.map +1 -0
- package/lib/features/design/doc/frames.js +17 -0
- package/lib/features/design/doc/frames.js.map +1 -0
- package/lib/features/design/doc/geometry.js +133 -0
- package/lib/features/design/doc/geometry.js.map +1 -0
- package/lib/features/design/doc/imageAdjust.js +203 -0
- package/lib/features/design/doc/imageAdjust.js.map +1 -0
- package/lib/features/design/doc/legacyDoc.js +107 -0
- package/lib/features/design/doc/legacyDoc.js.map +1 -0
- package/lib/features/design/doc/newDoc.js +335 -0
- package/lib/features/design/doc/newDoc.js.map +1 -0
- package/lib/features/design/doc/pageRange.js +17 -0
- package/lib/features/design/doc/pageRange.js.map +1 -0
- package/lib/features/design/doc/pathScale.js +68 -0
- package/lib/features/design/doc/pathScale.js.map +1 -0
- package/lib/features/design/doc/qr.js +62 -0
- package/lib/features/design/doc/qr.js.map +1 -0
- package/lib/features/design/doc/shapes.js +366 -0
- package/lib/features/design/doc/shapes.js.map +1 -0
- package/lib/features/design/doc/sizes.js +230 -0
- package/lib/features/design/doc/sizes.js.map +1 -0
- package/lib/features/design/doc/textEffects.js +134 -0
- package/lib/features/design/doc/textEffects.js.map +1 -0
- package/lib/features/design/doc/textLayout.js +182 -0
- package/lib/features/design/doc/textLayout.js.map +1 -0
- package/lib/features/design/doc/types.js +30 -0
- package/lib/features/design/doc/types.js.map +1 -0
- package/lib/features/design/editor/AiPanel.js +194 -0
- package/lib/features/design/editor/AiPanel.js.map +1 -0
- package/lib/features/design/editor/ChartDataPanel.js +182 -0
- package/lib/features/design/editor/ChartDataPanel.js.map +1 -0
- package/lib/features/design/editor/CropOverlay.js +199 -0
- package/lib/features/design/editor/CropOverlay.js.map +1 -0
- package/lib/features/design/editor/DesignCanvas.js +363 -0
- package/lib/features/design/editor/DesignCanvas.js.map +1 -0
- package/lib/features/design/editor/ExportSheet.js +123 -0
- package/lib/features/design/editor/ExportSheet.js.map +1 -0
- package/lib/features/design/editor/FindReplacePanel.js +93 -0
- package/lib/features/design/editor/FindReplacePanel.js.map +1 -0
- package/lib/features/design/editor/ImageTools.js +188 -0
- package/lib/features/design/editor/ImageTools.js.map +1 -0
- package/lib/features/design/editor/LayerTools.js +485 -0
- package/lib/features/design/editor/LayerTools.js.map +1 -0
- package/lib/features/design/editor/PageStrip.js +203 -0
- package/lib/features/design/editor/PageStrip.js.map +1 -0
- package/lib/features/design/editor/Slideshow.js +97 -0
- package/lib/features/design/editor/Slideshow.js.map +1 -0
- package/lib/features/design/editor/ToolPanels.js +695 -0
- package/lib/features/design/editor/ToolPanels.js.map +1 -0
- package/lib/features/design/editor/controls.js +630 -0
- package/lib/features/design/editor/controls.js.map +1 -0
- package/lib/features/design/editor/useDesignSave.js +91 -0
- package/lib/features/design/editor/useDesignSave.js.map +1 -0
- package/lib/features/design/export/exportDesign.js +170 -0
- package/lib/features/design/export/exportDesign.js.map +1 -0
- package/lib/features/design/export/pdf.js +143 -0
- package/lib/features/design/export/pdf.js.map +1 -0
- package/lib/features/design/home/DesignHome.js +688 -0
- package/lib/features/design/home/DesignHome.js.map +1 -0
- package/lib/features/design/home/studioHome.js +61 -0
- package/lib/features/design/home/studioHome.js.map +1 -0
- package/lib/features/design/pickDesignImage.js +60 -0
- package/lib/features/design/pickDesignImage.js.map +1 -0
- package/lib/features/design/render/DesignPageView.js +69 -0
- package/lib/features/design/render/DesignPageView.js.map +1 -0
- package/lib/features/design/render/PageCapture.js +288 -0
- package/lib/features/design/render/PageCapture.js.map +1 -0
- package/lib/features/design/render/TextMeasure.js +115 -0
- package/lib/features/design/render/TextMeasure.js.map +1 -0
- package/lib/features/design/render/fontRegistry.js +110 -0
- package/lib/features/design/render/fontRegistry.js.map +1 -0
- package/lib/features/design/render/layers.js +392 -0
- package/lib/features/design/render/layers.js.map +1 -0
- package/lib/features/design/render/svg.js +35 -0
- package/lib/features/design/render/svg.js.map +1 -0
- package/lib/features/design/render/svgParts.js +435 -0
- package/lib/features/design/render/svgParts.js.map +1 -0
- package/lib/features/design/surface/BoardScreen.js +529 -0
- package/lib/features/design/surface/BoardScreen.js.map +1 -0
- package/lib/features/design/surface/CompareView.js +138 -0
- package/lib/features/design/surface/CompareView.js.map +1 -0
- package/lib/features/design/surface/CreationScreen.js +294 -0
- package/lib/features/design/surface/CreationScreen.js.map +1 -0
- package/lib/features/design/surface/DesignAgentChatPane.js +444 -0
- package/lib/features/design/surface/DesignAgentChatPane.js.map +1 -0
- package/lib/features/design/surface/DesignBoards.js +441 -0
- package/lib/features/design/surface/DesignBoards.js.map +1 -0
- package/lib/features/design/surface/DesignPreview.js +159 -0
- package/lib/features/design/surface/DesignPreview.js.map +1 -0
- package/lib/features/design/surface/DesignSurfaceExperience.js +80 -0
- package/lib/features/design/surface/DesignSurfaceExperience.js.map +1 -0
- package/lib/features/design/surface/FullScreenPreview.js +59 -0
- package/lib/features/design/surface/FullScreenPreview.js.map +1 -0
- package/lib/features/design/surface/NewSystemDialog.js +122 -0
- package/lib/features/design/surface/NewSystemDialog.js.map +1 -0
- package/lib/features/design/surface/PickerSheet.js +175 -0
- package/lib/features/design/surface/PickerSheet.js.map +1 -0
- package/lib/features/design/surface/TemplatesGallery.js +156 -0
- package/lib/features/design/surface/TemplatesGallery.js.map +1 -0
- package/lib/features/design/surface/WetPaint.js +140 -0
- package/lib/features/design/surface/WetPaint.js.map +1 -0
- package/lib/features/design/surface/agentTurn.js +229 -0
- package/lib/features/design/surface/agentTurn.js.map +1 -0
- package/lib/features/design/surface/designBoard.js +218 -0
- package/lib/features/design/surface/designBoard.js.map +1 -0
- package/lib/features/design/surface/designChannel.js +186 -0
- package/lib/features/design/surface/designChannel.js.map +1 -0
- package/lib/features/design/surface/designChat.js +141 -0
- package/lib/features/design/surface/designChat.js.map +1 -0
- package/lib/features/design/surface/designConnector.js +266 -0
- package/lib/features/design/surface/designConnector.js.map +1 -0
- package/lib/features/design/surface/designDocument.js +40 -0
- package/lib/features/design/surface/designDocument.js.map +1 -0
- package/lib/features/design/surface/designExport.js +55 -0
- package/lib/features/design/surface/designExport.js.map +1 -0
- package/lib/features/design/surface/designLinks.js +64 -0
- package/lib/features/design/surface/designLinks.js.map +1 -0
- package/lib/features/design/surface/designPalette.js +24 -0
- package/lib/features/design/surface/designPalette.js.map +1 -0
- package/lib/features/design/surface/designRun.js +161 -0
- package/lib/features/design/surface/designRun.js.map +1 -0
- package/lib/features/design/surface/designTheme.js +119 -0
- package/lib/features/design/surface/designTheme.js.map +1 -0
- package/lib/features/design/surface/execStream.js +206 -0
- package/lib/features/design/surface/execStream.js.map +1 -0
- package/lib/features/design/surface/metaball.js +48 -0
- package/lib/features/design/surface/metaball.js.map +1 -0
- package/lib/features/design/surface/pickReferenceFiles.js +35 -0
- package/lib/features/design/surface/pickReferenceFiles.js.map +1 -0
- package/lib/features/design/surface/useDesignSurface.js +379 -0
- package/lib/features/design/surface/useDesignSurface.js.map +1 -0
- package/lib/features/docs/DocBlockRow.js +336 -0
- package/lib/features/docs/DocBlockRow.js.map +1 -0
- package/lib/features/docs/DocsEditorExperience.js +949 -0
- package/lib/features/docs/DocsEditorExperience.js.map +1 -0
- package/lib/features/docs/DocsToolbar.js +247 -0
- package/lib/features/docs/DocsToolbar.js.map +1 -0
- package/lib/features/docs/blocks.js +560 -0
- package/lib/features/docs/blocks.js.map +1 -0
- package/lib/features/docs/docArtifacts.js +129 -0
- package/lib/features/docs/docArtifacts.js.map +1 -0
- package/lib/features/docs/docEdits.js +201 -0
- package/lib/features/docs/docEdits.js.map +1 -0
- package/lib/features/docs/docExport.js +235 -0
- package/lib/features/docs/docExport.js.map +1 -0
- package/lib/features/docs/docShare.js +62 -0
- package/lib/features/docs/docShare.js.map +1 -0
- package/lib/features/links/openInApp.js +38 -2
- package/lib/features/links/openInApp.js.map +1 -1
- package/lib/routes.json +54 -0
- package/lib/screens/DesignNative/index.js +35 -0
- package/lib/screens/DesignNative/index.js.map +1 -0
- package/package.json +3 -3
- package/lib/features/design/exportDesign.js +0 -133
- package/lib/features/design/exportDesign.js.map +0 -1
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import {displayAskUserAssistantText}from'../../chat/askUser.js';import {looksLikeDocument,extractDocument,isComplete}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
|
+
const ADD_CHANNEL = `mutation AddChannel($channelId: ID, $name: String!, $type: RoomType, $orgName: String) {
|
|
21
|
+
createChannel(channelId: $channelId, name: $name, type: $type, orgName: $orgName) { id }
|
|
22
|
+
}`;
|
|
23
|
+
const CHANNEL_POSTS = `query SurfaceChannelPosts($channelId: ID, $limit: Int!) {
|
|
24
|
+
messages(channelId: $channelId, limit: $limit, sort: { key: "createdAt", value: DESC }) {
|
|
25
|
+
data { id message createdAt props type }
|
|
26
|
+
}
|
|
27
|
+
}`;
|
|
28
|
+
async function post(opts, query, variables) {
|
|
29
|
+
var _a, _b;
|
|
30
|
+
if (!opts.url) return null;
|
|
31
|
+
try {
|
|
32
|
+
const resp = await fetch(opts.url, {
|
|
33
|
+
method: "POST",
|
|
34
|
+
headers: __spreadValues({
|
|
35
|
+
"content-type": "application/json"
|
|
36
|
+
}, opts.token ? {
|
|
37
|
+
authorization: `Bearer ${opts.token}`
|
|
38
|
+
} : {}),
|
|
39
|
+
body: JSON.stringify({
|
|
40
|
+
query,
|
|
41
|
+
variables
|
|
42
|
+
})
|
|
43
|
+
});
|
|
44
|
+
if (!resp.ok) return null;
|
|
45
|
+
const body = await resp.json().catch(() => ({}));
|
|
46
|
+
if ((_a = body.errors) == null ? void 0 : _a.length) return null;
|
|
47
|
+
return (_b = body.data) != null ? _b : null;
|
|
48
|
+
} catch (e) {
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
const created = /* @__PURE__ */ new Set();
|
|
53
|
+
async function ensureChatChannel(opts, boardId, title = "Design") {
|
|
54
|
+
var _a;
|
|
55
|
+
if (!boardId || created.has(boardId)) return false;
|
|
56
|
+
created.add(boardId);
|
|
57
|
+
const data = await post(opts, ADD_CHANNEL, {
|
|
58
|
+
channelId: boardId,
|
|
59
|
+
name: title,
|
|
60
|
+
type: "AIASSISTANT"
|
|
61
|
+
});
|
|
62
|
+
return Boolean((_a = data == null ? void 0 : data.createChannel) == null ? void 0 : _a.id);
|
|
63
|
+
}
|
|
64
|
+
const CONTROL_BLOCK_RE = /\[(CMD_STATUS|CMD_CONFIRM|ASK_USER|CONNECTOR_CONNECT)\][\s\S]*?(\[\/\1\]|$)/g;
|
|
65
|
+
const STATUS_BLOCK_RE = /\[(CMD_STATUS|CMD_CONFIRM)\][\s\S]*?(\[\/\1\]|$)/g;
|
|
66
|
+
const STREAM_ENVELOPE_RE = /\[STREAM:[^\]\s]*\]/g;
|
|
67
|
+
const CONTROL_REPLY_RE = /^\s*\[(CMD_APPROVE|CMD_APPROVE_ALL|CMD_SKIP|CONNECTOR_CONNECTED|CONNECTOR_DECLINED)\b/;
|
|
68
|
+
const CONNECT_REPLY_RE = /^\s*\[CONNECTOR_(CONNECTED|DECLINED)(?::[^\]]*)?\]\s*$/;
|
|
69
|
+
const CONNECT_MARKER_RES = [/\[CONNECTOR_CONNECT\][\s\S]*?\[\/CONNECTOR_CONNECT\]/g, /\[CONNECTOR_CONNECT(?::[A-Za-z0-9_-]+)?:\s*\{[\s\S]*\}\s*\]/g, /\[CONNECTOR_CONNECT(?:\s+[A-Za-z][\w-]*\s*=\s*(?:"[^"]*"|'[^']*'))+\s*\]/g, /\[CONNECTOR_CONNECT:\s*[A-Za-z0-9_.-]+\s*\](?:\s*\[\/CONNECTOR_CONNECT\])?/g, /\[CONNECTOR_CONNECT\][\s\S]*$/g];
|
|
70
|
+
const CONNECTOR_HINT_RE = /^\[Active connectors:[^\]]*\]\n?/;
|
|
71
|
+
const MODEL_COST_RE = /^\s*(?:[^\w\n]+\s*)?[a-z0-9][a-z0-9._-]*\s*\(\s*\$[\d.]+\s*\/\s*MTok\s+in\s*\)\s*\n+/i;
|
|
72
|
+
const CHAT_DIRECTIVE_RE = /\n*\(If this turn asks for a web page, landing page, site or UI mockup,[\s\S]*?just reply\.\)\s*$/;
|
|
73
|
+
const DESIGN_DIRECTIVE_RE = /\n*\(Run the [\w-]+ action [A-Z_]+ with exactly these params:[\s\S]*$/;
|
|
74
|
+
function readablePostText(raw, keepCards = false) {
|
|
75
|
+
return (raw != null ? raw : "").replace(/\r\n/g, "\n").replace(STREAM_ENVELOPE_RE, "").replace(keepCards ? STATUS_BLOCK_RE : CONTROL_BLOCK_RE, "").replace(CONNECTOR_HINT_RE, "").replace(MODEL_COST_RE, "").replace(CHAT_DIRECTIVE_RE, "").replace(DESIGN_DIRECTIVE_RE, "").trim();
|
|
76
|
+
}
|
|
77
|
+
function isCardReply(text) {
|
|
78
|
+
return CONNECT_REPLY_RE.test(text != null ? text : "");
|
|
79
|
+
}
|
|
80
|
+
function designChatText(raw, answered = false) {
|
|
81
|
+
let text = displayAskUserAssistantText(raw != null ? raw : "", answered);
|
|
82
|
+
for (const re of CONNECT_MARKER_RES) text = text.replace(re, "");
|
|
83
|
+
return text === raw ? text : text.replace(/\n{3,}/g, "\n\n").trim();
|
|
84
|
+
}
|
|
85
|
+
function transcriptFromPosts(postsNewestFirst) {
|
|
86
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
87
|
+
const out = [];
|
|
88
|
+
for (const p of [...postsNewestFirst].reverse()) {
|
|
89
|
+
const role = ((_a = p.props) == null ? void 0 : _a.role) === "user" ? "user" : "assistant";
|
|
90
|
+
if (role === "user" && isCardReply(p.message)) {
|
|
91
|
+
out.push({
|
|
92
|
+
id: (_b = p.id) != null ? _b : `post-${out.length}`,
|
|
93
|
+
role,
|
|
94
|
+
text: ((_c = p.message) != null ? _c : "").trim()
|
|
95
|
+
});
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
if (CONTROL_REPLY_RE.test((_d = p.message) != null ? _d : "")) continue;
|
|
99
|
+
let text = readablePostText(p.message, role === "assistant");
|
|
100
|
+
if (!text) continue;
|
|
101
|
+
if (role === "assistant") {
|
|
102
|
+
const page = looksLikeDocument(text) ? text : extractDocument(text);
|
|
103
|
+
if (page) {
|
|
104
|
+
const title = (_f = (_e = page.match(/<title>([^<]+)<\/title>/i)) == null ? void 0 : _e[1]) == null ? void 0 : _f.trim();
|
|
105
|
+
const before = text.slice(0, text.indexOf(page)).replace(/```(?:html)?\s*$/i, "").trim();
|
|
106
|
+
text = before ? `${before}
|
|
107
|
+
|
|
108
|
+
Made \u201C${title || "a design"}\u201D.` : `Made \u201C${title || "a design"}\u201D.`;
|
|
109
|
+
}
|
|
110
|
+
} else if (text.length > 600 && /```html/.test(text)) {
|
|
111
|
+
text = text.replace(/```html[\s\S]*?```/g, "[reference design]").trim();
|
|
112
|
+
}
|
|
113
|
+
out.push({
|
|
114
|
+
id: (_g = p.id) != null ? _g : `post-${out.length}`,
|
|
115
|
+
role,
|
|
116
|
+
text
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
return out;
|
|
120
|
+
}
|
|
121
|
+
const HTML_URL_RE = /https?:\/\/[^\s<>"'`)\]]+\.html(?:\?[^\s<>"'`)\]]*)?/gi;
|
|
122
|
+
function designUrlsFromText(text) {
|
|
123
|
+
var _a;
|
|
124
|
+
if (!text) return [];
|
|
125
|
+
HTML_URL_RE.lastIndex = 0;
|
|
126
|
+
return [...new Set((_a = text.match(HTML_URL_RE)) != null ? _a : [])];
|
|
127
|
+
}
|
|
128
|
+
function designFromHtml(html, url) {
|
|
129
|
+
var _a, _b;
|
|
130
|
+
const title = (_b = (_a = html.match(/<title>([^<]+)<\/title>/i)) == null ? void 0 : _a[1]) == null ? void 0 : _b.trim();
|
|
131
|
+
return __spreadValues(__spreadProps(__spreadValues({
|
|
132
|
+
html
|
|
133
|
+
}, url ? {
|
|
134
|
+
url
|
|
135
|
+
} : {}), {
|
|
136
|
+
title: title || "Untitled design",
|
|
137
|
+
systemId: "claude",
|
|
138
|
+
templateId: "landing"
|
|
139
|
+
}), isComplete(html) ? {} : {
|
|
140
|
+
partial: true
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
function freshDesigns(designs, known) {
|
|
144
|
+
const seen = /* @__PURE__ */ new Set();
|
|
145
|
+
for (const c of known) {
|
|
146
|
+
if (c.url) seen.add(c.url);
|
|
147
|
+
if (c.html) seen.add(c.html);
|
|
148
|
+
}
|
|
149
|
+
return designs.filter((d) => !(d.url && seen.has(d.url)) && !seen.has(d.html));
|
|
150
|
+
}
|
|
151
|
+
async function fetchChannelHistory(opts, boardId, limit = 50) {
|
|
152
|
+
var _a, _b, _c, _d;
|
|
153
|
+
const data = await post(opts, CHANNEL_POSTS, {
|
|
154
|
+
channelId: boardId,
|
|
155
|
+
limit
|
|
156
|
+
});
|
|
157
|
+
const posts = (_b = (_a = data == null ? void 0 : data.messages) == null ? void 0 : _a.data) != null ? _b : [];
|
|
158
|
+
const designs = [];
|
|
159
|
+
const seen = /* @__PURE__ */ new Set();
|
|
160
|
+
for (const p of posts) {
|
|
161
|
+
if (((_c = p.props) == null ? void 0 : _c.role) === "user") continue;
|
|
162
|
+
const text = (_d = p.message) != null ? _d : "";
|
|
163
|
+
const inline = looksLikeDocument(text) ? text : extractDocument(text);
|
|
164
|
+
if (inline) {
|
|
165
|
+
if (!seen.has(inline)) {
|
|
166
|
+
seen.add(inline);
|
|
167
|
+
designs.push(designFromHtml(inline));
|
|
168
|
+
}
|
|
169
|
+
continue;
|
|
170
|
+
}
|
|
171
|
+
for (const url of designUrlsFromText(text)) {
|
|
172
|
+
if (seen.has(url)) continue;
|
|
173
|
+
seen.add(url);
|
|
174
|
+
try {
|
|
175
|
+
const resp = await fetch(url);
|
|
176
|
+
const html = resp.ok ? await resp.text() : "";
|
|
177
|
+
if (looksLikeDocument(html)) designs.push(designFromHtml(html, url));
|
|
178
|
+
} catch (e) {
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
return {
|
|
183
|
+
transcript: transcriptFromPosts(posts),
|
|
184
|
+
designs
|
|
185
|
+
};
|
|
186
|
+
}export{designChatText,designFromHtml,designUrlsFromText,ensureChatChannel,fetchChannelHistory,freshDesigns,isCardReply,readablePostText,transcriptFromPosts};//# sourceMappingURL=designChannel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"designChannel.js","sources":["../../../../src/features/design/surface/designChannel.ts"],"sourcesContent":["/**\n * A board's conversation, kept where the web keeps it: the chat channel whose\n * id IS the board id. Native twin of design-surface `state/chatChannel.ts`\n * (`ensureChatChannel`), `state/channelDesigns.ts` (designs recovered from\n * replies) and surface-kit `durableTurn` (`fetchChannelTranscript`).\n *\n * - The first send on a board creates the channel (type AIASSISTANT, titled\n * \"Design\", so it shows in chat history like any session).\n * - Agent turns run bound to it, so the agent itself stores both sides.\n * - Opening a board reads the channel back: the transcript, and any page a\n * reply carried that never reached the board (the app closed mid-turn).\n *\n * The board (`design` surface rows) and the chat (`channels`) live in different\n * backends; this is the chat half. Pure apart from `fetch`: runs under jest.\n */\nimport { displayAskUserAssistantText } from '../../chat/askUser';\nimport { extractDocument, isComplete, looksLikeDocument } from './designDocument';\nimport type { DesignArtifact } from './designBoard';\n\nexport interface ChannelOptions {\n /** The backend GraphQL (ideback), not the surface index. */\n url: string;\n token?: string | null;\n}\n\n/** Flat args, not an input object; `type` is load-bearing - chat history lists AIASSISTANT only. */\nconst ADD_CHANNEL = `mutation AddChannel($channelId: ID, $name: String!, $type: RoomType, $orgName: String) {\n createChannel(channelId: $channelId, name: $name, type: $type, orgName: $orgName) { id }\n}`;\n\nconst CHANNEL_POSTS = `query SurfaceChannelPosts($channelId: ID, $limit: Int!) {\n messages(channelId: $channelId, limit: $limit, sort: { key: \"createdAt\", value: DESC }) {\n data { id message createdAt props type }\n }\n}`;\n\nasync function post<T>(opts: ChannelOptions, query: string, variables: Record<string, unknown>): Promise<T | null> {\n if (!opts.url) return null;\n try {\n const resp = 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({ query, variables }),\n });\n if (!resp.ok) return null;\n const body = (await resp.json().catch(() => ({}))) as { data?: T; errors?: Array<{ message?: string }> };\n if (body.errors?.length) return null;\n return body.data ?? null;\n } catch {\n return null;\n }\n}\n\n/** Boards this app session already created a channel for. */\nconst created = new Set<string>();\n\n/**\n * Create the chat channel behind a board, once. Best-effort: a failure costs the\n * chat-history entry and the stored transcript, never the turn. A second create\n * of an existing channel is rejected by the server and changes nothing.\n */\nexport async function ensureChatChannel(opts: ChannelOptions, boardId: string, title = 'Design'): Promise<boolean> {\n if (!boardId || created.has(boardId)) return false;\n created.add(boardId);\n const data = await post<{ createChannel?: { id?: string } | null }>(opts, ADD_CHANNEL, {\n channelId: boardId,\n name: title,\n type: 'AIASSISTANT',\n });\n return Boolean(data?.createChannel?.id);\n}\n\n/** Forget what was created (tests). */\nexport function resetChannelCache(): void {\n created.clear();\n}\n\nexport interface ChannelPost {\n id?: string;\n message?: string | null;\n createdAt?: string | null;\n props?: { role?: unknown } | null;\n type?: string | null;\n}\n\nexport interface TranscriptEntry {\n id: string;\n role: 'user' | 'assistant';\n text: string;\n}\n\nconst CONTROL_BLOCK_RE = /\\[(CMD_STATUS|CMD_CONFIRM|ASK_USER|CONNECTOR_CONNECT)\\][\\s\\S]*?(\\[\\/\\1\\]|$)/g;\n/** Agent status markup; the question and connect cards are kept for the chat pane to draw. */\nconst STATUS_BLOCK_RE = /\\[(CMD_STATUS|CMD_CONFIRM)\\][\\s\\S]*?(\\[\\/\\1\\]|$)/g;\nconst STREAM_ENVELOPE_RE = /\\[STREAM:[^\\]\\s]*\\]/g;\n/** Control replies (`[CMD_APPROVE:id]`, ...) are whole posts. */\nconst CONTROL_REPLY_RE = /^\\s*\\[(CMD_APPROVE|CMD_APPROVE_ALL|CMD_SKIP|CONNECTOR_CONNECTED|CONNECTOR_DECLINED)\\b/;\n/** The connect card's answer: kept in the thread (it settles the card), never shown. */\nconst CONNECT_REPLY_RE = /^\\s*\\[CONNECTOR_(CONNECTED|DECLINED)(?::[^\\]]*)?\\]\\s*$/;\n/** Every shape of the `[CONNECTOR_CONNECT]` marker the web's parser takes (surface-kit connectorConnect). */\nconst CONNECT_MARKER_RES = [\n /\\[CONNECTOR_CONNECT\\][\\s\\S]*?\\[\\/CONNECTOR_CONNECT\\]/g,\n /\\[CONNECTOR_CONNECT(?::[A-Za-z0-9_-]+)?:\\s*\\{[\\s\\S]*\\}\\s*\\]/g,\n /\\[CONNECTOR_CONNECT(?:\\s+[A-Za-z][\\w-]*\\s*=\\s*(?:\"[^\"]*\"|'[^']*'))+\\s*\\]/g,\n /\\[CONNECTOR_CONNECT:\\s*[A-Za-z0-9_.-]+\\s*\\](?:\\s*\\[\\/CONNECTOR_CONNECT\\])?/g,\n /\\[CONNECTOR_CONNECT\\][\\s\\S]*$/g,\n];\n/** cdecli's routing hint, prepended to the user's text. */\nconst CONNECTOR_HINT_RE = /^\\[Active connectors:[^\\]]*\\]\\n?/;\nconst MODEL_COST_RE = /^\\s*(?:[^\\w\\n]+\\s*)?[a-z0-9][a-z0-9._-]*\\s*\\(\\s*\\$[\\d.]+\\s*\\/\\s*MTok\\s+in\\s*\\)\\s*\\n+/i;\n/** The routing note this surface appends to every agent turn (agentTurn `chatDirective`). */\nconst CHAT_DIRECTIVE_RE =\n /\\n*\\(If this turn asks for a web page, landing page, site or UI mockup,[\\s\\S]*?just reply\\.\\)\\s*$/;\n/** The pinned-params note of a durable generate / edit (designDirective). */\nconst DESIGN_DIRECTIVE_RE = /\\n*\\(Run the [\\w-]+ action [A-Z_]+ with exactly these params:[\\s\\S]*$/;\n\n/**\n * One post as the person reads it: the surface's own routing notes and control\n * markup gone. `keepCards` leaves the `[ASK_USER]` / `[CONNECTOR_CONNECT]` blocks\n * in, for the chat pane to turn into cards (`designChatText` hides them).\n */\nexport function readablePostText(raw: string | null | undefined, keepCards = false): string {\n return (raw ?? '')\n .replace(/\\r\\n/g, '\\n')\n .replace(STREAM_ENVELOPE_RE, '')\n .replace(keepCards ? STATUS_BLOCK_RE : CONTROL_BLOCK_RE, '')\n .replace(CONNECTOR_HINT_RE, '')\n .replace(MODEL_COST_RE, '')\n .replace(CHAT_DIRECTIVE_RE, '')\n .replace(DESIGN_DIRECTIVE_RE, '')\n .trim();\n}\n\n/** A connect card's answer (`[CONNECTOR_CONNECTED:…]`), sent as a post but never shown. */\nexport function isCardReply(text: string | null | undefined): boolean {\n return CONNECT_REPLY_RE.test(text ?? '');\n}\n\n/**\n * A chat entry as the pane paints it: the question and connect markers out (the\n * cards draw them), and once the question is answered, the intro above it too.\n * A half-written marker in a streaming reply never flashes either.\n */\nexport function designChatText(raw: string | null | undefined, answered = false): string {\n let text = displayAskUserAssistantText(raw ?? '', answered);\n for (const re of CONNECT_MARKER_RES) text = text.replace(re, '');\n return text === raw ? text : text.replace(/\\n{3,}/g, '\\n\\n').trim();\n}\n\n/**\n * The transcript in posts, oldest first. A reply that IS a page shows as a line\n * saying so, not as kilobytes of HTML - the page itself lands on the board.\n */\nexport function transcriptFromPosts(postsNewestFirst: readonly ChannelPost[]): TranscriptEntry[] {\n const out: TranscriptEntry[] = [];\n for (const p of [...postsNewestFirst].reverse()) {\n const role = p.props?.role === 'user' ? 'user' : 'assistant';\n if (role === 'user' && isCardReply(p.message)) {\n // Kept so the card it answered does not come back on reload.\n out.push({ id: p.id ?? `post-${out.length}`, role, text: (p.message ?? '').trim() });\n continue;\n }\n if (CONTROL_REPLY_RE.test(p.message ?? '')) continue;\n let text = readablePostText(p.message, role === 'assistant');\n if (!text) continue;\n if (role === 'assistant') {\n const page = looksLikeDocument(text) ? text : extractDocument(text);\n if (page) {\n const title = page.match(/<title>([^<]+)<\\/title>/i)?.[1]?.trim();\n const before = text\n .slice(0, text.indexOf(page))\n .replace(/```(?:html)?\\s*$/i, '')\n .trim();\n text = before ? `${before}\\n\\nMade “${title || 'a design'}”.` : `Made “${title || 'a design'}”.`;\n }\n } else if (text.length > 600 && /```html/.test(text)) {\n // A \"New from this\" brief carries the reference page: show the ask, not the page.\n text = text.replace(/```html[\\s\\S]*?```/g, '[reference design]').trim();\n }\n out.push({ id: p.id ?? `post-${out.length}`, role, text });\n }\n return out;\n}\n\n/** The page URLs in a reply - markdown link or bare, query string and all. */\nconst HTML_URL_RE = /https?:\\/\\/[^\\s<>\"'`)\\]]+\\.html(?:\\?[^\\s<>\"'`)\\]]*)?/gi;\n\nexport function designUrlsFromText(text: string): string[] {\n if (!text) return [];\n HTML_URL_RE.lastIndex = 0;\n return [...new Set(text.match(HTML_URL_RE) ?? [])];\n}\n\n/** A page recovered from a reply, as a board creation (web `designFromHtml`). */\nexport function designFromHtml(html: string, url?: string): DesignArtifact {\n const title = html.match(/<title>([^<]+)<\\/title>/i)?.[1]?.trim();\n return {\n html,\n ...(url ? { url } : {}),\n title: title || 'Untitled design',\n systemId: 'claude',\n templateId: 'landing',\n ...(isComplete(html) ? {} : { partial: true }),\n };\n}\n\n/** The designs in replies the board does not hold yet, keyed by url AND html (web `freshDesigns`). */\nexport function freshDesigns(designs: readonly DesignArtifact[], known: readonly DesignArtifact[]): DesignArtifact[] {\n const seen = new Set<string>();\n for (const c of known) {\n if (c.url) seen.add(c.url);\n if (c.html) seen.add(c.html);\n }\n return designs.filter((d) => !(d.url && seen.has(d.url)) && !seen.has(d.html));\n}\n\nexport interface ChannelHistory {\n transcript: TranscriptEntry[];\n /** Pages the replies carried (inline, or as a link to the uploaded page). */\n designs: DesignArtifact[];\n}\n\n/** Read a board's channel back: its transcript, and the designs its replies carried. */\nexport async function fetchChannelHistory(opts: ChannelOptions, boardId: string, limit = 50): Promise<ChannelHistory> {\n const data = await post<{ messages?: { data?: ChannelPost[] | null } | null }>(opts, CHANNEL_POSTS, {\n channelId: boardId,\n limit,\n });\n const posts = data?.messages?.data ?? [];\n const designs: DesignArtifact[] = [];\n const seen = new Set<string>();\n for (const p of posts) {\n if (p.props?.role === 'user') continue;\n const text = p.message ?? '';\n const inline = looksLikeDocument(text) ? text : extractDocument(text);\n if (inline) {\n if (!seen.has(inline)) {\n seen.add(inline);\n designs.push(designFromHtml(inline));\n }\n continue;\n }\n for (const url of designUrlsFromText(text)) {\n if (seen.has(url)) continue;\n seen.add(url);\n try {\n const resp = await fetch(url);\n const html = resp.ok ? await resp.text() : '';\n if (looksLikeDocument(html)) designs.push(designFromHtml(html, url));\n } catch {\n // An expired or private link: the transcript still says it was made.\n }\n }\n }\n return { transcript: transcriptFromPosts(posts), designs };\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
function describeTarget(p) {
|
|
2
|
+
const pos = `${Math.round(p.xPct)}%,${Math.round(p.yPct)}%`;
|
|
3
|
+
const t = p.target;
|
|
4
|
+
if (!t) return `@ ${pos}`;
|
|
5
|
+
const anchor = (t.text || t.label || "").replace(/\s+/g, " ").trim();
|
|
6
|
+
const tag = t.tag ? ` <${t.tag}>` : "";
|
|
7
|
+
if (!anchor) return `\u2192${tag || " element"}${t.path ? ` in ${t.path}` : ""}, at ${pos}`;
|
|
8
|
+
return `\u2192${tag} "${anchor}"`;
|
|
9
|
+
}
|
|
10
|
+
function composeEditsMessage(picks, subject = "designs") {
|
|
11
|
+
const lines = picks.map((p) => `- [${p.creationTitle} ${describeTarget(p)}]: ${p.comment || "see pin"}`);
|
|
12
|
+
return `Apply these edits to the ${subject}:
|
|
13
|
+
${lines.join("\n")}`;
|
|
14
|
+
}
|
|
15
|
+
function selectionLabel(t) {
|
|
16
|
+
return ((t == null ? void 0 : t.text) || (t == null ? void 0 : t.label) || "").replace(/\s+/g, " ").trim().slice(0, 80);
|
|
17
|
+
}
|
|
18
|
+
function composeToolboxMessage(action, draft) {
|
|
19
|
+
const parts = [`Selected skill: ${action.skill}. Use it as the primary workflow for this turn.`];
|
|
20
|
+
if (draft && draft.trim()) parts.push(`Preserve the intent already in the composer: ${draft.trim()}`);
|
|
21
|
+
if (action.prompt) parts.push(action.prompt);
|
|
22
|
+
return parts.join("\n\n");
|
|
23
|
+
}
|
|
24
|
+
const DESIGN_TOOLBOX_ACTIONS = [{
|
|
25
|
+
id: "auto-match",
|
|
26
|
+
title: "Match next step",
|
|
27
|
+
badge: "Match",
|
|
28
|
+
description: "Define the taste bar first, then match skills, MCP, plugins, connectors, and files.",
|
|
29
|
+
skill: "creative-director",
|
|
30
|
+
prompt: 'Act as the Creative Director orchestrator: first define what "good-looking" means here (audience, goal, brand feel, references, density, color/type/motion standards, and AI/template patterns to avoid), then choose the best combination of skills, plugins, and files, and complete the next concrete step. Explain why the resources were chosen.',
|
|
31
|
+
icon: "creation",
|
|
32
|
+
editsCurrent: true
|
|
33
|
+
}, {
|
|
34
|
+
id: "motion",
|
|
35
|
+
title: "Add animation / motion",
|
|
36
|
+
badge: "Motion",
|
|
37
|
+
description: "Add entrance, scroll, state-transition, and micro-interaction motion to the current HTML.",
|
|
38
|
+
skill: "emilkowalski-motion",
|
|
39
|
+
prompt: "Add high-quality motion to the current HTML / page element: choose the most useful 1-2 entrance, scroll, state-transition, or micro-interaction moments. Keep it restrained, prefer transform / opacity, and include prefers-reduced-motion fallbacks.",
|
|
40
|
+
icon: "play-circle-outline",
|
|
41
|
+
editsCurrent: true
|
|
42
|
+
}, {
|
|
43
|
+
id: "motion-polish",
|
|
44
|
+
title: "Polish motion",
|
|
45
|
+
badge: "Timing",
|
|
46
|
+
description: "Review timing, easing, performance, and reduced-motion fallbacks for existing motion.",
|
|
47
|
+
skill: "gsap-performance",
|
|
48
|
+
prompt: "Review and polish existing motion timing, easing, performance, and accessibility. Remove abrupt, cheap, or readability-harming animation; use a more refined timeline when needed.",
|
|
49
|
+
icon: "tune-vertical",
|
|
50
|
+
editsCurrent: true
|
|
51
|
+
}, {
|
|
52
|
+
id: "anti-ai-polish",
|
|
53
|
+
title: "Remove AI feel",
|
|
54
|
+
badge: "Taste",
|
|
55
|
+
description: "Remove template feel, AI gradients, cheap card stacks, and vague copy.",
|
|
56
|
+
skill: "impeccable-design-polish",
|
|
57
|
+
prompt: "Do one anti-AI-feel polish pass: remove templated layouts, cheap gradients/glows, meaningless card stacks, and vague copy. Preserve information and make it feel like a real designer delivered it.",
|
|
58
|
+
icon: "format-paint",
|
|
59
|
+
editsCurrent: true
|
|
60
|
+
}, {
|
|
61
|
+
id: "visual-polish",
|
|
62
|
+
title: "Design polish / ready to ship",
|
|
63
|
+
badge: "Polish",
|
|
64
|
+
description: "Audit visual hierarchy, type, spacing, responsive behavior, accessibility, and delivery quality.",
|
|
65
|
+
skill: "impeccable-design-polish",
|
|
66
|
+
prompt: "Polish this design until it is ready to ship: check hierarchy, typography, spacing, responsive behavior, button states, empty/loading/error states, and accessibility; directly fix the most important issues.",
|
|
67
|
+
icon: "palette-outline",
|
|
68
|
+
editsCurrent: true
|
|
69
|
+
}, {
|
|
70
|
+
id: "image-gen",
|
|
71
|
+
title: "Generate images / visual references",
|
|
72
|
+
badge: "Image",
|
|
73
|
+
description: "Plan section references, hero assets, illustrations, icons, or a moodboard.",
|
|
74
|
+
skill: "imagegen-frontend-web",
|
|
75
|
+
prompt: "Create the next visual-asset plan for this design: section references, hero assets, illustrations, icons, social images, or a moodboard. First decide what kind of image is missing, then provide executable generation prompts / a file plan.",
|
|
76
|
+
icon: "image-outline",
|
|
77
|
+
editsCurrent: false
|
|
78
|
+
}, {
|
|
79
|
+
id: "video-gen",
|
|
80
|
+
title: "Generate video / motion script",
|
|
81
|
+
badge: "Video",
|
|
82
|
+
description: "Turn the design into a short video, storyboard, or generation-ready prompt.",
|
|
83
|
+
skill: "video-hyperframes",
|
|
84
|
+
prompt: "Turn this design toward video: create a short-video storyboard, a Hyperframes / Remotion frame structure, or a generation-ready prompt. Prefer making the existing HTML / page content naturally become shots.",
|
|
85
|
+
icon: "movie-open-outline",
|
|
86
|
+
editsCurrent: false
|
|
87
|
+
}];
|
|
88
|
+
const PROVIDER_GROUP = {
|
|
89
|
+
"yantra-router": "Yantra Router",
|
|
90
|
+
groq: "Groq (no key)",
|
|
91
|
+
anthropic: "Anthropic (BYOK)",
|
|
92
|
+
openai: "OpenAI (BYOK)",
|
|
93
|
+
google: "Google (BYOK)",
|
|
94
|
+
xai: "xAI (BYOK)",
|
|
95
|
+
moonshot: "Moonshot (BYOK)",
|
|
96
|
+
bedrock: "Amazon Bedrock (BYOK)"
|
|
97
|
+
};
|
|
98
|
+
const MODELS = [["yantra-router/small", "Yantra Small (Fast & Efficient)", "yantra-router"], ["yantra-router/medium", "Yantra Medium (Balanced)", "yantra-router"], ["yantra-router/complex", "Yantra Complex (High Quality)", "yantra-router"], ["yantra-router/reasoning", "Yantra Reasoning (Deep Thinking)", "yantra-router"], ["groq/llama-3.3-70b-versatile", "Meta Llama 3.3 70B", "groq"], ["groq/llama-3.1-8b-instant", "Meta Llama 3.1 8B", "groq"], ["groq/meta-llama/llama-4-scout-17b-16e-instruct", "Meta Llama 4 Scout 17B", "groq"], ["anthropic/claude-opus-4-6", "Claude Opus 4.6", "anthropic"], ["anthropic/claude-sonnet-4", "Claude Sonnet 4", "anthropic"], ["anthropic/claude-opus-4-5", "Claude Opus 4.5", "anthropic"], ["anthropic/claude-haiku-4.5", "Claude Haiku 4.5", "anthropic"], ["openai/gpt-5.4", "GPT-5.4", "openai"], ["openai/gpt-5.4-pro", "GPT-5.4 Pro", "openai"], ["openai/gpt-5.4-mini", "GPT-5.4 Mini", "openai"], ["openai/gpt-5.4-nano", "GPT-5.4 Nano", "openai"], ["google/gemini-3.1-pro", "Gemini 3.1 Pro", "google"], ["google/gemini-3-flash", "Gemini 3 Flash", "google"], ["xai/grok-4.20", "Grok 4.20", "xai"], ["xai/grok-4.1-fast", "Grok 4.1 Fast", "xai"], ["xai/grok-4.20-reasoning", "Grok 4.20 Reasoning", "xai"], ["xai/grok-code-fast", "Grok Code Fast", "xai"], ["moonshot/kimi-k2.5", "Kimi K2.5", "moonshot"], ["moonshot/kimi-k2-thinking", "Kimi K2 Thinking", "moonshot"], ["moonshot/kimi-k2", "Kimi K2", "moonshot"], ["bedrock/anthropic.claude-sonnet-4-6-v1:0", "Claude Sonnet 4.6", "bedrock"], ["bedrock/anthropic.claude-opus-4-6-v1:0", "Claude Opus 4.6", "bedrock"], ["bedrock/amazon.nova-pro-v1:0", "Amazon Nova Pro", "bedrock"], ["bedrock/deepseek.deepseek-r1-v1:0", "DeepSeek R1", "bedrock"]];
|
|
99
|
+
const MODEL_OPTIONS = MODELS.map(([id, title, provider]) => ({
|
|
100
|
+
id,
|
|
101
|
+
title,
|
|
102
|
+
group: PROVIDER_GROUP[provider],
|
|
103
|
+
requiresKey: provider !== "yantra-router" && provider !== "groq"
|
|
104
|
+
}));
|
|
105
|
+
const DEFAULT_MODEL_ID = "yantra-router/medium";
|
|
106
|
+
function attachmentsNote(uploaded) {
|
|
107
|
+
if (!uploaded.length) return "";
|
|
108
|
+
const lines = uploaded.map((u) => {
|
|
109
|
+
var _a;
|
|
110
|
+
return u.url ? `- ${u.name} (${u.mimeType}): ${u.url}` : `- ${u.name}: upload FAILED (${(_a = u.error) != null ? _a : "unknown error"}) \u2014 say so, do not invent this reference`;
|
|
111
|
+
});
|
|
112
|
+
const hasImage = uploaded.some((u) => u.url && u.mimeType.startsWith("image/"));
|
|
113
|
+
const use = hasImage ? "For an image/screenshot, LOOK at it and match what it shows \u2014 layout, spacing, type scale, colour and component structure. It is the visual reference for this design, not decoration." : "Read each one and use its contents as the source material for this design.";
|
|
114
|
+
return `
|
|
115
|
+
|
|
116
|
+
REFERENCE FILES the user attached. Download each into your workspace first (curl -L -o). ${use}
|
|
117
|
+
${lines.join("\n")}`;
|
|
118
|
+
}
|
|
119
|
+
function textWithUploads(text, uploaded) {
|
|
120
|
+
if (!uploaded.length) return text;
|
|
121
|
+
return (text.trim() || "Work from the attached reference file(s).") + attachmentsNote(uploaded);
|
|
122
|
+
}
|
|
123
|
+
const MAX_REFERENCE_HTML = 16e3;
|
|
124
|
+
function briefWithReference(brief, reference) {
|
|
125
|
+
const html = reference.html.length > MAX_REFERENCE_HTML ? `${reference.html.slice(0, MAX_REFERENCE_HTML)}
|
|
126
|
+
<!-- \u2026reference truncated\u2026 -->` : reference.html;
|
|
127
|
+
return [`Use this existing design as reference/context \u2014 keep its design system, visual language, and structure, but produce a NEW, separate page (do not just return the reference).`, `Reference design: \u201C${reference.title}\u201D${reference.systemId ? ` (design system: ${reference.systemId})` : ""}.`, "```html\n" + html + "\n```", `Now create: ${brief}`].join("\n\n");
|
|
128
|
+
}
|
|
129
|
+
function normalizeSiteUrl(raw) {
|
|
130
|
+
var _a, _b;
|
|
131
|
+
const text = raw.trim();
|
|
132
|
+
if (!text || /\s/.test(text)) return "";
|
|
133
|
+
const withScheme = /^https?:\/\//i.test(text) ? text : `https://${text}`;
|
|
134
|
+
const m = /^(https?):\/\/([^/?#:]+)(:\d+)?([/?#].*)?$/i.exec(withScheme);
|
|
135
|
+
if (!m || !m[2].includes(".") || /^\.|\.$/.test(m[2])) return "";
|
|
136
|
+
return `${m[1].toLowerCase()}://${m[2].toLowerCase()}${(_a = m[3]) != null ? _a : ""}${(_b = m[4]) != null ? _b : "/"}`;
|
|
137
|
+
}
|
|
138
|
+
function designFileName(creation) {
|
|
139
|
+
const safe = (s) => s.replace(/[^A-Za-z0-9._-]+/g, "-").replace(/^-+|-+$/g, "");
|
|
140
|
+
return `${safe(creation.templateId) || "design"}-${safe(creation.systemId) || "page"}.html`;
|
|
141
|
+
}export{DEFAULT_MODEL_ID,DESIGN_TOOLBOX_ACTIONS,MODEL_OPTIONS,attachmentsNote,briefWithReference,composeEditsMessage,composeToolboxMessage,designFileName,normalizeSiteUrl,selectionLabel,textWithUploads};//# sourceMappingURL=designChat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"designChat.js","sources":["../../../../src/features/design/surface/designChat.ts"],"sourcesContent":["/**\n * What the composer sends - native twin of the pieces the web agent pane\n * builds its turns from: surface-kit `chat` (`composeEditsMessage`,\n * `composeToolboxMessage`, annotation picks), design-surface\n * `components/designToolbox.ts`, `standalone/models.ts` and\n * `standalone/designAttachments.ts` (`attachmentsNote`).\n *\n * Every string is the web's, word for word: the generator and its skills are\n * tuned to these messages, so a phone turn must read like a web turn.\n *\n * Pure: runs under jest as-is.\n */\n\n/** The element under an annotation pin (kit `AnnotationTarget`). */\nexport interface AnnotationTarget {\n tag?: string;\n text?: string;\n label?: string;\n path?: string;\n}\n\n/** A numbered pin destined for the next send (kit `AnnotationPick`). */\nexport interface AnnotationPick {\n id: number;\n creationTitle: string;\n xPct: number;\n yPct: number;\n comment: string;\n target?: AnnotationTarget;\n}\n\nfunction describeTarget(p: AnnotationPick): string {\n const pos = `${Math.round(p.xPct)}%,${Math.round(p.yPct)}%`;\n const t = p.target;\n if (!t) return `@ ${pos}`;\n const anchor = (t.text || t.label || '').replace(/\\s+/g, ' ').trim();\n const tag = t.tag ? ` <${t.tag}>` : '';\n if (!anchor) return `→${tag || ' element'}${t.path ? ` in ${t.path}` : ''}, at ${pos}`;\n return `→${tag} \"${anchor}\"`;\n}\n\n/** The shell-parity edits message for a set of pins. */\nexport function composeEditsMessage(picks: readonly AnnotationPick[], subject = 'designs'): string {\n const lines = picks.map((p) => `- [${p.creationTitle} ${describeTarget(p)}]: ${p.comment || 'see pin'}`);\n return `Apply these edits to the ${subject}:\\n${lines.join('\\n')}`;\n}\n\n/** What a pin shows before it is sent: the element it resolved to. */\nexport function selectionLabel(t: AnnotationTarget | undefined): string {\n return (t?.text || t?.label || '').replace(/\\s+/g, ' ').trim().slice(0, 80);\n}\n\n/** The message a toolbox pick sends: the skill, the draft kept as intent, the seed. */\nexport function composeToolboxMessage(action: { skill: string; prompt?: string }, draft?: string): string {\n const parts = [`Selected skill: ${action.skill}. Use it as the primary workflow for this turn.`];\n if (draft && draft.trim()) parts.push(`Preserve the intent already in the composer: ${draft.trim()}`);\n if (action.prompt) parts.push(action.prompt);\n return parts.join('\\n\\n');\n}\n\nexport interface ToolboxAction {\n id: string;\n title: string;\n badge: string;\n description: string;\n skill: string;\n prompt: string;\n /** MaterialCommunityIcons glyph. */\n icon: string;\n /** True: operates on the open design (an in-place edit). */\n editsCurrent: boolean;\n}\n\n/** The curated follow-up actions (web DESIGN_TOOLBOX_ACTIONS). */\nexport const DESIGN_TOOLBOX_ACTIONS: readonly ToolboxAction[] = [\n {\n id: 'auto-match',\n title: 'Match next step',\n badge: 'Match',\n description: 'Define the taste bar first, then match skills, MCP, plugins, connectors, and files.',\n skill: 'creative-director',\n prompt: 'Act as the Creative Director orchestrator: first define what \"good-looking\" means here (audience, goal, brand feel, references, density, color/type/motion standards, and AI/template patterns to avoid), then choose the best combination of skills, plugins, and files, and complete the next concrete step. Explain why the resources were chosen.',\n icon: 'creation',\n editsCurrent: true,\n },\n {\n id: 'motion',\n title: 'Add animation / motion',\n badge: 'Motion',\n description: 'Add entrance, scroll, state-transition, and micro-interaction motion to the current HTML.',\n skill: 'emilkowalski-motion',\n prompt: 'Add high-quality motion to the current HTML / page element: choose the most useful 1-2 entrance, scroll, state-transition, or micro-interaction moments. Keep it restrained, prefer transform / opacity, and include prefers-reduced-motion fallbacks.',\n icon: 'play-circle-outline',\n editsCurrent: true,\n },\n {\n id: 'motion-polish',\n title: 'Polish motion',\n badge: 'Timing',\n description: 'Review timing, easing, performance, and reduced-motion fallbacks for existing motion.',\n skill: 'gsap-performance',\n prompt: 'Review and polish existing motion timing, easing, performance, and accessibility. Remove abrupt, cheap, or readability-harming animation; use a more refined timeline when needed.',\n icon: 'tune-vertical',\n editsCurrent: true,\n },\n {\n id: 'anti-ai-polish',\n title: 'Remove AI feel',\n badge: 'Taste',\n description: 'Remove template feel, AI gradients, cheap card stacks, and vague copy.',\n skill: 'impeccable-design-polish',\n prompt: 'Do one anti-AI-feel polish pass: remove templated layouts, cheap gradients/glows, meaningless card stacks, and vague copy. Preserve information and make it feel like a real designer delivered it.',\n icon: 'format-paint',\n editsCurrent: true,\n },\n {\n id: 'visual-polish',\n title: 'Design polish / ready to ship',\n badge: 'Polish',\n description: 'Audit visual hierarchy, type, spacing, responsive behavior, accessibility, and delivery quality.',\n skill: 'impeccable-design-polish',\n prompt: 'Polish this design until it is ready to ship: check hierarchy, typography, spacing, responsive behavior, button states, empty/loading/error states, and accessibility; directly fix the most important issues.',\n icon: 'palette-outline',\n editsCurrent: true,\n },\n {\n id: 'image-gen',\n title: 'Generate images / visual references',\n badge: 'Image',\n description: 'Plan section references, hero assets, illustrations, icons, or a moodboard.',\n skill: 'imagegen-frontend-web',\n prompt: 'Create the next visual-asset plan for this design: section references, hero assets, illustrations, icons, social images, or a moodboard. First decide what kind of image is missing, then provide executable generation prompts / a file plan.',\n icon: 'image-outline',\n editsCurrent: false,\n },\n {\n id: 'video-gen',\n title: 'Generate video / motion script',\n badge: 'Video',\n description: 'Turn the design into a short video, storyboard, or generation-ready prompt.',\n skill: 'video-hyperframes',\n prompt: 'Turn this design toward video: create a short-video storyboard, a Hyperframes / Remotion frame structure, or a generation-ready prompt. Prefer making the existing HTML / page content naturally become shots.',\n icon: 'movie-open-outline',\n editsCurrent: false,\n },\n];\n\nexport interface ModelOption {\n id: string;\n title: string;\n group: string;\n requiresKey: boolean;\n}\n\ntype Provider = 'yantra-router' | 'groq' | 'anthropic' | 'openai' | 'google' | 'xai' | 'moonshot' | 'bedrock';\n\nconst PROVIDER_GROUP: Record<Provider, string> = {\n 'yantra-router': 'Yantra Router',\n groq: 'Groq (no key)',\n anthropic: 'Anthropic (BYOK)',\n openai: 'OpenAI (BYOK)',\n google: 'Google (BYOK)',\n xai: 'xAI (BYOK)',\n moonshot: 'Moonshot (BYOK)',\n bedrock: 'Amazon Bedrock (BYOK)',\n};\n\nconst MODELS: Array<[string, string, Provider]> = [\n ['yantra-router/small', 'Yantra Small (Fast & Efficient)', 'yantra-router'],\n ['yantra-router/medium', 'Yantra Medium (Balanced)', 'yantra-router'],\n ['yantra-router/complex', 'Yantra Complex (High Quality)', 'yantra-router'],\n ['yantra-router/reasoning', 'Yantra Reasoning (Deep Thinking)', 'yantra-router'],\n ['groq/llama-3.3-70b-versatile', 'Meta Llama 3.3 70B', 'groq'],\n ['groq/llama-3.1-8b-instant', 'Meta Llama 3.1 8B', 'groq'],\n ['groq/meta-llama/llama-4-scout-17b-16e-instruct', 'Meta Llama 4 Scout 17B', 'groq'],\n ['anthropic/claude-opus-4-6', 'Claude Opus 4.6', 'anthropic'],\n ['anthropic/claude-sonnet-4', 'Claude Sonnet 4', 'anthropic'],\n ['anthropic/claude-opus-4-5', 'Claude Opus 4.5', 'anthropic'],\n ['anthropic/claude-haiku-4.5', 'Claude Haiku 4.5', 'anthropic'],\n ['openai/gpt-5.4', 'GPT-5.4', 'openai'],\n ['openai/gpt-5.4-pro', 'GPT-5.4 Pro', 'openai'],\n ['openai/gpt-5.4-mini', 'GPT-5.4 Mini', 'openai'],\n ['openai/gpt-5.4-nano', 'GPT-5.4 Nano', 'openai'],\n ['google/gemini-3.1-pro', 'Gemini 3.1 Pro', 'google'],\n ['google/gemini-3-flash', 'Gemini 3 Flash', 'google'],\n ['xai/grok-4.20', 'Grok 4.20', 'xai'],\n ['xai/grok-4.1-fast', 'Grok 4.1 Fast', 'xai'],\n ['xai/grok-4.20-reasoning', 'Grok 4.20 Reasoning', 'xai'],\n ['xai/grok-code-fast', 'Grok Code Fast', 'xai'],\n ['moonshot/kimi-k2.5', 'Kimi K2.5', 'moonshot'],\n ['moonshot/kimi-k2-thinking', 'Kimi K2 Thinking', 'moonshot'],\n ['moonshot/kimi-k2', 'Kimi K2', 'moonshot'],\n ['bedrock/anthropic.claude-sonnet-4-6-v1:0', 'Claude Sonnet 4.6', 'bedrock'],\n ['bedrock/anthropic.claude-opus-4-6-v1:0', 'Claude Opus 4.6', 'bedrock'],\n ['bedrock/amazon.nova-pro-v1:0', 'Amazon Nova Pro', 'bedrock'],\n ['bedrock/deepseek.deepseek-r1-v1:0', 'DeepSeek R1', 'bedrock'],\n];\n\n/** The static model registry (web REGISTRY_MODEL_OPTIONS): no-key providers lead. */\nexport const MODEL_OPTIONS: readonly ModelOption[] = MODELS.map(([id, title, provider]) => ({\n id,\n title,\n group: PROVIDER_GROUP[provider],\n requiresKey: provider !== 'yantra-router' && provider !== 'groq',\n}));\n\nexport const DEFAULT_MODEL_ID = 'yantra-router/medium';\n\nexport interface UploadedAttachment {\n name: string;\n mimeType: string;\n url: string | null;\n error?: string;\n}\n\n/** The block appended to a turn for its uploaded files (web `attachmentsNote`). */\nexport function attachmentsNote(uploaded: readonly UploadedAttachment[]): string {\n if (!uploaded.length) return '';\n const lines = uploaded.map((u) =>\n u.url\n ? `- ${u.name} (${u.mimeType}): ${u.url}`\n : `- ${u.name}: upload FAILED (${u.error ?? 'unknown error'}) — say so, do not invent this reference`,\n );\n const hasImage = uploaded.some((u) => u.url && u.mimeType.startsWith('image/'));\n const use = hasImage\n ? 'For an image/screenshot, LOOK at it and match what it shows — layout, spacing, type scale, colour and component structure. It is the visual reference for this design, not decoration.'\n : 'Read each one and use its contents as the source material for this design.';\n return (\n `\\n\\nREFERENCE FILES the user attached. Download each into your workspace first ` +\n `(curl -L -o). ${use}\\n${lines.join('\\n')}`\n );\n}\n\n/** A turn's text with its files: a sentence-less turn still says what to do with them. */\nexport function textWithUploads(text: string, uploaded: readonly UploadedAttachment[]): string {\n if (!uploaded.length) return text;\n return (text.trim() || 'Work from the attached reference file(s).') + attachmentsNote(uploaded);\n}\n\nconst MAX_REFERENCE_HTML = 16000;\n\n/**\n * \"New from this\": a NEW page that keeps the open design's system, visual\n * language and structure - the reference page rides in the brief, truncated\n * (web `briefWithReference`).\n */\nexport function briefWithReference(\n brief: string,\n reference: { title: string; html: string; systemId?: string },\n): string {\n const html =\n reference.html.length > MAX_REFERENCE_HTML\n ? `${reference.html.slice(0, MAX_REFERENCE_HTML)}\\n<!-- …reference truncated… -->`\n : reference.html;\n return [\n `Use this existing design as reference/context — keep its design system, visual language, and structure, but produce a NEW, separate page (do not just return the reference).`,\n `Reference design: “${reference.title}”${reference.systemId ? ` (design system: ${reference.systemId})` : ''}.`,\n '```html\\n' + html + '\\n```',\n `Now create: ${brief}`,\n ].join('\\n\\n');\n}\n\n/**\n * A site address as typed (\"github.com\", \"https://stripe.com/docs\") to the URL\n * the design-system reader takes, or '' when it is not one (kit `normalizeSiteUrl`).\n * Parsed by hand: RN's URL polyfill throws on most getters.\n */\nexport function normalizeSiteUrl(raw: string): string {\n const text = raw.trim();\n if (!text || /\\s/.test(text)) return '';\n const withScheme = /^https?:\\/\\//i.test(text) ? text : `https://${text}`;\n const m = /^(https?):\\/\\/([^/?#:]+)(:\\d+)?([/?#].*)?$/i.exec(withScheme);\n if (!m || !m[2].includes('.') || /^\\.|\\.$/.test(m[2])) return '';\n return `${m[1].toLowerCase()}://${m[2].toLowerCase()}${m[3] ?? ''}${m[4] ?? '/'}`;\n}\n\n/** A downloaded page's file name, the web's: `<template>-<system>.html`. */\nexport function designFileName(creation: { templateId: string; systemId: string }): string {\n const safe = (s: string) => s.replace(/[^A-Za-z0-9._-]+/g, '-').replace(/^-+|-+$/g, '');\n return `${safe(creation.templateId) || 'design'}-${safe(creation.systemId) || 'page'}.html`;\n}\n"],"names":[],"mappings":"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"}
|