@adminide-stack/yantra-mobile 12.0.108 → 12.0.109

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.
Files changed (82) hide show
  1. package/lib/compute.js +57 -1
  2. package/lib/compute.js.map +1 -1
  3. package/lib/config/env-config.js +8 -0
  4. package/lib/config/env-config.js.map +1 -1
  5. package/lib/features/apps/AppsCatalog.js +10 -0
  6. package/lib/features/apps/AppsCatalog.js.map +1 -1
  7. package/lib/features/apps/appArt.js +2 -1
  8. package/lib/features/apps/appArt.js.map +1 -1
  9. package/lib/features/apps/mobileAppCatalog.js +11 -0
  10. package/lib/features/apps/mobileAppCatalog.js.map +1 -1
  11. package/lib/features/apps/nativeAppHandoff.js +2 -1
  12. package/lib/features/apps/nativeAppHandoff.js.map +1 -1
  13. package/lib/features/health/healthSyncStore.js +7 -1
  14. package/lib/features/health/healthSyncStore.js.map +1 -1
  15. package/lib/features/messaging/useChatViewer.js +3 -2
  16. package/lib/features/messaging/useChatViewer.js.map +1 -1
  17. package/lib/features/webbuilder/WebBuilderExperience.js +474 -0
  18. package/lib/features/webbuilder/WebBuilderExperience.js.map +1 -0
  19. package/lib/features/webbuilder/brandKitStorage.js +69 -0
  20. package/lib/features/webbuilder/brandKitStorage.js.map +1 -0
  21. package/lib/features/webbuilder/buildFragments.js +360 -0
  22. package/lib/features/webbuilder/buildFragments.js.map +1 -0
  23. package/lib/features/webbuilder/components/BottomTabs.js +65 -0
  24. package/lib/features/webbuilder/components/BottomTabs.js.map +1 -0
  25. package/lib/features/webbuilder/components/BrandKitSheet.js +197 -0
  26. package/lib/features/webbuilder/components/BrandKitSheet.js.map +1 -0
  27. package/lib/features/webbuilder/components/CodeView.js +99 -0
  28. package/lib/features/webbuilder/components/CodeView.js.map +1 -0
  29. package/lib/features/webbuilder/components/Composer.js +217 -0
  30. package/lib/features/webbuilder/components/Composer.js.map +1 -0
  31. package/lib/features/webbuilder/components/PreviewFrame.js +72 -0
  32. package/lib/features/webbuilder/components/PreviewFrame.js.map +1 -0
  33. package/lib/features/webbuilder/components/PreviewPlaceholder.js +107 -0
  34. package/lib/features/webbuilder/components/PreviewPlaceholder.js.map +1 -0
  35. package/lib/features/webbuilder/components/PreviewScreen.js +200 -0
  36. package/lib/features/webbuilder/components/PreviewScreen.js.map +1 -0
  37. package/lib/features/webbuilder/components/ProjectChat.js +580 -0
  38. package/lib/features/webbuilder/components/ProjectChat.js.map +1 -0
  39. package/lib/features/webbuilder/components/ProjectsScreen.js +339 -0
  40. package/lib/features/webbuilder/components/ProjectsScreen.js.map +1 -0
  41. package/lib/features/webbuilder/components/PublishSheet.js +143 -0
  42. package/lib/features/webbuilder/components/PublishSheet.js.map +1 -0
  43. package/lib/features/webbuilder/components/SiteScoreSheet.js +73 -0
  44. package/lib/features/webbuilder/components/SiteScoreSheet.js.map +1 -0
  45. package/lib/features/webbuilder/components/StudioHome.js +367 -0
  46. package/lib/features/webbuilder/components/StudioHome.js.map +1 -0
  47. package/lib/features/webbuilder/components/TemplateCard.js +73 -0
  48. package/lib/features/webbuilder/components/TemplateCard.js.map +1 -0
  49. package/lib/features/webbuilder/components/TemplatesSheet.js +178 -0
  50. package/lib/features/webbuilder/components/TemplatesSheet.js.map +1 -0
  51. package/lib/features/webbuilder/components/VersionsSheet.js +57 -0
  52. package/lib/features/webbuilder/components/VersionsSheet.js.map +1 -0
  53. package/lib/features/webbuilder/components/ui.js +291 -0
  54. package/lib/features/webbuilder/components/ui.js.map +1 -0
  55. package/lib/features/webbuilder/nativeWebBuilderRegistry.js +15 -0
  56. package/lib/features/webbuilder/nativeWebBuilderRegistry.js.map +1 -0
  57. package/lib/features/webbuilder/studioCatalog.js +147 -0
  58. package/lib/features/webbuilder/studioCatalog.js.map +1 -0
  59. package/lib/features/webbuilder/webbuilderPrompts.js +42 -0
  60. package/lib/features/webbuilder/webbuilderPrompts.js.map +1 -0
  61. package/lib/features/webbuilder/webbuilderTheme.js +63 -0
  62. package/lib/features/webbuilder/webbuilderTheme.js.map +1 -0
  63. package/lib/features/webbuilder/workflow.js +540 -0
  64. package/lib/features/webbuilder/workflow.js.map +1 -0
  65. package/lib/hooks/useChatApi.js +7 -2
  66. package/lib/hooks/useChatApi.js.map +1 -1
  67. package/lib/hooks/useChatStream.js +1 -1
  68. package/lib/hooks/useChatStream.js.map +1 -1
  69. package/lib/index.js +1 -1
  70. package/lib/index.js.map +1 -1
  71. package/lib/routes.json +106 -0
  72. package/lib/screens/WebBuilderNative/index.js +71 -0
  73. package/lib/screens/WebBuilderNative/index.js.map +1 -0
  74. package/lib/screens/WebBuilderNative/useCodeAssistantCatalog.js +45 -0
  75. package/lib/screens/WebBuilderNative/useCodeAssistantCatalog.js.map +1 -0
  76. package/lib/screens/WebBuilderNative/useWebBuilderGallery.js +125 -0
  77. package/lib/screens/WebBuilderNative/useWebBuilderGallery.js.map +1 -0
  78. package/lib/screens/WebBuilderNative/useWebBuilderHost.js +408 -0
  79. package/lib/screens/WebBuilderNative/useWebBuilderHost.js.map +1 -0
  80. package/lib/screens/WebBuilderNative/webbuilderTransport.js +88 -0
  81. package/lib/screens/WebBuilderNative/webbuilderTransport.js.map +1 -0
  82. package/package.json +4 -4
