@adminide-stack/yantra-mobile 12.0.121 → 12.0.123

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 (175) hide show
  1. package/lib/features/apps/appArt.js +1 -1
  2. package/lib/features/apps/appArt.js.map +1 -1
  3. package/lib/features/apps/mobileAppCatalog.js +15 -11
  4. package/lib/features/apps/mobileAppCatalog.js.map +1 -1
  5. package/lib/features/canvas/CanvasAgentChatPane.js +82 -20
  6. package/lib/features/canvas/CanvasAgentChatPane.js.map +1 -1
  7. package/lib/features/canvas/CanvasBoardsGrid.js +291 -100
  8. package/lib/features/canvas/CanvasBoardsGrid.js.map +1 -1
  9. package/lib/features/canvas/CanvasEditToolsPanel.js +105 -12
  10. package/lib/features/canvas/CanvasEditToolsPanel.js.map +1 -1
  11. package/lib/features/canvas/CanvasExperience.js +266 -68
  12. package/lib/features/canvas/CanvasExperience.js.map +1 -1
  13. package/lib/features/canvas/CanvasGeneratePanel.js +204 -66
  14. package/lib/features/canvas/CanvasGeneratePanel.js.map +1 -1
  15. package/lib/features/canvas/CanvasLibrarySheet.js +31 -13
  16. package/lib/features/canvas/CanvasLibrarySheet.js.map +1 -1
  17. package/lib/features/canvas/CanvasModelPicker.js +176 -0
  18. package/lib/features/canvas/CanvasModelPicker.js.map +1 -0
  19. package/lib/features/canvas/CanvasTasksPanel.js +325 -29
  20. package/lib/features/canvas/CanvasTasksPanel.js.map +1 -1
  21. package/lib/features/canvas/CanvasTemplatesPanel.js +5 -4
  22. package/lib/features/canvas/CanvasTemplatesPanel.js.map +1 -1
  23. package/lib/features/canvas/CanvasToolDock.js +137 -61
  24. package/lib/features/canvas/CanvasToolDock.js.map +1 -1
  25. package/lib/features/canvas/FrameExtractorExperience.js +33 -2
  26. package/lib/features/canvas/FrameExtractorExperience.js.map +1 -1
  27. package/lib/features/canvas/GeneratorReferenceSlots.js +197 -0
  28. package/lib/features/canvas/GeneratorReferenceSlots.js.map +1 -0
  29. package/lib/features/canvas/NativeCanvasViewer.js +89 -11
  30. package/lib/features/canvas/NativeCanvasViewer.js.map +1 -1
  31. package/lib/features/canvas/PromoContextFields.js +55 -2
  32. package/lib/features/canvas/PromoContextFields.js.map +1 -1
  33. package/lib/features/canvas/SetStudioExperience.js +323 -13
  34. package/lib/features/canvas/SetStudioExperience.js.map +1 -1
  35. package/lib/features/canvas/VideoEditExperience.js +1 -53
  36. package/lib/features/canvas/VideoEditExperience.js.map +1 -1
  37. package/lib/features/canvas/VideoEditorExperience.js +697 -506
  38. package/lib/features/canvas/VideoEditorExperience.js.map +1 -1
  39. package/lib/features/canvas/VideoGeneratorExperience.js +22 -5
  40. package/lib/features/canvas/VideoGeneratorExperience.js.map +1 -1
  41. package/lib/features/canvas/canvasAgentChat.js +125 -11
  42. package/lib/features/canvas/canvasAgentChat.js.map +1 -1
  43. package/lib/features/canvas/canvasCore.js +117 -12
  44. package/lib/features/canvas/canvasCore.js.map +1 -1
  45. package/lib/features/canvas/canvasEditOps.js +148 -111
  46. package/lib/features/canvas/canvasEditOps.js.map +1 -1
  47. package/lib/features/canvas/canvasTaskSync.js +235 -0
  48. package/lib/features/canvas/canvasTaskSync.js.map +1 -0
  49. package/lib/features/canvas/canvasTasks.js +98 -11
  50. package/lib/features/canvas/canvasTasks.js.map +1 -1
  51. package/lib/features/canvas/createTiles.js +247 -0
  52. package/lib/features/canvas/createTiles.js.map +1 -0
  53. package/lib/features/canvas/deepLinks.js +83 -0
  54. package/lib/features/canvas/deepLinks.js.map +1 -0
  55. package/lib/features/canvas/frameExtract.js +13 -1
  56. package/lib/features/canvas/frameExtract.js.map +1 -1
  57. package/lib/features/canvas/generationModels.js +36 -8
  58. package/lib/features/canvas/generationModels.js.map +1 -1
  59. package/lib/features/canvas/generatorCommands.js +106 -0
  60. package/lib/features/canvas/generatorCommands.js.map +1 -0
  61. package/lib/features/canvas/generatorReferences.js +82 -0
  62. package/lib/features/canvas/generatorReferences.js.map +1 -0
  63. package/lib/features/canvas/homeWork.js +74 -0
  64. package/lib/features/canvas/homeWork.js.map +1 -0
  65. package/lib/features/canvas/linksRpc.js +130 -0
  66. package/lib/features/canvas/linksRpc.js.map +1 -0
  67. package/lib/features/canvas/mediaRecheck.js +176 -0
  68. package/lib/features/canvas/mediaRecheck.js.map +1 -0
  69. package/lib/features/canvas/mediaUrls.js +258 -0
  70. package/lib/features/canvas/mediaUrls.js.map +1 -0
  71. package/lib/features/canvas/nativeViewerRegistry.js.map +1 -1
  72. package/lib/features/canvas/promoProjectImport.js +80 -13
  73. package/lib/features/canvas/promoProjectImport.js.map +1 -1
  74. package/lib/features/canvas/promoVideo.js +106 -15
  75. package/lib/features/canvas/promoVideo.js.map +1 -1
  76. package/lib/features/canvas/reframe.js +228 -0
  77. package/lib/features/canvas/reframe.js.map +1 -0
  78. package/lib/features/canvas/serverTasks.js +697 -0
  79. package/lib/features/canvas/serverTasks.js.map +1 -0
  80. package/lib/features/canvas/set/SetViewportWebView.js +207 -28
  81. package/lib/features/canvas/set/SetViewportWebView.js.map +1 -1
  82. package/lib/features/canvas/set/agent/prompt.js +66 -0
  83. package/lib/features/canvas/set/agent/prompt.js.map +1 -0
  84. package/lib/features/canvas/set/agent/setOps.js +203 -0
  85. package/lib/features/canvas/set/agent/setOps.js.map +1 -0
  86. package/lib/features/canvas/set/agent/setTurn.js +128 -0
  87. package/lib/features/canvas/set/agent/setTurn.js.map +1 -0
  88. package/lib/features/canvas/set/agent/snapshot.js +43 -0
  89. package/lib/features/canvas/set/agent/snapshot.js.map +1 -0
  90. package/lib/features/canvas/set/agent/tools.js +580 -0
  91. package/lib/features/canvas/set/agent/tools.js.map +1 -0
  92. package/lib/features/canvas/set/setProject.js +43 -4
  93. package/lib/features/canvas/set/setProject.js.map +1 -1
  94. package/lib/features/canvas/set/supplyLibrary.js +397 -0
  95. package/lib/features/canvas/set/supplyLibrary.js.map +1 -0
  96. package/lib/features/canvas/storageLibrary.js +113 -52
  97. package/lib/features/canvas/storageLibrary.js.map +1 -1
  98. package/lib/features/canvas/studioCatalog.js +15 -2
  99. package/lib/features/canvas/studioCatalog.js.map +1 -1
  100. package/lib/features/canvas/studioLooks.js +1 -8
  101. package/lib/features/canvas/studioLooks.js.map +1 -1
  102. package/lib/features/canvas/useBoardMediaRefresh.js +66 -0
  103. package/lib/features/canvas/useBoardMediaRefresh.js.map +1 -0
  104. package/lib/features/canvas/useMediaSource.js +84 -0
  105. package/lib/features/canvas/useMediaSource.js.map +1 -0
  106. package/lib/features/canvas/video3d.js +11 -10
  107. package/lib/features/canvas/video3d.js.map +1 -1
  108. package/lib/features/canvas/videoEditor/BlurBoxOverlay.js +46 -0
  109. package/lib/features/canvas/videoEditor/BlurBoxOverlay.js.map +1 -0
  110. package/lib/features/canvas/videoEditor/ExportTaskCard.js +134 -0
  111. package/lib/features/canvas/videoEditor/ExportTaskCard.js.map +1 -0
  112. package/lib/features/canvas/videoEditor/agent/AgentCutPane.js +45 -7
  113. package/lib/features/canvas/videoEditor/agent/AgentCutPane.js.map +1 -1
  114. package/lib/features/canvas/videoEditor/agent/agentLoop.js +4 -2
  115. package/lib/features/canvas/videoEditor/agent/agentLoop.js.map +1 -1
  116. package/lib/features/canvas/videoEditor/agent/attachments.js +304 -0
  117. package/lib/features/canvas/videoEditor/agent/attachments.js.map +1 -0
  118. package/lib/features/canvas/videoEditor/agent/brainClient.js +3 -2
  119. package/lib/features/canvas/videoEditor/agent/brainClient.js.map +1 -1
  120. package/lib/features/canvas/videoEditor/agent/cutTools.js +207 -7
  121. package/lib/features/canvas/videoEditor/agent/cutTools.js.map +1 -1
  122. package/lib/features/canvas/videoEditor/blurBox.js +34 -0
  123. package/lib/features/canvas/videoEditor/blurBox.js.map +1 -0
  124. package/lib/features/canvas/videoEditor/compileTimeline.js +668 -0
  125. package/lib/features/canvas/videoEditor/compileTimeline.js.map +1 -0
  126. package/lib/features/canvas/videoEditor/editorModel.js +56 -22
  127. package/lib/features/canvas/videoEditor/editorModel.js.map +1 -1
  128. package/lib/features/canvas/videoEditor/exportPipeline.js +77 -0
  129. package/lib/features/canvas/videoEditor/exportPipeline.js.map +1 -0
  130. package/lib/features/canvas/videoEditor/exportRenderer.js +19 -12
  131. package/lib/features/canvas/videoEditor/exportRenderer.js.map +1 -1
  132. package/lib/features/canvas/videoEditor/exportTask.js +216 -0
  133. package/lib/features/canvas/videoEditor/exportTask.js.map +1 -0
  134. package/lib/features/canvas/videoEditor/formWidgets.js +142 -0
  135. package/lib/features/canvas/videoEditor/formWidgets.js.map +1 -0
  136. package/lib/features/canvas/videoEditor/produce/ProduceVideoSheet.js +195 -0
  137. package/lib/features/canvas/videoEditor/produce/ProduceVideoSheet.js.map +1 -0
  138. package/lib/features/canvas/videoEditor/produce/produceScenes.js +158 -0
  139. package/lib/features/canvas/videoEditor/produce/produceScenes.js.map +1 -0
  140. package/lib/features/canvas/videoEditor/remoteMediaClient.js +17 -5
  141. package/lib/features/canvas/videoEditor/remoteMediaClient.js.map +1 -1
  142. package/lib/features/canvas/videoEditor/renderTimeline.js +207 -0
  143. package/lib/features/canvas/videoEditor/renderTimeline.js.map +1 -0
  144. package/lib/features/canvas/videoEditor/renewLinks.js +64 -0
  145. package/lib/features/canvas/videoEditor/renewLinks.js.map +1 -0
  146. package/lib/features/canvas/videoEditor/sceneLayers.js +101 -0
  147. package/lib/features/canvas/videoEditor/sceneLayers.js.map +1 -0
  148. package/lib/features/canvas/videoEditor/tools/ToolsDrawer.js +283 -0
  149. package/lib/features/canvas/videoEditor/tools/ToolsDrawer.js.map +1 -0
  150. package/lib/features/canvas/videoEditor/tools/catalog.js +576 -0
  151. package/lib/features/canvas/videoEditor/tools/catalog.js.map +1 -0
  152. package/lib/features/canvas/videoEditor/videoProjectsStore.js +27 -3
  153. package/lib/features/canvas/videoEditor/videoProjectsStore.js.map +1 -1
  154. package/lib/features/webbuilder/WebBuilderExperience.js +29 -1
  155. package/lib/features/webbuilder/WebBuilderExperience.js.map +1 -1
  156. package/lib/features/webbuilder/buildFragments.js +8 -4
  157. package/lib/features/webbuilder/buildFragments.js.map +1 -1
  158. package/lib/features/webbuilder/codezenHandoff.js +108 -0
  159. package/lib/features/webbuilder/codezenHandoff.js.map +1 -0
  160. package/lib/features/webbuilder/workflow.js.map +1 -1
  161. package/lib/hooks/useChatApi.js +1 -2
  162. package/lib/hooks/useChatApi.js.map +1 -1
  163. package/lib/screens/CanvasBoard/index.js +12 -1
  164. package/lib/screens/CanvasBoard/index.js.map +1 -1
  165. package/lib/screens/Home/HomeScreen.js.map +1 -1
  166. package/lib/screens/Home/components/HomeSuggestions.js +3 -3
  167. package/lib/screens/Home/components/HomeSuggestions.js.map +1 -1
  168. package/lib/screens/WebBuilder/index.js +4 -2
  169. package/lib/screens/WebBuilder/index.js.map +1 -1
  170. package/lib/screens/WebBuilderNative/index.js +29 -2
  171. package/lib/screens/WebBuilderNative/index.js.map +1 -1
  172. package/lib/screens/WebBuilderNative/useWebBuilderHost.js +30 -6
  173. package/lib/screens/WebBuilderNative/useWebBuilderHost.js.map +1 -1
  174. package/package.json +3 -3
  175. /package/lib/assets/apps/{paper2poster.webp → poster.webp} +0 -0
