@adminide-stack/yantra-mobile 12.0.120-alpha.1 → 12.0.120

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.
@@ -0,0 +1,49 @@
1
+ import {useState,useMemo,useCallback}from'react';import {useGetSurfaceJobsQuery,useRemoveSurfaceJobMutation}from'common/graphql';import {isSurfaceJobsUnsupported,visibleJobs,centralJobsFrom,isJobRunning}from'common';import {usePrerequisiteIds}from'./usePrerequisiteIds.js';const POLL_OPEN_MS = 15e3;
2
+ const POLL_CLOSED_MS = 6e4;
3
+ const JOBS_LIMIT = 50;
4
+ function useSurfaceJobs(open) {
5
+ const {
6
+ orgName
7
+ } = usePrerequisiteIds();
8
+ const [unsupported, setUnsupported] = useState(false);
9
+ const {
10
+ data,
11
+ refetch
12
+ } = useGetSurfaceJobsQuery({
13
+ variables: {
14
+ limit: JOBS_LIMIT,
15
+ orgName: orgName || void 0
16
+ },
17
+ skip: !orgName || unsupported,
18
+ fetchPolicy: "cache-and-network",
19
+ pollInterval: open ? POLL_OPEN_MS : POLL_CLOSED_MS,
20
+ onError: (error) => {
21
+ if (isSurfaceJobsUnsupported(error.message)) setUnsupported(true);
22
+ }
23
+ });
24
+ const [removeJob] = useRemoveSurfaceJobMutation();
25
+ const [dismissed, setDismissed] = useState(() => /* @__PURE__ */ new Set());
26
+ const jobs = useMemo(() => {
27
+ var _a;
28
+ const rows = (_a = data == null ? void 0 : data.getSurfaceJobs) != null ? _a : [];
29
+ return visibleJobs(centralJobsFrom(rows, []).filter((job) => !dismissed.has(job.id)));
30
+ }, [data, dismissed]);
31
+ const runningCount = useMemo(() => jobs.filter(isJobRunning).length, [jobs]);
32
+ const refresh = useCallback(() => {
33
+ if (!unsupported) refetch().catch(() => void 0);
34
+ }, [refetch, unsupported]);
35
+ const dismiss = useCallback((id) => {
36
+ setDismissed((prev) => new Set(prev).add(id));
37
+ removeJob({
38
+ variables: {
39
+ id
40
+ }
41
+ }).catch((err) => console.warn("[Tasks] dismiss failed:", err)).finally(refresh);
42
+ }, [removeJob, refresh]);
43
+ return {
44
+ jobs,
45
+ runningCount,
46
+ dismiss,
47
+ refresh
48
+ };
49
+ }export{useSurfaceJobs};//# sourceMappingURL=useSurfaceJobs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSurfaceJobs.js","sources":["../../src/hooks/useSurfaceJobs.ts"],"sourcesContent":["/**\n * The person's long-running jobs (a Web Builder build, a canvas video, ...) for the\n * Tasks sheet and its badge: the server-owned surface jobs the web chat's Tasks panel\n * reads too (common CENTRAL_TASKS_MODEL), so a job shows wherever it was started and\n * after the app that started it is gone. Polls like the web: often while the sheet is\n * open, rarely while it is closed.\n */\nimport { useCallback, useMemo, useState } from 'react';\nimport { useGetSurfaceJobsQuery, useRemoveSurfaceJobMutation } from 'common/graphql';\nimport {\n centralJobsFrom,\n isJobRunning,\n isSurfaceJobsUnsupported,\n visibleJobs,\n type CentralJob,\n type RawJobTask,\n} from 'common';\nimport { usePrerequisiteIds } from './usePrerequisiteIds';\n\nconst POLL_OPEN_MS = 15_000;\nconst POLL_CLOSED_MS = 60_000;\nconst JOBS_LIMIT = 50;\n\nexport function useSurfaceJobs(open: boolean): {\n jobs: CentralJob[];\n runningCount: number;\n dismiss: (id: string) => void;\n refresh: () => void;\n} {\n const { orgName } = usePrerequisiteIds();\n // Once the backend says it has no getSurfaceJobs, stop asking for this session.\n const [unsupported, setUnsupported] = useState(false);\n const { data, refetch } = useGetSurfaceJobsQuery({\n variables: { limit: JOBS_LIMIT, orgName: orgName || undefined },\n skip: !orgName || unsupported,\n fetchPolicy: 'cache-and-network',\n pollInterval: open ? POLL_OPEN_MS : POLL_CLOSED_MS,\n onError: (error) => {\n if (isSurfaceJobsUnsupported(error.message)) setUnsupported(true);\n },\n });\n const [removeJob] = useRemoveSurfaceJobMutation();\n // Dismissed ids stay hidden until the refetch confirms they are gone.\n const [dismissed, setDismissed] = useState<Set<string>>(() => new Set());\n\n const jobs = useMemo(() => {\n const rows = (data?.getSurfaceJobs ?? []) as RawJobTask[];\n return visibleJobs(centralJobsFrom(rows, []).filter((job) => !dismissed.has(job.id)));\n }, [data, dismissed]);\n const runningCount = useMemo(() => jobs.filter(isJobRunning).length, [jobs]);\n\n const refresh = useCallback(() => {\n if (!unsupported) refetch().catch(() => undefined);\n }, [refetch, unsupported]);\n\n const dismiss = useCallback(\n (id: string) => {\n setDismissed((prev) => new Set(prev).add(id));\n removeJob({ variables: { id } })\n .catch((err: unknown) => console.warn('[Tasks] dismiss failed:', err))\n .finally(refresh);\n },\n [removeJob, refresh],\n );\n\n return { jobs, runningCount, dismiss, refresh };\n}\n"],"names":[],"mappings":"iRAWA,MAAM,YAAe,GAAA,IAAA;AACrB,MAAM,cAAiB,GAAA,GAAA;AACvB,MAAM,UAAa,GAAA,EAAA;AACZ,SAAS,eAAe,IAK7B,EAAA;AACA,EAAM,MAAA;AAAA,IACJ;AAAA,MACE,kBAAmB,EAAA;AAEvB,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAS,KAAK,CAAA;AACpD,EAAM,MAAA;AAAA,IACJ,IAAA;AAAA,IACA;AAAA,MACE,sBAAuB,CAAA;AAAA,IACzB,SAAW,EAAA;AAAA,MACT,KAAO,EAAA,UAAA;AAAA,MACP,SAAS,OAAW,IAAA;AAAA,KACtB;AAAA,IACA,IAAA,EAAM,CAAC,OAAW,IAAA,WAAA;AAAA,IAClB,WAAa,EAAA,mBAAA;AAAA,IACb,YAAA,EAAc,OAAO,YAAe,GAAA,cAAA;AAAA,IACpC,SAAS,CAAS,KAAA,KAAA;AAChB,MAAA,IAAI,wBAAyB,CAAA,KAAA,CAAM,OAAO,CAAA,iBAAkB,IAAI,CAAA;AAAA;AAClE,GACD,CAAA;AACD,EAAM,MAAA,CAAC,SAAS,CAAA,GAAI,2BAA4B,EAAA;AAEhD,EAAM,MAAA,CAAC,WAAW,YAAY,CAAA,GAAI,SAAsB,sBAAM,IAAI,KAAK,CAAA;AACvE,EAAM,MAAA,IAAA,GAAO,QAAQ,MAAM;AA3C7B,IAAA,IAAA,EAAA;AA4CI,IAAA,MAAM,IAAQ,GAAA,CAAA,EAAA,GAAA,IAAA,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA,CAAM,cAAN,KAAA,IAAA,GAAA,EAAA,GAAwB,EAAC;AACvC,IAAA,OAAO,WAAY,CAAA,eAAA,CAAgB,IAAM,EAAA,EAAE,CAAE,CAAA,MAAA,CAAO,CAAO,GAAA,KAAA,CAAC,SAAU,CAAA,GAAA,CAAI,GAAI,CAAA,EAAE,CAAC,CAAC,CAAA;AAAA,GACjF,EAAA,CAAC,IAAM,EAAA,SAAS,CAAC,CAAA;AACpB,EAAM,MAAA,YAAA,GAAe,OAAQ,CAAA,MAAM,IAAK,CAAA,MAAA,CAAO,YAAY,CAAE,CAAA,MAAA,EAAQ,CAAC,IAAI,CAAC,CAAA;AAC3E,EAAM,MAAA,OAAA,GAAU,YAAY,MAAM;AAChC,IAAA,IAAI,CAAC,WAAa,EAAA,OAAA,EAAU,CAAA,KAAA,CAAM,MAAM,MAAS,CAAA;AAAA,GAChD,EAAA,CAAC,OAAS,EAAA,WAAW,CAAC,CAAA;AACzB,EAAM,MAAA,OAAA,GAAU,WAAY,CAAA,CAAC,EAAe,KAAA;AAC1C,IAAA,YAAA,CAAa,UAAQ,IAAI,GAAA,CAAI,IAAI,CAAE,CAAA,GAAA,CAAI,EAAE,CAAC,CAAA;AAC1C,IAAU,SAAA,CAAA;AAAA,MACR,SAAW,EAAA;AAAA,QACT;AAAA;AACF,KACD,CAAA,CAAE,KAAM,CAAA,CAAC,GAAiB,KAAA,OAAA,CAAQ,IAAK,CAAA,yBAAA,EAA2B,GAAG,CAAC,CAAE,CAAA,OAAA,CAAQ,OAAO,CAAA;AAAA,GACvF,EAAA,CAAC,SAAW,EAAA,OAAO,CAAC,CAAA;AACvB,EAAO,OAAA;AAAA,IACL,IAAA;AAAA,IACA,YAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF;AACF"}
@@ -1,5 +1,5 @@
1
- import {jsx,jsxs}from'react/jsx-runtime';import {useLayoutEffect,useMemo,useCallback}from'react';import {StyleSheet,View,Text}from'react-native';import {SafeAreaView}from'react-native-safe-area-context';import {useNavigation,useRoute}from'@react-navigation/native';import {getNativeWebBuilderExperience}from'../../features/webbuilder/nativeWebBuilderRegistry.js';import {useAppTheme}from'../../theme/AppThemeProvider.js';import {useWebBuilderHost}from'./useWebBuilderHost.js';function WebBuilderNativeScreen() {
2
- var _a, _b, _c, _d;
1
+ import {jsx,jsxs}from'react/jsx-runtime';import {useLayoutEffect,useMemo,useEffect,useCallback}from'react';import {StyleSheet,View,Text}from'react-native';import {SafeAreaView}from'react-native-safe-area-context';import {useNavigation,useRoute}from'@react-navigation/native';import {getNativeWebBuilderExperience}from'../../features/webbuilder/nativeWebBuilderRegistry.js';import {useAppTheme}from'../../theme/AppThemeProvider.js';import {useWebBuilderHost}from'./useWebBuilderHost.js';function WebBuilderNativeScreen() {
2
+ var _a, _b, _c, _d, _e;
3
3
  const {
4
4
  isDark
5
5
  } = useAppTheme();
@@ -24,6 +24,17 @@ import {jsx,jsxs}from'react/jsx-runtime';import {useLayoutEffect,useMemo,useCall
24
24
  files
25
25
  };
26
26
  }, [(_c = route.params) == null ? void 0 : _c.initialAgentQuery, (_d = route.params) == null ? void 0 : _d.initialAgentAttachments]);
