@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":"useWebBuilderHost.js","sources":["../../../src/screens/WebBuilderNative/useWebBuilderHost.ts"],"sourcesContent":["/**\n * The host half of the native Web Builder: everything that needs the app's\n * data stack, so Apollo stays out of the federated bundle.\n *\n * Same lane as the web Web Builder surface (`standalone/realServices`):\n * - a site is a chat (AIASSISTANT channel) holding builds; the list is the web\n * gallery's (`useWebBuilderGallery`),\n * - templates and the org's build workflow come from the Code Assistant\n * settings (`pageSettings`), read with the app's surface session,\n * - every build or edit runs `yantra-webbuilder/WEBBUILDER_TRIGGER_WORKFLOW` on\n * cdecli-agent with the web's payload (new / template remix / edit),\n * - the result comes back on the chat: its posts are polled every 2.5 s while a\n * turn runs (plus the live subscription), and the builds, the agent's\n * transcript and its progress line are read from them,\n * - publish is `aiCodeDeployToCloudflare`; the live address comes back on a post.\n */\nimport { useCallback, useEffect, useMemo, useRef, useState, useSyncExternalStore } from 'react';\nimport { useAiCodeDeployToCloudflareMutation } from 'common/graphql';\nimport { v4 as uuidv4 } from 'uuid';\nimport AsyncStorage from '@react-native-async-storage/async-storage';\nimport { useCdecliConnection } from '../../contexts/CdecliConnectionContext';\nimport { useChatStream, type UseChatStreamRouting, MessageAttachment } from '../../hooks/useChatStream';\nimport { useHostChatChannel } from '../../hooks/useHostChatChannel';\nimport { config } from '../../config/env-config';\nimport { historyRunningChannelIds, subscribeRememberedHistory, useChatMessages } from '../../hooks/useChatApi';\nimport { usePrerequisiteIds } from '../../hooks/usePrerequisiteIds';\nimport { useCanvasSession } from '../../features/canvas/useCanvasSession';\nimport { tokenClaims } from '../../features/canvas/sessionIdentity';\nimport type { AgentChatMessage } from '../../features/agent-chat';\nimport {\n buildsFromPosts,\n displayAgentText,\n hasWorkflowPosts,\n pendingWork,\n stripAgentNote,\n titleFromPrompt,\n projectFromPosts,\n transcriptFromPosts,\n turnState,\n} from '../../features/webbuilder/buildFragments';\nimport type { WebBuilderHostChat } from '../../features/webbuilder/hostChat';\nimport type {\n WebBuilderBuild,\n WebBuilderBuilding,\n WebBuilderProject,\n WebBuilderPublishResult,\n WebBuilderStartRequest,\n WebBuilderUndoResult,\n WebBuilderCodeHost,\n} from '../../features/webbuilder/types';\nimport { handEditsNote, savedCodeSource } from '../../features/webbuilder/codeFiles';\nimport { createCodeWorkspace } from './codeWorkspaceApi';\nimport {\n buildTriggerParams,\n newObjectId,\n templateRemixNote,\n WEBBUILDER_CHAT_SKILL,\n type WebBuilderTemplate,\n} from '../../features/webbuilder/workflow';\nimport { useWebBuilderGallery } from './useWebBuilderGallery';\nimport { agentEditNote, agentPublishMessage } from '../../features/webbuilder/webbuilderPrompts';\nimport { useCodeAssistantCatalog } from './useCodeAssistantCatalog';\nimport {\n createSandboxRouter,\n directSandboxRun,\n restoreSandbox,\n triggerBuild,\n uploadAttachment,\n type ResumeOutcome,\n} from './webbuilderTransport';\nimport { useSandboxProxyApi } from './sandboxProxyApi';\nimport { useSandboxKeepAlive } from './useSandboxKeepAlive';\nimport { pendingAskUser } from '../../features/chat/askUser';\nimport { markBuildDone, runningBuild, useRunningBuilds } from './runningBuilds';\nimport { isAgentSite } from './siteLane';\nimport { redoChange, undoLastChange, type WebbuilderVersion } from './versionUndo';\nimport { WEBBUILDER_EXPORT_ZIP_ACTION, exportZipParams, exportZipUrl } from '../../features/webbuilder/exportCode';\nimport { applyRestored, useRestoredSandboxes } from './useRestoredSandboxes';\nimport { useWebBuilderJobs, type WebBuilderJob } from './useWebBuilderJobs';\n\n/** The web's read-back cadence and ceiling (`POLL_MS`, `POLL_TIMEOUT_MS`). */\nconst POLL_MS = 2_500;\n/** Agent-chat sites this device adopted as projects. */\nconst ADOPTED_KEY = 'yantra.webbuilder.adopted.v1';\nconst TURN_TIMEOUT_MS = 15 * 60 * 1000;\n/**\n * A started build posts progress within seconds. A trigger that reported success but\n * never posts back (e.g. a form with no functions) fails here, not at the ceiling.\n */\nconst NO_REPLY_TIMEOUT_MS = 3 * 60 * 1000;\n\ninterface RunningTurn {\n channelId: string;\n text: string;\n startedAt: number;\n mode: 'new' | 'remix' | 'edit';\n /** The turn's task (a server surface job), settled when the turn ends. */\n job: Promise<WebBuilderJob>;\n}\n\n/** What an agent-chat turn records as its task. */\ninterface AgentTurnJob {\n mode: 'new' | 'remix' | 'edit';\n siteTitle?: string | null;\n}\n\nexport interface WebBuilderHost {\n projects: WebBuilderProject[];\n projectsLoading: boolean;\n projectsError: string | null;\n projectsHasMore: boolean;\n refreshProjects: () => void;\n loadMoreProjects: () => void;\n templates: WebBuilderTemplate[];\n templatesLoading: boolean;\n templatesError: string | null;\n reloadTemplates: () => void;\n startBlocked: string | null;\n /** Why the last Start did not go out (e.g. builds not set up), shown under the composer. */\n startNotice: string | null;\n activeChannelId: string | null;\n openProject: (channelId: string) => void;\n closeProject: () => void;\n startProject: (request: WebBuilderStartRequest) => void;\n builds: WebBuilderBuild[];\n buildsLoading: boolean;\n building: WebBuilderBuilding | null;\n publishing: boolean;\n hostChat: WebBuilderHostChat;\n publish: (build: WebBuilderBuild, projectName: string) => Promise<WebBuilderPublishResult>;\n /**\n * Wake a sleeping preview (resume the sandbox, restart its dev server) or, when\n * the sandbox expired, boot its restore point into a new one (web `ensurePreview`).\n */\n resumePreview: (build: WebBuilderBuild) => Promise<ResumeOutcome>;\n /** Instant Undo of the build's last change, straight in its sandbox (web #443). */\n undo: (build: WebBuilderBuild) => Promise<WebBuilderUndoResult>;\n /** Bring back what the last Undo on this build left. */\n redo: (build: WebBuilderBuild) => Promise<WebBuilderUndoResult>;\n /** A signed link to the build's code as a zip (`WEBBUILDER_EXPORT_ZIP`), or null. */\n downloadCode: (build: WebBuilderBuild) => Promise<string | null>;\n /** The Code view: the site's live files (or its saved code), edit and save, search. */\n code: WebBuilderCodeHost;\n}\n\nfunction notSetUp(org: string): string {\n return `Builds are not set up for ${org || 'this workspace'} yet. Ask an admin to configure the Code Assistant templates.`;\n}\n\nfunction failureText(error: string): string {\n if (/\\b401\\b|unauthori[sz]ed/i.test(error)) return 'Your sign-in was not accepted. Try again in a moment.';\n if (/network|fetch|timed out/i.test(error))\n return \"Couldn't reach the build service. Check your connection and try again.\";\n return \"The build didn't start. Try again.\";\n}\n\nexport function useWebBuilderHost(routeOrg?: string): WebBuilderHost {\n const { orgName, projectId: appProjectId } = usePrerequisiteIds();\n const session = useCanvasSession();\n const { token, indexUrl, graphqlUrl } = session;\n const sessionOrg = String(tokenClaims(token).orgName ?? '');\n const effectiveOrg = routeOrg || orgName || sessionOrg || '';\n const tokenRef = useRef(token);\n tokenRef.current = token;\n\n // ── Templates and the org's build workflow (the app backend's pageSettings) ──\n const catalog = useCodeAssistantCatalog(effectiveOrg);\n const reloadTemplates = catalog.reload;\n\n // ── Your builds ────────────────────────────────────────────────────────\n const cdnOrigin = config.AWS_CDN_URL;\n const gallery = useWebBuilderGallery(effectiveOrg, cdnOrigin);\n const { projects, refresh: refreshProjects, upsert: upsertProject } = gallery;\n\n // ── The open site ──────────────────────────────────────────────────────\n const [activeChannelId, setActiveChannelId] = useState<string | null>(null);\n const projectIds = useRef(new Map<string, string>());\n const { posts: rawPosts, refetch } = useChatMessages(activeChannelId);\n const posts = useMemo(() => (activeChannelId ? (rawPosts as unknown[]) : []), [activeChannelId, rawPosts]);\n const activeProject = projects.find((p) => p.channelId === activeChannelId);\n const postBuilds = useMemo(\n () => buildsFromPosts(posts, activeProject?.title, cdnOrigin),\n [posts, activeProject?.title, cdnOrigin],\n );\n\n // ── The agent-chat lane: template remixes and sites built from chat ─────\n // The web sends a template pick to the agent chat (webbuilder-design-pro) with a\n // note naming the snapshot to boot (#384). Here that chat is the app's gateway\n // chat with the same skill; its posts land on the site's chat like any other.\n const cdecli = useCdecliConnection();\n const { setActiveChannelId: setCdecliChannel } = cdecli;\n const [agentChannelId, setAgentChannelId] = useState<string>(() => uuidv4());\n // The agent's open question, as of the last render (set where it is read from the chat).\n const pendingAskRef = useRef<{ requestId: string } | null>(null);\n // Files saved by hand in the Code view since the last turn: the next turn keeps them.\n const handEditsRef = useRef<Array<{ file: string; summary: string }>>([]);\n const agentChannels = useRef(new Set<string>());\n const unsavedAgentChannels = useRef(new Set<string>());\n const pendingAgentTurn = useRef<{\n channelId: string;\n text: string;\n files?: MessageAttachment[];\n job?: AgentTurnJob;\n } | null>(null);\n useEffect(() => {\n setCdecliChannel(agentChannelId);\n return undefined;\n }, [agentChannelId, setCdecliChannel]);\n const { ensureChannel } = useHostChatChannel({\n channelId: agentChannelId,\n orgName: effectiveOrg,\n projectId: appProjectId ?? '',\n label: 'WebBuilderNative',\n });\n const chatRouting: UseChatStreamRouting = useMemo(\n () => ({\n channelConnected: cdecli.channelConnected,\n accountId: cdecli.accountId,\n persistenceMode: cdecli.persistenceMode ?? 'backend',\n recoverAgentAuth: cdecli.recoverAgentAuth,\n skill: WEBBUILDER_CHAT_SKILL,\n }),\n [cdecli.channelConnected, cdecli.accountId, cdecli.persistenceMode, cdecli.recoverAgentAuth],\n );\n const chat = useChatStream(agentChannelId, chatRouting);\n // Which chat the open site lives in. `agentChannels` is this mount's memory, so after a\n // reload the site's own evidence decides: a run recorded on the agent lane, or its agent\n // chat (the stream is on the open site after `openProject`) holding turns while its posts\n // carry no build-workflow fragments.\n const streamOnSite = activeChannelId !== null && agentChannelId === activeChannelId;\n const workflowPosts = hasWorkflowPosts(posts);\n const agentLane =\n activeChannelId !== null &&\n isAgentSite({\n rememberedAgent: agentChannels.current.has(activeChannelId),\n runLane: runningBuild(activeChannelId)?.lane,\n postCount: posts.length,\n workflowPosts,\n streamMessages: streamOnSite ? chat.messages.length : 0,\n });\n if (__DEV__ && activeChannelId) {\n // eslint-disable-next-line no-console\n console.log('[WebBuilderNative] lane', {\n channel: activeChannelId,\n agentLane,\n posts: posts.length,\n workflowPosts,\n streamMessages: streamOnSite ? chat.messages.length : null,\n streaming: chat.isLoading || chat.isStreaming,\n });\n }\n const agentBusy = agentLane && (chat.isLoading || chat.isStreaming);\n\n // ── Agent-chat sites as projects (web `adoptAgentProject`, #388) ───────\n // Adopted, a site's builds are recorded on its channel (sandbox, key, restore point): what\n // the project proxy checks before Code, Undo, Download or a wake touch its sandbox.\n const sandboxApi = useSandboxProxyApi();\n const adoptedRef = useRef<Set<string>>(new Set());\n const adoptingRef = useRef(new Map<string, Promise<boolean>>());\n useEffect(() => {\n AsyncStorage.getItem(ADOPTED_KEY)\n .then((raw) => {\n const ids = raw ? (JSON.parse(raw) as unknown) : [];\n if (Array.isArray(ids)) ids.forEach((id) => typeof id === 'string' && adoptedRef.current.add(id));\n })\n .catch(() => undefined);\n }, []);\n const { adoptAgentProject } = sandboxApi;\n const ensureAdopted = useCallback(\n (channelId: string, title: string): Promise<boolean> => {\n if (adoptedRef.current.has(channelId)) return Promise.resolve(true);\n const pending = adoptingRef.current.get(channelId);\n if (pending) return pending;\n const run = adoptAgentProject(channelId, title)\n .then((adopted) => {\n if (adopted) {\n adoptedRef.current.add(channelId);\n AsyncStorage.setItem(ADOPTED_KEY, JSON.stringify([...adoptedRef.current].slice(-500))).catch(\n () => undefined,\n );\n }\n return adopted;\n })\n .finally(() => adoptingRef.current.delete(channelId));\n adoptingRef.current.set(channelId, run);\n return run;\n },\n [adoptAgentProject],\n );\n\n // A build or edit turn is a task: its job rides on the turn so the agent settles it.\n const jobs = useWebBuilderJobs(effectiveOrg);\n const agentJob = useRef<{ channelId: string; job: WebBuilderJob } | null>(null);\n const sendAgentTurn = useCallback(\n (channelId: string, text: string, files?: MessageAttachment[], task?: AgentTurnJob) => {\n // A site started here is created by its first message, not by opening it.\n const ready = unsavedAgentChannels.current.has(channelId) ? ensureChannel() : Promise.resolve();\n const recorded = task\n ? jobs.begin({\n channelId,\n ask: text,\n siteTitle: task.siteTitle,\n mode: task.mode,\n lane: 'agent',\n startedAt: Date.now(),\n })\n : Promise.resolve(null);\n // Adopted before the turn: the agent's build record is then accepted on the channel.\n const adopted = ready.then(() =>\n ensureAdopted(channelId, task?.siteTitle || titleFromPrompt(stripAgentNote(text)) || 'New site').catch(\n () => false,\n ),\n );\n Promise.all([adopted, recorded])\n .then(([, job]) => {\n unsavedAgentChannels.current.delete(channelId);\n if (job) agentJob.current = { channelId, job };\n return chat.sendMessage(text, files, channelId, false, undefined, { job: job?.ref });\n })\n .then((outcome) => {\n if (outcome !== 'failed' || agentJob.current?.channelId !== channelId) return;\n jobs.finish(agentJob.current.job, {\n ok: false,\n endedAt: Date.now(),\n error: 'The message did not reach Web Builder.',\n });\n agentJob.current = null;\n })\n .catch(() => undefined);\n },\n [chat, ensureChannel, jobs, ensureAdopted],\n );\n // A remix's first turn goes out once the stream and ensureChannel are on its chat.\n useEffect(() => {\n const pending = pendingAgentTurn.current;\n if (!pending || pending.channelId !== agentChannelId) return;\n pendingAgentTurn.current = null;\n sendAgentTurn(pending.channelId, pending.text, pending.files, pending.job);\n }, [agentChannelId, sendAgentTurn]);\n // A finished agent turn: read the chat again so its preview link becomes the build.\n const wasAgentBusy = useRef(false);\n useEffect(() => {\n if (wasAgentBusy.current && !agentBusy) refetch().catch(() => undefined);\n wasAgentBusy.current = agentBusy;\n }, [agentBusy, refetch]);\n\n // An agent-chat site's preview link shows the moment the reply names it, before the post is re-read.\n const { restored, remember: rememberRestored } = useRestoredSandboxes();\n const builds = useMemo(() => {\n if (postBuilds.length || !agentLane) return applyRestored(postBuilds, restored);\n const now = Date.now();\n return buildsFromPosts(\n chat.messages.map((m, index) => ({\n id: `live-${index}`,\n message: m.content,\n props: { role: m.role === 'user' ? 'USER' : 'ASSISTANT' },\n createdAt: new Date(now + index).toISOString(),\n })),\n activeProject?.title,\n cdnOrigin,\n );\n }, [postBuilds, agentLane, chat.messages, activeProject?.title, cdnOrigin, restored]);\n\n // The agent turn carrying a task ended on its chat: settle the task (the agent's own\n // verdict stands when it reported first). A turn left running because another site was\n // opened is the agent's, or the server deadline's, to end.\n const chatBusy = chat.isLoading || chat.isStreaming;\n const wasChatBusy = useRef(false);\n useEffect(() => {\n const ended = wasChatBusy.current && !chatBusy;\n wasChatBusy.current = chatBusy;\n const running = agentJob.current;\n if (!ended || !running || running.channelId !== agentChannelId) return;\n agentJob.current = null;\n jobs.finish(\n running.job,\n chat.error\n ? { ok: false, endedAt: Date.now(), error: chat.error }\n : { ok: true, endedAt: Date.now(), build: activeChannelId === running.channelId ? builds[0] : null },\n );\n }, [chatBusy, agentChannelId, chat.error, activeChannelId, builds, jobs]);\n\n // The open site keeps its tile current (a new site appears, a rename or a publish shows).\n useEffect(() => {\n if (!activeChannelId || posts.length === 0) return;\n const row = projectFromPosts({ id: activeChannelId, title: activeProject?.title }, posts, cdnOrigin);\n if (row) upsertProject(row);\n }, [activeChannelId, posts, cdnOrigin, upsertProject, activeProject?.title]);\n\n // ── A running turn ─────────────────────────────────────────────────────\n const [turn, setTurn] = useState<RunningTurn | null>(null);\n const [turnError, setTurnError] = useState<string | null>(null);\n const state = useMemo(\n () => (turn && turn.channelId === activeChannelId ? turnState(posts, turn.startedAt) : null),\n [turn, activeChannelId, posts],\n );\n useEffect(() => {\n if (!turn || !state) return;\n if (state.status === 'done') {\n setTurn(null);\n jobs.finish(turn.job, { ok: true, endedAt: Date.now(), build: postBuilds[0] ?? null });\n }\n if (state.status === 'failed') {\n setTurn(null);\n setTurnError(state.error);\n jobs.finish(turn.job, { ok: false, endedAt: Date.now(), error: state.error || \"The build didn't finish.\" });\n }\n }, [turn, state, postBuilds, jobs]);\n // Whether the open turn's chat posted back yet; only known while its chat is open.\n const heardRef = useRef<{ startedAt: number; watching: boolean; heard: boolean } | null>(null);\n if (turn) {\n const prev = heardRef.current?.startedAt === turn.startedAt ? heardRef.current : null;\n heardRef.current = {\n startedAt: turn.startedAt,\n watching: state !== null,\n heard: Boolean(prev?.heard || state?.heard),\n };\n }\n // The web polls while a turn runs: the post that carries the build's fragment\n // (`propsConfiguration.contents`) arrives on the thread read, not the subscription.\n useEffect(() => {\n if (!turn) return undefined;\n const timer = setInterval(() => {\n const elapsed = Date.now() - turn.startedAt;\n const seen = heardRef.current;\n const unanswered = seen?.startedAt === turn.startedAt && seen.watching && !seen.heard;\n if (unanswered && elapsed > NO_REPLY_TIMEOUT_MS) {\n const noReply = \"The build didn't start - nothing came back from the builder. Please try again.\";\n setTurn(null);\n setTurnError(noReply);\n jobs.finish(turn.job, { ok: false, endedAt: Date.now(), error: noReply });\n return;\n }\n if (elapsed > TURN_TIMEOUT_MS) {\n const tooLong = 'The build is taking too long. It may still finish; reopen the site later to check.';\n setTurn(null);\n setTurnError(tooLong);\n jobs.finish(turn.job, { ok: false, endedAt: Date.now(), error: tooLong });\n return;\n }\n refetch().catch(() => undefined);\n }, POLL_MS);\n return () => clearInterval(timer);\n }, [turn, refetch, jobs]);\n\n const runTurn = useCallback(\n async (opts: {\n channelId: string;\n projectId: string;\n text: string;\n template: WebBuilderTemplate | null;\n edit: WebBuilderBuild | null;\n referenceUrl?: string;\n attachments?: MessageAttachment[];\n }): Promise<string | null> => {\n const { current } = tokenRef;\n if (!current || !indexUrl) return 'Web Builder is still signing in. Try again in a moment.';\n let mode: RunningTurn['mode'] = 'new';\n if (opts.edit) mode = 'edit';\n else if (opts.template?.snapshotId) mode = 'remix';\n const uploaded = (\n await Promise.all(\n (opts.attachments ?? []).map((file) =>\n uploadAttachment(current, indexUrl, {\n name: file.name,\n url: file.url,\n dataUrl: file.dataUrl,\n mimeType: file.mimeType,\n }),\n ),\n )\n ).filter((f): f is NonNullable<typeof f> => f !== null);\n const built = buildTriggerParams({\n channelId: opts.channelId,\n projectId: opts.projectId,\n text: opts.text,\n template: opts.template ?? undefined,\n defaults: catalog.defaults,\n mode,\n ...(opts.edit\n ? {\n edit: {\n sandboxId: opts.edit.sandboxId,\n sandboxUrl: opts.edit.previewUrl,\n title: opts.edit.title,\n },\n // An edit keeps the build's stack (web `lastSandbox.templateId`).\n stackHint: opts.edit.templateId,\n }\n : {}),\n ...(opts.referenceUrl ? { referenceUrl: opts.referenceUrl } : {}),\n ...(uploaded.length ? { attachments: uploaded } : {}),\n graphqlUrl,\n token: current,\n });\n if (!built.ok) return notSetUp(effectiveOrg);\n setTurnError(null);\n const startedAt = Date.now();\n // The workflow's trigger answers in seconds and the build runs on, so the task is\n // settled from the chat's posts, not by the trigger (a ref on it would end it early).\n const job = jobs.begin({\n channelId: opts.channelId,\n projectId: opts.projectId,\n ask: opts.text,\n siteTitle: opts.edit?.title ?? null,\n mode,\n lane: 'workflow',\n startedAt,\n });\n setTurn({ channelId: opts.channelId, text: opts.text, startedAt, mode, job });\n const outcome = await triggerBuild(current, indexUrl, built.params);\n if (!outcome.ok) {\n const reason = outcome.error ?? '';\n console.warn('[WebBuilderNative] trigger failed:', reason);\n if (outcome.auth) session.retry();\n setTurn(null);\n setTurnError(failureText(reason));\n jobs.finish(job, { ok: false, endedAt: Date.now(), error: failureText(reason) });\n return failureText(reason);\n }\n refetch().catch(() => undefined);\n return null;\n },\n [indexUrl, graphqlUrl, catalog.defaults, effectiveOrg, refetch, session, jobs],\n );\n\n const [startError, setStartError] = useState<string | null>(null);\n const startProject = useCallback(\n (request: WebBuilderStartRequest) => {\n setStartError(null);\n // The build workflow needs the workspace's Code Assistant workflow model (its form\n // extension). Without it the agent chat (webbuilder-design-pro) builds the site\n // instead - the lane the web now trusts for chat builds (#378, #384) - rather than\n // refusing the Start.\n const workflowReady = Boolean(catalog.defaults?.formExtensionId);\n if (request.template || request.agent || !workflowReady) {\n // Template picks build through the agent chat, as on the web (#384).\n const id = uuidv4();\n agentChannels.current.add(id);\n unsavedAgentChannels.current.add(id);\n pendingAgentTurn.current = {\n channelId: id,\n text: request.template ? `${request.text}\\n\\n${templateRemixNote(request.template)}` : request.text,\n files: request.attachments,\n job: { mode: request.template ? 'remix' : 'new' },\n };\n setTurnError(null);\n setActiveChannelId(id);\n setAgentChannelId(id);\n return;\n }\n // The web mints a fresh channel + project for every new build.\n const channelId = newObjectId();\n const projectId = newObjectId();\n projectIds.current.set(channelId, projectId);\n setStartError(null);\n setActiveChannelId(channelId);\n runTurn({\n channelId,\n projectId,\n text: request.text,\n template: request.template,\n edit: null,\n referenceUrl: request.referenceUrl,\n attachments: request.attachments,\n })\n .then((error) => {\n if (error && /not set up|signing in/i.test(error)) {\n // Nothing was started: back to the studio with the reason.\n setActiveChannelId(null);\n setStartError(error);\n }\n })\n .catch(() => undefined);\n },\n [runTurn, catalog.defaults],\n );\n\n const openProject = useCallback((channelId: string) => {\n setTurnError(null);\n setActiveChannelId(channelId);\n // The agent chat follows the open site, so a chat-built site continues there.\n setAgentChannelId(channelId);\n }, []);\n const closeProject = useCallback(() => setActiveChannelId(null), []);\n\n // ── The agent pane ─────────────────────────────────────────────────────\n const work = useMemo(() => pendingWork(posts), [posts]);\n const running = Boolean(turn && turn.channelId === activeChannelId);\n const startedAt = turn?.startedAt ?? 0;\n const progress = state?.progress ?? null;\n // ── Builds left running (Projects shows them; reopening one picks its progress up) ──\n // A turn started here and left (back to Projects, another site, the screen closed)\n // is still the site's turn: its posts say how it is going, as for a turn watched live.\n const runningBuilds = useRunningBuilds();\n const openRun = runningBuilds.find((r) => r.channelId === activeChannelId) ?? null;\n const openRunState = useMemo(\n () => (openRun && posts.length ? turnState(posts, openRun.startedAt) : null),\n [openRun, posts],\n );\n const watchingLive = agentBusy || running;\n useEffect(() => {\n if (!openRun || !openRunState || watchingLive || openRunState.status === 'running') return;\n markBuildDone(openRun.channelId, openRun.startedAt);\n }, [openRun, openRunState, watchingLive]);\n // Still going, as far as its posts say (none back yet counts: the reply has not landed).\n const openRunPending = openRun !== null && !watchingLive && (!openRunState || openRunState.status === 'running');\n // Read its chat back while it runs: the reply lands as a post (the web's poll).\n useEffect(() => {\n if (!openRun || watchingLive) return undefined;\n const timer = setInterval(() => refetch().catch(() => undefined), POLL_MS);\n return () => clearInterval(timer);\n }, [openRun, watchingLive, refetch]);\n\n // Projects with a run: flagged, and listed before the server knows them (a new site\n // has no build yet, so the gallery would not show it).\n // A reply still running in a site's chat (the chat history's \"Running\", which the\n // shared chat stream marks) is a build in progress too - also one started elsewhere.\n const historyRunning = useSyncExternalStore(\n subscribeRememberedHistory,\n historyRunningChannelIds,\n historyRunningChannelIds,\n );\n const shownProjects = useMemo(() => {\n const runs = runningBuilds.filter((r) => !r.org || !effectiveOrg || r.org === effectiveOrg);\n if (!runs.length && !historyRunning.length) return projects;\n const ids = new Set([...runs.map((r) => r.channelId), ...historyRunning]);\n const rows: WebBuilderProject[] = projects.map((p) => (ids.has(p.channelId) ? { ...p, building: true } : p));\n for (const run of runs) {\n if (!projects.some((p) => p.channelId === run.channelId)) {\n rows.push({ channelId: run.channelId, title: run.title, updatedAt: run.startedAt, building: true });\n }\n }\n return rows.sort((a, b) => b.updatedAt - a.updatedAt);\n }, [projects, runningBuilds, historyRunning, effectiveOrg]);\n\n // The question the agent is waiting on, read from the raw turns (the shown ones are\n // cleaned) and from the live reply: a turn that asks parks with the question still in\n // its stream, so it is never a finished message until answered (the main chat's rule).\n const pendingAsk = useMemo(\n () =>\n pendingAskUser([\n ...(streamOnSite && chat.messages.length\n ? chat.messages\n : transcriptFromPosts(posts).map((m) => ({ role: m.role, content: m.content }))),\n ...(streamOnSite && chat.response?.trim() ? [{ role: 'assistant', content: chat.response }] : []),\n ]),\n [streamOnSite, chat.messages, chat.response, posts],\n );\n pendingAskRef.current = pendingAsk;\n\n const building = useMemo<WebBuilderBuilding | null>(() => {\n if (agentBusy && pendingAsk) {\n return { statusText: 'Waiting for your answer…', startedAt: startedAt || Date.now() };\n }\n if (agentBusy) return { statusText: 'Building with the agent…', startedAt: startedAt || Date.now() };\n if (!running && work !== 'creating' && openRun && openRunPending) {\n return { statusText: openRunState?.progress || 'Building your site…', startedAt: openRun.startedAt };\n }\n if (!running && work !== 'creating') return null;\n let fallback = 'Starting your build…';\n if (turn?.mode === 'edit') fallback = 'Updating your app…';\n if (work === 'creating') fallback = 'Starting the preview…';\n return { statusText: progress || fallback, startedAt: startedAt || Date.now() };\n }, [agentBusy, pendingAsk, running, work, turn?.mode, progress, startedAt, openRun, openRunState, openRunPending]);\n\n const messages: AgentChatMessage[] = useMemo(() => {\n const rows: AgentChatMessage[] = transcriptFromPosts(posts)\n .map((m) => ({\n id: m.id,\n role: m.role,\n content: m.role === 'user' ? stripAgentNote(m.content) : displayAgentText(m.content),\n }))\n .filter((m) => m.role === 'user' || m.content.trim());\n // The person's words show at once, before their post comes back.\n const pending = running && turn?.text ? turn.text.replace(/^build\\s*me\\s*:\\s*/i, '') : '';\n if (pending && !rows.some((m) => m.role === 'user' && pending.startsWith(m.content))) {\n rows.push({ id: `pending-${turn?.startedAt}`, role: 'user', content: pending });\n }\n return rows;\n }, [posts, running, turn]);\n\n const send = useCallback(\n (text: string, attachments?: MessageAttachment[], target?: WebBuilderBuild | null) => {\n const channelId = activeChannelId;\n if (!channelId) return;\n // An answer to the agent's question goes to its parked turn as is (the main\n // chat's answer path): no notes, no new task, whatever lane the site is on.\n // It goes now, not queued behind the open turn the agent has parked on it, and to\n // the chat the agent asked in. Never a new task: an answer is not a build ask.\n if (pendingAskRef.current) {\n pendingAskRef.current = null;\n chat.sendMessage(text, attachments, agentChannelId || channelId, false, undefined, {\n answersAsk: true,\n }).catch(() => undefined);\n return;\n }\n const workflowReady = Boolean(catalog.defaults?.formExtensionId);\n // Hand edits ride on the next turn, so the agent keeps them (web `[Hand edits]`).\n const edits = handEditsNote(handEditsRef.current);\n handEditsRef.current = [];\n const editsNote = edits ? `\\n\\n${edits}` : '';\n if (agentLane || !workflowReady) {\n // A change to the agent's build goes to its sandbox (web `agentEditForChat`).\n const note = `${target ? `\\n\\n${agentEditNote(target)}` : ''}${editsNote}`;\n const task: AgentTurnJob = {\n mode: target || builds.length ? 'edit' : 'new',\n siteTitle: activeProject?.title || target?.title || builds[0]?.title || null,\n };\n if (!agentLane) {\n // A workflow chat in a workspace with no build workflow (as startProject):\n // the agent chat carries its turns from now on.\n agentChannels.current.add(channelId);\n if (agentChannelId !== channelId) {\n pendingAgentTurn.current = { channelId, text: `${text}${note}`, files: attachments, job: task };\n setAgentChannelId(channelId);\n return;\n }\n }\n sendAgentTurn(channelId, `${text}${note}`, attachments, task);\n return;\n }\n const projectId =\n projectIds.current.get(channelId) || target?.projectId || builds[0]?.projectId || newObjectId();\n projectIds.current.set(channelId, projectId);\n runTurn({\n channelId,\n projectId,\n text: `${text}${editsNote}`,\n template: null,\n edit: target ?? null,\n attachments,\n }).catch(() => undefined);\n },\n [\n activeChannelId,\n agentLane,\n agentChannelId,\n catalog.defaults,\n builds,\n activeProject?.title,\n runTurn,\n sendAgentTurn,\n chat,\n ],\n );\n\n const agentMessages: AgentChatMessage[] = useMemo(\n () =>\n chat.messages\n .map((m, index) => ({\n id: `${m.role}-${index}`,\n role: m.role,\n // The template note is for the agent; the person sees what they typed.\n content:\n m.role === 'user'\n ? stripAgentNote(m.content).replace(/^build\\s*me\\s*:\\s*/i, '')\n : displayAgentText(m.content),\n attachments: m.attachments,\n }))\n // A turn that only asked a question shows as the question card, not an empty bubble.\n .filter((m) => m.role === 'user' || m.content.trim()),\n [chat.messages],\n );\n\n // A run picked up again (started, left, reopened): the live stream may know nothing of\n // it, so the chat is read from its posts, the ask shows until its post comes back, and\n // the turn reads as running until the reply lands.\n const withOpenRun = useCallback(\n (rows: AgentChatMessage[]): AgentChatMessage[] => {\n if (!openRunPending || !openRun?.ask) return rows;\n const { ask } = openRun;\n if (rows.some((m) => m.role === 'user' && (m.content.startsWith(ask) || ask.startsWith(m.content)))) {\n return rows;\n }\n return [...rows, { id: `run-${openRun.startedAt}`, role: 'user', content: ask }];\n },\n [openRunPending, openRun],\n );\n const openRunStreaming = openRunPending ? openRunState?.progress || 'Building your site…' : null;\n\n const hostChat = useMemo<WebBuilderHostChat>(\n () =>\n agentLane\n ? {\n messages: withOpenRun(agentMessages.length ? agentMessages : messages),\n streaming: chat.response ? displayAgentText(chat.response) : openRunStreaming,\n busy: agentBusy || openRunPending,\n error: chat.error,\n connected: cdecli.channelConnected,\n ask: pendingAsk,\n send,\n }\n : {\n messages: withOpenRun(messages),\n streaming: running ? progress || building?.statusText || 'Working on it…' : openRunStreaming,\n busy: running || openRunPending,\n error: turnError || (session.ready ? session.error : null),\n connected: Boolean(token),\n ask: pendingAsk,\n send,\n },\n [\n agentLane,\n agentMessages,\n pendingAsk,\n withOpenRun,\n openRunStreaming,\n openRunPending,\n chat.response,\n agentBusy,\n chat.error,\n cdecli.channelConnected,\n messages,\n running,\n progress,\n building?.statusText,\n turnError,\n session.ready,\n session.error,\n token,\n send,\n ],\n );\n\n // An agent-chat site opened here (maybe built before it was adopted): adopt it, and record\n // its latest build's sandbox - an adopted project with none recorded accepts its first.\n const recordedSandboxRef = useRef(new Set<string>());\n const { recordAgentBuild } = sandboxApi;\n const latestBuild = builds[0] ?? null;\n useEffect(() => {\n const channelId = activeChannelId;\n const sandboxId = latestBuild?.sandboxId;\n if (!channelId || !agentLane || !sandboxId || agentBusy) return;\n const key = `${channelId}:${sandboxId}`;\n if (recordedSandboxRef.current.has(key)) return;\n recordedSandboxRef.current.add(key);\n const title = activeProject?.title || latestBuild.title || 'New site';\n ensureAdopted(channelId, title)\n .then((adopted) =>\n adopted\n ? recordAgentBuild(channelId, {\n sandboxId,\n previewUrl: latestBuild.previewUrl,\n title,\n snapshotId: latestBuild.snapshotId,\n })\n : null,\n )\n .then((outcome) => {\n if (__DEV__ && outcome && !outcome.ok) {\n // eslint-disable-next-line no-console\n console.warn('[WebBuilderNative] record build', { channelId, sandboxId, error: outcome.error });\n }\n })\n .catch(() => undefined);\n }, [activeChannelId, agentLane, agentBusy, latestBuild, activeProject?.title, ensureAdopted, recordAgentBuild]);\n\n // ── Waking a preview ───────────────────────────────────────────────────\n // Sandbox calls go through the backend's guarded proxy (the server holds the\n // sandbox key, an agent build's too), straight to cdecli-agent on a server without it.\n // One router per open site: the restore below and the keep-alive share it.\n const sandboxCall = useMemo(\n () =>\n createSandboxRouter({\n channelId: activeChannelId,\n proxy: sandboxApi.proxy,\n direct:\n token && indexUrl\n ? directSandboxRun(token, indexUrl)\n : async () => ({ successful: false, error: 'Not signed in to the build service.' }),\n proxyMissing: sandboxApi.proxyMissing,\n }),\n [activeChannelId, token, indexUrl, sandboxApi],\n );\n // An open build's sandbox stays awake while the person works on it (web #438 C1).\n const keepAlive = useSandboxKeepAlive({\n run: token || activeChannelId ? sandboxCall : null,\n sandboxId: builds[0]?.sandboxId,\n live: activeChannelId !== null && Boolean(builds[0]?.sandboxId),\n });\n const { noteActivity } = keepAlive;\n // A turn sent or answered on the open site counts as the person working on it.\n useEffect(() => {\n if (activeChannelId) noteActivity();\n }, [activeChannelId, posts.length, chat.messages.length, noteActivity]);\n const resumePreview = useCallback(\n async (build: WebBuilderBuild): Promise<ResumeOutcome> => {\n const channelId = activeChannelId;\n if (!build.sandboxId || (!tokenRef.current && !channelId)) return 'failed';\n noteActivity();\n const result = await restoreSandbox(sandboxCall, {\n sandboxId: build.sandboxId,\n snapshotId: build.snapshotId,\n templateId: build.templateId,\n previewUrl: build.previewUrl,\n });\n // A new sandbox: its preview replaces the expired one for this build from now on,\n // here at once and, once recorded on the project, on the web and other devices.\n if (result.outcome === 'ok' && result.sandboxId && result.previewUrl) {\n rememberRestored(build.key, result.sandboxId, result.previewUrl);\n if (activeProject && activeProject.previewUrl === build.previewUrl) {\n upsertProject({ ...activeProject, previewUrl: result.previewUrl });\n }\n if (channelId) {\n sandboxApi\n .persist({\n channelId,\n sandboxId: result.sandboxId,\n sandboxUrl: result.previewUrl.split('?')[0],\n snapshotId: build.snapshotId,\n previousSandboxId: build.sandboxId,\n })\n .then((saved) => {\n if (!saved.ok)\n console.warn('[WebBuilderNative] persist sandbox identity failed', saved.message);\n })\n .catch(() => undefined);\n }\n }\n return result.outcome;\n },\n [activeChannelId, sandboxCall, noteActivity, sandboxApi, rememberRestored, activeProject, upsertProject],\n );\n\n // ── Undo / Redo (web #443) ─────────────────────────────────────────────\n const redoFor = useRef(new Map<string, WebbuilderVersion>());\n const undo = useCallback(\n async (build: WebBuilderBuild): Promise<WebBuilderUndoResult> => {\n if (!build.sandboxId) return { ok: false, message: 'There is nothing to undo yet.' };\n noteActivity();\n const outcome = await undoLastChange(sandboxCall, build.sandboxId);\n if (outcome.redo) redoFor.current.set(build.key, outcome.redo);\n else redoFor.current.delete(build.key);\n return {\n ok: outcome.ok,\n message: outcome.message,\n canRedo: Boolean(outcome.redo),\n askAgent: Boolean(outcome.listFailed) && build.origin === 'agent',\n };\n },\n [sandboxCall, noteActivity],\n );\n const redo = useCallback(\n async (build: WebBuilderBuild): Promise<WebBuilderUndoResult> => {\n const version = redoFor.current.get(build.key);\n if (!build.sandboxId || !version) return { ok: false, message: 'There is nothing to redo.' };\n const outcome = await redoChange(sandboxCall, build.sandboxId, version);\n if (outcome.ok) redoFor.current.delete(build.key);\n return { ok: outcome.ok, message: outcome.message };\n },\n [sandboxCall],\n );\n\n // ── Download code (web #438 C4) ────────────────────────────────────────\n const downloadCode = useCallback(\n async (build: WebBuilderBuild): Promise<string | null> => {\n if (!build.sandboxId) return null;\n noteActivity();\n const result = await sandboxCall(\n WEBBUILDER_EXPORT_ZIP_ACTION,\n exportZipParams(build.sandboxId, build.title),\n 10 * 60 * 1000,\n ).catch(() => null);\n return exportZipUrl(result);\n },\n [sandboxCall, noteActivity],\n );\n\n // ── Code view (web Code workspace) ─────────────────────────────────────\n const codeApi = useMemo(\n () =>\n createCodeWorkspace(sandboxCall, (edit) => {\n handEditsRef.current = [...handEditsRef.current.filter((e) => e.file !== edit.file), edit];\n }),\n [sandboxCall],\n );\n const siteLiveUrl = activeProject?.liveUrl ?? null;\n // Where FINISH backed the site's code up (retention `backupRepo`): the saved code when asleep.\n const [backupRepo, setBackupRepo] = useState<{ channelId: string; repo: string | null } | null>(null);\n const readBackupRepo = sandboxApi.backupRepo;\n const newestBuildAt = builds[0]?.updatedAt;\n useEffect(() => {\n if (!activeChannelId) return undefined;\n let live = true;\n readBackupRepo(activeChannelId)\n .then((repo) => {\n if (live) setBackupRepo({ channelId: activeChannelId, repo });\n })\n .catch(() => undefined);\n return () => {\n live = false;\n };\n // A finished turn may have saved a new backup: read it again then.\n }, [activeChannelId, readBackupRepo, newestBuildAt]);\n const siteBackupRepo = backupRepo?.channelId === activeChannelId ? backupRepo.repo : null;\n const code = useMemo<WebBuilderCodeHost>(() => {\n const target = (build: WebBuilderBuild) => ({\n sandboxId: build.sandboxId,\n savedSource: savedCodeSource({ backupRepo: siteBackupRepo, liveUrl: build.liveUrl || siteLiveUrl }),\n });\n return {\n listFiles: async (build) => {\n const r = await codeApi.listFiles(target(build));\n return {\n ok: r.ok,\n files: r.tree?.files,\n partial: r.tree?.partial,\n saved: r.saved,\n asleep: r.asleep,\n error: r.error,\n };\n },\n readFile: (build, path, saved) => codeApi.readFile(target(build), path, saved),\n saveFile: (build, path, base, draft, force) => codeApi.saveFile(target(build), path, base, draft, force),\n search: (build, query, live, openDocs) => codeApi.search(target(build), query, live, openDocs),\n };\n }, [codeApi, siteLiveUrl, siteBackupRepo]);\n\n // ── Publish ────────────────────────────────────────────────────────────\n const [deployToCloudflare] = useAiCodeDeployToCloudflareMutation({});\n const publish = useCallback(\n async (build: WebBuilderBuild, projectName: string): Promise<WebBuilderPublishResult> => {\n if (!build.sandboxId || !activeChannelId) {\n return { ok: false, message: 'There is nothing to publish yet.' };\n }\n if (build.origin === 'agent') {\n // Only the agent holds this sandbox's key: Publish is a request to it, and the\n // live link it replies with marks the build published (web `agentPublishMessage`).\n sendAgentTurn(activeChannelId, agentPublishMessage(build, projectName));\n return { ok: true };\n }\n try {\n const result = await deployToCloudflare({\n variables: { sandboxId: build.sandboxId, projectName, channelId: activeChannelId },\n });\n const payload = result.data?.aiCodeDeployToCloudflare;\n if (payload?.success) return { ok: true };\n console.warn('[WebBuilderNative] publish refused:', payload?.message);\n return { ok: false, message: \"Publishing didn't start. Try again in a moment.\" };\n } catch (err) {\n console.warn('[WebBuilderNative] publish failed:', err);\n return { ok: false, message: \"Publishing didn't start. Check your connection and try again.\" };\n }\n },\n [deployToCloudflare, activeChannelId, sendAgentTurn],\n );\n\n // Only a connection still coming up blocks the composer (the web refuses at send time):\n // a template build needs the agent chat, a workflow build the session. Anything that\n // fails a send - a workspace without a build workflow - comes back as `startNotice`.\n let startBlocked: string | null = null;\n if (!token && !cdecli.channelConnected) {\n startBlocked = session.ready && session.error ? session.error : 'Connecting to Web Builder…';\n }\n\n return {\n projects: shownProjects,\n projectsLoading: gallery.loading,\n projectsError: gallery.error,\n projectsHasMore: gallery.hasMore,\n refreshProjects,\n loadMoreProjects: gallery.loadMore,\n templates: catalog.templates,\n templatesLoading: catalog.loading,\n templatesError: catalog.error,\n reloadTemplates,\n startBlocked,\n startNotice: startError,\n activeChannelId,\n openProject,\n closeProject,\n startProject,\n builds,\n buildsLoading: activeChannelId !== null && posts.length === 0 && !running,\n building,\n publishing: work === 'publishing',\n hostChat,\n publish,\n resumePreview,\n undo,\n redo,\n downloadCode,\n code,\n };\n}\n"],"names":["uuidv4","_a","running","_b","_c","_d","_e","_f","startedAt"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useWebBuilderHost.js","sources":["../../../src/screens/WebBuilderNative/useWebBuilderHost.ts"],"sourcesContent":["/**\n * The host half of the native Web Builder: everything that needs the app's\n * data stack, so Apollo stays out of the federated bundle.\n *\n * Same lane as the web Web Builder surface (`standalone/realServices`):\n * - a site is a chat (AIASSISTANT channel) holding builds; the list is the web\n * gallery's (`useWebBuilderGallery`),\n * - templates and the org's build workflow come from the Code Assistant\n * settings (`pageSettings`), read with the app's surface session,\n * - every build or edit runs `yantra-webbuilder/WEBBUILDER_TRIGGER_WORKFLOW` on\n * cdecli-agent with the web's payload (new / template remix / edit),\n * - the result comes back on the chat: its posts are polled every 2.5 s while a\n * turn runs (plus the live subscription), and the builds, the agent's\n * transcript and its progress line are read from them,\n * - publish is `aiCodeDeployToCloudflare`; the live address comes back on a post.\n */\nimport { useCallback, useEffect, useMemo, useRef, useState, useSyncExternalStore } from 'react';\nimport { gql, useApolloClient } from '@apollo/client';\nimport { useAiCodeDeployToCloudflareMutation } from 'common/graphql';\nimport { v4 as uuidv4 } from 'uuid';\nimport AsyncStorage from '@react-native-async-storage/async-storage';\nimport {\n parseProjectSettings,\n projectInstructionsNote,\n readDeleteReply,\n readSettingsUpdateReply,\n} from '../../features/webbuilder/projectTools';\nimport { useCdecliConnection } from '../../contexts/CdecliConnectionContext';\nimport { useChatStream, type UseChatStreamRouting, MessageAttachment } from '../../hooks/useChatStream';\nimport { useHostChatChannel } from '../../hooks/useHostChatChannel';\nimport { config } from '../../config/env-config';\nimport { historyRunningChannelIds, subscribeRememberedHistory, useChatMessages } from '../../hooks/useChatApi';\nimport { usePrerequisiteIds } from '../../hooks/usePrerequisiteIds';\nimport { useCanvasSession } from '../../features/canvas/useCanvasSession';\nimport { tokenClaims } from '../../features/canvas/sessionIdentity';\nimport type { AgentChatMessage } from '../../features/agent-chat';\nimport {\n buildsFromPosts,\n displayAgentText,\n hasWorkflowPosts,\n pendingWork,\n siteNameFromRequest,\n stripAgentNote,\n userBubbleText,\n titleFromPrompt,\n projectFromPosts,\n transcriptFromPosts,\n turnState,\n} from '../../features/webbuilder/buildFragments';\nimport type { WebBuilderHostChat } from '../../features/webbuilder/hostChat';\nimport type {\n WebBuilderBuild,\n WebBuilderBuilding,\n WebBuilderProject,\n WebBuilderPublishResult,\n WebBuilderPublishTools,\n WebBuilderProjectTools,\n WebBuilderStartRequest,\n WebBuilderUndoResult,\n WebBuilderRestoreResult,\n WebBuilderCodeHost,\n} from '../../features/webbuilder/types';\nimport { handEditsNote, savedCodeSource } from '../../features/webbuilder/codeFiles';\nimport { createCodeWorkspace } from './codeWorkspaceApi';\nimport {\n buildTriggerParams,\n newObjectId,\n templateRemixNote,\n WEBBUILDER_CHAT_SKILL,\n type WebBuilderTemplate,\n} from '../../features/webbuilder/workflow';\nimport { useWebBuilderGallery } from './useWebBuilderGallery';\nimport { agentEditNote, agentPublishMessage } from '../../features/webbuilder/webbuilderPrompts';\nimport { useCodeAssistantCatalog } from './useCodeAssistantCatalog';\nimport { useConnectorTemplates } from './useConnectorTemplates';\nimport {\n createSandboxRouter,\n directSandboxRun,\n directChannels,\n OUTDATED_SERVER_RE,\n restoreFromSavedCopy,\n triggerBuild,\n wakeSandbox,\n uploadAttachment,\n type ResumeOutcome,\n} from './webbuilderTransport';\nimport { useSandboxProxyApi } from './sandboxProxyApi';\nimport { useSandboxKeepAlive } from './useSandboxKeepAlive';\nimport { pendingAskUser } from '../../features/chat/askUser';\nimport { markBuildDone, runningBuild, useRunningBuilds } from './runningBuilds';\nimport { isAgentSite } from './siteLane';\nimport { redoChange, undoLastChange, type WebbuilderVersion } from './versionUndo';\nimport { WEBBUILDER_EXPORT_ZIP_ACTION, exportZipParams, exportZipUrl } from '../../features/webbuilder/exportCode';\nimport { applyRestored, useRestoredSandboxes } from './useRestoredSandboxes';\nimport { useWebBuilderJobs, type WebBuilderJob } from './useWebBuilderJobs';\n\n/** The web's read-back cadence and ceiling (`POLL_MS`, `POLL_TIMEOUT_MS`). */\nconst POLL_MS = 2_500;\n/** Agent-chat sites this device adopted as projects. */\nconst ADOPTED_KEY = 'yantra.webbuilder.adopted.v1';\nconst TURN_TIMEOUT_MS = 15 * 60 * 1000;\n/**\n * A started build posts progress within seconds. A trigger that reported success but\n * never posts back (e.g. a form with no functions) fails here, not at the ceiling.\n */\nconst NO_REPLY_TIMEOUT_MS = 3 * 60 * 1000;\n\ninterface RunningTurn {\n channelId: string;\n text: string;\n startedAt: number;\n mode: 'new' | 'remix' | 'edit';\n /** The turn's task (a server surface job), settled when the turn ends. */\n job: Promise<WebBuilderJob>;\n}\n\n/** What an agent-chat turn records as its task. */\ninterface AgentTurnJob {\n mode: 'new' | 'remix' | 'edit';\n siteTitle?: string | null;\n}\n\nexport interface WebBuilderHost {\n projects: WebBuilderProject[];\n projectsLoading: boolean;\n projectsError: string | null;\n projectsHasMore: boolean;\n refreshProjects: () => void;\n loadMoreProjects: () => void;\n templates: WebBuilderTemplate[];\n templatesLoading: boolean;\n templatesError: string | null;\n reloadTemplates: () => void;\n startBlocked: string | null;\n /** Why the last Start did not go out (e.g. builds not set up), shown under the composer. */\n startNotice: string | null;\n activeChannelId: string | null;\n openProject: (channelId: string) => void;\n closeProject: () => void;\n startProject: (request: WebBuilderStartRequest) => void;\n builds: WebBuilderBuild[];\n buildsLoading: boolean;\n building: WebBuilderBuilding | null;\n publishing: boolean;\n hostChat: WebBuilderHostChat;\n publish: (build: WebBuilderBuild, projectName: string, customDomain?: string) => Promise<WebBuilderPublishResult>;\n /** The Publish menu's domain, Unpublish and Review site calls. */\n publishTools: WebBuilderPublishTools;\n /** The project menu's settings, delete, GitHub and integrations calls. */\n projectTools: WebBuilderProjectTools;\n /**\n * Wake a sleeping preview: resume the sandbox and restart its dev server (web\n * `ensurePreview`). `gone` = the sandbox was reclaimed; restoring it is the person's call.\n */\n resumePreview: (build: WebBuilderBuild, opts?: { asked?: boolean }) => Promise<ResumeOutcome>;\n /** Restore from saved copy: boot the build's latest restore point into a new sandbox. */\n restorePreview: (build: WebBuilderBuild) => Promise<WebBuilderRestoreResult>;\n /** Sandboxes found gone while open (the keep-alive): their preview shows as cleaned up. */\n goneSandboxIds: ReadonlySet<string>;\n /** Instant Undo of the build's last change, straight in its sandbox (web #443). */\n undo: (build: WebBuilderBuild) => Promise<WebBuilderUndoResult>;\n /** Bring back what the last Undo on this build left. */\n redo: (build: WebBuilderBuild) => Promise<WebBuilderUndoResult>;\n /** A signed link to the build's code as a zip (`WEBBUILDER_EXPORT_ZIP`), or null. */\n downloadCode: (build: WebBuilderBuild) => Promise<string | null>;\n /** The Code view: the site's live files (or its saved code), edit and save, search. */\n code: WebBuilderCodeHost;\n}\n\nconst PROJECT_SETTINGS_QUERY = gql`\n query aiCodeProjectSettings($channelId: String!) {\n aiCodeProjectSettings(channelId: $channelId)\n }\n`;\n\nconst UPDATE_PROJECT_SETTINGS_MUTATION = gql`\n mutation aiCodeUpdateProjectSettings($channelId: String!, $input: JSON!) {\n aiCodeUpdateProjectSettings(channelId: $channelId, input: $input)\n }\n`;\n\nconst DELETE_PROJECT_MUTATION = gql`\n mutation aiCodeDeleteProject($channelId: String!) {\n aiCodeDeleteProject(channelId: $channelId)\n }\n`;\n\n/** An older server without the guarded delete. */\nconst DELETE_CHANNEL_MUTATION = gql`\n mutation deleteChannel($id: ID!) {\n deleteChannel(id: $id)\n }\n`;\n\nconst PUSH_TO_GITHUB_MUTATION = gql`\n mutation aiCodePushToGithub($sandboxId: String!, $repoName: String!, $channelId: String) {\n aiCodePushToGithub(sandboxId: $sandboxId, repoName: $repoName, channelId: $channelId) {\n success\n message\n }\n }\n`;\n\nconst INTEGRATION_CATALOG_QUERY = gql`\n query WebbuilderIntegrationConnectors($search: String, $category: String) {\n integrationConnectors(search: $search, category: $category) {\n id\n title\n description\n logo\n authMethods\n meta {\n categories\n }\n }\n }\n`;\n\n/** Publish with a custom domain (web `startPublish({ customDomain })`). */\nconst DEPLOY_WITH_DOMAIN_MUTATION = gql`\n mutation aiCodeDeployToCloudflareWithDomain(\n $sandboxId: String!\n $projectName: String\n $channelId: String\n $customDomain: String\n ) {\n aiCodeDeployToCloudflare(\n sandboxId: $sandboxId\n projectName: $projectName\n channelId: $channelId\n customDomain: $customDomain\n ) {\n success\n message\n eventId\n }\n }\n`;\n\n/** The server's pre-publish checks for a build (web `aiCodePrePublishReview`): JSON, null on an older server. */\nconst PRE_PUBLISH_REVIEW_QUERY = gql`\n query aiCodePrePublishReview($channelId: String!, $sandboxId: String!) {\n aiCodePrePublishReview(channelId: $channelId, sandboxId: $sandboxId)\n }\n`;\n\nfunction notSetUp(org: string): string {\n return `Builds are not set up for ${org || 'this workspace'} yet. Ask an admin to configure the Code Assistant templates.`;\n}\n\nfunction failureText(error: string): string {\n if (/\\b401\\b|unauthori[sz]ed/i.test(error)) return 'Your sign-in was not accepted. Try again in a moment.';\n if (/network|fetch|timed out/i.test(error))\n return \"Couldn't reach the build service. Check your connection and try again.\";\n return \"The build didn't start. Try again.\";\n}\n\nexport function useWebBuilderHost(routeOrg?: string): WebBuilderHost {\n const { orgName, projectId: appProjectId } = usePrerequisiteIds();\n const session = useCanvasSession();\n const { token, indexUrl, graphqlUrl } = session;\n const sessionOrg = String(tokenClaims(token).orgName ?? '');\n const effectiveOrg = routeOrg || orgName || sessionOrg || '';\n const tokenRef = useRef(token);\n tokenRef.current = token;\n\n // ── Templates and the org's build workflow (the app backend's pageSettings) ──\n const catalog = useCodeAssistantCatalog(effectiveOrg);\n // The gallery is the connector's catalog (the one the agent picks from), merged with those cards.\n const [templatesReload, setTemplatesReload] = useState(0);\n const galleryTemplates = useConnectorTemplates(token, indexUrl, catalog.templates, templatesReload);\n const reloadCatalog = catalog.reload;\n const reloadTemplates = useCallback(() => {\n reloadCatalog();\n setTemplatesReload((n) => n + 1);\n }, [reloadCatalog]);\n\n // ── Your builds ────────────────────────────────────────────────────────\n const cdnOrigin = config.AWS_CDN_URL;\n const gallery = useWebBuilderGallery(effectiveOrg, cdnOrigin);\n const { projects, refresh: refreshProjects, upsert: upsertProject } = gallery;\n\n // ── The open site ──────────────────────────────────────────────────────\n const [activeChannelId, setActiveChannelId] = useState<string | null>(null);\n const projectIds = useRef(new Map<string, string>());\n const { posts: rawPosts, refetch } = useChatMessages(activeChannelId);\n const posts = useMemo(() => (activeChannelId ? (rawPosts as unknown[]) : []), [activeChannelId, rawPosts]);\n const activeProject = projects.find((p) => p.channelId === activeChannelId);\n const postBuilds = useMemo(\n () => buildsFromPosts(posts, activeProject?.title, cdnOrigin),\n [posts, activeProject?.title, cdnOrigin],\n );\n\n // ── The agent-chat lane: template remixes and sites built from chat ─────\n // The web sends a template pick to the agent chat (webbuilder-design-pro) with a\n // note naming the snapshot to boot (#384). Here that chat is the app's gateway\n // chat with the same skill; its posts land on the site's chat like any other.\n const cdecli = useCdecliConnection();\n const { setActiveChannelId: setCdecliChannel } = cdecli;\n const [agentChannelId, setAgentChannelId] = useState<string>(() => uuidv4());\n // The agent's open question, as of the last render (set where it is read from the chat).\n const pendingAskRef = useRef<{ requestId: string } | null>(null);\n // Files saved by hand in the Code view since the last turn: the next turn keeps them.\n const handEditsRef = useRef<Array<{ file: string; summary: string }>>([]);\n const agentChannels = useRef(new Set<string>());\n const unsavedAgentChannels = useRef(new Set<string>());\n const pendingAgentTurn = useRef<{\n channelId: string;\n text: string;\n files?: MessageAttachment[];\n job?: AgentTurnJob;\n } | null>(null);\n useEffect(() => {\n setCdecliChannel(agentChannelId);\n return undefined;\n }, [agentChannelId, setCdecliChannel]);\n const { ensureChannel } = useHostChatChannel({\n channelId: agentChannelId,\n orgName: effectiveOrg,\n projectId: appProjectId ?? '',\n label: 'WebBuilderNative',\n });\n const chatRouting: UseChatStreamRouting = useMemo(\n () => ({\n channelConnected: cdecli.channelConnected,\n accountId: cdecli.accountId,\n persistenceMode: cdecli.persistenceMode ?? 'backend',\n recoverAgentAuth: cdecli.recoverAgentAuth,\n skill: WEBBUILDER_CHAT_SKILL,\n }),\n [cdecli.channelConnected, cdecli.accountId, cdecli.persistenceMode, cdecli.recoverAgentAuth],\n );\n const chat = useChatStream(agentChannelId, chatRouting);\n // Which chat the open site lives in. `agentChannels` is this mount's memory, so after a\n // reload the site's own evidence decides: a run recorded on the agent lane, or its agent\n // chat (the stream is on the open site after `openProject`) holding turns while its posts\n // carry no build-workflow fragments.\n const streamOnSite = activeChannelId !== null && agentChannelId === activeChannelId;\n const workflowPosts = hasWorkflowPosts(posts);\n const agentLane =\n activeChannelId !== null &&\n isAgentSite({\n rememberedAgent: agentChannels.current.has(activeChannelId),\n runLane: runningBuild(activeChannelId)?.lane,\n postCount: posts.length,\n workflowPosts,\n streamMessages: streamOnSite ? chat.messages.length : 0,\n });\n if (__DEV__ && activeChannelId) {\n // eslint-disable-next-line no-console\n console.log('[WebBuilderNative] lane', {\n channel: activeChannelId,\n agentLane,\n posts: posts.length,\n workflowPosts,\n streamMessages: streamOnSite ? chat.messages.length : null,\n streaming: chat.isLoading || chat.isStreaming,\n });\n }\n const agentBusy = agentLane && (chat.isLoading || chat.isStreaming);\n\n // ── Agent-chat sites as projects (web `adoptAgentProject`, #388) ───────\n // Adopted, a site's builds are recorded on its channel (sandbox, key, restore point): what\n // the project proxy checks before Code, Undo, Download or a wake touch its sandbox.\n const sandboxApi = useSandboxProxyApi();\n const adoptedRef = useRef<Set<string>>(new Set());\n const adoptingRef = useRef(new Map<string, Promise<boolean>>());\n useEffect(() => {\n AsyncStorage.getItem(ADOPTED_KEY)\n .then((raw) => {\n const ids = raw ? (JSON.parse(raw) as unknown) : [];\n if (Array.isArray(ids)) ids.forEach((id) => typeof id === 'string' && adoptedRef.current.add(id));\n })\n .catch(() => undefined);\n }, []);\n const { adoptAgentProject } = sandboxApi;\n const ensureAdopted = useCallback(\n (channelId: string, title: string): Promise<boolean> => {\n if (adoptedRef.current.has(channelId)) return Promise.resolve(true);\n const pending = adoptingRef.current.get(channelId);\n if (pending) return pending;\n const run = adoptAgentProject(channelId, title)\n .then((adopted) => {\n if (adopted) {\n adoptedRef.current.add(channelId);\n // A project now: its sandbox calls go through the proxy again.\n directChannels.delete(channelId);\n AsyncStorage.setItem(ADOPTED_KEY, JSON.stringify([...adoptedRef.current].slice(-500))).catch(\n () => undefined,\n );\n }\n return adopted;\n })\n .finally(() => adoptingRef.current.delete(channelId));\n adoptingRef.current.set(channelId, run);\n return run;\n },\n [adoptAgentProject],\n );\n\n // Project instructions per site (Project settings), read when the site opens.\n const instructionsByChannel = useRef(new Map<string, string>());\n\n // A build or edit turn is a task: its job rides on the turn so the agent settles it.\n const jobs = useWebBuilderJobs(effectiveOrg);\n const agentJob = useRef<{ channelId: string; job: WebBuilderJob } | null>(null);\n const sendAgentTurn = useCallback(\n (channelId: string, text: string, files?: MessageAttachment[], task?: AgentTurnJob) => {\n // A site started here is created by its first message, not by opening it.\n const ready = unsavedAgentChannels.current.has(channelId) ? ensureChannel() : Promise.resolve();\n const recorded = task\n ? jobs.begin({\n channelId,\n ask: text,\n siteTitle: task.siteTitle,\n mode: task.mode,\n lane: 'agent',\n startedAt: Date.now(),\n })\n : Promise.resolve(null);\n // Adopted before the turn: the agent's build record is then accepted on the channel.\n const adopted = ready.then(() =>\n ensureAdopted(\n channelId,\n task?.siteTitle || siteNameFromRequest(text) || titleFromPrompt(stripAgentNote(text)) || 'New site',\n ).catch(() => false),\n );\n Promise.all([adopted, recorded])\n .then(([, job]) => {\n unsavedAgentChannels.current.delete(channelId);\n if (job) agentJob.current = { channelId, job };\n // The project's standing instructions ride on every turn (web `projectInstructionsNote`).\n const knowledge = instructionsByChannel.current.get(channelId);\n const turn = knowledge ? `${text}\\n\\n${projectInstructionsNote(knowledge)}` : text;\n return chat.sendMessage(turn, files, channelId, false, undefined, { job: job?.ref });\n })\n .then((outcome) => {\n if (outcome !== 'failed' || agentJob.current?.channelId !== channelId) return;\n jobs.finish(agentJob.current.job, {\n ok: false,\n endedAt: Date.now(),\n error: 'The message did not reach Web Builder.',\n });\n agentJob.current = null;\n })\n .catch(() => undefined);\n },\n [chat, ensureChannel, jobs, ensureAdopted],\n );\n // A remix's first turn goes out once the stream and ensureChannel are on its chat.\n useEffect(() => {\n const pending = pendingAgentTurn.current;\n if (!pending || pending.channelId !== agentChannelId) return;\n pendingAgentTurn.current = null;\n sendAgentTurn(pending.channelId, pending.text, pending.files, pending.job);\n }, [agentChannelId, sendAgentTurn]);\n // A finished agent turn: read the chat again so its preview link becomes the build.\n const wasAgentBusy = useRef(false);\n useEffect(() => {\n if (wasAgentBusy.current && !agentBusy) refetch().catch(() => undefined);\n wasAgentBusy.current = agentBusy;\n }, [agentBusy, refetch]);\n\n // An agent-chat site's preview link shows the moment the reply names it, before the post is re-read.\n const { restored, remember: rememberRestored } = useRestoredSandboxes();\n const builds = useMemo(() => {\n if (postBuilds.length || !agentLane) return applyRestored(postBuilds, restored);\n const now = Date.now();\n return buildsFromPosts(\n chat.messages.map((m, index) => ({\n id: `live-${index}`,\n message: m.content,\n props: { role: m.role === 'user' ? 'USER' : 'ASSISTANT' },\n createdAt: new Date(now + index).toISOString(),\n })),\n activeProject?.title,\n cdnOrigin,\n );\n }, [postBuilds, agentLane, chat.messages, activeProject?.title, cdnOrigin, restored]);\n\n // The agent turn carrying a task ended on its chat: settle the task (the agent's own\n // verdict stands when it reported first). A turn left running because another site was\n // opened is the agent's, or the server deadline's, to end.\n const chatBusy = chat.isLoading || chat.isStreaming;\n const wasChatBusy = useRef(false);\n useEffect(() => {\n const ended = wasChatBusy.current && !chatBusy;\n wasChatBusy.current = chatBusy;\n const running = agentJob.current;\n if (!ended || !running || running.channelId !== agentChannelId) return;\n agentJob.current = null;\n jobs.finish(\n running.job,\n chat.error\n ? { ok: false, endedAt: Date.now(), error: chat.error }\n : { ok: true, endedAt: Date.now(), build: activeChannelId === running.channelId ? builds[0] : null },\n );\n }, [chatBusy, agentChannelId, chat.error, activeChannelId, builds, jobs]);\n\n // The open site keeps its tile current (a new site appears, a rename or a publish shows).\n useEffect(() => {\n if (!activeChannelId || posts.length === 0) return;\n const row = projectFromPosts({ id: activeChannelId, title: activeProject?.title }, posts, cdnOrigin);\n if (row) upsertProject(row);\n }, [activeChannelId, posts, cdnOrigin, upsertProject, activeProject?.title]);\n\n // ── A running turn ─────────────────────────────────────────────────────\n const [turn, setTurn] = useState<RunningTurn | null>(null);\n const [turnError, setTurnError] = useState<string | null>(null);\n const state = useMemo(\n () => (turn && turn.channelId === activeChannelId ? turnState(posts, turn.startedAt) : null),\n [turn, activeChannelId, posts],\n );\n useEffect(() => {\n if (!turn || !state) return;\n if (state.status === 'done') {\n setTurn(null);\n jobs.finish(turn.job, { ok: true, endedAt: Date.now(), build: postBuilds[0] ?? null });\n }\n if (state.status === 'failed') {\n setTurn(null);\n setTurnError(state.error);\n jobs.finish(turn.job, { ok: false, endedAt: Date.now(), error: state.error || \"The build didn't finish.\" });\n }\n }, [turn, state, postBuilds, jobs]);\n // Whether the open turn's chat posted back yet; only known while its chat is open.\n const heardRef = useRef<{ startedAt: number; watching: boolean; heard: boolean } | null>(null);\n if (turn) {\n const prev = heardRef.current?.startedAt === turn.startedAt ? heardRef.current : null;\n heardRef.current = {\n startedAt: turn.startedAt,\n watching: state !== null,\n heard: Boolean(prev?.heard || state?.heard),\n };\n }\n // The web polls while a turn runs: the post that carries the build's fragment\n // (`propsConfiguration.contents`) arrives on the thread read, not the subscription.\n useEffect(() => {\n if (!turn) return undefined;\n const timer = setInterval(() => {\n const elapsed = Date.now() - turn.startedAt;\n const seen = heardRef.current;\n const unanswered = seen?.startedAt === turn.startedAt && seen.watching && !seen.heard;\n if (unanswered && elapsed > NO_REPLY_TIMEOUT_MS) {\n const noReply = \"The build didn't start - nothing came back from the builder. Please try again.\";\n setTurn(null);\n setTurnError(noReply);\n jobs.finish(turn.job, { ok: false, endedAt: Date.now(), error: noReply });\n return;\n }\n if (elapsed > TURN_TIMEOUT_MS) {\n const tooLong = 'The build is taking too long. It may still finish; reopen the site later to check.';\n setTurn(null);\n setTurnError(tooLong);\n jobs.finish(turn.job, { ok: false, endedAt: Date.now(), error: tooLong });\n return;\n }\n refetch().catch(() => undefined);\n }, POLL_MS);\n return () => clearInterval(timer);\n }, [turn, refetch, jobs]);\n\n const runTurn = useCallback(\n async (opts: {\n channelId: string;\n projectId: string;\n text: string;\n template: WebBuilderTemplate | null;\n edit: WebBuilderBuild | null;\n referenceUrl?: string;\n attachments?: MessageAttachment[];\n }): Promise<string | null> => {\n const { current } = tokenRef;\n if (!current || !indexUrl) return 'Web Builder is still signing in. Try again in a moment.';\n let mode: RunningTurn['mode'] = 'new';\n if (opts.edit) mode = 'edit';\n else if (opts.template?.snapshotId) mode = 'remix';\n const uploaded = (\n await Promise.all(\n (opts.attachments ?? []).map((file) =>\n uploadAttachment(current, indexUrl, {\n name: file.name,\n url: file.url,\n dataUrl: file.dataUrl,\n mimeType: file.mimeType,\n }),\n ),\n )\n ).filter((f): f is NonNullable<typeof f> => f !== null);\n const built = buildTriggerParams({\n channelId: opts.channelId,\n projectId: opts.projectId,\n text: opts.text,\n template: opts.template ?? undefined,\n defaults: catalog.defaults,\n mode,\n ...(opts.edit\n ? {\n edit: {\n sandboxId: opts.edit.sandboxId,\n sandboxUrl: opts.edit.previewUrl,\n title: opts.edit.title,\n },\n // An edit keeps the build's stack (web `lastSandbox.templateId`).\n stackHint: opts.edit.templateId,\n }\n : {}),\n ...(opts.referenceUrl ? { referenceUrl: opts.referenceUrl } : {}),\n ...(uploaded.length ? { attachments: uploaded } : {}),\n graphqlUrl,\n token: current,\n });\n if (!built.ok) return notSetUp(effectiveOrg);\n setTurnError(null);\n const startedAt = Date.now();\n // The workflow's trigger answers in seconds and the build runs on, so the task is\n // settled from the chat's posts, not by the trigger (a ref on it would end it early).\n const job = jobs.begin({\n channelId: opts.channelId,\n projectId: opts.projectId,\n ask: opts.text,\n siteTitle: opts.edit?.title ?? null,\n mode,\n lane: 'workflow',\n startedAt,\n });\n setTurn({ channelId: opts.channelId, text: opts.text, startedAt, mode, job });\n const outcome = await triggerBuild(current, indexUrl, built.params);\n if (!outcome.ok) {\n const reason = outcome.error ?? '';\n console.warn('[WebBuilderNative] trigger failed:', reason);\n if (outcome.auth) session.retry();\n setTurn(null);\n setTurnError(failureText(reason));\n jobs.finish(job, { ok: false, endedAt: Date.now(), error: failureText(reason) });\n return failureText(reason);\n }\n refetch().catch(() => undefined);\n return null;\n },\n [indexUrl, graphqlUrl, catalog.defaults, effectiveOrg, refetch, session, jobs],\n );\n\n const [startError, setStartError] = useState<string | null>(null);\n const startProject = useCallback(\n (request: WebBuilderStartRequest) => {\n setStartError(null);\n // The build workflow needs the workspace's Code Assistant workflow model (its form\n // extension). Without it the agent chat (webbuilder-design-pro) builds the site\n // instead - the lane the web now trusts for chat builds (#378, #384) - rather than\n // refusing the Start.\n const workflowReady = Boolean(catalog.defaults?.formExtensionId);\n if (request.template || request.agent || !workflowReady) {\n // Template picks build through the agent chat, as on the web (#384).\n const id = uuidv4();\n agentChannels.current.add(id);\n unsavedAgentChannels.current.add(id);\n pendingAgentTurn.current = {\n channelId: id,\n text: request.template ? `${request.text}\\n\\n${templateRemixNote(request.template)}` : request.text,\n files: request.attachments,\n job: { mode: request.template ? 'remix' : 'new' },\n };\n setTurnError(null);\n setActiveChannelId(id);\n setAgentChannelId(id);\n return;\n }\n // The web mints a fresh channel + project for every new build.\n const channelId = newObjectId();\n const projectId = newObjectId();\n projectIds.current.set(channelId, projectId);\n setStartError(null);\n setActiveChannelId(channelId);\n runTurn({\n channelId,\n projectId,\n text: request.text,\n template: request.template,\n edit: null,\n referenceUrl: request.referenceUrl,\n attachments: request.attachments,\n })\n .then((error) => {\n if (error && /not set up|signing in/i.test(error)) {\n // Nothing was started: back to the studio with the reason.\n setActiveChannelId(null);\n setStartError(error);\n }\n })\n .catch(() => undefined);\n },\n [runTurn, catalog.defaults],\n );\n\n const openProject = useCallback((channelId: string) => {\n setTurnError(null);\n setActiveChannelId(channelId);\n // The agent chat follows the open site, so a chat-built site continues there.\n setAgentChannelId(channelId);\n }, []);\n const closeProject = useCallback(() => setActiveChannelId(null), []);\n\n // ── The agent pane ─────────────────────────────────────────────────────\n const work = useMemo(() => pendingWork(posts), [posts]);\n const running = Boolean(turn && turn.channelId === activeChannelId);\n const startedAt = turn?.startedAt ?? 0;\n const progress = state?.progress ?? null;\n // ── Builds left running (Projects shows them; reopening one picks its progress up) ──\n // A turn started here and left (back to Projects, another site, the screen closed)\n // is still the site's turn: its posts say how it is going, as for a turn watched live.\n const runningBuilds = useRunningBuilds();\n const openRun = runningBuilds.find((r) => r.channelId === activeChannelId) ?? null;\n const openRunState = useMemo(\n () => (openRun && posts.length ? turnState(posts, openRun.startedAt) : null),\n [openRun, posts],\n );\n const watchingLive = agentBusy || running;\n useEffect(() => {\n if (!openRun || !openRunState || watchingLive || openRunState.status === 'running') return;\n markBuildDone(openRun.channelId, openRun.startedAt);\n }, [openRun, openRunState, watchingLive]);\n // Still going, as far as its posts say (none back yet counts: the reply has not landed).\n const openRunPending = openRun !== null && !watchingLive && (!openRunState || openRunState.status === 'running');\n // Read its chat back while it runs: the reply lands as a post (the web's poll).\n useEffect(() => {\n if (!openRun || watchingLive) return undefined;\n const timer = setInterval(() => refetch().catch(() => undefined), POLL_MS);\n return () => clearInterval(timer);\n }, [openRun, watchingLive, refetch]);\n\n // Projects with a run: flagged, and listed before the server knows them (a new site\n // has no build yet, so the gallery would not show it).\n // A reply still running in a site's chat (the chat history's \"Running\", which the\n // shared chat stream marks) is a build in progress too - also one started elsewhere.\n const historyRunning = useSyncExternalStore(\n subscribeRememberedHistory,\n historyRunningChannelIds,\n historyRunningChannelIds,\n );\n const shownProjects = useMemo(() => {\n const runs = runningBuilds.filter((r) => !r.org || !effectiveOrg || r.org === effectiveOrg);\n if (!runs.length && !historyRunning.length) return projects;\n const ids = new Set([...runs.map((r) => r.channelId), ...historyRunning]);\n const rows: WebBuilderProject[] = projects.map((p) => (ids.has(p.channelId) ? { ...p, building: true } : p));\n for (const run of runs) {\n if (!projects.some((p) => p.channelId === run.channelId)) {\n rows.push({ channelId: run.channelId, title: run.title, updatedAt: run.startedAt, building: true });\n }\n }\n return rows.sort((a, b) => b.updatedAt - a.updatedAt);\n }, [projects, runningBuilds, historyRunning, effectiveOrg]);\n\n // The question the agent is waiting on, read from the raw turns (the shown ones are\n // cleaned) and from the live reply: a turn that asks parks with the question still in\n // its stream, so it is never a finished message until answered (the main chat's rule).\n const pendingAsk = useMemo(\n () =>\n pendingAskUser([\n ...(streamOnSite && chat.messages.length\n ? chat.messages\n : transcriptFromPosts(posts).map((m) => ({ role: m.role, content: m.content }))),\n ...(streamOnSite && chat.response?.trim() ? [{ role: 'assistant', content: chat.response }] : []),\n ]),\n [streamOnSite, chat.messages, chat.response, posts],\n );\n pendingAskRef.current = pendingAsk;\n\n const building = useMemo<WebBuilderBuilding | null>(() => {\n if (agentBusy && pendingAsk) {\n return { statusText: 'Waiting for your answer…', startedAt: startedAt || Date.now() };\n }\n if (agentBusy) return { statusText: 'Building with the agent…', startedAt: startedAt || Date.now() };\n if (!running && work !== 'creating' && openRun && openRunPending) {\n return { statusText: openRunState?.progress || 'Building your site…', startedAt: openRun.startedAt };\n }\n if (!running && work !== 'creating') return null;\n let fallback = 'Starting your build…';\n if (turn?.mode === 'edit') fallback = 'Updating your app…';\n if (work === 'creating') fallback = 'Starting the preview…';\n return { statusText: progress || fallback, startedAt: startedAt || Date.now() };\n }, [agentBusy, pendingAsk, running, work, turn?.mode, progress, startedAt, openRun, openRunState, openRunPending]);\n\n const messages: AgentChatMessage[] = useMemo(() => {\n const rows: AgentChatMessage[] = transcriptFromPosts(posts)\n .map((m) => ({\n id: m.id,\n role: m.role,\n content: m.role === 'user' ? userBubbleText(m.content) : displayAgentText(m.content),\n }))\n .filter((m) => m.role === 'user' || m.content.trim());\n // The person's words show at once, before their post comes back.\n const pending = running && turn?.text ? userBubbleText(turn.text) : '';\n if (pending && !rows.some((m) => m.role === 'user' && pending.startsWith(m.content))) {\n rows.push({ id: `pending-${turn?.startedAt}`, role: 'user', content: pending });\n }\n return rows;\n }, [posts, running, turn]);\n\n const send = useCallback(\n (text: string, attachments?: MessageAttachment[], target?: WebBuilderBuild | null) => {\n const channelId = activeChannelId;\n if (!channelId) return;\n // An answer to the agent's question goes to its parked turn as is (the main\n // chat's answer path): no notes, no new task, whatever lane the site is on.\n // It goes now, not queued behind the open turn the agent has parked on it, and to\n // the chat the agent asked in. Never a new task: an answer is not a build ask.\n if (pendingAskRef.current) {\n pendingAskRef.current = null;\n chat.sendMessage(text, attachments, agentChannelId || channelId, false, undefined, {\n answersAsk: true,\n }).catch(() => undefined);\n return;\n }\n const workflowReady = Boolean(catalog.defaults?.formExtensionId);\n // Hand edits ride on the next turn, so the agent keeps them (web `[Hand edits]`).\n const edits = handEditsNote(handEditsRef.current);\n handEditsRef.current = [];\n const editsNote = edits ? `\\n\\n${edits}` : '';\n if (agentLane || !workflowReady) {\n // A change to the agent's build goes to its sandbox (web `agentEditForChat`).\n const note = `${target ? `\\n\\n${agentEditNote(target)}` : ''}${editsNote}`;\n const task: AgentTurnJob = {\n mode: target || builds.length ? 'edit' : 'new',\n siteTitle: activeProject?.title || target?.title || builds[0]?.title || null,\n };\n if (!agentLane) {\n // A workflow chat in a workspace with no build workflow (as startProject):\n // the agent chat carries its turns from now on.\n agentChannels.current.add(channelId);\n if (agentChannelId !== channelId) {\n pendingAgentTurn.current = { channelId, text: `${text}${note}`, files: attachments, job: task };\n setAgentChannelId(channelId);\n return;\n }\n }\n sendAgentTurn(channelId, `${text}${note}`, attachments, task);\n return;\n }\n const projectId =\n projectIds.current.get(channelId) || target?.projectId || builds[0]?.projectId || newObjectId();\n projectIds.current.set(channelId, projectId);\n runTurn({\n channelId,\n projectId,\n text: `${text}${editsNote}`,\n template: null,\n edit: target ?? null,\n attachments,\n }).catch(() => undefined);\n },\n [\n activeChannelId,\n agentLane,\n agentChannelId,\n catalog.defaults,\n builds,\n activeProject?.title,\n runTurn,\n sendAgentTurn,\n chat,\n ],\n );\n\n const agentMessages: AgentChatMessage[] = useMemo(\n () =>\n chat.messages\n .map((m, index) => ({\n id: `${m.role}-${index}`,\n role: m.role,\n // The template note is for the agent; the person sees what they typed.\n content: m.role === 'user' ? userBubbleText(m.content) : displayAgentText(m.content),\n attachments: m.attachments,\n }))\n // A turn that only asked a question shows as the question card, not an empty bubble.\n .filter((m) => m.role === 'user' || m.content.trim()),\n [chat.messages],\n );\n\n // A run picked up again (started, left, reopened): the live stream may know nothing of\n // it, so the chat is read from its posts, the ask shows until its post comes back, and\n // the turn reads as running until the reply lands.\n const withOpenRun = useCallback(\n (rows: AgentChatMessage[]): AgentChatMessage[] => {\n if (!openRunPending || !openRun?.ask) return rows;\n const { ask } = openRun;\n if (rows.some((m) => m.role === 'user' && (m.content.startsWith(ask) || ask.startsWith(m.content)))) {\n return rows;\n }\n return [...rows, { id: `run-${openRun.startedAt}`, role: 'user', content: ask }];\n },\n [openRunPending, openRun],\n );\n const openRunStreaming = openRunPending ? openRunState?.progress || 'Building your site…' : null;\n\n const hostChat = useMemo<WebBuilderHostChat>(\n () =>\n agentLane\n ? {\n messages: withOpenRun(agentMessages.length ? agentMessages : messages),\n streaming: chat.response ? displayAgentText(chat.response) : openRunStreaming,\n busy: agentBusy || openRunPending,\n error: chat.error,\n connected: cdecli.channelConnected,\n ask: pendingAsk,\n send,\n }\n : {\n messages: withOpenRun(messages),\n streaming: running ? progress || building?.statusText || 'Working on it…' : openRunStreaming,\n busy: running || openRunPending,\n error: turnError || (session.ready ? session.error : null),\n connected: Boolean(token),\n ask: pendingAsk,\n send,\n },\n [\n agentLane,\n agentMessages,\n pendingAsk,\n withOpenRun,\n openRunStreaming,\n openRunPending,\n chat.response,\n agentBusy,\n chat.error,\n cdecli.channelConnected,\n messages,\n running,\n progress,\n building?.statusText,\n turnError,\n session.ready,\n session.error,\n token,\n send,\n ],\n );\n\n // An agent-chat site opened here (maybe built before it was adopted): adopt it, and record\n // its latest build's sandbox - an adopted project with none recorded accepts its first.\n const recordedSandboxRef = useRef(new Set<string>());\n const { recordAgentBuild } = sandboxApi;\n const latestBuild = builds[0] ?? null;\n useEffect(() => {\n const channelId = activeChannelId;\n const sandboxId = latestBuild?.sandboxId;\n if (!channelId || !agentLane || !sandboxId || agentBusy) return;\n const key = `${channelId}:${sandboxId}`;\n if (recordedSandboxRef.current.has(key)) return;\n recordedSandboxRef.current.add(key);\n const title = activeProject?.title || latestBuild.title || 'New site';\n ensureAdopted(channelId, title)\n .then((adopted) =>\n adopted\n ? recordAgentBuild(channelId, {\n sandboxId,\n previewUrl: latestBuild.previewUrl,\n title,\n snapshotId: latestBuild.snapshotId,\n })\n : null,\n )\n .then((outcome) => {\n if (__DEV__ && outcome && !outcome.ok) {\n // eslint-disable-next-line no-console\n console.warn('[WebBuilderNative] record build', { channelId, sandboxId, error: outcome.error });\n }\n })\n .catch(() => undefined);\n }, [activeChannelId, agentLane, agentBusy, latestBuild, activeProject?.title, ensureAdopted, recordAgentBuild]);\n\n // ── Waking a preview ───────────────────────────────────────────────────\n // Sandbox calls go through the backend's guarded proxy (the server holds the\n // sandbox key, an agent build's too), straight to cdecli-agent on a server without it.\n // One router per open site: the restore below and the keep-alive share it.\n const sandboxCall = useMemo(\n () =>\n createSandboxRouter({\n channelId: activeChannelId,\n proxy: sandboxApi.proxy,\n direct:\n token && indexUrl\n ? directSandboxRun(token, indexUrl)\n : async () => ({ successful: false, error: 'Not signed in to the build service.' }),\n proxyMissing: sandboxApi.proxyMissing,\n }),\n [activeChannelId, token, indexUrl, sandboxApi],\n );\n // An open build's sandbox stays awake while the person works on it (web #438 C1).\n // A sandbox found gone (the keep-alive, a wake): its preview shows as cleaned up, with Restore.\n const [goneSandboxIds, setGoneSandboxIds] = useState<ReadonlySet<string>>(() => new Set());\n const markGone = useCallback((sandboxId: string) => {\n setGoneSandboxIds((prev) => (prev.has(sandboxId) ? prev : new Set(prev).add(sandboxId)));\n }, []);\n const keepAlive = useSandboxKeepAlive({\n run: token || activeChannelId ? sandboxCall : null,\n sandboxId: builds[0]?.sandboxId,\n live: activeChannelId !== null && Boolean(builds[0]?.sandboxId),\n onGone: markGone,\n });\n const { noteActivity } = keepAlive;\n // A turn sent or answered on the open site counts as the person working on it.\n useEffect(() => {\n if (activeChannelId) noteActivity();\n }, [activeChannelId, posts.length, chat.messages.length, noteActivity]);\n // The restore point the connector named when it found a build's sandbox gone (web `savedCopyFrom`).\n const savedCopies = useRef(new Map<string, string>());\n const backupRepoRef = useRef<string | null>(null);\n const resumePreview = useCallback(\n async (build: WebBuilderBuild, opts?: { asked?: boolean }): Promise<ResumeOutcome> => {\n const channelId = activeChannelId;\n if (!build.sandboxId || (!tokenRef.current && !channelId)) return 'failed';\n noteActivity();\n const result = await wakeSandbox(sandboxCall, {\n sandboxId: build.sandboxId,\n snapshotId: build.snapshotId,\n backupRepo: backupRepoRef.current,\n templateId: build.templateId,\n previewUrl: build.previewUrl,\n asked: opts?.asked,\n });\n const named = result.savedCopy?.snapshotId;\n if (named) savedCopies.current.set(build.key, named);\n if (result.outcome === 'gone') markGone(build.sandboxId);\n return result.outcome;\n },\n [activeChannelId, sandboxCall, noteActivity, markGone],\n );\n const restorePreview = useCallback(\n async (build: WebBuilderBuild): Promise<WebBuilderRestoreResult> => {\n const channelId = activeChannelId;\n if (!build.sandboxId || (!tokenRef.current && !channelId)) {\n return { ok: false, reason: 'Sign in again to restore this site.' };\n }\n noteActivity();\n const snapshotId = savedCopies.current.get(build.key) || build.snapshotId;\n const result = await restoreFromSavedCopy(sandboxCall, {\n sandboxId: build.sandboxId,\n snapshotId,\n templateId: build.templateId,\n });\n if (result.outcome !== 'ok') return { ok: false, reason: result.reason, snapshotId: snapshotId ?? null };\n // A new sandbox: its preview replaces the expired one for this build from now on,\n // here at once and, once recorded on the project, on the web and other devices.\n rememberRestored(build.key, result.sandboxId, result.previewUrl);\n if (activeProject && activeProject.previewUrl === build.previewUrl) {\n upsertProject({ ...activeProject, previewUrl: result.previewUrl });\n }\n if (channelId && !directChannels.has(channelId)) {\n sandboxApi\n .persist({\n channelId,\n sandboxId: result.sandboxId,\n sandboxUrl: result.previewUrl.split('?')[0],\n snapshotId: snapshotId ?? null,\n previousSandboxId: build.sandboxId,\n })\n .then((saved) => {\n if (!saved.ok)\n console.warn('[WebBuilderNative] persist sandbox identity failed', saved.message);\n })\n .catch(() => undefined);\n }\n return { ok: true };\n },\n [activeChannelId, sandboxCall, noteActivity, sandboxApi, rememberRestored, activeProject, upsertProject],\n );\n\n // ── Undo / Redo (web #443) ─────────────────────────────────────────────\n const redoFor = useRef(new Map<string, WebbuilderVersion>());\n const undo = useCallback(\n async (build: WebBuilderBuild): Promise<WebBuilderUndoResult> => {\n if (!build.sandboxId) return { ok: false, message: 'There is nothing to undo yet.' };\n noteActivity();\n const outcome = await undoLastChange(sandboxCall, build.sandboxId);\n if (outcome.redo) redoFor.current.set(build.key, outcome.redo);\n else redoFor.current.delete(build.key);\n return {\n ok: outcome.ok,\n message: outcome.message,\n canRedo: Boolean(outcome.redo),\n askAgent: Boolean(outcome.listFailed) && build.origin === 'agent',\n };\n },\n [sandboxCall, noteActivity],\n );\n const redo = useCallback(\n async (build: WebBuilderBuild): Promise<WebBuilderUndoResult> => {\n const version = redoFor.current.get(build.key);\n if (!build.sandboxId || !version) return { ok: false, message: 'There is nothing to redo.' };\n const outcome = await redoChange(sandboxCall, build.sandboxId, version);\n if (outcome.ok) redoFor.current.delete(build.key);\n return { ok: outcome.ok, message: outcome.message };\n },\n [sandboxCall],\n );\n\n // ── Download code (web #438 C4) ────────────────────────────────────────\n const downloadCode = useCallback(\n async (build: WebBuilderBuild): Promise<string | null> => {\n if (!build.sandboxId) return null;\n noteActivity();\n const result = await sandboxCall(\n WEBBUILDER_EXPORT_ZIP_ACTION,\n exportZipParams(build.sandboxId, build.title),\n 10 * 60 * 1000,\n ).catch(() => null);\n return exportZipUrl(result);\n },\n [sandboxCall, noteActivity],\n );\n\n // ── Publish menu: your domain, Unpublish, Review site ──────────────────\n // Domain and Unpublish name the project, not a sandbox: the router sends them straight\n // to the connector (the proxy only takes sandbox-bound actions), as the web does.\n const apollo = useApolloClient();\n const publishTools = useMemo<WebBuilderPublishTools>(\n () => ({\n run: (build, action, params, timeoutMs = 60_000) =>\n sandboxCall(\n action,\n { ...(build.sandboxId ? { sandbox_id: build.sandboxId } : {}), ...params },\n timeoutMs,\n ).catch((err: unknown) => ({\n successful: false,\n error: err instanceof Error ? err.message : String(err),\n })),\n review: async (build) => {\n if (!activeChannelId || !build.sandboxId) return null;\n const result = await apollo.query({\n query: PRE_PUBLISH_REVIEW_QUERY,\n variables: { channelId: activeChannelId, sandboxId: build.sandboxId },\n fetchPolicy: 'network-only',\n });\n return (\n (result.data as { aiCodePrePublishReview?: unknown } | undefined)?.aiCodePrePublishReview ?? null\n );\n },\n }),\n [sandboxCall, apollo, activeChannelId],\n );\n\n // ── Project menu: settings, delete, GitHub, integrations ───────────────\n const projectTools = useMemo<WebBuilderProjectTools>(\n () => ({\n loadSettings: async (channelId) => {\n const result = await apollo.query({\n query: PROJECT_SETTINGS_QUERY,\n variables: { channelId },\n fetchPolicy: 'network-only',\n });\n const raw =\n (result.data as { aiCodeProjectSettings?: unknown } | undefined)?.aiCodeProjectSettings ?? null;\n const settings = parseProjectSettings(raw);\n if (settings) instructionsByChannel.current.set(channelId, settings.instructions);\n return raw;\n },\n updateSettings: async (channelId, patch) => {\n const result = await apollo.mutate({\n mutation: UPDATE_PROJECT_SETTINGS_MUTATION,\n variables: { channelId, input: patch },\n });\n const raw = (result.data as { aiCodeUpdateProjectSettings?: unknown } | undefined)\n ?.aiCodeUpdateProjectSettings;\n if (readSettingsUpdateReply(raw).ok) {\n if (typeof patch.instructions === 'string') {\n instructionsByChannel.current.set(channelId, patch.instructions);\n }\n // A rename shows on the tile and the header straight away.\n const row = projects.find((p) => p.channelId === channelId);\n if (typeof patch.title === 'string' && row) upsertProject({ ...row, title: patch.title });\n }\n return raw;\n },\n deleteProject: async (channelId) => {\n try {\n const result = await apollo.mutate({ mutation: DELETE_PROJECT_MUTATION, variables: { channelId } });\n const reply = readDeleteReply(\n (result.data as { aiCodeDeleteProject?: unknown } | undefined)?.aiCodeDeleteProject,\n );\n if (reply.ok) instructionsByChannel.current.delete(channelId);\n return reply;\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n if (!OUTDATED_SERVER_RE.test(message)) return { ok: false, error: message };\n }\n const result = await apollo.mutate({ mutation: DELETE_CHANNEL_MUTATION, variables: { id: channelId } });\n const done = (result.data as { deleteChannel?: boolean | null } | undefined)?.deleteChannel !== false;\n return done ? { ok: true } : { ok: false, error: 'The project could not be deleted.' };\n },\n pushToGithub: async (build, repoName) => {\n if (!build.sandboxId) return { ok: false, message: 'Wake the preview to push to GitHub.' };\n noteActivity();\n try {\n const result = await apollo.mutate({\n mutation: PUSH_TO_GITHUB_MUTATION,\n variables: { sandboxId: build.sandboxId, repoName, channelId: activeChannelId },\n });\n const payload = (\n result.data as { aiCodePushToGithub?: { success: boolean; message?: string } } | undefined\n )?.aiCodePushToGithub;\n return payload?.success\n ? { ok: true, message: payload.message || 'Push started. Follow along in the chat.' }\n : { ok: false, message: \"The push didn't start. Try again in a moment.\" };\n } catch {\n return { ok: false, message: \"The push didn't start. Check your connection and try again.\" };\n }\n },\n integrations: async (search) => {\n const result = await apollo.query({\n query: INTEGRATION_CATALOG_QUERY,\n variables: search ? { search } : {},\n fetchPolicy: 'network-only',\n });\n return (result.data as { integrationConnectors?: unknown } | undefined)?.integrationConnectors ?? [];\n },\n }),\n [apollo, projects, upsertProject, noteActivity, activeChannelId],\n );\n // The open site's instructions, for its turns.\n useEffect(() => {\n if (!activeChannelId) return;\n projectTools.loadSettings(activeChannelId).catch(() => undefined);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [activeChannelId]);\n\n // ── Code view (web Code workspace) ─────────────────────────────────────\n const codeApi = useMemo(\n () =>\n createCodeWorkspace(sandboxCall, (edit) => {\n handEditsRef.current = [...handEditsRef.current.filter((e) => e.file !== edit.file), edit];\n }),\n [sandboxCall],\n );\n const siteLiveUrl = activeProject?.liveUrl ?? null;\n // Where FINISH backed the site's code up (retention `backupRepo`): the saved code when asleep.\n const [backupRepo, setBackupRepo] = useState<{ channelId: string; repo: string | null } | null>(null);\n const readBackupRepo = sandboxApi.backupRepo;\n const newestBuildAt = builds[0]?.updatedAt;\n useEffect(() => {\n if (!activeChannelId) return undefined;\n let live = true;\n readBackupRepo(activeChannelId)\n .then((repo) => {\n if (live) setBackupRepo({ channelId: activeChannelId, repo });\n })\n .catch(() => undefined);\n return () => {\n live = false;\n };\n // A finished turn may have saved a new backup: read it again then.\n }, [activeChannelId, readBackupRepo, newestBuildAt]);\n const siteBackupRepo = backupRepo?.channelId === activeChannelId ? backupRepo.repo : null;\n backupRepoRef.current = siteBackupRepo;\n const code = useMemo<WebBuilderCodeHost>(() => {\n const target = (build: WebBuilderBuild) => ({\n sandboxId: build.sandboxId,\n savedSource: savedCodeSource({ backupRepo: siteBackupRepo, liveUrl: build.liveUrl || siteLiveUrl }),\n });\n return {\n listFiles: async (build) => {\n const r = await codeApi.listFiles(target(build));\n return {\n ok: r.ok,\n files: r.tree?.files,\n partial: r.tree?.partial,\n saved: r.saved,\n asleep: r.asleep,\n error: r.error,\n };\n },\n readFile: (build, path, saved) => codeApi.readFile(target(build), path, saved),\n saveFile: (build, path, base, draft, force) => codeApi.saveFile(target(build), path, base, draft, force),\n search: (build, query, live, openDocs) => codeApi.search(target(build), query, live, openDocs),\n };\n }, [codeApi, siteLiveUrl, siteBackupRepo]);\n\n // ── Publish ────────────────────────────────────────────────────────────\n const [deployToCloudflare] = useAiCodeDeployToCloudflareMutation({});\n const publish = useCallback(\n async (\n build: WebBuilderBuild,\n projectName: string,\n customDomain?: string,\n ): Promise<WebBuilderPublishResult> => {\n if (!build.sandboxId || !activeChannelId) {\n return { ok: false, message: 'There is nothing to publish yet.' };\n }\n if (build.origin === 'agent') {\n // Only the agent holds this sandbox's key: Publish is a request to it, and the\n // live link it replies with marks the build published (web `agentPublishMessage`).\n sendAgentTurn(activeChannelId, agentPublishMessage(build, projectName, customDomain));\n return { ok: true };\n }\n try {\n const variables = { sandboxId: build.sandboxId, projectName, channelId: activeChannelId };\n // \"Publish with this domain\": the deploy attaches it (the shared document has no such variable).\n const result = customDomain\n ? await apollo.mutate<{ aiCodeDeployToCloudflare?: { success: boolean; message?: string } }>({\n mutation: DEPLOY_WITH_DOMAIN_MUTATION,\n variables: { ...variables, customDomain },\n })\n : await deployToCloudflare({ variables });\n const payload = result.data?.aiCodeDeployToCloudflare;\n if (payload?.success) return { ok: true };\n console.warn('[WebBuilderNative] publish refused:', payload?.message);\n return { ok: false, message: \"Publishing didn't start. Try again in a moment.\" };\n } catch (err) {\n console.warn('[WebBuilderNative] publish failed:', err);\n return { ok: false, message: \"Publishing didn't start. Check your connection and try again.\" };\n }\n },\n [deployToCloudflare, activeChannelId, sendAgentTurn, apollo],\n );\n\n // Only a connection still coming up blocks the composer (the web refuses at send time):\n // a template build needs the agent chat, a workflow build the session. Anything that\n // fails a send - a workspace without a build workflow - comes back as `startNotice`.\n let startBlocked: string | null = null;\n if (!token && !cdecli.channelConnected) {\n startBlocked = session.ready && session.error ? session.error : 'Connecting to Web Builder…';\n }\n\n return {\n projects: shownProjects,\n projectsLoading: gallery.loading,\n projectsError: gallery.error,\n projectsHasMore: gallery.hasMore,\n refreshProjects,\n loadMoreProjects: gallery.loadMore,\n templates: galleryTemplates,\n templatesLoading: catalog.loading,\n templatesError: catalog.error,\n reloadTemplates,\n startBlocked,\n startNotice: startError,\n activeChannelId,\n openProject,\n closeProject,\n startProject,\n builds,\n buildsLoading: activeChannelId !== null && posts.length === 0 && !running,\n building,\n publishing: work === 'publishing',\n hostChat,\n publish,\n resumePreview,\n restorePreview,\n goneSandboxIds,\n undo,\n redo,\n downloadCode,\n publishTools,\n projectTools,\n code,\n };\n}\n"],"names":["uuidv4","_a","turn","running","_b","_c","_d","_e","_f","startedAt","result"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {useMemo,useCallback}from'react';import {useRecordSurfaceJobMutation,useUpdateSurfaceJobMutation}from'common/graphql';import {config}from'../../config/env-config.js';import {resolveMobileWebUrl,getPackagerHost}from'../../bridge/resolveMobileWebUrl.js';import {webBuilderJobRecord,surfaceJobRef,webBuilderJobFinish}from'../../features/webbuilder/buildJob.js';import {cleanPrompt,stripAgentNote,titleFromPrompt}from'../../features/webbuilder/buildFragments.js';import {markBuildRunning,markBuildDone}from'./runningBuilds.js';var __defProp = Object.defineProperty;
|
|
1
|
+
import {useMemo,useCallback}from'react';import {useRecordSurfaceJobMutation,useUpdateSurfaceJobMutation}from'common/graphql';import {config}from'../../config/env-config.js';import {resolveMobileWebUrl,getPackagerHost}from'../../bridge/resolveMobileWebUrl.js';import {webBuilderJobRecord,surfaceJobRef,webBuilderJobFinish}from'../../features/webbuilder/buildJob.js';import {cleanPrompt,stripAgentNote,siteNameFromRequest,titleFromPrompt}from'../../features/webbuilder/buildFragments.js';import {markBuildRunning,markBuildDone}from'./runningBuilds.js';var __defProp = Object.defineProperty;
|
|
2
2
|
var __defProps = Object.defineProperties;
|
|
3
3
|
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
4
4
|
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
@@ -26,7 +26,7 @@ function useWebBuilderJobs(org = "") {
|
|
|
26
26
|
markBuildRunning({
|
|
27
27
|
channelId: start.channelId,
|
|
28
28
|
org,
|
|
29
|
-
title: start.siteTitle || titleFromPrompt(stripAgentNote(start.ask)) || "New site",
|
|
29
|
+
title: start.siteTitle || siteNameFromRequest(start.ask) || titleFromPrompt(stripAgentNote(start.ask)) || "New site",
|
|
30
30
|
ask: cleanPrompt(stripAgentNote(start.ask)).replace(/^build\s*me\s*:\s*/i, ""),
|
|
31
31
|
lane: start.lane,
|
|
32
32
|
startedAt: start.startedAt
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useWebBuilderJobs.js","sources":["../../../src/screens/WebBuilderNative/useWebBuilderJobs.ts"],"sourcesContent":["/**\n * Records each Web Builder turn as a server-owned surface job (features/webbuilder/buildJob)\n * and settles it. Best effort by design: a build never waits on, or fails because of, its\n * task record.\n */\nimport { useCallback, useMemo } from 'react';\nimport { useRecordSurfaceJobMutation, useUpdateSurfaceJobMutation } from 'common/graphql';\nimport { config } from '../../config/env-config';\nimport { getPackagerHost, resolveMobileWebUrl } from '../../bridge/resolveMobileWebUrl';\nimport {\n surfaceJobRef,\n webBuilderJobFinish,\n webBuilderJobRecord,\n type SurfaceJobRef,\n type WebBuilderJobOutcome,\n type WebBuilderJobStart,\n} from '../../features/webbuilder/buildJob';\nimport {
|
|
1
|
+
{"version":3,"file":"useWebBuilderJobs.js","sources":["../../../src/screens/WebBuilderNative/useWebBuilderJobs.ts"],"sourcesContent":["/**\n * Records each Web Builder turn as a server-owned surface job (features/webbuilder/buildJob)\n * and settles it. Best effort by design: a build never waits on, or fails because of, its\n * task record.\n */\nimport { useCallback, useMemo } from 'react';\nimport { useRecordSurfaceJobMutation, useUpdateSurfaceJobMutation } from 'common/graphql';\nimport { config } from '../../config/env-config';\nimport { getPackagerHost, resolveMobileWebUrl } from '../../bridge/resolveMobileWebUrl';\nimport {\n surfaceJobRef,\n webBuilderJobFinish,\n webBuilderJobRecord,\n type SurfaceJobRef,\n type WebBuilderJobOutcome,\n type WebBuilderJobStart,\n} from '../../features/webbuilder/buildJob';\nimport {\n cleanPrompt,\n siteNameFromRequest,\n stripAgentNote,\n titleFromPrompt,\n} from '../../features/webbuilder/buildFragments';\nimport { markBuildDone, markBuildRunning } from './runningBuilds';\n\n/** How long a turn waits for its job's report token before it goes out without one (surface-kit's cap). */\nconst RECORD_WAIT_MS = 2_000;\n\nexport interface WebBuilderJob {\n /** The server record's id once it lands (null when recording failed). */\n id: Promise<string | null>;\n /** The ref the chat turn carries, when the record came back in time with a report token. */\n ref: SurfaceJobRef | null;\n /** The site it runs on and when it started: Projects shows it as building until it settles. */\n channelId: string;\n startedAt: number;\n}\n\nexport function useWebBuilderJobs(org = ''): {\n begin: (start: Omit<WebBuilderJobStart, 'webOrigin'>) => Promise<WebBuilderJob>;\n finish: (job: WebBuilderJob | Promise<WebBuilderJob> | null | undefined, outcome: WebBuilderJobOutcome) => void;\n} {\n const [recordJob] = useRecordSurfaceJobMutation();\n const [updateJob] = useUpdateSurfaceJobMutation();\n const webOrigin = useMemo(() => resolveMobileWebUrl(config.CLIENT_URL, getPackagerHost()), []);\n\n const begin = useCallback(\n async (start: Omit<WebBuilderJobStart, 'webOrigin'>): Promise<WebBuilderJob> => {\n // Projects shows the site as building from now on, even after leaving it.\n markBuildRunning({\n channelId: start.channelId,\n org,\n title:\n start.siteTitle ||\n siteNameFromRequest(start.ask) ||\n titleFromPrompt(stripAgentNote(start.ask)) ||\n 'New site',\n ask: cleanPrompt(stripAgentNote(start.ask)).replace(/^build\\s*me\\s*:\\s*/i, ''),\n lane: start.lane,\n startedAt: start.startedAt,\n });\n const recorded = recordJob({ variables: { job: webBuilderJobRecord({ ...start, webOrigin }) } })\n .then((result) => result.data?.recordSurfaceJob ?? null)\n .catch((err: unknown) => {\n console.warn('[WebBuilderNative] task record failed:', err);\n return null;\n });\n const inTime = await Promise.race([\n recorded,\n new Promise<undefined>((resolve) => {\n setTimeout(() => resolve(undefined), RECORD_WAIT_MS);\n }),\n ]);\n return {\n id: recorded.then((r) => r?.id ?? null),\n ref: surfaceJobRef(inTime),\n channelId: start.channelId,\n startedAt: start.startedAt,\n };\n },\n [recordJob, webOrigin, org],\n );\n\n const finish = useCallback(\n (job: WebBuilderJob | Promise<WebBuilderJob> | null | undefined, outcome: WebBuilderJobOutcome) => {\n if (!job) return;\n Promise.resolve(job)\n .then((recorded) => {\n markBuildDone(recorded.channelId, recorded.startedAt);\n return recorded.id;\n })\n .then((id) => {\n if (!id) return undefined;\n // The agent's verdict, when it reported first, wins on the server.\n return updateJob({ variables: { id, patch: webBuilderJobFinish(outcome) } });\n })\n .catch((err: unknown) => console.warn('[WebBuilderNative] task settle failed:', err));\n },\n [updateJob],\n );\n\n // Stable: callers keep it in effect dependencies.\n return useMemo(() => ({ begin, finish }), [begin, finish]);\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -83,7 +83,7 @@ function redoTarget(plan, after) {
|
|
|
83
83
|
return saved && SAVED_BEFORE_RESTORE.test(saved.message) ? saved : null;
|
|
84
84
|
}
|
|
85
85
|
function plainError(error, fallback) {
|
|
86
|
-
const first = String(error != null ? error : "").split("\n")[0].replace(/\s*\[[A-Z][A-Z0-9_]*(?:;[^\]]*)?\]\s*$/, "").trim();
|
|
86
|
+
const first = String(error != null ? error : "").split("\n")[0].replace(/\s*\[[A-Z][A-Z0-9_]*(?:;[^\]]*)?\]\s*$/, "").replace(/[;,]?\s*the user (?:cannot|can't|can not) fix this\.?/i, ".").replace(/\.\.$/, ".").trim();
|
|
87
87
|
return first && !/^at\s/.test(first) ? first.slice(0, 240) : fallback;
|
|
88
88
|
}
|
|
89
89
|
async function listVersions(run, sandboxId) {
|