@@ -1,3 +1,22 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defProps = Object.defineProperties;
3
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
7
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
8
+ var __spreadValues = (a, b) => {
9
+ for (var prop in b || (b = {}))
10
+ if (__hasOwnProp.call(b, prop))
11
+ __defNormalProp(a, prop, b[prop]);
12
+ if (__getOwnPropSymbols)
13
+ for (var prop of __getOwnPropSymbols(b)) {
14
+ if (__propIsEnum.call(b, prop))
15
+ __defNormalProp(a, prop, b[prop]);
16
+ }
17
+ return a;
18
+ };
19
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
1
20
  var _a;
2
21
  let AsyncStorage = null;
3
22
  try {
@@ -69,13 +88,18 @@ function snapshotProject(id, title, timeline, logoSrc) {
69
88
  return {
70
89
  id,
71
90
  title: title.trim() || "Untitled project",
72
- timeline: {
91
+ timeline: __spreadProps(__spreadValues(__spreadValues({
73
92
  clips: [...timeline.clips],
74
93
  texts: [...timeline.texts],
75
- segments: timeline.segments ? [...timeline.segments] : [],
94
+ segments: timeline.segments ? [...timeline.segments] : []
95
+ }, timeline.sceneAudio ? {
96
+ sceneAudio: [...timeline.sceneAudio]
97
+ } : {}), timeline.aspect ? {
98
+ aspect: timeline.aspect
99
+ } : {}), {
76
100
  voiceover: (_a2 = timeline.voiceover) != null ? _a2 : null,
77
101
  soundtrack: (_b = timeline.soundtrack) != null ? _b : null
78
- },
102
+ }),
79
103
  logoSrc,
80
104
  updatedAt: Date.now()
81
105
  };
@@ -1 +1 @@
1
- {"version":3,"file":"videoProjectsStore.js","sources":["../../../../src/features/canvas/videoEditor/videoProjectsStore.ts"],"sourcesContent":["/**\n * Saved video-editor timelines — native twin of canvas-surface ProjectsPanel.\n * Disk is best-effort (same guarded AsyncStorage as canvas board snapshots).\n */\nimport { emptyTimeline, type EditorTimeline } from './editorModel';\n\ntype StorageLike = { getItem(key: string): Promise<string | null>; setItem(key: string, value: string): Promise<void> };\nlet AsyncStorage: StorageLike | null = null;\ntry {\n // eslint-disable-next-line @typescript-eslint/no-require-imports, global-require\n AsyncStorage = require('@react-native-async-storage/async-storage').default ?? null;\n} catch {\n AsyncStorage = null;\n}\n\nconst STORAGE_KEY = 'yantra.canvas-video-projects.v1';\n\nexport type SavedVideoProject = {\n id: string;\n title: string;\n timeline: EditorTimeline;\n logoSrc: string | null;\n updatedAt: number;\n};\n\nlet memory: SavedVideoProject[] = [];\nlet lastWritten = '';\n\nexport function newVideoProjectId(): string {\n return `vp-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\nexport function projectHasWork(timeline: EditorTimeline): boolean {\n return timeline.clips.length > 0 || timeline.texts.length > 0 || Boolean(timeline.soundtrack || timeline.voiceover);\n}\n\nexport function relativeProjectTime(ts: number): string {\n const mins = Math.round((Date.now() - ts) / 60000);\n if (mins < 1) return 'just now';\n if (mins < 60) return `${mins}m ago`;\n if (mins < 24 * 60) return `${Math.round(mins / 60)}h ago`;\n if (mins < 7 * 24 * 60) return `${Math.round(mins / (60 * 24))}d ago`;\n return new Date(ts).toLocaleDateString();\n}\n\nfunction isProject(value: unknown): value is SavedVideoProject {\n if (!value || typeof value !== 'object') return false;\n const row = value as SavedVideoProject;\n return (\n typeof row.id === 'string' && row.id.length > 0 && Boolean(row.timeline) && Array.isArray(row.timeline.clips)\n );\n}\n\nexport function parseVideoProjects(raw: string | null | undefined): SavedVideoProject[] {\n if (!raw) return [];\n try {\n const parsed = JSON.parse(raw) as { projects?: unknown };\n const list = Array.isArray(parsed.projects) ? parsed.projects : Array.isArray(parsed) ? parsed : [];\n return list.filter(isProject);\n } catch {\n return [];\n }\n}\n\nexport async function loadVideoProjects(): Promise<SavedVideoProject[]> {\n if (memory.length) return memory;\n if (!AsyncStorage) return memory;\n try {\n const raw = await AsyncStorage.getItem(STORAGE_KEY);\n if (memory.length) return memory;\n memory = parseVideoProjects(raw);\n lastWritten = raw ?? lastWritten;\n return memory;\n } catch {\n return memory;\n }\n}\n\nexport function persistVideoProjects(rows: SavedVideoProject[]): void {\n memory = rows;\n const raw = JSON.stringify({ projects: rows });\n if (raw === lastWritten) return;\n lastWritten = raw;\n void AsyncStorage?.setItem(STORAGE_KEY, raw).catch(() => {\n /* disk write is best-effort */\n });\n}\n\nexport function upsertVideoProject(rows: SavedVideoProject[], next: SavedVideoProject): SavedVideoProject[] {\n const without = rows.filter((row) => row.id !== next.id);\n return [next, ...without].sort((a, b) => b.updatedAt - a.updatedAt);\n}\n\nexport function snapshotProject(\n id: string,\n title: string,\n timeline: EditorTimeline,\n logoSrc: string | null,\n): SavedVideoProject {\n return {\n id,\n title: title.trim() || 'Untitled project',\n timeline: {\n clips: [...timeline.clips],\n texts: [...timeline.texts],\n segments: timeline.segments ? [...timeline.segments] : [],\n voiceover: timeline.voiceover ?? null,\n soundtrack: timeline.soundtrack ?? null,\n },\n logoSrc,\n updatedAt: Date.now(),\n };\n}\n\nexport { emptyTimeline };\n"],"names":["_a"],"mappings":"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"}
1
+ {"version":3,"file":"videoProjectsStore.js","sources":["../../../../src/features/canvas/videoEditor/videoProjectsStore.ts"],"sourcesContent":["/**\n * Saved video-editor timelines — native twin of canvas-surface ProjectsPanel.\n * Disk is best-effort (same guarded AsyncStorage as canvas board snapshots).\n */\nimport { emptyTimeline, type EditorTimeline } from './editorModel';\n\ntype StorageLike = { getItem(key: string): Promise<string | null>; setItem(key: string, value: string): Promise<void> };\nlet AsyncStorage: StorageLike | null = null;\ntry {\n // eslint-disable-next-line @typescript-eslint/no-require-imports, global-require\n AsyncStorage = require('@react-native-async-storage/async-storage').default ?? null;\n} catch {\n AsyncStorage = null;\n}\n\nconst STORAGE_KEY = 'yantra.canvas-video-projects.v1';\n\nexport type SavedVideoProject = {\n id: string;\n title: string;\n timeline: EditorTimeline;\n logoSrc: string | null;\n updatedAt: number;\n};\n\nlet memory: SavedVideoProject[] = [];\nlet lastWritten = '';\n\nexport function newVideoProjectId(): string {\n return `vp-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\nexport function projectHasWork(timeline: EditorTimeline): boolean {\n return timeline.clips.length > 0 || timeline.texts.length > 0 || Boolean(timeline.soundtrack || timeline.voiceover);\n}\n\nexport function relativeProjectTime(ts: number): string {\n const mins = Math.round((Date.now() - ts) / 60000);\n if (mins < 1) return 'just now';\n if (mins < 60) return `${mins}m ago`;\n if (mins < 24 * 60) return `${Math.round(mins / 60)}h ago`;\n if (mins < 7 * 24 * 60) return `${Math.round(mins / (60 * 24))}d ago`;\n return new Date(ts).toLocaleDateString();\n}\n\nfunction isProject(value: unknown): value is SavedVideoProject {\n if (!value || typeof value !== 'object') return false;\n const row = value as SavedVideoProject;\n return (\n typeof row.id === 'string' && row.id.length > 0 && Boolean(row.timeline) && Array.isArray(row.timeline.clips)\n );\n}\n\nexport function parseVideoProjects(raw: string | null | undefined): SavedVideoProject[] {\n if (!raw) return [];\n try {\n const parsed = JSON.parse(raw) as { projects?: unknown };\n const list = Array.isArray(parsed.projects) ? parsed.projects : Array.isArray(parsed) ? parsed : [];\n return list.filter(isProject);\n } catch {\n return [];\n }\n}\n\nexport async function loadVideoProjects(): Promise<SavedVideoProject[]> {\n if (memory.length) return memory;\n if (!AsyncStorage) return memory;\n try {\n const raw = await AsyncStorage.getItem(STORAGE_KEY);\n if (memory.length) return memory;\n memory = parseVideoProjects(raw);\n lastWritten = raw ?? lastWritten;\n return memory;\n } catch {\n return memory;\n }\n}\n\nexport function persistVideoProjects(rows: SavedVideoProject[]): void {\n memory = rows;\n const raw = JSON.stringify({ projects: rows });\n if (raw === lastWritten) return;\n lastWritten = raw;\n void AsyncStorage?.setItem(STORAGE_KEY, raw).catch(() => {\n /* disk write is best-effort */\n });\n}\n\nexport function upsertVideoProject(rows: SavedVideoProject[], next: SavedVideoProject): SavedVideoProject[] {\n const without = rows.filter((row) => row.id !== next.id);\n return [next, ...without].sort((a, b) => b.updatedAt - a.updatedAt);\n}\n\nexport function snapshotProject(\n id: string,\n title: string,\n timeline: EditorTimeline,\n logoSrc: string | null,\n): SavedVideoProject {\n return {\n id,\n title: title.trim() || 'Untitled project',\n timeline: {\n clips: [...timeline.clips],\n texts: [...timeline.texts],\n segments: timeline.segments ? [...timeline.segments] : [],\n ...(timeline.sceneAudio ? { sceneAudio: [...timeline.sceneAudio] } : {}),\n ...(timeline.aspect ? { aspect: timeline.aspect } : {}),\n voiceover: timeline.voiceover ?? null,\n soundtrack: timeline.soundtrack ?? null,\n },\n logoSrc,\n updatedAt: Date.now(),\n };\n}\n\nexport { emptyTimeline };\n"],"names":["_a"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA,IAAA,EAAA;AASA,IAAI,YAAmC,GAAA,IAAA;AACvC,IAAI;AAEF,EAAA,YAAA,GAAA,CAAe,EAAQ,GAAA,OAAA,CAAA,2CAA2C,CAAE,CAAA,OAAA,KAArD,IAAgE,GAAA,EAAA,GAAA,IAAA;AACjF,CAAQ,CAAA,OAAA,CAAA,EAAA;AACN,EAAe,YAAA,GAAA,IAAA;AACjB;AACA,MAAM,WAAc,GAAA,iCAAA;AAQpB,IAAI,SAA8B,EAAC;AACnC,IAAI,WAAc,GAAA,EAAA;AACX,SAAS,iBAA4B,GAAA;AAC1C,EAAA,OAAO,MAAM,IAAK,CAAA,GAAA,EAAM,CAAA,QAAA,CAAS,EAAE,CAAC,CAAA,CAAA,EAAI,IAAK,CAAA,MAAA,GAAS,QAAS,CAAA,EAAE,EAAE,KAAM,CAAA,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAChF;AACO,SAAS,eAAe,QAAmC,EAAA;AAChE,EAAA,OAAO,QAAS,CAAA,KAAA,CAAM,MAAS,GAAA,CAAA,IAAK,QAAS,CAAA,KAAA,CAAM,MAAS,GAAA,CAAA,IAAK,OAAQ,CAAA,QAAA,CAAS,UAAc,IAAA,QAAA,CAAS,SAAS,CAAA;AACpH;AACO,SAAS,oBAAoB,EAAoB,EAAA;AACtD,EAAA,MAAM,OAAO,IAAK,CAAA,KAAA,CAAA,CAAO,KAAK,GAAI,EAAA,GAAI,MAAM,GAAK,CAAA;AACjD,EAAI,IAAA,IAAA,GAAO,GAAU,OAAA,UAAA;AACrB,EAAA,IAAI,IAAO,GAAA,EAAA,EAAW,OAAA,CAAA,EAAG,IAAI,CAAA,KAAA,CAAA;AAC7B,EAAI,IAAA,IAAA,GAAO,KAAK,EAAI,EAAA,OAAO,GAAG,IAAK,CAAA,KAAA,CAAM,IAAO,GAAA,EAAE,CAAC,CAAA,KAAA,CAAA;AACnD,EAAI,IAAA,IAAA,GAAO,CAAI,GAAA,EAAA,GAAK,EAAI,EAAA,OAAO,CAAG,EAAA,IAAA,CAAK,KAAM,CAAA,IAAA,IAAQ,EAAK,GAAA,EAAA,CAAG,CAAC,CAAA,KAAA,CAAA;AAC9D,EAAA,OAAO,IAAI,IAAA,CAAK,EAAE,CAAA,CAAE,kBAAmB,EAAA;AACzC;AACA,SAAS,UAAU,KAA4C,EAAA;AAC7D,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,UAAiB,OAAA,KAAA;AAChD,EAAA,MAAM,GAAM,GAAA,KAAA;AACZ,EAAA,OAAO,OAAO,GAAI,CAAA,EAAA,KAAO,QAAY,IAAA,GAAA,CAAI,GAAG,MAAS,GAAA,CAAA,IAAK,OAAQ,CAAA,GAAA,CAAI,QAAQ,CAAK,IAAA,KAAA,CAAM,OAAQ,CAAA,GAAA,CAAI,SAAS,KAAK,CAAA;AACrH;AACO,SAAS,mBAAmB,GAAqD,EAAA;AACtF,EAAI,IAAA,CAAC,GAAK,EAAA,OAAO,EAAC;AAClB,EAAI,IAAA;AACF,IAAM,MAAA,MAAA,GAAS,IAAK,CAAA,KAAA,CAAM,GAAG,CAAA;AAG7B,IAAA,MAAM,IAAO,GAAA,KAAA,CAAM,OAAQ,CAAA,MAAA,CAAO,QAAQ,CAAA,GAAI,MAAO,CAAA,QAAA,GAAW,KAAM,CAAA,OAAA,CAAQ,MAAM,CAAA,GAAI,SAAS,EAAC;AAClG,IAAO,OAAA,IAAA,CAAK,OAAO,SAAS,CAAA;AAAA,GACtB,CAAA,OAAA,CAAA,EAAA;AACN,IAAA,OAAO,EAAC;AAAA;AAEZ;AACA,eAAsB,iBAAkD,GAAA;AACtE,EAAI,IAAA,MAAA,CAAO,QAAe,OAAA,MAAA;AAC1B,EAAI,IAAA,CAAC,cAAqB,OAAA,MAAA;AAC1B,EAAI,IAAA;AACF,IAAA,MAAM,GAAM,GAAA,MAAM,YAAa,CAAA,OAAA,CAAQ,WAAW,CAAA;AAClD,IAAI,IAAA,MAAA,CAAO,QAAe,OAAA,MAAA;AAC1B,IAAA,MAAA,GAAS,mBAAmB,GAAG,CAAA;AAC/B,IAAA,WAAA,GAAc,GAAO,IAAA,IAAA,GAAA,GAAA,GAAA,WAAA;AACrB,IAAO,OAAA,MAAA;AAAA,GACD,CAAA,OAAA,CAAA,EAAA;AACN,IAAO,OAAA,MAAA;AAAA;AAEX;AACO,SAAS,qBAAqB,IAAiC,EAAA;AACpE,EAAS,MAAA,GAAA,IAAA;AACT,EAAM,MAAA,GAAA,GAAM,KAAK,SAAU,CAAA;AAAA,IACzB,QAAU,EAAA;AAAA,GACX,CAAA;AACD,EAAA,IAAI,QAAQ,WAAa,EAAA;AACzB,EAAc,WAAA,GAAA,GAAA;AACd,EAAA,MAAK,YAAc,IAAA,IAAA,GAAA,MAAA,GAAA,YAAA,CAAA,OAAA,CAAQ,WAAa,EAAA,GAAA,CAAA,CAAK,MAAM,MAAM;AAAA,GAEzD,CAAA,CAAA;AACF;AACgB,SAAA,kBAAA,CAAmB,MAA2B,IAA8C,EAAA;AAC1G,EAAA,MAAM,UAAU,IAAK,CAAA,MAAA,CAAO,SAAO,GAAI,CAAA,EAAA,KAAO,KAAK,EAAE,CAAA;AACrD,EAAA,OAAO,CAAC,IAAA,EAAM,GAAG,OAAO,CAAE,CAAA,IAAA,CAAK,CAAC,CAAA,EAAG,CAAM,KAAA,CAAA,CAAE,SAAY,GAAA,CAAA,CAAE,SAAS,CAAA;AACpE;AACO,SAAS,eAAgB,CAAA,EAAA,EAAY,KAAe,EAAA,QAAA,EAA0B,OAA2C,EAAA;AArFhI,EAAA,IAAAA,GAAA,EAAA,EAAA;AAsFE,EAAO,OAAA;AAAA,IACL,EAAA;AAAA,IACA,KAAA,EAAO,KAAM,CAAA,IAAA,EAAU,IAAA,kBAAA;AAAA,IACvB,QAAU,EAAA,aAAA,CAAA,cAAA,CAAA,cAAA,CAAA;AAAA,MACR,KAAO,EAAA,CAAC,GAAG,QAAA,CAAS,KAAK,CAAA;AAAA,MACzB,KAAO,EAAA,CAAC,GAAG,QAAA,CAAS,KAAK,CAAA;AAAA,MACzB,QAAA,EAAU,SAAS,QAAW,GAAA,CAAC,GAAG,QAAS,CAAA,QAAQ,IAAI;AAAC,KAAA,EACpD,SAAS,UAAa,GAAA;AAAA,MACxB,UAAY,EAAA,CAAC,GAAG,QAAA,CAAS,UAAU;AAAA,KACjC,GAAA,EACA,CAAA,EAAA,QAAA,CAAS,MAAS,GAAA;AAAA,MACpB,QAAQ,QAAS,CAAA;AAAA,KACnB,GAAI,EATI,CAAA,EAAA;AAAA,MAUR,SAAWA,EAAAA,CAAAA,GAAAA,GAAA,QAAS,CAAA,SAAA,KAAT,OAAAA,GAAsB,GAAA,IAAA;AAAA,MACjC,UAAA,EAAA,CAAY,EAAS,GAAA,QAAA,CAAA,UAAA,KAAT,IAAuB,GAAA,EAAA,GAAA;AAAA,KACrC,CAAA;AAAA,IACA,OAAA;AAAA,IACA,SAAA,EAAW,KAAK,GAAI;AAAA,GACtB;AACF"}
@@ -1,4 +1,4 @@
1
- import {jsxs,jsx,Fragment}from'react/jsx-runtime';import {useMemo,useState,useCallback,useRef,useEffect}from'react';import {StyleSheet,Keyboard,BackHandler,View,Text,Share,Platform,ActionSheetIOS,Alert,Linking}from'react-native';import {MaterialCommunityIcons}from'@expo/vector-icons';import {GestureHandlerRootView}from'react-native-gesture-handler';import {useSafeInsets}from'../canvas/withRemoteSafeArea.js';import {useAppTheme}from'../../theme/AppThemeProvider.js';import {Tap,DIM}from'../inbox/components/Tap.js';import {isBareSeed,studioTurnText,brandBriefBlock,siteScoreTurn}from'./studioCatalog.js';import {titleFromPrompt}from'./buildFragments.js';import {useBrandKit}from'./brandKitStorage.js';import {parseToolActivity}from'../chat/toolActivity.js';import {wakePreviewPrompt}from'./webbuilderPrompts.js';import {webbuilderTheme}from'./webbuilderTheme.js';import {BrandKitSheet}from'./components/BrandKitSheet.js';import {CodeView}from'./components/CodeView.js';import {ProjectChat}from'./components/ProjectChat.js';import {PreviewScreen}from'./components/PreviewScreen.js';import {PublishSheet}from'./components/PublishSheet.js';import {BOTTOM_TABS_SPACE,BottomTabs}from'./components/BottomTabs.js';import {SiteScoreSheet}from'./components/SiteScoreSheet.js';import {ProjectsScreen}from'./components/ProjectsScreen.js';import {TemplatesSheet}from'./components/TemplatesSheet.js';import {StudioHome}from'./components/StudioHome.js';import {VersionsSheet}from'./components/VersionsSheet.js';import {IconButton,Toast}from'./components/ui.js';var __defProp = Object.defineProperty;
1
+ import {jsxs,jsx,Fragment}from'react/jsx-runtime';import {useMemo,useState,useCallback,useRef,useEffect}from'react';import {StyleSheet,Keyboard,BackHandler,View,Text,Share,Platform,ActionSheetIOS,Alert,Linking}from'react-native';import {MaterialCommunityIcons}from'@expo/vector-icons';import {GestureHandlerRootView}from'react-native-gesture-handler';import {useSafeInsets}from'../canvas/withRemoteSafeArea.js';import {useAppTheme}from'../../theme/AppThemeProvider.js';import {Tap,DIM}from'../inbox/components/Tap.js';import {isBareSeed,studioTurnText,brandBriefBlock,siteScoreTurn}from'./studioCatalog.js';import {titleFromPrompt}from'./buildFragments.js';import {useBrandKit}from'./brandKitStorage.js';import {parseToolActivity}from'../chat/toolActivity.js';import {wakePreviewPrompt}from'./webbuilderPrompts.js';import {webbuilderTheme}from'./webbuilderTheme.js';import {BrandKitSheet}from'./components/BrandKitSheet.js';import {CodeView}from'./components/CodeView.js';import {ProjectChat}from'./components/ProjectChat.js';import {PreviewScreen}from'./components/PreviewScreen.js';import {PublishSheet}from'./components/PublishSheet.js';import {BOTTOM_TABS_SPACE,BottomTabs}from'./components/BottomTabs.js';import {SiteScoreSheet}from'./components/SiteScoreSheet.js';import {ProjectsScreen}from'./components/ProjectsScreen.js';import {TemplatesSheet}from'./components/TemplatesSheet.js';import {StudioHome}from'./components/StudioHome.js';import {VersionsSheet}from'./components/VersionsSheet.js';import {IconButton,Toast}from'./components/ui.js';import {demoVideoSource,webbuilderDemoHandoff,encodeCodezenHandoff}from'./codezenHandoff.js';var __defProp = Object.defineProperty;
2
2
  var __getOwnPropSymbols = Object.getOwnPropertySymbols;
3
3
  var __hasOwnProp = Object.prototype.hasOwnProperty;
4
4
  var __propIsEnum = Object.prototype.propertyIsEnumerable;
@@ -42,6 +42,7 @@ function WebBuilderExperience({
42
42
  hostChat,
43
43
  onPublish,
44
44
  onResumePreview,
45
+ onOpenCodezen,
45
46
  initialAgentSeed = null
46
47
  }) {
47
48
  var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j;
@@ -269,6 +270,33 @@ function WebBuilderExperience({
269
270
  run: () => Linking.openURL(url).catch(() => void 0)
270
271
  });
271
272
  }
273
+ const demo = build && !building ? demoVideoSource(live, build.previewUrl) : null;
274
+ if (demo && onOpenCodezen) {
275
+ actions.push({
276
+ label: "Demo video",
277
+ run: () => {
278
+ const film = () => {
279
+ try {
280
+ const handoff = webbuilderDemoHandoff(siteTitle || (build == null ? void 0 : build.title) || "", demo);
281
+ onOpenCodezen(encodeCodezenHandoff(handoff), handoff);
282
+ } catch (err) {
283
+ showToast(err instanceof Error ? err.message : "Couldn't open Codezen.");
284
+ }
285
+ };
286
+ if (demo.stable) {
287
+ film();
288
+ return;
289
+ }
290
+ Alert.alert("Publish first for a link that stays up", "Codezen will film the live preview, which sleeps about an hour after the last change.", [{
291
+ text: "Cancel",
292
+ style: "cancel"
293
+ }, {
294
+ text: "Film the preview",
295
+ onPress: film
296
+ }]);
297
+ }
298
+ });
299
+ }
272
300
  if (!actions.length) return;
273
301
  if (Platform.OS === "ios") {
274
302
  ActionSheetIOS.showActionSheetWithOptions({
@@ -1 +1 @@
1
- {"version":3,"file":"WebBuilderExperience.js","sources":["../../../src/features/webbuilder/WebBuilderExperience.tsx"],"sourcesContent":["/**\n * Native Web Builder: describe a site (or start from a template) and the build\n * workflow makes it; watch the live preview, ask for changes, step through\n * versions and publish - on the same builds as the web Web Builder, so a site\n * started on the phone opens on the web and the other way round.\n *\n * Native twin of the web surface (aicode-stack `surfaces/webbuilder`): the\n * studio home and its composer, Templates (the web sidebar, a sheet here),\n * Projects (the web's Your builds, a bottom tab), the open build with Preview / Code /\n * History and Publish, and the Agent pane. The host screen owns what needs\n * the app's data stack (the session, the build workflow, the chats, publish,\n * navigation) and passes it in as props; this component renders.\n */\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n ActionSheetIOS,\n Alert,\n BackHandler,\n Keyboard,\n Linking,\n Platform,\n Share,\n StyleSheet,\n Text,\n View,\n} from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { GestureHandlerRootView } from 'react-native-gesture-handler';\nimport { useSafeInsets } from '../canvas/withRemoteSafeArea';\nimport { useAppTheme } from '../../theme/AppThemeProvider';\nimport type { MessageAttachment } from '../../hooks/useChatStream';\nimport { DIM, Tap } from '../inbox/components/Tap';\nimport { brandBriefBlock, isBareSeed, siteScoreTurn, studioTurnText } from './studioCatalog';\nimport { titleFromPrompt } from './buildFragments';\nimport { useBrandKit } from './brandKitStorage';\nimport { parseToolActivity } from '../chat/toolActivity';\nimport { wakePreviewPrompt } from './webbuilderPrompts';\nimport { webbuilderTheme } from './webbuilderTheme';\nimport type { WebBuilderHostChat } from './hostChat';\nimport type {\n WebBuilderBuild,\n WebBuilderBuilding,\n WebBuilderProject,\n WebBuilderPublishResult,\n WebBuilderStartRequest,\n} from './types';\nimport type { WebBuilderTemplate } from './workflow';\nimport { BrandKitSheet } from './components/BrandKitSheet';\nimport { CodeView } from './components/CodeView';\nimport { ProjectChat } from './components/ProjectChat';\nimport { PreviewScreen } from './components/PreviewScreen';\nimport { PublishSheet } from './components/PublishSheet';\nimport { BOTTOM_TABS_SPACE, BottomTabs, type HomeTab } from './components/BottomTabs';\nimport { SiteScoreSheet } from './components/SiteScoreSheet';\nimport { ProjectsScreen } from './components/ProjectsScreen';\nimport { TemplatesSheet } from './components/TemplatesSheet';\nimport { StudioHome, type StudioStart } from './components/StudioHome';\nimport { VersionsSheet } from './components/VersionsSheet';\nimport { IconButton, Toast } from './components/ui';\n\nexport interface WebBuilderExperienceProps {\n /**\n * The app's light/dark choice, from the host. A lazily loaded experience can\n * end up with its own copy of the theme context and miss the in-app setting,\n * so the host's answer wins; the context is only the fallback.\n */\n isDark?: boolean;\n /** Leaves Web Builder. */\n onExit: () => void;\n /** Your builds, newest first. */\n projects: WebBuilderProject[];\n projectsLoading?: boolean;\n projectsError?: string | null;\n onRefreshProjects?: () => void;\n /** More builds exist past the ones loaded (the web gallery pages 10 at a time). */\n projectsHasMore?: boolean;\n onLoadMoreProjects?: () => void;\n /** The workspace's starter templates (marketplace Code Assistant cards). */\n templates: WebBuilderTemplate[];\n templatesLoading?: boolean;\n templatesError?: string | null;\n onReloadTemplates?: () => void;\n /** A connection still coming up: the composer waits (and says so), or null. */\n startBlocked?: string | null;\n /** Why the last Start did not go out, in one sentence, or null. */\n startNotice?: string | null;\n /** The site open on screen (its chat), or null on the home screen. */\n activeChannelId: string | null;\n onOpenProject: (channelId: string) => void;\n onCloseProject: () => void;\n /** Starts a new site; the host runs the build workflow and opens it. */\n onStartProject: (request: WebBuilderStartRequest) => void;\n /** The open site's builds, newest first. */\n builds: WebBuilderBuild[];\n buildsLoading?: boolean;\n /** A turn running on the open site. */\n building?: WebBuilderBuilding | null;\n /** The chat shows a publish still running on the open site. */\n publishing?: boolean;\n /** The open site's agent conversation. */\n hostChat?: WebBuilderHostChat;\n onPublish?: (build: WebBuilderBuild, projectName: string) => Promise<WebBuilderPublishResult>;\n /** Wake a sleeping preview without the agent; 'gone' when the sandbox was reclaimed. */\n onResumePreview?: (build: WebBuilderBuild) => Promise<'ok' | 'gone' | 'failed'>;\n /** A brain-routed hand-off: the person's words, which start a new site. */\n initialAgentSeed?: { text: string; files?: MessageAttachment[] } | null;\n}\n\nconst TOAST_MS = 2_400;\n/** A publish that never reported back stops reading as running after this long. */\nconst PUBLISH_WATCH_MS = 10 * 60 * 1000;\n\nexport function WebBuilderExperience({\n isDark: hostIsDark,\n onExit,\n projects,\n projectsLoading = false,\n projectsError = null,\n onRefreshProjects,\n projectsHasMore = false,\n onLoadMoreProjects,\n templates,\n templatesLoading = false,\n templatesError = null,\n onReloadTemplates,\n startBlocked = null,\n startNotice = null,\n activeChannelId,\n onOpenProject,\n onCloseProject,\n onStartProject,\n builds,\n buildsLoading = false,\n building = null,\n publishing: publishingOnChat = false,\n hostChat,\n onPublish,\n onResumePreview,\n initialAgentSeed = null,\n}: WebBuilderExperienceProps) {\n const appTheme = useAppTheme();\n const isDark = hostIsDark ?? appTheme.isDark;\n const theme = useMemo(() => webbuilderTheme(isDark), [isDark]);\n const insets = useSafeInsets();\n\n const project = useMemo(\n () => projects.find((p) => p.channelId === activeChannelId) ?? null,\n [projects, activeChannelId],\n );\n\n // ── Studio: the composer's draft, template and brand ──────────────────\n const [draft, setDraft] = useState('');\n const [template, setTemplate] = useState<WebBuilderTemplate | null>(null);\n const [templatesOpen, setTemplatesOpen] = useState(false);\n const [scoreOpen, setScoreOpen] = useState(false);\n const [homeTab, setHomeTab] = useState<HomeTab>('create');\n const { brand, saveBrand } = useBrandKit();\n const [brandOpen, setBrandOpen] = useState(false);\n\n const pickTemplate = useCallback((picked: WebBuilderTemplate) => {\n setTemplate(picked);\n setTemplatesOpen(false);\n setHomeTab('create');\n // The web hands a picked card to the composer: its starter prompt when the box is empty.\n setDraft((prev) => (isBareSeed(prev) && picked.chatPrompt ? picked.chatPrompt : prev));\n }, []);\n\n const startSite = useCallback(\n (start: StudioStart, files?: MessageAttachment[]) => {\n const brief =\n start.brief.trim() || (start.template ? start.template.chatPrompt || start.template.title : '');\n if (!brief && !files?.length) return;\n onStartProject({\n text: studioTurnText({ brief, brandBlock: brandBriefBlock(brand), referenceUrl: start.referenceUrl }),\n template: start.template,\n ...(start.referenceUrl ? { referenceUrl: start.referenceUrl } : {}),\n ...(files?.length ? { attachments: files } : {}),\n });\n setDraft('');\n setTemplate(null);\n },\n [onStartProject, brand],\n );\n\n // A hand-off starts its site as soon as a build can start.\n const handedOff = useRef(false);\n useEffect(() => {\n if (handedOff.current || !initialAgentSeed || startBlocked) return;\n handedOff.current = true;\n startSite({ brief: initialAgentSeed.text, template: null }, initialAgentSeed.files);\n }, [initialAgentSeed, startBlocked, startSite]);\n\n // ── The build on screen ────────────────────────────────────────────────\n const [selectedKey, setSelectedKey] = useState<string | null>(null);\n useEffect(() => setSelectedKey(null), [activeChannelId]);\n const latest = builds[0] ?? null;\n const build = useMemo(\n () => (selectedKey ? (builds.find((b) => b.key === selectedKey) ?? latest) : latest),\n [builds, selectedKey, latest],\n );\n // The site's resolved name (the web title rules) wins over a build's raw title;\n // until a build names it, the person's first ask does (\"Coffee Website\", not \"New app\").\n const firstAsk = hostChat?.messages.find((m) => m.role === 'user')?.content;\n const askTitle = useMemo(() => titleFromPrompt(firstAsk), [firstAsk]);\n const siteTitle = project?.title || build?.title || askTitle || null;\n\n // A new build of the same sandbox (an edit) re-fetches the preview.\n const [previewNonce, setPreviewNonce] = useState(0);\n const seenBuildAt = useRef<{ key: string | null; at: number }>({ key: null, at: 0 });\n useEffect(() => {\n const key = build?.key ?? null;\n const at = build?.updatedAt ?? 0;\n const seen = seenBuildAt.current;\n if (key && key === seen.key && at > seen.at) setPreviewNonce((n) => n + 1);\n seenBuildAt.current = { key, at };\n }, [build?.key, build?.updatedAt]);\n\n // ── Toast ──────────────────────────────────────────────────────────────\n const [toast, setToast] = useState<string | null>(null);\n const toastTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const showToast = useCallback((message: string) => {\n if (toastTimer.current) clearTimeout(toastTimer.current);\n setToast(message);\n toastTimer.current = setTimeout(() => setToast(null), TOAST_MS);\n }, []);\n useEffect(() => () => (toastTimer.current ? clearTimeout(toastTimer.current) : undefined), []);\n\n // ── The project's chat (Manus-style: the conversation leads, the site is a tap away) ──\n const [mode, setMode] = useState<'chat' | 'preview' | 'code'>('chat');\n useEffect(() => setMode('chat'), [activeChannelId]);\n const sendToAgent = useCallback(\n (text: string, files?: MessageAttachment[]) => {\n const words = text.trim();\n if (!words || !hostChat) return;\n // The first ask in a site with nothing built yet is the brief (web `studioTurnText`).\n const turn = build || /^build\\b/i.test(words) ? words : `Build me: ${words}`;\n hostChat.send(turn, files, build);\n setMode('chat');\n },\n [hostChat, build],\n );\n const openChat = useCallback(() => {\n Keyboard.dismiss();\n setMode('chat');\n }, []);\n // A preview that does not answer is brought back quietly, the way the web's\n // ensurePreview does it: resume, restart, or boot its restore point into a new\n // sandbox (host). Only a sandbox that is gone with no restore point needs the agent.\n const [waking, setWaking] = useState(false);\n const wokenFor = useRef<string | null>(null);\n useEffect(() => {\n wokenFor.current = null;\n }, [build?.key]);\n const wakePreview = useCallback(() => {\n if (!build || waking || wokenFor.current === build.key) return;\n wokenFor.current = build.key;\n setWaking(true);\n const resume = onResumePreview ? onResumePreview(build) : Promise.resolve<'failed'>('failed');\n resume\n .catch(() => 'failed' as const)\n .then((outcome) => {\n if (outcome === 'ok') setPreviewNonce((n) => n + 1);\n // Stay where the person is; the agent's restore shows in the chat.\n else if (hostChat && !hostChat.busy) hostChat.send(wakePreviewPrompt(build), undefined, build);\n })\n .finally(() => setWaking(false));\n }, [build, waking, onResumePreview, hostChat]);\n\n // ── Publish ────────────────────────────────────────────────────────────\n const [publishOpen, setPublishOpen] = useState(false);\n const [versionsOpen, setVersionsOpen] = useState(false);\n const [publishStarted, setPublishStarted] = useState<{ key: string; live: string | null; at: number } | null>(null);\n useEffect(() => setPublishStarted(null), [activeChannelId]);\n useEffect(() => {\n if (!publishStarted) return;\n const target = builds.find((b) => b.key === publishStarted.key);\n if (target?.liveUrl && target.liveUrl !== publishStarted.live) {\n setPublishStarted(null);\n showToast('Your site is live');\n }\n }, [builds, publishStarted, showToast]);\n const publishing = publishingOnChat || Boolean(publishStarted && Date.now() - publishStarted.at < PUBLISH_WATCH_MS);\n const publish = useCallback(\n async (target: WebBuilderBuild, projectName: string): Promise<WebBuilderPublishResult> => {\n if (!onPublish) return { ok: false, message: 'Publishing is not available here.' };\n const result = await onPublish(target, projectName);\n if (result.ok) {\n setPublishStarted({ key: target.key, live: target.liveUrl, at: Date.now() });\n showToast('Publishing started');\n }\n return result;\n },\n [onPublish, showToast],\n );\n\n // ── Back ───────────────────────────────────────────────────────────────\n const back = useCallback(() => {\n if (activeChannelId && mode !== 'chat') {\n setMode('chat');\n return;\n }\n if (activeChannelId) {\n onCloseProject();\n return;\n }\n if (homeTab === 'projects') {\n setHomeTab('create');\n return;\n }\n onExit();\n }, [mode, activeChannelId, homeTab, onCloseProject, onExit]);\n useEffect(() => {\n const sub = BackHandler.addEventListener('hardwareBackPress', () => {\n back();\n return true;\n });\n return () => sub.remove();\n }, [back]);\n\n const live = build?.liveUrl ?? project?.liveUrl ?? null;\n let statusText = 'New';\n let statusTone = theme.muted;\n if (building || hostChat?.busy) {\n statusText = 'Working…';\n statusTone = theme.accent;\n } else if (live) {\n statusText = 'Live';\n statusTone = theme.good;\n } else if (build) {\n statusText = 'Not published';\n }\n const floating = {\n backgroundColor: theme.card,\n borderColor: theme.border,\n shadowColor: theme.isDark ? '#000' : '#1c1917',\n };\n const liveSteps = hostChat?.busy && hostChat.streaming ? parseToolActivity(hostChat.streaming, true).steps : [];\n let publishLabel = 'Publish';\n if (publishing) publishLabel = 'Publishing…';\n const shareUrl = live || build?.previewUrl || null;\n const shareSite = () => {\n if (shareUrl) Share.share({ message: shareUrl, url: shareUrl }).catch(() => undefined);\n };\n const openMore = () => {\n const actions: Array<{ label: string; run: () => void; destructive?: boolean }> = [];\n if (mode !== 'chat') actions.push({ label: 'Back to the chat', run: () => setMode('chat') });\n if (build?.previewUrl && mode !== 'preview') {\n actions.push({ label: 'Open preview', run: () => setMode('preview') });\n }\n if (build?.files && mode !== 'code') actions.push({ label: 'View code', run: () => setMode('code') });\n if (builds.length > 1) actions.push({ label: 'Versions', run: () => setVersionsOpen(true) });\n if (build?.sandboxId) {\n actions.push({ label: live ? 'Publish an update' : 'Publish', run: () => setPublishOpen(true) });\n }\n if (build?.previewUrl) {\n const url = live || build.previewUrl;\n actions.push({ label: 'Open in browser', run: () => Linking.openURL(url).catch(() => undefined) });\n }\n if (!actions.length) return;\n if (Platform.OS === 'ios') {\n ActionSheetIOS.showActionSheetWithOptions(\n { options: [...actions.map((a) => a.label), 'Cancel'], cancelButtonIndex: actions.length },\n (index) => actions[index]?.run(),\n );\n return;\n }\n Alert.alert(siteTitle || 'Project', undefined, [\n ...actions.map((a) => ({ text: a.label, onPress: a.run })),\n { text: 'Cancel', style: 'cancel' as const },\n ]);\n };\n\n return (\n <GestureHandlerRootView style={[styles.fill, { backgroundColor: theme.screen }]}>\n {activeChannelId ? (\n <>\n {/* Manus-style: a floating back, the project in a pill, actions on the right. */}\n <View style={[styles.projectHead, { paddingTop: insets.top + 6 }]}>\n <Tap\n onPress={back}\n accessibilityRole=\"button\"\n accessibilityLabel={mode === 'chat' ? 'Back to Web Builder' : 'Back to the chat'}\n style={[styles.roundBtn, floating]}\n pressedStyle={DIM}\n testID=\"webbuilder-back\"\n >\n <MaterialCommunityIcons name=\"chevron-left\" size={28} color={theme.ink} />\n </Tap>\n {mode === 'chat' ? (\n <>\n <View style={[styles.titlePill, floating]}>\n <Text style={[styles.pillTitle, { color: theme.ink }]} numberOfLines={1}>\n {siteTitle || 'New app'}\n </Text>\n <Text style={[styles.pillStatus, { color: statusTone }]} numberOfLines={1}>\n {statusText}\n </Text>\n </View>\n <View style={styles.headSpacer} />\n <View style={[styles.actionPill, floating]}>\n <Tap\n onPress={shareSite}\n disabled={!shareUrl}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Share\"\n style={[styles.pillBtn, !shareUrl && styles.disabled]}\n pressedStyle={DIM}\n >\n <MaterialCommunityIcons name=\"share-outline\" size={24} color={theme.ink} />\n </Tap>\n <Tap\n onPress={openMore}\n accessibilityRole=\"button\"\n accessibilityLabel=\"More\"\n style={styles.pillBtn}\n pressedStyle={DIM}\n testID=\"webbuilder-more\"\n >\n <MaterialCommunityIcons name=\"dots-horizontal\" size={24} color={theme.ink} />\n </Tap>\n </View>\n </>\n ) : (\n <>\n <Text style={[styles.centerTitle, { color: theme.ink }]} numberOfLines={1}>\n {mode === 'code' ? 'Code' : siteTitle || 'Preview'}\n </Text>\n <View style={[styles.actionPill, floating]}>\n <Tap\n onPress={shareSite}\n disabled={!shareUrl}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Share\"\n style={[styles.pillBtn, !shareUrl && styles.disabled]}\n pressedStyle={DIM}\n >\n <MaterialCommunityIcons name=\"share-outline\" size={24} color={theme.ink} />\n </Tap>\n <Tap\n onPress={openMore}\n accessibilityRole=\"button\"\n accessibilityLabel=\"More\"\n style={styles.pillBtn}\n pressedStyle={DIM}\n >\n <MaterialCommunityIcons name=\"dots-horizontal\" size={24} color={theme.ink} />\n </Tap>\n </View>\n </>\n )}\n </View>\n {mode === 'chat' ? (\n <ProjectChat\n messages={hostChat?.messages ?? []}\n streaming={hostChat?.streaming ?? null}\n busy={Boolean(hostChat?.busy)}\n error={hostChat?.error ?? null}\n connected={Boolean(hostChat?.connected)}\n building={building}\n build={build}\n siteTitle={siteTitle || 'Your site'}\n onSend={(text) => sendToAgent(text)}\n onOpenPreview={() => setMode('preview')}\n onPublish={() => setPublishOpen(true)}\n onPreviewAsleep={wakePreview}\n theme={theme}\n bottomInset={insets.bottom}\n />\n ) : null}\n {mode === 'preview' ? (\n <PreviewScreen\n build={build}\n building={building}\n loading={buildsLoading}\n previewNonce={previewNonce}\n onReload={() => setPreviewNonce((n) => n + 1)}\n onHome={() => setPreviewNonce((n) => n + 1)}\n onWake={wakePreview}\n waking={waking || Boolean(hostChat?.busy)}\n steps={liveSteps}\n onPublish={() => setPublishOpen(true)}\n publishLabel={publishLabel}\n error={hostChat?.error ?? null}\n theme={theme}\n bottomInset={insets.bottom}\n />\n ) : null}\n {mode === 'code' ? (\n <View style={[styles.fill, { backgroundColor: theme.card, paddingBottom: insets.bottom }]}>\n <CodeView files={build?.files ?? null} theme={theme} onAsk={openChat} />\n </View>\n ) : null}\n </>\n ) : (\n <>\n {/* Projects is a tab, not a place to leave from: only Create carries the way out. */}\n {homeTab === 'create' ? (\n <View\n style={[\n styles.header,\n styles.headerBare,\n { paddingTop: insets.top + 4, borderBottomColor: 'transparent' },\n ]}\n >\n <IconButton\n icon=\"arrow-left\"\n label=\"Leave Web Builder\"\n onPress={back}\n theme={theme}\n testID=\"webbuilder-back\"\n />\n </View>\n ) : null}\n <View style={styles.fill}>\n {homeTab === 'create' ? (\n <StudioHome\n draft={draft}\n onDraft={setDraft}\n template={template}\n onClearTemplate={() => setTemplate(null)}\n onBrowseTemplates={() => setTemplatesOpen(true)}\n brand={brand}\n onBrand={() => setBrandOpen(true)}\n onSiteScore={() => setScoreOpen(true)}\n onStart={startSite}\n connecting={startBlocked}\n startNotice={startNotice}\n theme={theme}\n bottomInset={BOTTOM_TABS_SPACE + insets.bottom}\n />\n ) : (\n <ProjectsScreen\n projects={projects}\n loading={projectsLoading}\n error={projectsError}\n hasMore={projectsHasMore}\n onRefresh={onRefreshProjects}\n onLoadMore={onLoadMoreProjects}\n onOpen={(p) => onOpenProject(p.channelId)}\n onNewProject={() => setHomeTab('create')}\n topInset={insets.top + 12}\n bottomInset={BOTTOM_TABS_SPACE + insets.bottom}\n theme={theme}\n />\n )}\n </View>\n <BottomTabs tab={homeTab} onTab={setHomeTab} theme={theme} bottomInset={insets.bottom} />\n </>\n )}\n\n <TemplatesSheet\n visible={templatesOpen}\n onClose={() => setTemplatesOpen(false)}\n templates={templates}\n loading={templatesLoading}\n error={templatesError}\n onReload={onReloadTemplates}\n selectedId={template?.id ?? null}\n onPick={pickTemplate}\n theme={theme}\n />\n <SiteScoreSheet\n visible={scoreOpen}\n onClose={() => setScoreOpen(false)}\n blocked={startBlocked}\n onCheck={(url) => {\n setScoreOpen(false);\n onStartProject({ text: siteScoreTurn(url), template: null, agent: true });\n }}\n theme={theme}\n />\n <BrandKitSheet\n visible={brandOpen}\n brand={brand}\n onSave={saveBrand}\n onClose={() => setBrandOpen(false)}\n theme={theme}\n />\n <PublishSheet\n visible={publishOpen}\n build={build}\n publishing={publishing}\n onPublish={onPublish ? publish : undefined}\n onClose={() => setPublishOpen(false)}\n theme={theme}\n />\n <VersionsSheet\n visible={versionsOpen}\n builds={builds}\n selectedKey={selectedKey}\n onSelect={(picked) => {\n setSelectedKey(picked.key === latest?.key ? null : picked.key);\n setVersionsOpen(false);\n }}\n onClose={() => setVersionsOpen(false)}\n theme={theme}\n />\n\n <Toast message={toast} theme={theme} bottom={insets.bottom + 80} />\n </GestureHandlerRootView>\n );\n}\n\nexport default WebBuilderExperience;\n\nconst styles = StyleSheet.create({\n fill: { flex: 1 },\n header: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 6,\n paddingHorizontal: 8,\n paddingBottom: 8,\n borderBottomWidth: StyleSheet.hairlineWidth,\n },\n headerBare: { paddingBottom: 0 },\n projectHead: { flexDirection: 'row', alignItems: 'center', gap: 10, paddingHorizontal: 14, paddingBottom: 10 },\n roundBtn: {\n width: 52,\n height: 52,\n borderRadius: 26,\n borderWidth: StyleSheet.hairlineWidth,\n alignItems: 'center',\n justifyContent: 'center',\n shadowOpacity: 0.08,\n shadowRadius: 12,\n shadowOffset: { width: 0, height: 4 },\n elevation: 3,\n },\n titlePill: {\n flexShrink: 1,\n maxWidth: '58%',\n height: 52,\n paddingHorizontal: 18,\n borderRadius: 26,\n borderWidth: StyleSheet.hairlineWidth,\n justifyContent: 'center',\n shadowOpacity: 0.08,\n shadowRadius: 12,\n shadowOffset: { width: 0, height: 4 },\n elevation: 3,\n },\n pillTitle: { fontSize: 16, fontWeight: '700', letterSpacing: -0.2 },\n pillStatus: { fontSize: 12, fontWeight: '600', marginTop: 1 },\n headSpacer: { flex: 1 },\n actionPill: {\n flexDirection: 'row',\n alignItems: 'center',\n height: 52,\n paddingHorizontal: 8,\n borderRadius: 26,\n borderWidth: StyleSheet.hairlineWidth,\n shadowOpacity: 0.08,\n shadowRadius: 12,\n shadowOffset: { width: 0, height: 4 },\n elevation: 3,\n },\n pillBtn: { width: 42, height: 42, borderRadius: 21, alignItems: 'center', justifyContent: 'center' },\n centerTitle: { flex: 1, textAlign: 'center', fontSize: 18, fontWeight: '700' },\n headerText: { flex: 1, flexDirection: 'row', alignItems: 'center', gap: 8, minWidth: 0 },\n headerTitle: { flexShrink: 1, fontSize: 17, fontWeight: '700', letterSpacing: -0.2 },\n publish: {\n minHeight: 34,\n paddingHorizontal: 16,\n borderRadius: 17,\n alignItems: 'center',\n justifyContent: 'center',\n marginRight: 4,\n },\n publishLabel: { fontSize: 14, fontWeight: '700' },\n disabled: { opacity: 0.35 },\n});\n"],"names":["_a","_b"],"mappings":"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"}
1
+ {"version":3,"file":"WebBuilderExperience.js","sources":["../../../src/features/webbuilder/WebBuilderExperience.tsx"],"sourcesContent":["/**\n * Native Web Builder: describe a site (or start from a template) and the build\n * workflow makes it; watch the live preview, ask for changes, step through\n * versions and publish - on the same builds as the web Web Builder, so a site\n * started on the phone opens on the web and the other way round.\n *\n * Native twin of the web surface (aicode-stack `surfaces/webbuilder`): the\n * studio home and its composer, Templates (the web sidebar, a sheet here),\n * Projects (the web's Your builds, a bottom tab), the open build with Preview / Code /\n * History and Publish, and the Agent pane. The host screen owns what needs\n * the app's data stack (the session, the build workflow, the chats, publish,\n * navigation) and passes it in as props; this component renders.\n */\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n ActionSheetIOS,\n Alert,\n BackHandler,\n Keyboard,\n Linking,\n Platform,\n Share,\n StyleSheet,\n Text,\n View,\n} from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { GestureHandlerRootView } from 'react-native-gesture-handler';\nimport { useSafeInsets } from '../canvas/withRemoteSafeArea';\nimport { useAppTheme } from '../../theme/AppThemeProvider';\nimport type { MessageAttachment } from '../../hooks/useChatStream';\nimport { DIM, Tap } from '../inbox/components/Tap';\nimport { brandBriefBlock, isBareSeed, siteScoreTurn, studioTurnText } from './studioCatalog';\nimport { titleFromPrompt } from './buildFragments';\nimport { useBrandKit } from './brandKitStorage';\nimport { parseToolActivity } from '../chat/toolActivity';\nimport { wakePreviewPrompt } from './webbuilderPrompts';\nimport { webbuilderTheme } from './webbuilderTheme';\nimport type { WebBuilderHostChat } from './hostChat';\nimport type {\n WebBuilderBuild,\n WebBuilderBuilding,\n WebBuilderProject,\n WebBuilderPublishResult,\n WebBuilderStartRequest,\n} from './types';\nimport type { WebBuilderTemplate } from './workflow';\nimport { BrandKitSheet } from './components/BrandKitSheet';\nimport { CodeView } from './components/CodeView';\nimport { ProjectChat } from './components/ProjectChat';\nimport { PreviewScreen } from './components/PreviewScreen';\nimport { PublishSheet } from './components/PublishSheet';\nimport { BOTTOM_TABS_SPACE, BottomTabs, type HomeTab } from './components/BottomTabs';\nimport { SiteScoreSheet } from './components/SiteScoreSheet';\nimport { ProjectsScreen } from './components/ProjectsScreen';\nimport { TemplatesSheet } from './components/TemplatesSheet';\nimport { StudioHome, type StudioStart } from './components/StudioHome';\nimport { VersionsSheet } from './components/VersionsSheet';\nimport { IconButton, Toast } from './components/ui';\nimport { demoVideoSource, encodeCodezenHandoff, webbuilderDemoHandoff, type CodezenHandoff } from './codezenHandoff';\n\nexport interface WebBuilderExperienceProps {\n /**\n * The app's light/dark choice, from the host. A lazily loaded experience can\n * end up with its own copy of the theme context and miss the in-app setting,\n * so the host's answer wins; the context is only the fallback.\n */\n isDark?: boolean;\n /** Leaves Web Builder. */\n onExit: () => void;\n /** Your builds, newest first. */\n projects: WebBuilderProject[];\n projectsLoading?: boolean;\n projectsError?: string | null;\n onRefreshProjects?: () => void;\n /** More builds exist past the ones loaded (the web gallery pages 10 at a time). */\n projectsHasMore?: boolean;\n onLoadMoreProjects?: () => void;\n /** The workspace's starter templates (marketplace Code Assistant cards). */\n templates: WebBuilderTemplate[];\n templatesLoading?: boolean;\n templatesError?: string | null;\n onReloadTemplates?: () => void;\n /** A connection still coming up: the composer waits (and says so), or null. */\n startBlocked?: string | null;\n /** Why the last Start did not go out, in one sentence, or null. */\n startNotice?: string | null;\n /** The site open on screen (its chat), or null on the home screen. */\n activeChannelId: string | null;\n onOpenProject: (channelId: string) => void;\n onCloseProject: () => void;\n /** Starts a new site; the host runs the build workflow and opens it. */\n onStartProject: (request: WebBuilderStartRequest) => void;\n /** The open site's builds, newest first. */\n builds: WebBuilderBuild[];\n buildsLoading?: boolean;\n /** A turn running on the open site. */\n building?: WebBuilderBuilding | null;\n /** The chat shows a publish still running on the open site. */\n publishing?: boolean;\n /** The open site's agent conversation. */\n hostChat?: WebBuilderHostChat;\n onPublish?: (build: WebBuilderBuild, projectName: string) => Promise<WebBuilderPublishResult>;\n /** Wake a sleeping preview without the agent; 'gone' when the sandbox was reclaimed. */\n onResumePreview?: (build: WebBuilderBuild) => Promise<'ok' | 'gone' | 'failed'>;\n /**\n * \"Demo video\": open Codezen with this handoff (`fragment` is\n * `codezen_template=…`, web 0.5.0). Without it the menu item is hidden.\n */\n onOpenCodezen?: (fragment: string, handoff: CodezenHandoff) => void;\n /** A brain-routed hand-off: the person's words, which start a new site. */\n initialAgentSeed?: { text: string; files?: MessageAttachment[] } | null;\n}\n\nconst TOAST_MS = 2_400;\n/** A publish that never reported back stops reading as running after this long. */\nconst PUBLISH_WATCH_MS = 10 * 60 * 1000;\n\nexport function WebBuilderExperience({\n isDark: hostIsDark,\n onExit,\n projects,\n projectsLoading = false,\n projectsError = null,\n onRefreshProjects,\n projectsHasMore = false,\n onLoadMoreProjects,\n templates,\n templatesLoading = false,\n templatesError = null,\n onReloadTemplates,\n startBlocked = null,\n startNotice = null,\n activeChannelId,\n onOpenProject,\n onCloseProject,\n onStartProject,\n builds,\n buildsLoading = false,\n building = null,\n publishing: publishingOnChat = false,\n hostChat,\n onPublish,\n onResumePreview,\n onOpenCodezen,\n initialAgentSeed = null,\n}: WebBuilderExperienceProps) {\n const appTheme = useAppTheme();\n const isDark = hostIsDark ?? appTheme.isDark;\n const theme = useMemo(() => webbuilderTheme(isDark), [isDark]);\n const insets = useSafeInsets();\n\n const project = useMemo(\n () => projects.find((p) => p.channelId === activeChannelId) ?? null,\n [projects, activeChannelId],\n );\n\n // ── Studio: the composer's draft, template and brand ──────────────────\n const [draft, setDraft] = useState('');\n const [template, setTemplate] = useState<WebBuilderTemplate | null>(null);\n const [templatesOpen, setTemplatesOpen] = useState(false);\n const [scoreOpen, setScoreOpen] = useState(false);\n const [homeTab, setHomeTab] = useState<HomeTab>('create');\n const { brand, saveBrand } = useBrandKit();\n const [brandOpen, setBrandOpen] = useState(false);\n\n const pickTemplate = useCallback((picked: WebBuilderTemplate) => {\n setTemplate(picked);\n setTemplatesOpen(false);\n setHomeTab('create');\n // The web hands a picked card to the composer: its starter prompt when the box is empty.\n setDraft((prev) => (isBareSeed(prev) && picked.chatPrompt ? picked.chatPrompt : prev));\n }, []);\n\n const startSite = useCallback(\n (start: StudioStart, files?: MessageAttachment[]) => {\n const brief =\n start.brief.trim() || (start.template ? start.template.chatPrompt || start.template.title : '');\n if (!brief && !files?.length) return;\n onStartProject({\n text: studioTurnText({ brief, brandBlock: brandBriefBlock(brand), referenceUrl: start.referenceUrl }),\n template: start.template,\n ...(start.referenceUrl ? { referenceUrl: start.referenceUrl } : {}),\n ...(files?.length ? { attachments: files } : {}),\n });\n setDraft('');\n setTemplate(null);\n },\n [onStartProject, brand],\n );\n\n // A hand-off starts its site as soon as a build can start.\n const handedOff = useRef(false);\n useEffect(() => {\n if (handedOff.current || !initialAgentSeed || startBlocked) return;\n handedOff.current = true;\n startSite({ brief: initialAgentSeed.text, template: null }, initialAgentSeed.files);\n }, [initialAgentSeed, startBlocked, startSite]);\n\n // ── The build on screen ────────────────────────────────────────────────\n const [selectedKey, setSelectedKey] = useState<string | null>(null);\n useEffect(() => setSelectedKey(null), [activeChannelId]);\n const latest = builds[0] ?? null;\n const build = useMemo(\n () => (selectedKey ? (builds.find((b) => b.key === selectedKey) ?? latest) : latest),\n [builds, selectedKey, latest],\n );\n // The site's resolved name (the web title rules) wins over a build's raw title;\n // until a build names it, the person's first ask does (\"Coffee Website\", not \"New app\").\n const firstAsk = hostChat?.messages.find((m) => m.role === 'user')?.content;\n const askTitle = useMemo(() => titleFromPrompt(firstAsk), [firstAsk]);\n const siteTitle = project?.title || build?.title || askTitle || null;\n\n // A new build of the same sandbox (an edit) re-fetches the preview.\n const [previewNonce, setPreviewNonce] = useState(0);\n const seenBuildAt = useRef<{ key: string | null; at: number }>({ key: null, at: 0 });\n useEffect(() => {\n const key = build?.key ?? null;\n const at = build?.updatedAt ?? 0;\n const seen = seenBuildAt.current;\n if (key && key === seen.key && at > seen.at) setPreviewNonce((n) => n + 1);\n seenBuildAt.current = { key, at };\n }, [build?.key, build?.updatedAt]);\n\n // ── Toast ──────────────────────────────────────────────────────────────\n const [toast, setToast] = useState<string | null>(null);\n const toastTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const showToast = useCallback((message: string) => {\n if (toastTimer.current) clearTimeout(toastTimer.current);\n setToast(message);\n toastTimer.current = setTimeout(() => setToast(null), TOAST_MS);\n }, []);\n useEffect(() => () => (toastTimer.current ? clearTimeout(toastTimer.current) : undefined), []);\n\n // ── The project's chat (Manus-style: the conversation leads, the site is a tap away) ──\n const [mode, setMode] = useState<'chat' | 'preview' | 'code'>('chat');\n useEffect(() => setMode('chat'), [activeChannelId]);\n const sendToAgent = useCallback(\n (text: string, files?: MessageAttachment[]) => {\n const words = text.trim();\n if (!words || !hostChat) return;\n // The first ask in a site with nothing built yet is the brief (web `studioTurnText`).\n const turn = build || /^build\\b/i.test(words) ? words : `Build me: ${words}`;\n hostChat.send(turn, files, build);\n setMode('chat');\n },\n [hostChat, build],\n );\n const openChat = useCallback(() => {\n Keyboard.dismiss();\n setMode('chat');\n }, []);\n // A preview that does not answer is brought back quietly, the way the web's\n // ensurePreview does it: resume, restart, or boot its restore point into a new\n // sandbox (host). Only a sandbox that is gone with no restore point needs the agent.\n const [waking, setWaking] = useState(false);\n const wokenFor = useRef<string | null>(null);\n useEffect(() => {\n wokenFor.current = null;\n }, [build?.key]);\n const wakePreview = useCallback(() => {\n if (!build || waking || wokenFor.current === build.key) return;\n wokenFor.current = build.key;\n setWaking(true);\n const resume = onResumePreview ? onResumePreview(build) : Promise.resolve<'failed'>('failed');\n resume\n .catch(() => 'failed' as const)\n .then((outcome) => {\n if (outcome === 'ok') setPreviewNonce((n) => n + 1);\n // Stay where the person is; the agent's restore shows in the chat.\n else if (hostChat && !hostChat.busy) hostChat.send(wakePreviewPrompt(build), undefined, build);\n })\n .finally(() => setWaking(false));\n }, [build, waking, onResumePreview, hostChat]);\n\n // ── Publish ────────────────────────────────────────────────────────────\n const [publishOpen, setPublishOpen] = useState(false);\n const [versionsOpen, setVersionsOpen] = useState(false);\n const [publishStarted, setPublishStarted] = useState<{ key: string; live: string | null; at: number } | null>(null);\n useEffect(() => setPublishStarted(null), [activeChannelId]);\n useEffect(() => {\n if (!publishStarted) return;\n const target = builds.find((b) => b.key === publishStarted.key);\n if (target?.liveUrl && target.liveUrl !== publishStarted.live) {\n setPublishStarted(null);\n showToast('Your site is live');\n }\n }, [builds, publishStarted, showToast]);\n const publishing = publishingOnChat || Boolean(publishStarted && Date.now() - publishStarted.at < PUBLISH_WATCH_MS);\n const publish = useCallback(\n async (target: WebBuilderBuild, projectName: string): Promise<WebBuilderPublishResult> => {\n if (!onPublish) return { ok: false, message: 'Publishing is not available here.' };\n const result = await onPublish(target, projectName);\n if (result.ok) {\n setPublishStarted({ key: target.key, live: target.liveUrl, at: Date.now() });\n showToast('Publishing started');\n }\n return result;\n },\n [onPublish, showToast],\n );\n\n // ── Back ───────────────────────────────────────────────────────────────\n const back = useCallback(() => {\n if (activeChannelId && mode !== 'chat') {\n setMode('chat');\n return;\n }\n if (activeChannelId) {\n onCloseProject();\n return;\n }\n if (homeTab === 'projects') {\n setHomeTab('create');\n return;\n }\n onExit();\n }, [mode, activeChannelId, homeTab, onCloseProject, onExit]);\n useEffect(() => {\n const sub = BackHandler.addEventListener('hardwareBackPress', () => {\n back();\n return true;\n });\n return () => sub.remove();\n }, [back]);\n\n const live = build?.liveUrl ?? project?.liveUrl ?? null;\n let statusText = 'New';\n let statusTone = theme.muted;\n if (building || hostChat?.busy) {\n statusText = 'Working…';\n statusTone = theme.accent;\n } else if (live) {\n statusText = 'Live';\n statusTone = theme.good;\n } else if (build) {\n statusText = 'Not published';\n }\n const floating = {\n backgroundColor: theme.card,\n borderColor: theme.border,\n shadowColor: theme.isDark ? '#000' : '#1c1917',\n };\n const liveSteps = hostChat?.busy && hostChat.streaming ? parseToolActivity(hostChat.streaming, true).steps : [];\n let publishLabel = 'Publish';\n if (publishing) publishLabel = 'Publishing…';\n const shareUrl = live || build?.previewUrl || null;\n const shareSite = () => {\n if (shareUrl) Share.share({ message: shareUrl, url: shareUrl }).catch(() => undefined);\n };\n const openMore = () => {\n const actions: Array<{ label: string; run: () => void; destructive?: boolean }> = [];\n if (mode !== 'chat') actions.push({ label: 'Back to the chat', run: () => setMode('chat') });\n if (build?.previewUrl && mode !== 'preview') {\n actions.push({ label: 'Open preview', run: () => setMode('preview') });\n }\n if (build?.files && mode !== 'code') actions.push({ label: 'View code', run: () => setMode('code') });\n if (builds.length > 1) actions.push({ label: 'Versions', run: () => setVersionsOpen(true) });\n if (build?.sandboxId) {\n actions.push({ label: live ? 'Publish an update' : 'Publish', run: () => setPublishOpen(true) });\n }\n if (build?.previewUrl) {\n const url = live || build.previewUrl;\n actions.push({ label: 'Open in browser', run: () => Linking.openURL(url).catch(() => undefined) });\n }\n // Codezen films the published site, else the live preview (web 0.5.0); not mid-build.\n const demo = build && !building ? demoVideoSource(live, build.previewUrl) : null;\n if (demo && onOpenCodezen) {\n actions.push({\n label: 'Demo video',\n run: () => {\n const film = () => {\n try {\n const handoff = webbuilderDemoHandoff(siteTitle || build?.title || '', demo);\n onOpenCodezen(encodeCodezenHandoff(handoff), handoff);\n } catch (err) {\n showToast(err instanceof Error ? err.message : \"Couldn't open Codezen.\");\n }\n };\n if (demo.stable) {\n film();\n return;\n }\n // Only the live preview: it still works, but sleeps about an hour after the last change.\n Alert.alert(\n 'Publish first for a link that stays up',\n 'Codezen will film the live preview, which sleeps about an hour after the last change.',\n [\n { text: 'Cancel', style: 'cancel' },\n { text: 'Film the preview', onPress: film },\n ],\n );\n },\n });\n }\n if (!actions.length) return;\n if (Platform.OS === 'ios') {\n ActionSheetIOS.showActionSheetWithOptions(\n { options: [...actions.map((a) => a.label), 'Cancel'], cancelButtonIndex: actions.length },\n (index) => actions[index]?.run(),\n );\n return;\n }\n Alert.alert(siteTitle || 'Project', undefined, [\n ...actions.map((a) => ({ text: a.label, onPress: a.run })),\n { text: 'Cancel', style: 'cancel' as const },\n ]);\n };\n\n return (\n <GestureHandlerRootView style={[styles.fill, { backgroundColor: theme.screen }]}>\n {activeChannelId ? (\n <>\n {/* Manus-style: a floating back, the project in a pill, actions on the right. */}\n <View style={[styles.projectHead, { paddingTop: insets.top + 6 }]}>\n <Tap\n onPress={back}\n accessibilityRole=\"button\"\n accessibilityLabel={mode === 'chat' ? 'Back to Web Builder' : 'Back to the chat'}\n style={[styles.roundBtn, floating]}\n pressedStyle={DIM}\n testID=\"webbuilder-back\"\n >\n <MaterialCommunityIcons name=\"chevron-left\" size={28} color={theme.ink} />\n </Tap>\n {mode === 'chat' ? (\n <>\n <View style={[styles.titlePill, floating]}>\n <Text style={[styles.pillTitle, { color: theme.ink }]} numberOfLines={1}>\n {siteTitle || 'New app'}\n </Text>\n <Text style={[styles.pillStatus, { color: statusTone }]} numberOfLines={1}>\n {statusText}\n </Text>\n </View>\n <View style={styles.headSpacer} />\n <View style={[styles.actionPill, floating]}>\n <Tap\n onPress={shareSite}\n disabled={!shareUrl}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Share\"\n style={[styles.pillBtn, !shareUrl && styles.disabled]}\n pressedStyle={DIM}\n >\n <MaterialCommunityIcons name=\"share-outline\" size={24} color={theme.ink} />\n </Tap>\n <Tap\n onPress={openMore}\n accessibilityRole=\"button\"\n accessibilityLabel=\"More\"\n style={styles.pillBtn}\n pressedStyle={DIM}\n testID=\"webbuilder-more\"\n >\n <MaterialCommunityIcons name=\"dots-horizontal\" size={24} color={theme.ink} />\n </Tap>\n </View>\n </>\n ) : (\n <>\n <Text style={[styles.centerTitle, { color: theme.ink }]} numberOfLines={1}>\n {mode === 'code' ? 'Code' : siteTitle || 'Preview'}\n </Text>\n <View style={[styles.actionPill, floating]}>\n <Tap\n onPress={shareSite}\n disabled={!shareUrl}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Share\"\n style={[styles.pillBtn, !shareUrl && styles.disabled]}\n pressedStyle={DIM}\n >\n <MaterialCommunityIcons name=\"share-outline\" size={24} color={theme.ink} />\n </Tap>\n <Tap\n onPress={openMore}\n accessibilityRole=\"button\"\n accessibilityLabel=\"More\"\n style={styles.pillBtn}\n pressedStyle={DIM}\n >\n <MaterialCommunityIcons name=\"dots-horizontal\" size={24} color={theme.ink} />\n </Tap>\n </View>\n </>\n )}\n </View>\n {mode === 'chat' ? (\n <ProjectChat\n messages={hostChat?.messages ?? []}\n streaming={hostChat?.streaming ?? null}\n busy={Boolean(hostChat?.busy)}\n error={hostChat?.error ?? null}\n connected={Boolean(hostChat?.connected)}\n building={building}\n build={build}\n siteTitle={siteTitle || 'Your site'}\n onSend={(text) => sendToAgent(text)}\n onOpenPreview={() => setMode('preview')}\n onPublish={() => setPublishOpen(true)}\n onPreviewAsleep={wakePreview}\n theme={theme}\n bottomInset={insets.bottom}\n />\n ) : null}\n {mode === 'preview' ? (\n <PreviewScreen\n build={build}\n building={building}\n loading={buildsLoading}\n previewNonce={previewNonce}\n onReload={() => setPreviewNonce((n) => n + 1)}\n onHome={() => setPreviewNonce((n) => n + 1)}\n onWake={wakePreview}\n waking={waking || Boolean(hostChat?.busy)}\n steps={liveSteps}\n onPublish={() => setPublishOpen(true)}\n publishLabel={publishLabel}\n error={hostChat?.error ?? null}\n theme={theme}\n bottomInset={insets.bottom}\n />\n ) : null}\n {mode === 'code' ? (\n <View style={[styles.fill, { backgroundColor: theme.card, paddingBottom: insets.bottom }]}>\n <CodeView files={build?.files ?? null} theme={theme} onAsk={openChat} />\n </View>\n ) : null}\n </>\n ) : (\n <>\n {/* Projects is a tab, not a place to leave from: only Create carries the way out. */}\n {homeTab === 'create' ? (\n <View\n style={[\n styles.header,\n styles.headerBare,\n { paddingTop: insets.top + 4, borderBottomColor: 'transparent' },\n ]}\n >\n <IconButton\n icon=\"arrow-left\"\n label=\"Leave Web Builder\"\n onPress={back}\n theme={theme}\n testID=\"webbuilder-back\"\n />\n </View>\n ) : null}\n <View style={styles.fill}>\n {homeTab === 'create' ? (\n <StudioHome\n draft={draft}\n onDraft={setDraft}\n template={template}\n onClearTemplate={() => setTemplate(null)}\n onBrowseTemplates={() => setTemplatesOpen(true)}\n brand={brand}\n onBrand={() => setBrandOpen(true)}\n onSiteScore={() => setScoreOpen(true)}\n onStart={startSite}\n connecting={startBlocked}\n startNotice={startNotice}\n theme={theme}\n bottomInset={BOTTOM_TABS_SPACE + insets.bottom}\n />\n ) : (\n <ProjectsScreen\n projects={projects}\n loading={projectsLoading}\n error={projectsError}\n hasMore={projectsHasMore}\n onRefresh={onRefreshProjects}\n onLoadMore={onLoadMoreProjects}\n onOpen={(p) => onOpenProject(p.channelId)}\n onNewProject={() => setHomeTab('create')}\n topInset={insets.top + 12}\n bottomInset={BOTTOM_TABS_SPACE + insets.bottom}\n theme={theme}\n />\n )}\n </View>\n <BottomTabs tab={homeTab} onTab={setHomeTab} theme={theme} bottomInset={insets.bottom} />\n </>\n )}\n\n <TemplatesSheet\n visible={templatesOpen}\n onClose={() => setTemplatesOpen(false)}\n templates={templates}\n loading={templatesLoading}\n error={templatesError}\n onReload={onReloadTemplates}\n selectedId={template?.id ?? null}\n onPick={pickTemplate}\n theme={theme}\n />\n <SiteScoreSheet\n visible={scoreOpen}\n onClose={() => setScoreOpen(false)}\n blocked={startBlocked}\n onCheck={(url) => {\n setScoreOpen(false);\n onStartProject({ text: siteScoreTurn(url), template: null, agent: true });\n }}\n theme={theme}\n />\n <BrandKitSheet\n visible={brandOpen}\n brand={brand}\n onSave={saveBrand}\n onClose={() => setBrandOpen(false)}\n theme={theme}\n />\n <PublishSheet\n visible={publishOpen}\n build={build}\n publishing={publishing}\n onPublish={onPublish ? publish : undefined}\n onClose={() => setPublishOpen(false)}\n theme={theme}\n />\n <VersionsSheet\n visible={versionsOpen}\n builds={builds}\n selectedKey={selectedKey}\n onSelect={(picked) => {\n setSelectedKey(picked.key === latest?.key ? null : picked.key);\n setVersionsOpen(false);\n }}\n onClose={() => setVersionsOpen(false)}\n theme={theme}\n />\n\n <Toast message={toast} theme={theme} bottom={insets.bottom + 80} />\n </GestureHandlerRootView>\n );\n}\n\nexport default WebBuilderExperience;\n\nconst styles = StyleSheet.create({\n fill: { flex: 1 },\n header: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 6,\n paddingHorizontal: 8,\n paddingBottom: 8,\n borderBottomWidth: StyleSheet.hairlineWidth,\n },\n headerBare: { paddingBottom: 0 },\n projectHead: { flexDirection: 'row', alignItems: 'center', gap: 10, paddingHorizontal: 14, paddingBottom: 10 },\n roundBtn: {\n width: 52,\n height: 52,\n borderRadius: 26,\n borderWidth: StyleSheet.hairlineWidth,\n alignItems: 'center',\n justifyContent: 'center',\n shadowOpacity: 0.08,\n shadowRadius: 12,\n shadowOffset: { width: 0, height: 4 },\n elevation: 3,\n },\n titlePill: {\n flexShrink: 1,\n maxWidth: '58%',\n height: 52,\n paddingHorizontal: 18,\n borderRadius: 26,\n borderWidth: StyleSheet.hairlineWidth,\n justifyContent: 'center',\n shadowOpacity: 0.08,\n shadowRadius: 12,\n shadowOffset: { width: 0, height: 4 },\n elevation: 3,\n },\n pillTitle: { fontSize: 16, fontWeight: '700', letterSpacing: -0.2 },\n pillStatus: { fontSize: 12, fontWeight: '600', marginTop: 1 },\n headSpacer: { flex: 1 },\n actionPill: {\n flexDirection: 'row',\n alignItems: 'center',\n height: 52,\n paddingHorizontal: 8,\n borderRadius: 26,\n borderWidth: StyleSheet.hairlineWidth,\n shadowOpacity: 0.08,\n shadowRadius: 12,\n shadowOffset: { width: 0, height: 4 },\n elevation: 3,\n },\n pillBtn: { width: 42, height: 42, borderRadius: 21, alignItems: 'center', justifyContent: 'center' },\n centerTitle: { flex: 1, textAlign: 'center', fontSize: 18, fontWeight: '700' },\n headerText: { flex: 1, flexDirection: 'row', alignItems: 'center', gap: 8, minWidth: 0 },\n headerTitle: { flexShrink: 1, fontSize: 17, fontWeight: '700', letterSpacing: -0.2 },\n publish: {\n minHeight: 34,\n paddingHorizontal: 16,\n borderRadius: 17,\n alignItems: 'center',\n justifyContent: 'center',\n marginRight: 4,\n },\n publishLabel: { fontSize: 14, fontWeight: '700' },\n disabled: { opacity: 0.35 },\n});\n"],"names":["_a","_b"],"mappings":"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"}
@@ -364,7 +364,8 @@ function turnState(posts, since) {
364
364
  return {
365
365
  status: "failed",
366
366
  progress: null,
367
- error: (_a = str(p.message)) != null ? _a : "The build failed."
367
+ error: (_a = str(p.message)) != null ? _a : "The build failed.",
368
+ heard: true
368
369
  };
369
370
  }
370
371
  const fragment = readFragment(post);
@@ -372,7 +373,8 @@ function turnState(posts, since) {
372
373
  return {
373
374
  status: "done",
374
375
  progress: null,
375
- error: null
376
+ error: null,
377
+ heard: true
376
378
  };
377
379
  }
378
380
  progress = (_b = progressText(post)) != null ? _b : progress;
@@ -383,13 +385,15 @@ function turnState(posts, since) {
383
385
  return {
384
386
  status: "done",
385
387
  progress: null,
386
- error: null
388
+ error: null,
389
+ heard: true
387
390
  };
388
391
  }
389
392
  return {
390
393
  status: "running",
391
394
  progress,
392
- error: null
395
+ error: null,
396
+ heard: Boolean(newest)
393
397
  };
394
398
  }
395
399
  function isWorkflowTurnPost(post) {