27
+ const openChannelId = typeof ((_e = route.params) == null ? void 0 : _e.openChannelId) === "string" ? route.params.openChannelId.trim() : "";
28
+ const {
29
+ openProject
30
+ } = host;
31
+ useEffect(() => {
32
+ if (!openChannelId) return;
33
+ openProject(openChannelId);
34
+ navigation.setParams({
35
+ openChannelId: void 0
36
+ });
37
+ }, [openChannelId, openProject, navigation]);
27
38
  const onExit = useCallback(() => {
28
39
  var _a2;
29
40
  if ((_a2 = navigation.canGoBack) == null ? void 0 : _a2.call(navigation)) navigation.goBack();
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/screens/WebBuilderNative/index.tsx"],"sourcesContent":["/**\n * Native Web Builder screen - host route for the federated web builder experience.\n *\n * Same delivery contract as Expenses / Movies / Study: the App registers the\n * federated component; this screen reads the registry and hands over what\n * needs the app's data stack - the builds, the templates, the build workflow\n * (the web surface's connector lane), the publish mutation - plus\n * navigation for leaving. A brain-routed hand-off arrives as\n * `initialAgentQuery` and starts a new site with it. Web Builder draws its own\n * header, so the stack header stays hidden.\n *\n * Not to be confused with `screens/WebBuilder`: that is the shared WebView\n * surface shell (historical name), which still opens the web Web Builder.\n */\nimport React, { useCallback, useLayoutEffect, useMemo } from 'react';\nimport { StyleSheet, Text, View } from 'react-native';\nimport { SafeAreaView } from 'react-native-safe-area-context';\nimport {\n useNavigation,\n useRoute,\n type NavigationProp,\n type ParamListBase,\n type RouteProp,\n} from '@react-navigation/native';\nimport type { MessageAttachment } from '../../hooks/useChatStream';\nimport { getNativeWebBuilderExperience } from '../../features/webbuilder/nativeWebBuilderRegistry';\nimport { useAppTheme } from '../../theme/AppThemeProvider';\nimport { useWebBuilderHost } from './useWebBuilderHost';\n\n/** What the launcher and the chat hand-offs may pass. */\ntype WebBuilderRouteParams = {\n orgName?: string | null;\n initialAgentQuery?: string;\n /** Photos or files the ask was typed with; they go to the agent with it. */\n initialAgentAttachments?: MessageAttachment[];\n hideNavigationHeader?: boolean;\n};\n\nexport default function WebBuilderNativeScreen() {\n // The in-app light/dark choice (the drawer's Appearance), not only the device setting.\n const { isDark } = useAppTheme();\n const navigation = useNavigation<NavigationProp<ParamListBase>>();\n const route = useRoute<RouteProp<Record<string, WebBuilderRouteParams | undefined>, string>>();\n const routeOrg = typeof route.params?.orgName === 'string' ? route.params.orgName.trim() : '';\n const Experience = getNativeWebBuilderExperience();\n const host = useWebBuilderHost(routeOrg || undefined);\n\n useLayoutEffect(() => {\n if (!route.params?.hideNavigationHeader) navigation.setParams({ hideNavigationHeader: true });\n }, [navigation, route.params?.hideNavigationHeader]);\n\n const seed = useMemo(() => {\n const query = typeof route.params?.initialAgentQuery === 'string' ? route.params.initialAgentQuery.trim() : '';\n const files = Array.isArray(route.params?.initialAgentAttachments)\n ? route.params.initialAgentAttachments\n : undefined;\n if (!query && !files?.length) return null;\n return { text: query, files };\n }, [route.params?.initialAgentQuery, route.params?.initialAgentAttachments]);\n\n const onExit = useCallback(() => {\n if (navigation.canGoBack?.()) navigation.goBack();\n else navigation.navigate('MainStack.Layout.Home');\n }, [navigation]);\n\n if (!Experience) {\n return (\n <SafeAreaView style={[styles.fill, isDark && styles.fillDark]}>\n <View style={styles.center}>\n <Text style={[styles.title, isDark && styles.textLight]}>Native web builder unavailable</Text>\n <Text style={[styles.detail, isDark && styles.textMuted]}>\n This build does not carry the federation host runtime.\n </Text>\n </View>\n </SafeAreaView>\n );\n }\n\n return (\n <SafeAreaView style={[styles.fill, isDark && styles.fillDark]} edges={['left', 'right']}>\n <Experience\n isDark={isDark}\n onExit={onExit}\n projects={host.projects}\n projectsLoading={host.projectsLoading}\n projectsError={host.projectsError}\n onRefreshProjects={host.refreshProjects}\n projectsHasMore={host.projectsHasMore}\n onLoadMoreProjects={host.loadMoreProjects}\n templates={host.templates}\n templatesLoading={host.templatesLoading}\n templatesError={host.templatesError}\n onReloadTemplates={host.reloadTemplates}\n startBlocked={host.startBlocked}\n startNotice={host.startNotice}\n activeChannelId={host.activeChannelId}\n onOpenProject={host.openProject}\n onCloseProject={host.closeProject}\n onStartProject={host.startProject}\n builds={host.builds}\n buildsLoading={host.buildsLoading}\n building={host.building}\n publishing={host.publishing}\n hostChat={host.hostChat}\n onPublish={host.publish}\n onResumePreview={host.resumePreview}\n initialAgentSeed={seed}\n />\n </SafeAreaView>\n );\n}\n\nconst styles = StyleSheet.create({\n fill: { flex: 1, backgroundColor: '#f5f6f8' },\n fillDark: { backgroundColor: '#0c0e14' },\n center: { flex: 1, alignItems: 'center', justifyContent: 'center', padding: 24 },\n title: { fontSize: 15, fontWeight: '600', color: '#111827', marginBottom: 6 },\n detail: { fontSize: 13, color: '#5d6575', textAlign: 'center' },\n textLight: { color: '#eceff6' },\n textMuted: { color: '#9ca4b6' },\n});\n"],"names":["_a","_b"],"mappings":"4dA+BA,SAAwB,sBAAyB,GAAA;AA/BjD,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AAiCE,EAAM,MAAA;AAAA,IACJ;AAAA,MACE,WAAY,EAAA;AAChB,EAAA,MAAM,aAAa,aAA6C,EAAA;AAChE,EAAA,MAAM,QAAQ,QAA+E,EAAA;AAC7F,EAAM,MAAA,QAAA,GAAW,QAAO,CAAA,EAAA,GAAA,KAAA,CAAM,MAAN,KAAA,IAAA,GAAA,MAAA,GAAA,EAAA,CAAc,OAAY,CAAA,KAAA,QAAA,GAAW,KAAM,CAAA,MAAA,CAAO,OAAQ,CAAA,IAAA,EAAS,GAAA,EAAA;AAC3F,EAAA,MAAM,aAAa,6BAA8B,EAAA;AACjD,EAAM,MAAA,IAAA,GAAO,iBAAkB,CAAA,QAAA,IAAY,MAAS,CAAA;AACpD,EAAA,eAAA,CAAgB,MAAM;AAzCxB,IAAAA,IAAAA,GAAAA;AA0CI,IAAI,IAAA,EAAA,CAACA,MAAA,KAAM,CAAA,MAAA,KAAN,gBAAAA,GAAc,CAAA,oBAAA,CAAA,aAAiC,SAAU,CAAA;AAAA,MAC5D,oBAAsB,EAAA;AAAA,KACvB,CAAA;AAAA,KACA,CAAC,UAAA,EAAA,CAAY,WAAM,MAAN,KAAA,IAAA,GAAA,MAAA,GAAA,EAAA,CAAc,oBAAoB,CAAC,CAAA;AACnD,EAAM,MAAA,IAAA,GAAO,QAAQ,MAAM;AA9C7B,IAAA,IAAAA,GAAAC,EAAAA,GAAAA;AA+CI,IAAA,MAAM,KAAQ,GAAA,QAAA,CAAOD,GAAA,GAAA,KAAA,CAAM,MAAN,KAAA,IAAA,GAAA,MAAA,GAAAA,GAAc,CAAA,iBAAA,CAAA,KAAsB,QAAW,GAAA,KAAA,CAAM,MAAO,CAAA,iBAAA,CAAkB,MAAS,GAAA,EAAA;AAC5G,IAAA,MAAM,KAAQ,GAAA,KAAA,CAAM,OAAQC,CAAAA,CAAAA,GAAAA,GAAA,KAAM,CAAA,MAAA,KAAN,IAAAA,GAAAA,MAAAA,GAAAA,GAAAA,CAAc,uBAAuB,CAAA,GAAI,KAAM,CAAA,MAAA,CAAO,uBAA0B,GAAA,MAAA;AAC5G,IAAA,IAAI,CAAC,KAAA,IAAS,EAAC,KAAA,IAAA,IAAA,GAAA,MAAA,GAAA,KAAA,CAAO,SAAe,OAAA,IAAA;AACrC,IAAO,OAAA;AAAA,MACL,IAAM,EAAA,KAAA;AAAA,MACN;AAAA,KACF;AAAA,GACF,EAAG,CAAC,CAAA,EAAA,GAAA,KAAA,CAAM,MAAN,KAAA,IAAA,GAAA,MAAA,GAAA,EAAA,CAAc,oBAAmB,EAAM,GAAA,KAAA,CAAA,MAAA,KAAN,IAAc,GAAA,MAAA,GAAA,EAAA,CAAA,uBAAuB,CAAC,CAAA;AAC3E,EAAM,MAAA,MAAA,GAAS,YAAY,MAAM;AAvDnC,IAAAD,IAAAA,GAAAA;AAwDI,IAAA,IAAA,CAAIA,MAAA,UAAW,CAAA,SAAA,KAAX,gBAAAA,GAAA,CAAA,IAAA,CAAA,UAAA,CAAA,aAAqC,MAAO,EAAA;AAAA,SAAO,UAAA,CAAW,SAAS,uBAAuB,CAAA;AAAA,GACpG,EAAG,CAAC,UAAU,CAAC,CAAA;AACf,EAAA,IAAI,CAAC,UAAY,EAAA;AACf,IAAA,uBAAQ,GAAA,CAAA,YAAA,EAAA,EAAa,KAAO,EAAA,CAAC,OAAO,IAAM,EAAA,MAAA,IAAU,MAAO,CAAA,QAAQ,CACvD,EAAA,QAAA,kBAAA,IAAA,CAAC,IAAK,EAAA,EAAA,KAAA,EAAO,OAAO,MAChB,EAAA,QAAA,EAAA;AAAA,sBAAC,GAAA,CAAA,IAAA,EAAA,EAAK,OAAO,CAAC,MAAA,CAAO,OAAO,MAAU,IAAA,MAAA,CAAO,SAAS,CAAA,EAAG,QAA8B,EAAA,gCAAA,EAAA,CAAA;AAAA,sBACvF,GAAA,CAAC,IAAK,EAAA,EAAA,KAAA,EAAO,CAAC,MAAA,CAAO,QAAQ,MAAU,IAAA,MAAA,CAAO,SAAS,CAAA,EAAG,QAE1D,EAAA,wDAAA,EAAA;AAAA,KAAA,EACJ,CACJ,EAAA,CAAA;AAAA;AAEV,EAAA,2BAAQ,YAAa,EAAA,EAAA,KAAA,EAAO,CAAC,MAAO,CAAA,IAAA,EAAM,UAAU,MAAO,CAAA,QAAQ,GAAG,KAAO,EAAA,CAAC,QAAQ,OAAO,CAAA,EACnF,8BAAC,UAAW,EAAA,EAAA,MAAA,EAAgB,QAAgB,QAAU,EAAA,IAAA,CAAK,UAAU,eAAiB,EAAA,IAAA,CAAK,iBAAiB,aAAe,EAAA,IAAA,CAAK,eAAe,iBAAmB,EAAA,IAAA,CAAK,iBAAiB,eAAiB,EAAA,IAAA,CAAK,iBAAiB,kBAAoB,EAAA,IAAA,CAAK,kBAAkB,SAAW,EAAA,IAAA,CAAK,WAAW,gBAAkB,EAAA,IAAA,CAAK,kBAAkB,cAAgB,EAAA,IAAA,CAAK,cAAgB,EAAA,iBAAA,EAAmB,KAAK,eAAiB,EAAA,YAAA,EAAc,KAAK,YAAc,EAAA,WAAA,EAAa,KAAK,WAAa,EAAA,eAAA,EAAiB,KAAK,eAAiB,EAAA,aAAA,EAAe,KAAK,WAAa,EAAA,cAAA,EAAgB,KAAK,YAAc,EAAA,cAAA,EAAgB,KAAK,YAAc,EAAA,MAAA,EAAQ,KAAK,MAAQ,EAAA,aAAA,EAAe,KAAK,aAAe,EAAA,QAAA,EAAU,KAAK,QAAU,EAAA,UAAA,EAAY,KAAK,UAAY,EAAA,QAAA,EAAU,KAAK,QAAU,EAAA,SAAA,EAAW,KAAK,OAAS,EAAA,eAAA,EAAiB,KAAK,aAAe,EAAA,gBAAA,EAAkB,MAAM,CAC30B,EAAA,CAAA;AACR;AACA,MAAM,MAAA,GAAS,WAAW,MAAO,CAAA;AAAA,EAC/B,IAAM,EAAA;AAAA,IACJ,IAAM,EAAA,CAAA;AAAA,IACN,eAAiB,EAAA;AAAA,GACnB;AAAA,EACA,QAAU,EAAA;AAAA,IACR,eAAiB,EAAA;AAAA,GACnB;AAAA,EACA,MAAQ,EAAA;AAAA,IACN,IAAM,EAAA,CAAA;AAAA,IACN,UAAY,EAAA,QAAA;AAAA,IACZ,cAAgB,EAAA,QAAA;AAAA,IAChB,OAAS,EAAA;AAAA,GACX;AAAA,EACA,KAAO,EAAA;AAAA,IACL,QAAU,EAAA,EAAA;AAAA,IACV,UAAY,EAAA,KAAA;AAAA,IACZ,KAAO,EAAA,SAAA;AAAA,IACP,YAAc,EAAA;AAAA,GAChB;AAAA,EACA,MAAQ,EAAA;AAAA,IACN,QAAU,EAAA,EAAA;AAAA,IACV,KAAO,EAAA,SAAA;AAAA,IACP,SAAW,EAAA;AAAA,GACb;AAAA,EACA,SAAW,EAAA;AAAA,IACT,KAAO,EAAA;AAAA,GACT;AAAA,EACA,SAAW,EAAA;AAAA,IACT,KAAO,EAAA;AAAA;AAEX,CAAC,CAAA"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/screens/WebBuilderNative/index.tsx"],"sourcesContent":["/**\n * Native Web Builder screen - host route for the federated web builder experience.\n *\n * Same delivery contract as Expenses / Movies / Study: the App registers the\n * federated component; this screen reads the registry and hands over what\n * needs the app's data stack - the builds, the templates, the build workflow\n * (the web surface's connector lane), the publish mutation - plus\n * navigation for leaving. A brain-routed hand-off arrives as\n * `initialAgentQuery` and starts a new site with it; a task in the Tasks sheet\n * arrives as `openChannelId` and opens that site. Web Builder draws its own\n * header, so the stack header stays hidden.\n *\n * Not to be confused with `screens/WebBuilder`: that is the shared WebView\n * surface shell (historical name), which still opens the web Web Builder.\n */\nimport React, { useCallback, useEffect, useLayoutEffect, useMemo } from 'react';\nimport { StyleSheet, Text, View } from 'react-native';\nimport { SafeAreaView } from 'react-native-safe-area-context';\nimport {\n useNavigation,\n useRoute,\n type NavigationProp,\n type ParamListBase,\n type RouteProp,\n} from '@react-navigation/native';\nimport type { MessageAttachment } from '../../hooks/useChatStream';\nimport { getNativeWebBuilderExperience } from '../../features/webbuilder/nativeWebBuilderRegistry';\nimport { useAppTheme } from '../../theme/AppThemeProvider';\nimport { useWebBuilderHost } from './useWebBuilderHost';\n\n/** What the launcher and the chat hand-offs may pass. */\ntype WebBuilderRouteParams = {\n orgName?: string | null;\n initialAgentQuery?: string;\n /** Photos or files the ask was typed with; they go to the agent with it. */\n initialAgentAttachments?: MessageAttachment[];\n /** A site to open (its chat), e.g. from its build's task in the Tasks sheet. */\n openChannelId?: string;\n hideNavigationHeader?: boolean;\n};\n\nexport default function WebBuilderNativeScreen() {\n // The in-app light/dark choice (the drawer's Appearance), not only the device setting.\n const { isDark } = useAppTheme();\n const navigation = useNavigation<NavigationProp<ParamListBase>>();\n const route = useRoute<RouteProp<Record<string, WebBuilderRouteParams | undefined>, string>>();\n const routeOrg = typeof route.params?.orgName === 'string' ? route.params.orgName.trim() : '';\n const Experience = getNativeWebBuilderExperience();\n const host = useWebBuilderHost(routeOrg || undefined);\n\n useLayoutEffect(() => {\n if (!route.params?.hideNavigationHeader) navigation.setParams({ hideNavigationHeader: true });\n }, [navigation, route.params?.hideNavigationHeader]);\n\n const seed = useMemo(() => {\n const query = typeof route.params?.initialAgentQuery === 'string' ? route.params.initialAgentQuery.trim() : '';\n const files = Array.isArray(route.params?.initialAgentAttachments)\n ? route.params.initialAgentAttachments\n : undefined;\n if (!query && !files?.length) return null;\n return { text: query, files };\n }, [route.params?.initialAgentQuery, route.params?.initialAgentAttachments]);\n\n // Opened once per hand-off: the param is cleared, so the same task can open it again later.\n const openChannelId = typeof route.params?.openChannelId === 'string' ? route.params.openChannelId.trim() : '';\n const { openProject } = host;\n useEffect(() => {\n if (!openChannelId) return;\n openProject(openChannelId);\n navigation.setParams({ openChannelId: undefined });\n }, [openChannelId, openProject, navigation]);\n\n const onExit = useCallback(() => {\n if (navigation.canGoBack?.()) navigation.goBack();\n else navigation.navigate('MainStack.Layout.Home');\n }, [navigation]);\n\n if (!Experience) {\n return (\n <SafeAreaView style={[styles.fill, isDark && styles.fillDark]}>\n <View style={styles.center}>\n <Text style={[styles.title, isDark && styles.textLight]}>Native web builder unavailable</Text>\n <Text style={[styles.detail, isDark && styles.textMuted]}>\n This build does not carry the federation host runtime.\n </Text>\n </View>\n </SafeAreaView>\n );\n }\n\n return (\n <SafeAreaView style={[styles.fill, isDark && styles.fillDark]} edges={['left', 'right']}>\n <Experience\n isDark={isDark}\n onExit={onExit}\n projects={host.projects}\n projectsLoading={host.projectsLoading}\n projectsError={host.projectsError}\n onRefreshProjects={host.refreshProjects}\n projectsHasMore={host.projectsHasMore}\n onLoadMoreProjects={host.loadMoreProjects}\n templates={host.templates}\n templatesLoading={host.templatesLoading}\n templatesError={host.templatesError}\n onReloadTemplates={host.reloadTemplates}\n startBlocked={host.startBlocked}\n startNotice={host.startNotice}\n activeChannelId={host.activeChannelId}\n onOpenProject={host.openProject}\n onCloseProject={host.closeProject}\n onStartProject={host.startProject}\n builds={host.builds}\n buildsLoading={host.buildsLoading}\n building={host.building}\n publishing={host.publishing}\n hostChat={host.hostChat}\n onPublish={host.publish}\n onResumePreview={host.resumePreview}\n initialAgentSeed={seed}\n />\n </SafeAreaView>\n );\n}\n\nconst styles = StyleSheet.create({\n fill: { flex: 1, backgroundColor: '#f5f6f8' },\n fillDark: { backgroundColor: '#0c0e14' },\n center: { flex: 1, alignItems: 'center', justifyContent: 'center', padding: 24 },\n title: { fontSize: 15, fontWeight: '600', color: '#111827', marginBottom: 6 },\n detail: { fontSize: 13, color: '#5d6575', textAlign: 'center' },\n textLight: { color: '#eceff6' },\n textMuted: { color: '#9ca4b6' },\n});\n"],"names":["_a","_b"],"mappings":"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"}
@@ -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';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,restoreSandbox}from'./webbuilderTransport.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;
@@ -94,18 +94,43 @@ function useWebBuilderHost(routeOrg) {
94
94
  const chat = useChatStream(agentChannelId, chatRouting);
95
95
  const agentLane = activeChannelId !== null && (agentChannels.current.has(activeChannelId) || posts.length > 0 && !hasWorkflowPosts(posts));
96
96
  const agentBusy = agentLane && (chat.isLoading || chat.isStreaming);
97
- const sendAgentTurn = useCallback((channelId, text, files) => {
97
+ const jobs = useWebBuilderJobs();
98
+ const agentJob = useRef(null);
99
+ const sendAgentTurn = useCallback((channelId, text, files, task) => {
98
100
  const ready = unsavedAgentChannels.current.has(channelId) ? ensureChannel() : Promise.resolve();
99
- ready.then(() => {
101
+ const recorded = task ? jobs.begin({
102
+ channelId,
103
+ ask: text,
104
+ siteTitle: task.siteTitle,
105
+ mode: task.mode,
106
+ lane: "agent",
107
+ startedAt: Date.now()
108
+ }) : Promise.resolve(null);
109
+ Promise.all([ready, recorded]).then(([, job]) => {
100
110
  unsavedAgentChannels.current.delete(channelId);
101
- return chat.sendMessage(text, files, channelId);
111
+ if (job) agentJob.current = {
112
+ channelId,
113
+ job
114
+ };
115
+ return chat.sendMessage(text, files, channelId, false, void 0, {
116
+ job: job == null ? void 0 : job.ref
117
+ });
118
+ }).then((outcome) => {
119
+ var _a2;
120
+ if (outcome !== "failed" || ((_a2 = agentJob.current) == null ? void 0 : _a2.channelId) !== channelId) return;
121
+ jobs.finish(agentJob.current.job, {
122
+ ok: false,
123
+ endedAt: Date.now(),
124
+ error: "The message did not reach Web Builder."
125
+ });
126
+ agentJob.current = null;
102
127
  }).catch(() => void 0);
103
- }, [chat, ensureChannel]);
128
+ }, [chat, ensureChannel, jobs]);
104
129
  useEffect(() => {
105
130
  const pending = pendingAgentTurn.current;
106
131
  if (!pending || pending.channelId !== agentChannelId) return;
107
132
  pendingAgentTurn.current = null;
108
- sendAgentTurn(pending.channelId, pending.text, pending.files);
133
+ sendAgentTurn(pending.channelId, pending.text, pending.files, pending.job);
109
134
  }, [agentChannelId, sendAgentTurn]);
110
135
  const wasAgentBusy = useRef(false);
111
136
  useEffect(() => {
@@ -128,6 +153,24 @@ function useWebBuilderHost(routeOrg) {
128
153
  createdAt: new Date(now + index).toISOString()
129
154
  })), activeProject == null ? void 0 : activeProject.title, cdnOrigin);
130
155
  }, [postBuilds, agentLane, chat.messages, activeProject == null ? void 0 : activeProject.title, cdnOrigin, restored]);
156
+ const chatBusy = chat.isLoading || chat.isStreaming;
157
+ const wasChatBusy = useRef(false);
158
+ useEffect(() => {
159
+ const ended = wasChatBusy.current && !chatBusy;
160
+ wasChatBusy.current = chatBusy;
161
+ const running2 = agentJob.current;
162
+ if (!ended || !running2 || running2.channelId !== agentChannelId) return;
163
+ agentJob.current = null;
164
+ jobs.finish(running2.job, chat.error ? {
165
+ ok: false,
166
+ endedAt: Date.now(),
167
+ error: chat.error
168
+ } : {
169
+ ok: true,
170
+ endedAt: Date.now(),
171
+ build: activeChannelId === running2.channelId ? builds[0] : null
172
+ });
173
+ }, [chatBusy, agentChannelId, chat.error, activeChannelId, builds, jobs]);
131
174
  useEffect(() => {
132
175
  if (!activeChannelId || posts.length === 0) return;
133
176
  const row = projectFromPosts({
@@ -140,27 +183,46 @@ function useWebBuilderHost(routeOrg) {
140
183
  const [turnError, setTurnError] = useState(null);
141
184
  const state = useMemo(() => turn && turn.channelId === activeChannelId ? turnState(posts, turn.startedAt) : null, [turn, activeChannelId, posts]);
142
185
  useEffect(() => {
186
+ var _a2;
143
187
  if (!turn || !state) return;
144
- if (state.status === "done") setTurn(null);
188
+ if (state.status === "done") {
189
+ setTurn(null);
190
+ jobs.finish(turn.job, {
191
+ ok: true,
192
+ endedAt: Date.now(),
193
+ build: (_a2 = postBuilds[0]) != null ? _a2 : null
194
+ });
195
+ }
145
196
  if (state.status === "failed") {
146
197
  setTurn(null);
147
198
  setTurnError(state.error);
199
+ jobs.finish(turn.job, {
200
+ ok: false,
201
+ endedAt: Date.now(),
202
+ error: state.error || "The build didn't finish."
203
+ });
148
204
  }
149
- }, [turn, state]);
205
+ }, [turn, state, postBuilds, jobs]);
150
206
  useEffect(() => {
151
207
  if (!turn) return void 0;
152
208
  const timer = setInterval(() => {
153
209
  if (Date.now() - turn.startedAt > TURN_TIMEOUT_MS) {
210
+ const tooLong = "The build is taking too long. It may still finish; reopen the site later to check.";
154
211
  setTurn(null);
155
- setTurnError("The build is taking too long. It may still finish; reopen the site later to check.");
212
+ setTurnError(tooLong);
213
+ jobs.finish(turn.job, {
214
+ ok: false,
215
+ endedAt: Date.now(),
216
+ error: tooLong
217
+ });
156
218
  return;
157
219
  }
158
220
  refetch().catch(() => void 0);
159
221
  }, POLL_MS);
160
222
  return () => clearInterval(timer);
161
- }, [turn, refetch]);
223
+ }, [turn, refetch, jobs]);
162
224
  const runTurn = useCallback(async (opts) => {
163
- var _a2, _b2, _c2, _d;
225
+ var _a2, _b2, _c2, _d, _e, _f;
164
226
  const {
165
227
  current
166
228
  } = tokenRef;
@@ -199,24 +261,40 @@ function useWebBuilderHost(routeOrg) {
199
261
  }));
200
262
  if (!built.ok) return notSetUp(effectiveOrg);
201
263
  setTurnError(null);
264
+ const startedAt2 = Date.now();
265
+ const job = jobs.begin({
266
+ channelId: opts.channelId,
267
+ projectId: opts.projectId,
268
+ ask: opts.text,
269
+ siteTitle: (_e = (_d = opts.edit) == null ? void 0 : _d.title) != null ? _e : null,
270
+ mode,
271
+ lane: "workflow",
272
+ startedAt: startedAt2
273
+ });
202
274
  setTurn({
203
275
  channelId: opts.channelId,
204
276
  text: opts.text,
205
- startedAt: Date.now(),
206
- mode
277
+ startedAt: startedAt2,
278
+ mode,
279
+ job
207
280
  });
208
281
  const outcome = await triggerBuild(current, indexUrl, built.params);
209
282
  if (!outcome.ok) {
210
- const reason = (_d = outcome.error) != null ? _d : "";
283
+ const reason = (_f = outcome.error) != null ? _f : "";
211
284
  console.warn("[WebBuilderNative] trigger failed:", reason);
212
285
  if (outcome.auth) session.retry();
213
286
  setTurn(null);
214
287
  setTurnError(failureText(reason));
288
+ jobs.finish(job, {
289
+ ok: false,
290
+ endedAt: Date.now(),
291
+ error: failureText(reason)
292
+ });
215
293
  return failureText(reason);
216
294
  }
217
295
  refetch().catch(() => void 0);
218
296
  return null;
219
- }, [indexUrl, graphqlUrl, catalog.defaults, effectiveOrg, refetch, session]);
297
+ }, [indexUrl, graphqlUrl, catalog.defaults, effectiveOrg, refetch, session, jobs]);
220
298
  const [startError, setStartError] = useState(null);