@@ -1 +1 @@
1
- {"version":3,"file":"useChatStream.js","sources":["../../src/hooks/useChatStream.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState, useSyncExternalStore } from 'react';\nimport { Platform } from 'react-native';\nimport {\n useCreateAccountChatFileDownloadLinksMutation,\n useCreateAccountChatFileUploadLinksMutation,\n} from 'common/graphql';\nimport {\n clearChannelHistoryRunning,\n markChannelHistoryRunning,\n patchChannelHistoryPreview,\n useChatMutations,\n useChatMessages,\n} from './useChatApi';\nimport { useCdecliChannel } from './useCdecliChannel';\nimport { usePrerequisiteIds } from './usePrerequisiteIds';\nimport { isAgentJwtRejected, shouldInlineGatewayMediaForHostedAgent } from './systemTokenJwt';\nimport { config } from '../config';\nimport {\n MAX_QUEUED_MESSAGES,\n clearQueuedGatewayMessages,\n dropQueuedGatewayMessage,\n queueGatewayMessage,\n queuedGatewayMessages,\n restoreQueuedGatewayMessages,\n subscribeQueuedGatewayMessages,\n} from '../services/queuedGatewayMessages';\nimport { isImageAttachment } from '../features/attachments/isImageAttachment';\nimport { buildGatewayMedia, buildGatewayMediaPreferUrls } from '../features/attachments/buildGatewayMedia';\nimport { preserveAttachmentPreviews } from '../features/attachments/preserveAttachmentPreviews';\nimport { releasePreviewBytes } from '../features/attachments/releasePreviewBytes';\nimport { resolveAssistantReply } from '../features/chat/emptyChatResponse';\nimport { splitPreResponse } from '../features/chat/preResponse';\nimport {\n appendFollowUpAssistant,\n appendOrReplaceAssistant,\n collapseConsecutiveAssistants,\n mergeOptimisticGatewayMessages,\n} from '../state/chatThreadMerge';\n\n// Each flush re-parses the whole reply as markdown. Mid-range Android CPUs\n// drop frames at 20 flushes/s; 10/s still reads as live typing.\nconst STREAM_FLUSH_MS = Platform.OS === 'android' ? 100 : 50;\n\n/** Agent returned an error while the cdecli-serve channel stayed connected (e.g. bad LLM API key). */\nfunction isCdecliAgentFailureOutput(text: string): boolean {\n const t = text.trim();\n if (!t) return false;\n return (\n /⚠\\s*Error:/.test(t) ||\n /LLM stream error/i.test(t) ||\n /Incorrect API key/i.test(t) ||\n /invalid_api_key/i.test(t) ||\n /authentication_error/i.test(t) ||\n isAgentJwtRejected(t)\n );\n}\n\nexport interface MessageAttachment {\n id: string;\n name: string;\n type: 'file' | 'screenshot';\n dataUrl?: string;\n mimeType?: string;\n size?: number;\n url?: string;\n}\n\nexport interface ChatMessage {\n role: 'user' | 'assistant';\n content: string;\n attachments?: MessageAttachment[];\n metadata?: {\n tokenUsage?: { inputTokens: number; outputTokens: number; totalTokens: number };\n model?: string;\n };\n}\n\n/** The queued row renders this turn now, so the optimistic bubble must not stay behind it. */\nfunction withoutTrailingUserMessage(prev: ChatMessage[], text: string): ChatMessage[] {\n const last = prev[prev.length - 1];\n return last?.role === 'user' && last.content === text ? prev.slice(0, -1) : prev;\n}\n\n/** A message the gateway queued for the agent while a turn was running. */\nexport interface QueuedFollowUp {\n /** The gateway's id for it - what cancels it. */\n id: string;\n text: string;\n attachments?: MessageAttachment[];\n}\n\n/** What became of a send: delivered to the gateway, parked in the outbox, or refused outright. */\nexport type SendOutcome = 'sent' | 'queued' | 'failed';\n\nfunction formatBackendThread(\n backendMessages: Array<{\n role: string;\n content?: string;\n // The generated `ChatMessageUI` types `type` as a plain string; it is narrowed\n // to the UI union in the map below, so take it wide rather than cast at the call.\n attachments?: Array<{ id: string; name: string; type: string; mimeType?: string; size?: number; url?: string }>;\n tokenCount?: number;\n model?: string;\n }>,\n): ChatMessage[] {\n return collapseConsecutiveAssistants(\n backendMessages.map((msg) => ({\n role: msg.role as 'user' | 'assistant',\n content: msg.content ?? '',\n attachments: msg.attachments?.map((a) => ({\n id: a.id,\n name: a.name,\n type: a.type === 'screenshot' ? 'screenshot' : 'file',\n mimeType: a.mimeType,\n size: a.size,\n url: a.url,\n })),\n metadata: msg.tokenCount\n ? {\n tokenUsage: {\n inputTokens: 0,\n outputTokens: msg.tokenCount,\n totalTokens: msg.tokenCount,\n },\n model: msg.model,\n }\n : undefined,\n })),\n );\n}\n\n/** Mobile chat routes exclusively through CDeCLI (messenger-gateway). */\nexport interface UseChatStreamRouting {\n channelConnected: boolean;\n accountId: string;\n /** When `'backend'`, the gateway persists posts — skip client `saveMessages`. */\n persistenceMode?: 'backend' | 'frontend';\n /** Remint the system JWT and reconnect after cdecli-agent 401s the session. */\n recoverAgentAuth?: () => Promise<boolean>;\n}\n\nexport function useChatStream(\n sessionId: string | null,\n routing: UseChatStreamRouting = {\n channelConnected: false,\n accountId: 'default',\n persistenceMode: 'backend',\n },\n) {\n const [messages, setMessages] = useState<ChatMessage[]>([]);\n const [response, setResponse] = useState('');\n /** Brain assist — never the published agent stream. Shown as a Quick answer strip. */\n const [quickReply, setQuickReply] = useState('');\n const [isLoading, setIsLoading] = useState(false);\n const [isStreaming, setIsStreaming] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const isSendingRef = useRef(false);\n /**\n * Messages sent while a turn was running, which the gateway queued for the\n * agent. Shown above the composer until the agent starts on them (the way\n * Claude Code shows a message typed mid-turn), then moved into the thread.\n * Kept out of `messages` so a backend hydration cannot drop or double them.\n */\n const [queuedFollowUps, setQueuedFollowUps] = useState<QueuedFollowUp[]>([]);\n const queuedFollowUpsRef = useRef<QueuedFollowUp[]>([]);\n const sendMessageRef = useRef<\n (\n content: string,\n attachments?: MessageAttachment[],\n sessionIdOverride?: string | null,\n alreadyVisible?: boolean,\n queuedId?: string,\n ) => Promise<SendOutcome>\n >(async () => 'failed');\n\n /** Ensures GraphQL stream subscriptions use the id from createChannel+send before the next parent render. */\n const [cdecliStreamOverrideId, setCdecliStreamOverrideId] = useState<string | undefined>(undefined);\n const userMsgForSaveRef = useRef<ChatMessage | null>(null);\n const saveSessionIdRef = useRef<string | null>(null);\n const sessionIdRef = useRef<string | null>(sessionId);\n sessionIdRef.current = sessionId || cdecliStreamOverrideId || null;\n /** Blocks duplicate cdecli `onComplete` from appending assistant twice / saving twice per send. */\n const cdecliRoundHandledRef = useRef(false);\n /**\n * The round in flight was opened by the agent, not by a send: a follow-up,\n * e.g. the answer to a request the gateway queued while the agent was busy.\n * It completes as a new bubble instead of replacing the reply before it.\n */\n const followUpRoundRef = useRef(false);\n /** One remint+resend per turn when cdecli-agent 401s the JWT. */\n const authRetryUsedRef = useRef(false);\n const recoveringAuthRef = useRef(false);\n const routingRef = useRef(routing);\n routingRef.current = routing;\n\n const tryRecoverAndResendRef = useRef<(reason: string) => Promise<boolean>>(async () => false);\n\n /** Coalesce token deltas so Fabric is not committing a native tree every chunk. */\n const pendingStreamRef = useRef('');\n const streamFlushTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const clearPendingStream = useCallback(() => {\n if (streamFlushTimerRef.current != null) {\n clearTimeout(streamFlushTimerRef.current);\n streamFlushTimerRef.current = null;\n }\n pendingStreamRef.current = '';\n }, []);\n\n const flushPendingStream = useCallback(() => {\n streamFlushTimerRef.current = null;\n const pending = pendingStreamRef.current;\n if (!pending) return;\n pendingStreamRef.current = '';\n setResponse((r) => {\n const next = r + pending;\n const sid = sessionIdRef.current;\n if (sid) markChannelHistoryRunning(sid, next);\n return next;\n });\n }, []);\n\n useEffect(() => () => clearPendingStream(), [clearPendingStream]);\n\n const { saveMessages, patchChannelTitle } = useChatMutations();\n const titlePatchedChannelsRef = useRef(new Set<string>());\n const { accountUserId } = usePrerequisiteIds();\n const [createAccountChatFileUploadLinksMutation] = useCreateAccountChatFileUploadLinksMutation();\n const [createAccountChatFileDownloadLinksMutation] = useCreateAccountChatFileDownloadLinksMutation();\n const {\n messages: backendMessages,\n loading: backendMessagesLoading,\n messagesLoaded: backendMessagesLoaded,\n } = useChatMessages(sessionId);\n const lastHydratedSessionIdRef = useRef<string | null>(null);\n /** Trash-clear: do not re-hydrate gateway history until the next send. */\n const ignoreHydrationRef = useRef(false);\n\n const streamChannelId = sessionId || cdecliStreamOverrideId;\n\n const finalizeCdecliRound = useCallback(\n (assistantContent?: string) => {\n const previewSid = saveSessionIdRef.current || sessionIdRef.current;\n clearPendingStream();\n saveSessionIdRef.current = null;\n userMsgForSaveRef.current = null;\n followUpRoundRef.current = false;\n setResponse('');\n setQuickReply('');\n setIsLoading(false);\n setIsStreaming(false);\n isSendingRef.current = false;\n if (previewSid) clearChannelHistoryRunning(previewSid);\n if (assistantContent !== undefined) {\n setMessages((prev) =>\n appendOrReplaceAssistant(prev, { role: 'assistant' as const, content: assistantContent }),\n );\n if (previewSid) patchChannelHistoryPreview(previewSid, assistantContent);\n }\n },\n [clearPendingStream],\n );\n\n const cdecliCallbacks = useMemo(\n () => ({\n onChunk: (text: string) => {\n if (!isSendingRef.current) {\n // No send opened this round: the agent is speaking on its own.\n isSendingRef.current = true;\n followUpRoundRef.current = true;\n cdecliRoundHandledRef.current = false;\n saveSessionIdRef.current = sessionIdRef.current;\n setIsLoading(true);\n setIsStreaming(true);\n setError(null);\n const sid = sessionIdRef.current;\n if (sid) markChannelHistoryRunning(sid, text);\n // The agent has started on what was queued: those messages\n // join the thread now, above the answer they are getting.\n const started = queuedFollowUpsRef.current;\n if (started.length > 0) {\n queuedFollowUpsRef.current = [];\n setQueuedFollowUps([]);\n setMessages((prev) => [\n ...prev,\n ...started.map((q) => ({\n role: 'user' as const,\n content: q.text,\n attachments: q.attachments,\n })),\n ]);\n }\n }\n pendingStreamRef.current += text;\n if (streamFlushTimerRef.current == null) {\n streamFlushTimerRef.current = setTimeout(flushPendingStream, STREAM_FLUSH_MS);\n }\n },\n // The brain's provisional answer is the WHOLE reply-so-far, not a chunk:\n // it is set outright, and set to '' when the real stream supersedes it.\n onQuickReply: (text: string) => {\n setQuickReply(text);\n },\n // The gateway's own words on the running work (a status answer, a\n // long-wait report) arrive as thread posts through hydration; the\n // callback only keeps them from ending the reply in progress.\n onNotice: () => undefined,\n onStreamRestart: () => {\n clearPendingStream();\n pendingStreamRef.current = '';\n setResponse('');\n },\n onComplete: (text: string) => {\n clearPendingStream();\n if (cdecliRoundHandledRef.current) {\n return;\n }\n\n // Judge the agent's own words: a quick answer in front of them is\n // not the agent failing, and never belongs in the error banner.\n const agentText = splitPreResponse(text).text;\n if (isCdecliAgentFailureOutput(agentText)) {\n void (async () => {\n if (await tryRecoverAndResendRef.current(agentText)) return;\n if (cdecliRoundHandledRef.current) return;\n cdecliRoundHandledRef.current = true;\n setError(\n isAgentJwtRejected(agentText)\n ? agentText\n : 'CDeCLI agent error. Check gateway status and server-side LLM configuration.',\n );\n finalizeCdecliRound(isAgentJwtRejected(agentText) ? undefined : text);\n })();\n return;\n }\n\n cdecliRoundHandledRef.current = true;\n authRetryUsedRef.current = false;\n\n const reply = resolveAssistantReply(text);\n const sid = saveSessionIdRef.current;\n const um = userMsgForSaveRef.current;\n const followUp = followUpRoundRef.current;\n saveSessionIdRef.current = null;\n userMsgForSaveRef.current = null;\n followUpRoundRef.current = false;\n\n const assistant = { role: 'assistant' as const, content: reply };\n setMessages((prev) =>\n followUp ? appendFollowUpAssistant(prev, assistant) : appendOrReplaceAssistant(prev, assistant),\n );\n const previewSid = sid || sessionIdRef.current;\n if (previewSid) {\n clearChannelHistoryRunning(previewSid);\n patchChannelHistoryPreview(previewSid, reply);\n }\n setResponse('');\n setQuickReply('');\n setIsLoading(false);\n setIsStreaming(false);\n isSendingRef.current = false;\n\n const rt = routingRef.current;\n const persistClientSide = rt.persistenceMode !== 'backend';\n\n if (sid && um && persistClientSide) {\n saveMessages({\n sessionId: sid,\n ...(accountUserId ? { createdBy: accountUserId } : {}),\n userMessage: {\n content: um.content,\n attachments: um.attachments?.map((a) => ({\n id: a.id,\n name: a.name,\n type: a.type,\n mimeType: a.mimeType,\n size: a.size,\n url: a.url,\n })),\n },\n assistantMessage: {\n content: reply,\n tokenCount: undefined,\n model: 'cdecli-serve',\n },\n }).catch((e) => {\n console.error('[useChatStream] saveMessages (cdecli):', e);\n });\n }\n },\n onError: (err: string) => {\n if (cdecliRoundHandledRef.current) return;\n void (async () => {\n if (await tryRecoverAndResendRef.current(err)) return;\n if (cdecliRoundHandledRef.current) return;\n cdecliRoundHandledRef.current = true;\n setError(err || 'CDeCLI stream error.');\n finalizeCdecliRound(resolveAssistantReply(''));\n })();\n },\n }),\n [saveMessages, accountUserId, finalizeCdecliRound, flushPendingStream, clearPendingStream],\n );\n\n const {\n sendMessage: sendCdecliMessage,\n sendQueued: sendQueuedCdecli,\n cancelQueued: cancelQueuedCdecli,\n cancel: cancelCdecliTurn,\n } = useCdecliChannel(routing.channelConnected, routing.accountId, streamChannelId, cdecliCallbacks);\n\n const setQueue = useCallback((next: QueuedFollowUp[]) => {\n queuedFollowUpsRef.current = next;\n setQueuedFollowUps(next);\n }, []);\n\n useEffect(() => {\n if (sessionId && cdecliStreamOverrideId && sessionId === cdecliStreamOverrideId) {\n setCdecliStreamOverrideId(undefined);\n }\n }, [sessionId, cdecliStreamOverrideId]);\n\n useEffect(() => {\n const prevSid = lastHydratedSessionIdRef.current;\n if (prevSid && sessionId && prevSid !== sessionId && isSendingRef.current) {\n // Switching threads: drop local send flags so this view can hydrate.\n // The previous channel's agent keeps running server-side; history still\n // shows it as running until that turn completes or we reopen it.\n clearPendingStream();\n setQueue([]);\n isSendingRef.current = false;\n followUpRoundRef.current = false;\n cdecliRoundHandledRef.current = false;\n saveSessionIdRef.current = null;\n userMsgForSaveRef.current = null;\n setIsLoading(false);\n setIsStreaming(false);\n setResponse('');\n setQuickReply('');\n }\n\n if (!sessionId) {\n setMessages([]);\n setResponse('');\n setQuickReply('');\n lastHydratedSessionIdRef.current = null;\n return;\n }\n\n const stampHistoryPreview = (msgs: ChatMessage[]) => {\n const last = msgs[msgs.length - 1];\n const lastAssistant = [...msgs].reverse().find((msg) => msg.role === 'assistant' && msg.content.trim());\n if (lastAssistant && !isSendingRef.current) {\n patchChannelHistoryPreview(sessionId, lastAssistant.content);\n }\n // Finished thread (last post is assistant) — drop the history \"Running\" badge.\n // A live turn ends with a user post until the assistant lands.\n if (!isSendingRef.current && last?.role === 'assistant') {\n clearChannelHistoryRunning(sessionId);\n }\n };\n\n if (ignoreHydrationRef.current) {\n return;\n }\n\n const keepStream = isSendingRef.current;\n const sessionChanged = lastHydratedSessionIdRef.current !== sessionId;\n if (sessionChanged) {\n lastHydratedSessionIdRef.current = sessionId;\n // Do not merge the previous channel's in-memory thread into this one.\n if (!backendMessagesLoaded) {\n if (!keepStream) {\n setMessages([]);\n setResponse('');\n setQuickReply('');\n }\n return;\n }\n const formatted = formatBackendThread(backendMessages ?? []);\n stampHistoryPreview(formatted);\n setMessages((prev) => (keepStream ? mergeOptimisticGatewayMessages(prev, formatted) : formatted));\n if (!keepStream) {\n setResponse('');\n setQuickReply('');\n }\n return;\n }\n\n if (backendMessagesLoaded) {\n const formatted = formatBackendThread(backendMessages ?? []);\n stampHistoryPreview(formatted);\n // Positional merge first so assistant replies the gateway never persisted\n // (cdecli skill turns emit no chatMessageAdded) survive this snapshot instead\n // of being dropped, then preserve in-memory attachment previews on the result.\n setMessages((prev) => preserveAttachmentPreviews(prev, mergeOptimisticGatewayMessages(prev, formatted)));\n if (!keepStream) {\n setResponse('');\n setQuickReply('');\n }\n }\n }, [sessionId, backendMessages, backendMessagesLoaded, clearPendingStream, setQueue]);\n\n const sendMessage = useCallback(\n async (\n content: string,\n attachments?: MessageAttachment[],\n sessionIdOverride?: string | null,\n alreadyVisible = false,\n /** Set when this send is the release of an outbox entry; it owns that entry's fate. */\n queuedId: string | undefined = undefined,\n ): Promise<SendOutcome> => {\n if (!content.trim() && !attachments?.length) return 'failed';\n\n const effectiveSessionId = sessionIdOverride !== undefined ? sessionIdOverride : sessionId;\n const rt = routingRef.current;\n const trimmed = content.trim();\n const sendText =\n trimmed ||\n (attachments?.length\n ? `Attached: ${attachments\n .map((a) => a.name)\n .filter(Boolean)\n .join(', ')}`\n : '');\n\n const userMessage: ChatMessage = {\n role: 'user',\n content: sendText,\n attachments,\n };\n\n /**\n * The gateway is down. The turn is remembered, not erased: it stays in the\n * thread as a queued bubble and the outbox releases it in order the moment\n * the channel reports connected. Losing what the user typed here is the\n * whole reason this lane exists.\n */\n if (!rt.channelConnected) {\n if (!effectiveSessionId) {\n setError('Missing chat session id.');\n return 'failed';\n }\n // A release that raced the connection dropping stays where it is.\n if (queuedId) return 'queued';\n const result = queueGatewayMessage({\n channelId: effectiveSessionId,\n accountId: rt.accountId,\n text: sendText,\n attachments,\n });\n if (!result.ok) {\n setError(\n result.reason === 'full'\n ? `${MAX_QUEUED_MESSAGES} messages are already waiting for the gateway. They send as soon as it connects.`\n : 'Nothing to send.',\n );\n return 'failed';\n }\n if (alreadyVisible) setMessages((prev) => withoutTrailingUserMessage(prev, sendText));\n setError(null);\n return 'queued';\n }\n\n /**\n * A turn is already in flight. The gateway queues the message for the\n * agent, which answers it when the running turn ends; the running reply\n * is left alone. It waits above the composer (cancellable) until the\n * agent starts on it. A status question is answered on the spot, and a\n * turn that had already ended takes the message straight away.\n */\n if (isSendingRef.current) {\n if (!effectiveSessionId) {\n setError('Missing chat session id.');\n return 'failed';\n }\n const media = attachments?.length ? buildGatewayMedia(attachments, { includeData: true }) : [];\n const outcome = await sendQueuedCdecli(sendText, effectiveSessionId, media);\n if (outcome.status === 'failed') {\n setError(outcome.error || 'Could not send the message. Try again.');\n return 'failed';\n }\n if (queuedId) dropQueuedGatewayMessage(queuedId);\n setError(null);\n if (outcome.status === 'queued') {\n setQueue([\n ...queuedFollowUpsRef.current,\n { id: outcome.id, text: sendText, attachments: releasePreviewBytes(attachments) },\n ]);\n if (alreadyVisible) setMessages((prev) => withoutTrailingUserMessage(prev, sendText));\n } else if (!alreadyVisible) {\n setMessages((prev) => [...prev, userMessage]);\n }\n return 'sent';\n }\n\n isSendingRef.current = true;\n followUpRoundRef.current = false;\n ignoreHydrationRef.current = false;\n if (effectiveSessionId && sendText) {\n titlePatchedChannelsRef.current.add(effectiveSessionId);\n patchChannelTitle(effectiveSessionId, sendText, true);\n markChannelHistoryRunning(effectiveSessionId);\n }\n if (!alreadyVisible) {\n // The transcript keeps this turn for the rest of the session, so it\n // keeps the preview URI and not the base64 behind it. The bytes stay\n // on `userMsgForSaveRef` below, which is nulled when the turn ends -\n // a retry still has them, a backgrounded app no longer carries them.\n const retained: ChatMessage = {\n ...userMessage,\n attachments: releasePreviewBytes(userMessage.attachments),\n };\n setMessages((prev) => [...prev, retained]);\n authRetryUsedRef.current = false;\n }\n setResponse('');\n setQuickReply('');\n setIsLoading(true);\n setIsStreaming(true);\n setError(null);\n userMsgForSaveRef.current = userMessage;\n saveSessionIdRef.current = effectiveSessionId ?? null;\n cdecliRoundHandledRef.current = false;\n\n if (!effectiveSessionId) {\n setError('Missing chat session id.');\n if (!alreadyVisible) setMessages((p) => p.slice(0, -1));\n isSendingRef.current = false;\n setIsLoading(false);\n setIsStreaming(false);\n userMsgForSaveRef.current = null;\n saveSessionIdRef.current = null;\n return 'failed';\n }\n\n if (sessionIdOverride) {\n setCdecliStreamOverrideId(sessionIdOverride);\n await new Promise<void>((resolve) => {\n setTimeout(resolve, 0);\n });\n }\n\n const inlineForHostedAgent = shouldInlineGatewayMediaForHostedAgent(\n config.GRAPHQL_URL,\n config.CDECLI_AGENT_ENDPOINT,\n );\n // Vision turns must carry inline bytes. URL-only media is what made\n // \"what is this\" + a photo look like a text-only question.\n const inlineImages = (attachments ?? []).some(isImageAttachment) || inlineForHostedAgent;\n let media = inlineImages\n ? buildGatewayMedia(attachments, { includeData: true })\n : await buildGatewayMediaPreferUrls(\n attachments,\n async (filenames) => {\n const result = await createAccountChatFileUploadLinksMutation({\n variables: { filenames },\n });\n return result.data?.createAccountChatFileUploadLinks || [];\n },\n async (urls) => {\n const result = await createAccountChatFileDownloadLinksMutation({\n variables: { urls },\n });\n return result.data?.createAccountChatFileDownloadLinks || [];\n },\n );\n if ((attachments?.length ?? 0) > 0 && media.length === 0) {\n media = buildGatewayMedia(attachments, { includeData: true });\n }\n const ok = await sendCdecliMessage(sendText, effectiveSessionId, media);\n if (!ok && !cdecliRoundHandledRef.current && !recoveringAuthRef.current) {\n cdecliRoundHandledRef.current = true;\n // The send never reached the agent. Park it rather than drop it - a\n // release keeps its place at the head of its own queue.\n const parked = queuedId\n ? { ok: true as const }\n : queueGatewayMessage({\n channelId: effectiveSessionId,\n accountId: rt.accountId,\n text: sendText,\n attachments,\n });\n setError(\n parked.ok\n ? 'Gateway unreachable - message queued. It sends as soon as the connection is back.'\n : 'Failed to send message via CDeCLI. Check gateway connection.',\n );\n // Queued: the queued row renders the turn, so the optimistic bubble goes.\n // Not queued: only drop a bubble this call put there.\n setMessages((p) => {\n if (parked.ok) return withoutTrailingUserMessage(p, sendText);\n return alreadyVisible ? p : p.slice(0, -1);\n });\n isSendingRef.current = false;\n setIsLoading(false);\n setIsStreaming(false);\n userMsgForSaveRef.current = null;\n saveSessionIdRef.current = null;\n clearChannelHistoryRunning(effectiveSessionId);\n return parked.ok ? 'queued' : 'failed';\n }\n if (ok && queuedId) dropQueuedGatewayMessage(queuedId);\n return ok ? 'sent' : 'failed';\n },\n [\n sessionId,\n sendCdecliMessage,\n patchChannelTitle,\n sendQueuedCdecli,\n setQueue,\n createAccountChatFileUploadLinksMutation,\n createAccountChatFileDownloadLinksMutation,\n ],\n );\n\n sendMessageRef.current = sendMessage;\n\n /* ---------------------------------------------------------------------- *\n * Outbox: turns typed while the gateway was down.\n * ---------------------------------------------------------------------- */\n\n const queuedChannelId = sessionId || cdecliStreamOverrideId || null;\n const queuedSnapshot = useCallback(\n () => queuedGatewayMessages(queuedChannelId, routing.accountId),\n [queuedChannelId, routing.accountId],\n );\n const queuedMessages = useSyncExternalStore(subscribeQueuedGatewayMessages, queuedSnapshot, queuedSnapshot);\n\n useEffect(() => {\n void restoreQueuedGatewayMessages();\n }, []);\n\n /** One release at a time; a send that fails leaves its entry at the head for the next reconnect. */\n const flushingRef = useRef(false);\n const flushQueuedMessages = useCallback(async () => {\n if (flushingRef.current) return;\n flushingRef.current = true;\n try {\n // Bounded: the outbox can never hand out more than its own depth.\n for (let i = 0; i <= MAX_QUEUED_MESSAGES; i += 1) {\n const rt = routingRef.current;\n const sid = sessionIdRef.current;\n if (!rt.channelConnected || !sid) return;\n const next = queuedGatewayMessages(sid, rt.accountId)[0];\n if (!next) return;\n const outcome = await sendMessageRef.current(\n next.text,\n next.attachments,\n next.channelId,\n false,\n next.id,\n );\n if (outcome !== 'sent') return;\n }\n } finally {\n flushingRef.current = false;\n }\n }, []);\n\n /**\n * Release on the disconnected→connected edge, and when a channel with a queue\n * is opened on an already-live gateway. Deliberately not keyed on queue depth:\n * a send that fails puts its turn back, and depth would spin that into a loop.\n */\n const wasConnectedRef = useRef(routing.channelConnected);\n useEffect(() => {\n const connected = routing.channelConnected;\n const reconnected = connected && !wasConnectedRef.current;\n wasConnectedRef.current = connected;\n if (!connected || !queuedChannelId) return;\n if (!reconnected && queuedGatewayMessages(queuedChannelId, routing.accountId).length === 0) return;\n void flushQueuedMessages();\n }, [routing.channelConnected, routing.accountId, queuedChannelId, flushQueuedMessages]);\n\n const discardQueuedMessages = useCallback(() => {\n if (!queuedChannelId) return;\n clearQueuedGatewayMessages(queuedChannelId);\n setError(null);\n }, [queuedChannelId]);\n\n tryRecoverAndResendRef.current = async (reason: string) => {\n if (authRetryUsedRef.current || cdecliRoundHandledRef.current) return false;\n if (!isAgentJwtRejected(reason)) return false;\n const recover = routingRef.current.recoverAgentAuth;\n if (!recover) return false;\n authRetryUsedRef.current = true;\n recoveringAuthRef.current = true;\n try {\n setError('Refreshing CDeCLI credentials…');\n const recovered = await recover();\n if (!recovered) return false;\n const um = userMsgForSaveRef.current;\n const sid = saveSessionIdRef.current;\n cdecliRoundHandledRef.current = false;\n isSendingRef.current = false;\n setIsLoading(false);\n setIsStreaming(false);\n setError(null);\n if (um && sid) {\n queueMicrotask(() => {\n void sendMessageRef.current(um.content, um.attachments, sid, true);\n });\n }\n return true;\n } catch (err) {\n console.error('[useChatStream] recoverAgentAuth failed:', err);\n return false;\n } finally {\n recoveringAuthRef.current = false;\n }\n };\n\n const cancel = useCallback(() => {\n clearPendingStream();\n const sid = saveSessionIdRef.current ?? sessionId;\n void cancelCdecliTurn(sid ?? 'messenger');\n if (!cdecliRoundHandledRef.current) {\n cdecliRoundHandledRef.current = true;\n finalizeCdecliRound(resolveAssistantReply(''));\n }\n }, [cancelCdecliTurn, finalizeCdecliRound, sessionId, clearPendingStream]);\n\n const clearMessages = useCallback(() => {\n clearPendingStream();\n const hadActiveTurn = isSendingRef.current;\n const sid = saveSessionIdRef.current ?? sessionId;\n isSendingRef.current = false;\n cdecliRoundHandledRef.current = true;\n saveSessionIdRef.current = null;\n userMsgForSaveRef.current = null;\n // Only hit /cancel when a turn was live — otherwise cdecli logs\n // \"Cannot cancel: no active session\" (Research greet + trash).\n if (hadActiveTurn) {\n void cancelCdecliTurn(sid ?? 'messenger');\n }\n ignoreHydrationRef.current = true;\n // Emptying the thread empties its outbox too: a queued turn released after\n // the user cleared the chat would answer a conversation they threw away.\n if (sid) clearQueuedGatewayMessages(sid);\n // ...and what the gateway queued for the agent.\n for (const queued of queuedFollowUpsRef.current) void cancelQueuedCdecli(queued.id, sid ?? 'messenger');\n setQueue([]);\n setMessages([]);\n setResponse('');\n setQuickReply('');\n setError(null);\n setIsLoading(false);\n setIsStreaming(false);\n if (sid) clearChannelHistoryRunning(sid);\n }, [cancelCdecliTurn, cancelQueuedCdecli, clearPendingStream, sessionId, setQueue]);\n\n /** Take one queued message back before the agent gets to it. Too late once\n * the agent started it: it then joins the thread with its answer. */\n const cancelQueuedFollowUp = useCallback(\n async (id: string) => {\n const sid = sessionIdRef.current;\n if (!sid) return;\n const result = await cancelQueuedCdecli(id, sid);\n if (result.ok) {\n setQueue(queuedFollowUpsRef.current.filter((q) => q.id !== id));\n } else {\n setError(result.error || 'Could not cancel that message.');\n }\n },\n [cancelQueuedCdecli, setQueue],\n );\n\n /** Stop the running reply so the agent takes the queued messages now. */\n const sendQueuedNow = useCallback(() => {\n if (isSendingRef.current) cancel();\n }, [cancel]);\n\n const messagesLoading = !!sessionId && backendMessagesLoading && !backendMessagesLoaded;\n\n return {\n messages,\n response,\n quickReply,\n error,\n isLoading,\n isStreaming,\n messagesLoading,\n hasMessages:\n messages.length > 0 ||\n !!response ||\n !!quickReply ||\n queuedMessages.length > 0 ||\n queuedFollowUps.length > 0,\n /** Turns waiting on the gateway, oldest first. Rendered as queued bubbles. */\n queuedMessages,\n /** Send the queue now (the notice's retry), independent of the reconnect edge. */\n flushQueuedMessages,\n discardQueuedMessages,\n /** Sent while the agent was busy and queued for it, oldest first. */\n queuedFollowUps,\n cancelQueuedFollowUp,\n sendQueuedNow,\n sendMessage,\n cancel,\n clearMessages,\n };\n}\n"],"names":["media","_a"],"mappings":"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"}
1
+ {"version":3,"file":"useChatStream.js","sources":["../../src/hooks/useChatStream.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState, useSyncExternalStore } from 'react';\nimport { Platform } from 'react-native';\nimport {\n useCreateAccountChatFileDownloadLinksMutation,\n useCreateAccountChatFileUploadLinksMutation,\n} from 'common/graphql';\nimport {\n clearChannelHistoryRunning,\n markChannelHistoryRunning,\n patchChannelHistoryPreview,\n useChatMutations,\n useChatMessages,\n} from './useChatApi';\nimport { useCdecliChannel } from './useCdecliChannel';\nimport { usePrerequisiteIds } from './usePrerequisiteIds';\nimport { isAgentJwtRejected, shouldInlineGatewayMediaForHostedAgent } from './systemTokenJwt';\nimport { config } from '../config';\nimport {\n MAX_QUEUED_MESSAGES,\n clearQueuedGatewayMessages,\n dropQueuedGatewayMessage,\n queueGatewayMessage,\n queuedGatewayMessages,\n restoreQueuedGatewayMessages,\n subscribeQueuedGatewayMessages,\n} from '../services/queuedGatewayMessages';\nimport { isImageAttachment } from '../features/attachments/isImageAttachment';\nimport { buildGatewayMedia, buildGatewayMediaPreferUrls } from '../features/attachments/buildGatewayMedia';\nimport { preserveAttachmentPreviews } from '../features/attachments/preserveAttachmentPreviews';\nimport { releasePreviewBytes } from '../features/attachments/releasePreviewBytes';\nimport { resolveAssistantReply } from '../features/chat/emptyChatResponse';\nimport { splitPreResponse } from '../features/chat/preResponse';\nimport {\n appendFollowUpAssistant,\n appendOrReplaceAssistant,\n collapseConsecutiveAssistants,\n mergeOptimisticGatewayMessages,\n} from '../state/chatThreadMerge';\n\n// Each flush re-parses the whole reply as markdown. Mid-range Android CPUs\n// drop frames at 20 flushes/s; 10/s still reads as live typing.\nconst STREAM_FLUSH_MS = Platform.OS === 'android' ? 100 : 50;\n\n/** Agent returned an error while the cdecli-serve channel stayed connected (e.g. bad LLM API key). */\nfunction isCdecliAgentFailureOutput(text: string): boolean {\n const t = text.trim();\n if (!t) return false;\n return (\n /⚠\\s*Error:/.test(t) ||\n /LLM stream error/i.test(t) ||\n /Incorrect API key/i.test(t) ||\n /invalid_api_key/i.test(t) ||\n /authentication_error/i.test(t) ||\n isAgentJwtRejected(t)\n );\n}\n\nexport interface MessageAttachment {\n id: string;\n name: string;\n type: 'file' | 'screenshot';\n dataUrl?: string;\n mimeType?: string;\n size?: number;\n url?: string;\n}\n\nexport interface ChatMessage {\n role: 'user' | 'assistant';\n content: string;\n attachments?: MessageAttachment[];\n metadata?: {\n tokenUsage?: { inputTokens: number; outputTokens: number; totalTokens: number };\n model?: string;\n };\n}\n\n/** The queued row renders this turn now, so the optimistic bubble must not stay behind it. */\nfunction withoutTrailingUserMessage(prev: ChatMessage[], text: string): ChatMessage[] {\n const last = prev[prev.length - 1];\n return last?.role === 'user' && last.content === text ? prev.slice(0, -1) : prev;\n}\n\n/** A message the gateway queued for the agent while a turn was running. */\nexport interface QueuedFollowUp {\n /** The gateway's id for it - what cancels it. */\n id: string;\n text: string;\n attachments?: MessageAttachment[];\n}\n\n/** What became of a send: delivered to the gateway, parked in the outbox, or refused outright. */\nexport type SendOutcome = 'sent' | 'queued' | 'failed';\n\nfunction formatBackendThread(\n backendMessages: Array<{\n role: string;\n content?: string;\n // The generated `ChatMessageUI` types `type` as a plain string; it is narrowed\n // to the UI union in the map below, so take it wide rather than cast at the call.\n attachments?: Array<{ id: string; name: string; type: string; mimeType?: string; size?: number; url?: string }>;\n tokenCount?: number;\n model?: string;\n }>,\n): ChatMessage[] {\n return collapseConsecutiveAssistants(\n backendMessages.map((msg) => ({\n role: msg.role as 'user' | 'assistant',\n content: msg.content ?? '',\n attachments: msg.attachments?.map((a) => ({\n id: a.id,\n name: a.name,\n type: a.type === 'screenshot' ? 'screenshot' : 'file',\n mimeType: a.mimeType,\n size: a.size,\n url: a.url,\n })),\n metadata: msg.tokenCount\n ? {\n tokenUsage: {\n inputTokens: 0,\n outputTokens: msg.tokenCount,\n totalTokens: msg.tokenCount,\n },\n model: msg.model,\n }\n : undefined,\n })),\n );\n}\n\n/** Mobile chat routes exclusively through CDeCLI (messenger-gateway). */\nexport interface UseChatStreamRouting {\n channelConnected: boolean;\n accountId: string;\n /** When `'backend'`, the gateway persists posts — skip client `saveMessages`. */\n persistenceMode?: 'backend' | 'frontend';\n /** Remint the system JWT and reconnect after cdecli-agent 401s the session. */\n recoverAgentAuth?: () => Promise<boolean>;\n /** Agent skill every turn on this stream carries (`metadata.skill`), e.g. Web Builder's. */\n skill?: string;\n}\n\nexport function useChatStream(\n sessionId: string | null,\n routing: UseChatStreamRouting = {\n channelConnected: false,\n accountId: 'default',\n persistenceMode: 'backend',\n },\n) {\n const [messages, setMessages] = useState<ChatMessage[]>([]);\n const [response, setResponse] = useState('');\n /** Brain assist — never the published agent stream. Shown as a Quick answer strip. */\n const [quickReply, setQuickReply] = useState('');\n const [isLoading, setIsLoading] = useState(false);\n const [isStreaming, setIsStreaming] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const isSendingRef = useRef(false);\n /**\n * Messages sent while a turn was running, which the gateway queued for the\n * agent. Shown above the composer until the agent starts on them (the way\n * Claude Code shows a message typed mid-turn), then moved into the thread.\n * Kept out of `messages` so a backend hydration cannot drop or double them.\n */\n const [queuedFollowUps, setQueuedFollowUps] = useState<QueuedFollowUp[]>([]);\n const queuedFollowUpsRef = useRef<QueuedFollowUp[]>([]);\n const sendMessageRef = useRef<\n (\n content: string,\n attachments?: MessageAttachment[],\n sessionIdOverride?: string | null,\n alreadyVisible?: boolean,\n queuedId?: string,\n ) => Promise<SendOutcome>\n >(async () => 'failed');\n\n /** Ensures GraphQL stream subscriptions use the id from createChannel+send before the next parent render. */\n const [cdecliStreamOverrideId, setCdecliStreamOverrideId] = useState<string | undefined>(undefined);\n const userMsgForSaveRef = useRef<ChatMessage | null>(null);\n const saveSessionIdRef = useRef<string | null>(null);\n const sessionIdRef = useRef<string | null>(sessionId);\n sessionIdRef.current = sessionId || cdecliStreamOverrideId || null;\n /** Blocks duplicate cdecli `onComplete` from appending assistant twice / saving twice per send. */\n const cdecliRoundHandledRef = useRef(false);\n /**\n * The round in flight was opened by the agent, not by a send: a follow-up,\n * e.g. the answer to a request the gateway queued while the agent was busy.\n * It completes as a new bubble instead of replacing the reply before it.\n */\n const followUpRoundRef = useRef(false);\n /** One remint+resend per turn when cdecli-agent 401s the JWT. */\n const authRetryUsedRef = useRef(false);\n const recoveringAuthRef = useRef(false);\n const routingRef = useRef(routing);\n routingRef.current = routing;\n\n const tryRecoverAndResendRef = useRef<(reason: string) => Promise<boolean>>(async () => false);\n\n /** Coalesce token deltas so Fabric is not committing a native tree every chunk. */\n const pendingStreamRef = useRef('');\n const streamFlushTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const clearPendingStream = useCallback(() => {\n if (streamFlushTimerRef.current != null) {\n clearTimeout(streamFlushTimerRef.current);\n streamFlushTimerRef.current = null;\n }\n pendingStreamRef.current = '';\n }, []);\n\n const flushPendingStream = useCallback(() => {\n streamFlushTimerRef.current = null;\n const pending = pendingStreamRef.current;\n if (!pending) return;\n pendingStreamRef.current = '';\n setResponse((r) => {\n const next = r + pending;\n const sid = sessionIdRef.current;\n if (sid) markChannelHistoryRunning(sid, next);\n return next;\n });\n }, []);\n\n useEffect(() => () => clearPendingStream(), [clearPendingStream]);\n\n const { saveMessages, patchChannelTitle } = useChatMutations();\n const titlePatchedChannelsRef = useRef(new Set<string>());\n const { accountUserId } = usePrerequisiteIds();\n const [createAccountChatFileUploadLinksMutation] = useCreateAccountChatFileUploadLinksMutation();\n const [createAccountChatFileDownloadLinksMutation] = useCreateAccountChatFileDownloadLinksMutation();\n const {\n messages: backendMessages,\n loading: backendMessagesLoading,\n messagesLoaded: backendMessagesLoaded,\n } = useChatMessages(sessionId);\n const lastHydratedSessionIdRef = useRef<string | null>(null);\n /** Trash-clear: do not re-hydrate gateway history until the next send. */\n const ignoreHydrationRef = useRef(false);\n\n const streamChannelId = sessionId || cdecliStreamOverrideId;\n\n const finalizeCdecliRound = useCallback(\n (assistantContent?: string) => {\n const previewSid = saveSessionIdRef.current || sessionIdRef.current;\n clearPendingStream();\n saveSessionIdRef.current = null;\n userMsgForSaveRef.current = null;\n followUpRoundRef.current = false;\n setResponse('');\n setQuickReply('');\n setIsLoading(false);\n setIsStreaming(false);\n isSendingRef.current = false;\n if (previewSid) clearChannelHistoryRunning(previewSid);\n if (assistantContent !== undefined) {\n setMessages((prev) =>\n appendOrReplaceAssistant(prev, { role: 'assistant' as const, content: assistantContent }),\n );\n if (previewSid) patchChannelHistoryPreview(previewSid, assistantContent);\n }\n },\n [clearPendingStream],\n );\n\n const cdecliCallbacks = useMemo(\n () => ({\n onChunk: (text: string) => {\n if (!isSendingRef.current) {\n // No send opened this round: the agent is speaking on its own.\n isSendingRef.current = true;\n followUpRoundRef.current = true;\n cdecliRoundHandledRef.current = false;\n saveSessionIdRef.current = sessionIdRef.current;\n setIsLoading(true);\n setIsStreaming(true);\n setError(null);\n const sid = sessionIdRef.current;\n if (sid) markChannelHistoryRunning(sid, text);\n // The agent has started on what was queued: those messages\n // join the thread now, above the answer they are getting.\n const started = queuedFollowUpsRef.current;\n if (started.length > 0) {\n queuedFollowUpsRef.current = [];\n setQueuedFollowUps([]);\n setMessages((prev) => [\n ...prev,\n ...started.map((q) => ({\n role: 'user' as const,\n content: q.text,\n attachments: q.attachments,\n })),\n ]);\n }\n }\n pendingStreamRef.current += text;\n if (streamFlushTimerRef.current == null) {\n streamFlushTimerRef.current = setTimeout(flushPendingStream, STREAM_FLUSH_MS);\n }\n },\n // The brain's provisional answer is the WHOLE reply-so-far, not a chunk:\n // it is set outright, and set to '' when the real stream supersedes it.\n onQuickReply: (text: string) => {\n setQuickReply(text);\n },\n // The gateway's own words on the running work (a status answer, a\n // long-wait report) arrive as thread posts through hydration; the\n // callback only keeps them from ending the reply in progress.\n onNotice: () => undefined,\n onStreamRestart: () => {\n clearPendingStream();\n pendingStreamRef.current = '';\n setResponse('');\n },\n onComplete: (text: string) => {\n clearPendingStream();\n if (cdecliRoundHandledRef.current) {\n return;\n }\n\n // Judge the agent's own words: a quick answer in front of them is\n // not the agent failing, and never belongs in the error banner.\n const agentText = splitPreResponse(text).text;\n if (isCdecliAgentFailureOutput(agentText)) {\n void (async () => {\n if (await tryRecoverAndResendRef.current(agentText)) return;\n if (cdecliRoundHandledRef.current) return;\n cdecliRoundHandledRef.current = true;\n setError(\n isAgentJwtRejected(agentText)\n ? agentText\n : 'CDeCLI agent error. Check gateway status and server-side LLM configuration.',\n );\n finalizeCdecliRound(isAgentJwtRejected(agentText) ? undefined : text);\n })();\n return;\n }\n\n cdecliRoundHandledRef.current = true;\n authRetryUsedRef.current = false;\n\n const reply = resolveAssistantReply(text);\n const sid = saveSessionIdRef.current;\n const um = userMsgForSaveRef.current;\n const followUp = followUpRoundRef.current;\n saveSessionIdRef.current = null;\n userMsgForSaveRef.current = null;\n followUpRoundRef.current = false;\n\n const assistant = { role: 'assistant' as const, content: reply };\n setMessages((prev) =>\n followUp ? appendFollowUpAssistant(prev, assistant) : appendOrReplaceAssistant(prev, assistant),\n );\n const previewSid = sid || sessionIdRef.current;\n if (previewSid) {\n clearChannelHistoryRunning(previewSid);\n patchChannelHistoryPreview(previewSid, reply);\n }\n setResponse('');\n setQuickReply('');\n setIsLoading(false);\n setIsStreaming(false);\n isSendingRef.current = false;\n\n const rt = routingRef.current;\n const persistClientSide = rt.persistenceMode !== 'backend';\n\n if (sid && um && persistClientSide) {\n saveMessages({\n sessionId: sid,\n ...(accountUserId ? { createdBy: accountUserId } : {}),\n userMessage: {\n content: um.content,\n attachments: um.attachments?.map((a) => ({\n id: a.id,\n name: a.name,\n type: a.type,\n mimeType: a.mimeType,\n size: a.size,\n url: a.url,\n })),\n },\n assistantMessage: {\n content: reply,\n tokenCount: undefined,\n model: 'cdecli-serve',\n },\n }).catch((e) => {\n console.error('[useChatStream] saveMessages (cdecli):', e);\n });\n }\n },\n onError: (err: string) => {\n if (cdecliRoundHandledRef.current) return;\n void (async () => {\n if (await tryRecoverAndResendRef.current(err)) return;\n if (cdecliRoundHandledRef.current) return;\n cdecliRoundHandledRef.current = true;\n setError(err || 'CDeCLI stream error.');\n finalizeCdecliRound(resolveAssistantReply(''));\n })();\n },\n }),\n [saveMessages, accountUserId, finalizeCdecliRound, flushPendingStream, clearPendingStream],\n );\n\n const {\n sendMessage: sendCdecliMessage,\n sendQueued: sendQueuedCdecli,\n cancelQueued: cancelQueuedCdecli,\n cancel: cancelCdecliTurn,\n } = useCdecliChannel(\n routing.channelConnected,\n routing.accountId,\n streamChannelId,\n cdecliCallbacks,\n undefined,\n routing.skill,\n );\n\n const setQueue = useCallback((next: QueuedFollowUp[]) => {\n queuedFollowUpsRef.current = next;\n setQueuedFollowUps(next);\n }, []);\n\n useEffect(() => {\n if (sessionId && cdecliStreamOverrideId && sessionId === cdecliStreamOverrideId) {\n setCdecliStreamOverrideId(undefined);\n }\n }, [sessionId, cdecliStreamOverrideId]);\n\n useEffect(() => {\n const prevSid = lastHydratedSessionIdRef.current;\n if (prevSid && sessionId && prevSid !== sessionId && isSendingRef.current) {\n // Switching threads: drop local send flags so this view can hydrate.\n // The previous channel's agent keeps running server-side; history still\n // shows it as running until that turn completes or we reopen it.\n clearPendingStream();\n setQueue([]);\n isSendingRef.current = false;\n followUpRoundRef.current = false;\n cdecliRoundHandledRef.current = false;\n saveSessionIdRef.current = null;\n userMsgForSaveRef.current = null;\n setIsLoading(false);\n setIsStreaming(false);\n setResponse('');\n setQuickReply('');\n }\n\n if (!sessionId) {\n setMessages([]);\n setResponse('');\n setQuickReply('');\n lastHydratedSessionIdRef.current = null;\n return;\n }\n\n const stampHistoryPreview = (msgs: ChatMessage[]) => {\n const last = msgs[msgs.length - 1];\n const lastAssistant = [...msgs].reverse().find((msg) => msg.role === 'assistant' && msg.content.trim());\n if (lastAssistant && !isSendingRef.current) {\n patchChannelHistoryPreview(sessionId, lastAssistant.content);\n }\n // Finished thread (last post is assistant) — drop the history \"Running\" badge.\n // A live turn ends with a user post until the assistant lands.\n if (!isSendingRef.current && last?.role === 'assistant') {\n clearChannelHistoryRunning(sessionId);\n }\n };\n\n if (ignoreHydrationRef.current) {\n return;\n }\n\n const keepStream = isSendingRef.current;\n const sessionChanged = lastHydratedSessionIdRef.current !== sessionId;\n if (sessionChanged) {\n lastHydratedSessionIdRef.current = sessionId;\n // Do not merge the previous channel's in-memory thread into this one.\n if (!backendMessagesLoaded) {\n if (!keepStream) {\n setMessages([]);\n setResponse('');\n setQuickReply('');\n }\n return;\n }\n const formatted = formatBackendThread(backendMessages ?? []);\n stampHistoryPreview(formatted);\n setMessages((prev) => (keepStream ? mergeOptimisticGatewayMessages(prev, formatted) : formatted));\n if (!keepStream) {\n setResponse('');\n setQuickReply('');\n }\n return;\n }\n\n if (backendMessagesLoaded) {\n const formatted = formatBackendThread(backendMessages ?? []);\n stampHistoryPreview(formatted);\n // Positional merge first so assistant replies the gateway never persisted\n // (cdecli skill turns emit no chatMessageAdded) survive this snapshot instead\n // of being dropped, then preserve in-memory attachment previews on the result.\n setMessages((prev) => preserveAttachmentPreviews(prev, mergeOptimisticGatewayMessages(prev, formatted)));\n if (!keepStream) {\n setResponse('');\n setQuickReply('');\n }\n }\n }, [sessionId, backendMessages, backendMessagesLoaded, clearPendingStream, setQueue]);\n\n const sendMessage = useCallback(\n async (\n content: string,\n attachments?: MessageAttachment[],\n sessionIdOverride?: string | null,\n alreadyVisible = false,\n /** Set when this send is the release of an outbox entry; it owns that entry's fate. */\n queuedId: string | undefined = undefined,\n ): Promise<SendOutcome> => {\n if (!content.trim() && !attachments?.length) return 'failed';\n\n const effectiveSessionId = sessionIdOverride !== undefined ? sessionIdOverride : sessionId;\n const rt = routingRef.current;\n const trimmed = content.trim();\n const sendText =\n trimmed ||\n (attachments?.length\n ? `Attached: ${attachments\n .map((a) => a.name)\n .filter(Boolean)\n .join(', ')}`\n : '');\n\n const userMessage: ChatMessage = {\n role: 'user',\n content: sendText,\n attachments,\n };\n\n /**\n * The gateway is down. The turn is remembered, not erased: it stays in the\n * thread as a queued bubble and the outbox releases it in order the moment\n * the channel reports connected. Losing what the user typed here is the\n * whole reason this lane exists.\n */\n if (!rt.channelConnected) {\n if (!effectiveSessionId) {\n setError('Missing chat session id.');\n return 'failed';\n }\n // A release that raced the connection dropping stays where it is.\n if (queuedId) return 'queued';\n const result = queueGatewayMessage({\n channelId: effectiveSessionId,\n accountId: rt.accountId,\n text: sendText,\n attachments,\n });\n if (!result.ok) {\n setError(\n result.reason === 'full'\n ? `${MAX_QUEUED_MESSAGES} messages are already waiting for the gateway. They send as soon as it connects.`\n : 'Nothing to send.',\n );\n return 'failed';\n }\n if (alreadyVisible) setMessages((prev) => withoutTrailingUserMessage(prev, sendText));\n setError(null);\n return 'queued';\n }\n\n /**\n * A turn is already in flight. The gateway queues the message for the\n * agent, which answers it when the running turn ends; the running reply\n * is left alone. It waits above the composer (cancellable) until the\n * agent starts on it. A status question is answered on the spot, and a\n * turn that had already ended takes the message straight away.\n */\n if (isSendingRef.current) {\n if (!effectiveSessionId) {\n setError('Missing chat session id.');\n return 'failed';\n }\n const media = attachments?.length ? buildGatewayMedia(attachments, { includeData: true }) : [];\n const outcome = await sendQueuedCdecli(sendText, effectiveSessionId, media);\n if (outcome.status === 'failed') {\n setError(outcome.error || 'Could not send the message. Try again.');\n return 'failed';\n }\n if (queuedId) dropQueuedGatewayMessage(queuedId);\n setError(null);\n if (outcome.status === 'queued') {\n setQueue([\n ...queuedFollowUpsRef.current,\n { id: outcome.id, text: sendText, attachments: releasePreviewBytes(attachments) },\n ]);\n if (alreadyVisible) setMessages((prev) => withoutTrailingUserMessage(prev, sendText));\n } else if (!alreadyVisible) {\n setMessages((prev) => [...prev, userMessage]);\n }\n return 'sent';\n }\n\n isSendingRef.current = true;\n followUpRoundRef.current = false;\n ignoreHydrationRef.current = false;\n if (effectiveSessionId && sendText) {\n titlePatchedChannelsRef.current.add(effectiveSessionId);\n patchChannelTitle(effectiveSessionId, sendText, true);\n markChannelHistoryRunning(effectiveSessionId);\n }\n if (!alreadyVisible) {\n // The transcript keeps this turn for the rest of the session, so it\n // keeps the preview URI and not the base64 behind it. The bytes stay\n // on `userMsgForSaveRef` below, which is nulled when the turn ends -\n // a retry still has them, a backgrounded app no longer carries them.\n const retained: ChatMessage = {\n ...userMessage,\n attachments: releasePreviewBytes(userMessage.attachments),\n };\n setMessages((prev) => [...prev, retained]);\n authRetryUsedRef.current = false;\n }\n setResponse('');\n setQuickReply('');\n setIsLoading(true);\n setIsStreaming(true);\n setError(null);\n userMsgForSaveRef.current = userMessage;\n saveSessionIdRef.current = effectiveSessionId ?? null;\n cdecliRoundHandledRef.current = false;\n\n if (!effectiveSessionId) {\n setError('Missing chat session id.');\n if (!alreadyVisible) setMessages((p) => p.slice(0, -1));\n isSendingRef.current = false;\n setIsLoading(false);\n setIsStreaming(false);\n userMsgForSaveRef.current = null;\n saveSessionIdRef.current = null;\n return 'failed';\n }\n\n if (sessionIdOverride) {\n setCdecliStreamOverrideId(sessionIdOverride);\n await new Promise<void>((resolve) => {\n setTimeout(resolve, 0);\n });\n }\n\n const inlineForHostedAgent = shouldInlineGatewayMediaForHostedAgent(\n config.GRAPHQL_URL,\n config.CDECLI_AGENT_ENDPOINT,\n );\n // Vision turns must carry inline bytes. URL-only media is what made\n // \"what is this\" + a photo look like a text-only question.\n const inlineImages = (attachments ?? []).some(isImageAttachment) || inlineForHostedAgent;\n let media = inlineImages\n ? buildGatewayMedia(attachments, { includeData: true })\n : await buildGatewayMediaPreferUrls(\n attachments,\n async (filenames) => {\n const result = await createAccountChatFileUploadLinksMutation({\n variables: { filenames },\n });\n return result.data?.createAccountChatFileUploadLinks || [];\n },\n async (urls) => {\n const result = await createAccountChatFileDownloadLinksMutation({\n variables: { urls },\n });\n return result.data?.createAccountChatFileDownloadLinks || [];\n },\n );\n if ((attachments?.length ?? 0) > 0 && media.length === 0) {\n media = buildGatewayMedia(attachments, { includeData: true });\n }\n const ok = await sendCdecliMessage(sendText, effectiveSessionId, media);\n if (!ok && !cdecliRoundHandledRef.current && !recoveringAuthRef.current) {\n cdecliRoundHandledRef.current = true;\n // The send never reached the agent. Park it rather than drop it - a\n // release keeps its place at the head of its own queue.\n const parked = queuedId\n ? { ok: true as const }\n : queueGatewayMessage({\n channelId: effectiveSessionId,\n accountId: rt.accountId,\n text: sendText,\n attachments,\n });\n setError(\n parked.ok\n ? 'Gateway unreachable - message queued. It sends as soon as the connection is back.'\n : 'Failed to send message via CDeCLI. Check gateway connection.',\n );\n // Queued: the queued row renders the turn, so the optimistic bubble goes.\n // Not queued: only drop a bubble this call put there.\n setMessages((p) => {\n if (parked.ok) return withoutTrailingUserMessage(p, sendText);\n return alreadyVisible ? p : p.slice(0, -1);\n });\n isSendingRef.current = false;\n setIsLoading(false);\n setIsStreaming(false);\n userMsgForSaveRef.current = null;\n saveSessionIdRef.current = null;\n clearChannelHistoryRunning(effectiveSessionId);\n return parked.ok ? 'queued' : 'failed';\n }\n if (ok && queuedId) dropQueuedGatewayMessage(queuedId);\n return ok ? 'sent' : 'failed';\n },\n [\n sessionId,\n sendCdecliMessage,\n patchChannelTitle,\n sendQueuedCdecli,\n setQueue,\n createAccountChatFileUploadLinksMutation,\n createAccountChatFileDownloadLinksMutation,\n ],\n );\n\n sendMessageRef.current = sendMessage;\n\n /* ---------------------------------------------------------------------- *\n * Outbox: turns typed while the gateway was down.\n * ---------------------------------------------------------------------- */\n\n const queuedChannelId = sessionId || cdecliStreamOverrideId || null;\n const queuedSnapshot = useCallback(\n () => queuedGatewayMessages(queuedChannelId, routing.accountId),\n [queuedChannelId, routing.accountId],\n );\n const queuedMessages = useSyncExternalStore(subscribeQueuedGatewayMessages, queuedSnapshot, queuedSnapshot);\n\n useEffect(() => {\n void restoreQueuedGatewayMessages();\n }, []);\n\n /** One release at a time; a send that fails leaves its entry at the head for the next reconnect. */\n const flushingRef = useRef(false);\n const flushQueuedMessages = useCallback(async () => {\n if (flushingRef.current) return;\n flushingRef.current = true;\n try {\n // Bounded: the outbox can never hand out more than its own depth.\n for (let i = 0; i <= MAX_QUEUED_MESSAGES; i += 1) {\n const rt = routingRef.current;\n const sid = sessionIdRef.current;\n if (!rt.channelConnected || !sid) return;\n const next = queuedGatewayMessages(sid, rt.accountId)[0];\n if (!next) return;\n const outcome = await sendMessageRef.current(\n next.text,\n next.attachments,\n next.channelId,\n false,\n next.id,\n );\n if (outcome !== 'sent') return;\n }\n } finally {\n flushingRef.current = false;\n }\n }, []);\n\n /**\n * Release on the disconnected→connected edge, and when a channel with a queue\n * is opened on an already-live gateway. Deliberately not keyed on queue depth:\n * a send that fails puts its turn back, and depth would spin that into a loop.\n */\n const wasConnectedRef = useRef(routing.channelConnected);\n useEffect(() => {\n const connected = routing.channelConnected;\n const reconnected = connected && !wasConnectedRef.current;\n wasConnectedRef.current = connected;\n if (!connected || !queuedChannelId) return;\n if (!reconnected && queuedGatewayMessages(queuedChannelId, routing.accountId).length === 0) return;\n void flushQueuedMessages();\n }, [routing.channelConnected, routing.accountId, queuedChannelId, flushQueuedMessages]);\n\n const discardQueuedMessages = useCallback(() => {\n if (!queuedChannelId) return;\n clearQueuedGatewayMessages(queuedChannelId);\n setError(null);\n }, [queuedChannelId]);\n\n tryRecoverAndResendRef.current = async (reason: string) => {\n if (authRetryUsedRef.current || cdecliRoundHandledRef.current) return false;\n if (!isAgentJwtRejected(reason)) return false;\n const recover = routingRef.current.recoverAgentAuth;\n if (!recover) return false;\n authRetryUsedRef.current = true;\n recoveringAuthRef.current = true;\n try {\n setError('Refreshing CDeCLI credentials…');\n const recovered = await recover();\n if (!recovered) return false;\n const um = userMsgForSaveRef.current;\n const sid = saveSessionIdRef.current;\n cdecliRoundHandledRef.current = false;\n isSendingRef.current = false;\n setIsLoading(false);\n setIsStreaming(false);\n setError(null);\n if (um && sid) {\n queueMicrotask(() => {\n void sendMessageRef.current(um.content, um.attachments, sid, true);\n });\n }\n return true;\n } catch (err) {\n console.error('[useChatStream] recoverAgentAuth failed:', err);\n return false;\n } finally {\n recoveringAuthRef.current = false;\n }\n };\n\n const cancel = useCallback(() => {\n clearPendingStream();\n const sid = saveSessionIdRef.current ?? sessionId;\n void cancelCdecliTurn(sid ?? 'messenger');\n if (!cdecliRoundHandledRef.current) {\n cdecliRoundHandledRef.current = true;\n finalizeCdecliRound(resolveAssistantReply(''));\n }\n }, [cancelCdecliTurn, finalizeCdecliRound, sessionId, clearPendingStream]);\n\n const clearMessages = useCallback(() => {\n clearPendingStream();\n const hadActiveTurn = isSendingRef.current;\n const sid = saveSessionIdRef.current ?? sessionId;\n isSendingRef.current = false;\n cdecliRoundHandledRef.current = true;\n saveSessionIdRef.current = null;\n userMsgForSaveRef.current = null;\n // Only hit /cancel when a turn was live — otherwise cdecli logs\n // \"Cannot cancel: no active session\" (Research greet + trash).\n if (hadActiveTurn) {\n void cancelCdecliTurn(sid ?? 'messenger');\n }\n ignoreHydrationRef.current = true;\n // Emptying the thread empties its outbox too: a queued turn released after\n // the user cleared the chat would answer a conversation they threw away.\n if (sid) clearQueuedGatewayMessages(sid);\n // ...and what the gateway queued for the agent.\n for (const queued of queuedFollowUpsRef.current) void cancelQueuedCdecli(queued.id, sid ?? 'messenger');\n setQueue([]);\n setMessages([]);\n setResponse('');\n setQuickReply('');\n setError(null);\n setIsLoading(false);\n setIsStreaming(false);\n if (sid) clearChannelHistoryRunning(sid);\n }, [cancelCdecliTurn, cancelQueuedCdecli, clearPendingStream, sessionId, setQueue]);\n\n /** Take one queued message back before the agent gets to it. Too late once\n * the agent started it: it then joins the thread with its answer. */\n const cancelQueuedFollowUp = useCallback(\n async (id: string) => {\n const sid = sessionIdRef.current;\n if (!sid) return;\n const result = await cancelQueuedCdecli(id, sid);\n if (result.ok) {\n setQueue(queuedFollowUpsRef.current.filter((q) => q.id !== id));\n } else {\n setError(result.error || 'Could not cancel that message.');\n }\n },\n [cancelQueuedCdecli, setQueue],\n );\n\n /** Stop the running reply so the agent takes the queued messages now. */\n const sendQueuedNow = useCallback(() => {\n if (isSendingRef.current) cancel();\n }, [cancel]);\n\n const messagesLoading = !!sessionId && backendMessagesLoading && !backendMessagesLoaded;\n\n return {\n messages,\n response,\n quickReply,\n error,\n isLoading,\n isStreaming,\n messagesLoading,\n hasMessages:\n messages.length > 0 ||\n !!response ||\n !!quickReply ||\n queuedMessages.length > 0 ||\n queuedFollowUps.length > 0,\n /** Turns waiting on the gateway, oldest first. Rendered as queued bubbles. */\n queuedMessages,\n /** Send the queue now (the notice's retry), independent of the reconnect edge. */\n flushQueuedMessages,\n discardQueuedMessages,\n /** Sent while the agent was busy and queued for it, oldest first. */\n queuedFollowUps,\n cancelQueuedFollowUp,\n sendQueuedNow,\n sendMessage,\n cancel,\n clearMessages,\n };\n}\n"],"names":["media","_a"],"mappings":"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"}
package/lib/index.js CHANGED
@@ -1 +1 @@
1
- import {Feature}from'@common-stack/client-react';import YantraMobileModule from'./module.js';export{default as Home}from'./screens/Home/HomeScreen.js';export{default as NewChat}from'./screens/NewChat/index.js';export{default as Account}from'./screens/Account/index.js';export{default as ChatHistory}from'./screens/ChatHistory/index.js';export{default as Apps}from'./screens/Apps/index.js';export{default as WebBuilder}from'./screens/WebBuilder/index.js';export{GatewayContextProvider,useGatewayContext}from'./contexts/GatewayContext.js';export{CdecliConnectionProvider,useCdecliConnection}from'./contexts/CdecliConnectionContext.js';export{ChatLiveStreamEngine}from'./contexts/ChatLiveStreamContext.js';export{MemoryPressureResponder}from'./features/memory/MemoryPressureResponder.js';export{BUILTIN_MOBILE_GATEWAYS,MAX_CONCURRENT_TASKS,STORAGE_KEYS}from'./config/constants.js';export{config}from'./config/env-config.js';export{useCdecliAutoConnect}from'./hooks/useCdecliAutoConnect.js';export{useObtainSystemToken}from'./hooks/useObtainSystemToken.js';export{mintSurfaceSystemToken,resolveSurfaceCatalogBackend}from'./hooks/mintSurfaceSystemToken.js';export{buildCdecliTokenInjection,buildSurfaceGateRecoveryScript}from'./hooks/surfaceHandoffScript.js';export{isInstanceNotFoundError,useGatewayConnection}from'./hooks/useGatewayConnection.js';export{usePrerequisiteIds}from'./hooks/usePrerequisiteIds.js';export{useWorkspaceProvisioner}from'./hooks/useWorkspaceProvisioner.js';export{useGatewayRegistry}from'./hooks/useGatewayRegistry.js';export{agentSessionManager}from'./services/agentSessionManager.js';export{ensureGatewayApiKeys,resetGatewayApiKeyBridge}from'./services/gatewayApiKeyBridge.js';export{GatewayClient}from'./services/gatewayClient.js';export{BRIDGE_PROTOCOL_VERSION,BRIDGE_READY_ACTION,DEFAULT_BRIDGE_TIMEOUT_MS,DEFAULT_CHUNK_SIZE,MessageType}from'./bridge/types.js';export{WebViewManager}from'./bridge/WebViewManager.js';export{NativeWebViewBridge}from'./bridge/NativeWebViewBridge.js';export{TypedBridge}from'./bridge/TypedBridge.js';export{CancellableRequest}from'./bridge/CancellableRequest.js';export{ChunkedMessageHandler}from'./bridge/ChunkedMessageHandler.js';export{BridgeDebugger}from'./bridge/BridgeDebugger.js';export{WEB_BRIDGE_BOOTSTRAP}from'./bridge/webBridgeBootstrap.js';export{AuthenticatedFetch}from'./bridge/AuthenticatedFetch.js';export{AuthBridgeHandler}from'./bridge/handlers/AuthBridgeHandler.js';export{NavigationBridgeHandler}from'./bridge/handlers/NavigationBridgeHandler.js';export{AnalyticsBridgeHandler}from'./bridge/handlers/AnalyticsBridgeHandler.js';export{SURFACE_HOST_ACTIONS,SurfaceHostBridgeHandler}from'./bridge/handlers/SurfaceHostBridgeHandler.js';export{classifySurfaceNavigation}from'./bridge/surfaceLinkRouting.js';export{getPackagerHost,resolveMobileWebUrl}from'./bridge/resolveMobileWebUrl.js';export{YANTRA_LOADER_SIZE_COMPACT,YANTRA_LOADER_SIZE_DEFAULT,YantraBrandLoader}from'./components/YantraBrandLoader.js';export{default as CustomDrawer}from'./components/CustomDrawer.js';export{AppThemeProvider,useAppTheme}from'./theme/AppThemeProvider.js';export{InviteDeepLink}from'./features/invite/InviteDeepLink.js';export{ChatInviteDeepLink}from'./features/messaging/ChatInviteDeepLink.js';export{HealthSyncRunner}from'./features/health/HealthSyncRunner.js';export{FitnessWidgetRunner}from'./features/fitness-widgets/FitnessWidgetRunner.js';export{FitnessDeepLink}from'./features/fitness-widgets/FitnessDeepLink.js';export{inviteTokenFromUrl,isInviteUrl}from'./features/invite/inviteLink.js';export{isKeyboardControllerAvailable}from'./utils/keyboardController.js';export{getNativeCanvasExperience,getNativeCanvasViewer,preloadNativeCanvasExperience,registerCanvasExperiencePreload,registerNativeCanvasExperience,registerNativeCanvasViewer}from'./features/canvas/nativeViewerRegistry.js';export{getNativeCharactersExperience,registerNativeCharactersExperience}from'./features/characters/nativeCharactersRegistry.js';export{getNativeChatExperience,registerNativeChatExperience}from'./features/messaging/nativeChatRegistry.js';export{forgetChatPushToken,rememberChatPushToken}from'./features/messaging/chatPushToken.js';export{CHAT_NOTIFICATION_CONFIG_KEY,CHAT_NOTIFICATION_KEYS,chatPrefsFromSettings}from'./features/messaging/chatNotificationPrefs.js';export{settingsUriForAccount}from'./utils/cdecodeUri.js';export{getNativeShoppingExperience,preloadNativeShoppingExperience,registerNativeShoppingExperience,registerShoppingExperiencePreload}from'./features/shopping/nativeShoppingRegistry.js';export{getNativeTravelExperience,preloadNativeTravelExperience,registerNativeTravelExperience,registerTravelExperiencePreload}from'./features/travel/nativeTravelRegistry.js';export{getNativeJobSearchExperience,preloadNativeJobSearchExperience,registerJobSearchExperiencePreload,registerNativeJobSearchExperience}from'./features/job-search/nativeJobSearchRegistry.js';export{getNativeResumeExperience,preloadNativeResumeExperience,registerNativeResumeExperience,registerResumeExperiencePreload}from'./features/resume/nativeResumeRegistry.js';export{getNativeInboxExperience,preloadNativeInboxExperience,registerInboxExperiencePreload,registerNativeInboxExperience}from'./features/inbox/nativeInboxRegistry.js';export{getNativeStudyExperience,preloadNativeStudyExperience,registerNativeStudyExperience,registerStudyExperiencePreload}from'./features/study/nativeStudyRegistry.js';export{getNativeLocalServicesExperience,preloadNativeLocalServicesExperience,registerLocalServicesExperiencePreload,registerNativeLocalServicesExperience}from'./features/local-services/nativeLocalServicesRegistry.js';export{getNativeMoviesExperience,preloadNativeMoviesExperience,registerMoviesExperiencePreload,registerNativeMoviesExperience}from'./features/movies/nativeMoviesRegistry.js';export{getNativeExpensesExperience,preloadNativeExpensesExperience,registerExpensesExperiencePreload,registerNativeExpensesExperience}from'./features/expenses/nativeExpensesRegistry.js';export{NativeAgentChat}from'./features/agent-chat/NativeAgentChat.js';export{ChatLinkOpenerProvider}from'./features/links/ChatLinkOpenerProvider.js';export{resolveSurfaceAuthGraphqlUrl}from'./hooks/resolveSurfaceAuthGraphqlUrl.js';var index = new Feature(YantraMobileModule);export{index as default};//# sourceMappingURL=index.js.map
1
+ import {Feature}from'@common-stack/client-react';import YantraMobileModule from'./module.js';export{default as Home}from'./screens/Home/HomeScreen.js';export{default as NewChat}from'./screens/NewChat/index.js';export{default as Account}from'./screens/Account/index.js';export{default as ChatHistory}from'./screens/ChatHistory/index.js';export{default as Apps}from'./screens/Apps/index.js';export{default as WebBuilder}from'./screens/WebBuilder/index.js';export{GatewayContextProvider,useGatewayContext}from'./contexts/GatewayContext.js';export{CdecliConnectionProvider,useCdecliConnection}from'./contexts/CdecliConnectionContext.js';export{ChatLiveStreamEngine}from'./contexts/ChatLiveStreamContext.js';export{MemoryPressureResponder}from'./features/memory/MemoryPressureResponder.js';export{BUILTIN_MOBILE_GATEWAYS,MAX_CONCURRENT_TASKS,STORAGE_KEYS}from'./config/constants.js';export{config}from'./config/env-config.js';export{useCdecliAutoConnect}from'./hooks/useCdecliAutoConnect.js';export{useObtainSystemToken}from'./hooks/useObtainSystemToken.js';export{mintSurfaceSystemToken,resolveSurfaceCatalogBackend}from'./hooks/mintSurfaceSystemToken.js';export{buildCdecliTokenInjection,buildSurfaceGateRecoveryScript}from'./hooks/surfaceHandoffScript.js';export{isInstanceNotFoundError,useGatewayConnection}from'./hooks/useGatewayConnection.js';export{usePrerequisiteIds}from'./hooks/usePrerequisiteIds.js';export{useWorkspaceProvisioner}from'./hooks/useWorkspaceProvisioner.js';export{useGatewayRegistry}from'./hooks/useGatewayRegistry.js';export{agentSessionManager}from'./services/agentSessionManager.js';export{ensureGatewayApiKeys,resetGatewayApiKeyBridge}from'./services/gatewayApiKeyBridge.js';export{GatewayClient}from'./services/gatewayClient.js';export{BRIDGE_PROTOCOL_VERSION,BRIDGE_READY_ACTION,DEFAULT_BRIDGE_TIMEOUT_MS,DEFAULT_CHUNK_SIZE,MessageType}from'./bridge/types.js';export{WebViewManager}from'./bridge/WebViewManager.js';export{NativeWebViewBridge}from'./bridge/NativeWebViewBridge.js';export{TypedBridge}from'./bridge/TypedBridge.js';export{CancellableRequest}from'./bridge/CancellableRequest.js';export{ChunkedMessageHandler}from'./bridge/ChunkedMessageHandler.js';export{BridgeDebugger}from'./bridge/BridgeDebugger.js';export{WEB_BRIDGE_BOOTSTRAP}from'./bridge/webBridgeBootstrap.js';export{AuthenticatedFetch}from'./bridge/AuthenticatedFetch.js';export{AuthBridgeHandler}from'./bridge/handlers/AuthBridgeHandler.js';export{NavigationBridgeHandler}from'./bridge/handlers/NavigationBridgeHandler.js';export{AnalyticsBridgeHandler}from'./bridge/handlers/AnalyticsBridgeHandler.js';export{SURFACE_HOST_ACTIONS,SurfaceHostBridgeHandler}from'./bridge/handlers/SurfaceHostBridgeHandler.js';export{classifySurfaceNavigation}from'./bridge/surfaceLinkRouting.js';export{getPackagerHost,resolveMobileWebUrl}from'./bridge/resolveMobileWebUrl.js';export{YANTRA_LOADER_SIZE_COMPACT,YANTRA_LOADER_SIZE_DEFAULT,YantraBrandLoader}from'./components/YantraBrandLoader.js';export{default as CustomDrawer}from'./components/CustomDrawer.js';export{AppThemeProvider,useAppTheme}from'./theme/AppThemeProvider.js';export{InviteDeepLink}from'./features/invite/InviteDeepLink.js';export{ChatInviteDeepLink}from'./features/messaging/ChatInviteDeepLink.js';export{HealthSyncRunner}from'./features/health/HealthSyncRunner.js';export{FitnessWidgetRunner}from'./features/fitness-widgets/FitnessWidgetRunner.js';export{FitnessDeepLink}from'./features/fitness-widgets/FitnessDeepLink.js';export{inviteTokenFromUrl,isInviteUrl}from'./features/invite/inviteLink.js';export{isKeyboardControllerAvailable}from'./utils/keyboardController.js';export{getNativeCanvasExperience,getNativeCanvasViewer,preloadNativeCanvasExperience,registerCanvasExperiencePreload,registerNativeCanvasExperience,registerNativeCanvasViewer}from'./features/canvas/nativeViewerRegistry.js';export{getNativeCharactersExperience,registerNativeCharactersExperience}from'./features/characters/nativeCharactersRegistry.js';export{getNativeChatExperience,registerNativeChatExperience}from'./features/messaging/nativeChatRegistry.js';export{forgetChatPushToken,rememberChatPushToken}from'./features/messaging/chatPushToken.js';export{CHAT_NOTIFICATION_CONFIG_KEY,CHAT_NOTIFICATION_KEYS,chatPrefsFromSettings}from'./features/messaging/chatNotificationPrefs.js';export{settingsUriForAccount}from'./utils/cdecodeUri.js';export{getNativeShoppingExperience,preloadNativeShoppingExperience,registerNativeShoppingExperience,registerShoppingExperiencePreload}from'./features/shopping/nativeShoppingRegistry.js';export{getNativeTravelExperience,preloadNativeTravelExperience,registerNativeTravelExperience,registerTravelExperiencePreload}from'./features/travel/nativeTravelRegistry.js';export{getNativeJobSearchExperience,preloadNativeJobSearchExperience,registerJobSearchExperiencePreload,registerNativeJobSearchExperience}from'./features/job-search/nativeJobSearchRegistry.js';export{getNativeResumeExperience,preloadNativeResumeExperience,registerNativeResumeExperience,registerResumeExperiencePreload}from'./features/resume/nativeResumeRegistry.js';export{getNativeInboxExperience,preloadNativeInboxExperience,registerInboxExperiencePreload,registerNativeInboxExperience}from'./features/inbox/nativeInboxRegistry.js';export{getNativeStudyExperience,preloadNativeStudyExperience,registerNativeStudyExperience,registerStudyExperiencePreload}from'./features/study/nativeStudyRegistry.js';export{getNativeLocalServicesExperience,preloadNativeLocalServicesExperience,registerLocalServicesExperiencePreload,registerNativeLocalServicesExperience}from'./features/local-services/nativeLocalServicesRegistry.js';export{getNativeMoviesExperience,preloadNativeMoviesExperience,registerMoviesExperiencePreload,registerNativeMoviesExperience}from'./features/movies/nativeMoviesRegistry.js';export{getNativeExpensesExperience,preloadNativeExpensesExperience,registerExpensesExperiencePreload,registerNativeExpensesExperience}from'./features/expenses/nativeExpensesRegistry.js';export{getNativeWebBuilderExperience,preloadNativeWebBuilderExperience,registerNativeWebBuilderExperience,registerWebBuilderExperiencePreload}from'./features/webbuilder/nativeWebBuilderRegistry.js';export{NativeAgentChat}from'./features/agent-chat/NativeAgentChat.js';export{ChatLinkOpenerProvider}from'./features/links/ChatLinkOpenerProvider.js';export{resolveSurfaceAuthGraphqlUrl}from'./hooks/resolveSurfaceAuthGraphqlUrl.js';var index = new Feature(YantraMobileModule);export{index as default};//# sourceMappingURL=index.js.map
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["import { Feature } from '@common-stack/client-react';\nimport YantraMobileModule from './module';\n\nexport default new Feature(YantraMobileModule);\nexport * from './screens';\nexport { GatewayContextProvider, useGatewayContext } from './contexts/GatewayContext';\nexport { CdecliConnectionProvider, useCdecliConnection } from './contexts/CdecliConnectionContext';\nexport { ChatLiveStreamEngine } from './contexts/ChatLiveStreamContext';\nexport { MemoryPressureResponder } from './features/memory/MemoryPressureResponder';\nexport * from './config/constants';\nexport { config } from './config/env-config';\nexport { useCdecliAutoConnect } from './hooks/useCdecliAutoConnect';\nexport { useObtainSystemToken } from './hooks/useObtainSystemToken';\nexport {\n mintSurfaceSystemToken,\n resolveSurfaceCatalogBackend,\n resolveSurfaceAuthGraphqlUrl,\n} from './hooks/mintSurfaceSystemToken';\nexport { buildCdecliTokenInjection, buildSurfaceGateRecoveryScript } from './hooks/surfaceHandoffScript';\nexport { useGatewayConnection, isInstanceNotFoundError } from './hooks/useGatewayConnection';\nexport { usePrerequisiteIds } from './hooks/usePrerequisiteIds';\nexport { useWorkspaceProvisioner } from './hooks/useWorkspaceProvisioner';\nexport { useGatewayRegistry } from './hooks/useGatewayRegistry';\nexport * from './services';\nexport * from './bridge';\nexport {\n YantraBrandLoader,\n YANTRA_LOADER_SIZE_DEFAULT,\n YANTRA_LOADER_SIZE_COMPACT,\n} from './components/YantraBrandLoader';\nexport { default as CustomDrawer } from './components/CustomDrawer';\nexport { AppThemeProvider, useAppTheme } from './theme/AppThemeProvider';\n// Invite deep links. Mounted by the app at the root (see portable-devices/mobile\n// App.tsx) rather than routed to: the invitee has neither an org nor a session,\n// and every mobile route requires both.\nexport { InviteDeepLink } from './features/invite/InviteDeepLink';\nexport { ChatInviteDeepLink } from './features/messaging/ChatInviteDeepLink';\n// Apple Health / Health Connect sync. Mounted at the app root like the invite\n// handlers: it syncs on every return to the foreground, whatever screen is open.\nexport { HealthSyncRunner } from './features/health/HealthSyncRunner';\n// Fitness widgets (iOS): keeps the home / lock screen snapshot fresh, and opens the\n// Fitness surface when a widget or the workout Live Activity is tapped. Both at the root.\nexport { FitnessWidgetRunner } from './features/fitness-widgets/FitnessWidgetRunner';\nexport { FitnessDeepLink } from './features/fitness-widgets/FitnessDeepLink';\nexport { inviteTokenFromUrl, isInviteUrl } from './features/invite/inviteLink';\nexport { isKeyboardControllerAvailable } from './utils/keyboardController';\n// The canvas viewer seam. Exported from the index on purpose: the app (the MF\n// host) registers the federated viewer here and the CanvasBoard screen reads\n// it. Reachability from this entry is what makes rollup emit the registry as a\n// real shared module - as an internal-only file, `registerNativeCanvasViewer`\n// is never called inside the package, so rollup tree-shakes it and constant-\n// folds the screen down to its fallback branch.\nexport {\n registerNativeCanvasViewer,\n getNativeCanvasViewer,\n registerNativeCanvasExperience,\n getNativeCanvasExperience,\n registerCanvasExperiencePreload,\n preloadNativeCanvasExperience,\n} from './features/canvas/nativeViewerRegistry';\n// Characters seam - same reachability contract as the canvas registry above.\nexport {\n registerNativeCharactersExperience,\n getNativeCharactersExperience,\n} from './features/characters/nativeCharactersRegistry';\n// Chat seam - same reachability contract as the two registries above.\nexport { registerNativeChatExperience, getNativeChatExperience } from './features/messaging/nativeChatRegistry';\n// Chat push + notification preferences: the app (which owns expo-notifications and the\n// settings session) registers the token and serves the preferences through these.\nexport { rememberChatPushToken, forgetChatPushToken } from './features/messaging/chatPushToken';\nexport {\n CHAT_NOTIFICATION_CONFIG_KEY,\n CHAT_NOTIFICATION_KEYS,\n chatPrefsFromSettings,\n} from './features/messaging/chatNotificationPrefs';\nexport { settingsUriForAccount } from './utils/cdecodeUri';\nexport {\n registerNativeShoppingExperience,\n getNativeShoppingExperience,\n registerShoppingExperiencePreload,\n preloadNativeShoppingExperience,\n} from './features/shopping/nativeShoppingRegistry';\nexport type { ShoppingExperienceProps } from './features/shopping/ShoppingExperience';\nexport type { ShoppingHostChat } from './features/shopping/hostChat';\nexport {\n registerNativeTravelExperience,\n getNativeTravelExperience,\n registerTravelExperiencePreload,\n preloadNativeTravelExperience,\n} from './features/travel/nativeTravelRegistry';\nexport type { TravelExperienceProps } from './features/travel/TravelExperience';\nexport type { TravelHostChat } from './features/travel/hostChat';\nexport {\n registerNativeJobSearchExperience,\n getNativeJobSearchExperience,\n registerJobSearchExperiencePreload,\n preloadNativeJobSearchExperience,\n} from './features/job-search/nativeJobSearchRegistry';\nexport type { JobSearchExperienceProps } from './features/job-search/JobSearchExperience';\nexport type { JobSearchHostChat } from './features/job-search/hostChat';\nexport {\n registerNativeResumeExperience,\n getNativeResumeExperience,\n registerResumeExperiencePreload,\n preloadNativeResumeExperience,\n} from './features/resume/nativeResumeRegistry';\nexport type { ResumeExperienceProps } from './features/resume/ResumeExperience';\nexport type { ResumeHostChat } from './features/resume/hostChat';\nexport {\n registerNativeInboxExperience,\n getNativeInboxExperience,\n registerInboxExperiencePreload,\n preloadNativeInboxExperience,\n} from './features/inbox/nativeInboxRegistry';\nexport type { InboxExperienceProps } from './features/inbox/InboxExperience';\nexport type { InboxHostChat } from './features/inbox/hostChat';\nexport {\n registerNativeStudyExperience,\n getNativeStudyExperience,\n registerStudyExperiencePreload,\n preloadNativeStudyExperience,\n} from './features/study/nativeStudyRegistry';\nexport type { StudyExperienceProps } from './features/study/StudyExperience';\nexport type { StudyHostChat } from './features/study/hostChat';\nexport {\n registerNativeLocalServicesExperience,\n getNativeLocalServicesExperience,\n registerLocalServicesExperiencePreload,\n preloadNativeLocalServicesExperience,\n} from './features/local-services/nativeLocalServicesRegistry';\nexport type { LocalServicesExperienceProps } from './features/local-services/LocalServicesExperience';\nexport type { LocalServicesHostChat } from './features/local-services/hostChat';\nexport {\n registerNativeMoviesExperience,\n getNativeMoviesExperience,\n registerMoviesExperiencePreload,\n preloadNativeMoviesExperience,\n} from './features/movies/nativeMoviesRegistry';\nexport type { MoviesExperienceProps } from './features/movies/MoviesExperience';\nexport type { MoviesHostChat } from './features/movies/hostChat';\nexport {\n registerNativeExpensesExperience,\n getNativeExpensesExperience,\n registerExpensesExperiencePreload,\n preloadNativeExpensesExperience,\n} from './features/expenses/nativeExpensesRegistry';\nexport type { ExpensesExperienceProps } from './features/expenses/ExpensesExperience';\nexport type { ExpensesHostChat } from './features/expenses/hostChat';\nexport { NativeAgentChat } from './features/agent-chat';\nexport { ChatLinkOpenerProvider } from './features/links/ChatLinkOpenerProvider';\nexport type { AgentChatMessage, AgentChatSuggestion, NativeAgentChatProps } from './features/agent-chat';\nexport type {\n ChatHostServices,\n ChatViewer,\n FederatedChatProps,\n NativeChatExperienceProps,\n} from './features/messaging/chatHost';\n"],"names":[],"mappings":"kmMAEA,YAAe,IAAI,QAAQ,kBAAkB,CAAA"}
1
+ {"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["import { Feature } from '@common-stack/client-react';\nimport YantraMobileModule from './module';\n\nexport default new Feature(YantraMobileModule);\nexport * from './screens';\nexport { GatewayContextProvider, useGatewayContext } from './contexts/GatewayContext';\nexport { CdecliConnectionProvider, useCdecliConnection } from './contexts/CdecliConnectionContext';\nexport { ChatLiveStreamEngine } from './contexts/ChatLiveStreamContext';\nexport { MemoryPressureResponder } from './features/memory/MemoryPressureResponder';\nexport * from './config/constants';\nexport { config } from './config/env-config';\nexport { useCdecliAutoConnect } from './hooks/useCdecliAutoConnect';\nexport { useObtainSystemToken } from './hooks/useObtainSystemToken';\nexport {\n mintSurfaceSystemToken,\n resolveSurfaceCatalogBackend,\n resolveSurfaceAuthGraphqlUrl,\n} from './hooks/mintSurfaceSystemToken';\nexport { buildCdecliTokenInjection, buildSurfaceGateRecoveryScript } from './hooks/surfaceHandoffScript';\nexport { useGatewayConnection, isInstanceNotFoundError } from './hooks/useGatewayConnection';\nexport { usePrerequisiteIds } from './hooks/usePrerequisiteIds';\nexport { useWorkspaceProvisioner } from './hooks/useWorkspaceProvisioner';\nexport { useGatewayRegistry } from './hooks/useGatewayRegistry';\nexport * from './services';\nexport * from './bridge';\nexport {\n YantraBrandLoader,\n YANTRA_LOADER_SIZE_DEFAULT,\n YANTRA_LOADER_SIZE_COMPACT,\n} from './components/YantraBrandLoader';\nexport { default as CustomDrawer } from './components/CustomDrawer';\nexport { AppThemeProvider, useAppTheme } from './theme/AppThemeProvider';\n// Invite deep links. Mounted by the app at the root (see portable-devices/mobile\n// App.tsx) rather than routed to: the invitee has neither an org nor a session,\n// and every mobile route requires both.\nexport { InviteDeepLink } from './features/invite/InviteDeepLink';\nexport { ChatInviteDeepLink } from './features/messaging/ChatInviteDeepLink';\n// Apple Health / Health Connect sync. Mounted at the app root like the invite\n// handlers: it syncs on every return to the foreground, whatever screen is open.\nexport { HealthSyncRunner } from './features/health/HealthSyncRunner';\n// Fitness widgets (iOS): keeps the home / lock screen snapshot fresh, and opens the\n// Fitness surface when a widget or the workout Live Activity is tapped. Both at the root.\nexport { FitnessWidgetRunner } from './features/fitness-widgets/FitnessWidgetRunner';\nexport { FitnessDeepLink } from './features/fitness-widgets/FitnessDeepLink';\nexport { inviteTokenFromUrl, isInviteUrl } from './features/invite/inviteLink';\nexport { isKeyboardControllerAvailable } from './utils/keyboardController';\n// The canvas viewer seam. Exported from the index on purpose: the app (the MF\n// host) registers the federated viewer here and the CanvasBoard screen reads\n// it. Reachability from this entry is what makes rollup emit the registry as a\n// real shared module - as an internal-only file, `registerNativeCanvasViewer`\n// is never called inside the package, so rollup tree-shakes it and constant-\n// folds the screen down to its fallback branch.\nexport {\n registerNativeCanvasViewer,\n getNativeCanvasViewer,\n registerNativeCanvasExperience,\n getNativeCanvasExperience,\n registerCanvasExperiencePreload,\n preloadNativeCanvasExperience,\n} from './features/canvas/nativeViewerRegistry';\n// Characters seam - same reachability contract as the canvas registry above.\nexport {\n registerNativeCharactersExperience,\n getNativeCharactersExperience,\n} from './features/characters/nativeCharactersRegistry';\n// Chat seam - same reachability contract as the two registries above.\nexport { registerNativeChatExperience, getNativeChatExperience } from './features/messaging/nativeChatRegistry';\n// Chat push + notification preferences: the app (which owns expo-notifications and the\n// settings session) registers the token and serves the preferences through these.\nexport { rememberChatPushToken, forgetChatPushToken } from './features/messaging/chatPushToken';\nexport {\n CHAT_NOTIFICATION_CONFIG_KEY,\n CHAT_NOTIFICATION_KEYS,\n chatPrefsFromSettings,\n} from './features/messaging/chatNotificationPrefs';\nexport { settingsUriForAccount } from './utils/cdecodeUri';\nexport {\n registerNativeShoppingExperience,\n getNativeShoppingExperience,\n registerShoppingExperiencePreload,\n preloadNativeShoppingExperience,\n} from './features/shopping/nativeShoppingRegistry';\nexport type { ShoppingExperienceProps } from './features/shopping/ShoppingExperience';\nexport type { ShoppingHostChat } from './features/shopping/hostChat';\nexport {\n registerNativeTravelExperience,\n getNativeTravelExperience,\n registerTravelExperiencePreload,\n preloadNativeTravelExperience,\n} from './features/travel/nativeTravelRegistry';\nexport type { TravelExperienceProps } from './features/travel/TravelExperience';\nexport type { TravelHostChat } from './features/travel/hostChat';\nexport {\n registerNativeJobSearchExperience,\n getNativeJobSearchExperience,\n registerJobSearchExperiencePreload,\n preloadNativeJobSearchExperience,\n} from './features/job-search/nativeJobSearchRegistry';\nexport type { JobSearchExperienceProps } from './features/job-search/JobSearchExperience';\nexport type { JobSearchHostChat } from './features/job-search/hostChat';\nexport {\n registerNativeResumeExperience,\n getNativeResumeExperience,\n registerResumeExperiencePreload,\n preloadNativeResumeExperience,\n} from './features/resume/nativeResumeRegistry';\nexport type { ResumeExperienceProps } from './features/resume/ResumeExperience';\nexport type { ResumeHostChat } from './features/resume/hostChat';\nexport {\n registerNativeInboxExperience,\n getNativeInboxExperience,\n registerInboxExperiencePreload,\n preloadNativeInboxExperience,\n} from './features/inbox/nativeInboxRegistry';\nexport type { InboxExperienceProps } from './features/inbox/InboxExperience';\nexport type { InboxHostChat } from './features/inbox/hostChat';\nexport {\n registerNativeStudyExperience,\n getNativeStudyExperience,\n registerStudyExperiencePreload,\n preloadNativeStudyExperience,\n} from './features/study/nativeStudyRegistry';\nexport type { StudyExperienceProps } from './features/study/StudyExperience';\nexport type { StudyHostChat } from './features/study/hostChat';\nexport {\n registerNativeLocalServicesExperience,\n getNativeLocalServicesExperience,\n registerLocalServicesExperiencePreload,\n preloadNativeLocalServicesExperience,\n} from './features/local-services/nativeLocalServicesRegistry';\nexport type { LocalServicesExperienceProps } from './features/local-services/LocalServicesExperience';\nexport type { LocalServicesHostChat } from './features/local-services/hostChat';\nexport {\n registerNativeMoviesExperience,\n getNativeMoviesExperience,\n registerMoviesExperiencePreload,\n preloadNativeMoviesExperience,\n} from './features/movies/nativeMoviesRegistry';\nexport type { MoviesExperienceProps } from './features/movies/MoviesExperience';\nexport type { MoviesHostChat } from './features/movies/hostChat';\nexport {\n registerNativeExpensesExperience,\n getNativeExpensesExperience,\n registerExpensesExperiencePreload,\n preloadNativeExpensesExperience,\n} from './features/expenses/nativeExpensesRegistry';\nexport type { ExpensesExperienceProps } from './features/expenses/ExpensesExperience';\nexport type { ExpensesHostChat } from './features/expenses/hostChat';\nexport {\n registerNativeWebBuilderExperience,\n getNativeWebBuilderExperience,\n registerWebBuilderExperiencePreload,\n preloadNativeWebBuilderExperience,\n} from './features/webbuilder/nativeWebBuilderRegistry';\nexport type { WebBuilderExperienceProps } from './features/webbuilder/WebBuilderExperience';\nexport type { WebBuilderHostChat } from './features/webbuilder/hostChat';\nexport { NativeAgentChat } from './features/agent-chat';\nexport { ChatLinkOpenerProvider } from './features/links/ChatLinkOpenerProvider';\nexport type { AgentChatMessage, AgentChatSuggestion, NativeAgentChatProps } from './features/agent-chat';\nexport type {\n ChatHostServices,\n ChatViewer,\n FederatedChatProps,\n NativeChatExperienceProps,\n} from './features/messaging/chatHost';\n"],"names":[],"mappings":"wyMAEA,YAAe,IAAI,QAAQ,kBAAkB,CAAA"}
package/lib/routes.json CHANGED
@@ -210,6 +210,58 @@
210
210
  "hasComponent": true
211
211
  }
