@adminide-stack/yantra-mobile 12.0.53-alpha.0 → 12.0.53-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/components/KeyboardComposerDock.js +41 -5
- package/lib/components/KeyboardComposerDock.js.map +1 -1
- package/lib/features/attachments/ComposerAttachMenu.js +189 -0
- package/lib/features/attachments/ComposerAttachMenu.js.map +1 -0
- package/lib/features/attachments/useImageAttachments.js +23 -15
- package/lib/features/attachments/useImageAttachments.js.map +1 -1
- package/lib/features/canvas/canvasBoardsSnapshot.js +37 -0
- package/lib/features/canvas/canvasBoardsSnapshot.js.map +1 -0
- package/lib/features/canvas/nativeViewerRegistry.js +9 -1
- package/lib/features/canvas/nativeViewerRegistry.js.map +1 -1
- package/lib/features/chat/chatHistorySnapshot.js +103 -0
- package/lib/features/chat/chatHistorySnapshot.js.map +1 -0
- package/lib/graphql/typePolicies.js +139 -0
- package/lib/graphql/typePolicies.js.map +1 -0
- package/lib/hooks/useChatApi.js +8 -1
- package/lib/hooks/useChatApi.js.map +1 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/module.js +5 -2
- package/lib/module.js.map +1 -1
- package/lib/screens/Chat/index.js +7 -35
- package/lib/screens/Chat/index.js.map +1 -1
- package/lib/screens/Home/HomeScreen.js +18 -31
- package/lib/screens/Home/HomeScreen.js.map +1 -1
- package/lib/screens/Home/components/CanvasPrewarm.js +3 -2
- package/lib/screens/Home/components/CanvasPrewarm.js.map +1 -1
- package/lib/screens/Home/components/ChatHistoryLanding.js +44 -8
- package/lib/screens/Home/components/ChatHistoryLanding.js.map +1 -1
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useChatApi.js","sources":["../../src/hooks/useChatApi.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { useApolloClient } from '@apollo/client';\nimport { AiAgentMessageRole, PostTypeEnum, RoomType, SortEnum } from 'common';\nimport {\n GetChannelsByUserWithLastMessageDocument,\n MessagesDocument,\n useAddChannelMutation,\n useGetChannelsByUserWithLastMessageQuery,\n useMessagesQuery,\n useSendMessagesMutation,\n} from 'common/graphql';\nimport type {\n IAccountCreateChatSessionInput,\n IAccountSaveChatMessagesInput as IAccountSaveChatMessagesInputBase,\n} from 'common/server';\nimport { useCallback, useMemo } from 'react';\nimport { v4 as uuidv4 } from 'uuid';\nimport {\n attachmentsFromUserContent,\n historyAttachmentTitle,\n isAttachedCaption,\n} from '../features/attachments/historyAttachmentLabel';\n\nconst MESSAGES_PAGE_LIMIT = 100;\n\n/** Same variables as web Inbox / AIAgent: list AI assistant channels for the current user. */\nexport const AI_ASSISTANT_CHANNELS_QUERY_VARS = {\n criteria: { type: RoomType.Aiassistant },\n limit: 100,\n skip: 0,\n sort: { key: 'updatedAt', value: SortEnum.Desc },\n};\n\n/** First paint of Chat history. Keep this small — each row ships `lastMessage`. */\nexport const HISTORY_PAGE_SIZE = 10;\n/** User-prompt overlay for the first page. Posts, not channels — a few extras cover replies. */\nconst HISTORY_TITLE_OVERLAY_LIMIT = 20;\n\n/**\n * Variables for the channels-based chat history list (`ChatHistoryLanding`).\n *\n * IMPORTANT: pass the user's org `slug` (e.g. `tarun-upadhyay-qraw`) so the\n * `channelsByUser` resolver's `$in: [criteria.orgName, orgId]` includes\n * channels stored under the slug. When `criteria.orgName` is omitted, the\n * `$in` collapses to just `[orgId]` and channels saved with the slug as\n * `orgName` (the mobile create path) never match. That's the cause of the\n * silently-empty history screen.\n *\n * Kept as a builder (not a constant) because the slug varies per user and\n * because Apollo treats different `variables` as different cached entries —\n * if the create mutation refetches a no-orgName variant, the orgName-variant\n * the screen watches stays stale.\n */\nexport function getHistoryChannelsQueryVariables(orgName?: string | null, options?: { skip?: number; limit?: number }) {\n const trimmedOrg = typeof orgName === 'string' && orgName.trim().length > 0 ? orgName.trim() : undefined;\n return {\n criteria: {\n type: RoomType.Aiassistant,\n ...(trimmedOrg ? { orgName: trimmedOrg } : {}),\n },\n limit: options?.limit ?? HISTORY_PAGE_SIZE,\n skip: options?.skip ?? 0,\n sort: { key: 'updatedAt' as const, value: SortEnum.Desc },\n };\n}\n\n/** @deprecated Use {@link getHistoryChannelsQueryVariables} so `orgName` is included. */\nexport const HISTORY_QUERY_BASE = getHistoryChannelsQueryVariables();\n\nfunction normalizeOptionalString(value: string | null | undefined): string | undefined {\n return typeof value === 'string' && value.trim().length > 0 ? value.trim() : undefined;\n}\n\n/** Cache slots the history list watches — used to prepend a created channel without refetching. */\nexport function getChatHistoryChannelRefetchQueries(orgName?: string | null) {\n const trimmedOrg = normalizeOptionalString(orgName);\n return [\n { query: GetChannelsByUserWithLastMessageDocument, variables: AI_ASSISTANT_CHANNELS_QUERY_VARS },\n ...(trimmedOrg\n ? [\n {\n query: GetChannelsByUserWithLastMessageDocument,\n variables: getHistoryChannelsQueryVariables(trimmedOrg),\n },\n ]\n : []),\n { query: GetChannelsByUserWithLastMessageDocument, variables: HISTORY_QUERY_BASE },\n ];\n}\n\nfunction getThreadMessagesQueryVariables(sessionId: string) {\n return {\n channelId: sessionId,\n limit: MESSAGES_PAGE_LIMIT,\n skip: 0,\n sort: { key: 'createdAt' as const, value: SortEnum.Asc },\n };\n}\n\n/**\n * Variables for the chat-history feed on the mobile `ChatHistory` screen.\n *\n * First page uses `HISTORY_PAGE_SIZE` (10) channels; \"Load older\" paginates by\n * the same page size. Overlay titles fetch `HISTORY_TITLE_OVERLAY_LIMIT` posts.\n *\n * This query intentionally hits `messages` (not `channelsByUser`) — the same\n * pattern the web sidebar uses (`useNewChatPageHistorySessions`). Reasons:\n * 1. `channelsByUser` is server-side gated by an injected `orgName` /\n * `members` filter that can mismatch when channels were stored with an\n * org slug while the resolver injects the org id. The `messages`\n * resolver filters Post directly by `editedBy: accountId`, so the\n * user's own AI-assistant posts always show up.\n * 2. The user-authored post IS the conversation's natural title — no need\n * to walk `lastMessage.propsConfiguration.contents.parent` to recover\n * the original prompt.\n *\n * - `type: AIASSISTANT` scopes to AI chat (not direct/service rooms).\n * - `editedBy: accountUserId` scopes to the current user's own posts.\n * Assistant replies are skipped in JS so a missing `props.role` still\n * keeps the user prompt as the row title.\n */\nexport function getChatHistoryMessagesQueryVariables(\n accountUserId: string,\n options?: { skip?: number; limit?: number },\n) {\n return {\n limit: options?.limit ?? HISTORY_PAGE_SIZE,\n skip: options?.skip ?? 0,\n sort: { key: 'updatedAt' as const, value: SortEnum.Desc },\n type: PostTypeEnum.Aiassistant,\n editedBy: accountUserId,\n };\n}\n\nexport type ChatHistoryMode = 'chat' | 'deep-search' | 'build';\n\nexport interface ChatHistorySession {\n /** Channel id — used to navigate to the Chat screen. */\n channelId: string;\n /** User's most recent prompt in this channel (used as the row title). */\n title: string;\n /** Second line: latest post `message` field (same as Manus subtitle). */\n preview: string;\n /** Conversation mode (chat / deep-search / build), inferred from channel title or last message. */\n mode: ChatHistoryMode;\n /** Most-recent activity timestamp (sort key + bucket key for Today/Yesterday/…). */\n updatedAt: Date;\n createdAt: Date;\n /**\n * True when no concrete prompt was recoverable (no parent, no user turn, no\n * meaningful channel.title). UI renders the title in a quieter style.\n */\n isPlaceholder: boolean;\n /** First turn was a file send (`Attached: …`). Row uses a paperclip tile + \"New chat\". */\n isAttachment?: boolean;\n}\n\n/**\n * Collapse a list of user-authored AI assistant posts (newest first) into one\n * row per channel. First post per `channel.id` wins the title, which — because\n * the query is sorted by `updatedAt DESC` — is the user's latest prompt in\n * that channel. Posts whose `channel.id` is missing (unexpected, but possible\n * if the resolver omits the relation) are skipped.\n */\nexport function chatHistorySessionsFromMessages(\n data: { messages?: { data?: unknown[] | null } | null } | null | undefined,\n): ChatHistorySession[] {\n const rows = data?.messages?.data;\n if (!rows?.length) return [];\n\n const seen = new Set<string>();\n const sessions: ChatHistorySession[] = [];\n\n for (const post of rows as any[]) {\n const channelId =\n post?.channel?.id != null ? String(post.channel.id) : typeof post?.channel === 'string' ? post.channel : '';\n if (!channelId || seen.has(channelId)) continue;\n\n const rawTitle = String(post?.message ?? '')\n .replace(/\\s+/g, ' ')\n .trim();\n const role = String(\n post?.props?.role ??\n post?.propsConfiguration?.contents?.role ??\n post?.propsConfiguration?.content?.role ??\n '',\n ).toUpperCase();\n if (isTransientHistoryText(rawTitle) || looksLikeAssistantReply(rawTitle, role)) continue;\n\n seen.add(channelId);\n const updatedAt = post?.updatedAt ? new Date(post.updatedAt) : new Date();\n const createdAt = post?.createdAt ? new Date(post.createdAt) : updatedAt;\n const isAttachment = isAttachedCaption(rawTitle);\n const title = isAttachment ? historyAttachmentTitle(rawTitle) : rawTitle || 'New chat';\n\n sessions.push({\n channelId,\n title,\n preview: '',\n mode: 'chat',\n updatedAt,\n createdAt,\n isPlaceholder: !rawTitle && !isAttachment,\n isAttachment,\n });\n }\n\n return sessions;\n}\n\n/**\n * Mobile parity hook for the web sidebar's `useNewChatPageHistorySessions`.\n *\n * Returns one row per channel where the user has authored at least one AI assistant\n * post, with the title taken from that user's latest prompt. Skipped when\n * `accountUserId` isn't known yet (we don't want to fire a query without it).\n */\nexport function useChatHistorySessionsFromMessages(\n accountUserId: string | null | undefined,\n options?: { skip?: boolean },\n) {\n const skip = options?.skip || !accountUserId;\n const { data, loading, error, refetch } = useMessagesQuery({\n variables: accountUserId\n ? getChatHistoryMessagesQueryVariables(accountUserId, { limit: HISTORY_TITLE_OVERLAY_LIMIT })\n : undefined,\n skip,\n // cache-first + `messages` typePolicy (keyed by editedBy/type/props).\n // Later visits read the cache — no repeated network hit.\n fetchPolicy: 'cache-first',\n nextFetchPolicy: 'cache-first',\n context: { cacheKey: 'new-chat-history-messages' },\n });\n\n const sessions = useMemo(() => chatHistorySessionsFromMessages(data), [data]);\n const sourcePostCount = data?.messages?.data?.length ?? 0;\n\n return { sessions, loading, error, refetch, sourcePostCount };\n}\n\n/* -------------------------------------------------------------------------- */\n/* Channels-based chat history (parent + lastMessage) */\n/* -------------------------------------------------------------------------- */\n\ninterface ChannelLastMessageLike {\n message?: string | null;\n createdAt?: string | null;\n updatedAt?: string | null;\n props?: { role?: string | null; mode?: string | null } | null;\n propsConfiguration?: {\n contents?: {\n role?: string | null;\n mode?: string | null;\n template?: string | null;\n parent?: {\n message?: string | null;\n props?: { role?: string | null } | null;\n } | null;\n fragment?: {\n title?: string | null;\n sandboxUrl?: string | null;\n sandboxId?: string | null;\n } | null;\n } | null;\n content?: { role?: string | null; mode?: string | null } | null;\n } | null;\n}\n\ninterface ChannelLike {\n id?: string | null;\n type?: string | null;\n displayName?: string | null;\n title?: string | null;\n createdAt?: string | null;\n updatedAt?: string | null;\n lastMessage?: ChannelLastMessageLike | null;\n}\n\nfunction getLastMessageRole(lastMessage: ChannelLastMessageLike | null | undefined): string {\n return String(\n lastMessage?.propsConfiguration?.contents?.role ??\n lastMessage?.propsConfiguration?.content?.role ??\n lastMessage?.props?.role ??\n '',\n ).toUpperCase();\n}\n\nfunction getParentUserPrompt(lastMessage: ChannelLastMessageLike | null | undefined): string {\n const parent = lastMessage?.propsConfiguration?.contents?.parent;\n if (!parent) return '';\n return String(parent?.message ?? '').trim();\n}\n\nfunction isBuildLastMessage(lastMessage: ChannelLastMessageLike | null | undefined): boolean {\n if (!lastMessage) return false;\n const contents = lastMessage.propsConfiguration?.contents;\n const mode = String(\n contents?.mode ?? lastMessage.propsConfiguration?.content?.mode ?? lastMessage?.props?.mode ?? '',\n ).toLowerCase();\n if (mode === 'build' || mode === 'workflow') return true;\n const fragment = contents?.fragment;\n if (fragment?.sandboxUrl || fragment?.sandboxId) return true;\n if (String(contents?.template ?? '').trim()) return true;\n return false;\n}\n\nfunction detectMode(channel: ChannelLike): ChatHistoryMode {\n if (isBuildLastMessage(channel?.lastMessage)) {\n return 'build';\n }\n const display = String(channel?.displayName ?? '').toLowerCase();\n const title = String(channel?.title ?? '').toLowerCase();\n if (display.startsWith('build-channel') || title.startsWith('build-channel') || title.startsWith('build channel')) {\n return 'build';\n }\n const parent = getParentUserPrompt(channel?.lastMessage).toLowerCase();\n if (/^build\\s*me\\s*:/.test(parent)) {\n return 'build';\n }\n if (display.startsWith('deep-search') || title.startsWith('deep search') || title.startsWith('deep-search')) {\n return 'deep-search';\n }\n return 'chat';\n}\n\n/**\n * Drop the internal slug we use as `channel.title` for server-side mode detection\n * (`chat-channel-<uuid>` / `deep-search-<uuid>`) so it doesn't leak into the row\n * label. The server sometimes also reformats this slug into `displayName` as\n * title-cased text with spaces (e.g. `\"Deep Search b64be4f7 9fe6 …\"`) — those\n * are equally machine-generated and must NOT be shown to the user.\n *\n * Pattern accepts:\n * • `deep-search-<uuid>` / `chat-channel-<uuid>` (raw, mode signal)\n * • `Deep Search <uuid>` / `Chat Channel <uuid>` (display-cased, server-reformatted)\n * • UUID may use hyphens, spaces, or be partially truncated as long as the\n * trailing chunk is hex.\n */\nfunction cleanChannelTitle(rawTitle: string | null | undefined): string {\n const t = String(rawTitle ?? '').trim();\n if (!t) return '';\n if (/^(chat[\\s-]channel|deep[\\s-]search|build[\\s-]channel)[\\s-][0-9a-f][0-9a-f\\s-]{7,}\\.?$/i.test(t)) return '';\n // Creation defaults carry no meaning either (parity with the browser sidebar).\n if (/^(new chat|workflow|deep search)$/i.test(t)) return '';\n return t;\n}\n\n/** `[Active connectors: …]` routing prefix on persisted gateway user posts. */\nconst ACTIVE_CONNECTORS_PREFIX_RE = /^\\s*\\[Active connectors:[^\\]]*\\]\\s*/i;\n\nfunction cleanMessageText(raw: string): string {\n return raw.replace(ACTIVE_CONNECTORS_PREFIX_RE, '').replace(/\\s+/g, ' ').trim();\n}\n\n/** Status / tool stubs that must not become a history title or subtitle. */\nfunction isTransientHistoryText(text: string): boolean {\n const t = cleanMessageText(text);\n if (!t) return true;\n if (/^thinking[.…]*$/i.test(t)) return true;\n if (/^let me check on that requested skill/i.test(t)) return true;\n if (/^(working on it|one moment|just a (sec|second|moment))[.…]*$/i.test(t)) return true;\n if (/^[⚙️⚠]/.test(t)) return true;\n return false;\n}\n\nfunction looksLikeAssistantReply(text: string, role: string): boolean {\n if (role === 'ASSISTANT' || role === 'AI' || role === 'BOT' || role === 'AGENT') return true;\n if (role === 'USER') return false;\n const t = text.trim();\n if (/^(let me |i'll |i will |sure[,.] |here's |here is )/i.test(t)) return true;\n if (t.length > 180) return true;\n return false;\n}\n\nfunction cleanHistoryPreview(raw: string): string {\n let t = cleanMessageText(raw);\n t = t.replace(/^(thinking[.…]*\\s*)+/i, '').trim();\n t = t.replace(/^let me check on that requested skill[^\\n.!?]*[.!?-]?\\s*/i, '').trim();\n t = t.replace(/^(?:⚙️[^\\n]*\\n)+\\s*/g, '').trim();\n return t;\n}\n\n/**\n * Map one channel into a session row (Manus-style two-line list):\n *\n * **Title (line 1):** `lastMessage.propsConfiguration.contents.parent.message`\n * when present (the user turn the thread is anchored on). Otherwise fall back\n * to the last post body if that post is still a user message, then a\n * machine-slug-stripped channel title, then a machine-slug-stripped\n * `displayName`, then `\"Thinking…\"`. Machine slugs (`deep-search-<uuid>`,\n * `chat-channel-<uuid>`, and their server-reformatted display variants)\n * are filtered via `cleanChannelTitle`, so they never reach the row.\n *\n * **Preview (line 2):** `lastMessage.message` as returned by the API (trimmed,\n * whitespace collapsed). Agent errors that start with `⚠` stay visible in the\n * subtitle, matching the reference UI.\n *\n * If preview text equals the title after trim, the second line is omitted\n * (single-line channel, no duplicate).\n */\nexport function buildSessionFromChannel(channel: ChannelLike): ChatHistorySession | null {\n const channelId = String(channel?.id ?? '');\n if (!channelId) return null;\n\n const lastMessage = channel?.lastMessage ?? null;\n const lastMessageRole = getLastMessageRole(lastMessage);\n const parentTrimmed = cleanHistoryPreview(getParentUserPrompt(lastMessage));\n const lastBody = cleanHistoryPreview(String(lastMessage?.message ?? ''));\n const userTurn = lastMessageRole === 'USER' && lastBody ? lastBody : '';\n const cleanedChannelTitle = cleanChannelTitle(channel?.title);\n /**\n * Apply the same machine-slug cleaner to `displayName`. The server\n * sometimes derives displayName from the title (`\"deep-search-<uuid>\"`\n * → `\"Deep Search <uuid>\"`), so without this the slug bypasses\n * `cleanedChannelTitle` and lands directly in the row label.\n */\n const cleanedDisplayName = cleanChannelTitle(channel?.displayName);\n\n let resolvedTitle = cleanedChannelTitle || parentTrimmed || userTurn || cleanedDisplayName;\n if (\n !resolvedTitle &&\n lastBody &&\n !isTransientHistoryText(lastBody) &&\n !looksLikeAssistantReply(lastBody, lastMessageRole)\n ) {\n resolvedTitle = lastBody;\n }\n if (!resolvedTitle) {\n const rawDefault = String(channel?.title ?? '').trim();\n if (rawDefault && !/^(chat[\\s-]channel|deep[\\s-]search)[\\s-][0-9a-f][0-9a-f\\s-]{7,}\\.?$/i.test(rawDefault)) {\n resolvedTitle = rawDefault;\n }\n }\n const isAttachment =\n isAttachedCaption(resolvedTitle) || isAttachedCaption(parentTrimmed) || isAttachedCaption(userTurn);\n if (isAttachment) resolvedTitle = historyAttachmentTitle(resolvedTitle);\n const isPlaceholder = !resolvedTitle;\n if (isPlaceholder) resolvedTitle = 'New chat';\n\n let preview = lastBody;\n if (\n isTransientHistoryText(preview) ||\n isAttachedCaption(preview) ||\n preview === resolvedTitle ||\n preview === parentTrimmed\n ) {\n preview = '';\n }\n if (lastMessageRole === 'USER' && !looksLikeAssistantReply(lastBody, lastMessageRole)) {\n preview = '';\n }\n\n const sortAt = (() => {\n const candidates = [channel?.updatedAt, lastMessage?.updatedAt, lastMessage?.createdAt, channel?.createdAt];\n for (const candidate of candidates) {\n if (candidate) {\n const t = new Date(candidate).getTime();\n if (Number.isFinite(t) && t > 0) return t;\n }\n }\n return Date.now();\n })();\n\n const createdAtRaw = channel?.createdAt ? new Date(channel.createdAt).getTime() : sortAt;\n\n return {\n channelId,\n title: resolvedTitle,\n preview,\n mode: detectMode(channel),\n updatedAt: new Date(sortAt),\n createdAt: new Date(Number.isFinite(createdAtRaw) ? createdAtRaw : sortAt),\n isPlaceholder,\n isAttachment,\n };\n}\n\n/** Collapse a `channelsByUser` response into session rows for the history list. */\nexport function chatHistorySessionsFromChannels(\n data: { channelsByUser?: (ChannelLike | null)[] | null } | null | undefined,\n): ChatHistorySession[] {\n const channels = (data?.channelsByUser ?? []) as (ChannelLike | null)[];\n return channels\n .filter((c): c is ChannelLike => Boolean(c?.id) && (!c?.type || c.type === RoomType.Aiassistant))\n .map((c) => buildSessionFromChannel(c))\n .filter((row): row is ChatHistorySession => row !== null)\n .sort((a, b) => b.updatedAt.getTime() - a.updatedAt.getTime());\n}\n\n/** Survives ChatHistory unmount so returning from a thread does not flash \"New chat\". */\nconst rememberedHistoryTitles = new Map<string, { title: string; isAttachment?: boolean }>();\n\nexport function resetRememberedHistoryTitles(): void {\n rememberedHistoryTitles.clear();\n}\n\nfunction rememberHistoryTitle(session: ChatHistorySession): void {\n if (session.isPlaceholder) return;\n const title = session.title?.trim();\n if (!title || /^new chat$/i.test(title) || isTransientHistoryText(title)) return;\n rememberedHistoryTitles.set(session.channelId, { title, isAttachment: session.isAttachment });\n}\n\nfunction applyRememberedHistoryTitles(rows: ChatHistorySession[]): ChatHistorySession[] {\n return rows.map((row) => {\n rememberHistoryTitle(row);\n if (!row.isPlaceholder && !/^new chat$/i.test(row.title)) return row;\n const mem = rememberedHistoryTitles.get(row.channelId);\n if (!mem) return row;\n return {\n ...row,\n title: mem.title,\n isPlaceholder: false,\n isAttachment: mem.isAttachment || row.isAttachment,\n };\n });\n}\n\n/**\n * Overlay user-authored prompts from `messages` onto channel rows whose\n * lastMessage never carried `parent.message` (typical cdecli/gateway chats).\n */\nexport function enrichHistorySessionsWithUserPrompts(\n fromChannels: ChatHistorySession[],\n fromMessages: ChatHistorySession[],\n): ChatHistorySession[] {\n if (!fromMessages.length) return applyRememberedHistoryTitles(fromChannels);\n const byId = new Map(fromMessages.map((session) => [session.channelId, session]));\n const merged = fromChannels.map((row) => {\n const fromUser = byId.get(row.channelId);\n if (!fromUser?.title || isTransientHistoryText(fromUser.title)) return row;\n const titleMissing = row.isPlaceholder || isTransientHistoryText(row.title) || /^new chat$/i.test(row.title);\n if (!titleMissing) {\n return row.preview ? row : { ...row, preview: fromUser.preview || row.preview };\n }\n return {\n ...row,\n title: fromUser.title,\n preview: row.preview && !isTransientHistoryText(row.preview) ? row.preview : fromUser.preview,\n isPlaceholder: false,\n isAttachment: fromUser.isAttachment || row.isAttachment,\n };\n });\n const seen = new Set(merged.map((row) => row.channelId));\n for (const fromUser of fromMessages) {\n if (seen.has(fromUser.channelId)) continue;\n if (!fromUser.title || isTransientHistoryText(fromUser.title)) continue;\n seen.add(fromUser.channelId);\n merged.push(fromUser);\n }\n return applyRememberedHistoryTitles(merged);\n}\n\n/**\n * Chat history feed driven by `channelsByUser`. Each row: parent prompt as title,\n * `lastMessage.message` as subtitle (Manus-style), when the API provides them.\n *\n * Caller MUST pass `orgName` (the org slug). Without it, the resolver only\n * matches channels whose `orgName` field equals the user's `orgId`, which is\n * never the case for mobile-created channels (those store the slug). The hook\n * suspends the query (`skip: true`) until `orgName` is known, so we never\n * fire a guaranteed-empty request.\n *\n * Pagination is by channel count (one channel = one row in this query),\n * unlike the messages-based path which paginates by raw post rows.\n */\nexport function useChatHistorySessionsFromChannels(orgName: string | null | undefined, options?: { skip?: boolean }) {\n const skip = options?.skip || !orgName;\n const variables = useMemo(() => getHistoryChannelsQueryVariables(orgName), [orgName]);\n\n const { data, loading, error, refetch } = useGetChannelsByUserWithLastMessageQuery({\n variables,\n skip,\n // cache-first + `channelsByUser` typePolicy (keyArgs drop skip/limit/sort).\n // Later navigations read the canonical list from cache — no repeated\n // GetChannelsByUserWithLastMessage. Freshness comes from pull-to-refresh\n // / createChannel cache writes, not per-visit network hits.\n fetchPolicy: 'cache-first',\n nextFetchPolicy: 'cache-first',\n context: { cacheKey: 'chat-history-channels-list' },\n });\n\n const sessions = useMemo(() => chatHistorySessionsFromChannels(data), [data]);\n const sourceChannelCount = data?.channelsByUser?.length ?? 0;\n /**\n * `sessionsLoaded` means \"we have data we can show\", regardless of whether a\n * background revalidation is still in flight. Same contract as `messagesLoaded`\n * in `useChatMessages` — lets the screen show the cached list (or empty state)\n * immediately on revisit instead of flashing a loader for the network round-trip.\n */\n const sessionsLoaded = data !== undefined;\n\n return { sessions, loading, sessionsLoaded, error, refetch, sourceChannelCount };\n}\n\nfunction stripModelCostHeader(content: string): string {\n const normalized = content.replace(/\\r\\n/g, '\\n');\n return normalized.replace(\n /^\\s*(?:[^\\w\\n]+\\s*)?[a-z0-9][a-z0-9._-]*\\s*\\(\\s*\\$[\\d.]+\\s*\\/\\s*MTok\\s+in\\s*\\)\\s*\\n+/i,\n '',\n );\n}\n\nfunction sanitizeAssistantContentByRole(role: unknown, content: string): string {\n return role === 'assistant' ? stripModelCostHeader(content) : content;\n}\n\nfunction omitContent<T extends Record<string, any>>(value: T | null | undefined): Omit<T, 'content'> {\n const clone = { ...(value ?? {}) } as Record<string, any>;\n delete clone.content;\n return clone as Omit<T, 'content'>;\n}\n\nexport interface ChatSessionUI {\n id: string;\n title: string;\n createdAt: Date;\n updatedAt: Date;\n messageCount?: number;\n}\n\nexport function useChatSessions(options?: { includeArchived?: boolean; skip?: boolean }) {\n const { data, loading, error, refetch } = useGetChannelsByUserWithLastMessageQuery({\n variables: AI_ASSISTANT_CHANNELS_QUERY_VARS,\n skip: options?.skip,\n fetchPolicy: 'cache-first',\n nextFetchPolicy: 'cache-first',\n });\n\n const sessions: ChatSessionUI[] = useMemo(() => {\n const channels = data?.channelsByUser ?? [];\n return channels\n .filter((c): c is NonNullable<typeof c> => Boolean(c?.id))\n .map((channel) => ({\n id: channel.id,\n title: channel.title || channel.displayName || 'New Chat',\n createdAt: new Date(channel.createdAt ?? Date.now()),\n updatedAt: new Date(channel.updatedAt ?? Date.now()),\n messageCount: undefined,\n }));\n }, [data]);\n\n return { sessions, loading, error, refetch };\n}\n\nexport interface ChatMessageUI {\n id: string;\n sessionId: string;\n role: 'user' | 'assistant' | 'system';\n content: string;\n attachments?: Array<{ id: string; name: string; type: string; mimeType?: string; size?: number; url?: string }>;\n tokenCount?: number;\n model?: string;\n createdAt: Date;\n updatedAt: Date;\n}\n\ninterface MinimalFile {\n id?: string | null;\n name?: string | null;\n mimeType?: string | null;\n size?: number | null;\n url?: string | null;\n}\n\ninterface MinimalPost {\n id?: string | null;\n parentId?: string | null;\n message?: string | null;\n createdAt?: string | null;\n updatedAt?: string | null;\n channel?: { id?: string | null } | null;\n files?: { data?: MinimalFile[] | null } | null;\n replies?: { data?: MinimalPost[] | null } | null;\n props?: { role?: string | null; tokenCount?: number | null; model?: string | null } | null;\n propsConfiguration?: {\n contents?: { role?: string | null } | null;\n content?: { role?: string | null } | null;\n } | null;\n}\n\nfunction postTimestamp(value: string | null | undefined): number {\n if (!value) return 0;\n const t = new Date(value).getTime();\n return Number.isFinite(t) ? t : 0;\n}\n\n/**\n * Same flatten as account/browser `useChatApi`: merge roots + nested\n * `replies.data`, then emit each root followed by its children (oldest first).\n * Omitting this left assistant replies unordered or sitting above the prompt.\n */\nfunction flattenPostsWithReplies(posts: MinimalPost[], fallbackChannelId: string): ChatMessageUI[] {\n const getId = (post: MinimalPost) => String(post?.id ?? '');\n const nestedReplies = posts.flatMap((post) => (Array.isArray(post?.replies?.data) ? post.replies.data : []));\n const byId = new Map<string, MinimalPost>();\n for (const post of [...posts, ...nestedReplies]) {\n const id = getId(post);\n if (id) byId.set(id, post);\n }\n const uniq = Array.from(byId.values());\n const ids = new Set(uniq.map(getId));\n const roots = uniq.filter((post) => !post?.parentId || !ids.has(String(post.parentId)));\n const replies = uniq.filter((post) => post?.parentId && ids.has(String(post.parentId)));\n // Order by timestamp only (like account/browser). Array.sort is stable, so posts\n // that share a `createdAt` - a user prompt and its assistant reply are commonly\n // persisted with the same millisecond - keep the backend's `createdAt ASC` order\n // instead of being re-shuffled. An id tiebreaker here sorted such ties by UUID\n // string, which could float the assistant reply above the prompt.\n const byTime = (a: MinimalPost, b: MinimalPost) => postTimestamp(a.createdAt) - postTimestamp(b.createdAt);\n\n const ordered: MinimalPost[] = [];\n for (const root of [...roots].sort(byTime)) {\n const rootId = getId(root);\n ordered.push(root);\n ordered.push(...replies.filter((reply) => String(reply.parentId) === rootId).sort(byTime));\n }\n const seen = new Set(ordered.map(getId));\n ordered.push(...replies.filter((reply) => !seen.has(getId(reply))).sort(byTime));\n\n const out: ChatMessageUI[] = [];\n const emitted = new Set<string>();\n for (const post of ordered) {\n const id = getId(post);\n if (!id || emitted.has(id)) continue;\n emitted.add(id);\n out.push(mapPostToChatMessageUI(post, fallbackChannelId));\n }\n return out;\n}\n\nfunction mapPostToChatMessageUI(post: MinimalPost, fallbackChannelId: string): ChatMessageUI {\n const props = (post.props ?? {}) as Record<string, any>;\n const contents = post.propsConfiguration?.contents ?? {};\n const roleRaw = props.role ?? contents.role ?? post.propsConfiguration?.content?.role;\n let role: ChatMessageUI['role'] = 'assistant';\n if (roleRaw === 'user' || roleRaw === AiAgentMessageRole.User) role = 'user';\n else if (roleRaw === 'assistant' || roleRaw === AiAgentMessageRole.Assistant) role = 'assistant';\n else if (roleRaw === 'system') role = 'system';\n\n const rawContent = post?.message ?? '';\n const content = sanitizeAssistantContentByRole(role, rawContent);\n\n const fromFiles = (post?.files?.data ?? []).map((file) => ({\n id: file.id ?? uuidv4(),\n name: file.name ?? 'file',\n type: (typeof file.mimeType === 'string' && file.mimeType.startsWith('image/') ? 'screenshot' : 'file') as\n | 'screenshot'\n | 'file',\n mimeType: file.mimeType ?? undefined,\n size: file.size ?? undefined,\n url: file.url ?? undefined,\n }));\n const fromProps = Array.isArray(props.attachments)\n ? props.attachments.map((file: MinimalFile & { type?: string }) => ({\n id: file.id ?? uuidv4(),\n name: file.name ?? 'file',\n type: (file.type === 'screenshot' ||\n (typeof file.mimeType === 'string' && file.mimeType.startsWith('image/'))\n ? 'screenshot'\n : 'file') as 'screenshot' | 'file',\n mimeType: file.mimeType ?? undefined,\n size: file.size ?? undefined,\n url: file.url ?? undefined,\n }))\n : [];\n const attachments = attachmentsFromUserContent(content, fromFiles.length ? fromFiles : fromProps);\n\n return {\n id: post?.id ?? uuidv4(),\n sessionId: post?.channel?.id ?? fallbackChannelId,\n role,\n content,\n attachments,\n tokenCount: props.tokenCount ?? undefined,\n model: props.model ?? undefined,\n createdAt: post?.createdAt ? new Date(post.createdAt) : new Date(0),\n updatedAt: post?.updatedAt ? new Date(post.updatedAt) : new Date(0),\n };\n}\n\nexport function useChatMessages(sessionId: string | null, options?: { skip?: boolean }) {\n const { data, loading, error, refetch } = useMessagesQuery({\n variables: sessionId ? getThreadMessagesQueryVariables(sessionId) : undefined,\n skip: !sessionId || options?.skip,\n // cache-first + `messages` typePolicy (keyed by channelId). Opening a thread\n // that was already loaded does not refetch. New channels still hit the\n // network once. saveMessages writes new posts into this cache slot.\n fetchPolicy: 'cache-first',\n nextFetchPolicy: 'cache-first',\n /**\n * Cache key is per-channel so switching sessions doesn't read another channel's response.\n * Keeping this as a constant ('messages-list') used to cause cross-session bleed in the\n * custom Apollo link before reaching the normalized cache.\n */\n context: { cacheKey: sessionId ? `messages-list:${sessionId}` : 'messages-list' },\n });\n\n /**\n * `messagesLoaded` means \"we have data we can show\". cache-first fills `data`\n * synchronously on a hit so revisiting a thread does not flash a loader.\n */\n const messagesLoaded = data !== undefined;\n\n const messages: ChatMessageUI[] = useMemo(() => {\n if (!sessionId) return [];\n const rows = (data?.messages?.data ?? []) as MinimalPost[];\n return flattenPostsWithReplies(rows, sessionId);\n }, [data, sessionId]);\n\n return { messages, loading, messagesLoaded, error, refetch };\n}\n\nexport type IAccountSaveChatMessagesInput = IAccountSaveChatMessagesInputBase & {\n mode?: 'plan' | 'build';\n createdBy?: string;\n};\n\n/** Backend/gateway may have already inserted the post (E11000 duplicate `_id`). */\nfunction isDuplicatePostError(error: unknown): boolean {\n const parts: string[] = [];\n if (error && typeof error === 'object' && 'graphQLErrors' in error) {\n const gqlErrors = (error as { graphQLErrors?: Array<{ message?: string }> }).graphQLErrors ?? [];\n parts.push(...gqlErrors.map((e) => e?.message ?? ''));\n }\n if (error instanceof Error) {\n parts.push(error.message);\n } else if (error != null) {\n parts.push(String(error));\n }\n const msg = parts.join(' ');\n return /E11000|duplicate key/i.test(msg);\n}\n\nfunction prependCreatedChannelToHistoryCache(\n cache: any,\n created: { id?: string | null; title?: string | null; type?: string | null } | null | undefined,\n fallbackTitle: string,\n orgName?: string | null,\n) {\n if (!created?.id) return;\n const nowIso = new Date().toISOString();\n // Fill every field the history query selects so cache-first stays complete\n // (a partial Channel makes the whole channelsByUser read a miss).\n const optimisticChannel = {\n __typename: 'Channel',\n id: created.id,\n title: created.title ?? fallbackTitle,\n description: null,\n type: created.type ?? RoomType.Aiassistant,\n displayName: null,\n members: [],\n creator: null,\n lastMessage: null,\n createdAt: nowIso,\n updatedAt: nowIso,\n };\n for (const { query, variables } of getChatHistoryChannelRefetchQueries(orgName)) {\n try {\n cache.updateQuery({ query, variables }, (data: any) => {\n const list = (data?.channelsByUser ?? []) as any[];\n if (list.some((c) => c?.id === created.id)) return data;\n return { ...(data ?? {}), channelsByUser: [optimisticChannel, ...list] };\n });\n } catch (err) {\n console.warn('[useChatApi] prepend channel to history cache failed:', err);\n }\n }\n}\n\nfunction appendPostsToThreadCache(client: ReturnType<typeof useApolloClient>, sessionId: string, posts: MinimalPost[]) {\n const incoming = posts.filter((post) => post?.id);\n if (!sessionId || incoming.length === 0) return;\n try {\n client.cache.updateQuery(\n { query: MessagesDocument, variables: getThreadMessagesQueryVariables(sessionId) },\n (data: any) => {\n const existing = (data?.messages?.data ?? []) as MinimalPost[];\n const seen = new Set(existing.map((post) => post?.id).filter(Boolean));\n const next = [...existing];\n for (const post of incoming) {\n if (post?.id && !seen.has(post.id)) {\n seen.add(post.id);\n next.push(post);\n }\n }\n if (next.length === existing.length) return data;\n return {\n ...(data ?? {}),\n messages: {\n ...(data?.messages ?? {}),\n __typename: data?.messages?.__typename ?? 'Messages',\n data: next,\n },\n };\n },\n );\n } catch (err) {\n console.warn('[useChatApi] append posts to thread cache failed:', err);\n }\n}\n\nexport function useChatMutations() {\n const client = useApolloClient();\n const [addChannelMutation, { loading: createChannelLoading }] = useAddChannelMutation();\n const [sendMessagesMutation, { loading: sendMessagesLoading }] = useSendMessagesMutation();\n\n const createChannel = useCallback(\n async (input?: IAccountCreateChatSessionInput): Promise<ChatSessionUI> => {\n const {\n orgName: orgNameArg,\n projectId: projectIdArg,\n ...inputForSettings\n } = (input ?? {}) as IAccountCreateChatSessionInput & {\n orgName?: string | null;\n projectId?: string | null;\n };\n const orgName =\n typeof orgNameArg === 'string' && orgNameArg.trim().length > 0 ? orgNameArg.trim() : undefined;\n const projectId =\n typeof projectIdArg === 'string' && projectIdArg.trim().length > 0 ? projectIdArg.trim() : undefined;\n\n const settings = {\n title: input?.title ?? 'New Chat',\n description: input?.systemPrompt ?? null,\n isShared: false,\n sharedSlug: null,\n isArchived: false,\n isPinned: false,\n model: input?.model ?? null,\n systemPrompt: input?.systemPrompt ?? null,\n ...inputForSettings,\n };\n\n const { data } = await addChannelMutation({\n variables: {\n channelId: input?.id ?? null,\n name: input?.title ?? 'New Chat',\n description: input?.systemPrompt ?? null,\n type: RoomType.Aiassistant,\n settings,\n ...(orgName ? { orgName } : {}),\n ...(projectId ? { projectId } : {}),\n },\n // Same as browser: write the new channel into the cached list.\n // Do not refetch GetChannelsByUserWithLastMessage on every create.\n awaitRefetchQueries: false,\n update: (cache: any, res: any) => {\n prependCreatedChannelToHistoryCache(\n cache,\n res?.data?.createChannel,\n input?.title ?? 'New Chat',\n orgName,\n );\n },\n });\n\n if (!data?.createChannel?.id) {\n throw new Error('Failed to create channel');\n }\n\n const channel = data.createChannel;\n const title = channel.title ?? input?.title ?? 'New Chat';\n const now = new Date();\n\n return {\n id: channel.id,\n title,\n createdAt: now,\n updatedAt: now,\n };\n },\n [addChannelMutation],\n );\n\n const saveMessages = useCallback(\n async (\n input: IAccountSaveChatMessagesInput,\n ): Promise<{\n userMessage: ChatMessageUI;\n assistantMessage: ChatMessageUI;\n session: ChatSessionUI;\n }> => {\n const sanitizedAssistantContent = stripModelCostHeader(input.assistantMessage.content ?? '');\n const assistantMessageWithoutContent = omitContent((input.assistantMessage as any) ?? {});\n\n let userPost: MinimalPost | null | undefined;\n try {\n const userResult = await sendMessagesMutation({\n variables: {\n channelId: input.sessionId,\n type: RoomType.Aiassistant,\n content: input.userMessage.content ?? '',\n ...(input.createdBy ? { createdBy: input.createdBy } : {}),\n extraProps: {\n type: PostTypeEnum.Aiassistant,\n role: 'user',\n attachments: input.userMessage.attachments ?? [],\n isActive: true,\n status: 'complete',\n ...(input.userMessage as any),\n ...(input.mode ? { mode: input.mode } : {}),\n },\n } as any,\n });\n userPost = userResult.data?.sendMessage as MinimalPost | undefined;\n } catch (err) {\n if (!isDuplicatePostError(err)) {\n throw err;\n }\n console.warn('[saveMessages] user post already persisted (skipping duplicate insert)');\n }\n\n /**\n * Keep the prompting user post id in metadata. `sendMessage.postId` is the id of\n * the post being created, so reusing the user post id for the assistant reply would\n * collide and leave only the user message persisted.\n */\n const userPostId = userPost?.id ?? null;\n\n let assistantPost: MinimalPost | null | undefined;\n try {\n const assistantResult = await sendMessagesMutation({\n variables: {\n channelId: input.sessionId,\n type: RoomType.Aiassistant,\n content: sanitizedAssistantContent,\n extraProps: {\n type: PostTypeEnum.Aiassistant,\n role: 'assistant',\n attachments: input.assistantMessage.attachments ?? [],\n tokenCount: input.assistantMessage.tokenCount,\n latencyMs: input.assistantMessage.latencyMs,\n model: input.assistantMessage.model,\n finishReason: (input.assistantMessage as any).finishReason ?? null,\n isActive: true,\n status: 'complete',\n ...assistantMessageWithoutContent,\n ...(userPostId ? { parentId: userPostId } : {}),\n ...(input.mode ? { mode: input.mode } : {}),\n },\n } as any,\n });\n assistantPost = assistantResult.data?.sendMessage as MinimalPost | undefined;\n } catch (err) {\n if (!isDuplicatePostError(err)) {\n throw err;\n }\n console.warn('[saveMessages] assistant post already persisted (skipping duplicate insert)');\n }\n\n if (!userPost && !assistantPost) {\n throw new Error('Failed to send messages');\n }\n\n appendPostsToThreadCache(\n client,\n input.sessionId,\n [userPost, assistantPost].filter(Boolean) as MinimalPost[],\n );\n\n const now = new Date();\n const fallbackUser: ChatMessageUI = {\n id: userPostId ?? uuidv4(),\n sessionId: input.sessionId,\n role: 'user',\n content: input.userMessage.content ?? '',\n createdAt: now,\n updatedAt: now,\n };\n const fallbackAssistant: ChatMessageUI = {\n id: uuidv4(),\n sessionId: input.sessionId,\n role: 'assistant',\n content: sanitizedAssistantContent,\n createdAt: now,\n updatedAt: now,\n tokenCount: input.assistantMessage.tokenCount,\n model: input.assistantMessage.model,\n };\n return {\n userMessage: userPost ? mapPostToChatMessageUI(userPost, input.sessionId) : fallbackUser,\n assistantMessage: assistantPost\n ? mapPostToChatMessageUI(assistantPost, input.sessionId)\n : fallbackAssistant,\n session: {\n id: input.sessionId,\n title: 'Chat',\n createdAt: now,\n updatedAt: now,\n },\n };\n },\n [client, sendMessagesMutation],\n );\n\n return {\n createChannel,\n createSession: createChannel,\n saveMessages,\n loading: { create: createChannelLoading, saveMessages: sendMessagesLoading },\n };\n}\n"],"names":["_a","_b","_c","_d","_e","uuidv4"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useChatApi.js","sources":["../../src/hooks/useChatApi.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { useApolloClient } from '@apollo/client';\nimport { AiAgentMessageRole, PostTypeEnum, RoomType, SortEnum } from 'common';\nimport {\n GetChannelsByUserWithLastMessageDocument,\n MessagesDocument,\n useAddChannelMutation,\n useGetChannelsByUserWithLastMessageQuery,\n useMessagesQuery,\n useSendMessagesMutation,\n} from 'common/graphql';\nimport type {\n IAccountCreateChatSessionInput,\n IAccountSaveChatMessagesInput as IAccountSaveChatMessagesInputBase,\n} from 'common/server';\nimport { useCallback, useMemo } from 'react';\nimport { v4 as uuidv4 } from 'uuid';\nimport {\n attachmentsFromUserContent,\n historyAttachmentTitle,\n isAttachedCaption,\n} from '../features/attachments/historyAttachmentLabel';\n\nconst MESSAGES_PAGE_LIMIT = 100;\n\n/** Same variables as web Inbox / AIAgent: list AI assistant channels for the current user. */\nexport const AI_ASSISTANT_CHANNELS_QUERY_VARS = {\n criteria: { type: RoomType.Aiassistant },\n limit: 100,\n skip: 0,\n sort: { key: 'updatedAt', value: SortEnum.Desc },\n};\n\n/** First paint of Chat history. Keep this small — each row ships `lastMessage`. */\nexport const HISTORY_PAGE_SIZE = 10;\n/** User-prompt overlay for the first page. Posts, not channels — a few extras cover replies. */\nconst HISTORY_TITLE_OVERLAY_LIMIT = 20;\n\n/**\n * Variables for the channels-based chat history list (`ChatHistoryLanding`).\n *\n * IMPORTANT: pass the user's org `slug` (e.g. `tarun-upadhyay-qraw`) so the\n * `channelsByUser` resolver's `$in: [criteria.orgName, orgId]` includes\n * channels stored under the slug. When `criteria.orgName` is omitted, the\n * `$in` collapses to just `[orgId]` and channels saved with the slug as\n * `orgName` (the mobile create path) never match. That's the cause of the\n * silently-empty history screen.\n *\n * Kept as a builder (not a constant) because the slug varies per user and\n * because Apollo treats different `variables` as different cached entries —\n * if the create mutation refetches a no-orgName variant, the orgName-variant\n * the screen watches stays stale.\n */\nexport function getHistoryChannelsQueryVariables(orgName?: string | null, options?: { skip?: number; limit?: number }) {\n const trimmedOrg = typeof orgName === 'string' && orgName.trim().length > 0 ? orgName.trim() : undefined;\n return {\n criteria: {\n type: RoomType.Aiassistant,\n ...(trimmedOrg ? { orgName: trimmedOrg } : {}),\n },\n limit: options?.limit ?? HISTORY_PAGE_SIZE,\n skip: options?.skip ?? 0,\n sort: { key: 'updatedAt' as const, value: SortEnum.Desc },\n };\n}\n\n/** @deprecated Use {@link getHistoryChannelsQueryVariables} so `orgName` is included. */\nexport const HISTORY_QUERY_BASE = getHistoryChannelsQueryVariables();\n\nfunction normalizeOptionalString(value: string | null | undefined): string | undefined {\n return typeof value === 'string' && value.trim().length > 0 ? value.trim() : undefined;\n}\n\n/** Cache slots the history list watches — used to prepend a created channel without refetching. */\nexport function getChatHistoryChannelRefetchQueries(orgName?: string | null) {\n const trimmedOrg = normalizeOptionalString(orgName);\n return [\n { query: GetChannelsByUserWithLastMessageDocument, variables: AI_ASSISTANT_CHANNELS_QUERY_VARS },\n ...(trimmedOrg\n ? [\n {\n query: GetChannelsByUserWithLastMessageDocument,\n variables: getHistoryChannelsQueryVariables(trimmedOrg),\n },\n ]\n : []),\n { query: GetChannelsByUserWithLastMessageDocument, variables: HISTORY_QUERY_BASE },\n ];\n}\n\nfunction getThreadMessagesQueryVariables(sessionId: string) {\n return {\n channelId: sessionId,\n limit: MESSAGES_PAGE_LIMIT,\n skip: 0,\n sort: { key: 'createdAt' as const, value: SortEnum.Asc },\n };\n}\n\n/**\n * Variables for the chat-history feed on the mobile `ChatHistory` screen.\n *\n * First page uses `HISTORY_PAGE_SIZE` (10) channels; \"Load older\" paginates by\n * the same page size. Overlay titles fetch `HISTORY_TITLE_OVERLAY_LIMIT` posts.\n *\n * This query intentionally hits `messages` (not `channelsByUser`) — the same\n * pattern the web sidebar uses (`useNewChatPageHistorySessions`). Reasons:\n * 1. `channelsByUser` is server-side gated by an injected `orgName` /\n * `members` filter that can mismatch when channels were stored with an\n * org slug while the resolver injects the org id. The `messages`\n * resolver filters Post directly by `editedBy: accountId`, so the\n * user's own AI-assistant posts always show up.\n * 2. The user-authored post IS the conversation's natural title — no need\n * to walk `lastMessage.propsConfiguration.contents.parent` to recover\n * the original prompt.\n *\n * - `type: AIASSISTANT` scopes to AI chat (not direct/service rooms).\n * - `editedBy: accountUserId` scopes to the current user's own posts.\n * Assistant replies are skipped in JS so a missing `props.role` still\n * keeps the user prompt as the row title.\n */\nexport function getChatHistoryMessagesQueryVariables(\n accountUserId: string,\n options?: { skip?: number; limit?: number },\n) {\n return {\n limit: options?.limit ?? HISTORY_PAGE_SIZE,\n skip: options?.skip ?? 0,\n sort: { key: 'updatedAt' as const, value: SortEnum.Desc },\n type: PostTypeEnum.Aiassistant,\n editedBy: accountUserId,\n };\n}\n\nexport type ChatHistoryMode = 'chat' | 'deep-search' | 'build';\n\nexport interface ChatHistorySession {\n /** Channel id — used to navigate to the Chat screen. */\n channelId: string;\n /** User's most recent prompt in this channel (used as the row title). */\n title: string;\n /** Second line: latest post `message` field (same as Manus subtitle). */\n preview: string;\n /** Conversation mode (chat / deep-search / build), inferred from channel title or last message. */\n mode: ChatHistoryMode;\n /** Most-recent activity timestamp (sort key + bucket key for Today/Yesterday/…). */\n updatedAt: Date;\n createdAt: Date;\n /**\n * True when no concrete prompt was recoverable (no parent, no user turn, no\n * meaningful channel.title). UI renders the title in a quieter style.\n */\n isPlaceholder: boolean;\n /** First turn was a file send (`Attached: …`). Row uses a paperclip tile + \"New chat\". */\n isAttachment?: boolean;\n}\n\n/**\n * Collapse a list of user-authored AI assistant posts (newest first) into one\n * row per channel. First post per `channel.id` wins the title, which — because\n * the query is sorted by `updatedAt DESC` — is the user's latest prompt in\n * that channel. Posts whose `channel.id` is missing (unexpected, but possible\n * if the resolver omits the relation) are skipped.\n */\nexport function chatHistorySessionsFromMessages(\n data: { messages?: { data?: unknown[] | null } | null } | null | undefined,\n): ChatHistorySession[] {\n const rows = data?.messages?.data;\n if (!rows?.length) return [];\n\n const seen = new Set<string>();\n const sessions: ChatHistorySession[] = [];\n\n for (const post of rows as any[]) {\n const channelId =\n post?.channel?.id != null ? String(post.channel.id) : typeof post?.channel === 'string' ? post.channel : '';\n if (!channelId || seen.has(channelId)) continue;\n\n const rawTitle = String(post?.message ?? '')\n .replace(/\\s+/g, ' ')\n .trim();\n const role = String(\n post?.props?.role ??\n post?.propsConfiguration?.contents?.role ??\n post?.propsConfiguration?.content?.role ??\n '',\n ).toUpperCase();\n if (isTransientHistoryText(rawTitle) || looksLikeAssistantReply(rawTitle, role)) continue;\n\n seen.add(channelId);\n const updatedAt = post?.updatedAt ? new Date(post.updatedAt) : new Date();\n const createdAt = post?.createdAt ? new Date(post.createdAt) : updatedAt;\n const isAttachment = isAttachedCaption(rawTitle);\n const title = isAttachment ? historyAttachmentTitle(rawTitle) : rawTitle || 'New chat';\n\n sessions.push({\n channelId,\n title,\n preview: '',\n mode: 'chat',\n updatedAt,\n createdAt,\n isPlaceholder: !rawTitle && !isAttachment,\n isAttachment,\n });\n }\n\n return sessions;\n}\n\n/**\n * Mobile parity hook for the web sidebar's `useNewChatPageHistorySessions`.\n *\n * Returns one row per channel where the user has authored at least one AI assistant\n * post, with the title taken from that user's latest prompt. Skipped when\n * `accountUserId` isn't known yet (we don't want to fire a query without it).\n */\nexport function useChatHistorySessionsFromMessages(\n accountUserId: string | null | undefined,\n options?: { skip?: boolean },\n) {\n const skip = options?.skip || !accountUserId;\n const { data, loading, error, refetch } = useMessagesQuery({\n variables: accountUserId\n ? getChatHistoryMessagesQueryVariables(accountUserId, { limit: HISTORY_TITLE_OVERLAY_LIMIT })\n : undefined,\n skip,\n // cache-first + `messages` typePolicy (keyed by editedBy/type/props).\n // Later visits read the cache — no repeated network hit.\n fetchPolicy: 'cache-first',\n nextFetchPolicy: 'cache-first',\n returnPartialData: true,\n context: { cacheKey: 'new-chat-history-messages' },\n });\n\n const sessions = useMemo(() => chatHistorySessionsFromMessages(data), [data]);\n const sourcePostCount = data?.messages?.data?.length ?? 0;\n\n return { sessions, loading, error, refetch, sourcePostCount };\n}\n\n/* -------------------------------------------------------------------------- */\n/* Channels-based chat history (parent + lastMessage) */\n/* -------------------------------------------------------------------------- */\n\ninterface ChannelLastMessageLike {\n message?: string | null;\n createdAt?: string | null;\n updatedAt?: string | null;\n props?: { role?: string | null; mode?: string | null } | null;\n propsConfiguration?: {\n contents?: {\n role?: string | null;\n mode?: string | null;\n template?: string | null;\n parent?: {\n message?: string | null;\n props?: { role?: string | null } | null;\n } | null;\n fragment?: {\n title?: string | null;\n sandboxUrl?: string | null;\n sandboxId?: string | null;\n } | null;\n } | null;\n content?: { role?: string | null; mode?: string | null } | null;\n } | null;\n}\n\ninterface ChannelLike {\n id?: string | null;\n type?: string | null;\n displayName?: string | null;\n title?: string | null;\n createdAt?: string | null;\n updatedAt?: string | null;\n lastMessage?: ChannelLastMessageLike | null;\n}\n\nfunction getLastMessageRole(lastMessage: ChannelLastMessageLike | null | undefined): string {\n return String(\n lastMessage?.propsConfiguration?.contents?.role ??\n lastMessage?.propsConfiguration?.content?.role ??\n lastMessage?.props?.role ??\n '',\n ).toUpperCase();\n}\n\nfunction getParentUserPrompt(lastMessage: ChannelLastMessageLike | null | undefined): string {\n const parent = lastMessage?.propsConfiguration?.contents?.parent;\n if (!parent) return '';\n return String(parent?.message ?? '').trim();\n}\n\nfunction isBuildLastMessage(lastMessage: ChannelLastMessageLike | null | undefined): boolean {\n if (!lastMessage) return false;\n const contents = lastMessage.propsConfiguration?.contents;\n const mode = String(\n contents?.mode ?? lastMessage.propsConfiguration?.content?.mode ?? lastMessage?.props?.mode ?? '',\n ).toLowerCase();\n if (mode === 'build' || mode === 'workflow') return true;\n const fragment = contents?.fragment;\n if (fragment?.sandboxUrl || fragment?.sandboxId) return true;\n if (String(contents?.template ?? '').trim()) return true;\n return false;\n}\n\nfunction detectMode(channel: ChannelLike): ChatHistoryMode {\n if (isBuildLastMessage(channel?.lastMessage)) {\n return 'build';\n }\n const display = String(channel?.displayName ?? '').toLowerCase();\n const title = String(channel?.title ?? '').toLowerCase();\n if (display.startsWith('build-channel') || title.startsWith('build-channel') || title.startsWith('build channel')) {\n return 'build';\n }\n const parent = getParentUserPrompt(channel?.lastMessage).toLowerCase();\n if (/^build\\s*me\\s*:/.test(parent)) {\n return 'build';\n }\n if (display.startsWith('deep-search') || title.startsWith('deep search') || title.startsWith('deep-search')) {\n return 'deep-search';\n }\n return 'chat';\n}\n\n/**\n * Drop the internal slug we use as `channel.title` for server-side mode detection\n * (`chat-channel-<uuid>` / `deep-search-<uuid>`) so it doesn't leak into the row\n * label. The server sometimes also reformats this slug into `displayName` as\n * title-cased text with spaces (e.g. `\"Deep Search b64be4f7 9fe6 …\"`) — those\n * are equally machine-generated and must NOT be shown to the user.\n *\n * Pattern accepts:\n * • `deep-search-<uuid>` / `chat-channel-<uuid>` (raw, mode signal)\n * • `Deep Search <uuid>` / `Chat Channel <uuid>` (display-cased, server-reformatted)\n * • UUID may use hyphens, spaces, or be partially truncated as long as the\n * trailing chunk is hex.\n */\nfunction cleanChannelTitle(rawTitle: string | null | undefined): string {\n const t = String(rawTitle ?? '').trim();\n if (!t) return '';\n if (/^(chat[\\s-]channel|deep[\\s-]search|build[\\s-]channel)[\\s-][0-9a-f][0-9a-f\\s-]{7,}\\.?$/i.test(t)) return '';\n // Creation defaults carry no meaning either (parity with the browser sidebar).\n if (/^(new chat|workflow|deep search)$/i.test(t)) return '';\n return t;\n}\n\n/** `[Active connectors: …]` routing prefix on persisted gateway user posts. */\nconst ACTIVE_CONNECTORS_PREFIX_RE = /^\\s*\\[Active connectors:[^\\]]*\\]\\s*/i;\n\nfunction cleanMessageText(raw: string): string {\n return raw.replace(ACTIVE_CONNECTORS_PREFIX_RE, '').replace(/\\s+/g, ' ').trim();\n}\n\n/** Status / tool stubs that must not become a history title or subtitle. */\nfunction isTransientHistoryText(text: string): boolean {\n const t = cleanMessageText(text);\n if (!t) return true;\n if (/^thinking[.…]*$/i.test(t)) return true;\n if (/^let me check on that requested skill/i.test(t)) return true;\n if (/^(working on it|one moment|just a (sec|second|moment))[.…]*$/i.test(t)) return true;\n if (/^[⚙️⚠]/.test(t)) return true;\n return false;\n}\n\nfunction looksLikeAssistantReply(text: string, role: string): boolean {\n if (role === 'ASSISTANT' || role === 'AI' || role === 'BOT' || role === 'AGENT') return true;\n if (role === 'USER') return false;\n const t = text.trim();\n if (/^(let me |i'll |i will |sure[,.] |here's |here is )/i.test(t)) return true;\n if (t.length > 180) return true;\n return false;\n}\n\nfunction cleanHistoryPreview(raw: string): string {\n let t = cleanMessageText(raw);\n t = t.replace(/^(thinking[.…]*\\s*)+/i, '').trim();\n t = t.replace(/^let me check on that requested skill[^\\n.!?]*[.!?-]?\\s*/i, '').trim();\n t = t.replace(/^(?:⚙️[^\\n]*\\n)+\\s*/g, '').trim();\n return t;\n}\n\n/**\n * Map one channel into a session row (Manus-style two-line list):\n *\n * **Title (line 1):** `lastMessage.propsConfiguration.contents.parent.message`\n * when present (the user turn the thread is anchored on). Otherwise fall back\n * to the last post body if that post is still a user message, then a\n * machine-slug-stripped channel title, then a machine-slug-stripped\n * `displayName`, then `\"Thinking…\"`. Machine slugs (`deep-search-<uuid>`,\n * `chat-channel-<uuid>`, and their server-reformatted display variants)\n * are filtered via `cleanChannelTitle`, so they never reach the row.\n *\n * **Preview (line 2):** `lastMessage.message` as returned by the API (trimmed,\n * whitespace collapsed). Agent errors that start with `⚠` stay visible in the\n * subtitle, matching the reference UI.\n *\n * If preview text equals the title after trim, the second line is omitted\n * (single-line channel, no duplicate).\n */\nexport function buildSessionFromChannel(channel: ChannelLike): ChatHistorySession | null {\n const channelId = String(channel?.id ?? '');\n if (!channelId) return null;\n\n const lastMessage = channel?.lastMessage ?? null;\n const lastMessageRole = getLastMessageRole(lastMessage);\n const parentTrimmed = cleanHistoryPreview(getParentUserPrompt(lastMessage));\n const lastBody = cleanHistoryPreview(String(lastMessage?.message ?? ''));\n const userTurn = lastMessageRole === 'USER' && lastBody ? lastBody : '';\n const cleanedChannelTitle = cleanChannelTitle(channel?.title);\n /**\n * Apply the same machine-slug cleaner to `displayName`. The server\n * sometimes derives displayName from the title (`\"deep-search-<uuid>\"`\n * → `\"Deep Search <uuid>\"`), so without this the slug bypasses\n * `cleanedChannelTitle` and lands directly in the row label.\n */\n const cleanedDisplayName = cleanChannelTitle(channel?.displayName);\n\n let resolvedTitle = cleanedChannelTitle || parentTrimmed || userTurn || cleanedDisplayName;\n if (\n !resolvedTitle &&\n lastBody &&\n !isTransientHistoryText(lastBody) &&\n !looksLikeAssistantReply(lastBody, lastMessageRole)\n ) {\n resolvedTitle = lastBody;\n }\n if (!resolvedTitle) {\n const rawDefault = String(channel?.title ?? '').trim();\n if (rawDefault && !/^(chat[\\s-]channel|deep[\\s-]search)[\\s-][0-9a-f][0-9a-f\\s-]{7,}\\.?$/i.test(rawDefault)) {\n resolvedTitle = rawDefault;\n }\n }\n const isAttachment =\n isAttachedCaption(resolvedTitle) || isAttachedCaption(parentTrimmed) || isAttachedCaption(userTurn);\n if (isAttachment) resolvedTitle = historyAttachmentTitle(resolvedTitle);\n const isPlaceholder = !resolvedTitle;\n if (isPlaceholder) resolvedTitle = 'New chat';\n\n let preview = lastBody;\n if (\n isTransientHistoryText(preview) ||\n isAttachedCaption(preview) ||\n preview === resolvedTitle ||\n preview === parentTrimmed\n ) {\n preview = '';\n }\n if (lastMessageRole === 'USER' && !looksLikeAssistantReply(lastBody, lastMessageRole)) {\n preview = '';\n }\n\n const sortAt = (() => {\n const candidates = [channel?.updatedAt, lastMessage?.updatedAt, lastMessage?.createdAt, channel?.createdAt];\n for (const candidate of candidates) {\n if (candidate) {\n const t = new Date(candidate).getTime();\n if (Number.isFinite(t) && t > 0) return t;\n }\n }\n return Date.now();\n })();\n\n const createdAtRaw = channel?.createdAt ? new Date(channel.createdAt).getTime() : sortAt;\n\n return {\n channelId,\n title: resolvedTitle,\n preview,\n mode: detectMode(channel),\n updatedAt: new Date(sortAt),\n createdAt: new Date(Number.isFinite(createdAtRaw) ? createdAtRaw : sortAt),\n isPlaceholder,\n isAttachment,\n };\n}\n\n/** Collapse a `channelsByUser` response into session rows for the history list. */\nexport function chatHistorySessionsFromChannels(\n data: { channelsByUser?: (ChannelLike | null)[] | null } | null | undefined,\n): ChatHistorySession[] {\n const channels = (data?.channelsByUser ?? []) as (ChannelLike | null)[];\n return channels\n .filter((c): c is ChannelLike => Boolean(c?.id) && (!c?.type || c.type === RoomType.Aiassistant))\n .map((c) => buildSessionFromChannel(c))\n .filter((row): row is ChatHistorySession => row !== null)\n .sort((a, b) => b.updatedAt.getTime() - a.updatedAt.getTime());\n}\n\n/** Survives ChatHistory unmount so returning from a thread does not flash \"New chat\". */\nconst rememberedHistoryTitles = new Map<string, { title: string; isAttachment?: boolean }>();\n\nexport function resetRememberedHistoryTitles(): void {\n rememberedHistoryTitles.clear();\n}\n\nfunction rememberHistoryTitle(session: ChatHistorySession): void {\n if (session.isPlaceholder) return;\n const title = session.title?.trim();\n if (!title || /^new chat$/i.test(title) || isTransientHistoryText(title)) return;\n rememberedHistoryTitles.set(session.channelId, { title, isAttachment: session.isAttachment });\n}\n\nfunction applyRememberedHistoryTitles(rows: ChatHistorySession[]): ChatHistorySession[] {\n return rows.map((row) => {\n rememberHistoryTitle(row);\n if (!row.isPlaceholder && !/^new chat$/i.test(row.title)) return row;\n const mem = rememberedHistoryTitles.get(row.channelId);\n if (!mem) return row;\n return {\n ...row,\n title: mem.title,\n isPlaceholder: false,\n isAttachment: mem.isAttachment || row.isAttachment,\n };\n });\n}\n\n/**\n * Overlay user-authored prompts from `messages` onto channel rows whose\n * lastMessage never carried `parent.message` (typical cdecli/gateway chats).\n */\nexport function enrichHistorySessionsWithUserPrompts(\n fromChannels: ChatHistorySession[],\n fromMessages: ChatHistorySession[],\n): ChatHistorySession[] {\n if (!fromMessages.length) return applyRememberedHistoryTitles(fromChannels);\n const byId = new Map(fromMessages.map((session) => [session.channelId, session]));\n const merged = fromChannels.map((row) => {\n const fromUser = byId.get(row.channelId);\n if (!fromUser?.title || isTransientHistoryText(fromUser.title)) return row;\n const titleMissing = row.isPlaceholder || isTransientHistoryText(row.title) || /^new chat$/i.test(row.title);\n if (!titleMissing) {\n return row.preview ? row : { ...row, preview: fromUser.preview || row.preview };\n }\n return {\n ...row,\n title: fromUser.title,\n preview: row.preview && !isTransientHistoryText(row.preview) ? row.preview : fromUser.preview,\n isPlaceholder: false,\n isAttachment: fromUser.isAttachment || row.isAttachment,\n };\n });\n const seen = new Set(merged.map((row) => row.channelId));\n for (const fromUser of fromMessages) {\n if (seen.has(fromUser.channelId)) continue;\n if (!fromUser.title || isTransientHistoryText(fromUser.title)) continue;\n seen.add(fromUser.channelId);\n merged.push(fromUser);\n }\n return applyRememberedHistoryTitles(merged);\n}\n\n/**\n * Chat history feed driven by `channelsByUser`. Each row: parent prompt as title,\n * `lastMessage.message` as subtitle (Manus-style), when the API provides them.\n *\n * Caller MUST pass `orgName` (the org slug). Without it, the resolver only\n * matches channels whose `orgName` field equals the user's `orgId`, which is\n * never the case for mobile-created channels (those store the slug). The hook\n * suspends the query (`skip: true`) until `orgName` is known, so we never\n * fire a guaranteed-empty request.\n *\n * Pagination is by channel count (one channel = one row in this query),\n * unlike the messages-based path which paginates by raw post rows.\n */\nexport function useChatHistorySessionsFromChannels(orgName: string | null | undefined, options?: { skip?: boolean }) {\n const skip = options?.skip || !orgName;\n const variables = useMemo(() => getHistoryChannelsQueryVariables(orgName), [orgName]);\n\n const { data, loading, error, refetch } = useGetChannelsByUserWithLastMessageQuery({\n variables,\n skip,\n // cache-first + `channelsByUser` typePolicy (keyArgs drop skip/limit/sort).\n // Later navigations read the canonical list from cache — no repeated\n // GetChannelsByUserWithLastMessage. Freshness comes from pull-to-refresh\n // / createChannel cache writes, not per-visit network hits.\n fetchPolicy: 'cache-first',\n nextFetchPolicy: 'cache-first',\n returnPartialData: true,\n context: { cacheKey: 'chat-history-channels-list' },\n });\n\n const sessions = useMemo(() => chatHistorySessionsFromChannels(data), [data]);\n const sourceChannelCount = data?.channelsByUser?.length ?? 0;\n /**\n * `sessionsLoaded` means \"we have data we can show\", regardless of whether a\n * background revalidation is still in flight. Same contract as `messagesLoaded`\n * in `useChatMessages` — lets the screen show the cached list (or empty state)\n * immediately on revisit instead of flashing a loader for the network round-trip.\n */\n const sessionsLoaded = data !== undefined;\n\n return { sessions, loading, sessionsLoaded, error, refetch, sourceChannelCount };\n}\n\n/**\n * Warm the `channelsByUser` cache from Home so opening Chat history is a\n * cache-first paint instead of a staging GraphQL round-trip.\n */\nexport function usePrefetchChatHistory(orgName: string | null | undefined) {\n return useChatHistorySessionsFromChannels(orgName, { skip: !orgName });\n}\n\nfunction stripModelCostHeader(content: string): string {\n const normalized = content.replace(/\\r\\n/g, '\\n');\n return normalized.replace(\n /^\\s*(?:[^\\w\\n]+\\s*)?[a-z0-9][a-z0-9._-]*\\s*\\(\\s*\\$[\\d.]+\\s*\\/\\s*MTok\\s+in\\s*\\)\\s*\\n+/i,\n '',\n );\n}\n\nfunction sanitizeAssistantContentByRole(role: unknown, content: string): string {\n return role === 'assistant' ? stripModelCostHeader(content) : content;\n}\n\nfunction omitContent<T extends Record<string, any>>(value: T | null | undefined): Omit<T, 'content'> {\n const clone = { ...(value ?? {}) } as Record<string, any>;\n delete clone.content;\n return clone as Omit<T, 'content'>;\n}\n\nexport interface ChatSessionUI {\n id: string;\n title: string;\n createdAt: Date;\n updatedAt: Date;\n messageCount?: number;\n}\n\nexport function useChatSessions(options?: { includeArchived?: boolean; skip?: boolean }) {\n const { data, loading, error, refetch } = useGetChannelsByUserWithLastMessageQuery({\n variables: AI_ASSISTANT_CHANNELS_QUERY_VARS,\n skip: options?.skip,\n fetchPolicy: 'cache-first',\n nextFetchPolicy: 'cache-first',\n });\n\n const sessions: ChatSessionUI[] = useMemo(() => {\n const channels = data?.channelsByUser ?? [];\n return channels\n .filter((c): c is NonNullable<typeof c> => Boolean(c?.id))\n .map((channel) => ({\n id: channel.id,\n title: channel.title || channel.displayName || 'New Chat',\n createdAt: new Date(channel.createdAt ?? Date.now()),\n updatedAt: new Date(channel.updatedAt ?? Date.now()),\n messageCount: undefined,\n }));\n }, [data]);\n\n return { sessions, loading, error, refetch };\n}\n\nexport interface ChatMessageUI {\n id: string;\n sessionId: string;\n role: 'user' | 'assistant' | 'system';\n content: string;\n attachments?: Array<{ id: string; name: string; type: string; mimeType?: string; size?: number; url?: string }>;\n tokenCount?: number;\n model?: string;\n createdAt: Date;\n updatedAt: Date;\n}\n\ninterface MinimalFile {\n id?: string | null;\n name?: string | null;\n mimeType?: string | null;\n size?: number | null;\n url?: string | null;\n}\n\ninterface MinimalPost {\n id?: string | null;\n parentId?: string | null;\n message?: string | null;\n createdAt?: string | null;\n updatedAt?: string | null;\n channel?: { id?: string | null } | null;\n files?: { data?: MinimalFile[] | null } | null;\n replies?: { data?: MinimalPost[] | null } | null;\n props?: { role?: string | null; tokenCount?: number | null; model?: string | null } | null;\n propsConfiguration?: {\n contents?: { role?: string | null } | null;\n content?: { role?: string | null } | null;\n } | null;\n}\n\nfunction postTimestamp(value: string | null | undefined): number {\n if (!value) return 0;\n const t = new Date(value).getTime();\n return Number.isFinite(t) ? t : 0;\n}\n\n/**\n * Same flatten as account/browser `useChatApi`: merge roots + nested\n * `replies.data`, then emit each root followed by its children (oldest first).\n * Omitting this left assistant replies unordered or sitting above the prompt.\n */\nfunction flattenPostsWithReplies(posts: MinimalPost[], fallbackChannelId: string): ChatMessageUI[] {\n const getId = (post: MinimalPost) => String(post?.id ?? '');\n const nestedReplies = posts.flatMap((post) => (Array.isArray(post?.replies?.data) ? post.replies.data : []));\n const byId = new Map<string, MinimalPost>();\n for (const post of [...posts, ...nestedReplies]) {\n const id = getId(post);\n if (id) byId.set(id, post);\n }\n const uniq = Array.from(byId.values());\n const ids = new Set(uniq.map(getId));\n const roots = uniq.filter((post) => !post?.parentId || !ids.has(String(post.parentId)));\n const replies = uniq.filter((post) => post?.parentId && ids.has(String(post.parentId)));\n // Order by timestamp only (like account/browser). Array.sort is stable, so posts\n // that share a `createdAt` - a user prompt and its assistant reply are commonly\n // persisted with the same millisecond - keep the backend's `createdAt ASC` order\n // instead of being re-shuffled. An id tiebreaker here sorted such ties by UUID\n // string, which could float the assistant reply above the prompt.\n const byTime = (a: MinimalPost, b: MinimalPost) => postTimestamp(a.createdAt) - postTimestamp(b.createdAt);\n\n const ordered: MinimalPost[] = [];\n for (const root of [...roots].sort(byTime)) {\n const rootId = getId(root);\n ordered.push(root);\n ordered.push(...replies.filter((reply) => String(reply.parentId) === rootId).sort(byTime));\n }\n const seen = new Set(ordered.map(getId));\n ordered.push(...replies.filter((reply) => !seen.has(getId(reply))).sort(byTime));\n\n const out: ChatMessageUI[] = [];\n const emitted = new Set<string>();\n for (const post of ordered) {\n const id = getId(post);\n if (!id || emitted.has(id)) continue;\n emitted.add(id);\n out.push(mapPostToChatMessageUI(post, fallbackChannelId));\n }\n return out;\n}\n\nfunction mapPostToChatMessageUI(post: MinimalPost, fallbackChannelId: string): ChatMessageUI {\n const props = (post.props ?? {}) as Record<string, any>;\n const contents = post.propsConfiguration?.contents ?? {};\n const roleRaw = props.role ?? contents.role ?? post.propsConfiguration?.content?.role;\n let role: ChatMessageUI['role'] = 'assistant';\n if (roleRaw === 'user' || roleRaw === AiAgentMessageRole.User) role = 'user';\n else if (roleRaw === 'assistant' || roleRaw === AiAgentMessageRole.Assistant) role = 'assistant';\n else if (roleRaw === 'system') role = 'system';\n\n const rawContent = post?.message ?? '';\n const content = sanitizeAssistantContentByRole(role, rawContent);\n\n const fromFiles = (post?.files?.data ?? []).map((file) => ({\n id: file.id ?? uuidv4(),\n name: file.name ?? 'file',\n type: (typeof file.mimeType === 'string' && file.mimeType.startsWith('image/') ? 'screenshot' : 'file') as\n | 'screenshot'\n | 'file',\n mimeType: file.mimeType ?? undefined,\n size: file.size ?? undefined,\n url: file.url ?? undefined,\n }));\n const fromProps = Array.isArray(props.attachments)\n ? props.attachments.map((file: MinimalFile & { type?: string }) => ({\n id: file.id ?? uuidv4(),\n name: file.name ?? 'file',\n type: (file.type === 'screenshot' ||\n (typeof file.mimeType === 'string' && file.mimeType.startsWith('image/'))\n ? 'screenshot'\n : 'file') as 'screenshot' | 'file',\n mimeType: file.mimeType ?? undefined,\n size: file.size ?? undefined,\n url: file.url ?? undefined,\n }))\n : [];\n const attachments = attachmentsFromUserContent(content, fromFiles.length ? fromFiles : fromProps);\n\n return {\n id: post?.id ?? uuidv4(),\n sessionId: post?.channel?.id ?? fallbackChannelId,\n role,\n content,\n attachments,\n tokenCount: props.tokenCount ?? undefined,\n model: props.model ?? undefined,\n createdAt: post?.createdAt ? new Date(post.createdAt) : new Date(0),\n updatedAt: post?.updatedAt ? new Date(post.updatedAt) : new Date(0),\n };\n}\n\nexport function useChatMessages(sessionId: string | null, options?: { skip?: boolean }) {\n const { data, loading, error, refetch } = useMessagesQuery({\n variables: sessionId ? getThreadMessagesQueryVariables(sessionId) : undefined,\n skip: !sessionId || options?.skip,\n // cache-first + `messages` typePolicy (keyed by channelId). Opening a thread\n // that was already loaded does not refetch. New channels still hit the\n // network once. saveMessages writes new posts into this cache slot.\n fetchPolicy: 'cache-first',\n nextFetchPolicy: 'cache-first',\n /**\n * Cache key is per-channel so switching sessions doesn't read another channel's response.\n * Keeping this as a constant ('messages-list') used to cause cross-session bleed in the\n * custom Apollo link before reaching the normalized cache.\n */\n context: { cacheKey: sessionId ? `messages-list:${sessionId}` : 'messages-list' },\n });\n\n /**\n * `messagesLoaded` means \"we have data we can show\". cache-first fills `data`\n * synchronously on a hit so revisiting a thread does not flash a loader.\n */\n const messagesLoaded = data !== undefined;\n\n const messages: ChatMessageUI[] = useMemo(() => {\n if (!sessionId) return [];\n const rows = (data?.messages?.data ?? []) as MinimalPost[];\n return flattenPostsWithReplies(rows, sessionId);\n }, [data, sessionId]);\n\n return { messages, loading, messagesLoaded, error, refetch };\n}\n\nexport type IAccountSaveChatMessagesInput = IAccountSaveChatMessagesInputBase & {\n mode?: 'plan' | 'build';\n createdBy?: string;\n};\n\n/** Backend/gateway may have already inserted the post (E11000 duplicate `_id`). */\nfunction isDuplicatePostError(error: unknown): boolean {\n const parts: string[] = [];\n if (error && typeof error === 'object' && 'graphQLErrors' in error) {\n const gqlErrors = (error as { graphQLErrors?: Array<{ message?: string }> }).graphQLErrors ?? [];\n parts.push(...gqlErrors.map((e) => e?.message ?? ''));\n }\n if (error instanceof Error) {\n parts.push(error.message);\n } else if (error != null) {\n parts.push(String(error));\n }\n const msg = parts.join(' ');\n return /E11000|duplicate key/i.test(msg);\n}\n\nfunction prependCreatedChannelToHistoryCache(\n cache: any,\n created: { id?: string | null; title?: string | null; type?: string | null } | null | undefined,\n fallbackTitle: string,\n orgName?: string | null,\n) {\n if (!created?.id) return;\n const nowIso = new Date().toISOString();\n // Fill every field the history query selects so cache-first stays complete\n // (a partial Channel makes the whole channelsByUser read a miss).\n const optimisticChannel = {\n __typename: 'Channel',\n id: created.id,\n title: created.title ?? fallbackTitle,\n description: null,\n type: created.type ?? RoomType.Aiassistant,\n displayName: null,\n members: [],\n creator: null,\n lastMessage: null,\n createdAt: nowIso,\n updatedAt: nowIso,\n };\n for (const { query, variables } of getChatHistoryChannelRefetchQueries(orgName)) {\n try {\n cache.updateQuery({ query, variables }, (data: any) => {\n const list = (data?.channelsByUser ?? []) as any[];\n if (list.some((c) => c?.id === created.id)) return data;\n return { ...(data ?? {}), channelsByUser: [optimisticChannel, ...list] };\n });\n } catch (err) {\n console.warn('[useChatApi] prepend channel to history cache failed:', err);\n }\n }\n}\n\nfunction appendPostsToThreadCache(client: ReturnType<typeof useApolloClient>, sessionId: string, posts: MinimalPost[]) {\n const incoming = posts.filter((post) => post?.id);\n if (!sessionId || incoming.length === 0) return;\n try {\n client.cache.updateQuery(\n { query: MessagesDocument, variables: getThreadMessagesQueryVariables(sessionId) },\n (data: any) => {\n const existing = (data?.messages?.data ?? []) as MinimalPost[];\n const seen = new Set(existing.map((post) => post?.id).filter(Boolean));\n const next = [...existing];\n for (const post of incoming) {\n if (post?.id && !seen.has(post.id)) {\n seen.add(post.id);\n next.push(post);\n }\n }\n if (next.length === existing.length) return data;\n return {\n ...(data ?? {}),\n messages: {\n ...(data?.messages ?? {}),\n __typename: data?.messages?.__typename ?? 'Messages',\n data: next,\n },\n };\n },\n );\n } catch (err) {\n console.warn('[useChatApi] append posts to thread cache failed:', err);\n }\n}\n\nexport function useChatMutations() {\n const client = useApolloClient();\n const [addChannelMutation, { loading: createChannelLoading }] = useAddChannelMutation();\n const [sendMessagesMutation, { loading: sendMessagesLoading }] = useSendMessagesMutation();\n\n const createChannel = useCallback(\n async (input?: IAccountCreateChatSessionInput): Promise<ChatSessionUI> => {\n const {\n orgName: orgNameArg,\n projectId: projectIdArg,\n ...inputForSettings\n } = (input ?? {}) as IAccountCreateChatSessionInput & {\n orgName?: string | null;\n projectId?: string | null;\n };\n const orgName =\n typeof orgNameArg === 'string' && orgNameArg.trim().length > 0 ? orgNameArg.trim() : undefined;\n const projectId =\n typeof projectIdArg === 'string' && projectIdArg.trim().length > 0 ? projectIdArg.trim() : undefined;\n\n const settings = {\n title: input?.title ?? 'New Chat',\n description: input?.systemPrompt ?? null,\n isShared: false,\n sharedSlug: null,\n isArchived: false,\n isPinned: false,\n model: input?.model ?? null,\n systemPrompt: input?.systemPrompt ?? null,\n ...inputForSettings,\n };\n\n const { data } = await addChannelMutation({\n variables: {\n channelId: input?.id ?? null,\n name: input?.title ?? 'New Chat',\n description: input?.systemPrompt ?? null,\n type: RoomType.Aiassistant,\n settings,\n ...(orgName ? { orgName } : {}),\n ...(projectId ? { projectId } : {}),\n },\n // Same as browser: write the new channel into the cached list.\n // Do not refetch GetChannelsByUserWithLastMessage on every create.\n awaitRefetchQueries: false,\n update: (cache: any, res: any) => {\n prependCreatedChannelToHistoryCache(\n cache,\n res?.data?.createChannel,\n input?.title ?? 'New Chat',\n orgName,\n );\n },\n });\n\n if (!data?.createChannel?.id) {\n throw new Error('Failed to create channel');\n }\n\n const channel = data.createChannel;\n const title = channel.title ?? input?.title ?? 'New Chat';\n const now = new Date();\n\n return {\n id: channel.id,\n title,\n createdAt: now,\n updatedAt: now,\n };\n },\n [addChannelMutation],\n );\n\n const saveMessages = useCallback(\n async (\n input: IAccountSaveChatMessagesInput,\n ): Promise<{\n userMessage: ChatMessageUI;\n assistantMessage: ChatMessageUI;\n session: ChatSessionUI;\n }> => {\n const sanitizedAssistantContent = stripModelCostHeader(input.assistantMessage.content ?? '');\n const assistantMessageWithoutContent = omitContent((input.assistantMessage as any) ?? {});\n\n let userPost: MinimalPost | null | undefined;\n try {\n const userResult = await sendMessagesMutation({\n variables: {\n channelId: input.sessionId,\n type: RoomType.Aiassistant,\n content: input.userMessage.content ?? '',\n ...(input.createdBy ? { createdBy: input.createdBy } : {}),\n extraProps: {\n type: PostTypeEnum.Aiassistant,\n role: 'user',\n attachments: input.userMessage.attachments ?? [],\n isActive: true,\n status: 'complete',\n ...(input.userMessage as any),\n ...(input.mode ? { mode: input.mode } : {}),\n },\n } as any,\n });\n userPost = userResult.data?.sendMessage as MinimalPost | undefined;\n } catch (err) {\n if (!isDuplicatePostError(err)) {\n throw err;\n }\n console.warn('[saveMessages] user post already persisted (skipping duplicate insert)');\n }\n\n /**\n * Keep the prompting user post id in metadata. `sendMessage.postId` is the id of\n * the post being created, so reusing the user post id for the assistant reply would\n * collide and leave only the user message persisted.\n */\n const userPostId = userPost?.id ?? null;\n\n let assistantPost: MinimalPost | null | undefined;\n try {\n const assistantResult = await sendMessagesMutation({\n variables: {\n channelId: input.sessionId,\n type: RoomType.Aiassistant,\n content: sanitizedAssistantContent,\n extraProps: {\n type: PostTypeEnum.Aiassistant,\n role: 'assistant',\n attachments: input.assistantMessage.attachments ?? [],\n tokenCount: input.assistantMessage.tokenCount,\n latencyMs: input.assistantMessage.latencyMs,\n model: input.assistantMessage.model,\n finishReason: (input.assistantMessage as any).finishReason ?? null,\n isActive: true,\n status: 'complete',\n ...assistantMessageWithoutContent,\n ...(userPostId ? { parentId: userPostId } : {}),\n ...(input.mode ? { mode: input.mode } : {}),\n },\n } as any,\n });\n assistantPost = assistantResult.data?.sendMessage as MinimalPost | undefined;\n } catch (err) {\n if (!isDuplicatePostError(err)) {\n throw err;\n }\n console.warn('[saveMessages] assistant post already persisted (skipping duplicate insert)');\n }\n\n if (!userPost && !assistantPost) {\n throw new Error('Failed to send messages');\n }\n\n appendPostsToThreadCache(\n client,\n input.sessionId,\n [userPost, assistantPost].filter(Boolean) as MinimalPost[],\n );\n\n const now = new Date();\n const fallbackUser: ChatMessageUI = {\n id: userPostId ?? uuidv4(),\n sessionId: input.sessionId,\n role: 'user',\n content: input.userMessage.content ?? '',\n createdAt: now,\n updatedAt: now,\n };\n const fallbackAssistant: ChatMessageUI = {\n id: uuidv4(),\n sessionId: input.sessionId,\n role: 'assistant',\n content: sanitizedAssistantContent,\n createdAt: now,\n updatedAt: now,\n tokenCount: input.assistantMessage.tokenCount,\n model: input.assistantMessage.model,\n };\n return {\n userMessage: userPost ? mapPostToChatMessageUI(userPost, input.sessionId) : fallbackUser,\n assistantMessage: assistantPost\n ? mapPostToChatMessageUI(assistantPost, input.sessionId)\n : fallbackAssistant,\n session: {\n id: input.sessionId,\n title: 'Chat',\n createdAt: now,\n updatedAt: now,\n },\n };\n },\n [client, sendMessagesMutation],\n );\n\n return {\n createChannel,\n createSession: createChannel,\n saveMessages,\n loading: { create: createChannelLoading, saveMessages: sendMessagesLoading },\n };\n}\n"],"names":["_a","_b","_c","_d","_e","uuidv4"],"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 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{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{appendSurfaceAuthParams,buildCdecliTokenInjection,buildSurfaceGateRecoveryScript,mintSurfaceSystemToken,resolveSurfaceCatalogBackend}from'./hooks/mintSurfaceSystemToken.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{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{isKeyboardControllerAvailable}from'./utils/keyboardController.js';export{getNativeCanvasExperience,getNativeCanvasViewer,registerNativeCanvasExperience,registerNativeCanvasViewer}from'./features/canvas/nativeViewerRegistry.js';export{getNativeCharactersExperience,registerNativeCharactersExperience}from'./features/characters/nativeCharactersRegistry.js';export{getNativeChatExperience,registerNativeChatExperience}from'./features/messaging/nativeChatRegistry.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 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{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{appendSurfaceAuthParams,buildCdecliTokenInjection,buildSurfaceGateRecoveryScript,mintSurfaceSystemToken,resolveSurfaceCatalogBackend}from'./hooks/mintSurfaceSystemToken.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{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{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{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 * from './config/constants';\nexport { config } from './config/env-config';\nexport { useCdecliAutoConnect } from './hooks/useCdecliAutoConnect';\nexport { useObtainSystemToken } from './hooks/useObtainSystemToken';\nexport {\n mintSurfaceSystemToken,\n appendSurfaceAuthParams,\n buildCdecliTokenInjection,\n buildSurfaceGateRecoveryScript,\n resolveSurfaceCatalogBackend,\n resolveSurfaceAuthGraphqlUrl,\n} from './hooks/mintSurfaceSystemToken';\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 { 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} 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 {
|
|
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 * from './config/constants';\nexport { config } from './config/env-config';\nexport { useCdecliAutoConnect } from './hooks/useCdecliAutoConnect';\nexport { useObtainSystemToken } from './hooks/useObtainSystemToken';\nexport {\n mintSurfaceSystemToken,\n appendSurfaceAuthParams,\n buildCdecliTokenInjection,\n buildSurfaceGateRecoveryScript,\n resolveSurfaceCatalogBackend,\n resolveSurfaceAuthGraphqlUrl,\n} from './hooks/mintSurfaceSystemToken';\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 { 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';\nexport type {\n ChatHostServices,\n ChatViewer,\n FederatedChatProps,\n NativeChatExperienceProps,\n} from './features/messaging/chatHost';\n"],"names":[],"mappings":"orGAEA,YAAe,IAAI,QAAQ,kBAAkB,CAAA"}
|
package/lib/module.js
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
import {Feature}from'@common-stack/client-react';import {filteredRoutes}from'./compute.js';var YantraMobileModule = new Feature({
|
|
1
|
+
import {Feature}from'@common-stack/client-react';import {filteredRoutes}from'./compute.js';import {typePolicies}from'./graphql/typePolicies.js';var YantraMobileModule = new Feature({
|
|
2
2
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
3
|
-
routeConfig: filteredRoutes
|
|
3
|
+
routeConfig: filteredRoutes,
|
|
4
|
+
clientStateParams: {
|
|
5
|
+
typePolicies
|
|
6
|
+
}
|
|
4
7
|
});export{YantraMobileModule as default};//# sourceMappingURL=module.js.map
|
package/lib/module.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module.js","sources":["../src/module.ts"],"sourcesContent":["/* eslint-disable import/no-extraneous-dependencies */\nimport { Feature } from '@common-stack/client-react';\nimport { filteredRoutes } from './compute';\n\nexport default new Feature({\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n routeConfig: filteredRoutes as any,\n});\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"module.js","sources":["../src/module.ts"],"sourcesContent":["/* eslint-disable import/no-extraneous-dependencies */\nimport { Feature } from '@common-stack/client-react';\nimport { filteredRoutes } from './compute';\nimport { typePolicies } from './graphql/typePolicies';\n\nexport default new Feature({\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n routeConfig: filteredRoutes as any,\n clientStateParams: {\n typePolicies,\n },\n});\n"],"names":[],"mappings":"gJAIA,yBAAe,IAAI,OAAQ,CAAA;AAAA;AAAA,EAEzB,WAAa,EAAA,cAAA;AAAA,EACb,iBAAmB,EAAA;AAAA,IACjB;AAAA;AAEJ,CAAC,CAAA"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {jsx,jsxs,Fragment}from'react/jsx-runtime';import {useMemo,useEffect,useCallback,useState,useRef}from'react';import {useColorScheme,useWindowDimensions,Keyboard,StyleSheet,View}from'react-native';import {getDefaultLeftItems,
|
|
1
|
+
import {jsx,jsxs,Fragment}from'react/jsx-runtime';import {useMemo,useEffect,useCallback,useState,useRef}from'react';import {useColorScheme,useWindowDimensions,Keyboard,StyleSheet,View}from'react-native';import {getDefaultLeftItems,Box,Text,InputToolBar}from'@admin-layout/gluestack-ui-mobile';import {useSafeAreaInsets,SafeAreaView}from'react-native-safe-area-context';import {useNavigation,useRoute,CommonActions}from'@react-navigation/native';import {MessageActionBar}from'../../features/chat/MessageActionBar.js';import {ChatTranscript}from'../../features/chat/ChatTranscript.js';import {AskUserCard}from'../../features/chat/AskUserCard.js';import {pendingAskUser}from'../../features/chat/askUser.js';import {useCdecliConnection}from'../../contexts/CdecliConnectionContext.js';import {useChatStream}from'../../hooks/useChatStream.js';import {KeyboardAwareScreen,KeyboardComposerDock}from'../../components/KeyboardComposerDock.js';import {YantraBrandLoader,YANTRA_LOADER_SIZE_COMPACT}from'../../components/YantraBrandLoader.js';import ThinkingIndicator from'../../components/ThinkingIndicator.js';import {mobileTokens}from'../../theme/mobileTokens.js';import DeepSearchModal from'../Home/components/DeepSearchModal.js';import {normalizeSummaryText,extractDeepSearchSources}from'../Home/deepSearchUtils.js';import {AudioRecorderPanel}from'../../features/audio-input/AudioRecorderPanel.js';import {NativeDictationBar}from'../../features/audio-input/NativeDictationBar.js';import {isNativeDictationAvailable}from'../../features/audio-input/nativeDictation.js';import {useImageAttachments}from'../../features/attachments/useImageAttachments.js';import {ComposerAttachmentBar}from'../../features/attachments/ComposerAttachmentBar.js';import {useComposerAttachMenu}from'../../features/attachments/ComposerAttachMenu.js';import {hasComposerAttachments,takeComposerAttachments}from'../../features/attachments/composerAttachmentHandoff.js';import {MicErrorBoundary}from'../../features/audio-input/MicErrorBoundary.js';import {requestMicPermission}from'../../features/audio-input/useAudioPermission.js';var __defProp = Object.defineProperty;
|
|
2
2
|
var __defProps = Object.defineProperties;
|
|
3
3
|
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
4
4
|
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
@@ -88,6 +88,10 @@ function ChatScreen() {
|
|
|
88
88
|
const chatBusy = isLoading || isStreaming;
|
|
89
89
|
const renderMessageActions = useCallback((message) => message.role === "assistant" ? /* @__PURE__ */ jsx(MessageActionBar, { text: message.content, onRegenerate: chatBusy ? void 0 : () => regenerateFrom(message.id) }) : null, [chatBusy, regenerateFrom]);
|
|
90
90
|
const imageAttachments = useImageAttachments();
|
|
91
|
+
const {
|
|
92
|
+
rightItems,
|
|
93
|
+
menu: attachMenu
|
|
94
|
+
} = useComposerAttachMenu(imageAttachments, isDark);
|
|
91
95
|
const [value, setValue] = useState("");
|
|
92
96
|
const valueRef = useRef(value);
|
|
93
97
|
valueRef.current = value;
|
|
@@ -283,39 +287,6 @@ function ChatScreen() {
|
|
|
283
287
|
onClick: () => handleModeSwitch("build")
|
|
284
288
|
}
|
|
285
289
|
}), [activeMode, handleModeSwitch]);
|
|
286
|
-
const rightItems = useMemo(() => getDefaultRightItems({
|
|
287
|
-
tag: {
|
|
288
|
-
enabled: false
|
|
289
|
-
},
|
|
290
|
-
chip: {
|
|
291
|
-
enabled: false
|
|
292
|
-
},
|
|
293
|
-
// Attaching an image was disabled here even though the transport
|
|
294
|
-
// (`sendMessage(content, attachments)`) and the gateway media lane
|
|
295
|
-
// already carried it, and `expo-image-picker` was already a
|
|
296
|
-
// dependency with its permission strings declared in app.json.
|
|
297
|
-
camera: {
|
|
298
|
-
enabled: true,
|
|
299
|
-
loading: imageAttachments.busyKind === "camera",
|
|
300
|
-
onClick: () => {
|
|
301
|
-
void imageAttachments.captureFromCamera();
|
|
302
|
-
}
|
|
303
|
-
},
|
|
304
|
-
image: {
|
|
305
|
-
enabled: true,
|
|
306
|
-
loading: imageAttachments.busyKind === "library",
|
|
307
|
-
onClick: () => {
|
|
308
|
-
void imageAttachments.pickFromLibrary();
|
|
309
|
-
}
|
|
310
|
-
},
|
|
311
|
-
attach: {
|
|
312
|
-
enabled: true,
|
|
313
|
-
loading: imageAttachments.busyKind === "documents",
|
|
314
|
-
onClick: () => {
|
|
315
|
-
void imageAttachments.pickDocuments();
|
|
316
|
-
}
|
|
317
|
-
}
|
|
318
|
-
}), [imageAttachments]);
|
|
319
290
|
const inputPlaceholder = isDeepSearchMode ? "Research anything..." : isBuildMode ? "Describe an app to build..." : "Ask anything...";
|
|
320
291
|
const inputConfig = useMemo(() => ({
|
|
321
292
|
value,
|
|
@@ -430,7 +401,8 @@ function ChatScreen() {
|
|
|
430
401
|
] })
|
|
431
402
|
] })
|
|
432
403
|
] }) }),
|
|
433
|
-
isDeepSearchMode ? /* @__PURE__ */ jsx(DeepSearchModal, { visible: isDeepSearchModalOpen, query: deepSearchQuery, summaryText: deepSearchSummary, sources: deepSearchSources, isStreaming, researchProcessOpen, sourcesAccordionOpen, onToggleResearchProcess: () => setResearchProcessOpen((prev) => !prev), onToggleSourcesAccordion: () => setSourcesAccordionOpen((prev) => !prev), onRetry: handleDeepSearchRetry, onStop: cancel, onClose: handleDeepSearchClose }) : null
|
|
404
|
+
isDeepSearchMode ? /* @__PURE__ */ jsx(DeepSearchModal, { visible: isDeepSearchModalOpen, query: deepSearchQuery, summaryText: deepSearchSummary, sources: deepSearchSources, isStreaming, researchProcessOpen, sourcesAccordionOpen, onToggleResearchProcess: () => setResearchProcessOpen((prev) => !prev), onToggleSourcesAccordion: () => setSourcesAccordionOpen((prev) => !prev), onRetry: handleDeepSearchRetry, onStop: cancel, onClose: handleDeepSearchClose }) : null,
|
|
405
|
+
attachMenu
|
|
434
406
|
] });
|
|
435
407
|
}
|
|
436
408
|
const styles = StyleSheet.create({
|