221
299
  const startProject = useCallback((request) => {
222
300
  var _a2;
@@ -231,7 +309,10 @@ function useWebBuilderHost(routeOrg) {
231
309
  text: request.template ? `${request.text}
232
310
 
233
311
  ${templateRemixNote(request.template)}` : request.text,
234
- files: request.attachments
312
+ files: request.attachments,
313
+ job: {
314
+ mode: request.template ? "remix" : "new"
315
+ }
235
316
  };
236
317
  setTurnError(null);
237
318
  setActiveChannelId(id);
@@ -299,17 +380,35 @@ ${templateRemixNote(request.template)}` : request.text,
299
380
  return rows;
300
381
  }, [posts, running, turn]);
301
382
  const send = useCallback((text, attachments, target) => {
302
- var _a2;
383
+ var _a2, _b2, _c2;
303
384
  const channelId = activeChannelId;
304
385
  if (!channelId) return;
305
- if (agentLane) {
386
+ const workflowReady = Boolean((_a2 = catalog.defaults) == null ? void 0 : _a2.formExtensionId);
387
+ if (agentLane || !workflowReady) {
306
388
  const note = target ? `
307
389
 
308
390
  ${agentEditNote(target)}` : "";
309
- sendAgentTurn(channelId, `${text}${note}`, attachments);
391
+ const task = {
392
+ mode: target || builds.length ? "edit" : "new",
393
+ siteTitle: (activeProject == null ? void 0 : activeProject.title) || (target == null ? void 0 : target.title) || ((_b2 = builds[0]) == null ? void 0 : _b2.title) || null
394
+ };
395
+ if (!agentLane) {
396
+ agentChannels.current.add(channelId);
397
+ if (agentChannelId !== channelId) {
398
+ pendingAgentTurn.current = {
399
+ channelId,
400
+ text: `${text}${note}`,
401
+ files: attachments,
402
+ job: task
403
+ };
404
+ setAgentChannelId(channelId);
405
+ return;
406
+ }
407
+ }
408
+ sendAgentTurn(channelId, `${text}${note}`, attachments, task);
310
409
  return;
311
410
  }
312
- const projectId = projectIds.current.get(channelId) || (target == null ? void 0 : target.projectId) || ((_a2 = builds[0]) == null ? void 0 : _a2.projectId) || newObjectId();
411
+ const projectId = projectIds.current.get(channelId) || (target == null ? void 0 : target.projectId) || ((_c2 = builds[0]) == null ? void 0 : _c2.projectId) || newObjectId();
313
412
  projectIds.current.set(channelId, projectId);
314
413
  runTurn({
315
414
  channelId,
@@ -319,7 +418,7 @@ ${agentEditNote(target)}` : "";
319
418
  edit: target != null ? target : null,
320
419
  attachments
321
420
  }).catch(() => void 0);