212
212
  },
213
+ {
214
+ "/:orgName/devices": {
215
+ "key": "devices",
216
+ "path": "/:orgName/devices",
217
+ "name": "Devices",
218
+ "exact": true,
219
+ "priority": 3,
220
+ "hideInMenu": true,
221
+ "auth": true,
222
+ "importPaths": {
223
+ "navigationHeader": "@adminide-stack/yantra-mobile/lib/components/NavigationHeader/NavigationHeader.js"
224
+ },
225
+ "customHeader": {
226
+ "name": "NavigationHeader",
227
+ "component": "$.importPaths.navigationHeader",
228
+ "props": {
229
+ "showTitle": false,
230
+ "showToggle": false,
231
+ "showFilter": false,
232
+ "isSearchBack": false,
233
+ "showBack": false,
234
+ "showGateway": false,
235
+ "showHistory": false,
236
+ "showNewChat": false
237
+ }
238
+ },
239
+ "props": {
240
+ "initialParams": {
241
+ "orgName": null,
242
+ "hideNavigationHeader": true
243
+ },
244
+ "options": {
245
+ "title": "Devices",
246
+ "headerTintColor": "black",
247
+ "headerTitleStyle": {
248
+ "fontWeight": "bold"
249
+ },
250
+ "drawerItemStyle": {
251
+ "display": "none"
252
+ },
253
+ "headerTitleAlign": "center",
254
+ "gestureEnabled": true,
255
+ "swipeEnabled": false,
256
+ "animation": "fade",
257
+ "animationTypeForReplace": "pop",
258
+ "keyboardHandlingEnabled": true
259
+ }
260
+ },
261
+ "componentPath": "@adminide-stack/yantra-mobile/lib/screens/Devices/index.js",
262
+ "hasComponent": true
263
+ }
264
+ },
213
265
  {
214
266
  "/:orgName/chathistory": {
215
267
  "key": "chathistory",
@@ -1069,6 +1121,60 @@
1069
1121
  "hasComponent": true
1070
1122
  }
1071
1123
  },
