@adminide-stack/yantra-mobile 12.0.141-alpha.1 → 12.0.141
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/agent-chat/NativeAgentChat.js +21 -4
- package/lib/features/agent-chat/NativeAgentChat.js.map +1 -1
- package/lib/features/chat/ApprovalCard.js +353 -0
- package/lib/features/chat/ApprovalCard.js.map +1 -0
- package/lib/features/chat/AskUserCard.js +9 -2
- package/lib/features/chat/AskUserCard.js.map +1 -1
- package/lib/features/chat/askUser.js +25 -3
- package/lib/features/chat/askUser.js.map +1 -1
- package/lib/features/chat/queuedFollowUpRows.js +13 -0
- package/lib/features/chat/queuedFollowUpRows.js.map +1 -0
- package/lib/features/devices/bodyComposition.js +116 -0
- package/lib/features/devices/bodyComposition.js.map +1 -0
- package/lib/features/devices/readings.js.map +1 -1
- package/lib/features/devices/session.js +22 -2
- package/lib/features/devices/session.js.map +1 -1
- package/lib/features/discover/DiscoverArticle.js +105 -92
- package/lib/features/discover/DiscoverArticle.js.map +1 -1
- package/lib/features/discover/DiscoverFeed.js +97 -48
- package/lib/features/discover/DiscoverFeed.js.map +1 -1
- package/lib/features/discover/DiscoverFollowUp.js +135 -0
- package/lib/features/discover/DiscoverFollowUp.js.map +1 -0
- package/lib/features/discover/DiscoverSidebar.js +555 -0
- package/lib/features/discover/DiscoverSidebar.js.map +1 -0
- package/lib/features/discover/DiscoverSkeletons.js +123 -0
- package/lib/features/discover/DiscoverSkeletons.js.map +1 -0
- package/lib/features/discover/DiscoverStoryCards.js +193 -87
- package/lib/features/discover/DiscoverStoryCards.js.map +1 -1
- package/lib/features/discover/followUpQuery.js +42 -0
- package/lib/features/discover/followUpQuery.js.map +1 -0
- package/lib/features/discover/markets.js +37 -0
- package/lib/features/discover/markets.js.map +1 -0
- package/lib/features/discover/useDiscoverSidebar.js +148 -0
- package/lib/features/discover/useDiscoverSidebar.js.map +1 -0
- package/lib/features/discover/weather.js +42 -0
- package/lib/features/discover/weather.js.map +1 -0
- package/lib/features/expenses/ExpensesAgentChatPane.js +1 -1
- package/lib/features/expenses/ExpensesAgentChatPane.js.map +1 -1
- package/lib/features/inbox/InboxAgentChatPane.js +1 -1
- package/lib/features/inbox/InboxAgentChatPane.js.map +1 -1
- package/lib/features/job-search/JobSearchAgentChatPane.js +1 -0
- package/lib/features/job-search/JobSearchAgentChatPane.js.map +1 -1
- package/lib/features/local-services/LocalServicesAgentChatPane.js +1 -1
- package/lib/features/local-services/LocalServicesAgentChatPane.js.map +1 -1
- package/lib/features/movies/MoviesAgentChatPane.js +1 -1
- package/lib/features/movies/MoviesAgentChatPane.js.map +1 -1
- package/lib/features/notion/NotionBlockSheets.js +206 -0
- package/lib/features/notion/NotionBlockSheets.js.map +1 -0
- package/lib/features/notion/NotionBlockView.js +36 -0
- package/lib/features/notion/NotionBlockView.js.map +1 -0
- package/lib/features/notion/NotionCommentsSheet.js +461 -0
- package/lib/features/notion/NotionCommentsSheet.js.map +1 -0
- package/lib/features/notion/NotionConnectionsSheet.js +244 -0
- package/lib/features/notion/NotionConnectionsSheet.js.map +1 -0
- package/lib/features/notion/NotionHistorySheet.js +439 -0
- package/lib/features/notion/NotionHistorySheet.js.map +1 -0
- package/lib/features/notion/NotionMediaBlocks.js +803 -0
- package/lib/features/notion/NotionMediaBlocks.js.map +1 -0
- package/lib/features/notion/NotionMentionSheet.js +279 -0
- package/lib/features/notion/NotionMentionSheet.js.map +1 -0
- package/lib/features/notion/NotionPageMenu.js +585 -0
- package/lib/features/notion/NotionPageMenu.js.map +1 -0
- package/lib/features/notion/NotionPageTree.js +220 -0
- package/lib/features/notion/NotionPageTree.js.map +1 -0
- package/lib/features/notion/NotionPageView.js +1253 -152
- package/lib/features/notion/NotionPageView.js.map +1 -1
- package/lib/features/notion/NotionShareSheet.js +606 -0
- package/lib/features/notion/NotionShareSheet.js.map +1 -0
- package/lib/features/notion/NotionSheets.js +87 -15
- package/lib/features/notion/NotionSheets.js.map +1 -1
- package/lib/features/notion/NotionSidebarSections.js +492 -0
- package/lib/features/notion/NotionSidebarSections.js.map +1 -0
- package/lib/features/notion/NotionWorkspaceAdmin.js +659 -0
- package/lib/features/notion/NotionWorkspaceAdmin.js.map +1 -0
- package/lib/features/notion/NotionWorkspaceView.js +257 -45
- package/lib/features/notion/NotionWorkspaceView.js.map +1 -1
- package/lib/features/notion/database/DatabaseCells.js +554 -0
- package/lib/features/notion/database/DatabaseCells.js.map +1 -0
- package/lib/features/notion/database/DatabaseDateLayouts.js +792 -0
- package/lib/features/notion/database/DatabaseDateLayouts.js.map +1 -0
- package/lib/features/notion/database/DatabaseLayouts.js +461 -0
- package/lib/features/notion/database/DatabaseLayouts.js.map +1 -0
- package/lib/features/notion/database/DatabaseSheets.js +791 -0
- package/lib/features/notion/database/DatabaseSheets.js.map +1 -0
- package/lib/features/notion/database/NotionDatabaseView.js +817 -0
- package/lib/features/notion/database/NotionDatabaseView.js.map +1 -0
- package/lib/features/notion/database/RowPropertiesPanel.js +162 -0
- package/lib/features/notion/database/RowPropertiesPanel.js.map +1 -0
- package/lib/features/notion/database/chartData.js +89 -0
- package/lib/features/notion/database/chartData.js.map +1 -0
- package/lib/features/notion/database/chartView.js +112 -0
- package/lib/features/notion/database/chartView.js.map +1 -0
- package/lib/features/notion/database/connectorButton.js +33 -0
- package/lib/features/notion/database/connectorButton.js.map +1 -0
- package/lib/features/notion/database/databaseCalc.js +208 -0
- package/lib/features/notion/database/databaseCalc.js.map +1 -0
- package/lib/features/notion/database/databaseCalendar.js +157 -0
- package/lib/features/notion/database/databaseCalendar.js.map +1 -0
- package/lib/features/notion/database/databaseCsv.js +98 -0
- package/lib/features/notion/database/databaseCsv.js.map +1 -0
- package/lib/features/notion/database/databaseCsvActions.js +58 -0
- package/lib/features/notion/database/databaseCsvActions.js.map +1 -0
- package/lib/features/notion/database/databaseFilter.js +473 -0
- package/lib/features/notion/database/databaseFilter.js.map +1 -0
- package/lib/features/notion/database/databaseFormula.js +1072 -0
- package/lib/features/notion/database/databaseFormula.js.map +1 -0
- package/lib/features/notion/database/databaseGroup.js +151 -0
- package/lib/features/notion/database/databaseGroup.js.map +1 -0
- package/lib/features/notion/database/databaseRollup.js +58 -0
- package/lib/features/notion/database/databaseRollup.js.map +1 -0
- package/lib/features/notion/database/databaseTimeline.js +156 -0
- package/lib/features/notion/database/databaseTimeline.js.map +1 -0
- package/lib/features/notion/database/databaseView.js +1188 -0
- package/lib/features/notion/database/databaseView.js.map +1 -0
- package/lib/features/notion/database/databaseViews.js +310 -0
- package/lib/features/notion/database/databaseViews.js.map +1 -0
- package/lib/features/notion/database/relationSource.js +92 -0
- package/lib/features/notion/database/relationSource.js.map +1 -0
- package/lib/features/notion/database/uniqueId.js +17 -0
- package/lib/features/notion/database/uniqueId.js.map +1 -0
- package/lib/features/notion/database/useNotionDatabase.js +617 -0
- package/lib/features/notion/database/useNotionDatabase.js.map +1 -0
- package/lib/features/notion/notionAgentRunStatus.js +39 -0
- package/lib/features/notion/notionAgentRunStatus.js.map +1 -0
- package/lib/features/notion/notionCodeLanguages.js +112 -0
- package/lib/features/notion/notionCodeLanguages.js.map +1 -0
- package/lib/features/notion/notionComments.js +86 -0
- package/lib/features/notion/notionComments.js.map +1 -0
- package/lib/features/notion/notionConnections.js +74 -0
- package/lib/features/notion/notionConnections.js.map +1 -0
- package/lib/features/notion/notionDocuments.js +453 -1
- package/lib/features/notion/notionDocuments.js.map +1 -1
- package/lib/features/notion/notionEditorModel.js +142 -7
- package/lib/features/notion/notionEditorModel.js.map +1 -1
- package/lib/features/notion/notionMarkdownShortcuts.js +51 -0
- package/lib/features/notion/notionMarkdownShortcuts.js.map +1 -0
- package/lib/features/notion/notionMedia.js +119 -0
- package/lib/features/notion/notionMedia.js.map +1 -0
- package/lib/features/notion/notionMentionDate.js +32 -0
- package/lib/features/notion/notionMentionDate.js.map +1 -0
- package/lib/features/notion/notionMentionOptions.js +162 -0
- package/lib/features/notion/notionMentionOptions.js.map +1 -0
- package/lib/features/notion/notionNotesAgent.js +445 -0
- package/lib/features/notion/notionNotesAgent.js.map +1 -0
- package/lib/features/notion/notionPageAccess.js +168 -0
- package/lib/features/notion/notionPageAccess.js.map +1 -0
- package/lib/features/notion/notionPageActions.js +138 -0
- package/lib/features/notion/notionPageActions.js.map +1 -0
- package/lib/features/notion/notionPageHistory.js +154 -0
- package/lib/features/notion/notionPageHistory.js.map +1 -0
- package/lib/features/notion/notionPageKinds.js +200 -0
- package/lib/features/notion/notionPageKinds.js.map +1 -0
- package/lib/features/notion/notionRecents.js +48 -0
- package/lib/features/notion/notionRecents.js.map +1 -0
- package/lib/features/notion/notionRichText.js +177 -0
- package/lib/features/notion/notionRichText.js.map +1 -0
- package/lib/features/notion/notionRichTitle.js +336 -0
- package/lib/features/notion/notionRichTitle.js.map +1 -0
- package/lib/features/notion/useNotionWorkspace.js +272 -13
- package/lib/features/notion/useNotionWorkspace.js.map +1 -1
- package/lib/features/notion/usePageActions.js +155 -0
- package/lib/features/notion/usePageActions.js.map +1 -0
- package/lib/features/resume/ResumeAgentChatPane.js +1 -1
- package/lib/features/resume/ResumeAgentChatPane.js.map +1 -1
- package/lib/features/shopping/ShoppingAgentChatPane.js +1 -1
- package/lib/features/shopping/ShoppingAgentChatPane.js.map +1 -1
- package/lib/features/study/StudyAgentChatPane.js +1 -1
- package/lib/features/study/StudyAgentChatPane.js.map +1 -1
- package/lib/features/travel/TravelAgentChatPane.js +1 -1
- package/lib/features/travel/TravelAgentChatPane.js.map +1 -1
- package/lib/features/webbuilder/WebBuilderExperience.js +40 -8
- package/lib/features/webbuilder/WebBuilderExperience.js.map +1 -1
- package/lib/features/webbuilder/buildFragments.js +1 -1
- package/lib/features/webbuilder/buildFragments.js.map +1 -1
- package/lib/features/webbuilder/codeFiles.js +302 -0
- package/lib/features/webbuilder/codeFiles.js.map +1 -0
- package/lib/features/webbuilder/codeHighlight.js +209 -0
- package/lib/features/webbuilder/codeHighlight.js.map +1 -0
- package/lib/features/webbuilder/components/CodeView.js +682 -52
- package/lib/features/webbuilder/components/CodeView.js.map +1 -1
- package/lib/features/webbuilder/components/PreviewScreen.js +59 -38
- package/lib/features/webbuilder/components/PreviewScreen.js.map +1 -1
- package/lib/features/webbuilder/components/ProjectChat.js +3 -3
- package/lib/features/webbuilder/components/ProjectChat.js.map +1 -1
- package/lib/features/webbuilder/stepLabels.js +68 -0
- package/lib/features/webbuilder/stepLabels.js.map +1 -0
- package/lib/hooks/useHostChatSteering.js +45 -0
- package/lib/hooks/useHostChatSteering.js.map +1 -0
- package/lib/screens/Chat/index.js +2 -12
- package/lib/screens/Chat/index.js.map +1 -1
- package/lib/screens/Devices/index.js +205 -3
- package/lib/screens/Devices/index.js.map +1 -1
- package/lib/screens/ExpensesNative/useExpensesHostChat.js +25 -5
- package/lib/screens/ExpensesNative/useExpensesHostChat.js.map +1 -1
- package/lib/screens/InboxNative/useInboxHostChat.js +25 -5
- package/lib/screens/InboxNative/useInboxHostChat.js.map +1 -1
- package/lib/screens/JobSearchNative/useJobSearchHostChat.js +25 -5
- package/lib/screens/JobSearchNative/useJobSearchHostChat.js.map +1 -1
- package/lib/screens/LocalServicesNative/useLocalServicesHostChat.js +25 -5
- package/lib/screens/LocalServicesNative/useLocalServicesHostChat.js.map +1 -1
- package/lib/screens/MoviesNative/useMoviesHostChat.js +25 -5
- package/lib/screens/MoviesNative/useMoviesHostChat.js.map +1 -1
- package/lib/screens/NotionPage/index.js +2 -2
- package/lib/screens/NotionPage/index.js.map +1 -1
- package/lib/screens/ResumeNative/useResumeHostChat.js +25 -5
- package/lib/screens/ResumeNative/useResumeHostChat.js.map +1 -1
- package/lib/screens/ShoppingNative/useShoppingHostChat.js +25 -5
- package/lib/screens/ShoppingNative/useShoppingHostChat.js.map +1 -1
- package/lib/screens/StudyNative/useStudyHostChat.js +25 -5
- package/lib/screens/StudyNative/useStudyHostChat.js.map +1 -1
- package/lib/screens/TravelNative/useTravelHostChat.js +25 -5
- package/lib/screens/TravelNative/useTravelHostChat.js.map +1 -1
- package/lib/screens/WebBuilderNative/codeWorkspaceApi.js +222 -0
- package/lib/screens/WebBuilderNative/codeWorkspaceApi.js.map +1 -0
- package/lib/screens/WebBuilderNative/index.js +1 -1
- package/lib/screens/WebBuilderNative/index.js.map +1 -1
- package/lib/screens/WebBuilderNative/sandboxProxyApi.js +126 -4
- package/lib/screens/WebBuilderNative/sandboxProxyApi.js.map +1 -1
- package/lib/screens/WebBuilderNative/useWebBuilderHost.js +120 -11
- package/lib/screens/WebBuilderNative/useWebBuilderHost.js.map +1 -1
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useShoppingHostChat.js","sources":["../../../src/screens/ShoppingNative/useShoppingHostChat.ts"],"sourcesContent":["/**\n * Host chat lane for native Shop Agent — same role as web `services.hostChat`.\n * Lives on the Shop screen (MF host), not in the shopping remote, so Apollo /\n * cdecli stay out of the federated bundle.\n */\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport { useRoute } from '@react-navigation/native';\nimport { v4 as uuidv4 } from 'uuid';\nimport { useCdecliConnection } from '../../contexts/CdecliConnectionContext';\nimport { useChatStream, type MessageAttachment, type UseChatStreamRouting } from '../../hooks/useChatStream';\nimport { usePrerequisiteIds } from '../../hooks/usePrerequisiteIds';\nimport { useHostChatChannel } from '../../hooks/useHostChatChannel';\nimport { useHostConnectorCard } from '../../hooks/useHostConnectorCard';\nimport type { AgentChatMessage } from '../../features/agent-chat';\nimport type { ShoppingHostChat } from '../../features/shopping/hostChat';\n\nconst TESTING_PROJECT_UUID = '9a8ac704-1040-4836-9b72-48b771ca91b1';\n\nexport function useShoppingHostChat(): ShoppingHostChat {\n const params = useRoute().params as { orgName?: unknown; channelId?: unknown } | undefined;\n const routeOrg = typeof params?.orgName === 'string' ? params.orgName.trim() : '';\n const { orgName, projectId } = usePrerequisiteIds();\n const effectiveOrg = routeOrg || orgName || '';\n const submitProjectId = projectId || TESTING_PROJECT_UUID;\n\n // A hand-off from an empty Chat names the chat it was typed into. Shop carries\n // on in that chat (it already exists) instead of leaving an empty \"New chat\".\n const handedOffChannelId =\n typeof params?.channelId === 'string' && params.channelId.trim() ? params.channelId.trim() : '';\n const [channelId] = useState(() => handedOffChannelId || uuidv4());\n\n const cdecli = useCdecliConnection();\n const { setActiveChannelId } = cdecli;\n useEffect(() => {\n setActiveChannelId(channelId);\n return undefined;\n }, [channelId, setActiveChannelId]);\n\n const { ensureChannel } = useHostChatChannel({\n channelId,\n orgName: effectiveOrg,\n projectId: submitProjectId,\n exists: Boolean(handedOffChannelId),\n label: 'ShoppingNative',\n });\n\n const persistenceMode = cdecli.persistenceMode ?? 'backend';\n const chatRouting: UseChatStreamRouting = useMemo(\n () => ({\n channelConnected: cdecli.channelConnected,\n accountId: cdecli.accountId,\n persistenceMode,\n recoverAgentAuth: cdecli.recoverAgentAuth,\n }),\n [cdecli.channelConnected, cdecli.accountId, cdecli.recoverAgentAuth, persistenceMode],\n );\n\n const chat = useChatStream(channelId, chatRouting);\n\n // A `[CONNECTOR_CONNECT]` request is answered by a card the host renders; the\n // remote gets the thread without the markers and the card's replies.\n const { displayMessages, displayStreaming, renderConnectorCard } = useHostConnectorCard(chat, channelId);\n\n const messages: AgentChatMessage[] = useMemo(\n () =>\n displayMessages(\n
|
|
1
|
+
{"version":3,"file":"useShoppingHostChat.js","sources":["../../../src/screens/ShoppingNative/useShoppingHostChat.ts"],"sourcesContent":["/**\n * Host chat lane for native Shop Agent — same role as web `services.hostChat`.\n * Lives on the Shop screen (MF host), not in the shopping remote, so Apollo /\n * cdecli stay out of the federated bundle.\n */\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport { useRoute } from '@react-navigation/native';\nimport { v4 as uuidv4 } from 'uuid';\nimport { useCdecliConnection } from '../../contexts/CdecliConnectionContext';\nimport { useChatStream, type MessageAttachment, type UseChatStreamRouting } from '../../hooks/useChatStream';\nimport { usePrerequisiteIds } from '../../hooks/usePrerequisiteIds';\nimport { useHostChatChannel } from '../../hooks/useHostChatChannel';\nimport { useHostChatSteering } from '../../hooks/useHostChatSteering';\nimport { useHostConnectorCard } from '../../hooks/useHostConnectorCard';\nimport type { AgentChatMessage } from '../../features/agent-chat';\nimport type { ShoppingHostChat } from '../../features/shopping/hostChat';\n\nconst TESTING_PROJECT_UUID = '9a8ac704-1040-4836-9b72-48b771ca91b1';\n\nexport function useShoppingHostChat(): ShoppingHostChat {\n const params = useRoute().params as { orgName?: unknown; channelId?: unknown } | undefined;\n const routeOrg = typeof params?.orgName === 'string' ? params.orgName.trim() : '';\n const { orgName, projectId } = usePrerequisiteIds();\n const effectiveOrg = routeOrg || orgName || '';\n const submitProjectId = projectId || TESTING_PROJECT_UUID;\n\n // A hand-off from an empty Chat names the chat it was typed into. Shop carries\n // on in that chat (it already exists) instead of leaving an empty \"New chat\".\n const handedOffChannelId =\n typeof params?.channelId === 'string' && params.channelId.trim() ? params.channelId.trim() : '';\n const [channelId] = useState(() => handedOffChannelId || uuidv4());\n\n const cdecli = useCdecliConnection();\n const { setActiveChannelId } = cdecli;\n useEffect(() => {\n setActiveChannelId(channelId);\n return undefined;\n }, [channelId, setActiveChannelId]);\n\n const { ensureChannel } = useHostChatChannel({\n channelId,\n orgName: effectiveOrg,\n projectId: submitProjectId,\n exists: Boolean(handedOffChannelId),\n label: 'ShoppingNative',\n });\n\n const persistenceMode = cdecli.persistenceMode ?? 'backend';\n const chatRouting: UseChatStreamRouting = useMemo(\n () => ({\n channelConnected: cdecli.channelConnected,\n accountId: cdecli.accountId,\n persistenceMode,\n recoverAgentAuth: cdecli.recoverAgentAuth,\n }),\n [cdecli.channelConnected, cdecli.accountId, cdecli.recoverAgentAuth, persistenceMode],\n );\n\n const chat = useChatStream(channelId, chatRouting);\n\n // Mid-reply sends queue behind the running turn; the pane shows them above its composer.\n const { visibleMessages, steering } = useHostChatSteering(chat);\n\n // A `[CONNECTOR_CONNECT]` request is answered by a card the host renders; the\n // remote gets the thread without the markers and the card's replies.\n const { displayMessages, displayStreaming, renderConnectorCard } = useHostConnectorCard(chat, channelId);\n\n const messages: AgentChatMessage[] = useMemo(\n () =>\n displayMessages(\n visibleMessages.map((m, index) => ({\n id: `${m.role}-${index}`,\n role: m.role,\n content: m.content,\n attachments: m.attachments,\n })),\n ),\n [visibleMessages, displayMessages],\n );\n\n const send = useCallback(\n (text: string, attachments?: MessageAttachment[]) => {\n // The chat is created by the first message, not by opening the screen.\n void ensureChannel().then(() => chat.sendMessage(text, attachments, channelId));\n },\n [chat, channelId, ensureChannel],\n );\n\n return useMemo(\n () => ({\n messages,\n streaming: displayStreaming(chat.response),\n busy: chat.isLoading || chat.isStreaming,\n error: chat.error,\n connected: cdecli.channelConnected,\n send,\n clear: chat.clearMessages,\n renderConnectorCard,\n ...steering,\n }),\n [\n steering,\n messages,\n chat.response,\n displayStreaming,\n chat.isLoading,\n chat.isStreaming,\n chat.error,\n cdecli.channelConnected,\n send,\n chat.clearMessages,\n renderConnectorCard,\n ],\n );\n}\n"],"names":["uuidv4"],"mappings":"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"}
|
|
@@ -1,4 +1,20 @@
|
|
|
1
|
-
import {useState,useEffect,useMemo,useCallback}from'react';import {v4}from'uuid';import {useCdecliConnection}from'../../contexts/CdecliConnectionContext.js';import {useChatStream}from'../../hooks/useChatStream.js';import {usePrerequisiteIds}from'../../hooks/usePrerequisiteIds.js';import {useHostChatChannel}from'../../hooks/useHostChatChannel.js';import {useHostConnectorCard}from'../../hooks/useHostConnectorCard.js';import {stripStudyContext}from'../../features/study/studyContext.js';
|
|
1
|
+
import {useState,useEffect,useMemo,useCallback}from'react';import {v4}from'uuid';import {useCdecliConnection}from'../../contexts/CdecliConnectionContext.js';import {useChatStream}from'../../hooks/useChatStream.js';import {usePrerequisiteIds}from'../../hooks/usePrerequisiteIds.js';import {useHostChatChannel}from'../../hooks/useHostChatChannel.js';import {useHostChatSteering}from'../../hooks/useHostChatSteering.js';import {useHostConnectorCard}from'../../hooks/useHostConnectorCard.js';import {stripStudyContext}from'../../features/study/studyContext.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
|
+
function useStudyHostChat(routeOrg) {
|
|
2
18
|
var _a;
|
|
3
19
|
const {
|
|
4
20
|
orgName,
|
|
@@ -30,18 +46,22 @@ import {useState,useEffect,useMemo,useCallback}from'react';import {v4}from'uuid'
|
|
|
30
46
|
recoverAgentAuth: cdecli.recoverAgentAuth
|
|
31
47
|
}), [cdecli.channelConnected, cdecli.accountId, cdecli.recoverAgentAuth, persistenceMode]);
|
|
32
48
|
const chat = useChatStream(channelId, chatRouting);
|
|
49
|
+
const {
|
|
50
|
+
visibleMessages,
|
|
51
|
+
steering
|
|
52
|
+
} = useHostChatSteering(chat, stripStudyContext);
|
|
33
53
|
const {
|
|
34
54
|
displayMessages,
|
|
35
55
|
displayStreaming,
|
|
36
56
|
renderConnectorCard
|
|
37
57
|
} = useHostConnectorCard(chat, channelId);
|
|
38
|
-
const messages = useMemo(() => displayMessages(
|
|
58
|
+
const messages = useMemo(() => displayMessages(visibleMessages.map((m, index) => ({
|
|
39
59
|
id: `${m.role}-${index}`,
|
|
40
60
|
role: m.role,
|
|
41
61
|
// The study context line is for the agent; the user sees their own words.
|
|
42
62
|
content: m.role === "user" ? stripStudyContext(m.content) : m.content,
|
|
43
63
|
attachments: m.attachments
|
|
44
|
-
}))), [
|
|
64
|
+
}))), [visibleMessages, displayMessages]);
|
|
45
65
|
const send = useCallback((text, attachments) => {
|
|
46
66
|
void ensureChannel().then(() => chat.sendMessage(text, attachments, channelId));
|
|
47
67
|
}, [chat, channelId, ensureChannel]);
|
|
@@ -49,7 +69,7 @@ import {useState,useEffect,useMemo,useCallback}from'react';import {v4}from'uuid'
|
|
|
49
69
|
chat.clearMessages();
|
|
50
70
|
setChannelId(v4());
|
|
51
71
|
}, [chat]);
|
|
52
|
-
return useMemo(() => ({
|
|
72
|
+
return useMemo(() => __spreadValues({
|
|
53
73
|
messages,
|
|
54
74
|
streaming: displayStreaming(chat.response),
|
|
55
75
|
busy: chat.isLoading || chat.isStreaming,
|
|
@@ -58,5 +78,5 @@ import {useState,useEffect,useMemo,useCallback}from'react';import {v4}from'uuid'
|
|
|
58
78
|
send,
|
|
59
79
|
clear,
|
|
60
80
|
renderConnectorCard
|
|
61
|
-
}), [messages, chat.response, displayStreaming, chat.isLoading, chat.isStreaming, chat.error, cdecli.channelConnected, send, clear, renderConnectorCard]);
|
|
81
|
+
}, steering), [steering, messages, chat.response, displayStreaming, chat.isLoading, chat.isStreaming, chat.error, cdecli.channelConnected, send, clear, renderConnectorCard]);
|
|
62
82
|
}export{useStudyHostChat};//# sourceMappingURL=useStudyHostChat.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useStudyHostChat.js","sources":["../../../src/screens/StudyNative/useStudyHostChat.ts"],"sourcesContent":["/**\n * Host chat lane for the native Study agent - same role as web `services.hostChat`.\n * Lives on the Study screen (MF host), not in the remote, so Apollo / cdecli\n * stay out of the federated bundle.\n */\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport { v4 as uuidv4 } from 'uuid';\nimport { useCdecliConnection } from '../../contexts/CdecliConnectionContext';\nimport { useChatStream, type MessageAttachment, type UseChatStreamRouting } from '../../hooks/useChatStream';\nimport { usePrerequisiteIds } from '../../hooks/usePrerequisiteIds';\nimport { useHostChatChannel } from '../../hooks/useHostChatChannel';\nimport { useHostConnectorCard } from '../../hooks/useHostConnectorCard';\nimport type { AgentChatMessage } from '../../features/agent-chat';\nimport type { StudyHostChat } from '../../features/study/hostChat';\nimport { stripStudyContext } from '../../features/study/studyContext';\n\nexport function useStudyHostChat(routeOrg?: string): StudyHostChat {\n const { orgName, projectId } = usePrerequisiteIds();\n const effectiveOrg = routeOrg || orgName || '';\n\n const [channelId, setChannelId] = useState(() => uuidv4());\n\n const cdecli = useCdecliConnection();\n const { setActiveChannelId } = cdecli;\n useEffect(() => {\n setActiveChannelId(channelId);\n return undefined;\n }, [channelId, setActiveChannelId]);\n\n const { ensureChannel } = useHostChatChannel({\n channelId,\n orgName: effectiveOrg,\n projectId: projectId ?? '',\n label: 'StudyNative',\n });\n\n const persistenceMode = cdecli.persistenceMode ?? 'backend';\n const chatRouting: UseChatStreamRouting = useMemo(\n () => ({\n channelConnected: cdecli.channelConnected,\n accountId: cdecli.accountId,\n persistenceMode,\n recoverAgentAuth: cdecli.recoverAgentAuth,\n }),\n [cdecli.channelConnected, cdecli.accountId, cdecli.recoverAgentAuth, persistenceMode],\n );\n\n const chat = useChatStream(channelId, chatRouting);\n\n // A `[CONNECTOR_CONNECT]` request is answered by a card the host renders; the\n // remote gets the thread without the markers and the card's replies.\n const { displayMessages, displayStreaming, renderConnectorCard } = useHostConnectorCard(chat, channelId);\n\n const messages: AgentChatMessage[] = useMemo(\n () =>\n displayMessages(\n
|
|
1
|
+
{"version":3,"file":"useStudyHostChat.js","sources":["../../../src/screens/StudyNative/useStudyHostChat.ts"],"sourcesContent":["/**\n * Host chat lane for the native Study agent - same role as web `services.hostChat`.\n * Lives on the Study screen (MF host), not in the remote, so Apollo / cdecli\n * stay out of the federated bundle.\n */\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport { v4 as uuidv4 } from 'uuid';\nimport { useCdecliConnection } from '../../contexts/CdecliConnectionContext';\nimport { useChatStream, type MessageAttachment, type UseChatStreamRouting } from '../../hooks/useChatStream';\nimport { usePrerequisiteIds } from '../../hooks/usePrerequisiteIds';\nimport { useHostChatChannel } from '../../hooks/useHostChatChannel';\nimport { useHostChatSteering } from '../../hooks/useHostChatSteering';\nimport { useHostConnectorCard } from '../../hooks/useHostConnectorCard';\nimport type { AgentChatMessage } from '../../features/agent-chat';\nimport type { StudyHostChat } from '../../features/study/hostChat';\nimport { stripStudyContext } from '../../features/study/studyContext';\n\nexport function useStudyHostChat(routeOrg?: string): StudyHostChat {\n const { orgName, projectId } = usePrerequisiteIds();\n const effectiveOrg = routeOrg || orgName || '';\n\n const [channelId, setChannelId] = useState(() => uuidv4());\n\n const cdecli = useCdecliConnection();\n const { setActiveChannelId } = cdecli;\n useEffect(() => {\n setActiveChannelId(channelId);\n return undefined;\n }, [channelId, setActiveChannelId]);\n\n const { ensureChannel } = useHostChatChannel({\n channelId,\n orgName: effectiveOrg,\n projectId: projectId ?? '',\n label: 'StudyNative',\n });\n\n const persistenceMode = cdecli.persistenceMode ?? 'backend';\n const chatRouting: UseChatStreamRouting = useMemo(\n () => ({\n channelConnected: cdecli.channelConnected,\n accountId: cdecli.accountId,\n persistenceMode,\n recoverAgentAuth: cdecli.recoverAgentAuth,\n }),\n [cdecli.channelConnected, cdecli.accountId, cdecli.recoverAgentAuth, persistenceMode],\n );\n\n const chat = useChatStream(channelId, chatRouting);\n\n // Mid-reply sends queue behind the running turn; the pane shows them above its composer.\n const { visibleMessages, steering } = useHostChatSteering(chat, stripStudyContext);\n\n // A `[CONNECTOR_CONNECT]` request is answered by a card the host renders; the\n // remote gets the thread without the markers and the card's replies.\n const { displayMessages, displayStreaming, renderConnectorCard } = useHostConnectorCard(chat, channelId);\n\n const messages: AgentChatMessage[] = useMemo(\n () =>\n displayMessages(\n visibleMessages.map((m, index) => ({\n id: `${m.role}-${index}`,\n role: m.role,\n // The study context line is for the agent; the user sees their own words.\n content: m.role === 'user' ? stripStudyContext(m.content) : m.content,\n attachments: m.attachments,\n })),\n ),\n [visibleMessages, displayMessages],\n );\n\n const send = useCallback(\n (text: string, attachments?: MessageAttachment[]) => {\n // The chat is created by the first message, not by opening the screen.\n void ensureChannel().then(() => chat.sendMessage(text, attachments, channelId));\n },\n [chat, channelId, ensureChannel],\n );\n\n const clear = useCallback(() => {\n // Stop mid-turn, wipe the local transcript, then open a fresh channel so\n // gateway history cannot rehydrate the cleared thread.\n chat.clearMessages();\n setChannelId(uuidv4());\n }, [chat]);\n\n return useMemo(\n () => ({\n messages,\n streaming: displayStreaming(chat.response),\n busy: chat.isLoading || chat.isStreaming,\n error: chat.error,\n connected: cdecli.channelConnected,\n send,\n clear,\n renderConnectorCard,\n ...steering,\n }),\n [\n steering,\n messages,\n chat.response,\n displayStreaming,\n chat.isLoading,\n chat.isStreaming,\n chat.error,\n cdecli.channelConnected,\n send,\n clear,\n renderConnectorCard,\n ],\n );\n}\n"],"names":["uuidv4"],"mappings":"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"}
|
|
@@ -1,4 +1,20 @@
|
|
|
1
|
-
import {useState,useEffect,useMemo,useCallback}from'react';import {useRoute}from'@react-navigation/native';import {v4}from'uuid';import {useCdecliConnection}from'../../contexts/CdecliConnectionContext.js';import {useChatStream}from'../../hooks/useChatStream.js';import {usePrerequisiteIds}from'../../hooks/usePrerequisiteIds.js';import {useHostChatChannel}from'../../hooks/useHostChatChannel.js';import {useHostConnectorCard}from'../../hooks/useHostConnectorCard.js';
|
|
1
|
+
import {useState,useEffect,useMemo,useCallback}from'react';import {useRoute}from'@react-navigation/native';import {v4}from'uuid';import {useCdecliConnection}from'../../contexts/CdecliConnectionContext.js';import {useChatStream}from'../../hooks/useChatStream.js';import {usePrerequisiteIds}from'../../hooks/usePrerequisiteIds.js';import {useHostChatChannel}from'../../hooks/useHostChatChannel.js';import {useHostChatSteering}from'../../hooks/useHostChatSteering.js';import {useHostConnectorCard}from'../../hooks/useHostConnectorCard.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
|
+
const TESTING_PROJECT_UUID = "9a8ac704-1040-4836-9b72-48b771ca91b1";
|
|
2
18
|
function useTravelHostChat() {
|
|
3
19
|
var _a;
|
|
4
20
|
const params = useRoute().params;
|
|
@@ -34,21 +50,25 @@ function useTravelHostChat() {
|
|
|
34
50
|
recoverAgentAuth: cdecli.recoverAgentAuth
|
|
35
51
|
}), [cdecli.channelConnected, cdecli.accountId, cdecli.recoverAgentAuth, persistenceMode]);
|
|
36
52
|
const chat = useChatStream(channelId, chatRouting);
|
|
53
|
+
const {
|
|
54
|
+
visibleMessages,
|
|
55
|
+
steering
|
|
56
|
+
} = useHostChatSteering(chat);
|
|
37
57
|
const {
|
|
38
58
|
displayMessages,
|
|
39
59
|
displayStreaming,
|
|
40
60
|
renderConnectorCard
|
|
41
61
|
} = useHostConnectorCard(chat, channelId);
|
|
42
|
-
const messages = useMemo(() => displayMessages(
|
|
62
|
+
const messages = useMemo(() => displayMessages(visibleMessages.map((m, index) => ({
|
|
43
63
|
id: `${m.role}-${index}`,
|
|
44
64
|
role: m.role,
|
|
45
65
|
content: m.content,
|
|
46
66
|
attachments: m.attachments
|
|
47
|
-
}))), [
|
|
67
|
+
}))), [visibleMessages, displayMessages]);
|
|
48
68
|
const send = useCallback((text, attachments) => {
|
|
49
69
|
void ensureChannel().then(() => chat.sendMessage(text, attachments, channelId));
|
|
50
70
|
}, [chat, channelId, ensureChannel]);
|
|
51
|
-
return useMemo(() => ({
|
|
71
|
+
return useMemo(() => __spreadValues({
|
|
52
72
|
messages,
|
|
53
73
|
streaming: displayStreaming(chat.response),
|
|
54
74
|
busy: chat.isLoading || chat.isStreaming,
|
|
@@ -57,5 +77,5 @@ function useTravelHostChat() {
|
|
|
57
77
|
send,
|
|
58
78
|
clear: chat.clearMessages,
|
|
59
79
|
renderConnectorCard
|
|
60
|
-
}), [messages, chat.response, displayStreaming, chat.isLoading, chat.isStreaming, chat.error, cdecli.channelConnected, send, chat.clearMessages, renderConnectorCard]);
|
|
80
|
+
}, steering), [steering, messages, chat.response, displayStreaming, chat.isLoading, chat.isStreaming, chat.error, cdecli.channelConnected, send, chat.clearMessages, renderConnectorCard]);
|
|
61
81
|
}export{useTravelHostChat};//# sourceMappingURL=useTravelHostChat.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTravelHostChat.js","sources":["../../../src/screens/TravelNative/useTravelHostChat.ts"],"sourcesContent":["/**\n * Host chat lane for native Travel Agent — same role as web `services.hostChat`.\n * Lives on the Travel screen (MF host), not in the travel remote.\n */\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport { useRoute } from '@react-navigation/native';\nimport { v4 as uuidv4 } from 'uuid';\nimport { useCdecliConnection } from '../../contexts/CdecliConnectionContext';\nimport { useChatStream, type MessageAttachment, type UseChatStreamRouting } from '../../hooks/useChatStream';\nimport { usePrerequisiteIds } from '../../hooks/usePrerequisiteIds';\nimport { useHostChatChannel } from '../../hooks/useHostChatChannel';\nimport { useHostConnectorCard } from '../../hooks/useHostConnectorCard';\nimport type { AgentChatMessage } from '../../features/agent-chat';\nimport type { TravelHostChat } from '../../features/travel/hostChat';\n\nconst TESTING_PROJECT_UUID = '9a8ac704-1040-4836-9b72-48b771ca91b1';\n\nexport function useTravelHostChat(): TravelHostChat {\n const params = useRoute().params as { orgName?: unknown; channelId?: unknown } | undefined;\n const routeOrg = typeof params?.orgName === 'string' ? params.orgName.trim() : '';\n const { orgName, projectId } = usePrerequisiteIds();\n const effectiveOrg = routeOrg || orgName || '';\n const submitProjectId = projectId || TESTING_PROJECT_UUID;\n\n const [channelId] = useState(() => uuidv4());\n\n const cdecli = useCdecliConnection();\n const { setActiveChannelId } = cdecli;\n useEffect(() => {\n setActiveChannelId(channelId);\n return undefined;\n }, [channelId, setActiveChannelId]);\n\n const { ensureChannel } = useHostChatChannel({\n channelId,\n orgName: effectiveOrg,\n projectId: submitProjectId,\n label: 'TravelNative',\n });\n\n const persistenceMode = cdecli.persistenceMode ?? 'backend';\n const chatRouting: UseChatStreamRouting = useMemo(\n () => ({\n channelConnected: cdecli.channelConnected,\n accountId: cdecli.accountId,\n persistenceMode,\n recoverAgentAuth: cdecli.recoverAgentAuth,\n }),\n [cdecli.channelConnected, cdecli.accountId, cdecli.recoverAgentAuth, persistenceMode],\n );\n\n const chat = useChatStream(channelId, chatRouting);\n\n // A `[CONNECTOR_CONNECT]` request is answered by a card the host renders; the\n // remote gets the thread without the markers and the card's replies.\n const { displayMessages, displayStreaming, renderConnectorCard } = useHostConnectorCard(chat, channelId);\n\n const messages: AgentChatMessage[] = useMemo(\n () =>\n displayMessages(\n
|
|
1
|
+
{"version":3,"file":"useTravelHostChat.js","sources":["../../../src/screens/TravelNative/useTravelHostChat.ts"],"sourcesContent":["/**\n * Host chat lane for native Travel Agent — same role as web `services.hostChat`.\n * Lives on the Travel screen (MF host), not in the travel remote.\n */\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport { useRoute } from '@react-navigation/native';\nimport { v4 as uuidv4 } from 'uuid';\nimport { useCdecliConnection } from '../../contexts/CdecliConnectionContext';\nimport { useChatStream, type MessageAttachment, type UseChatStreamRouting } from '../../hooks/useChatStream';\nimport { usePrerequisiteIds } from '../../hooks/usePrerequisiteIds';\nimport { useHostChatChannel } from '../../hooks/useHostChatChannel';\nimport { useHostChatSteering } from '../../hooks/useHostChatSteering';\nimport { useHostConnectorCard } from '../../hooks/useHostConnectorCard';\nimport type { AgentChatMessage } from '../../features/agent-chat';\nimport type { TravelHostChat } from '../../features/travel/hostChat';\n\nconst TESTING_PROJECT_UUID = '9a8ac704-1040-4836-9b72-48b771ca91b1';\n\nexport function useTravelHostChat(): TravelHostChat {\n const params = useRoute().params as { orgName?: unknown; channelId?: unknown } | undefined;\n const routeOrg = typeof params?.orgName === 'string' ? params.orgName.trim() : '';\n const { orgName, projectId } = usePrerequisiteIds();\n const effectiveOrg = routeOrg || orgName || '';\n const submitProjectId = projectId || TESTING_PROJECT_UUID;\n\n const [channelId] = useState(() => uuidv4());\n\n const cdecli = useCdecliConnection();\n const { setActiveChannelId } = cdecli;\n useEffect(() => {\n setActiveChannelId(channelId);\n return undefined;\n }, [channelId, setActiveChannelId]);\n\n const { ensureChannel } = useHostChatChannel({\n channelId,\n orgName: effectiveOrg,\n projectId: submitProjectId,\n label: 'TravelNative',\n });\n\n const persistenceMode = cdecli.persistenceMode ?? 'backend';\n const chatRouting: UseChatStreamRouting = useMemo(\n () => ({\n channelConnected: cdecli.channelConnected,\n accountId: cdecli.accountId,\n persistenceMode,\n recoverAgentAuth: cdecli.recoverAgentAuth,\n }),\n [cdecli.channelConnected, cdecli.accountId, cdecli.recoverAgentAuth, persistenceMode],\n );\n\n const chat = useChatStream(channelId, chatRouting);\n\n // Mid-reply sends queue behind the running turn; the pane shows them above its composer.\n const { visibleMessages, steering } = useHostChatSteering(chat);\n\n // A `[CONNECTOR_CONNECT]` request is answered by a card the host renders; the\n // remote gets the thread without the markers and the card's replies.\n const { displayMessages, displayStreaming, renderConnectorCard } = useHostConnectorCard(chat, channelId);\n\n const messages: AgentChatMessage[] = useMemo(\n () =>\n displayMessages(\n visibleMessages.map((m, index) => ({\n id: `${m.role}-${index}`,\n role: m.role,\n content: m.content,\n attachments: m.attachments,\n })),\n ),\n [visibleMessages, displayMessages],\n );\n\n const send = useCallback(\n (text: string, attachments?: MessageAttachment[]) => {\n // The chat is created by the first message, not by opening the screen.\n void ensureChannel().then(() => chat.sendMessage(text, attachments, channelId));\n },\n [chat, channelId, ensureChannel],\n );\n\n return useMemo(\n () => ({\n messages,\n streaming: displayStreaming(chat.response),\n busy: chat.isLoading || chat.isStreaming,\n error: chat.error,\n connected: cdecli.channelConnected,\n send,\n clear: chat.clearMessages,\n renderConnectorCard,\n ...steering,\n }),\n [\n steering,\n messages,\n chat.response,\n displayStreaming,\n chat.isLoading,\n chat.isStreaming,\n chat.error,\n cdecli.channelConnected,\n send,\n chat.clearMessages,\n renderConnectorCard,\n ],\n );\n}\n"],"names":["uuidv4"],"mappings":"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"}
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
import {searchDocs,buildSearchCommand,parseSearchOutput,codeEditSummary,isSavedCodeRead,openModeFor,parseListFilesResult,parseListFilesOutput,isSandboxUnavailableError,decideSave,buildListFilesCommand,READ_FILE_MAX_BYTES}from'../../features/webbuilder/codeFiles.js';var __defProp = Object.defineProperty;
|
|
2
|
+
var __defProps = Object.defineProperties;
|
|
3
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
4
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
7
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
8
|
+
var __spreadValues = (a, b) => {
|
|
9
|
+
for (var prop in b || (b = {}))
|
|
10
|
+
if (__hasOwnProp.call(b, prop))
|
|
11
|
+
__defNormalProp(a, prop, b[prop]);
|
|
12
|
+
if (__getOwnPropSymbols)
|
|
13
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
14
|
+
if (__propIsEnum.call(b, prop))
|
|
15
|
+
__defNormalProp(a, prop, b[prop]);
|
|
16
|
+
}
|
|
17
|
+
return a;
|
|
18
|
+
};
|
|
19
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
20
|
+
const LIST_TIMEOUT_MS = 9e4;
|
|
21
|
+
const FILE_TIMEOUT_MS = 6e4;
|
|
22
|
+
function dataOf(result) {
|
|
23
|
+
const raw = result == null ? void 0 : result.data;
|
|
24
|
+
if (!raw || typeof raw !== "object") return {};
|
|
25
|
+
const rec = raw;
|
|
26
|
+
return rec.data && typeof rec.data === "object" && !Array.isArray(rec.data) ? rec.data : rec;
|
|
27
|
+
}
|
|
28
|
+
function stdoutOf(d) {
|
|
29
|
+
const nested = [d, d.data, d.result, d.output].filter((v) => Boolean(v) && typeof v === "object");
|
|
30
|
+
for (const rec of nested) {
|
|
31
|
+
if (typeof rec.stdout === "string") return rec.stdout;
|
|
32
|
+
if (typeof rec.output === "string") return rec.output;
|
|
33
|
+
}
|
|
34
|
+
return "";
|
|
35
|
+
}
|
|
36
|
+
function createCodeWorkspace(call, onHandEdit) {
|
|
37
|
+
const run = (action, params, timeoutMs) => call(action, params, timeoutMs).catch((err) => ({
|
|
38
|
+
successful: false,
|
|
39
|
+
data: void 0,
|
|
40
|
+
error: err instanceof Error ? err.message : String(err)
|
|
41
|
+
}));
|
|
42
|
+
const listSaved = async (target) => {
|
|
43
|
+
if (!target.savedSource) {
|
|
44
|
+
return {
|
|
45
|
+
ok: false,
|
|
46
|
+
asleep: true,
|
|
47
|
+
error: "The site is asleep, so its files can't be read. Wake it to see them."
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
const r = await run("WEBBUILDER_LIST_FILES", __spreadProps(__spreadValues({}, target.sandboxId ? {
|
|
51
|
+
sandbox_id: target.sandboxId
|
|
52
|
+
} : {}), {
|
|
53
|
+
fromRepo: target.savedSource
|
|
54
|
+
}), LIST_TIMEOUT_MS);
|
|
55
|
+
const tree = r.successful ? parseListFilesResult(dataOf(r)) : null;
|
|
56
|
+
return tree ? {
|
|
57
|
+
ok: true,
|
|
58
|
+
tree,
|
|
59
|
+
saved: true
|
|
60
|
+
} : {
|
|
61
|
+
ok: false,
|
|
62
|
+
error: "Couldn't load the saved code. Wake the site to see its files."
|
|
63
|
+
};
|
|
64
|
+
};
|
|
65
|
+
const listFiles = async (target) => {
|
|
66
|
+
if (!target.sandboxId) return listSaved(target);
|
|
67
|
+
const listed = await run("WEBBUILDER_LIST_FILES", __spreadValues({
|
|
68
|
+
sandbox_id: target.sandboxId
|
|
69
|
+
}, target.savedSource ? {
|
|
70
|
+
fromRepo: target.savedSource
|
|
71
|
+
} : {}), LIST_TIMEOUT_MS);
|
|
72
|
+
const listedData = dataOf(listed);
|
|
73
|
+
const listedTree = listed.successful ? parseListFilesResult(listedData) : null;
|
|
74
|
+
if (listedTree) {
|
|
75
|
+
const fromRepo = listedData.source === "repo" || isSavedCodeRead(listedData);
|
|
76
|
+
return {
|
|
77
|
+
ok: true,
|
|
78
|
+
tree: listedTree,
|
|
79
|
+
saved: fromRepo
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
const r = await run("WEBBUILDER_RUN_COMMAND", {
|
|
83
|
+
sandbox_id: target.sandboxId,
|
|
84
|
+
command: buildListFilesCommand()
|
|
85
|
+
}, LIST_TIMEOUT_MS);
|
|
86
|
+
const d = dataOf(r);
|
|
87
|
+
const tree = r.successful ? parseListFilesOutput(stdoutOf(d), {
|
|
88
|
+
truncated: d.truncated === true
|
|
89
|
+
}) : null;
|
|
90
|
+
if (tree) return {
|
|
91
|
+
ok: true,
|
|
92
|
+
tree,
|
|
93
|
+
saved: false
|
|
94
|
+
};
|
|
95
|
+
if (typeof __DEV__ !== "undefined" && __DEV__) {
|
|
96
|
+
console.warn("[WebBuilderNative] code list", {
|
|
97
|
+
sandboxId: target.sandboxId,
|
|
98
|
+
listFiles: {
|
|
99
|
+
error: listed.error,
|
|
100
|
+
data: listedData
|
|
101
|
+
},
|
|
102
|
+
runCommand: {
|
|
103
|
+
error: r.error,
|
|
104
|
+
data: d
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
if (!r.successful && (isSandboxUnavailableError(r.error) || isSandboxUnavailableError(listed.error))) {
|
|
109
|
+
return listSaved(target);
|
|
110
|
+
}
|
|
111
|
+
if (r.successful) {
|
|
112
|
+
const stderr = typeof d.stderr === "string" ? d.stderr.trim().split("\n")[0] : "";
|
|
113
|
+
return {
|
|
114
|
+
ok: false,
|
|
115
|
+
error: `Couldn't read the file list${stderr ? `: ${stderr.slice(0, 160)}` : "."}`
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
return {
|
|
119
|
+
ok: false,
|
|
120
|
+
error: r.error || "Could not list the project files."
|
|
121
|
+
};
|
|
122
|
+
};
|
|
123
|
+
const readFile = async (target, path, saved) => {
|
|
124
|
+
const params = __spreadValues(__spreadProps(__spreadValues({}, target.sandboxId ? {
|
|
125
|
+
sandbox_id: target.sandboxId
|
|
126
|
+
} : {}), {
|
|
127
|
+
path,
|
|
128
|
+
maxBytes: READ_FILE_MAX_BYTES
|
|
129
|
+
}), target.savedSource ? {
|
|
130
|
+
fromRepo: target.savedSource
|
|
131
|
+
} : {});
|
|
132
|
+
const r = await run("WEBBUILDER_READ_FILE", params, FILE_TIMEOUT_MS);
|
|
133
|
+
if (!r.successful) return {
|
|
134
|
+
ok: false,
|
|
135
|
+
error: r.error || "Could not read the file."
|
|
136
|
+
};
|
|
137
|
+
const d = dataOf(r);
|
|
138
|
+
const fromBackup = saved || isSavedCodeRead(d);
|
|
139
|
+
return {
|
|
140
|
+
ok: true,
|
|
141
|
+
content: typeof d.content === "string" ? d.content : void 0,
|
|
142
|
+
mode: openModeFor(path, d),
|
|
143
|
+
saved: fromBackup
|
|
144
|
+
};
|
|
145
|
+
};
|
|
146
|
+
const saveFile = async (target, path, base, draft, force = false) => {
|
|
147
|
+
var _a;
|
|
148
|
+
if (!target.sandboxId) return {
|
|
149
|
+
ok: false,
|
|
150
|
+
error: "Wake the site to save changes."
|
|
151
|
+
};
|
|
152
|
+
if (!force) {
|
|
153
|
+
const now = await readFile(target, path, false);
|
|
154
|
+
if (now.ok && now.saved) return {
|
|
155
|
+
ok: false,
|
|
156
|
+
error: "The site is asleep. Wake it to save changes."
|
|
157
|
+
};
|
|
158
|
+
const disk = now.ok ? (_a = now.content) != null ? _a : null : null;
|
|
159
|
+
const decision = decideSave(base, disk, draft);
|
|
160
|
+
if (decision === "unchanged") return {
|
|
161
|
+
ok: true,
|
|
162
|
+
unchanged: true
|
|
163
|
+
};
|
|
164
|
+
if (decision === "conflict") return {
|
|
165
|
+
ok: false,
|
|
166
|
+
conflict: true,
|
|
167
|
+
disk: disk != null ? disk : ""
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
const r = await run("WEBBUILDER_WRITE_FILES", {
|
|
171
|
+
sandbox_id: target.sandboxId,
|
|
172
|
+
files: [{
|
|
173
|
+
path,
|
|
174
|
+
content: draft
|
|
175
|
+
}]
|
|
176
|
+
}, FILE_TIMEOUT_MS);
|
|
177
|
+
if (!r.successful) return {
|
|
178
|
+
ok: false,
|
|
179
|
+
error: r.error || "Could not save the file."
|
|
180
|
+
};
|
|
181
|
+
const summary = codeEditSummary(base, draft);
|
|
182
|
+
onHandEdit({
|
|
183
|
+
file: path,
|
|
184
|
+
summary
|
|
185
|
+
});
|
|
186
|
+
return {
|
|
187
|
+
ok: true,
|
|
188
|
+
summary
|
|
189
|
+
};
|
|
190
|
+
};
|
|
191
|
+
const search = async (target, query, live, openDocs) => {
|
|
192
|
+
const inMemory = () => ({
|
|
193
|
+
result: searchDocs(openDocs, query),
|
|
194
|
+
source: "open-files"
|
|
195
|
+
});
|
|
196
|
+
if (!live || !target.sandboxId) return inMemory();
|
|
197
|
+
let command;
|
|
198
|
+
try {
|
|
199
|
+
command = buildSearchCommand(query);
|
|
200
|
+
} catch (e) {
|
|
201
|
+
return inMemory();
|
|
202
|
+
}
|
|
203
|
+
const r = await run("WEBBUILDER_RUN_COMMAND", {
|
|
204
|
+
sandbox_id: target.sandboxId,
|
|
205
|
+
command
|
|
206
|
+
}, LIST_TIMEOUT_MS);
|
|
207
|
+
const d = dataOf(r);
|
|
208
|
+
const parsed = r.successful ? parseSearchOutput(stdoutOf(d), query, {
|
|
209
|
+
truncated: d.truncated === true
|
|
210
|
+
}) : null;
|
|
211
|
+
return parsed ? {
|
|
212
|
+
result: parsed,
|
|
213
|
+
source: "project"
|
|
214
|
+
} : inMemory();
|
|
215
|
+
};
|
|
216
|
+
return {
|
|
217
|
+
listFiles,
|
|
218
|
+
readFile,
|
|
219
|
+
saveFile,
|
|
220
|
+
search
|
|
221
|
+
};
|
|
222
|
+
}export{createCodeWorkspace};//# sourceMappingURL=codeWorkspaceApi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codeWorkspaceApi.js","sources":["../../../src/screens/WebBuilderNative/codeWorkspaceApi.ts"],"sourcesContent":["/**\n * The Code view's sandbox calls (web `code/codeWorkspaceMachine` IO), over the site's\n * sandbox router (the guarded proxy, so the app never holds a sandbox key):\n *\n * - list: `WEBBUILDER_RUN_COMMAND` with the tree listing; when the sandbox is gone,\n * `WEBBUILDER_LIST_FILES` from the backup repo (read-only \"saved code\");\n * - read: `WEBBUILDER_READ_FILE` (live reads carry `fromRepo` too, so a gone sandbox\n * answers from the backup, which is then never saved against);\n * - save: read again, `decideSave`, then `WEBBUILDER_WRITE_FILES`; a file changed on\n * disk since it was opened comes back as a conflict (Overwrite or Reload);\n * - search: a capped `git grep`, else the files already open.\n * No React: the host hook binds it to the open site.\n */\nimport {\n READ_FILE_MAX_BYTES,\n buildListFilesCommand,\n buildSearchCommand,\n codeEditSummary,\n decideSave,\n isSandboxUnavailableError,\n isSavedCodeRead,\n openModeFor,\n parseListFilesOutput,\n parseListFilesResult,\n parseSearchOutput,\n searchDocs,\n type ContentSearchResult,\n type FileTree,\n type FromRepo,\n type OpenMode,\n} from '../../features/webbuilder/codeFiles';\nimport type { SandboxRun } from './webbuilderTransport';\n\nconst LIST_TIMEOUT_MS = 90_000;\nconst FILE_TIMEOUT_MS = 60_000;\n\n/** The connector's own output (its `data`, or `data.data`). */\nfunction dataOf(result: { data?: unknown } | null | undefined): Record<string, unknown> {\n const raw = result?.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\n/** A command's printed output, wherever this connector version put it. */\nfunction stdoutOf(d: Record<string, unknown>): string {\n const nested = [d, d.data, d.result, d.output].filter(\n (v): v is Record<string, unknown> => Boolean(v) && typeof v === 'object',\n );\n for (const rec of nested) {\n if (typeof rec.stdout === 'string') return rec.stdout;\n if (typeof rec.output === 'string') return rec.output;\n }\n return '';\n}\n\nexport interface CodeTarget {\n sandboxId: string | null;\n /** The backup repo to read when the sandbox is gone; null when none is known. */\n savedSource: FromRepo | null;\n}\n\nexport interface TreeResult {\n ok: boolean;\n tree?: FileTree;\n /** Read from the backup repo: the whole view is read-only. */\n saved?: boolean;\n /** The sandbox is asleep or gone and there is no saved code: waking it brings the files. */\n asleep?: boolean;\n error?: string;\n}\n\nexport interface ReadResult {\n ok: boolean;\n content?: string;\n mode?: OpenMode;\n saved?: boolean;\n error?: string;\n}\n\nexport interface SaveResult {\n ok: boolean;\n /** The file changed on disk since it was opened: this is what is there now. */\n conflict?: boolean;\n disk?: string;\n /** Nothing to write (no change, or the disk already holds the draft). */\n unchanged?: boolean;\n summary?: string;\n error?: string;\n}\n\nexport function createCodeWorkspace(call: SandboxRun, onHandEdit: (edit: { file: string; summary: string }) => void) {\n const run = (action: string, params: Record<string, unknown>, timeoutMs: number) =>\n call(action, params, timeoutMs).catch((err: unknown) => ({\n successful: false,\n data: undefined as unknown,\n error: err instanceof Error ? err.message : String(err),\n }));\n\n const listSaved = async (target: CodeTarget): Promise<TreeResult> => {\n if (!target.savedSource) {\n return {\n ok: false,\n asleep: true,\n error: \"The site is asleep, so its files can't be read. Wake it to see them.\",\n };\n }\n const r = await run(\n 'WEBBUILDER_LIST_FILES',\n { ...(target.sandboxId ? { sandbox_id: target.sandboxId } : {}), fromRepo: target.savedSource },\n LIST_TIMEOUT_MS,\n );\n const tree = r.successful ? parseListFilesResult(dataOf(r)) : null;\n return tree\n ? { ok: true, tree, saved: true }\n : { ok: false, error: \"Couldn't load the saved code. Wake the site to see its files.\" };\n };\n\n const listFiles = async (target: CodeTarget): Promise<TreeResult> => {\n if (!target.sandboxId) return listSaved(target);\n // The project proxy's own listing: from the live sandbox, or - carrying `fromRepo` -\n // from the backup repo when the sandbox is gone (`source: 'repo'`, read-only).\n const listed = await run(\n 'WEBBUILDER_LIST_FILES',\n { sandbox_id: target.sandboxId, ...(target.savedSource ? { fromRepo: target.savedSource } : {}) },\n LIST_TIMEOUT_MS,\n );\n const listedData = dataOf(listed);\n const listedTree = listed.successful ? parseListFilesResult(listedData) : null;\n if (listedTree) {\n const fromRepo = listedData.source === 'repo' || isSavedCodeRead(listedData);\n return { ok: true, tree: listedTree, saved: fromRepo };\n }\n // An older connector without LIST_FILES on a live sandbox: the shell listing.\n const r = await run(\n 'WEBBUILDER_RUN_COMMAND',\n { sandbox_id: target.sandboxId, command: buildListFilesCommand() },\n LIST_TIMEOUT_MS,\n );\n const d = dataOf(r);\n const tree = r.successful ? parseListFilesOutput(stdoutOf(d), { truncated: d.truncated === true }) : null;\n if (tree) return { ok: true, tree, saved: false };\n if (typeof __DEV__ !== 'undefined' && __DEV__) {\n // eslint-disable-next-line no-console\n console.warn('[WebBuilderNative] code list', {\n sandboxId: target.sandboxId,\n listFiles: { error: listed.error, data: listedData },\n runCommand: { error: r.error, data: d },\n });\n }\n // Only a failed call's own error says the sandbox is gone (web `loadFileTree`); the\n // command's output is not read for it (its numbers and logs matched \"502\" / \"timed out\").\n if (!r.successful && (isSandboxUnavailableError(r.error) || isSandboxUnavailableError(listed.error))) {\n return listSaved(target);\n }\n if (r.successful) {\n const stderr = typeof d.stderr === 'string' ? d.stderr.trim().split('\\n')[0] : '';\n return { ok: false, error: `Couldn't read the file list${stderr ? `: ${stderr.slice(0, 160)}` : '.'}` };\n }\n return { ok: false, error: r.error || 'Could not list the project files.' };\n };\n\n const readFile = async (target: CodeTarget, path: string, saved: boolean): Promise<ReadResult> => {\n const params = {\n ...(target.sandboxId ? { sandbox_id: target.sandboxId } : {}),\n path,\n maxBytes: READ_FILE_MAX_BYTES,\n ...(target.savedSource ? { fromRepo: target.savedSource } : {}),\n };\n const r = await run('WEBBUILDER_READ_FILE', params, FILE_TIMEOUT_MS);\n if (!r.successful) return { ok: false, error: r.error || 'Could not read the file.' };\n const d = dataOf(r);\n const fromBackup = saved || isSavedCodeRead(d);\n return {\n ok: true,\n content: typeof d.content === 'string' ? d.content : undefined,\n mode: openModeFor(path, d),\n saved: fromBackup,\n };\n };\n\n /** Save `draft` over `base` (what was opened); `force` overwrites a file changed meanwhile. */\n const saveFile = async (\n target: CodeTarget,\n path: string,\n base: string,\n draft: string,\n force = false,\n ): Promise<SaveResult> => {\n if (!target.sandboxId) return { ok: false, error: 'Wake the site to save changes.' };\n if (!force) {\n const now = await readFile(target, path, false);\n if (now.ok && now.saved) return { ok: false, error: 'The site is asleep. Wake it to save changes.' };\n const disk = now.ok ? (now.content ?? null) : null;\n const decision = decideSave(base, disk, draft);\n if (decision === 'unchanged') return { ok: true, unchanged: true };\n if (decision === 'conflict') return { ok: false, conflict: true, disk: disk ?? '' };\n }\n const r = await run(\n 'WEBBUILDER_WRITE_FILES',\n { sandbox_id: target.sandboxId, files: [{ path, content: draft }] },\n FILE_TIMEOUT_MS,\n );\n if (!r.successful) return { ok: false, error: r.error || 'Could not save the file.' };\n const summary = codeEditSummary(base, draft);\n onHandEdit({ file: path, summary });\n return { ok: true, summary };\n };\n\n /** Project-wide search on a live sandbox, else the files already open (`openDocs`). */\n const search = async (\n target: CodeTarget,\n query: string,\n live: boolean,\n openDocs: Record<string, string>,\n ): Promise<{ result: ContentSearchResult; source: 'project' | 'open-files' }> => {\n const inMemory = () => ({ result: searchDocs(openDocs, query), source: 'open-files' as const });\n if (!live || !target.sandboxId) return inMemory();\n let command: string;\n try {\n command = buildSearchCommand(query);\n } catch {\n return inMemory();\n }\n const r = await run('WEBBUILDER_RUN_COMMAND', { sandbox_id: target.sandboxId, command }, LIST_TIMEOUT_MS);\n const d = dataOf(r);\n const parsed = r.successful\n ? parseSearchOutput(stdoutOf(d), query, {\n truncated: d.truncated === true,\n })\n : null;\n return parsed ? { result: parsed, source: 'project' } : inMemory();\n };\n\n return { listFiles, readFile, saveFile, search };\n}\n\nexport type CodeWorkspace = ReturnType<typeof createCodeWorkspace>;\n"],"names":[],"mappings":"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"}
|
|
@@ -73,7 +73,7 @@ function WebBuilderNativeScreen() {
|
|
|
73
73
|
/* @__PURE__ */ jsx(Text, { style: [styles.detail, isDark && styles.textMuted], children: "This build does not carry the federation host runtime." })
|
|
74
74
|
] }) });
|
|
75
75
|
}
|
|
76
|
-
return /* @__PURE__ */ jsx(SafeAreaView, { style: [styles.fill, isDark && styles.fillDark], edges: ["left", "right"], children: /* @__PURE__ */ jsx(Experience, { isDark, onExit, projects: host.projects, projectsLoading: host.projectsLoading, projectsError: host.projectsError, onRefreshProjects: host.refreshProjects, projectsHasMore: host.projectsHasMore, onLoadMoreProjects: host.loadMoreProjects, templates: host.templates, templatesLoading: host.templatesLoading, templatesError: host.templatesError, onReloadTemplates: host.reloadTemplates, startBlocked: host.startBlocked, startNotice: host.startNotice, activeChannelId: host.activeChannelId, onOpenProject: host.openProject, onCloseProject: host.closeProject, onStartProject: host.startProject, builds: host.builds, buildsLoading: host.buildsLoading, building: host.building, publishing: host.publishing, hostChat: host.hostChat, onPublish: host.publish, onResumePreview: host.resumePreview, onUndo: host.undo, onRedo: host.redo, onDownloadCode: host.downloadCode, onOpenCodezen, initialAgentSeed: seed }) });
|
|
76
|
+
return /* @__PURE__ */ jsx(SafeAreaView, { style: [styles.fill, isDark && styles.fillDark], edges: ["left", "right"], children: /* @__PURE__ */ jsx(Experience, { isDark, onExit, projects: host.projects, projectsLoading: host.projectsLoading, projectsError: host.projectsError, onRefreshProjects: host.refreshProjects, projectsHasMore: host.projectsHasMore, onLoadMoreProjects: host.loadMoreProjects, templates: host.templates, templatesLoading: host.templatesLoading, templatesError: host.templatesError, onReloadTemplates: host.reloadTemplates, startBlocked: host.startBlocked, startNotice: host.startNotice, activeChannelId: host.activeChannelId, onOpenProject: host.openProject, onCloseProject: host.closeProject, onStartProject: host.startProject, builds: host.builds, buildsLoading: host.buildsLoading, building: host.building, publishing: host.publishing, hostChat: host.hostChat, onPublish: host.publish, onResumePreview: host.resumePreview, onUndo: host.undo, onRedo: host.redo, onDownloadCode: host.downloadCode, code: host.code, onOpenCodezen, initialAgentSeed: seed }) });
|
|
77
77
|
}
|
|
78
78
|
const styles = StyleSheet.create({
|
|
79
79
|
fill: {
|
|
@@ -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; 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';\nimport { config } from '../../config/env-config';\nimport { MOBILE_APP_CATALOG } from '../../features/apps/mobileAppCatalog';\nimport { resolveSurfaceUrl } from '../../features/apps/resolveSurfaceUrl';\nimport { CODEZEN_DEV_URL } from '../../features/webbuilder/codezenHandoff';\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 // \"Demo video\" (web 0.5.0): the Codezen surface, in the app's surface shell, with the handoff fragment.\n const onOpenCodezen = useCallback(\n (fragment: string) => {\n const tile = MOBILE_APP_CATALOG.find((app) => app.key === 'codezen');\n const base = (tile && resolveSurfaceUrl(tile, config)) || CODEZEN_DEV_URL;\n navigation.navigate('MainStack.WebBuilder', {\n url: `${base.split('#')[0]}#${fragment}`,\n appTitle: tile?.label ?? 'Codezen',\n ...(routeOrg ? { orgName: routeOrg } : {}),\n });\n },\n [navigation, routeOrg],\n );\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 onUndo={host.undo}\n onRedo={host.redo}\n onDownloadCode={host.downloadCode}\n onOpenCodezen={onOpenCodezen}\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
|
+
{"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';\nimport { config } from '../../config/env-config';\nimport { MOBILE_APP_CATALOG } from '../../features/apps/mobileAppCatalog';\nimport { resolveSurfaceUrl } from '../../features/apps/resolveSurfaceUrl';\nimport { CODEZEN_DEV_URL } from '../../features/webbuilder/codezenHandoff';\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 // \"Demo video\" (web 0.5.0): the Codezen surface, in the app's surface shell, with the handoff fragment.\n const onOpenCodezen = useCallback(\n (fragment: string) => {\n const tile = MOBILE_APP_CATALOG.find((app) => app.key === 'codezen');\n const base = (tile && resolveSurfaceUrl(tile, config)) || CODEZEN_DEV_URL;\n navigation.navigate('MainStack.WebBuilder', {\n url: `${base.split('#')[0]}#${fragment}`,\n appTitle: tile?.label ?? 'Codezen',\n ...(routeOrg ? { orgName: routeOrg } : {}),\n });\n },\n [navigation, routeOrg],\n );\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 onUndo={host.undo}\n onRedo={host.redo}\n onDownloadCode={host.downloadCode}\n code={host.code}\n onOpenCodezen={onOpenCodezen}\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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"}
|