322
- }, [activeChannelId, agentLane, builds, runTurn, sendAgentTurn]);
421
+ }, [activeChannelId, agentLane, agentChannelId, catalog.defaults, builds, activeProject == null ? void 0 : activeProject.title, runTurn, sendAgentTurn]);
323
422
  const agentMessages = useMemo(() => chat.messages.map((m, index) => ({
324
423
  id: `${m.role}-${index}`,
325
424
  role: m.role,
@@ -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';\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\ninterface RunningTurn {\n channelId: string;\n text: string;\n startedAt: number;\n mode: 'new' | 'remix' | 'edit';\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<{ channelId: string; text: string; files?: MessageAttachment[] } | 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 const sendAgentTurn = useCallback(\n (channelId: string, text: string, files?: MessageAttachment[]) => {\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 ready\n .then(() => {\n unsavedAgentChannels.current.delete(channelId);\n return chat.sendMessage(text, files, channelId);\n })\n .catch(() => undefined);\n },\n [chat, ensureChannel],\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);\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 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') setTurn(null);\n if (state.status === 'failed') {\n setTurn(null);\n setTurnError(state.error);\n }\n }, [turn, state]);\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 if (Date.now() - turn.startedAt > TURN_TIMEOUT_MS) {\n setTurn(null);\n setTurnError('The build is taking too long. It may still finish; reopen the site later to check.');\n return;\n }\n refetch().catch(() => undefined);\n }, POLL_MS);\n return () => clearInterval(timer);\n }, [turn, refetch]);\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 setTurn({ channelId: opts.channelId, text: opts.text, startedAt: Date.now(), mode });\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 return failureText(reason);\n }\n refetch().catch(() => undefined);\n return null;\n },\n [indexUrl, graphqlUrl, catalog.defaults, effectiveOrg, refetch, session],\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 };\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 if (agentLane) {\n // A change to the agent's build goes to its sandbox (web `agentEditForChat`).\n const note = target ? `\\n\\n${agentEditNote(target)}` : '';\n sendAgentTurn(channelId, `${text}${note}`, attachments);\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 [activeChannelId, agentLane, builds, runTurn, sendAgentTurn],\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","_b","_c"],"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 { 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\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 // 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 if (Date.now() - turn.startedAt > 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","startedAt"],"mappings":"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"}