1124
+ {
1125
+ "/:orgName/c/webbuilder-native": {
1126
+ "key": "webbuilder-native",
1127
+ "path": "/:orgName/c/webbuilder-native",
1128
+ "name": "WebBuilderNative",
1129
+ "exact": true,
1130
+ "priority": 4,
1131
+ "hideInMenu": true,
1132
+ "auth": true,
1133
+ "menu_position": "side",
1134
+ "importPaths": {
1135
+ "navigationHeader": "@adminide-stack/yantra-mobile/lib/components/NavigationHeader/NavigationHeader.js"
1136
+ },
1137
+ "customHeader": {
1138
+ "name": "NavigationHeader",
1139
+ "component": "$.importPaths.navigationHeader",
1140
+ "props": {
1141
+ "showTitle": true,
1142
+ "showToggle": false,
1143
+ "showFilter": false,
1144
+ "isSearchBack": false,
1145
+ "showBack": true,
1146
+ "showGateway": false,
1147
+ "showHistory": false,
1148
+ "showNewChat": false
1149
+ }
1150
+ },
1151
+ "props": {
1152
+ "initialParams": {
1153
+ "orgName": null,
1154
+ "hideNavigationHeader": true
1155
+ },
1156
+ "options": {
1157
+ "title": "Web Builder",
1158
+ "headerTintColor": "black",
1159
+ "headerTitleStyle": {
1160
+ "fontWeight": "bold"
1161
+ },
1162
+ "drawerItemStyle": {
1163
+ "display": "none"
1164
+ },
1165
+ "headerTitleAlign": "left",
1166
+ "gestureEnabled": false,
1167
+ "swipeEnabled": false,
1168
+ "animation": "fade",
1169
+ "animationTypeForReplace": "pop",
1170
+ "keyboardHandlingEnabled": false,
1171
+ "freezeOnBlur": true
1172
+ }
1173
+ },
1174
+ "componentPath": "@adminide-stack/yantra-mobile/lib/screens/WebBuilderNative/index.js",
1175
+ "hasComponent": true
1176
+ }
1177
+ },
1072
1178
  {
1073
1179
  "/:orgName/c/travel-native": {
1074
1180
  "key": "travel-native",
@@ -0,0 +1,71 @@
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;
3
+ const {
4
+ isDark
5
+ } = useAppTheme();
6
+ const navigation = useNavigation();
7
+ const route = useRoute();
8
+ const routeOrg = typeof ((_a = route.params) == null ? void 0 : _a.orgName) === "string" ? route.params.orgName.trim() : "";
9
+ const Experience = getNativeWebBuilderExperience();
10
+ const host = useWebBuilderHost(routeOrg || void 0);
11
+ useLayoutEffect(() => {
12
+ var _a2;
13
+ if (!((_a2 = route.params) == null ? void 0 : _a2.hideNavigationHeader)) navigation.setParams({
14
+ hideNavigationHeader: true
15
+ });
16
+ }, [navigation, (_b = route.params) == null ? void 0 : _b.hideNavigationHeader]);
17
+ const seed = useMemo(() => {
18
+ var _a2, _b2;
19
+ const query = typeof ((_a2 = route.params) == null ? void 0 : _a2.initialAgentQuery) === "string" ? route.params.initialAgentQuery.trim() : "";
20
+ const files = Array.isArray((_b2 = route.params) == null ? void 0 : _b2.initialAgentAttachments) ? route.params.initialAgentAttachments : void 0;
21
+ if (!query && !(files == null ? void 0 : files.length)) return null;
22
+ return {
23
+ text: query,
24
+ files
25
+ };
26
+ }, [(_c = route.params) == null ? void 0 : _c.initialAgentQuery, (_d = route.params) == null ? void 0 : _d.initialAgentAttachments]);
27
+ const onExit = useCallback(() => {
28
+ var _a2;
29
+ if ((_a2 = navigation.canGoBack) == null ? void 0 : _a2.call(navigation)) navigation.goBack();
30
+ else navigation.navigate("MainStack.Layout.Home");
31
+ }, [navigation]);
32
+ if (!Experience) {
33
+ return /* @__PURE__ */ jsx(SafeAreaView, { style: [styles.fill, isDark && styles.fillDark], children: /* @__PURE__ */ jsxs(View, { style: styles.center, children: [
34
+ /* @__PURE__ */ jsx(Text, { style: [styles.title, isDark && styles.textLight], children: "Native web builder unavailable" }),
35
+ /* @__PURE__ */ jsx(Text, { style: [styles.detail, isDark && styles.textMuted], children: "This build does not carry the federation host runtime." })
36
+ ] }) });
37
+ }
38
+ 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, initialAgentSeed: seed }) });
39
+ }
40
+ const styles = StyleSheet.create({
41
+ fill: {
42
+ flex: 1,
43
+ backgroundColor: "#f5f6f8"
44
+ },
45
+ fillDark: {
46
+ backgroundColor: "#0c0e14"
47
+ },
48
+ center: {
49
+ flex: 1,
50
+ alignItems: "center",
51
+ justifyContent: "center",
52
+ padding: 24
53
+ },
54
+ title: {
55
+ fontSize: 15,
56
+ fontWeight: "600",
57
+ color: "#111827",
58
+ marginBottom: 6
59
+ },
60
+ detail: {
61
+ fontSize: 13,
62
+ color: "#5d6575",
63
+ textAlign: "center"
64
+ },
65
+ textLight: {
66
+ color: "#eceff6"
67
+ },
68
+ textMuted: {
69
+ color: "#9ca4b6"
70
+ }
71
+ });export{WebBuilderNativeScreen as default};//# sourceMappingURL=index.js.map
@@ -0,0 +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":"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"}