@adminide-stack/yantra-mobile 12.0.142 → 12.0.145-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/features/attachments/displayUserMessageText.js +2 -2
- package/lib/features/attachments/displayUserMessageText.js.map +1 -1
- package/lib/features/devices/readings.js.map +1 -1
- package/lib/features/devices/session.js +2 -22
- package/lib/features/devices/session.js.map +1 -1
- package/lib/features/notion/NotionAgentPanel.js +987 -0
- package/lib/features/notion/NotionAgentPanel.js.map +1 -0
- package/lib/features/notion/NotionAskAiSheet.js +362 -0
- package/lib/features/notion/NotionAskAiSheet.js.map +1 -0
- package/lib/features/notion/NotionBlockView.js +4 -3
- package/lib/features/notion/NotionBlockView.js.map +1 -1
- package/lib/features/notion/NotionConnectionsSheet.js +47 -13
- package/lib/features/notion/NotionConnectionsSheet.js.map +1 -1
- package/lib/features/notion/NotionPageView.js +68 -8
- package/lib/features/notion/NotionPageView.js.map +1 -1
- package/lib/features/notion/NotionSidebarSections.js +1 -1
- package/lib/features/notion/NotionSidebarSections.js.map +1 -1
- package/lib/features/notion/NotionWorkspaceView.js +14 -9
- package/lib/features/notion/NotionWorkspaceView.js.map +1 -1
- package/lib/features/notion/database/DatabaseCells.js +3 -1
- package/lib/features/notion/database/DatabaseCells.js.map +1 -1
- package/lib/features/notion/database/DatabaseDateLayouts.js +1 -1
- package/lib/features/notion/database/DatabaseDateLayouts.js.map +1 -1
- package/lib/features/notion/database/NotionDatabaseView.js +1 -1
- package/lib/features/notion/database/NotionDatabaseView.js.map +1 -1
- package/lib/features/notion/notionAgentRunStatus.js +2 -2
- package/lib/features/notion/notionAgentRunStatus.js.map +1 -1
- package/lib/features/notion/notionAgentRuns.js +57 -0
- package/lib/features/notion/notionAgentRuns.js.map +1 -0
- package/lib/features/notion/notionAiContext.js +91 -0
- package/lib/features/notion/notionAiContext.js.map +1 -0
- package/lib/features/notion/notionConnections.js +42 -4
- package/lib/features/notion/notionConnections.js.map +1 -1
- package/lib/features/notion/notionDocuments.js +61 -1
- package/lib/features/notion/notionDocuments.js.map +1 -1
- package/lib/features/notion/notionNotesAgent.js +173 -3
- package/lib/features/notion/notionNotesAgent.js.map +1 -1
- package/lib/features/notion/notionPageKinds.js +1 -1
- package/lib/features/webbuilder/WebBuilderExperience.js +229 -97
- package/lib/features/webbuilder/WebBuilderExperience.js.map +1 -1
- package/lib/features/webbuilder/buildFragments.js +33 -7
- package/lib/features/webbuilder/buildFragments.js.map +1 -1
- package/lib/features/webbuilder/buildJob.js +2 -2
- package/lib/features/webbuilder/buildJob.js.map +1 -1
- package/lib/features/webbuilder/codeFiles.js +18 -1
- package/lib/features/webbuilder/codeFiles.js.map +1 -1
- package/lib/features/webbuilder/components/BottomTabs.js.map +1 -1
- package/lib/features/webbuilder/components/CodeView.js +134 -56
- package/lib/features/webbuilder/components/CodeView.js.map +1 -1
- package/lib/features/webbuilder/components/Composer.js +2 -2
- package/lib/features/webbuilder/components/Composer.js.map +1 -1
- package/lib/features/webbuilder/components/PreviewFrame.js +19 -3
- package/lib/features/webbuilder/components/PreviewFrame.js.map +1 -1
- package/lib/features/webbuilder/components/PreviewScreen.js +310 -46
- package/lib/features/webbuilder/components/PreviewScreen.js.map +1 -1
- package/lib/features/webbuilder/components/ProjectChat.js +141 -12
- package/lib/features/webbuilder/components/ProjectChat.js.map +1 -1
- package/lib/features/webbuilder/components/ProjectSheets.js +792 -0
- package/lib/features/webbuilder/components/ProjectSheets.js.map +1 -0
- package/lib/features/webbuilder/components/ProjectsScreen.js +14 -2
- package/lib/features/webbuilder/components/ProjectsScreen.js.map +1 -1
- package/lib/features/webbuilder/components/PublishSheet.js +914 -58
- package/lib/features/webbuilder/components/PublishSheet.js.map +1 -1
- package/lib/features/webbuilder/components/TemplateCard.js +9 -6
- package/lib/features/webbuilder/components/TemplateCard.js.map +1 -1
- package/lib/features/webbuilder/components/TemplatesSheet.js +5 -17
- package/lib/features/webbuilder/components/TemplatesSheet.js.map +1 -1
- package/lib/features/webbuilder/connectorTemplates.js +171 -0
- package/lib/features/webbuilder/connectorTemplates.js.map +1 -0
- package/lib/features/webbuilder/fileTree.js +163 -0
- package/lib/features/webbuilder/fileTree.js.map +1 -0
- package/lib/features/webbuilder/followUps.js +67 -0
- package/lib/features/webbuilder/followUps.js.map +1 -0
- package/lib/features/webbuilder/previewProbe.js +49 -0
- package/lib/features/webbuilder/previewProbe.js.map +1 -0
- package/lib/features/webbuilder/previewRoutes.js +156 -0
- package/lib/features/webbuilder/previewRoutes.js.map +1 -0
- package/lib/features/webbuilder/projectTools.js +341 -0
- package/lib/features/webbuilder/projectTools.js.map +1 -0
- package/lib/features/webbuilder/publishTools.js +475 -0
- package/lib/features/webbuilder/publishTools.js.map +1 -0
- package/lib/features/webbuilder/sleepNotice.js +13 -0
- package/lib/features/webbuilder/sleepNotice.js.map +1 -0
- package/lib/features/webbuilder/stepLabels.js +37 -7
- package/lib/features/webbuilder/stepLabels.js.map +1 -1
- package/lib/features/webbuilder/studioCatalog.js +5 -1
- package/lib/features/webbuilder/studioCatalog.js.map +1 -1
- package/lib/features/webbuilder/templateCatalog.js +140 -0
- package/lib/features/webbuilder/templateCatalog.js.map +1 -0
- package/lib/features/webbuilder/webbuilderPrompts.js +31 -5
- package/lib/features/webbuilder/webbuilderPrompts.js.map +1 -1
- package/lib/features/webbuilder/workflow.js +8 -4
- package/lib/features/webbuilder/workflow.js.map +1 -1
- package/lib/screens/Devices/index.js +3 -205
- package/lib/screens/Devices/index.js.map +1 -1
- package/lib/screens/WebBuilderNative/codeWorkspaceApi.js +9 -6
- package/lib/screens/WebBuilderNative/codeWorkspaceApi.js.map +1 -1
- package/lib/screens/WebBuilderNative/index.js +1 -1
- package/lib/screens/WebBuilderNative/index.js.map +1 -1
- package/lib/screens/WebBuilderNative/keepAlive.js +53 -3
- package/lib/screens/WebBuilderNative/keepAlive.js.map +1 -1
- package/lib/screens/WebBuilderNative/unreachableRetry.js +23 -0
- package/lib/screens/WebBuilderNative/unreachableRetry.js.map +1 -0
- package/lib/screens/WebBuilderNative/useConnectorTemplates.js +37 -0
- package/lib/screens/WebBuilderNative/useConnectorTemplates.js.map +1 -0
- package/lib/screens/WebBuilderNative/useSandboxKeepAlive.js +6 -0
- package/lib/screens/WebBuilderNative/useSandboxKeepAlive.js.map +1 -1
- package/lib/screens/WebBuilderNative/useWebBuilderHost.js +302 -40
- package/lib/screens/WebBuilderNative/useWebBuilderHost.js.map +1 -1
- package/lib/screens/WebBuilderNative/useWebBuilderJobs.js +2 -2
- package/lib/screens/WebBuilderNative/useWebBuilderJobs.js.map +1 -1
- package/lib/screens/WebBuilderNative/versionUndo.js +1 -1
- package/lib/screens/WebBuilderNative/versionUndo.js.map +1 -1
- package/lib/screens/WebBuilderNative/webbuilderTransport.js +147 -77
- package/lib/screens/WebBuilderNative/webbuilderTransport.js.map +1 -1
- package/package.json +4 -4
- package/lib/features/devices/bodyComposition.js +0 -116
- package/lib/features/devices/bodyComposition.js.map +0 -1
|
@@ -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 WebBuilderUndoResult,\n WebBuilderStartRequest,\n WebBuilderCodeHost,\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, ViewPicker } from './components/PreviewScreen';\nimport type { PreviewViewport } from './components/PreviewFrame';\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, Sheet, Toast } from './components/ui';\nimport { EXPORT_TARGETS, exportMessage, exportTurn, type ExportTarget } from './exportCode';\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 /** Instant Undo of the build's last change (web #443); without it the menu item is hidden. */\n onUndo?: (build: WebBuilderBuild) => Promise<WebBuilderUndoResult>;\n /** Bring back what the last Undo left. */\n onRedo?: (build: WebBuilderBuild) => Promise<WebBuilderUndoResult>;\n /** The Code view's calls (live files, saved code, edit and save, search); older hosts omit it. */\n code?: WebBuilderCodeHost;\n /** A signed link to the build's code as a zip, or null (then the agent is asked for it). */\n onDownloadCode?: (build: WebBuilderBuild) => Promise<string | null>;\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;\nconst TOAST_ACTION_MS = 6_000;\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 onUndo,\n onRedo,\n onDownloadCode,\n code,\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 [toastAction, setToastAction] = useState<{ label: string; onPress: () => void } | null>(null);\n const toastTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const showToast = useCallback((message: string, action?: { label: string; onPress: () => void }) => {\n if (toastTimer.current) clearTimeout(toastTimer.current);\n setToast(message);\n setToastAction(action ?? null);\n // A toast with an action stays long enough to reach it.\n toastTimer.current = setTimeout(\n () => {\n setToast(null);\n setToastAction(null);\n },\n action ? TOAST_ACTION_MS : TOAST_MS,\n );\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 // The preview width, kept here so the code view's picker returns to it.\n const [viewport, setViewport] = useState<PreviewViewport>('phone');\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 // The agent owns the sandbox during its turn; the frame keeps checking until it ends (web #431).\n if (building || hostChat?.busy) 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(), undefined, build);\n })\n .finally(() => setWaking(false));\n }, [build, waking, building, 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 // Back from a site lands on Projects, where a site still building says so.\n onCloseProject();\n setHomeTab('projects');\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 // Instant Undo (web #443): restore the version before the latest one in the sandbox, with a\n // short \"Undone · Redo\" toast. An agent build whose history cannot be read asks the agent.\n const [undoing, setUndoing] = useState(false);\n const undoLast = () => {\n if (!build || !onUndo || undoing) return;\n const target = build;\n setUndoing(true);\n onUndo(target)\n .then((result) => {\n if (result.ok) {\n setPreviewNonce((n) => n + 1);\n const redo =\n result.canRedo && onRedo\n ? () => {\n onRedo(target)\n .then((again) => {\n if (again.ok) setPreviewNonce((n) => n + 1);\n showToast(again.ok ? 'Redone' : again.message);\n })\n .catch(() => showToast(\"Couldn't redo that change.\"));\n }\n : undefined;\n showToast('Undone', redo ? { label: 'Redo', onPress: redo } : undefined);\n return;\n }\n if (result.askAgent && hostChat && !hostChat.busy) {\n hostChat.send(\n `Undo the last change to \"${siteTitle || target.title || 'this site'}\"`,\n undefined,\n target,\n );\n setMode('chat');\n return;\n }\n showToast(result.message);\n })\n .catch(() => showToast(\"Couldn't undo that change.\"))\n .finally(() => setUndoing(false));\n };\n\n // A list of actions: the native sheet on iOS; on Android a Web Builder sheet, since\n // Alert shows three buttons at most and the project menu has more.\n type MenuAction = { label: string; run: () => void; destructive?: boolean };\n const [menu, setMenu] = useState<{ title: string; actions: MenuAction[] } | null>(null);\n const showMenu = (title: string, actions: MenuAction[]) => {\n if (!actions.length) return;\n if (Platform.OS === 'ios') {\n ActionSheetIOS.showActionSheetWithOptions(\n {\n title,\n options: [...actions.map((a) => a.label), 'Cancel'],\n cancelButtonIndex: actions.length,\n destructiveButtonIndex: actions.findIndex((a) => a.destructive),\n },\n (index) => actions[index]?.run(),\n );\n return;\n }\n setMenu({ title, actions });\n };\n const chooseMenu = (action: MenuAction) => {\n setMenu(null);\n // Let the sheet close before the action opens anything of its own.\n setTimeout(action.run, 250);\n };\n\n // Download / Export (web #438 C4): the zip straight from the sandbox, else from the agent;\n // other hosts are agent turns with an `[Export] target=…` note.\n const askAgent = (text: string) => {\n if (!build || !hostChat || hostChat.busy) {\n showToast('Wait for the current turn to finish.');\n return;\n }\n hostChat.send(text, undefined, build);\n setMode('chat');\n };\n const downloadCode = () => {\n if (!build) return;\n const title = siteTitle || build.title || '';\n if (!onDownloadCode) {\n askAgent(exportMessage(title, 'zip'));\n return;\n }\n showToast('Preparing the code…');\n onDownloadCode(build)\n .then((url) => {\n if (url) Linking.openURL(url).catch(() => showToast(\"Couldn't open the download.\"));\n else askAgent(exportMessage(title, 'zip'));\n })\n .catch(() => askAgent(exportMessage(title, 'zip')));\n };\n const exportTo = (target: ExportTarget) => askAgent(exportTurn(siteTitle || build?.title || '', target));\n const pickExport = () =>\n showMenu(\n 'Export or deploy',\n EXPORT_TARGETS.map((t) => ({ label: t.label, run: () => exportTo(t.target) })),\n );\n\n // The site's code can be read: live files or saved code via the host, else the posted files.\n const canShowCode = Boolean(build?.files || (code && (build?.sandboxId || build?.liveUrl)));\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 // The live files (or the saved code) through the host; the posted files on an older host.\n if (canShowCode && mode !== 'code') {\n actions.push({ label: 'View code', run: () => setMode('code') });\n }\n if (build?.sandboxId && onUndo && !building && !undoing) {\n actions.push({ label: 'Undo last change', run: undoLast });\n }\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 (build?.sandboxId && !building) {\n actions.push({ label: 'Download code', run: downloadCode });\n if (hostChat) actions.push({ label: 'Export or deploy…', run: pickExport });\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 showMenu(siteTitle || 'Project', actions);\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 ask={hostChat?.ask ?? null}\n onAnswerAsk={(formatted) => hostChat?.send(formatted)}\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}\n steps={liveSteps}\n onPublish={() => setPublishOpen(true)}\n publishLabel={publishLabel}\n error={hostChat?.error ?? null}\n theme={theme}\n bottomInset={insets.bottom}\n viewport={viewport}\n onViewport={setViewport}\n onShowCode={canShowCode ? () => setMode('code') : undefined}\n />\n ) : null}\n {mode === 'code' ? (\n <View style={[styles.fill, { backgroundColor: theme.card, paddingBottom: insets.bottom }]}>\n {/* The same picker as the preview, in its place: Preview goes back to it. */}\n <View style={[styles.codeBar, { borderBottomColor: theme.border }]}>\n <ViewPicker\n value=\"code\"\n onPick={(picked) => {\n if (picked === 'preview') setMode('preview');\n }}\n canShowCode\n theme={theme}\n />\n <Text style={[styles.codeBarTitle, { color: theme.ink }]} numberOfLines={1}>\n Code\n </Text>\n </View>\n <CodeView\n files={build?.files ?? null}\n build={build}\n code={code}\n busy={Boolean(building) || Boolean(hostChat?.busy)}\n onWake={\n build && onResumePreview\n ? () =>\n onResumePreview(build).then((outcome) => {\n if (outcome === 'ok') setPreviewNonce((n) => n + 1);\n return outcome;\n })\n : undefined\n }\n theme={theme}\n onAsk={openChat}\n />\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 <Sheet visible={menu !== null} title={menu?.title ?? ''} onClose={() => setMenu(null)} theme={theme}>\n <View style={[styles.menuList, { paddingBottom: insets.bottom + 8 }]}>\n {(menu?.actions ?? []).map((action) => (\n <Tap\n key={action.label}\n onPress={() => chooseMenu(action)}\n accessibilityRole=\"button\"\n style={[styles.menuRow, { borderBottomColor: theme.border }]}\n pressedStyle={DIM}\n >\n <Text style={[styles.menuLabel, { color: action.destructive ? theme.crit : theme.ink }]}>\n {action.label}\n </Text>\n </Tap>\n ))}\n </View>\n </Sheet>\n <Toast message={toast} action={toastAction} theme={theme} bottom={insets.bottom + 80} />\n </GestureHandlerRootView>\n );\n}\n\nexport default WebBuilderExperience;\n\nconst styles = StyleSheet.create({\n codeBar: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 10,\n paddingHorizontal: 12,\n paddingVertical: 10,\n borderBottomWidth: StyleSheet.hairlineWidth,\n },\n codeBarTitle: { fontSize: 16, fontWeight: '700' },\n menuList: { paddingHorizontal: 4 },\n menuRow: { paddingVertical: 15, paddingHorizontal: 16, borderBottomWidth: StyleSheet.hairlineWidth },\n menuLabel: { fontSize: 16, fontWeight: '500' },\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 { Alert, BackHandler, Keyboard, Linking, Share, StyleSheet, Text, View } 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 { brandKitNote, isBareSeed, siteScoreTurn, studioTurnText } from './studioCatalog';\nimport { titleFromPrompt } from './buildFragments';\nimport { useBrandKit } from './brandKitStorage';\nimport { parseToolActivity } from '../chat/toolActivity';\nimport { firstContentLanded, friendlySteps } from './stepLabels';\nimport { restoreTurnNote } from './webbuilderPrompts';\nimport { webbuilderTheme } from './webbuilderTheme';\nimport type { WebBuilderHostChat } from './hostChat';\nimport type {\n WebBuilderBuild,\n WebBuilderBuilding,\n WebBuilderProject,\n WebBuilderPublishResult,\n WebBuilderPublishTools,\n WebBuilderProjectTools,\n WebBuilderUndoResult,\n WebBuilderRestoreResult,\n WebBuilderStartRequest,\n WebBuilderCodeHost,\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, ViewPicker, ViewportToggle } from './components/PreviewScreen';\nimport type { PreviewViewport } from './components/PreviewFrame';\nimport type { PreviewTrouble } 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, Sheet, Toast } from './components/ui';\nimport { exportMessage, exportTurn, type ExportTarget } from './exportCode';\nimport { ownCloudflareTurn } from './publishTools';\nimport {\n GithubPushSheet,\n ImportProjectSheet,\n IntegrationsSheet,\n ProjectMenuSheet,\n ProjectSettingsSheet,\n type ProjectMenuItem,\n type ProjectMenuSection,\n type ProjectSettingsMode,\n} from './components/ProjectSheets';\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?: (\n build: WebBuilderBuild,\n projectName: string,\n customDomain?: string,\n ) => Promise<WebBuilderPublishResult>;\n /** The Publish menu's domain, Unpublish and Review calls; older hosts omit it. */\n publishTools?: WebBuilderPublishTools;\n /** The project menu's settings, delete, GitHub and integrations calls; older hosts omit it. */\n projectTools?: WebBuilderProjectTools;\n /** Wake a sleeping preview without the agent; 'gone' when the sandbox was reclaimed. */\n onResumePreview?: (build: WebBuilderBuild, opts?: { asked?: boolean }) => Promise<'ok' | 'gone' | 'failed'>;\n /** Restore from saved copy: boot the build's restore point into a new sandbox. Without it the agent is asked. */\n onRestorePreview?: (build: WebBuilderBuild) => Promise<WebBuilderRestoreResult>;\n /** Sandboxes the host found gone while open (the keep-alive): their preview shows as cleaned up. */\n goneSandboxIds?: ReadonlySet<string>;\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 /** Instant Undo of the build's last change (web #443); without it the menu item is hidden. */\n onUndo?: (build: WebBuilderBuild) => Promise<WebBuilderUndoResult>;\n /** Bring back what the last Undo left. */\n onRedo?: (build: WebBuilderBuild) => Promise<WebBuilderUndoResult>;\n /** The Code view's calls (live files, saved code, edit and save, search); older hosts omit it. */\n code?: WebBuilderCodeHost;\n /** A signed link to the build's code as a zip, or null (then the agent is asked for it). */\n onDownloadCode?: (build: WebBuilderBuild) => Promise<string | null>;\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;\nconst TOAST_ACTION_MS = 6_000;\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 onRestorePreview,\n goneSandboxIds,\n onOpenCodezen,\n onUndo,\n onRedo,\n onDownloadCode,\n publishTools,\n projectTools,\n code,\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: brandKitNote(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 [toastAction, setToastAction] = useState<{ label: string; onPress: () => void } | null>(null);\n const toastTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const showToast = useCallback((message: string, action?: { label: string; onPress: () => void }) => {\n if (toastTimer.current) clearTimeout(toastTimer.current);\n setToast(message);\n setToastAction(action ?? null);\n // A toast with an action stays long enough to reach it.\n toastTimer.current = setTimeout(\n () => {\n setToast(null);\n setToastAction(null);\n },\n action ? TOAST_ACTION_MS : TOAST_MS,\n );\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 // The preview width, kept here so the code view's picker returns to it.\n const [viewport, setViewport] = useState<PreviewViewport>('phone');\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 the sandbox or restart its dev server (host). A sandbox\n // that was reclaimed shows as cleaned up, and restoring it from its saved copy is the\n // person's call - never an agent turn they did not ask for.\n const [waking, setWaking] = useState(false);\n const [trouble, setTrouble] = useState<PreviewTrouble | null>(null);\n const wokenFor = useRef<string | null>(null);\n useEffect(() => {\n wokenFor.current = null;\n }, [build?.key]);\n const goneNow = Boolean(build?.sandboxId && goneSandboxIds?.has(build.sandboxId));\n let previewTrouble: PreviewTrouble | null = null;\n if (trouble && build && trouble.key === build.key) previewTrouble = trouble;\n else if (goneNow && build) previewTrouble = { key: build.key, kind: 'gone' };\n const wakePreview = useCallback(\n (asked = false) => {\n if (!build || waking) return;\n if (!asked && wokenFor.current === build.key) return;\n // The agent owns the sandbox during its turn; the frame keeps checking until it ends (web #431).\n if (building || hostChat?.busy) return;\n wokenFor.current = build.key;\n if (!onResumePreview) {\n setTrouble({ key: build.key, kind: 'failed' });\n return;\n }\n const target = build;\n setWaking(true);\n setTrouble(null);\n onResumePreview(target, { asked })\n .catch(() => 'failed' as const)\n .then((outcome) => {\n if (outcome === 'ok') {\n setPreviewNonce((n) => n + 1);\n return;\n }\n setTrouble({ key: target.key, kind: outcome === 'gone' ? 'gone' : 'failed' });\n })\n .finally(() => setWaking(false));\n },\n [build, waking, building, onResumePreview, hostChat],\n );\n /** \"Ask the AI to restore it\": the restore point and why the app could not, as a hidden note. */\n const askAiToRestore = useCallback(\n (reason?: string | null, snapshotId?: string | null) => {\n if (!build || !hostChat || hostChat.busy) return;\n const name = siteTitle || build.title || 'my site';\n hostChat.send(\n `Restore \"${name}\" from its saved copy in a new sandbox and send me the preview link.\\n\\n${restoreTurnNote(\n {\n snapshotId: snapshotId ?? build.snapshotId,\n templateId: build.templateId,\n restoreError: reason,\n },\n )}`,\n undefined,\n build,\n );\n setTrouble(null);\n setMode('chat');\n },\n [build, hostChat, siteTitle],\n );\n const restoreFromSavedCopy = useCallback(() => {\n // One restore at a time: a second tap must not start another sandbox.\n if (!build || previewTrouble?.kind === 'restoring') return;\n if (!onRestorePreview) {\n askAiToRestore();\n return;\n }\n const target = build;\n setTrouble({ key: target.key, kind: 'restoring' });\n onRestorePreview(target)\n .catch((): WebBuilderRestoreResult => ({ ok: false, reason: 'The saved copy could not be opened.' }))\n .then((result) => {\n if (result.ok) {\n setTrouble(null);\n setPreviewNonce((n) => n + 1);\n showToast('Your site is back');\n return;\n }\n setTrouble({\n key: target.key,\n kind: 'restoreFailed',\n reason: result.reason,\n snapshotId: result.snapshotId,\n });\n });\n }, [build, previewTrouble?.kind, onRestorePreview, askAiToRestore, showToast]);\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 (\n target: WebBuilderBuild,\n projectName: string,\n customDomain?: string,\n ): Promise<WebBuilderPublishResult> => {\n if (!onPublish) return { ok: false, message: 'Publishing is not available here.' };\n const result = await onPublish(target, projectName, customDomain);\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 // Back from a site lands on Projects, where a site still building says so.\n onCloseProject();\n setHomeTab('projects');\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 // A site this turn is creating shows its starter template until the agent's first content pass lands.\n const turnBusy = Boolean(hostChat?.busy);\n const hadBuildsAtTurnStart = useRef(true);\n const wasTurnBusy = useRef(false);\n if (turnBusy !== wasTurnBusy.current) {\n wasTurnBusy.current = turnBusy;\n if (turnBusy) hadBuildsAtTurnStart.current = builds.length > 0;\n }\n const coverSteps = friendlySteps(liveSteps);\n const buildingCover =\n turnBusy && build && !hadBuildsAtTurnStart.current && !firstContentLanded(liveSteps)\n ? { title: siteTitle || build.title, step: coverSteps[coverSteps.length - 1]?.label ?? null }\n : null;\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 // Instant Undo (web #443): restore the version before the latest one in the sandbox, with a\n // short \"Undone · Redo\" toast. An agent build whose history cannot be read asks the agent.\n const [undoing, setUndoing] = useState(false);\n const undoLast = () => {\n if (!build || !onUndo || undoing) return;\n const target = build;\n setUndoing(true);\n onUndo(target)\n .then((result) => {\n if (result.ok) {\n setPreviewNonce((n) => n + 1);\n const redo =\n result.canRedo && onRedo\n ? () => {\n onRedo(target)\n .then((again) => {\n if (again.ok) setPreviewNonce((n) => n + 1);\n showToast(again.ok ? 'Redone' : again.message);\n })\n .catch(() => showToast(\"Couldn't redo that change.\"));\n }\n : undefined;\n showToast('Undone', redo ? { label: 'Redo', onPress: redo } : undefined);\n return;\n }\n if (result.askAgent && hostChat && !hostChat.busy) {\n hostChat.send(\n `Undo the last change to \"${siteTitle || target.title || 'this site'}\"`,\n undefined,\n target,\n );\n setMode('chat');\n return;\n }\n showToast(result.message);\n })\n .catch(() => showToast(\"Couldn't undo that change.\"))\n .finally(() => setUndoing(false));\n };\n\n // A list of actions: the native sheet on iOS; on Android a Web Builder sheet, since\n // Alert shows three buttons at most and the project menu has more.\n type MenuAction = { label: string; run: () => void; destructive?: boolean };\n const [menu, setMenu] = useState<{ title: string; actions: MenuAction[] } | null>(null);\n const chooseMenu = (action: MenuAction) => {\n setMenu(null);\n // Let the sheet close before the action opens anything of its own.\n setTimeout(action.run, 250);\n };\n\n // Download / Export (web #438 C4): the zip straight from the sandbox, else from the agent;\n // other hosts are agent turns with an `[Export] target=…` note.\n const askAgent = (text: string) => {\n if (!build || !hostChat || hostChat.busy) {\n showToast('Wait for the current turn to finish.');\n return;\n }\n hostChat.send(text, undefined, build);\n setMode('chat');\n };\n const downloadCode = () => {\n if (!build) return;\n const title = siteTitle || build.title || '';\n if (!onDownloadCode) {\n askAgent(exportMessage(title, 'zip'));\n return;\n }\n showToast('Preparing the code…');\n onDownloadCode(build)\n .then((url) => {\n if (url) Linking.openURL(url).catch(() => showToast(\"Couldn't open the download.\"));\n else askAgent(exportMessage(title, 'zip'));\n })\n .catch(() => askAgent(exportMessage(title, 'zip')));\n };\n const exportTo = (target: ExportTarget) => askAgent(exportTurn(siteTitle || build?.title || '', target));\n\n // The site's code can be read: live files or saved code via the host, else the posted files.\n const canShowCode = Boolean(build?.files || (code && (build?.sandboxId || build?.liveUrl)));\n\n // The project menu (web project menu): settings, rename, tools, import. Viewing code,\n // undo, publishing and exports have their own places (the view picker, Versions, Publish).\n const [projectMenuOpen, setProjectMenuOpen] = useState(false);\n const [settingsMode, setSettingsMode] = useState<ProjectSettingsMode | null>(null);\n const [githubOpen, setGithubOpen] = useState(false);\n const [integrationsOpen, setIntegrationsOpen] = useState(false);\n const [importOpen, setImportOpen] = useState(false);\n const filmDemo = () => {\n const demo = build && !building ? demoVideoSource(live, build.previewUrl) : null;\n if (!demo || !onOpenCodezen) return;\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 const projectMenu = (): ProjectMenuSection[] => {\n const view: ProjectMenuItem[] = [];\n if (mode !== 'chat')\n view.push({ key: 'chat', icon: 'message-outline', label: 'Back to the chat', run: () => setMode('chat') });\n if (build?.previewUrl && mode !== 'preview') {\n view.push({\n key: 'preview',\n icon: 'television-play',\n label: 'Open preview',\n run: () => setMode('preview'),\n });\n }\n if (builds.length > 1) {\n view.push({ key: 'versions', icon: 'history', label: 'Versions', run: () => setVersionsOpen(true) });\n }\n if (build?.previewUrl) {\n const url = live || build.previewUrl;\n view.push({\n key: 'browser',\n icon: 'open-in-new',\n label: 'Open in browser',\n run: () => {\n Linking.openURL(url).catch(() => undefined);\n },\n });\n }\n const project: ProjectMenuItem[] = projectTools\n ? [\n {\n key: 'settings',\n icon: 'tune-variant',\n label: 'Project settings',\n hint: 'Name, instructions for the AI, delete',\n run: () => setSettingsMode('settings'),\n },\n { key: 'rename', icon: 'pencil-outline', label: 'Rename', run: () => setSettingsMode('rename') },\n ]\n : [];\n const tools: ProjectMenuItem[] = [];\n if (projectTools && hostChat) {\n tools.push({\n key: 'integrations',\n icon: 'power-plug-outline',\n label: 'Integrations',\n hint: 'Stripe, email, Slack, AI…',\n run: () => setIntegrationsOpen(true),\n });\n }\n if (projectTools && build?.sandboxId) {\n tools.push({\n key: 'github',\n icon: 'github',\n label: 'GitHub',\n run: () => undefined,\n children: [\n {\n key: 'github-push',\n icon: 'github',\n label: 'Push to my GitHub',\n hint: 'Create or update a repo with this code',\n run: () => setGithubOpen(true),\n },\n ],\n });\n }\n const demo = build && !building ? demoVideoSource(live, build.previewUrl) : null;\n if (demo && onOpenCodezen) {\n tools.push({\n key: 'demo',\n icon: 'movie-open-outline',\n label: 'Demo video',\n hint: demo.stable ? 'Film the published site' : 'Publish first for a link that stays up',\n run: filmDemo,\n });\n }\n const more: ProjectMenuItem[] = [\n {\n key: 'import',\n icon: 'github',\n label: 'Import a project',\n hint: 'GitHub',\n run: () => setImportOpen(true),\n },\n ];\n return [{ items: [...project, ...view] }, { title: 'TOOLS', items: tools }, { items: more }];\n };\n const openMore = () => setProjectMenuOpen(true);\n // Instant Undo sits by the project's actions (web: beside the project name).\n const canUndo = Boolean(build?.sandboxId && onUndo && !building);\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 {canUndo ? (\n <Tap\n onPress={undoLast}\n disabled={undoing}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Undo the last change\"\n style={[styles.pillBtn, undoing && styles.disabled]}\n pressedStyle={DIM}\n testID=\"webbuilder-undo\"\n >\n <MaterialCommunityIcons name=\"undo-variant\" size={24} color={theme.ink} />\n </Tap>\n ) : null}\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 {mode === 'preview' ? (\n <ViewportToggle\n viewport={viewport}\n onViewport={setViewport}\n disabled={!build?.previewUrl}\n theme={theme}\n style={styles.pillBtn}\n />\n ) : null}\n {canUndo ? (\n <Tap\n onPress={undoLast}\n disabled={undoing}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Undo the last change\"\n style={[styles.pillBtn, undoing && styles.disabled]}\n pressedStyle={DIM}\n testID=\"webbuilder-undo\"\n >\n <MaterialCommunityIcons name=\"undo-variant\" size={24} color={theme.ink} />\n </Tap>\n ) : null}\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 previewDown={Boolean(previewTrouble && previewTrouble.kind !== 'restoring')}\n ask={hostChat?.ask ?? null}\n onAnswerAsk={(formatted) => hostChat?.send(formatted)}\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 onWake={() => wakePreview()}\n waking={waking}\n trouble={previewTrouble}\n onRetry={() => wakePreview(true)}\n onRestore={restoreFromSavedCopy}\n onAskAiRestore={hostChat ? askAiToRestore : undefined}\n agentBusy={Boolean(building) || 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 viewport={viewport}\n unpublished={Boolean(build?.sandboxId) && !build?.liveUrl}\n onShowCode={canShowCode ? () => setMode('code') : undefined}\n buildingCover={buildingCover}\n />\n ) : null}\n {mode === 'code' ? (\n <View style={[styles.fill, { backgroundColor: theme.card, paddingBottom: insets.bottom }]}>\n {/* The same picker as the preview, in its place: Preview goes back to it. */}\n <View style={[styles.codeBar, { borderBottomColor: theme.border }]}>\n <ViewPicker\n value=\"code\"\n onPick={(picked) => {\n if (picked === 'preview') setMode('preview');\n }}\n canShowCode\n theme={theme}\n />\n <Text style={[styles.codeBarTitle, { color: theme.ink }]} numberOfLines={1}>\n Code\n </Text>\n </View>\n <CodeView\n files={build?.files ?? null}\n build={build}\n code={code}\n busy={Boolean(building) || Boolean(hostChat?.busy)}\n onWake={\n build && onResumePreview\n ? () =>\n onResumePreview(build).then((outcome) => {\n if (outcome === 'ok') setPreviewNonce((n) => n + 1);\n return outcome;\n })\n : undefined\n }\n theme={theme}\n onAsk={openChat}\n />\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 <ProjectMenuSheet\n visible={projectMenuOpen}\n title={siteTitle || 'Project'}\n sections={projectMenuOpen ? projectMenu() : []}\n onClose={() => setProjectMenuOpen(false)}\n theme={theme}\n />\n {projectTools ? (\n <>\n <ProjectSettingsSheet\n visible={settingsMode !== null}\n mode={settingsMode ?? 'settings'}\n channelId={activeChannelId}\n title={siteTitle || 'New app'}\n tools={projectTools}\n aiBusy={Boolean(building) || Boolean(hostChat?.busy)}\n onSaved={() => showToast('Saved')}\n onDeleted={() => {\n showToast('Project deleted');\n onCloseProject();\n setHomeTab('projects');\n onRefreshProjects?.();\n }}\n onClose={() => setSettingsMode(null)}\n theme={theme}\n />\n <GithubPushSheet\n visible={githubOpen}\n build={build}\n channelId={activeChannelId}\n title={siteTitle || build?.title || ''}\n tools={projectTools}\n onStarted={(message) => {\n showToast(message);\n setMode('chat');\n }}\n onClose={() => setGithubOpen(false)}\n theme={theme}\n />\n <IntegrationsSheet\n visible={integrationsOpen}\n channelId={activeChannelId}\n tools={projectTools}\n aiBusy={Boolean(building) || Boolean(hostChat?.busy)}\n onRequest={(text) => askAgent(text)}\n onClose={() => setIntegrationsOpen(false)}\n theme={theme}\n />\n </>\n ) : null}\n <ImportProjectSheet\n visible={importOpen}\n onImport={(turn) => {\n onStartProject({ text: turn, template: null, agent: true });\n }}\n onClose={() => setImportOpen(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 liveUrl={live}\n aiBusy={Boolean(building) || Boolean(hostChat?.busy)}\n tools={publishTools}\n onDownloadCode={build?.sandboxId && !building ? downloadCode : undefined}\n onExport={hostChat && !building ? exportTo : undefined}\n onOwnCloudflare={\n hostChat && !building\n ? () => askAgent(ownCloudflareTurn(siteTitle || build?.title || ''))\n : undefined\n }\n onFixWithAi={hostChat ? (text) => askAgent(text) : undefined}\n onUnpublished={() => showToast('The site is offline now.')}\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 <Sheet visible={menu !== null} title={menu?.title ?? ''} onClose={() => setMenu(null)} theme={theme}>\n <View style={[styles.menuList, { paddingBottom: insets.bottom + 8 }]}>\n {(menu?.actions ?? []).map((action) => (\n <Tap\n key={action.label}\n onPress={() => chooseMenu(action)}\n accessibilityRole=\"button\"\n style={[styles.menuRow, { borderBottomColor: theme.border }]}\n pressedStyle={DIM}\n >\n <Text style={[styles.menuLabel, { color: action.destructive ? theme.crit : theme.ink }]}>\n {action.label}\n </Text>\n </Tap>\n ))}\n </View>\n </Sheet>\n <Toast message={toast} action={toastAction} theme={theme} bottom={insets.bottom + 80} />\n </GestureHandlerRootView>\n );\n}\n\nexport default WebBuilderExperience;\n\nconst styles = StyleSheet.create({\n codeBar: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 10,\n paddingHorizontal: 12,\n paddingVertical: 10,\n borderBottomWidth: StyleSheet.hairlineWidth,\n },\n codeBarTitle: { fontSize: 16, fontWeight: '700' },\n menuList: { paddingHorizontal: 4 },\n menuRow: { paddingVertical: 15, paddingHorizontal: 16, borderBottomWidth: StyleSheet.hairlineWidth },\n menuLabel: { fontSize: 16, fontWeight: '500' },\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","project"],"mappings":"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"}
|
|
@@ -216,12 +216,32 @@ function pendingWork(posts) {
|
|
|
216
216
|
}
|
|
217
217
|
function isGenericTitle(title) {
|
|
218
218
|
const t = (title || "").trim().toLowerCase();
|
|
219
|
-
return !t || t === "generated page" || t === "generated project" || t === "generated with cdecli" || t === "ai assistant" || t === "web app" ||
|
|
219
|
+
return !t || t === "generated page" || t === "generated project" || t === "generated with cdecli" || t === "ai assistant" || t === "web app" || // The placeholder a site carries before it has a name; a saved one is not a rename.
|
|
220
|
+
/^new (site|app)$/.test(t) || /^build \d+$/.test(t) || /^build\s+me\b/.test(t) || /^remix\s+the\b/.test(t) || /^(build|chat)[- ]channel\b/.test(t) || t.startsWith("selected skill") || /^code[\s_-]?assist/.test(t);
|
|
220
221
|
}
|
|
221
222
|
const TITLE_STOP_WORDS = /* @__PURE__ */ new Set(["a", "an", "the", "create", "build", "make", "please", "me", "my", "for", "with", "simple", "using", "from", "template", "to", "and", "or", "remix", "yantra"]);
|
|
222
223
|
function titleCase(words) {
|
|
223
224
|
return words.map((w) => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase()).join(" ");
|
|
224
225
|
}
|
|
226
|
+
const KNOWN_NOTE_RE = /^\[(?:Project channelId=[^\]\n]*|Database slug=[^\]\n]*|\d+ attachment\(s\)|Mode: [a-z]+|Project instructions|Approved plan|Reference site|UI kit|Style direction|Database|AI in the app|Integrations|Element|Fix error|Hand edits|Open build|Open site|Inspired by|New site|Template|Brand kit|Imported project|Export|Asset|Figma|File text)\]/;
|
|
227
|
+
const NOTE_LINE_RE = /^\[(?:[A-Z][A-Za-z]*(?: [A-Za-z]+){0,3}|[A-Z][A-Za-z ]*=[^\]\n]*|\d+ attachment\(s\))\]/;
|
|
228
|
+
const LEGACY_BRAND_BLOCK_RE = /^Brand kit \(follow it\):\s*$/;
|
|
229
|
+
const REFERENCE_WRAPPER_RE = /^Using “[^”]*” as reference \(do not edit that sandbox\)\.\nCreate a new app from the user request below\.\n\n/;
|
|
230
|
+
function stripAgentNote(content) {
|
|
231
|
+
const lines = String(content || "").replace(REFERENCE_WRAPPER_RE, "").replace(/\r\n?/g, "\n").split("\n");
|
|
232
|
+
let cut = lines.length;
|
|
233
|
+
for (let i = 0; i < lines.length; i++) {
|
|
234
|
+
const line = lines[i].trimStart();
|
|
235
|
+
if (KNOWN_NOTE_RE.test(line) || LEGACY_BRAND_BLOCK_RE.test(line) || i > 0 && !lines[i - 1].trim() && NOTE_LINE_RE.test(line)) {
|
|
236
|
+
cut = i;
|
|
237
|
+
break;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
return lines.slice(0, cut).join("\n").trim();
|
|
241
|
+
}
|
|
242
|
+
function userBubbleText(content) {
|
|
243
|
+
return stripAgentNote(content).replace(/^\s*Build me:\s*/i, "");
|
|
244
|
+
}
|
|
225
245
|
function cleanPrompt(text) {
|
|
226
246
|
return text.replace(/^\[webbuilder context:[^\]]*\]\s*/i, "").replace(/^build\s*me\s*:\s*/i, "").replace(/\s+/g, " ").trim();
|
|
227
247
|
}
|
|
@@ -252,8 +272,15 @@ function titleFromPackageJson(files) {
|
|
|
252
272
|
return null;
|
|
253
273
|
}
|
|
254
274
|
}
|
|
275
|
+
function siteNameFromRequest(text) {
|
|
276
|
+
var _a, _b, _c;
|
|
277
|
+
const t = String(text != null ? text : "");
|
|
278
|
+
const m = (_b = (_a = t.match(/^[ \t-]*Brand name:\s*([^\n]{2,40})$/im)) != null ? _a : t.match(/\b(?:called|named)\s+["“'‘]([^"”'’\n]{2,40})["”'’]/i)) != null ? _b : t.match(/\b(?:called|named)\s+([A-Z0-9][\w&'’.-]*(?:\s+(?:&|and|[A-Z0-9][\w&'’.-]*))*)/);
|
|
279
|
+
const name = (_c = m == null ? void 0 : m[1]) == null ? void 0 : _c.split(/[.!?]\s/)[0].replace(/\s+(?:&|and)$/i, "").replace(/[.,;:!?]+$/, "").trim();
|
|
280
|
+
return name && name.length >= 2 ? name : null;
|
|
281
|
+
}
|
|
255
282
|
function resolveSiteTitle(opts) {
|
|
256
|
-
const candidates = [opts.fragmentTitle, titleFromPrompt(opts.userPrompt), opts.channelTitle, titleFromPackageJson(opts.files)];
|
|
283
|
+
const candidates = [opts.fragmentTitle, siteNameFromRequest(opts.requestText), titleFromPrompt(opts.userPrompt), opts.channelTitle, titleFromPackageJson(opts.files)];
|
|
257
284
|
const found = candidates.find((c) => c && !isGenericTitle(c));
|
|
258
285
|
return (found || "Generated Page").trim();
|
|
259
286
|
}
|
|
@@ -268,7 +295,8 @@ function projectFromPosts(channel, posts, cdnOrigin) {
|
|
|
268
295
|
const builds = buildsFromPosts(posts, "", cdnOrigin);
|
|
269
296
|
const latest = builds[0];
|
|
270
297
|
if (!latest) return null;
|
|
271
|
-
const
|
|
298
|
+
const userPosts = chronological(posts).filter((post) => isUserPost(post) && str(post.message));
|
|
299
|
+
const userPrompts = userPosts.map((post) => stripAgentNote(String(post.message))).filter(Boolean);
|
|
272
300
|
const brief = (_a = userPrompts.find((m) => /build\s*me\s*:/i.test(m))) != null ? _a : userPrompts[0];
|
|
273
301
|
const rawChannelTitle = [channel.displayName, channel.title].map((t) => str(t)).find((t) => t && !isGenericTitle(t));
|
|
274
302
|
const channelTitle = rawChannelTitle && /^(build|create|make)\b/i.test(rawChannelTitle) ? (_b = titleFromPrompt(rawChannelTitle)) != null ? _b : rawChannelTitle : rawChannelTitle;
|
|
@@ -276,6 +304,7 @@ function projectFromPosts(channel, posts, cdnOrigin) {
|
|
|
276
304
|
fragmentTitle: latest.title,
|
|
277
305
|
channelTitle,
|
|
278
306
|
userPrompt: brief,
|
|
307
|
+
requestText: userPosts.length ? String(userPosts[0].message) : null,
|
|
279
308
|
files: latest.files
|
|
280
309
|
});
|
|
281
310
|
const updated = Date.parse(String((_d = (_c = channel.updatedAt) != null ? _c : channel.createdAt) != null ? _d : ""));
|
|
@@ -420,7 +449,4 @@ function isWorkflowTurnPost(post) {
|
|
|
420
449
|
}
|
|
421
450
|
function hasWorkflowPosts(posts) {
|
|
422
451
|
return posts.some((post) => readFragment(post) !== null || isWorkflowTurnPost(post));
|
|
423
|
-
}
|
|
424
|
-
function stripAgentNote(content) {
|
|
425
|
-
return content.replace(/\n*\[(?:Template|Open build|Export|Hand edits)\][\s\S]*$/, "").trim();
|
|
426
|
-
}export{DEFAULT_TEMPLATE,buildsFromPosts,cacheBustedUrl,cleanPrompt,coverDisplayUrl,displayAgentText,displayHost,hasWorkflowPosts,isErrorPost,isGenericTitle,isThinkingPost,isValidPublishSlug,lastMessageHasCover,liveUrlFrom,pendingWork,previewFrom,progressText,projectFromPosts,publishSlug,readFragment,relativeTime,resolveSiteTitle,sandboxPreviewUrl,siteNameFrom,snapshotFrom,stripAgentNote,titleFromPrompt,transcriptFromPosts,turnState};//# sourceMappingURL=buildFragments.js.map
|
|
452
|
+
}export{DEFAULT_TEMPLATE,buildsFromPosts,cacheBustedUrl,cleanPrompt,coverDisplayUrl,displayAgentText,displayHost,hasWorkflowPosts,isErrorPost,isGenericTitle,isThinkingPost,isValidPublishSlug,lastMessageHasCover,liveUrlFrom,pendingWork,previewFrom,progressText,projectFromPosts,publishSlug,readFragment,relativeTime,resolveSiteTitle,sandboxPreviewUrl,siteNameFrom,siteNameFromRequest,snapshotFrom,stripAgentNote,titleFromPrompt,transcriptFromPosts,turnState,userBubbleText};//# sourceMappingURL=buildFragments.js.map
|