@adminide-stack/yantra-mobile 12.0.125-alpha.1 → 12.0.126
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/canvas/AudioEditorExperience.js +207 -109
- package/lib/features/canvas/AudioEditorExperience.js.map +1 -1
- package/lib/features/canvas/CanvasAgentChatPane.js +87 -72
- package/lib/features/canvas/CanvasAgentChatPane.js.map +1 -1
- package/lib/features/canvas/CanvasBoardsGrid.js +494 -387
- package/lib/features/canvas/CanvasBoardsGrid.js.map +1 -1
- package/lib/features/canvas/CanvasChatResultCard.js +78 -59
- package/lib/features/canvas/CanvasChatResultCard.js.map +1 -1
- package/lib/features/canvas/CanvasEditToolsPanel.js +126 -84
- package/lib/features/canvas/CanvasEditToolsPanel.js.map +1 -1
- package/lib/features/canvas/CanvasExperience.js +108 -126
- package/lib/features/canvas/CanvasExperience.js.map +1 -1
- package/lib/features/canvas/CanvasGeneratePanel.js +178 -166
- package/lib/features/canvas/CanvasGeneratePanel.js.map +1 -1
- package/lib/features/canvas/CanvasLibrarySheet.js +119 -123
- package/lib/features/canvas/CanvasLibrarySheet.js.map +1 -1
- package/lib/features/canvas/CanvasLooksPanel.js +113 -89
- package/lib/features/canvas/CanvasLooksPanel.js.map +1 -1
- package/lib/features/canvas/CanvasModelPicker.js +79 -79
- package/lib/features/canvas/CanvasModelPicker.js.map +1 -1
- package/lib/features/canvas/CanvasTasksPanel.js +193 -128
- package/lib/features/canvas/CanvasTasksPanel.js.map +1 -1
- package/lib/features/canvas/CanvasTemplatesPanel.js +106 -94
- package/lib/features/canvas/CanvasTemplatesPanel.js.map +1 -1
- package/lib/features/canvas/CanvasToolDock.js +195 -127
- package/lib/features/canvas/CanvasToolDock.js.map +1 -1
- package/lib/features/canvas/FrameExtractorExperience.js +163 -100
- package/lib/features/canvas/FrameExtractorExperience.js.map +1 -1
- package/lib/features/canvas/GeneratorReferenceSlots.js +132 -69
- package/lib/features/canvas/GeneratorReferenceSlots.js.map +1 -1
- package/lib/features/canvas/ImageEditorExperience.js +278 -209
- package/lib/features/canvas/ImageEditorExperience.js.map +1 -1
- package/lib/features/canvas/InfluencerStudioExperience.js +167 -125
- package/lib/features/canvas/InfluencerStudioExperience.js.map +1 -1
- package/lib/features/canvas/MoodboardExperience.js +102 -85
- package/lib/features/canvas/MoodboardExperience.js.map +1 -1
- package/lib/features/canvas/NativeCanvasViewer.js +203 -192
- package/lib/features/canvas/NativeCanvasViewer.js.map +1 -1
- package/lib/features/canvas/PromoContextFields.js +125 -92
- package/lib/features/canvas/PromoContextFields.js.map +1 -1
- package/lib/features/canvas/SetStudioExperience.js +225 -143
- package/lib/features/canvas/SetStudioExperience.js.map +1 -1
- package/lib/features/canvas/VideoClipsExperience.js +126 -92
- package/lib/features/canvas/VideoClipsExperience.js.map +1 -1
- package/lib/features/canvas/VideoEditExperience.js +154 -142
- package/lib/features/canvas/VideoEditExperience.js.map +1 -1
- package/lib/features/canvas/VideoEditorExperience.js +551 -492
- package/lib/features/canvas/VideoEditorExperience.js.map +1 -1
- package/lib/features/canvas/VideoGeneratorExperience.js +284 -131
- package/lib/features/canvas/VideoGeneratorExperience.js.map +1 -1
- package/lib/features/canvas/canvasTasks.js +7 -3
- package/lib/features/canvas/canvasTasks.js.map +1 -1
- package/lib/features/canvas/canvasTheme.js +265 -0
- package/lib/features/canvas/canvasTheme.js.map +1 -0
- package/lib/features/canvas/canvasUi.js +381 -0
- package/lib/features/canvas/canvasUi.js.map +1 -0
- package/lib/features/canvas/recorder/CameraRecorderExperience.js +109 -52
- package/lib/features/canvas/recorder/CameraRecorderExperience.js.map +1 -1
- package/lib/features/canvas/serverTasks.js +1 -1
- package/lib/features/canvas/serverTasks.js.map +1 -1
- package/lib/features/canvas/set/SetViewportWebView.js +1 -1
- package/lib/features/canvas/set/SetViewportWebView.js.map +1 -1
- package/lib/features/canvas/videoEditor/BlurBoxOverlay.js +8 -7
- package/lib/features/canvas/videoEditor/BlurBoxOverlay.js.map +1 -1
- package/lib/features/canvas/videoEditor/ExportTaskCard.js +44 -41
- package/lib/features/canvas/videoEditor/ExportTaskCard.js.map +1 -1
- package/lib/features/canvas/videoEditor/agent/AgentCutPane.js +50 -45
- package/lib/features/canvas/videoEditor/agent/AgentCutPane.js.map +1 -1
- package/lib/features/canvas/videoEditor/exportTask.js +3 -2
- package/lib/features/canvas/videoEditor/exportTask.js.map +1 -1
- package/lib/features/canvas/videoEditor/formWidgets.js +116 -64
- package/lib/features/canvas/videoEditor/formWidgets.js.map +1 -1
- package/lib/features/canvas/videoEditor/produce/ProduceVideoSheet.js +77 -63
- package/lib/features/canvas/videoEditor/produce/ProduceVideoSheet.js.map +1 -1
- package/lib/features/canvas/videoEditor/tools/ToolsDrawer.js +95 -79
- package/lib/features/canvas/videoEditor/tools/ToolsDrawer.js.map +1 -1
- package/lib/features/design/DesignEditorExperience.js +241 -160
- package/lib/features/design/DesignEditorExperience.js.map +1 -1
- package/lib/features/design/DesignExperience.js +300 -143
- package/lib/features/design/DesignExperience.js.map +1 -1
- package/lib/features/health/HealthSyncRunner.js +9 -1
- package/lib/features/health/HealthSyncRunner.js.map +1 -1
- package/lib/features/health/backgroundSync.js +41 -0
- package/lib/features/health/backgroundSync.js.map +1 -0
- package/lib/features/health/healthConnectBackground.js +32 -0
- package/lib/features/health/healthConnectBackground.js.map +1 -0
- package/lib/features/health/healthConnectReader.js +16 -2
- package/lib/features/health/healthConnectReader.js.map +1 -1
- package/lib/features/health/healthSync.js +31 -3
- package/lib/features/health/healthSync.js.map +1 -1
- package/lib/features/health/healthSyncStore.js +89 -5
- package/lib/features/health/healthSyncStore.js.map +1 -1
- package/lib/features/health/healthkitBackground.js +17 -0
- package/lib/features/health/healthkitBackground.js.map +1 -0
- package/lib/features/health/reader.js.map +1 -1
- package/lib/features/health/sessionVault.js +38 -0
- package/lib/features/health/sessionVault.js.map +1 -0
- package/lib/features/health/syncState.js.map +1 -1
- package/lib/features/webbuilder/WebBuilderExperience.js +1 -1
- package/lib/features/webbuilder/WebBuilderExperience.js.map +1 -1
- package/lib/features/webbuilder/buildFragments.js +3 -2
- package/lib/features/webbuilder/buildFragments.js.map +1 -1
- package/lib/features/webbuilder/components/PublishSheet.js +1 -1
- package/lib/features/webbuilder/components/PublishSheet.js.map +1 -1
- package/lib/features/webbuilder/webbuilderPrompts.js +2 -5
- package/lib/features/webbuilder/webbuilderPrompts.js.map +1 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/screens/Health/index.js +12 -2
- package/lib/screens/Health/index.js.map +1 -1
- package/lib/screens/WebBuilderNative/sandboxProxyApi.js +120 -0
- package/lib/screens/WebBuilderNative/sandboxProxyApi.js.map +1 -0
- package/lib/screens/WebBuilderNative/useRestoredSandboxes.js.map +1 -1
- package/lib/screens/WebBuilderNative/useWebBuilderHost.js +26 -4
- package/lib/screens/WebBuilderNative/useWebBuilderHost.js.map +1 -1
- package/lib/screens/WebBuilderNative/webbuilderTransport.js +110 -7
- package/lib/screens/WebBuilderNative/webbuilderTransport.js.map +1 -1
- package/package.json +6 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useRestoredSandboxes.js","sources":["../../../src/screens/WebBuilderNative/useRestoredSandboxes.ts"],"sourcesContent":["/**\n * The sandboxes a build's restore point was booted into on this device (web\n * `writeRestoredSandbox`/`readRestoredSandbox`). The chat's posts still name the\n * expired sandbox, and
|
|
1
|
+
{"version":3,"file":"useRestoredSandboxes.js","sources":["../../../src/screens/WebBuilderNative/useRestoredSandboxes.ts"],"sourcesContent":["/**\n * The sandboxes a build's restore point was booted into on this device (web\n * `writeRestoredSandbox`/`readRestoredSandbox`). The chat's posts still name the\n * expired sandbox, so the new id and preview are laid over the builds read from\n * them at once. The host also records the new sandbox on the project\n * (`aiCodePersistSandboxIdentity`) for the web and other devices; this copy\n * covers the moment until that lands and a server without it.\n */\nimport { useCallback, useEffect, useState } from 'react';\nimport AsyncStorage from '@react-native-async-storage/async-storage';\nimport type { WebBuilderBuild } from '../../features/webbuilder/types';\n\nconst STORAGE_KEY = 'yantra.webbuilder.restored.v1';\n/** Restored sandboxes expire too; older entries are not worth keeping. */\nconst MAX_ENTRIES = 50;\n\nexport interface RestoredSandbox {\n sandboxId: string;\n previewUrl: string;\n at: number;\n}\n\ntype RestoredMap = Record<string, RestoredSandbox>;\n\nexport function applyRestored(builds: WebBuilderBuild[], restored: RestoredMap): WebBuilderBuild[] {\n if (!Object.keys(restored).length) return builds;\n return builds.map((build) => {\n const next = restored[build.key];\n return next ? { ...build, sandboxId: next.sandboxId, previewUrl: next.previewUrl } : build;\n });\n}\n\nexport function useRestoredSandboxes() {\n const [restored, setRestored] = useState<RestoredMap>({});\n useEffect(() => {\n let alive = true;\n AsyncStorage.getItem(STORAGE_KEY)\n .then((raw) => {\n if (!alive || !raw) return;\n const parsed = JSON.parse(raw) as RestoredMap;\n if (parsed && typeof parsed === 'object') setRestored((cur) => ({ ...parsed, ...cur }));\n })\n .catch(() => undefined);\n return () => {\n alive = false;\n };\n }, []);\n\n const remember = useCallback((buildKey: string, sandboxId: string, previewUrl: string) => {\n setRestored((cur) => {\n const entries = Object.entries({ ...cur, [buildKey]: { sandboxId, previewUrl, at: Date.now() } })\n .sort((a, b) => b[1].at - a[1].at)\n .slice(0, MAX_ENTRIES);\n const next = Object.fromEntries(entries);\n AsyncStorage.setItem(STORAGE_KEY, JSON.stringify(next)).catch(() => undefined);\n return next;\n });\n }, []);\n\n return { restored, remember };\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;AAWA,MAAM,WAAc,GAAA,+BAAA;AAEpB,MAAM,WAAc,GAAA,EAAA;AAOJ,SAAA,aAAA,CAAc,QAA2B,QAA0C,EAAA;AACjG,EAAA,IAAI,CAAC,MAAO,CAAA,IAAA,CAAK,QAAQ,CAAA,CAAE,QAAe,OAAA,MAAA;AAC1C,EAAO,OAAA,MAAA,CAAO,IAAI,CAAS,KAAA,KAAA;AACzB,IAAM,MAAA,IAAA,GAAO,QAAS,CAAA,KAAA,CAAM,GAAG,CAAA;AAC/B,IAAO,OAAA,IAAA,GAAO,iCACT,KADS,CAAA,EAAA;AAAA,MAEZ,WAAW,IAAK,CAAA,SAAA;AAAA,MAChB,YAAY,IAAK,CAAA;AAAA,KACf,CAAA,GAAA,KAAA;AAAA,GACL,CAAA;AACH;AACO,SAAS,oBAAuB,GAAA;AACrC,EAAA,MAAM,CAAC,QAAU,EAAA,WAAW,CAAI,GAAA,QAAA,CAAsB,EAAE,CAAA;AACxD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,KAAQ,GAAA,IAAA;AACZ,IAAA,YAAA,CAAa,OAAQ,CAAA,WAAW,CAAE,CAAA,IAAA,CAAK,CAAO,GAAA,KAAA;AAC5C,MAAI,IAAA,CAAC,KAAS,IAAA,CAAC,GAAK,EAAA;AACpB,MAAM,MAAA,MAAA,GAAS,IAAK,CAAA,KAAA,CAAM,GAAG,CAAA;AAC7B,MAAI,IAAA,MAAA,IAAU,OAAO,MAAW,KAAA,QAAA,cAAsB,CAAQ,GAAA,KAAA,cAAA,CAAA,cAAA,CAAA,EAAA,EACzD,SACA,GACH,CAAA,CAAA;AAAA,KACH,CAAA,CAAE,KAAM,CAAA,MAAM,MAAS,CAAA;AACxB,IAAA,OAAO,MAAM;AACX,MAAQ,KAAA,GAAA,KAAA;AAAA,KACV;AAAA,GACF,EAAG,EAAE,CAAA;AACL,EAAA,MAAM,QAAW,GAAA,WAAA,CAAY,CAAC,QAAA,EAAkB,WAAmB,UAAuB,KAAA;AACxF,IAAA,WAAA,CAAY,CAAO,GAAA,KAAA;AACjB,MAAA,MAAM,OAAU,GAAA,MAAA,CAAO,OAAQ,CAAA,aAAA,CAAA,cAAA,CAAA,EAAA,EAC1B,GAD0B,CAAA,EAAA;AAAA,QAE7B,CAAC,QAAQ,GAAG;AAAA,UACV,SAAA;AAAA,UACA,UAAA;AAAA,UACA,EAAA,EAAI,KAAK,GAAI;AAAA;AACf,QACD,CAAE,CAAA,IAAA,CAAK,CAAC,CAAA,EAAG,MAAM,CAAE,CAAA,CAAC,CAAE,CAAA,EAAA,GAAK,EAAE,CAAC,CAAA,CAAE,EAAE,CAAE,CAAA,KAAA,CAAM,GAAG,WAAW,CAAA;AACzD,MAAM,MAAA,IAAA,GAAO,MAAO,CAAA,WAAA,CAAY,OAAO,CAAA;AACvC,MAAa,YAAA,CAAA,OAAA,CAAQ,aAAa,IAAK,CAAA,SAAA,CAAU,IAAI,CAAC,CAAA,CAAE,KAAM,CAAA,MAAM,MAAS,CAAA;AAC7E,MAAO,OAAA,IAAA;AAAA,KACR,CAAA;AAAA,GACH,EAAG,EAAE,CAAA;AACL,EAAO,OAAA;AAAA,IACL,QAAA;AAAA,IACA;AAAA,GACF;AACF"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {useRef,useState,useMemo,useEffect,useCallback}from'react';import {useAiCodeDeployToCloudflareMutation}from'common/graphql';import {v4}from'uuid';import {useCdecliConnection}from'../../contexts/CdecliConnectionContext.js';import {useChatStream}from'../../hooks/useChatStream.js';import {useHostChatChannel}from'../../hooks/useHostChatChannel.js';import {config}from'../../config/env-config.js';import {useChatMessages}from'../../hooks/useChatApi.js';import {usePrerequisiteIds}from'../../hooks/usePrerequisiteIds.js';import {useCanvasSession}from'../../features/canvas/useCanvasSession.js';import {tokenClaims}from'../../features/canvas/sessionIdentity.js';import {buildsFromPosts,hasWorkflowPosts,projectFromPosts,turnState,pendingWork,transcriptFromPosts,stripAgentNote,displayAgentText}from'../../features/webbuilder/buildFragments.js';import {WEBBUILDER_CHAT_SKILL,buildTriggerParams,templateRemixNote,newObjectId}from'../../features/webbuilder/workflow.js';import {useWebBuilderGallery}from'./useWebBuilderGallery.js';import {agentEditNote,agentPublishMessage}from'../../features/webbuilder/webbuilderPrompts.js';import {useCodeAssistantCatalog}from'./useCodeAssistantCatalog.js';import {uploadAttachment,triggerBuild,restoreSandbox}from'./webbuilderTransport.js';import {useRestoredSandboxes,applyRestored}from'./useRestoredSandboxes.js';import {useWebBuilderJobs}from'./useWebBuilderJobs.js';var __defProp = Object.defineProperty;
|
|
1
|
+
import {useRef,useState,useMemo,useEffect,useCallback}from'react';import {useAiCodeDeployToCloudflareMutation}from'common/graphql';import {v4}from'uuid';import {useCdecliConnection}from'../../contexts/CdecliConnectionContext.js';import {useChatStream}from'../../hooks/useChatStream.js';import {useHostChatChannel}from'../../hooks/useHostChatChannel.js';import {config}from'../../config/env-config.js';import {useChatMessages}from'../../hooks/useChatApi.js';import {usePrerequisiteIds}from'../../hooks/usePrerequisiteIds.js';import {useCanvasSession}from'../../features/canvas/useCanvasSession.js';import {tokenClaims}from'../../features/canvas/sessionIdentity.js';import {buildsFromPosts,hasWorkflowPosts,projectFromPosts,turnState,pendingWork,transcriptFromPosts,stripAgentNote,displayAgentText}from'../../features/webbuilder/buildFragments.js';import {WEBBUILDER_CHAT_SKILL,buildTriggerParams,templateRemixNote,newObjectId}from'../../features/webbuilder/workflow.js';import {useWebBuilderGallery}from'./useWebBuilderGallery.js';import {agentEditNote,agentPublishMessage}from'../../features/webbuilder/webbuilderPrompts.js';import {useCodeAssistantCatalog}from'./useCodeAssistantCatalog.js';import {uploadAttachment,triggerBuild,createSandboxRouter,directSandboxRun,restoreSandbox}from'./webbuilderTransport.js';import {useSandboxProxyApi}from'./sandboxProxyApi.js';import {useRestoredSandboxes,applyRestored}from'./useRestoredSandboxes.js';import {useWebBuilderJobs}from'./useWebBuilderJobs.js';var __defProp = Object.defineProperty;
|
|
2
2
|
var __defProps = Object.defineProperties;
|
|
3
3
|
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
4
4
|
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
@@ -465,12 +465,23 @@ ${agentEditNote(target)}` : "";
|
|
|
465
465
|
connected: Boolean(token),
|
|
466
466
|
send
|
|
467
467
|
}, [agentLane, agentMessages, chat.response, agentBusy, chat.error, cdecli.channelConnected, messages, running, progress, building == null ? void 0 : building.statusText, turnError, session.ready, session.error, token, send]);
|
|
468
|
+
const sandboxApi = useSandboxProxyApi();
|
|
468
469
|
const resumePreview = useCallback(async (build) => {
|
|
469
470
|
const {
|
|
470
471
|
current
|
|
471
472
|
} = tokenRef;
|
|
472
|
-
|
|
473
|
-
|
|
473
|
+
const channelId = activeChannelId;
|
|
474
|
+
if (!build.sandboxId || !current && !channelId) return "failed";
|
|
475
|
+
const call = createSandboxRouter({
|
|
476
|
+
channelId,
|
|
477
|
+
proxy: sandboxApi.proxy,
|
|
478
|
+
direct: current && indexUrl ? directSandboxRun(current, indexUrl) : async () => ({
|
|
479
|
+
successful: false,
|
|
480
|
+
error: "Not signed in to the build service."
|
|
481
|
+
}),
|
|
482
|
+
proxyMissing: sandboxApi.proxyMissing
|
|
483
|
+
});
|
|
484
|
+
const result = await restoreSandbox(call, {
|
|
474
485
|
sandboxId: build.sandboxId,
|
|
475
486
|
snapshotId: build.snapshotId,
|
|
476
487
|
templateId: build.templateId
|
|
@@ -482,9 +493,20 @@ ${agentEditNote(target)}` : "";
|
|
|
482
493
|
previewUrl: result.previewUrl
|
|
483
494
|
}));
|
|
484
495
|
}
|
|
496
|
+
if (channelId) {
|
|
497
|
+
sandboxApi.persist({
|
|
498
|
+
channelId,
|
|
499
|
+
sandboxId: result.sandboxId,
|
|
500
|
+
sandboxUrl: result.previewUrl.split("?")[0],
|
|
501
|
+
snapshotId: build.snapshotId,
|
|
502
|
+
previousSandboxId: build.sandboxId
|
|
503
|
+
}).then((saved) => {
|
|
504
|
+
if (!saved.ok) console.warn("[WebBuilderNative] persist sandbox identity failed", saved.message);
|
|
505
|
+
}).catch(() => void 0);
|
|
506
|
+
}
|
|
485
507
|
}
|
|
486
508
|
return result.outcome;
|
|
487
|
-
}, [indexUrl, rememberRestored, activeProject, upsertProject]);
|
|
509
|
+
}, [activeChannelId, indexUrl, sandboxApi, rememberRestored, activeProject, upsertProject]);
|
|
488
510
|
const [deployToCloudflare] = useAiCodeDeployToCloudflareMutation({});
|
|
489
511
|
const publish = useCallback(async (build, projectName) => {
|
|
490
512
|
var _a2;
|
|
@@ -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 } from 'react';\nimport { useAiCodeDeployToCloudflareMutation } from 'common/graphql';\nimport { v4 as uuidv4 } from 'uuid';\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 { 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 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} from '../../features/webbuilder/types';\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 { restoreSandbox, triggerBuild, uploadAttachment, type ResumeOutcome } from './webbuilderTransport';\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;\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}\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 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 const agentLane =\n activeChannelId !== null &&\n (agentChannels.current.has(activeChannelId) || (posts.length > 0 && !hasWorkflowPosts(posts)));\n const agentBusy = agentLane && (chat.isLoading || chat.isStreaming);\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();\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 Promise.all([ready, 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],\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 const building = useMemo<WebBuilderBuilding | null>(() => {\n if (agentBusy) return { statusText: 'Building with the agent…', startedAt: startedAt || Date.now() };\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, running, work, turn?.mode, progress, startedAt]);\n\n const messages: AgentChatMessage[] = useMemo(() => {\n const rows: AgentChatMessage[] = transcriptFromPosts(posts).map((m) => ({\n id: m.id,\n role: m.role,\n content: m.role === 'user' ? stripAgentNote(m.content) : displayAgentText(m.content),\n }));\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 const workflowReady = Boolean(catalog.defaults?.formExtensionId);\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)}` : '';\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({ channelId, projectId, text, template: null, edit: target ?? null, attachments }).catch(\n () => undefined,\n );\n },\n [\n activeChannelId,\n agentLane,\n agentChannelId,\n catalog.defaults,\n builds,\n activeProject?.title,\n runTurn,\n sendAgentTurn,\n ],\n );\n\n const agentMessages: AgentChatMessage[] = useMemo(\n () =>\n chat.messages.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 [chat.messages],\n );\n\n const hostChat = useMemo<WebBuilderHostChat>(\n () =>\n agentLane\n ? {\n messages: agentMessages,\n streaming: chat.response ? displayAgentText(chat.response) : null,\n busy: agentBusy,\n error: chat.error,\n connected: cdecli.channelConnected,\n send,\n }\n : {\n messages,\n streaming: running ? progress || building?.statusText || 'Working on it…' : null,\n busy: running,\n error: turnError || (session.ready ? session.error : null),\n connected: Boolean(token),\n send,\n },\n [\n agentLane,\n agentMessages,\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 // ── Waking a preview ───────────────────────────────────────────────────\n const resumePreview = useCallback(\n async (build: WebBuilderBuild): Promise<ResumeOutcome> => {\n const { current } = tokenRef;\n if (!current || !indexUrl || !build.sandboxId) return 'failed';\n const result = await restoreSandbox(current, indexUrl, {\n sandboxId: build.sandboxId,\n snapshotId: build.snapshotId,\n templateId: build.templateId,\n });\n // A new sandbox: its preview replaces the expired one for this build from now on.\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 }\n return result.outcome;\n },\n [indexUrl, rememberRestored, activeProject, upsertProject],\n );\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,\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 };\n}\n"],"names":["uuidv4","_a","running","_b","_c","_d","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 } from 'react';\nimport { useAiCodeDeployToCloudflareMutation } from 'common/graphql';\nimport { v4 as uuidv4 } from 'uuid';\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 { 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 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} from '../../features/webbuilder/types';\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 { 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;\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}\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 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 const agentLane =\n activeChannelId !== null &&\n (agentChannels.current.has(activeChannelId) || (posts.length > 0 && !hasWorkflowPosts(posts)));\n const agentBusy = agentLane && (chat.isLoading || chat.isStreaming);\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();\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 Promise.all([ready, 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],\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 const building = useMemo<WebBuilderBuilding | null>(() => {\n if (agentBusy) return { statusText: 'Building with the agent…', startedAt: startedAt || Date.now() };\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, running, work, turn?.mode, progress, startedAt]);\n\n const messages: AgentChatMessage[] = useMemo(() => {\n const rows: AgentChatMessage[] = transcriptFromPosts(posts).map((m) => ({\n id: m.id,\n role: m.role,\n content: m.role === 'user' ? stripAgentNote(m.content) : displayAgentText(m.content),\n }));\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 const workflowReady = Boolean(catalog.defaults?.formExtensionId);\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)}` : '';\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({ channelId, projectId, text, template: null, edit: target ?? null, attachments }).catch(\n () => undefined,\n );\n },\n [\n activeChannelId,\n agentLane,\n agentChannelId,\n catalog.defaults,\n builds,\n activeProject?.title,\n runTurn,\n sendAgentTurn,\n ],\n );\n\n const agentMessages: AgentChatMessage[] = useMemo(\n () =>\n chat.messages.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 [chat.messages],\n );\n\n const hostChat = useMemo<WebBuilderHostChat>(\n () =>\n agentLane\n ? {\n messages: agentMessages,\n streaming: chat.response ? displayAgentText(chat.response) : null,\n busy: agentBusy,\n error: chat.error,\n connected: cdecli.channelConnected,\n send,\n }\n : {\n messages,\n streaming: running ? progress || building?.statusText || 'Working on it…' : null,\n busy: running,\n error: turnError || (session.ready ? session.error : null),\n connected: Boolean(token),\n send,\n },\n [\n agentLane,\n agentMessages,\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 // ── 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 const sandboxApi = useSandboxProxyApi();\n const resumePreview = useCallback(\n async (build: WebBuilderBuild): Promise<ResumeOutcome> => {\n const { current } = tokenRef;\n const channelId = activeChannelId;\n if (!build.sandboxId || (!current && !channelId)) return 'failed';\n const call = createSandboxRouter({\n channelId,\n proxy: sandboxApi.proxy,\n direct:\n current && indexUrl\n ? directSandboxRun(current, indexUrl)\n : async () => ({ successful: false, error: 'Not signed in to the build service.' }),\n proxyMissing: sandboxApi.proxyMissing,\n });\n const result = await restoreSandbox(call, {\n sandboxId: build.sandboxId,\n snapshotId: build.snapshotId,\n templateId: build.templateId,\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, indexUrl, sandboxApi, rememberRestored, activeProject, upsertProject],\n );\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,\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 };\n}\n"],"names":["uuidv4","_a","running","_b","_c","_d","startedAt"],"mappings":";;;;;;;;;;;;;;;;;;;AAyCA,MAAM,OAAU,GAAA,IAAA;AAChB,MAAM,eAAA,GAAkB,KAAK,EAAK,GAAA,GAAA;AAKlC,MAAM,mBAAA,GAAsB,IAAI,EAAK,GAAA,GAAA;AA6CrC,SAAS,SAAS,GAAqB,EAAA;AACrC,EAAO,OAAA,CAAA,0BAAA,EAA6B,OAAO,gBAAgB,CAAA,6DAAA,CAAA;AAC7D;AACA,SAAS,YAAY,KAAuB,EAAA;AAC1C,EAAA,IAAI,0BAA2B,CAAA,IAAA,CAAK,KAAK,CAAA,EAAU,OAAA,uDAAA;AACnD,EAAA,IAAI,0BAA2B,CAAA,IAAA,CAAK,KAAK,CAAA,EAAU,OAAA,wEAAA;AACnD,EAAO,OAAA,oCAAA;AACT;AACO,SAAS,kBAAkB,QAAmC,EAAA;AApGrE,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AAqGE,EAAM,MAAA;AAAA,IACJ,OAAA;AAAA,IACA,SAAW,EAAA;AAAA,MACT,kBAAmB,EAAA;AACvB,EAAA,MAAM,UAAU,gBAAiB,EAAA;AACjC,EAAM,MAAA;AAAA,IACJ,KAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACE,GAAA,OAAA;AACJ,EAAA,MAAM,aAAa,MAAO,CAAA,CAAA,EAAA,GAAA,WAAA,CAAY,KAAK,CAAE,CAAA,OAAA,KAAnB,YAA8B,EAAE,CAAA;AAC1D,EAAM,MAAA,YAAA,GAAe,QAAY,IAAA,OAAA,IAAW,UAAc,IAAA,EAAA;AAC1D,EAAM,MAAA,QAAA,GAAW,OAAO,KAAK,CAAA;AAC7B,EAAA,QAAA,CAAS,OAAU,GAAA,KAAA;AAGnB,EAAM,MAAA,OAAA,GAAU,wBAAwB,YAAY,CAAA;AACpD,EAAA,MAAM,kBAAkB,OAAQ,CAAA,MAAA;AAGhC,EAAA,MAAM,YAAY,MAAO,CAAA,WAAA;AACzB,EAAM,MAAA,OAAA,GAAU,oBAAqB,CAAA,YAAA,EAAc,SAAS,CAAA;AAC5D,EAAM,MAAA;AAAA,IACJ,QAAA;AAAA,IACA,OAAS,EAAA,eAAA;AAAA,IACT,MAAQ,EAAA;AAAA,GACN,GAAA,OAAA;AAGJ,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAI,SAAwB,IAAI,CAAA;AAC1E,EAAA,MAAM,UAAa,GAAA,MAAA,iBAAW,IAAA,GAAA,EAAqB,CAAA;AACnD,EAAM,MAAA;AAAA,IACJ,KAAO,EAAA,QAAA;AAAA,IACP;AAAA,GACF,GAAI,gBAAgB,eAAe,CAAA;AACnC,EAAM,MAAA,KAAA,GAAQ,OAAQ,CAAA,MAAM,eAAkB,GAAA,QAAA,GAAwB,EAAI,EAAA,CAAC,eAAiB,EAAA,QAAQ,CAAC,CAAA;AACrG,EAAA,MAAM,gBAAgB,QAAS,CAAA,IAAA,CAAK,CAAK,CAAA,KAAA,CAAA,CAAE,cAAc,eAAe,CAAA;AACxE,EAAA,MAAM,UAAa,GAAA,OAAA,CAAQ,MAAM,eAAA,CAAgB,OAAO,aAAe,IAAA,IAAA,GAAA,MAAA,GAAA,aAAA,CAAA,KAAA,EAAO,SAAS,CAAA,EAAG,CAAC,KAAA,EAAO,aAAe,IAAA,IAAA,GAAA,MAAA,GAAA,aAAA,CAAA,KAAA,EAAO,SAAS,CAAC,CAAA;AAMlI,EAAA,MAAM,SAAS,mBAAoB,EAAA;AACnC,EAAM,MAAA;AAAA,IACJ,kBAAoB,EAAA;AAAA,GAClB,GAAA,MAAA;AACJ,EAAA,MAAM,CAAC,cAAgB,EAAA,iBAAiB,IAAI,QAAiB,CAAA,MAAMA,IAAQ,CAAA;AAC3E,EAAA,MAAM,aAAgB,GAAA,MAAA,iBAAW,IAAA,GAAA,EAAa,CAAA;AAC9C,EAAA,MAAM,oBAAuB,GAAA,MAAA,iBAAW,IAAA,GAAA,EAAa,CAAA;AACrD,EAAM,MAAA,gBAAA,GAAmB,OAKf,IAAI,CAAA;AACd,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,gBAAA,CAAiB,cAAc,CAAA;AAC/B,IAAO,OAAA,MAAA;AAAA,GACN,EAAA,CAAC,cAAgB,EAAA,gBAAgB,CAAC,CAAA;AACrC,EAAM,MAAA;AAAA,IACJ;AAAA,MACE,kBAAmB,CAAA;AAAA,IACrB,SAAW,EAAA,cAAA;AAAA,IACX,OAAS,EAAA,YAAA;AAAA,IACT,WAAW,YAAgB,IAAA,IAAA,GAAA,YAAA,GAAA,EAAA;AAAA,IAC3B,KAAO,EAAA;AAAA,GACR,CAAA;AACD,EAAM,MAAA,WAAA,GAAoC,QAAQ,MAAG;AAzKvD,IAAAC,IAAAA,GAAAA;AAyK2D,IAAA,OAAA;AAAA,MACvD,kBAAkB,MAAO,CAAA,gBAAA;AAAA,MACzB,WAAW,MAAO,CAAA,SAAA;AAAA,MAClB,eAAiBA,EAAAA,CAAAA,GAAAA,GAAA,MAAO,CAAA,eAAA,KAAP,OAAAA,GAA0B,GAAA,SAAA;AAAA,MAC3C,kBAAkB,MAAO,CAAA,gBAAA;AAAA,MACzB,KAAO,EAAA;AAAA,KACT;AAAA,GAAI,EAAA,CAAC,OAAO,gBAAkB,EAAA,MAAA,CAAO,WAAW,MAAO,CAAA,eAAA,EAAiB,MAAO,CAAA,gBAAgB,CAAC,CAAA;AAChG,EAAM,MAAA,IAAA,GAAO,aAAc,CAAA,cAAA,EAAgB,WAAW,CAAA;AACtD,EAAA,MAAM,SAAY,GAAA,eAAA,KAAoB,IAAS,KAAA,aAAA,CAAc,OAAQ,CAAA,GAAA,CAAI,eAAe,CAAA,IAAK,KAAM,CAAA,MAAA,GAAS,CAAK,IAAA,CAAC,iBAAiB,KAAK,CAAA,CAAA;AACxI,EAAA,MAAM,SAAY,GAAA,SAAA,KAAc,IAAK,CAAA,SAAA,IAAa,IAAK,CAAA,WAAA,CAAA;AAGvD,EAAA,MAAM,OAAO,iBAAkB,EAAA;AAC/B,EAAM,MAAA,QAAA,GAAW,OAGP,IAAI,CAAA;AACd,EAAA,MAAM,gBAAgB,WAAY,CAAA,CAAC,SAAmB,EAAA,IAAA,EAAc,OAA6B,IAAwB,KAAA;AAEvH,IAAM,MAAA,KAAA,GAAQ,qBAAqB,OAAQ,CAAA,GAAA,CAAI,SAAS,CAAI,GAAA,aAAA,EAAkB,GAAA,OAAA,CAAQ,OAAQ,EAAA;AAC9F,IAAM,MAAA,QAAA,GAAW,IAAO,GAAA,IAAA,CAAK,KAAM,CAAA;AAAA,MACjC,SAAA;AAAA,MACA,GAAK,EAAA,IAAA;AAAA,MACL,WAAW,IAAK,CAAA,SAAA;AAAA,MAChB,MAAM,IAAK,CAAA,IAAA;AAAA,MACX,IAAM,EAAA,OAAA;AAAA,MACN,SAAA,EAAW,KAAK,GAAI;AAAA,KACrB,CAAA,GAAI,OAAQ,CAAA,OAAA,CAAQ,IAAI,CAAA;AACzB,IAAQ,OAAA,CAAA,GAAA,CAAI,CAAC,KAAA,EAAO,QAAQ,CAAC,CAAE,CAAA,IAAA,CAAK,CAAC,GAAG,GAAG,CAAM,KAAA;AAC/C,MAAqB,oBAAA,CAAA,OAAA,CAAQ,OAAO,SAAS,CAAA;AAC7C,MAAI,IAAA,GAAA,WAAc,OAAU,GAAA;AAAA,QAC1B,SAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,OAAO,KAAK,WAAY,CAAA,IAAA,EAAM,KAAO,EAAA,SAAA,EAAW,OAAO,MAAW,EAAA;AAAA,QAChE,KAAK,GAAK,IAAA,IAAA,GAAA,MAAA,GAAA,GAAA,CAAA;AAAA,OACX,CAAA;AAAA,KACF,CAAE,CAAA,IAAA,CAAK,CAAW,OAAA,KAAA;AA9MvB,MAAAA,IAAAA,GAAAA;AA+MM,MAAI,IAAA,OAAA,KAAY,cAAYA,GAAA,GAAA,QAAA,CAAS,YAAT,IAAAA,GAAAA,MAAAA,GAAAA,GAAAA,CAAkB,eAAc,SAAW,EAAA;AACvE,MAAK,IAAA,CAAA,MAAA,CAAO,QAAS,CAAA,OAAA,CAAQ,GAAK,EAAA;AAAA,QAChC,EAAI,EAAA,KAAA;AAAA,QACJ,OAAA,EAAS,KAAK,GAAI,EAAA;AAAA,QAClB,KAAO,EAAA;AAAA,OACR,CAAA;AACD,MAAA,QAAA,CAAS,OAAU,GAAA,IAAA;AAAA,KACpB,CAAA,CAAE,KAAM,CAAA,MAAM,MAAS,CAAA;AAAA,GACvB,EAAA,CAAC,IAAM,EAAA,aAAA,EAAe,IAAI,CAAC,CAAA;AAE9B,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,UAAU,gBAAiB,CAAA,OAAA;AACjC,IAAA,IAAI,CAAC,OAAA,IAAW,OAAQ,CAAA,SAAA,KAAc,cAAgB,EAAA;AACtD,IAAA,gBAAA,CAAiB,OAAU,GAAA,IAAA;AAC3B,IAAA,aAAA,CAAc,QAAQ,SAAW,EAAA,OAAA,CAAQ,MAAM,OAAQ,CAAA,KAAA,EAAO,QAAQ,GAAG,CAAA;AAAA,GACxE,EAAA,CAAC,cAAgB,EAAA,aAAa,CAAC,CAAA;AAElC,EAAM,MAAA,YAAA,GAAe,OAAO,KAAK,CAAA;AACjC,EAAA,SAAA,CAAU,MAAM;AACd,IAAI,IAAA,YAAA,CAAa,WAAW,CAAC,SAAA,WAAqB,CAAA,KAAA,CAAM,MAAM,MAAS,CAAA;AACvE,IAAA,YAAA,CAAa,OAAU,GAAA,SAAA;AAAA,GACtB,EAAA,CAAC,SAAW,EAAA,OAAO,CAAC,CAAA;AAGvB,EAAM,MAAA;AAAA,IACJ,QAAA;AAAA,IACA,QAAU,EAAA;AAAA,MACR,oBAAqB,EAAA;AACzB,EAAM,MAAA,MAAA,GAAS,QAAQ,MAAM;AAC3B,IAAA,IAAI,WAAW,MAAU,IAAA,CAAC,WAAkB,OAAA,aAAA,CAAc,YAAY,QAAQ,CAAA;AAC9E,IAAM,MAAA,GAAA,GAAM,KAAK,GAAI,EAAA;AACrB,IAAA,OAAO,gBAAgB,IAAK,CAAA,QAAA,CAAS,GAAI,CAAA,CAAC,GAAG,KAAW,MAAA;AAAA,MACtD,EAAA,EAAI,QAAQ,KAAK,CAAA,CAAA;AAAA,MACjB,SAAS,CAAE,CAAA,OAAA;AAAA,MACX,KAAO,EAAA;AAAA,QACL,IAAM,EAAA,CAAA,CAAE,IAAS,KAAA,MAAA,GAAS,MAAS,GAAA;AAAA,OACrC;AAAA,MACA,WAAW,IAAI,IAAA,CAAK,GAAM,GAAA,KAAK,EAAE,WAAY;AAAA,KAC7C,CAAA,CAAA,EAAG,aAAe,IAAA,IAAA,GAAA,MAAA,GAAA,aAAA,CAAA,KAAA,EAAO,SAAS,CAAA;AAAA,GACtC,EAAG,CAAC,UAAA,EAAY,SAAW,EAAA,IAAA,CAAK,UAAU,aAAe,IAAA,IAAA,GAAA,MAAA,GAAA,aAAA,CAAA,KAAA,EAAO,SAAW,EAAA,QAAQ,CAAC,CAAA;AAKpF,EAAM,MAAA,QAAA,GAAW,IAAK,CAAA,SAAA,IAAa,IAAK,CAAA,WAAA;AACxC,EAAM,MAAA,WAAA,GAAc,OAAO,KAAK,CAAA;AAChC,EAAA,SAAA,CAAU,MAAM;AACd,IAAM,MAAA,KAAA,GAAQ,WAAY,CAAA,OAAA,IAAW,CAAC,QAAA;AACtC,IAAA,WAAA,CAAY,OAAU,GAAA,QAAA;AACtB,IAAA,MAAMC,WAAU,QAAS,CAAA,OAAA;AACzB,IAAA,IAAI,CAAC,KAAS,IAAA,CAACA,QAAWA,IAAAA,QAAAA,CAAQ,cAAc,cAAgB,EAAA;AAChE,IAAA,QAAA,CAAS,OAAU,GAAA,IAAA;AACnB,IAAA,IAAA,CAAK,MAAOA,CAAAA,QAAAA,CAAQ,GAAK,EAAA,IAAA,CAAK,KAAQ,GAAA;AAAA,MACpC,EAAI,EAAA,KAAA;AAAA,MACJ,OAAA,EAAS,KAAK,GAAI,EAAA;AAAA,MAClB,OAAO,IAAK,CAAA;AAAA,KACV,GAAA;AAAA,MACF,EAAI,EAAA,IAAA;AAAA,MACJ,OAAA,EAAS,KAAK,GAAI,EAAA;AAAA,MAClB,OAAO,eAAoBA,KAAAA,QAAAA,CAAQ,SAAY,GAAA,MAAA,CAAO,CAAC,CAAI,GAAA;AAAA,KAC5D,CAAA;AAAA,GACH,EAAG,CAAC,QAAU,EAAA,cAAA,EAAgB,KAAK,KAAO,EAAA,eAAA,EAAiB,MAAQ,EAAA,IAAI,CAAC,CAAA;AAGxE,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,eAAA,IAAmB,KAAM,CAAA,MAAA,KAAW,CAAG,EAAA;AAC5C,IAAA,MAAM,MAAM,gBAAiB,CAAA;AAAA,MAC3B,EAAI,EAAA,eAAA;AAAA,MACJ,OAAO,aAAe,IAAA,IAAA,GAAA,MAAA,GAAA,aAAA,CAAA;AAAA,KACxB,EAAG,OAAO,SAAS,CAAA;AACnB,IAAI,IAAA,GAAA,gBAAmB,GAAG,CAAA;AAAA,GAC5B,EAAG,CAAC,eAAiB,EAAA,KAAA,EAAO,WAAW,aAAe,EAAA,aAAA,IAAA,IAAA,GAAA,MAAA,GAAA,aAAA,CAAe,KAAK,CAAC,CAAA;AAG3E,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAA6B,IAAI,CAAA;AACzD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAwB,IAAI,CAAA;AAC9D,EAAA,MAAM,QAAQ,OAAQ,CAAA,MAAM,IAAQ,IAAA,IAAA,CAAK,cAAc,eAAkB,GAAA,SAAA,CAAU,KAAO,EAAA,IAAA,CAAK,SAAS,CAAI,GAAA,IAAA,EAAM,CAAC,IAAM,EAAA,eAAA,EAAiB,KAAK,CAAC,CAAA;AAChJ,EAAA,SAAA,CAAU,MAAM;AA5RlB,IAAAD,IAAAA,GAAAA;AA6RI,IAAI,IAAA,CAAC,IAAQ,IAAA,CAAC,KAAO,EAAA;AACrB,IAAI,IAAA,KAAA,CAAM,WAAW,MAAQ,EAAA;AAC3B,MAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,MAAK,IAAA,CAAA,MAAA,CAAO,KAAK,GAAK,EAAA;AAAA,QACpB,EAAI,EAAA,IAAA;AAAA,QACJ,OAAA,EAAS,KAAK,GAAI,EAAA;AAAA,QAClB,QAAOA,GAAA,GAAA,UAAA,CAAW,CAAC,CAAA,KAAZ,OAAAA,GAAiB,GAAA;AAAA,OACzB,CAAA;AAAA;AAEH,IAAI,IAAA,KAAA,CAAM,WAAW,QAAU,EAAA;AAC7B,MAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,MAAA,YAAA,CAAa,MAAM,KAAK,CAAA;AACxB,MAAK,IAAA,CAAA,MAAA,CAAO,KAAK,GAAK,EAAA;AAAA,QACpB,EAAI,EAAA,KAAA;AAAA,QACJ,OAAA,EAAS,KAAK,GAAI,EAAA;AAAA,QAClB,KAAA,EAAO,MAAM,KAAS,IAAA;AAAA,OACvB,CAAA;AAAA;AACH,KACC,CAAC,IAAA,EAAM,KAAO,EAAA,UAAA,EAAY,IAAI,CAAC,CAAA;AAElC,EAAM,MAAA,QAAA,GAAW,OAIP,IAAI,CAAA;AACd,EAAA,IAAI,IAAM,EAAA;AACR,IAAM,MAAA,IAAA,GAAA,CAAA,CAAO,cAAS,OAAT,KAAA,IAAA,GAAA,MAAA,GAAA,EAAA,CAAkB,eAAc,IAAK,CAAA,SAAA,GAAY,SAAS,OAAU,GAAA,IAAA;AACjF,IAAA,QAAA,CAAS,OAAU,GAAA;AAAA,MACjB,WAAW,IAAK,CAAA,SAAA;AAAA,MAChB,UAAU,KAAU,KAAA,IAAA;AAAA,MACpB,KAAO,EAAA,OAAA,CAAA,CAAQ,IAAM,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA,CAAA,KAAA,MAAS,+BAAO,KAAK,CAAA;AAAA,KAC5C;AAAA;AAIF,EAAA,SAAA,CAAU,MAAM;AACd,IAAI,IAAA,CAAC,MAAa,OAAA,MAAA;AAClB,IAAM,MAAA,KAAA,GAAQ,YAAY,MAAM;AAC9B,MAAA,MAAM,OAAU,GAAA,IAAA,CAAK,GAAI,EAAA,GAAI,IAAK,CAAA,SAAA;AAClC,MAAA,MAAM,OAAO,QAAS,CAAA,OAAA;AACtB,MAAM,MAAA,UAAA,GAAA,CAAa,6BAAM,SAAc,MAAA,IAAA,CAAK,aAAa,IAAK,CAAA,QAAA,IAAY,CAAC,IAAK,CAAA,KAAA;AAChF,MAAI,IAAA,UAAA,IAAc,UAAU,mBAAqB,EAAA;AAC/C,QAAA,MAAM,OAAU,GAAA,gFAAA;AAChB,QAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,QAAA,YAAA,CAAa,OAAO,CAAA;AACpB,QAAK,IAAA,CAAA,MAAA,CAAO,KAAK,GAAK,EAAA;AAAA,UACpB,EAAI,EAAA,KAAA;AAAA,UACJ,OAAA,EAAS,KAAK,GAAI,EAAA;AAAA,UAClB,KAAO,EAAA;AAAA,SACR,CAAA;AACD,QAAA;AAAA;AAEF,MAAA,IAAI,UAAU,eAAiB,EAAA;AAC7B,QAAA,MAAM,OAAU,GAAA,oFAAA;AAChB,QAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,QAAA,YAAA,CAAa,OAAO,CAAA;AACpB,QAAK,IAAA,CAAA,MAAA,CAAO,KAAK,GAAK,EAAA;AAAA,UACpB,EAAI,EAAA,KAAA;AAAA,UACJ,OAAA,EAAS,KAAK,GAAI,EAAA;AAAA,UAClB,KAAO,EAAA;AAAA,SACR,CAAA;AACD,QAAA;AAAA;AAEF,MAAQ,OAAA,EAAA,CAAE,KAAM,CAAA,MAAM,MAAS,CAAA;AAAA,OAC9B,OAAO,CAAA;AACV,IAAO,OAAA,MAAM,cAAc,KAAK,CAAA;AAAA,GAC/B,EAAA,CAAC,IAAM,EAAA,OAAA,EAAS,IAAI,CAAC,CAAA;AACxB,EAAM,MAAA,OAAA,GAAU,WAAY,CAAA,OAAO,IAQL,KAAA;AAxWhC,IAAAA,IAAAA,GAAAA,EAAAE,GAAAC,EAAAA,GAAAA,EAAAC,GAAA,EAAA,EAAA,EAAA,EAAA;AAyWI,IAAM,MAAA;AAAA,MACJ;AAAA,KACE,GAAA,QAAA;AACJ,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,QAAA,EAAiB,OAAA,yDAAA;AAClC,IAAA,IAAI,IAA4B,GAAA,KAAA;AAChC,IAAI,IAAA,IAAA,CAAK,MAAa,IAAA,GAAA,MAAA;AAAA,SAAA,IAAA,CAAgBJ,MAAA,IAAK,CAAA,QAAA,KAAL,IAAAA,GAAAA,MAAAA,GAAAA,GAAAA,CAAe,YAAmB,IAAA,GAAA,OAAA;AACxE,IAAA,MAAM,QAAY,GAAA,CAAA,MAAM,OAAQ,CAAA,GAAA,CAAA,CAAA,CAAKE,MAAA,IAAK,CAAA,WAAA,KAAL,IAAAA,GAAAA,GAAAA,GAAoB,EAAI,EAAA,GAAA,CAAI,CAAQ,IAAA,KAAA,gBAAA,CAAiB,SAAS,QAAU,EAAA;AAAA,MAC3G,MAAM,IAAK,CAAA,IAAA;AAAA,MACX,KAAK,IAAK,CAAA,GAAA;AAAA,MACV,SAAS,IAAK,CAAA,OAAA;AAAA,MACd,UAAU,IAAK,CAAA;AAAA,KAChB,CAAC,CAAC,CAAA,EAAG,OAAO,CAAC,CAAA,KAAkC,MAAM,IAAI,CAAA;AAC1D,IAAA,MAAM,QAAQ,kBAAmB,CAAA,aAAA,CAAA,cAAA,CAAA,cAAA,CAAA,cAAA,CAAA;AAAA,MAC/B,WAAW,IAAK,CAAA,SAAA;AAAA,MAChB,WAAW,IAAK,CAAA,SAAA;AAAA,MAChB,MAAM,IAAK,CAAA,IAAA;AAAA,MACX,QAAUC,EAAAA,CAAAA,GAAAA,GAAA,IAAK,CAAA,QAAA,KAAL,OAAAA,GAAiB,GAAA,MAAA;AAAA,MAC3B,UAAU,OAAQ,CAAA,QAAA;AAAA,MAClB;AAAA,KAAA,EACI,KAAK,IAAO,GAAA;AAAA,MACd,IAAM,EAAA;AAAA,QACJ,SAAA,EAAW,KAAK,IAAK,CAAA,SAAA;AAAA,QACrB,UAAA,EAAY,KAAK,IAAK,CAAA,UAAA;AAAA,QACtB,KAAA,EAAO,KAAK,IAAK,CAAA;AAAA,OACnB;AAAA;AAAA,MAEA,SAAA,EAAW,KAAK,IAAK,CAAA;AAAA,KACnB,GAAA,EACA,CAAA,EAAA,IAAA,CAAK,YAAe,GAAA;AAAA,MACtB,cAAc,IAAK,CAAA;AAAA,KACjB,GAAA,EACA,CAAA,EAAA,QAAA,CAAS,MAAS,GAAA;AAAA,MACpB,WAAa,EAAA;AAAA,KACf,GAAI,EArB2B,CAAA,EAAA;AAAA,MAsB/B,UAAA;AAAA,MACA,KAAO,EAAA;AAAA,KACR,CAAA,CAAA;AACD,IAAA,IAAI,CAAC,KAAA,CAAM,EAAI,EAAA,OAAO,SAAS,YAAY,CAAA;AAC3C,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAME,MAAAA,UAAAA,GAAY,KAAK,GAAI,EAAA;AAG3B,IAAM,MAAA,GAAA,GAAM,KAAK,KAAM,CAAA;AAAA,MACrB,WAAW,IAAK,CAAA,SAAA;AAAA,MAChB,WAAW,IAAK,CAAA,SAAA;AAAA,MAChB,KAAK,IAAK,CAAA,IAAA;AAAA,MACV,SAAA,EAAA,CAAW,MAAAD,GAAA,GAAA,IAAA,CAAK,SAAL,IAAAA,GAAAA,MAAAA,GAAAA,GAAAA,CAAW,UAAX,IAAoB,GAAA,EAAA,GAAA,IAAA;AAAA,MAC/B,IAAA;AAAA,MACA,IAAM,EAAA,UAAA;AAAA,MACN,SAAAC,EAAAA;AAAA,KACD,CAAA;AACD,IAAQ,OAAA,CAAA;AAAA,MACN,WAAW,IAAK,CAAA,SAAA;AAAA,MAChB,MAAM,IAAK,CAAA,IAAA;AAAA,MACX,SAAAA,EAAAA,UAAAA;AAAA,MACA,IAAA;AAAA,MACA;AAAA,KACD,CAAA;AACD,IAAA,MAAM,UAAU,MAAM,YAAA,CAAa,OAAS,EAAA,QAAA,EAAU,MAAM,MAAM,CAAA;AAClE,IAAI,IAAA,CAAC,QAAQ,EAAI,EAAA;AACf,MAAM,MAAA,MAAA,GAAA,CAAS,EAAQ,GAAA,OAAA,CAAA,KAAA,KAAR,IAAiB,GAAA,EAAA,GAAA,EAAA;AAChC,MAAQ,OAAA,CAAA,IAAA,CAAK,sCAAsC,MAAM,CAAA;AACzD,MAAI,IAAA,OAAA,CAAQ,IAAM,EAAA,OAAA,CAAQ,KAAM,EAAA;AAChC,MAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,MAAa,YAAA,CAAA,WAAA,CAAY,MAAM,CAAC,CAAA;AAChC,MAAA,IAAA,CAAK,OAAO,GAAK,EAAA;AAAA,QACf,EAAI,EAAA,KAAA;AAAA,QACJ,OAAA,EAAS,KAAK,GAAI,EAAA;AAAA,QAClB,KAAA,EAAO,YAAY,MAAM;AAAA,OAC1B,CAAA;AACD,MAAA,OAAO,YAAY,MAAM,CAAA;AAAA;AAE3B,IAAQ,OAAA,EAAA,CAAE,KAAM,CAAA,MAAM,MAAS,CAAA;AAC/B,IAAO,OAAA,IAAA;AAAA,GACT,EAAG,CAAC,QAAA,EAAU,UAAY,EAAA,OAAA,CAAQ,UAAU,YAAc,EAAA,OAAA,EAAS,OAAS,EAAA,IAAI,CAAC,CAAA;AACjF,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAwB,IAAI,CAAA;AAChE,EAAM,MAAA,YAAA,GAAe,WAAY,CAAA,CAAC,OAAoC,KAAA;AArbxE,IAAAL,IAAAA,GAAAA;AAsbI,IAAA,aAAA,CAAc,IAAI,CAAA;AAKlB,IAAA,MAAM,gBAAgB,OAAQA,CAAAA,CAAAA,GAAAA,GAAA,QAAQ,QAAR,KAAA,IAAA,GAAA,MAAA,GAAAA,IAAkB,eAAe,CAAA;AAC/D,IAAA,IAAI,OAAQ,CAAA,QAAA,IAAY,OAAQ,CAAA,KAAA,IAAS,CAAC,aAAe,EAAA;AAEvD,MAAA,MAAM,KAAKD,EAAO,EAAA;AAClB,MAAc,aAAA,CAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAC5B,MAAqB,oBAAA,CAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACnC,MAAA,gBAAA,CAAiB,OAAU,GAAA;AAAA,QACzB,SAAW,EAAA,EAAA;AAAA,QACX,IAAM,EAAA,OAAA,CAAQ,QAAW,GAAA,CAAA,EAAG,QAAQ,IAAI;;AAAA,EAAO,iBAAkB,CAAA,OAAA,CAAQ,QAAQ,CAAC,KAAK,OAAQ,CAAA,IAAA;AAAA,QAC/F,OAAO,OAAQ,CAAA,WAAA;AAAA,QACf,GAAK,EAAA;AAAA,UACH,IAAA,EAAM,OAAQ,CAAA,QAAA,GAAW,OAAU,GAAA;AAAA;AACrC,OACF;AACA,MAAA,YAAA,CAAa,IAAI,CAAA;AACjB,MAAA,kBAAA,CAAmB,EAAE,CAAA;AACrB,MAAA,iBAAA,CAAkB,EAAE,CAAA;AACpB,MAAA;AAAA;AAGF,IAAA,MAAM,YAAY,WAAY,EAAA;AAC9B,IAAA,MAAM,YAAY,WAAY,EAAA;AAC9B,IAAW,UAAA,CAAA,OAAA,CAAQ,GAAI,CAAA,SAAA,EAAW,SAAS,CAAA;AAC3C,IAAA,aAAA,CAAc,IAAI,CAAA;AAClB,IAAA,kBAAA,CAAmB,SAAS,CAAA;AAC5B,IAAQ,OAAA,CAAA;AAAA,MACN,SAAA;AAAA,MACA,SAAA;AAAA,MACA,MAAM,OAAQ,CAAA,IAAA;AAAA,MACd,UAAU,OAAQ,CAAA,QAAA;AAAA,MAClB,IAAM,EAAA,IAAA;AAAA,MACN,cAAc,OAAQ,CAAA,YAAA;AAAA,MACtB,aAAa,OAAQ,CAAA;AAAA,KACtB,CAAE,CAAA,IAAA,CAAK,CAAS,KAAA,KAAA;AACf,MAAA,IAAI,KAAS,IAAA,wBAAA,CAAyB,IAAK,CAAA,KAAK,CAAG,EAAA;AAEjD,QAAA,kBAAA,CAAmB,IAAI,CAAA;AACvB,QAAA,aAAA,CAAc,KAAK,CAAA;AAAA;AACrB,KACD,CAAA,CAAE,KAAM,CAAA,MAAM,MAAS,CAAA;AAAA,GACvB,EAAA,CAAC,OAAS,EAAA,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAC9B,EAAM,MAAA,WAAA,GAAc,WAAY,CAAA,CAAC,SAAsB,KAAA;AACrD,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,kBAAA,CAAmB,SAAS,CAAA;AAE5B,IAAA,iBAAA,CAAkB,SAAS,CAAA;AAAA,GAC7B,EAAG,EAAE,CAAA;AACL,EAAA,MAAM,eAAe,WAAY,CAAA,MAAM,mBAAmB,IAAI,CAAA,EAAG,EAAE,CAAA;AAGnE,EAAM,MAAA,IAAA,GAAO,QAAQ,MAAM,WAAA,CAAY,KAAK,CAAG,EAAA,CAAC,KAAK,CAAC,CAAA;AACtD,EAAA,MAAM,OAAU,GAAA,OAAA,CAAQ,IAAQ,IAAA,IAAA,CAAK,cAAc,eAAe,CAAA;AAClE,EAAM,MAAA,SAAA,GAAA,CAAY,EAAM,GAAA,IAAA,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA,CAAA,SAAA,KAAN,IAAmB,GAAA,EAAA,GAAA,CAAA;AACrC,EAAM,MAAA,QAAA,GAAA,CAAW,EAAO,GAAA,KAAA,IAAA,IAAA,GAAA,MAAA,GAAA,KAAA,CAAA,QAAA,KAAP,IAAmB,GAAA,EAAA,GAAA,IAAA;AACpC,EAAM,MAAA,QAAA,GAAW,QAAmC,MAAM;AACxD,IAAA,IAAI,WAAkB,OAAA;AAAA,MACpB,UAAY,EAAA,+BAAA;AAAA,MACZ,SAAA,EAAW,SAAa,IAAA,IAAA,CAAK,GAAI;AAAA,KACnC;AACA,IAAA,IAAI,CAAC,OAAA,IAAW,IAAS,KAAA,UAAA,EAAmB,OAAA,IAAA;AAC5C,IAAA,IAAI,QAAW,GAAA,2BAAA;AACf,IAAI,IAAA,CAAA,IAAA,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA,CAAM,IAAS,MAAA,MAAA,EAAmB,QAAA,GAAA,yBAAA;AACtC,IAAI,IAAA,IAAA,KAAS,YAAuB,QAAA,GAAA,4BAAA;AACpC,IAAO,OAAA;AAAA,MACL,YAAY,QAAY,IAAA,QAAA;AAAA,MACxB,SAAA,EAAW,SAAa,IAAA,IAAA,CAAK,GAAI;AAAA,KACnC;AAAA,GACF,EAAG,CAAC,SAAW,EAAA,OAAA,EAAS,MAAM,IAAM,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA,CAAA,IAAA,EAAM,QAAU,EAAA,SAAS,CAAC,CAAA;AAC9D,EAAM,MAAA,QAAA,GAA+B,QAAQ,MAAM;AACjD,IAAA,MAAM,IAA2B,GAAA,mBAAA,CAAoB,KAAK,CAAA,CAAE,IAAI,CAAM,CAAA,MAAA;AAAA,MACpE,IAAI,CAAE,CAAA,EAAA;AAAA,MACN,MAAM,CAAE,CAAA,IAAA;AAAA,MACR,OAAA,EAAS,CAAE,CAAA,IAAA,KAAS,MAAS,GAAA,cAAA,CAAe,EAAE,OAAO,CAAA,GAAI,gBAAiB,CAAA,CAAA,CAAE,OAAO;AAAA,KACnF,CAAA,CAAA;AAEF,IAAM,MAAA,OAAA,GAAU,YAAW,IAAM,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA,CAAA,IAAA,CAAA,GAAO,KAAK,IAAK,CAAA,OAAA,CAAQ,qBAAuB,EAAA,EAAE,CAAI,GAAA,EAAA;AACvF,IAAA,IAAI,OAAW,IAAA,CAAC,IAAK,CAAA,IAAA,CAAK,CAAK,CAAA,KAAA,CAAA,CAAE,IAAS,KAAA,MAAA,IAAU,OAAQ,CAAA,UAAA,CAAW,CAAE,CAAA,OAAO,CAAC,CAAG,EAAA;AAClF,MAAA,IAAA,CAAK,IAAK,CAAA;AAAA,QACR,EAAA,EAAI,CAAW,QAAA,EAAA,IAAA,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA,CAAM,SAAS,CAAA,CAAA;AAAA,QAC9B,IAAM,EAAA,MAAA;AAAA,QACN,OAAS,EAAA;AAAA,OACV,CAAA;AAAA;AAEH,IAAO,OAAA,IAAA;AAAA,GACN,EAAA,CAAC,KAAO,EAAA,OAAA,EAAS,IAAI,CAAC,CAAA;AACzB,EAAA,MAAM,IAAO,GAAA,WAAA,CAAY,CAAC,IAAA,EAAc,aAAmC,MAAoC,KAAA;AAhhBjH,IAAA,IAAAC,KAAAE,GAAAC,EAAAA,GAAAA;AAihBI,IAAA,MAAM,SAAY,GAAA,eAAA;AAClB,IAAA,IAAI,CAAC,SAAW,EAAA;AAChB,IAAA,MAAM,gBAAgB,OAAQH,CAAAA,CAAAA,GAAAA,GAAA,QAAQ,QAAR,KAAA,IAAA,GAAA,MAAA,GAAAA,IAAkB,eAAe,CAAA;AAC/D,IAAI,IAAA,SAAA,IAAa,CAAC,aAAe,EAAA;AAE/B,MAAA,MAAM,OAAO,MAAS,GAAA;;AAAA,EAAO,aAAA,CAAc,MAAM,CAAC,CAAK,CAAA,GAAA,EAAA;AACvD,MAAA,MAAM,IAAqB,GAAA;AAAA,QACzB,IAAM,EAAA,MAAA,IAAU,MAAO,CAAA,MAAA,GAAS,MAAS,GAAA,KAAA;AAAA,QACzC,SAAA,EAAA,CAAW,aAAe,IAAA,IAAA,GAAA,MAAA,GAAA,aAAA,CAAA,KAAA,MAAS,MAAQ,IAAA,IAAA,GAAA,MAAA,GAAA,MAAA,CAAA,KAAA,CAAA,KAAA,CAASE,GAAA,GAAA,MAAA,CAAO,CAAC,CAAA,KAAR,IAAAA,GAAAA,MAAAA,GAAAA,GAAAA,CAAW,KAAS,CAAA,IAAA;AAAA,OAC1E;AACA,MAAA,IAAI,CAAC,SAAW,EAAA;AAGd,QAAc,aAAA,CAAA,OAAA,CAAQ,IAAI,SAAS,CAAA;AACnC,QAAA,IAAI,mBAAmB,SAAW,EAAA;AAChC,UAAA,gBAAA,CAAiB,OAAU,GAAA;AAAA,YACzB,SAAA;AAAA,YACA,IAAM,EAAA,CAAA,EAAG,IAAI,CAAA,EAAG,IAAI,CAAA,CAAA;AAAA,YACpB,KAAO,EAAA,WAAA;AAAA,YACP,GAAK,EAAA;AAAA,WACP;AACA,UAAA,iBAAA,CAAkB,SAAS,CAAA;AAC3B,UAAA;AAAA;AACF;AAEF,MAAA,aAAA,CAAc,WAAW,CAAG,EAAA,IAAI,GAAG,IAAI,CAAA,CAAA,EAAI,aAAa,IAAI,CAAA;AAC5D,MAAA;AAAA;AAEF,IAAA,MAAM,SAAY,GAAA,UAAA,CAAW,OAAQ,CAAA,GAAA,CAAI,SAAS,CAAK,KAAA,MAAA,IAAA,IAAA,GAAA,MAAA,GAAA,MAAA,CAAQ,SAAaC,CAAAA,KAAAA,CAAAA,GAAAA,GAAA,OAAO,CAAC,CAAA,KAAR,IAAAA,GAAAA,MAAAA,GAAAA,GAAAA,CAAW,cAAa,WAAY,EAAA;AAChH,IAAW,UAAA,CAAA,OAAA,CAAQ,GAAI,CAAA,SAAA,EAAW,SAAS,CAAA;AAC3C,IAAQ,OAAA,CAAA;AAAA,MACN,SAAA;AAAA,MACA,SAAA;AAAA,MACA,IAAA;AAAA,MACA,QAAU,EAAA,IAAA;AAAA,MACV,MAAM,MAAU,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA;AAAA,MAChB;AAAA,KACD,CAAA,CAAE,KAAM,CAAA,MAAM,MAAS,CAAA;AAAA,GACvB,EAAA,CAAC,eAAiB,EAAA,SAAA,EAAW,cAAgB,EAAA,OAAA,CAAQ,QAAU,EAAA,MAAA,EAAQ,aAAe,IAAA,IAAA,GAAA,MAAA,GAAA,aAAA,CAAA,KAAA,EAAO,OAAS,EAAA,aAAa,CAAC,CAAA;AACvH,EAAM,MAAA,aAAA,GAAoC,QAAQ,MAAM,IAAA,CAAK,SAAS,GAAI,CAAA,CAAC,GAAG,KAAW,MAAA;AAAA,IACvF,EAAI,EAAA,CAAA,EAAG,CAAE,CAAA,IAAI,IAAI,KAAK,CAAA,CAAA;AAAA,IACtB,MAAM,CAAE,CAAA,IAAA;AAAA;AAAA,IAER,OAAS,EAAA,CAAA,CAAE,IAAS,KAAA,MAAA,GAAS,eAAe,CAAE,CAAA,OAAO,CAAE,CAAA,OAAA,CAAQ,qBAAuB,EAAA,EAAE,CAAI,GAAA,gBAAA,CAAiB,EAAE,OAAO,CAAA;AAAA,IACtH,aAAa,CAAE,CAAA;AAAA,GACf,CAAA,CAAA,EAAG,CAAC,IAAA,CAAK,QAAQ,CAAC,CAAA;AACpB,EAAM,MAAA,QAAA,GAAW,OAA4B,CAAA,MAAM,SAAY,GAAA;AAAA,IAC7D,QAAU,EAAA,aAAA;AAAA,IACV,WAAW,IAAK,CAAA,QAAA,GAAW,gBAAiB,CAAA,IAAA,CAAK,QAAQ,CAAI,GAAA,IAAA;AAAA,IAC7D,IAAM,EAAA,SAAA;AAAA,IACN,OAAO,IAAK,CAAA,KAAA;AAAA,IACZ,WAAW,MAAO,CAAA,gBAAA;AAAA,IAClB;AAAA,GACE,GAAA;AAAA,IACF,QAAA;AAAA,IACA,SAAW,EAAA,OAAA,GAAU,QAAY,KAAA,QAAA,IAAA,IAAA,GAAA,MAAA,GAAA,QAAA,CAAU,eAAc,qBAAmB,GAAA,IAAA;AAAA,IAC5E,IAAM,EAAA,OAAA;AAAA,IACN,KAAO,EAAA,SAAA,KAAc,OAAQ,CAAA,KAAA,GAAQ,QAAQ,KAAQ,GAAA,IAAA,CAAA;AAAA,IACrD,SAAA,EAAW,QAAQ,KAAK,CAAA;AAAA,IACxB;AAAA,GACF,EAAG,CAAC,SAAW,EAAA,aAAA,EAAe,KAAK,QAAU,EAAA,SAAA,EAAW,IAAK,CAAA,KAAA,EAAO,MAAO,CAAA,gBAAA,EAAkB,UAAU,OAAS,EAAA,QAAA,EAAU,QAAU,IAAA,IAAA,GAAA,MAAA,GAAA,QAAA,CAAA,UAAA,EAAY,SAAW,EAAA,OAAA,CAAQ,OAAO,OAAQ,CAAA,KAAA,EAAO,KAAO,EAAA,IAAI,CAAC,CAAA;AAKrM,EAAA,MAAM,aAAa,kBAAmB,EAAA;AACtC,EAAM,MAAA,aAAA,GAAgB,WAAY,CAAA,OAAO,KAAmD,KAAA;AAC1F,IAAM,MAAA;AAAA,MACJ;AAAA,KACE,GAAA,QAAA;AACJ,IAAA,MAAM,SAAY,GAAA,eAAA;AAClB,IAAA,IAAI,CAAC,KAAM,CAAA,SAAA,IAAa,CAAC,OAAW,IAAA,CAAC,WAAkB,OAAA,QAAA;AACvD,IAAA,MAAM,OAAO,mBAAoB,CAAA;AAAA,MAC/B,SAAA;AAAA,MACA,OAAO,UAAW,CAAA,KAAA;AAAA,MAClB,QAAQ,OAAW,IAAA,QAAA,GAAW,iBAAiB,OAAS,EAAA,QAAQ,IAAI,aAAa;AAAA,QAC/E,UAAY,EAAA,KAAA;AAAA,QACZ,KAAO,EAAA;AAAA,OACT,CAAA;AAAA,MACA,cAAc,UAAW,CAAA;AAAA,KAC1B,CAAA;AACD,IAAM,MAAA,MAAA,GAAS,MAAM,cAAA,CAAe,IAAM,EAAA;AAAA,MACxC,WAAW,KAAM,CAAA,SAAA;AAAA,MACjB,YAAY,KAAM,CAAA,UAAA;AAAA,MAClB,YAAY,KAAM,CAAA;AAAA,KACnB,CAAA;AAGD,IAAA,IAAI,OAAO,OAAY,KAAA,IAAA,IAAQ,MAAO,CAAA,SAAA,IAAa,OAAO,UAAY,EAAA;AACpE,MAAA,gBAAA,CAAiB,KAAM,CAAA,GAAA,EAAK,MAAO,CAAA,SAAA,EAAW,OAAO,UAAU,CAAA;AAC/D,MAAA,IAAI,aAAiB,IAAA,aAAA,CAAc,UAAe,KAAA,KAAA,CAAM,UAAY,EAAA;AAClE,QAAA,aAAA,CAAc,iCACT,aADS,CAAA,EAAA;AAAA,UAEZ,YAAY,MAAO,CAAA;AAAA,SACpB,CAAA,CAAA;AAAA;AAEH,MAAA,IAAI,SAAW,EAAA;AACb,QAAA,UAAA,CAAW,OAAQ,CAAA;AAAA,UACjB,SAAA;AAAA,UACA,WAAW,MAAO,CAAA,SAAA;AAAA,UAClB,YAAY,MAAO,CAAA,UAAA,CAAW,KAAM,CAAA,GAAG,EAAE,CAAC,CAAA;AAAA,UAC1C,YAAY,KAAM,CAAA,UAAA;AAAA,UAClB,mBAAmB,KAAM,CAAA;AAAA,SAC1B,CAAE,CAAA,IAAA,CAAK,CAAS,KAAA,KAAA;AACf,UAAA,IAAI,CAAC,KAAM,CAAA,EAAA,UAAY,IAAK,CAAA,oDAAA,EAAsD,MAAM,OAAO,CAAA;AAAA,SAChG,CAAA,CAAE,KAAM,CAAA,MAAM,MAAS,CAAA;AAAA;AAC1B;AAEF,IAAA,OAAO,MAAO,CAAA,OAAA;AAAA,GAChB,EAAG,CAAC,eAAiB,EAAA,QAAA,EAAU,YAAY,gBAAkB,EAAA,aAAA,EAAe,aAAa,CAAC,CAAA;AAG1F,EAAA,MAAM,CAAC,kBAAkB,CAAI,GAAA,mCAAA,CAAoC,EAAE,CAAA;AACnE,EAAA,MAAM,OAAU,GAAA,WAAA,CAAY,OAAO,KAAA,EAAwB,WAA0D,KAAA;AAloBvH,IAAAH,IAAAA,GAAAA;AAmoBI,IAAA,IAAI,CAAC,KAAA,CAAM,SAAa,IAAA,CAAC,eAAiB,EAAA;AACxC,MAAO,OAAA;AAAA,QACL,EAAI,EAAA,KAAA;AAAA,QACJ,OAAS,EAAA;AAAA,OACX;AAAA;AAEF,IAAI,IAAA,KAAA,CAAM,WAAW,OAAS,EAAA;AAG5B,MAAA,aAAA,CAAc,eAAiB,EAAA,mBAAA,CAAoB,KAAO,EAAA,WAAW,CAAC,CAAA;AACtE,MAAO,OAAA;AAAA,QACL,EAAI,EAAA;AAAA,OACN;AAAA;AAEF,IAAI,IAAA;AACF,MAAM,MAAA,MAAA,GAAS,MAAM,kBAAmB,CAAA;AAAA,QACtC,SAAW,EAAA;AAAA,UACT,WAAW,KAAM,CAAA,SAAA;AAAA,UACjB,WAAA;AAAA,UACA,SAAW,EAAA;AAAA;AACb,OACD,CAAA;AACD,MAAA,MAAM,OAAUA,GAAAA,CAAAA,GAAAA,GAAA,MAAO,CAAA,IAAA,KAAP,gBAAAA,GAAa,CAAA,wBAAA;AAC7B,MAAI,IAAA,OAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,OAAA,CAAS,SAAgB,OAAA;AAAA,QAC3B,EAAI,EAAA;AAAA,OACN;AACA,MAAQ,OAAA,CAAA,IAAA,CAAK,qCAAuC,EAAA,OAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,OAAA,CAAS,OAAO,CAAA;AACpE,MAAO,OAAA;AAAA,QACL,EAAI,EAAA,KAAA;AAAA,QACJ,OAAS,EAAA;AAAA,OACX;AAAA,aACO,GAAK,EAAA;AACZ,MAAQ,OAAA,CAAA,IAAA,CAAK,sCAAsC,GAAG,CAAA;AACtD,MAAO,OAAA;AAAA,QACL,EAAI,EAAA,KAAA;AAAA,QACJ,OAAS,EAAA;AAAA,OACX;AAAA;AACF,GACC,EAAA,CAAC,kBAAoB,EAAA,eAAA,EAAiB,aAAa,CAAC,CAAA;AAKvD,EAAA,IAAI,YAA8B,GAAA,IAAA;AAClC,EAAA,IAAI,CAAC,KAAA,IAAS,CAAC,MAAA,CAAO,gBAAkB,EAAA;AACtC,IAAA,YAAA,GAAe,OAAQ,CAAA,KAAA,IAAS,OAAQ,CAAA,KAAA,GAAQ,QAAQ,KAAQ,GAAA,iCAAA;AAAA;AAElE,EAAO,OAAA;AAAA,IACL,QAAA;AAAA,IACA,iBAAiB,OAAQ,CAAA,OAAA;AAAA,IACzB,eAAe,OAAQ,CAAA,KAAA;AAAA,IACvB,iBAAiB,OAAQ,CAAA,OAAA;AAAA,IACzB,eAAA;AAAA,IACA,kBAAkB,OAAQ,CAAA,QAAA;AAAA,IAC1B,WAAW,OAAQ,CAAA,SAAA;AAAA,IACnB,kBAAkB,OAAQ,CAAA,OAAA;AAAA,IAC1B,gBAAgB,OAAQ,CAAA,KAAA;AAAA,IACxB,eAAA;AAAA,IACA,YAAA;AAAA,IACA,WAAa,EAAA,UAAA;AAAA,IACb,eAAA;AAAA,IACA,WAAA;AAAA,IACA,YAAA;AAAA,IACA,YAAA;AAAA,IACA,MAAA;AAAA,IACA,eAAe,eAAoB,KAAA,IAAA,IAAQ,KAAM,CAAA,MAAA,KAAW,KAAK,CAAC,OAAA;AAAA,IAClE,QAAA;AAAA,IACA,YAAY,IAAS,KAAA,YAAA;AAAA,IACrB,QAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF;AACF"}
|
|
@@ -1,4 +1,32 @@
|
|
|
1
|
-
import {createRemoteUploadMedia,createRemoteConnectorExec}from'../../features/canvas/videoEditor/remoteMediaClient.js';import {WEBBUILDER_CONNECTOR_ID,WEBBUILDER_TRIGGER_WORKFLOW_ACTION}from'../../features/webbuilder/workflow.js';
|
|
1
|
+
import {createRemoteUploadMedia,createRemoteConnectorExec}from'../../features/canvas/videoEditor/remoteMediaClient.js';import {WEBBUILDER_CONNECTOR_ID,WEBBUILDER_TRIGGER_WORKFLOW_ACTION}from'../../features/webbuilder/workflow.js';var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
3
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
4
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
5
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
6
|
+
var __spreadValues = (a, b) => {
|
|
7
|
+
for (var prop in b || (b = {}))
|
|
8
|
+
if (__hasOwnProp.call(b, prop))
|
|
9
|
+
__defNormalProp(a, prop, b[prop]);
|
|
10
|
+
if (__getOwnPropSymbols)
|
|
11
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
12
|
+
if (__propIsEnum.call(b, prop))
|
|
13
|
+
__defNormalProp(a, prop, b[prop]);
|
|
14
|
+
}
|
|
15
|
+
return a;
|
|
16
|
+
};
|
|
17
|
+
var __objRest = (source, exclude) => {
|
|
18
|
+
var target = {};
|
|
19
|
+
for (var prop in source)
|
|
20
|
+
if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
|
|
21
|
+
target[prop] = source[prop];
|
|
22
|
+
if (source != null && __getOwnPropSymbols)
|
|
23
|
+
for (var prop of __getOwnPropSymbols(source)) {
|
|
24
|
+
if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
|
|
25
|
+
target[prop] = source[prop];
|
|
26
|
+
}
|
|
27
|
+
return target;
|
|
28
|
+
};
|
|
29
|
+
const TRIGGER_TIMEOUT_MS = 9e4;
|
|
2
30
|
async function triggerBuild(token, indexUrl, params) {
|
|
3
31
|
var _a;
|
|
4
32
|
try {
|
|
@@ -50,6 +78,84 @@ const SANDBOX_GONE_RE = /Sandbox Not Found|Paused sandbox .+ not found|sandbox \
|
|
|
50
78
|
const LIVE_PREVIEW_RE = /^https?:\/\/\d+-[a-z0-9]+[^\s"']*/i;
|
|
51
79
|
const RESUME_TIMEOUT_MS = 3 * 60 * 1e3;
|
|
52
80
|
const CREATE_TIMEOUT_MS = 10 * 60 * 1e3;
|
|
81
|
+
const SANDBOX_BOUND = /* @__PURE__ */ new Set(["WEBBUILDER_CONNECT", "WEBBUILDER_START", "WEBBUILDER_LIST_VERSIONS", "WEBBUILDER_CREATE_SANDBOX", "WEBBUILDER_READ_FILE", "WEBBUILDER_WRITE_FILES", "WEBBUILDER_RUN_COMMAND", "WEBBUILDER_SNAPSHOT", "WEBBUILDER_RESTORE_VERSION", "WEBBUILDER_BOOKMARK_VERSION", "WEBBUILDER_UPLOAD_ASSET", "WEBBUILDER_RELOAD_GITHUB", "WEBBUILDER_CLONE"]);
|
|
82
|
+
const OUTDATED_SERVER_RE = /Cannot query field|Unknown argument|Unknown type|is not defined by type|Cannot return null for non-nullable field Query\.aiCode/i;
|
|
83
|
+
function withoutKey(rec) {
|
|
84
|
+
const _a = rec, {
|
|
85
|
+
sandboxKey: _key,
|
|
86
|
+
sandbox_key: _key2
|
|
87
|
+
} = _a, rest = __objRest(_a, [
|
|
88
|
+
"sandboxKey",
|
|
89
|
+
"sandbox_key"
|
|
90
|
+
]);
|
|
91
|
+
return rest;
|
|
92
|
+
}
|
|
93
|
+
function proxyResult(raw) {
|
|
94
|
+
let value = raw;
|
|
95
|
+
if (typeof value === "string") {
|
|
96
|
+
try {
|
|
97
|
+
value = JSON.parse(value);
|
|
98
|
+
} catch (e) {
|
|
99
|
+
value = null;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
103
|
+
return {
|
|
104
|
+
successful: false,
|
|
105
|
+
error: "The server sent an empty answer."
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
const rec = value;
|
|
109
|
+
const data = rec.data && typeof rec.data === "object" && !Array.isArray(rec.data) ? withoutKey(rec.data) : rec.data;
|
|
110
|
+
const error = typeof rec.error === "string" && rec.error ? rec.error : void 0;
|
|
111
|
+
return __spreadValues({
|
|
112
|
+
successful: rec.successful === true,
|
|
113
|
+
data
|
|
114
|
+
}, error ? {
|
|
115
|
+
error
|
|
116
|
+
} : {});
|
|
117
|
+
}
|
|
118
|
+
function createSandboxRouter(deps) {
|
|
119
|
+
var _a;
|
|
120
|
+
const channelId = String((_a = deps.channelId) != null ? _a : "").trim();
|
|
121
|
+
const {
|
|
122
|
+
proxyMissing
|
|
123
|
+
} = deps;
|
|
124
|
+
return async (action, rawParams, timeoutMs) => {
|
|
125
|
+
var _a2, _b;
|
|
126
|
+
const params = withoutKey(rawParams);
|
|
127
|
+
const sandboxId = String((_a2 = params.sandbox_id) != null ? _a2 : "").trim();
|
|
128
|
+
const isCreate = action === "WEBBUILDER_CREATE_SANDBOX";
|
|
129
|
+
const proxied = deps.proxy && !proxyMissing.current && channelId && SANDBOX_BOUND.has(action) && (sandboxId || isCreate);
|
|
130
|
+
if (!proxied || !deps.proxy) return deps.direct(action, params, timeoutMs);
|
|
131
|
+
const answer = await deps.proxy({
|
|
132
|
+
channelId,
|
|
133
|
+
sandboxId,
|
|
134
|
+
action,
|
|
135
|
+
params
|
|
136
|
+
}, timeoutMs);
|
|
137
|
+
if (!answer.outdated) return (_b = answer.result) != null ? _b : {
|
|
138
|
+
successful: false,
|
|
139
|
+
error: "The server sent an empty answer."
|
|
140
|
+
};
|
|
141
|
+
proxyMissing.current = true;
|
|
142
|
+
return deps.direct(action, params, timeoutMs);
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
function directSandboxRun(token, indexUrl) {
|
|
146
|
+
const exec = createRemoteConnectorExec(token, indexUrl);
|
|
147
|
+
return async (action, params, timeoutMs) => {
|
|
148
|
+
const result = await exec(WEBBUILDER_CONNECTOR_ID, action, params, {
|
|
149
|
+
timeoutMs
|
|
150
|
+
});
|
|
151
|
+
return __spreadValues({
|
|
152
|
+
successful: result.successful !== false,
|
|
153
|
+
data: result.data
|
|
154
|
+
}, typeof result.error === "string" ? {
|
|
155
|
+
error: result.error
|
|
156
|
+
} : {});
|
|
157
|
+
};
|
|
158
|
+
}
|
|
53
159
|
function connectorData(result) {
|
|
54
160
|
const raw = result == null ? void 0 : result.data;
|
|
55
161
|
if (!raw || typeof raw !== "object") return {};
|
|
@@ -63,14 +169,11 @@ function livePreviewUrl(data) {
|
|
|
63
169
|
}
|
|
64
170
|
return null;
|
|
65
171
|
}
|
|
66
|
-
async function restoreSandbox(
|
|
172
|
+
async function restoreSandbox(call, target) {
|
|
67
173
|
var _a, _b, _c;
|
|
68
|
-
const exec = createRemoteConnectorExec(token, indexUrl);
|
|
69
174
|
const run = async (action, params, timeoutMs = RESUME_TIMEOUT_MS) => {
|
|
70
175
|
try {
|
|
71
|
-
const result = await
|
|
72
|
-
timeoutMs
|
|
73
|
-
});
|
|
176
|
+
const result = await call(action, params, timeoutMs);
|
|
74
177
|
const blob = JSON.stringify(result);
|
|
75
178
|
return {
|
|
76
179
|
ok: result.successful !== false,
|
|
@@ -148,4 +251,4 @@ async function restoreSandbox(token, indexUrl, target) {
|
|
|
148
251
|
sandboxId: nextId,
|
|
149
252
|
previewUrl: second.url || createdUrl || `https://3000-${nextId}.e2b.dev`
|
|
150
253
|
};
|
|
151
|
-
}export{restoreSandbox,triggerBuild,uploadAttachment};//# sourceMappingURL=webbuilderTransport.js.map
|
|
254
|
+
}export{OUTDATED_SERVER_RE,createSandboxRouter,directSandboxRun,proxyResult,restoreSandbox,triggerBuild,uploadAttachment};//# sourceMappingURL=webbuilderTransport.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webbuilderTransport.js","sources":["../../../src/screens/WebBuilderNative/webbuilderTransport.ts"],"sourcesContent":["/**\n * The calls the native Web Builder makes the way the web surface makes them: the\n * build workflow trigger on cdecli-agent and turn attachments, both on the app's\n * surface session - the same JWT the web surface holds as its cdecli token.\n */\nimport {\n createRemoteConnectorExec,\n createRemoteUploadMedia,\n} from '../../features/canvas/videoEditor/remoteMediaClient';\nimport { WEBBUILDER_CONNECTOR_ID, WEBBUILDER_TRIGGER_WORKFLOW_ACTION } from '../../features/webbuilder/workflow';\n\n/** The trigger answers in seconds; the build itself runs on and reports on the chat. */\nconst TRIGGER_TIMEOUT_MS = 90_000;\n\n/** `error` and `auth` (the agent refused the session) are set when `ok` is false. */\nexport interface TriggerOutcome {\n ok: boolean;\n error?: string;\n auth?: boolean;\n}\n\n/** Runs `yantra-webbuilder/WEBBUILDER_TRIGGER_WORKFLOW` with the web's params. */\nexport async function triggerBuild(\n token: string,\n indexUrl: string,\n params: Record<string, unknown>,\n): Promise<TriggerOutcome> {\n try {\n const result = await createRemoteConnectorExec(token, indexUrl)(\n WEBBUILDER_CONNECTOR_ID,\n WEBBUILDER_TRIGGER_WORKFLOW_ACTION,\n params,\n { timeoutMs: TRIGGER_TIMEOUT_MS },\n );\n if (result.successful === false) {\n const error = String(result.error ?? 'The build did not start.');\n return { ok: false, error, auth: /\\b401\\b|unauthori[sz]ed/i.test(error) };\n }\n return { ok: true };\n } catch (err) {\n const error = err instanceof Error ? err.message : String(err);\n return { ok: false, error, auth: /\\b401\\b|unauthori[sz]ed/i.test(error) };\n }\n}\n\n/** A photo or file for the turn as a URL the workflow can fetch (the web posts URLs, never base64). */\nexport async function uploadAttachment(\n token: string,\n indexUrl: string,\n file: { url?: string; dataUrl?: string; name: string; mimeType?: string },\n): Promise<{ name: string; url: string; mimeType?: string } | null> {\n if (file.url && /^https?:\\/\\//i.test(file.url)) return { name: file.name, url: file.url, mimeType: file.mimeType };\n const local = file.url || file.dataUrl;\n if (!local) return null;\n try {\n const url = await createRemoteUploadMedia(token, indexUrl)(local);\n return { name: file.name, url, mimeType: file.mimeType };\n } catch (err) {\n console.warn('[WebBuilderNative] attachment upload failed:', err);\n return null;\n }\n}\n\n/** The folders a build's project may live in (web `PREVIEW_START_WORKDIRS`). */\nconst PREVIEW_START_WORKDIRS = ['/home/yantra/repo', '/home/user/repo', '/home/yantra', '/home/user'];\n/** The sandbox was reclaimed, not paused (web `SANDBOX_GONE_RE`). */\nconst SANDBOX_GONE_RE =\n /Sandbox Not Found|Paused sandbox .+ not found|sandbox \\S+ not found|sandbox .*wasn'?t found|not found \\(404\\)|no sandbox found|does not exist|sandbox.*expired|sandbox.*killed|probably not running anymore|not running anymore|cannot be resumed|was (?:killed|deleted|destroyed)/i;\nconst LIVE_PREVIEW_RE = /^https?:\\/\\/\\d+-[a-z0-9]+[^\\s\"']*/i;\nconst RESUME_TIMEOUT_MS = 3 * 60 * 1000;\n/** Booting a restore point into a new VM takes longer (web: 10 min for CREATE). */\nconst CREATE_TIMEOUT_MS = 10 * 60 * 1000;\n\nexport type ResumeOutcome = 'ok' | 'gone' | 'failed';\n\n/** What bringing a preview back did; `sandboxId`/`previewUrl` are set when a new sandbox replaced it. */\nexport interface RestoreResult {\n outcome: ResumeOutcome;\n sandboxId?: string;\n previewUrl?: string;\n}\n\n/** The connector's own output (web `connectorData`: the result's `data`, or `data.data`). */\nfunction connectorData(result: unknown): Record<string, unknown> {\n const raw = (result as { data?: unknown } | null)?.data;\n if (!raw || typeof raw !== 'object') return {};\n const rec = raw as Record<string, unknown>;\n return rec.data && typeof rec.data === 'object' && !Array.isArray(rec.data)\n ? (rec.data as Record<string, unknown>)\n : rec;\n}\n\nfunction livePreviewUrl(data: Record<string, unknown>): string | null {\n for (const value of [data.previewUrl, data.preview_url, data.sandboxUrl, data.sandbox_url, data.url]) {\n const match = typeof value === 'string' ? LIVE_PREVIEW_RE.exec(value.trim()) : null;\n if (match) return match[0];\n }\n return null;\n}\n\n/**\n * Brings a sleeping or expired preview back without the agent, in the web's\n * `ensurePreview` order: resume the sandbox (`WEBBUILDER_CONNECT` with\n * `autoResume`) and start its dev server (`WEBBUILDER_START`) in the folder the\n * project lives in; when E2B reclaimed it, boot the build's restore point into a\n * new sandbox (`WEBBUILDER_CREATE_SANDBOX` from `snapshotId`) and start that.\n * `gone` means it is reclaimed and there is no restore point to boot.\n */\nexport async function restoreSandbox(\n token: string,\n indexUrl: string,\n target: { sandboxId: string; snapshotId?: string | null; templateId?: string | null },\n): Promise<RestoreResult> {\n const exec = createRemoteConnectorExec(token, indexUrl);\n const run = async (action: string, params: Record<string, unknown>, timeoutMs = RESUME_TIMEOUT_MS) => {\n try {\n const result = await exec(WEBBUILDER_CONNECTOR_ID, action, params, { timeoutMs });\n const blob = JSON.stringify(result);\n return {\n ok: result.successful !== false,\n gone: SANDBOX_GONE_RE.test(blob),\n blob,\n data: connectorData(result),\n };\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return { ok: false, gone: SANDBOX_GONE_RE.test(message), blob: message, data: {} };\n }\n };\n const builder = /next/i.test(target.templateId ?? '') ? 'next' : 'vite';\n /** CONNECT then START across the workdirs; the URL is the one START (or CONNECT) reports. */\n const wake = async (sandboxId: string): Promise<{ outcome: ResumeOutcome; url: string | null }> => {\n const connected = await run('WEBBUILDER_CONNECT', { sandbox_id: sandboxId, autoResume: true, builder });\n if (connected.gone) return { outcome: 'gone', url: null };\n const seen = livePreviewUrl(connected.data);\n for (const workDir of PREVIEW_START_WORKDIRS) {\n // eslint-disable-next-line no-await-in-loop -- one folder at a time, like the web\n const started = await run('WEBBUILDER_START', { sandbox_id: sandboxId, workDir, builder });\n if (started.gone) return { outcome: 'gone', url: null };\n if (started.ok) return { outcome: 'ok', url: livePreviewUrl(started.data) || seen };\n // Only \"no package.json here\" means try the next folder.\n if (!/no package\\.json/i.test(started.blob)) break;\n }\n return { outcome: connected.ok ? 'ok' : 'failed', url: seen };\n };\n\n const first = await wake(target.sandboxId);\n if (first.outcome !== 'gone') return { outcome: first.outcome };\n const snapshotId = (target.snapshotId ?? '').trim();\n if (!snapshotId) return { outcome: 'gone' };\n\n // waitBridge:false - the new id comes back as soon as E2B creates the VM; CONNECT waits for the daemon.\n const created = await run(\n 'WEBBUILDER_CREATE_SANDBOX',\n { snapshotId, builder, waitBridge: false },\n CREATE_TIMEOUT_MS,\n );\n const createdUrl = livePreviewUrl(created.data);\n const nextId =\n String(created.data.sandboxId || created.data.sandbox_id || created.data.id || '').trim() ||\n /^https?:\\/\\/\\d+-([a-z0-9]+)/i.exec(createdUrl ?? '')?.[1] ||\n '';\n if (!created.ok || !nextId) return { outcome: 'gone' };\n const second = await wake(nextId);\n if (second.outcome !== 'ok') return { outcome: 'failed' };\n return {\n outcome: 'ok',\n sandboxId: nextId,\n previewUrl: second.url || createdUrl || `https://3000-${nextId}.e2b.dev`,\n };\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"webbuilderTransport.js","sources":["../../../src/screens/WebBuilderNative/webbuilderTransport.ts"],"sourcesContent":["/**\n * The calls the native Web Builder makes the way the web surface makes them: the\n * build workflow trigger on cdecli-agent and turn attachments, both on the app's\n * surface session - the same JWT the web surface holds as its cdecli token.\n */\nimport {\n createRemoteConnectorExec,\n createRemoteUploadMedia,\n} from '../../features/canvas/videoEditor/remoteMediaClient';\nimport { WEBBUILDER_CONNECTOR_ID, WEBBUILDER_TRIGGER_WORKFLOW_ACTION } from '../../features/webbuilder/workflow';\n\n/** The trigger answers in seconds; the build itself runs on and reports on the chat. */\nconst TRIGGER_TIMEOUT_MS = 90_000;\n\n/** `error` and `auth` (the agent refused the session) are set when `ok` is false. */\nexport interface TriggerOutcome {\n ok: boolean;\n error?: string;\n auth?: boolean;\n}\n\n/** Runs `yantra-webbuilder/WEBBUILDER_TRIGGER_WORKFLOW` with the web's params. */\nexport async function triggerBuild(\n token: string,\n indexUrl: string,\n params: Record<string, unknown>,\n): Promise<TriggerOutcome> {\n try {\n const result = await createRemoteConnectorExec(token, indexUrl)(\n WEBBUILDER_CONNECTOR_ID,\n WEBBUILDER_TRIGGER_WORKFLOW_ACTION,\n params,\n { timeoutMs: TRIGGER_TIMEOUT_MS },\n );\n if (result.successful === false) {\n const error = String(result.error ?? 'The build did not start.');\n return { ok: false, error, auth: /\\b401\\b|unauthori[sz]ed/i.test(error) };\n }\n return { ok: true };\n } catch (err) {\n const error = err instanceof Error ? err.message : String(err);\n return { ok: false, error, auth: /\\b401\\b|unauthori[sz]ed/i.test(error) };\n }\n}\n\n/** A photo or file for the turn as a URL the workflow can fetch (the web posts URLs, never base64). */\nexport async function uploadAttachment(\n token: string,\n indexUrl: string,\n file: { url?: string; dataUrl?: string; name: string; mimeType?: string },\n): Promise<{ name: string; url: string; mimeType?: string } | null> {\n if (file.url && /^https?:\\/\\//i.test(file.url)) return { name: file.name, url: file.url, mimeType: file.mimeType };\n const local = file.url || file.dataUrl;\n if (!local) return null;\n try {\n const url = await createRemoteUploadMedia(token, indexUrl)(local);\n return { name: file.name, url, mimeType: file.mimeType };\n } catch (err) {\n console.warn('[WebBuilderNative] attachment upload failed:', err);\n return null;\n }\n}\n\n/** The folders a build's project may live in (web `PREVIEW_START_WORKDIRS`). */\nconst PREVIEW_START_WORKDIRS = ['/home/yantra/repo', '/home/user/repo', '/home/yantra', '/home/user'];\n/** The sandbox was reclaimed, not paused (web `SANDBOX_GONE_RE`). */\nconst SANDBOX_GONE_RE =\n /Sandbox Not Found|Paused sandbox .+ not found|sandbox \\S+ not found|sandbox .*wasn'?t found|not found \\(404\\)|no sandbox found|does not exist|sandbox.*expired|sandbox.*killed|probably not running anymore|not running anymore|cannot be resumed|was (?:killed|deleted|destroyed)/i;\nconst LIVE_PREVIEW_RE = /^https?:\\/\\/\\d+-[a-z0-9]+[^\\s\"']*/i;\nconst RESUME_TIMEOUT_MS = 3 * 60 * 1000;\n/** Booting a restore point into a new VM takes longer (web: 10 min for CREATE). */\nconst CREATE_TIMEOUT_MS = 10 * 60 * 1000;\n\nexport type ResumeOutcome = 'ok' | 'gone' | 'failed';\n\n/** What bringing a preview back did; `sandboxId`/`previewUrl` are set when a new sandbox replaced it. */\nexport interface RestoreResult {\n outcome: ResumeOutcome;\n sandboxId?: string;\n previewUrl?: string;\n}\n\n/** One connector call's answer, the same on both paths: `{ successful, data, error }`. */\nexport interface SandboxCallResult {\n successful: boolean;\n data?: unknown;\n error?: string;\n}\n\n/** `outdated`: this server has no proxy field; otherwise `result` is the connector's answer. */\nexport interface SandboxProxyAnswer {\n outdated: boolean;\n result?: SandboxCallResult;\n}\n\n/**\n * The guarded proxy `aiCodeSandboxAction(channelId, sandboxId, action, params)`:\n * the server checks the caller's role and that the sandbox belongs to the\n * channel, then adds the sandbox key from the channel's settings (an agent\n * build's key included). `outdated` = this server has no such field.\n */\nexport type SandboxProxyCall = (\n variables: { channelId: string; sandboxId: string; action: string; params: Record<string, unknown> },\n timeoutMs: number,\n) => Promise<SandboxProxyAnswer>;\n\nexport type SandboxRun = (\n action: string,\n params: Record<string, unknown>,\n timeoutMs: number,\n) => Promise<SandboxCallResult>;\n\n/** Connector actions the proxy allows (web `sandboxProxy.SANDBOX_BOUND`); the rest go direct. */\nconst SANDBOX_BOUND = new Set([\n 'WEBBUILDER_CONNECT',\n 'WEBBUILDER_START',\n 'WEBBUILDER_LIST_VERSIONS',\n 'WEBBUILDER_CREATE_SANDBOX',\n 'WEBBUILDER_READ_FILE',\n 'WEBBUILDER_WRITE_FILES',\n 'WEBBUILDER_RUN_COMMAND',\n 'WEBBUILDER_SNAPSHOT',\n 'WEBBUILDER_RESTORE_VERSION',\n 'WEBBUILDER_BOOKMARK_VERSION',\n 'WEBBUILDER_UPLOAD_ASSET',\n 'WEBBUILDER_RELOAD_GITHUB',\n 'WEBBUILDER_CLONE',\n]);\n\n/** A server without the proxy (web `isOutdatedServerError`). */\nexport const OUTDATED_SERVER_RE =\n /Cannot query field|Unknown argument|Unknown type|is not defined by type|Cannot return null for non-nullable field Query\\.aiCode/i;\n\nfunction withoutKey(rec: Record<string, unknown>): Record<string, unknown> {\n const { sandboxKey: _key, sandbox_key: _key2, ...rest } = rec;\n return rest;\n}\n\n/** The proxy's JSON answer as a connector result, with any key dropped (web `proxyResult`). */\nexport function proxyResult(raw: unknown): SandboxCallResult {\n let value = raw;\n if (typeof value === 'string') {\n try {\n value = JSON.parse(value);\n } catch {\n value = null;\n }\n }\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return { successful: false, error: 'The server sent an empty answer.' };\n }\n const rec = value as Record<string, unknown>;\n const data =\n rec.data && typeof rec.data === 'object' && !Array.isArray(rec.data)\n ? withoutKey(rec.data as Record<string, unknown>)\n : rec.data;\n const error = typeof rec.error === 'string' && rec.error ? rec.error : undefined;\n return { successful: rec.successful === true, data, ...(error ? { error } : {}) };\n}\n\n/**\n * Every sandbox call for one site, the web's `createSandboxRouter`: through the\n * proxy when the server has it (the app never holds a sandbox key), else straight\n * to cdecli-agent. A server found without the proxy stays direct for the session.\n */\nexport function createSandboxRouter(deps: {\n channelId: string | null | undefined;\n proxy: SandboxProxyCall | null;\n direct: SandboxRun;\n proxyMissing: { current: boolean };\n}): SandboxRun {\n const channelId = String(deps.channelId ?? '').trim();\n const { proxyMissing } = deps;\n return async (action, rawParams, timeoutMs) => {\n const params = withoutKey(rawParams);\n const sandboxId = String(params.sandbox_id ?? '').trim();\n const isCreate = action === 'WEBBUILDER_CREATE_SANDBOX';\n const proxied =\n deps.proxy && !proxyMissing.current && channelId && SANDBOX_BOUND.has(action) && (sandboxId || isCreate);\n if (!proxied || !deps.proxy) return deps.direct(action, params, timeoutMs);\n const answer = await deps.proxy({ channelId, sandboxId, action, params }, timeoutMs);\n if (!answer.outdated) return answer.result ?? { successful: false, error: 'The server sent an empty answer.' };\n proxyMissing.current = true;\n return deps.direct(action, params, timeoutMs);\n };\n}\n\n/** The direct path: `yantra-webbuilder` on cdecli-agent with the surface session. */\nexport function directSandboxRun(token: string, indexUrl: string): SandboxRun {\n const exec = createRemoteConnectorExec(token, indexUrl);\n return async (action, params, timeoutMs) => {\n const result = await exec(WEBBUILDER_CONNECTOR_ID, action, params, { timeoutMs });\n return {\n successful: result.successful !== false,\n data: result.data,\n ...(typeof result.error === 'string' ? { error: result.error } : {}),\n };\n };\n}\n\n/** The connector's own output (web `connectorData`: the result's `data`, or `data.data`). */\nfunction connectorData(result: unknown): Record<string, unknown> {\n const raw = (result as { data?: unknown } | null)?.data;\n if (!raw || typeof raw !== 'object') return {};\n const rec = raw as Record<string, unknown>;\n return rec.data && typeof rec.data === 'object' && !Array.isArray(rec.data)\n ? (rec.data as Record<string, unknown>)\n : rec;\n}\n\nfunction livePreviewUrl(data: Record<string, unknown>): string | null {\n for (const value of [data.previewUrl, data.preview_url, data.sandboxUrl, data.sandbox_url, data.url]) {\n const match = typeof value === 'string' ? LIVE_PREVIEW_RE.exec(value.trim()) : null;\n if (match) return match[0];\n }\n return null;\n}\n\n/**\n * Brings a sleeping or expired preview back without the agent, in the web's\n * `ensurePreview` order: resume the sandbox (`WEBBUILDER_CONNECT` with\n * `autoResume`) and start its dev server (`WEBBUILDER_START`) in the folder the\n * project lives in; when E2B reclaimed it, boot the build's restore point into a\n * new sandbox (`WEBBUILDER_CREATE_SANDBOX` from `snapshotId`) and start that.\n * `gone` means it is reclaimed and there is no restore point to boot.\n */\nexport async function restoreSandbox(\n call: SandboxRun,\n target: { sandboxId: string; snapshotId?: string | null; templateId?: string | null },\n): Promise<RestoreResult> {\n const run = async (action: string, params: Record<string, unknown>, timeoutMs = RESUME_TIMEOUT_MS) => {\n try {\n const result = await call(action, params, timeoutMs);\n const blob = JSON.stringify(result);\n return {\n ok: result.successful !== false,\n gone: SANDBOX_GONE_RE.test(blob),\n blob,\n data: connectorData(result),\n };\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return { ok: false, gone: SANDBOX_GONE_RE.test(message), blob: message, data: {} };\n }\n };\n const builder = /next/i.test(target.templateId ?? '') ? 'next' : 'vite';\n /** CONNECT then START across the workdirs; the URL is the one START (or CONNECT) reports. */\n const wake = async (sandboxId: string): Promise<{ outcome: ResumeOutcome; url: string | null }> => {\n const connected = await run('WEBBUILDER_CONNECT', { sandbox_id: sandboxId, autoResume: true, builder });\n if (connected.gone) return { outcome: 'gone', url: null };\n const seen = livePreviewUrl(connected.data);\n for (const workDir of PREVIEW_START_WORKDIRS) {\n // eslint-disable-next-line no-await-in-loop -- one folder at a time, like the web\n const started = await run('WEBBUILDER_START', { sandbox_id: sandboxId, workDir, builder });\n if (started.gone) return { outcome: 'gone', url: null };\n if (started.ok) return { outcome: 'ok', url: livePreviewUrl(started.data) || seen };\n // Only \"no package.json here\" means try the next folder.\n if (!/no package\\.json/i.test(started.blob)) break;\n }\n return { outcome: connected.ok ? 'ok' : 'failed', url: seen };\n };\n\n const first = await wake(target.sandboxId);\n if (first.outcome !== 'gone') return { outcome: first.outcome };\n const snapshotId = (target.snapshotId ?? '').trim();\n if (!snapshotId) return { outcome: 'gone' };\n\n // waitBridge:false - the new id comes back as soon as E2B creates the VM; CONNECT waits for the daemon.\n const created = await run(\n 'WEBBUILDER_CREATE_SANDBOX',\n { snapshotId, builder, waitBridge: false },\n CREATE_TIMEOUT_MS,\n );\n const createdUrl = livePreviewUrl(created.data);\n const nextId =\n String(created.data.sandboxId || created.data.sandbox_id || created.data.id || '').trim() ||\n /^https?:\\/\\/\\d+-([a-z0-9]+)/i.exec(createdUrl ?? '')?.[1] ||\n '';\n if (!created.ok || !nextId) return { outcome: 'gone' };\n const second = await wake(nextId);\n if (second.outcome !== 'ok') return { outcome: 'failed' };\n return {\n outcome: 'ok',\n sandboxId: nextId,\n previewUrl: second.url || createdUrl || `https://3000-${nextId}.e2b.dev`,\n };\n}\n"],"names":["_a"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AASA,MAAM,kBAAqB,GAAA,GAAA;AAUL,eAAA,YAAA,CAAa,KAAe,EAAA,QAAA,EAAkB,MAA0D,EAAA;AAnB9H,EAAA,IAAA,EAAA;AAoBE,EAAI,IAAA;AACF,IAAM,MAAA,MAAA,GAAS,MAAM,yBAA0B,CAAA,KAAA,EAAO,QAAQ,CAAE,CAAA,uBAAA,EAAyB,oCAAoC,MAAQ,EAAA;AAAA,MACnI,SAAW,EAAA;AAAA,KACZ,CAAA;AACD,IAAI,IAAA,MAAA,CAAO,eAAe,KAAO,EAAA;AAC/B,MAAA,MAAM,KAAQ,GAAA,MAAA,CAAA,CAAO,EAAO,GAAA,MAAA,CAAA,KAAA,KAAP,YAAgB,0BAA0B,CAAA;AAC/D,MAAO,OAAA;AAAA,QACL,EAAI,EAAA,KAAA;AAAA,QACJ,KAAA;AAAA,QACA,IAAA,EAAM,0BAA2B,CAAA,IAAA,CAAK,KAAK;AAAA,OAC7C;AAAA;AAEF,IAAO,OAAA;AAAA,MACL,EAAI,EAAA;AAAA,KACN;AAAA,WACO,GAAK,EAAA;AACZ,IAAA,MAAM,QAAQ,GAAe,YAAA,KAAA,GAAQ,GAAI,CAAA,OAAA,GAAU,OAAO,GAAG,CAAA;AAC7D,IAAO,OAAA;AAAA,MACL,EAAI,EAAA,KAAA;AAAA,MACJ,KAAA;AAAA,MACA,IAAA,EAAM,0BAA2B,CAAA,IAAA,CAAK,KAAK;AAAA,KAC7C;AAAA;AAEJ;AAGsB,eAAA,gBAAA,CAAiB,KAAe,EAAA,QAAA,EAAkB,IAS9D,EAAA;AACR,EAAA,IAAI,KAAK,GAAO,IAAA,eAAA,CAAgB,KAAK,IAAK,CAAA,GAAG,GAAU,OAAA;AAAA,IACrD,MAAM,IAAK,CAAA,IAAA;AAAA,IACX,KAAK,IAAK,CAAA,GAAA;AAAA,IACV,UAAU,IAAK,CAAA;AAAA,GACjB;AACA,EAAM,MAAA,KAAA,GAAQ,IAAK,CAAA,GAAA,IAAO,IAAK,CAAA,OAAA;AAC/B,EAAI,IAAA,CAAC,OAAc,OAAA,IAAA;AACnB,EAAI,IAAA;AACF,IAAA,MAAM,MAAM,MAAM,uBAAA,CAAwB,KAAO,EAAA,QAAQ,EAAE,KAAK,CAAA;AAChE,IAAO,OAAA;AAAA,MACL,MAAM,IAAK,CAAA,IAAA;AAAA,MACX,GAAA;AAAA,MACA,UAAU,IAAK,CAAA;AAAA,KACjB;AAAA,WACO,GAAK,EAAA;AACZ,IAAQ,OAAA,CAAA,IAAA,CAAK,gDAAgD,GAAG,CAAA;AAChE,IAAO,OAAA,IAAA;AAAA;AAEX;AAGA,MAAM,sBAAyB,GAAA,CAAC,mBAAqB,EAAA,iBAAA,EAAmB,gBAAgB,YAAY,CAAA;AAEpG,MAAM,eAAkB,GAAA,qRAAA;AACxB,MAAM,eAAkB,GAAA,oCAAA;AACxB,MAAM,iBAAA,GAAoB,IAAI,EAAK,GAAA,GAAA;AAEnC,MAAM,iBAAA,GAAoB,KAAK,EAAK,GAAA,GAAA;AAsCpC,MAAM,gCAAoB,IAAA,GAAA,CAAI,CAAC,oBAAA,EAAsB,oBAAoB,0BAA4B,EAAA,2BAAA,EAA6B,sBAAwB,EAAA,wBAAA,EAA0B,0BAA0B,qBAAuB,EAAA,4BAAA,EAA8B,+BAA+B,yBAA2B,EAAA,0BAAA,EAA4B,kBAAkB,CAAC,CAAA;AAGrW,MAAM,kBAAqB,GAAA;AAClC,SAAS,WAAW,GAAuD,EAAA;AACzE,EAAA,MAII,EAHF,GAAA,GAAA,EAAA;AAAA,IAAY,UAAA,EAAA,IAAA;AAAA,IACZ,WAAa,EAAA;AAAA,GAhIjB,GAkIM,EADC,EAAA,IAAA,GAAA,SAAA,CACD,EADC,EAAA;AAAA,IAFH,YAAA;AAAA,IACA;AAAA,GAAA,CAAA;AAGF,EAAO,OAAA,IAAA;AACT;AAGO,SAAS,YAAY,GAAiC,EAAA;AAC3D,EAAA,IAAI,KAAQ,GAAA,GAAA;AACZ,EAAI,IAAA,OAAO,UAAU,QAAU,EAAA;AAC7B,IAAI,IAAA;AACF,MAAQ,KAAA,GAAA,IAAA,CAAK,MAAM,KAAK,CAAA;AAAA,KAClB,CAAA,OAAA,CAAA,EAAA;AACN,MAAQ,KAAA,GAAA,IAAA;AAAA;AACV;AAEF,EAAI,IAAA,CAAC,SAAS,OAAO,KAAA,KAAU,YAAY,KAAM,CAAA,OAAA,CAAQ,KAAK,CAAG,EAAA;AAC/D,IAAO,OAAA;AAAA,MACL,UAAY,EAAA,KAAA;AAAA,MACZ,KAAO,EAAA;AAAA,KACT;AAAA;AAEF,EAAA,MAAM,GAAM,GAAA,KAAA;AACZ,EAAA,MAAM,OAAO,GAAI,CAAA,IAAA,IAAQ,OAAO,GAAA,CAAI,SAAS,QAAY,IAAA,CAAC,KAAM,CAAA,OAAA,CAAQ,IAAI,IAAI,CAAA,GAAI,WAAW,GAAI,CAAA,IAA+B,IAAI,GAAI,CAAA,IAAA;AAC1I,EAAM,MAAA,KAAA,GAAQ,OAAO,GAAI,CAAA,KAAA,KAAU,YAAY,GAAI,CAAA,KAAA,GAAQ,IAAI,KAAQ,GAAA,MAAA;AACvE,EAAO,OAAA,cAAA,CAAA;AAAA,IACL,UAAA,EAAY,IAAI,UAAe,KAAA,IAAA;AAAA,IAC/B;AAAA,GAAA,EACI,KAAQ,GAAA;AAAA,IACV;AAAA,MACE,EAAC,CAAA;AAET;AAOO,SAAS,oBAAoB,IAOrB,EAAA;AA9Kf,EAAA,IAAA,EAAA;AA+KE,EAAA,MAAM,YAAY,MAAO,CAAA,CAAA,EAAA,GAAA,IAAA,CAAK,cAAL,IAAkB,GAAA,EAAA,GAAA,EAAE,EAAE,IAAK,EAAA;AACpD,EAAM,MAAA;AAAA,IACJ;AAAA,GACE,GAAA,IAAA;AACJ,EAAO,OAAA,OAAO,MAAQ,EAAA,SAAA,EAAW,SAAc,KAAA;AAnLjD,IAAA,IAAAA,GAAA,EAAA,EAAA;AAoLI,IAAM,MAAA,MAAA,GAAS,WAAW,SAAS,CAAA;AACnC,IAAM,MAAA,SAAA,GAAY,QAAOA,GAAA,GAAA,MAAA,CAAO,eAAP,IAAAA,GAAAA,GAAAA,GAAqB,EAAE,CAAA,CAAE,IAAK,EAAA;AACvD,IAAA,MAAM,WAAW,MAAW,KAAA,2BAAA;AAC5B,IAAM,MAAA,OAAA,GAAU,IAAK,CAAA,KAAA,IAAS,CAAC,YAAA,CAAa,OAAW,IAAA,SAAA,IAAa,aAAc,CAAA,GAAA,CAAI,MAAM,CAAA,KAAM,SAAa,IAAA,QAAA,CAAA;AAC/G,IAAI,IAAA,CAAC,OAAW,IAAA,CAAC,IAAK,CAAA,KAAA,SAAc,IAAK,CAAA,MAAA,CAAO,MAAQ,EAAA,MAAA,EAAQ,SAAS,CAAA;AACzE,IAAM,MAAA,MAAA,GAAS,MAAM,IAAA,CAAK,KAAM,CAAA;AAAA,MAC9B,SAAA;AAAA,MACA,SAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,OACC,SAAS,CAAA;AACZ,IAAA,IAAI,CAAC,MAAO,CAAA,QAAA,EAAiB,OAAA,CAAA,EAAA,GAAA,MAAA,CAAO,WAAP,IAAiB,GAAA,EAAA,GAAA;AAAA,MAC5C,UAAY,EAAA,KAAA;AAAA,MACZ,KAAO,EAAA;AAAA,KACT;AACA,IAAA,YAAA,CAAa,OAAU,GAAA,IAAA;AACvB,IAAA,OAAO,IAAK,CAAA,MAAA,CAAO,MAAQ,EAAA,MAAA,EAAQ,SAAS,CAAA;AAAA,GAC9C;AACF;AAGgB,SAAA,gBAAA,CAAiB,OAAe,QAA8B,EAAA;AAC5E,EAAM,MAAA,IAAA,GAAO,yBAA0B,CAAA,KAAA,EAAO,QAAQ,CAAA;AACtD,EAAO,OAAA,OAAO,MAAQ,EAAA,MAAA,EAAQ,SAAc,KAAA;AAC1C,IAAA,MAAM,MAAS,GAAA,MAAM,IAAK,CAAA,uBAAA,EAAyB,QAAQ,MAAQ,EAAA;AAAA,MACjE;AAAA,KACD,CAAA;AACD,IAAO,OAAA,cAAA,CAAA;AAAA,MACL,UAAA,EAAY,OAAO,UAAe,KAAA,KAAA;AAAA,MAClC,MAAM,MAAO,CAAA;AAAA,KACT,EAAA,OAAO,MAAO,CAAA,KAAA,KAAU,QAAW,GAAA;AAAA,MACrC,OAAO,MAAO,CAAA;AAAA,QACZ,EAAC,CAAA;AAAA,GAET;AACF;AAGA,SAAS,cAAc,MAA0C,EAAA;AAC/D,EAAA,MAAM,MAAO,MAEF,IAAA,IAAA,GAAA,MAAA,GAAA,MAAA,CAAA,IAAA;AACX,EAAA,IAAI,CAAC,GAAO,IAAA,OAAO,GAAQ,KAAA,QAAA,SAAiB,EAAC;AAC7C,EAAA,MAAM,GAAM,GAAA,GAAA;AACZ,EAAA,OAAO,GAAI,CAAA,IAAA,IAAQ,OAAO,GAAA,CAAI,IAAS,KAAA,QAAA,IAAY,CAAC,KAAA,CAAM,OAAQ,CAAA,GAAA,CAAI,IAAI,CAAA,GAAI,IAAI,IAAkC,GAAA,GAAA;AACtH;AACA,SAAS,eAAe,IAA8C,EAAA;AACpE,EAAA,KAAA,MAAW,KAAS,IAAA,CAAC,IAAK,CAAA,UAAA,EAAY,IAAK,CAAA,WAAA,EAAa,IAAK,CAAA,UAAA,EAAY,IAAK,CAAA,WAAA,EAAa,IAAK,CAAA,GAAG,CAAG,EAAA;AACpG,IAAM,MAAA,KAAA,GAAQ,OAAO,KAAU,KAAA,QAAA,GAAW,gBAAgB,IAAK,CAAA,KAAA,CAAM,IAAK,EAAC,CAAI,GAAA,IAAA;AAC/E,IAAI,IAAA,KAAA,EAAc,OAAA,KAAA,CAAM,CAAC,CAAA;AAAA;AAE3B,EAAO,OAAA,IAAA;AACT;AAUsB,eAAA,cAAA,CAAe,MAAkB,MAI5B,EAAA;AAtP3B,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AAuPE,EAAA,MAAM,GAAM,GAAA,OAAO,MAAgB,EAAA,MAAA,EAAiC,YAAY,iBAAsB,KAAA;AACpG,IAAI,IAAA;AACF,MAAA,MAAM,MAAS,GAAA,MAAM,IAAK,CAAA,MAAA,EAAQ,QAAQ,SAAS,CAAA;AACnD,MAAM,MAAA,IAAA,GAAO,IAAK,CAAA,SAAA,CAAU,MAAM,CAAA;AAClC,MAAO,OAAA;AAAA,QACL,EAAA,EAAI,OAAO,UAAe,KAAA,KAAA;AAAA,QAC1B,IAAA,EAAM,eAAgB,CAAA,IAAA,CAAK,IAAI,CAAA;AAAA,QAC/B,IAAA;AAAA,QACA,IAAA,EAAM,cAAc,MAAM;AAAA,OAC5B;AAAA,aACO,GAAK,EAAA;AACZ,MAAA,MAAM,UAAU,GAAe,YAAA,KAAA,GAAQ,GAAI,CAAA,OAAA,GAAU,OAAO,GAAG,CAAA;AAC/D,MAAO,OAAA;AAAA,QACL,EAAI,EAAA,KAAA;AAAA,QACJ,IAAA,EAAM,eAAgB,CAAA,IAAA,CAAK,OAAO,CAAA;AAAA,QAClC,IAAM,EAAA,OAAA;AAAA,QACN,MAAM;AAAC,OACT;AAAA;AACF,GACF;AACA,EAAM,MAAA,OAAA,GAAU,QAAQ,IAAK,CAAA,CAAA,EAAA,GAAA,MAAA,CAAO,eAAP,IAAqB,GAAA,EAAA,GAAA,EAAE,IAAI,MAAS,GAAA,MAAA;AAEjE,EAAM,MAAA,IAAA,GAAO,OAAO,SAGd,KAAA;AACJ,IAAM,MAAA,SAAA,GAAY,MAAM,GAAA,CAAI,oBAAsB,EAAA;AAAA,MAChD,UAAY,EAAA,SAAA;AAAA,MACZ,UAAY,EAAA,IAAA;AAAA,MACZ;AAAA,KACD,CAAA;AACD,IAAI,IAAA,SAAA,CAAU,MAAa,OAAA;AAAA,MACzB,OAAS,EAAA,MAAA;AAAA,MACT,GAAK,EAAA;AAAA,KACP;AACA,IAAM,MAAA,IAAA,GAAO,cAAe,CAAA,SAAA,CAAU,IAAI,CAAA;AAC1C,IAAA,KAAA,MAAW,WAAW,sBAAwB,EAAA;AAE5C,MAAM,MAAA,OAAA,GAAU,MAAM,GAAA,CAAI,kBAAoB,EAAA;AAAA,QAC5C,UAAY,EAAA,SAAA;AAAA,QACZ,OAAA;AAAA,QACA;AAAA,OACD,CAAA;AACD,MAAI,IAAA,OAAA,CAAQ,MAAa,OAAA;AAAA,QACvB,OAAS,EAAA,MAAA;AAAA,QACT,GAAK,EAAA;AAAA,OACP;AACA,MAAI,IAAA,OAAA,CAAQ,IAAW,OAAA;AAAA,QACrB,OAAS,EAAA,IAAA;AAAA,QACT,GAAK,EAAA,cAAA,CAAe,OAAQ,CAAA,IAAI,CAAK,IAAA;AAAA,OACvC;AAEA,MAAA,IAAI,CAAC,mBAAA,CAAoB,IAAK,CAAA,OAAA,CAAQ,IAAI,CAAG,EAAA;AAAA;AAE/C,IAAO,OAAA;AAAA,MACL,OAAA,EAAS,SAAU,CAAA,EAAA,GAAK,IAAO,GAAA,QAAA;AAAA,MAC/B,GAAK,EAAA;AAAA,KACP;AAAA,GACF;AACA,EAAA,MAAM,KAAQ,GAAA,MAAM,IAAK,CAAA,MAAA,CAAO,SAAS,CAAA;AACzC,EAAI,IAAA,KAAA,CAAM,OAAY,KAAA,MAAA,EAAe,OAAA;AAAA,IACnC,SAAS,KAAM,CAAA;AAAA,GACjB;AACA,EAAA,MAAM,UAAc,GAAA,CAAA,CAAA,EAAA,GAAA,MAAA,CAAO,UAAP,KAAA,IAAA,GAAA,EAAA,GAAqB,IAAI,IAAK,EAAA;AAClD,EAAI,IAAA,CAAC,YAAmB,OAAA;AAAA,IACtB,OAAS,EAAA;AAAA,GACX;AAGA,EAAM,MAAA,OAAA,GAAU,MAAM,GAAA,CAAI,2BAA6B,EAAA;AAAA,IACrD,UAAA;AAAA,IACA,OAAA;AAAA,IACA,UAAY,EAAA;AAAA,KACX,iBAAiB,CAAA;AACpB,EAAM,MAAA,UAAA,GAAa,cAAe,CAAA,OAAA,CAAQ,IAAI,CAAA;AAC9C,EAAM,MAAA,MAAA,GAAS,OAAO,OAAQ,CAAA,IAAA,CAAK,aAAa,OAAQ,CAAA,IAAA,CAAK,cAAc,OAAQ,CAAA,IAAA,CAAK,MAAM,EAAE,CAAA,CAAE,MAAU,KAAA,CAAA,EAAA,GAAA,8BAAA,CAA+B,KAAK,UAAc,IAAA,IAAA,GAAA,UAAA,GAAA,EAAE,CAApD,KAAA,IAAA,GAAA,MAAA,GAAA,EAAA,CAAwD,CAAM,CAAA,CAAA,IAAA,EAAA;AAC1K,EAAA,IAAI,CAAC,OAAA,CAAQ,EAAM,IAAA,CAAC,QAAe,OAAA;AAAA,IACjC,OAAS,EAAA;AAAA,GACX;AACA,EAAM,MAAA,MAAA,GAAS,MAAM,IAAA,CAAK,MAAM,CAAA;AAChC,EAAI,IAAA,MAAA,CAAO,OAAY,KAAA,IAAA,EAAa,OAAA;AAAA,IAClC,OAAS,EAAA;AAAA,GACX;AACA,EAAO,OAAA;AAAA,IACL,OAAS,EAAA,IAAA;AAAA,IACT,SAAW,EAAA,MAAA;AAAA,IACX,UAAY,EAAA,MAAA,CAAO,GAAO,IAAA,UAAA,IAAc,gBAAgB,MAAM,CAAA,QAAA;AAAA,GAChE;AACF"}
|