@adminide-stack/yantra-mobile 12.0.53-alpha.3 → 12.0.53-alpha.7

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.
@@ -1,4 +1,4 @@
1
- import {useState,useRef,useCallback,useEffect,useMemo}from'react';import {useCreateAccountChatFileUploadLinksMutation,useCreateAccountChatFileDownloadLinksMutation}from'common/graphql';import {useChatMutations,useChatMessages,patchChannelHistoryPreview}from'./useChatApi.js';import {useCdecliChannel,isNoActiveSessionError}from'./useCdecliChannel.js';import {usePrerequisiteIds}from'./usePrerequisiteIds.js';import {isAgentJwtRejected,shouldInlineGatewayMediaForHostedAgent}from'./systemTokenJwt.js';import {config}from'../config/env-config.js';import {buildGatewayMedia,buildGatewayMediaPreferUrls}from'../features/attachments/buildGatewayMedia.js';import {preserveAttachmentPreviews}from'../features/attachments/preserveAttachmentPreviews.js';import {appendOrReplaceAssistant,mergeOptimisticGatewayMessages,collapseConsecutiveAssistants}from'../state/chatThreadMerge.js';var __defProp = Object.defineProperty;
1
+ import {useState,useRef,useCallback,useEffect,useMemo}from'react';import {useCreateAccountChatFileUploadLinksMutation,useCreateAccountChatFileDownloadLinksMutation}from'common/graphql';import {markChannelHistoryRunning,useChatMutations,useChatMessages,clearChannelHistoryRunning,patchChannelHistoryPreview}from'./useChatApi.js';import {useCdecliChannel,isNoActiveSessionError}from'./useCdecliChannel.js';import {usePrerequisiteIds}from'./usePrerequisiteIds.js';import {isAgentJwtRejected,shouldInlineGatewayMediaForHostedAgent}from'./systemTokenJwt.js';import {config}from'../config/env-config.js';import {buildGatewayMedia,buildGatewayMediaPreferUrls}from'../features/attachments/buildGatewayMedia.js';import {preserveAttachmentPreviews}from'../features/attachments/preserveAttachmentPreviews.js';import {appendOrReplaceAssistant,mergeOptimisticGatewayMessages,collapseConsecutiveAssistants}from'../state/chatThreadMerge.js';var __defProp = Object.defineProperty;
2
2
  var __defProps = Object.defineProperties;
3
3
  var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
4
  var __getOwnPropSymbols = Object.getOwnPropertySymbols;
@@ -89,7 +89,12 @@ function useChatStream(sessionId, routing = {
89
89
  const pending = pendingStreamRef.current;
90
90
  if (!pending) return;
91
91
  pendingStreamRef.current = "";
92
- setResponse((r) => r + pending);
92
+ setResponse((r) => {
93
+ const next = r + pending;
94
+ const sid = sessionIdRef.current;
95
+ if (sid) markChannelHistoryRunning(sid, next);
96
+ return next;
97
+ });
93
98
  }, []);
94
99
  useEffect(() => () => clearPendingStream(), [clearPendingStream]);
95
100
  const {
@@ -110,6 +115,7 @@ function useChatStream(sessionId, routing = {
110
115
  const lastHydratedSessionIdRef = useRef(null);
111
116
  const streamChannelId = sessionId || cdecliStreamOverrideId;
112
117
  const finalizeCdecliRound = useCallback((assistantContent) => {
118
+ const previewSid = saveSessionIdRef.current || sessionIdRef.current;
113
119
  clearPendingStream();
114
120
  saveSessionIdRef.current = null;
115
121
  userMsgForSaveRef.current = null;
@@ -118,17 +124,27 @@ function useChatStream(sessionId, routing = {
118
124
  setIsLoading(false);
119
125
  setIsStreaming(false);
120
126
  isSendingRef.current = false;
127
+ if (previewSid) clearChannelHistoryRunning(previewSid);
121
128
  if (assistantContent !== void 0) {
122
129
  setMessages((prev) => appendOrReplaceAssistant(prev, {
123
130
  role: "assistant",
124
131
  content: assistantContent
125
132
  }));
126
- const previewSid = saveSessionIdRef.current || sessionIdRef.current;
127
133
  if (previewSid) patchChannelHistoryPreview(previewSid, assistantContent);
128
134
  }
129
135
  }, [clearPendingStream]);
130
136
  const cdecliCallbacks = useMemo(() => ({
131
137
  onChunk: (text) => {
138
+ if (!isSendingRef.current) {
139
+ isSendingRef.current = true;
140
+ cdecliRoundHandledRef.current = false;
141
+ saveSessionIdRef.current = sessionIdRef.current;
142
+ setIsLoading(true);
143
+ setIsStreaming(true);
144
+ setError(null);
145
+ const sid = sessionIdRef.current;
146
+ if (sid) markChannelHistoryRunning(sid, text);
147
+ }
132
148
  pendingStreamRef.current += text;
133
149
  if (!sessionLiveRef.current) {
134
150
  sessionLiveRef.current = true;
@@ -176,7 +192,10 @@ function useChatStream(sessionId, routing = {
176
192
  content: text
177
193
  }));
178
194
  const previewSid = sid || sessionIdRef.current;
179
- if (previewSid) patchChannelHistoryPreview(previewSid, text);
195
+ if (previewSid) {
196
+ clearChannelHistoryRunning(previewSid);
197
+ patchChannelHistoryPreview(previewSid, text);
198
+ }
180
199
  setResponse("");
181
200
  setIsLoading(false);
182
201
  setIsStreaming(false);
@@ -260,7 +279,19 @@ function useChatStream(sessionId, routing = {
260
279
  }
261
280
  }, [sessionId, cdecliStreamOverrideId]);
262
281
  useEffect(() => {
263
- if (isSendingRef.current) return;
282
+ const prevSid = lastHydratedSessionIdRef.current;
283
+ if (prevSid && sessionId && prevSid !== sessionId && isSendingRef.current) {
284
+ clearPendingStream();
285
+ pendingSteersRef.current = [];
286
+ isSendingRef.current = false;
287
+ sessionLiveRef.current = false;
288
+ cdecliRoundHandledRef.current = false;
289
+ saveSessionIdRef.current = null;
290
+ userMsgForSaveRef.current = null;
291
+ setIsLoading(false);
292
+ setIsStreaming(false);
293
+ setResponse("");
294
+ }
264
295
  if (!sessionId) {
265
296
  setMessages([]);
266
297
  setResponse("");
@@ -268,30 +299,39 @@ function useChatStream(sessionId, routing = {
268
299
  return;
269
300
  }
270
301
  const stampHistoryPreview = (msgs) => {
302
+ const last = msgs[msgs.length - 1];
271
303
  const lastAssistant = [...msgs].reverse().find((msg) => msg.role === "assistant" && msg.content.trim());
272
- if (lastAssistant) patchChannelHistoryPreview(sessionId, lastAssistant.content);
304
+ if (lastAssistant && !isSendingRef.current) {
305
+ patchChannelHistoryPreview(sessionId, lastAssistant.content);
306
+ }
307
+ if (!isSendingRef.current && (last == null ? void 0 : last.role) === "assistant") {
308
+ clearChannelHistoryRunning(sessionId);
309
+ }
273
310
  };
311
+ const keepStream = isSendingRef.current;
274
312
  const sessionChanged = lastHydratedSessionIdRef.current !== sessionId;
275
313
  if (sessionChanged) {
276
314
  lastHydratedSessionIdRef.current = sessionId;
277
315
  if (!backendMessagesLoaded) {
278
- setMessages([]);
279
- setResponse("");
316
+ if (!keepStream) {
317
+ setMessages([]);
318
+ setResponse("");
319
+ }
280
320
  return;
281
321
  }
282
322
  const formatted = formatBackendThread(backendMessages != null ? backendMessages : []);
283
323
  stampHistoryPreview(formatted);
284
- setMessages(formatted);
285
- setResponse("");
324
+ setMessages((prev) => keepStream ? mergeOptimisticGatewayMessages(prev, formatted) : formatted);
325
+ if (!keepStream) setResponse("");
286
326
  return;
287
327
  }
288
328
  if (backendMessagesLoaded) {
289
329
  const formatted = formatBackendThread(backendMessages != null ? backendMessages : []);
290
330
  stampHistoryPreview(formatted);
291
331
  setMessages((prev) => preserveAttachmentPreviews(prev, mergeOptimisticGatewayMessages(prev, formatted)));
292
- setResponse("");
332
+ if (!keepStream) setResponse("");
293
333
  }
294
- }, [sessionId, backendMessages, backendMessagesLoaded]);
334
+ }, [sessionId, backendMessages, backendMessagesLoaded, clearPendingStream]);
295
335
  const sendMessage = useCallback(async (content, attachments, sessionIdOverride, alreadyVisible = false) => {
296
336
  if (!content.trim() && !(attachments == null ? void 0 : attachments.length)) return;
297
337
  const effectiveSessionId = sessionIdOverride !== void 0 ? sessionIdOverride : sessionId;
@@ -319,6 +359,7 @@ function useChatStream(sessionId, routing = {
319
359
  if (effectiveSessionId && sendText) {
320
360
  titlePatchedChannelsRef.current.add(effectiveSessionId);
321
361
  patchChannelTitle(effectiveSessionId, sendText, true);
362
+ markChannelHistoryRunning(effectiveSessionId);
322
363
  }
323
364
  if (!alreadyVisible) {
324
365
  setMessages((prev) => [...prev, userMessage]);
@@ -339,6 +380,7 @@ function useChatStream(sessionId, routing = {
339
380
  setIsStreaming(false);
340
381
  userMsgForSaveRef.current = null;
341
382
  saveSessionIdRef.current = null;
383
+ if (effectiveSessionId) clearChannelHistoryRunning(effectiveSessionId);
342
384
  return;
343
385
  }
344
386
  if (!effectiveSessionId) {
@@ -387,6 +429,7 @@ function useChatStream(sessionId, routing = {
387
429
  setIsStreaming(false);
388
430
  userMsgForSaveRef.current = null;
389
431
  saveSessionIdRef.current = null;
432
+ clearChannelHistoryRunning(effectiveSessionId);
390
433
  }
391
434
  }, [sessionId, sendCdecliMessage, patchChannelTitle, flushPendingSteers, createAccountChatFileUploadLinksMutation, createAccountChatFileDownloadLinksMutation]);
392
435
  sendMessageRef.current = sendMessage;
@@ -1 +1 @@
1
- {"version":3,"file":"useChatStream.js","sources":["../../src/hooks/useChatStream.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n useCreateAccountChatFileDownloadLinksMutation,\n useCreateAccountChatFileUploadLinksMutation,\n} from 'common/graphql';\nimport { patchChannelHistoryPreview, useChatMutations, useChatMessages } from './useChatApi';\nimport { isNoActiveSessionError, useCdecliChannel } from './useCdecliChannel';\nimport { usePrerequisiteIds } from './usePrerequisiteIds';\nimport { isAgentJwtRejected, shouldInlineGatewayMediaForHostedAgent } from './systemTokenJwt';\nimport { config } from '../config';\nimport { buildGatewayMedia, buildGatewayMediaPreferUrls } from '../features/attachments/buildGatewayMedia';\nimport { preserveAttachmentPreviews } from '../features/attachments/preserveAttachmentPreviews';\nimport {\n appendOrReplaceAssistant,\n collapseConsecutiveAssistants,\n mergeOptimisticGatewayMessages,\n} from '../state/chatThreadMerge';\n\n/** Agent returned an error while the cdecli-serve channel stayed connected (e.g. bad LLM API key). */\nfunction isCdecliAgentFailureOutput(text: string): boolean {\n const t = text.trim();\n if (!t) return false;\n return (\n /⚠\\s*Error:/.test(t) ||\n /LLM stream error/i.test(t) ||\n /Incorrect API key/i.test(t) ||\n /invalid_api_key/i.test(t) ||\n /authentication_error/i.test(t) ||\n isAgentJwtRejected(t)\n );\n}\n\nexport interface MessageAttachment {\n id: string;\n name: string;\n type: 'file' | 'screenshot';\n dataUrl?: string;\n mimeType?: string;\n size?: number;\n url?: string;\n}\n\nexport interface ChatMessage {\n role: 'user' | 'assistant';\n content: string;\n attachments?: MessageAttachment[];\n metadata?: {\n tokenUsage?: { inputTokens: number; outputTokens: number; totalTokens: number };\n model?: string;\n };\n}\n\nfunction formatBackendThread(\n backendMessages: Array<{\n role: string;\n content?: string;\n attachments?: ChatMessage['attachments'];\n tokenCount?: number;\n model?: string;\n }>,\n): ChatMessage[] {\n return collapseConsecutiveAssistants(\n backendMessages.map((msg) => ({\n role: msg.role as 'user' | 'assistant',\n content: msg.content ?? '',\n attachments: msg.attachments?.map((a) => ({\n id: a.id,\n name: a.name,\n type: a.type === 'screenshot' ? 'screenshot' : 'file',\n mimeType: a.mimeType,\n size: a.size,\n url: a.url,\n })),\n metadata: msg.tokenCount\n ? {\n tokenUsage: {\n inputTokens: 0,\n outputTokens: msg.tokenCount,\n totalTokens: msg.tokenCount,\n },\n model: msg.model,\n }\n : undefined,\n })),\n );\n}\n\n/** Mobile chat routes exclusively through CDeCLI (messenger-gateway). */\nexport interface UseChatStreamRouting {\n channelConnected: boolean;\n accountId: string;\n /** When `'backend'`, the gateway persists posts — skip client `saveMessages`. */\n persistenceMode?: 'backend' | 'frontend';\n /** Remint the system JWT and reconnect after cdecli-agent 401s the session. */\n recoverAgentAuth?: () => Promise<boolean>;\n}\n\nexport function useChatStream(\n sessionId: string | null,\n routing: UseChatStreamRouting = {\n channelConnected: false,\n accountId: 'default',\n persistenceMode: 'backend',\n },\n) {\n const [messages, setMessages] = useState<ChatMessage[]>([]);\n const [response, setResponse] = useState('');\n const [isLoading, setIsLoading] = useState(false);\n const [isStreaming, setIsStreaming] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const isSendingRef = useRef(false);\n /** Follow-ups typed before cdecli has an active session. Flushed after the first token. */\n const pendingSteersRef = useRef<string[]>([]);\n /** True once this turn has produced at least one stream chunk (steer is valid). */\n const sessionLiveRef = useRef(false);\n const flushPendingSteersRef = useRef<() => Promise<void>>(async () => {});\n const sendMessageRef = useRef<\n (\n content: string,\n attachments?: MessageAttachment[],\n sessionIdOverride?: string | null,\n alreadyVisible?: boolean,\n ) => Promise<void>\n >(async () => {});\n\n /** Ensures GraphQL stream subscriptions use the id from createChannel+send before the next parent render. */\n const [cdecliStreamOverrideId, setCdecliStreamOverrideId] = useState<string | undefined>(undefined);\n const userMsgForSaveRef = useRef<ChatMessage | null>(null);\n const saveSessionIdRef = useRef<string | null>(null);\n const sessionIdRef = useRef<string | null>(sessionId);\n sessionIdRef.current = sessionId || cdecliStreamOverrideId || null;\n /** Blocks duplicate cdecli `onComplete` from appending assistant twice / saving twice per send. */\n const cdecliRoundHandledRef = useRef(false);\n /** One remint+resend per turn when cdecli-agent 401s the JWT. */\n const authRetryUsedRef = useRef(false);\n const recoveringAuthRef = useRef(false);\n const routingRef = useRef(routing);\n routingRef.current = routing;\n\n const tryRecoverAndResendRef = useRef<(reason: string) => Promise<boolean>>(async () => false);\n\n /** Coalesce token deltas so Fabric is not committing a native tree every chunk. */\n const pendingStreamRef = useRef('');\n const streamFlushTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const clearPendingStream = useCallback(() => {\n if (streamFlushTimerRef.current != null) {\n clearTimeout(streamFlushTimerRef.current);\n streamFlushTimerRef.current = null;\n }\n pendingStreamRef.current = '';\n }, []);\n\n const flushPendingStream = useCallback(() => {\n streamFlushTimerRef.current = null;\n const pending = pendingStreamRef.current;\n if (!pending) return;\n pendingStreamRef.current = '';\n setResponse((r) => r + pending);\n }, []);\n\n useEffect(() => () => clearPendingStream(), [clearPendingStream]);\n\n const { saveMessages, patchChannelTitle } = useChatMutations();\n const titlePatchedChannelsRef = useRef(new Set<string>());\n const { accountUserId } = usePrerequisiteIds();\n const [createAccountChatFileUploadLinksMutation] = useCreateAccountChatFileUploadLinksMutation();\n const [createAccountChatFileDownloadLinksMutation] = useCreateAccountChatFileDownloadLinksMutation();\n const {\n messages: backendMessages,\n loading: backendMessagesLoading,\n messagesLoaded: backendMessagesLoaded,\n } = useChatMessages(sessionId);\n const lastHydratedSessionIdRef = useRef<string | null>(null);\n\n const streamChannelId = sessionId || cdecliStreamOverrideId;\n\n const finalizeCdecliRound = useCallback(\n (assistantContent?: string) => {\n clearPendingStream();\n saveSessionIdRef.current = null;\n userMsgForSaveRef.current = null;\n sessionLiveRef.current = false;\n setResponse('');\n setIsLoading(false);\n setIsStreaming(false);\n isSendingRef.current = false;\n if (assistantContent !== undefined) {\n setMessages((prev) =>\n appendOrReplaceAssistant(prev, { role: 'assistant' as const, content: assistantContent }),\n );\n const previewSid = saveSessionIdRef.current || sessionIdRef.current;\n if (previewSid) patchChannelHistoryPreview(previewSid, assistantContent);\n }\n },\n [clearPendingStream],\n );\n\n const cdecliCallbacks = useMemo(\n () => ({\n onChunk: (text: string) => {\n pendingStreamRef.current += text;\n if (!sessionLiveRef.current) {\n sessionLiveRef.current = true;\n void flushPendingSteersRef.current();\n }\n if (streamFlushTimerRef.current == null) {\n streamFlushTimerRef.current = setTimeout(flushPendingStream, 50);\n }\n },\n // The brain's provisional answer is the WHOLE reply-so-far, not a chunk:\n // it is set outright, and set to '' when the real stream supersedes it.\n // It deliberately does not mark the session live - steers wait for the\n // agent, which is the only side that can act on them.\n onQuickReply: (text: string) => {\n setResponse(text);\n },\n onComplete: (text: string) => {\n clearPendingStream();\n if (cdecliRoundHandledRef.current) {\n return;\n }\n\n if (isCdecliAgentFailureOutput(text)) {\n void (async () => {\n if (await tryRecoverAndResendRef.current(text)) return;\n if (cdecliRoundHandledRef.current) return;\n cdecliRoundHandledRef.current = true;\n pendingSteersRef.current = [];\n setError(\n isAgentJwtRejected(text)\n ? text\n : 'CDeCLI agent error. Check gateway status and server-side LLM configuration.',\n );\n finalizeCdecliRound(isAgentJwtRejected(text) ? undefined : text);\n })();\n return;\n }\n\n cdecliRoundHandledRef.current = true;\n authRetryUsedRef.current = false;\n\n const sid = saveSessionIdRef.current;\n const um = userMsgForSaveRef.current;\n const leftover = pendingSteersRef.current;\n pendingSteersRef.current = [];\n saveSessionIdRef.current = null;\n userMsgForSaveRef.current = null;\n sessionLiveRef.current = false;\n\n setMessages((prev) => appendOrReplaceAssistant(prev, { role: 'assistant' as const, content: text }));\n const previewSid = sid || sessionIdRef.current;\n if (previewSid) patchChannelHistoryPreview(previewSid, text);\n setResponse('');\n setIsLoading(false);\n setIsStreaming(false);\n isSendingRef.current = false;\n\n const rt = routingRef.current;\n const persistClientSide = rt.persistenceMode !== 'backend';\n\n if (sid && um && persistClientSide) {\n saveMessages({\n sessionId: sid,\n ...(accountUserId ? { createdBy: accountUserId } : {}),\n userMessage: {\n content: um.content,\n attachments: um.attachments?.map((a) => ({\n id: a.id,\n name: a.name,\n type: a.type,\n mimeType: a.mimeType,\n size: a.size,\n url: a.url,\n })),\n },\n assistantMessage: {\n content: text,\n tokenCount: undefined,\n model: 'cdecli-serve',\n },\n }).catch((e) => {\n console.error('[useChatStream] saveMessages (cdecli):', e);\n });\n }\n\n if (leftover.length > 0) {\n const [first, ...rest] = leftover;\n pendingSteersRef.current = rest;\n queueMicrotask(() => {\n void sendMessageRef.current(first, undefined, sid, true);\n });\n }\n },\n onError: (err: string) => {\n if (cdecliRoundHandledRef.current) return;\n void (async () => {\n if (await tryRecoverAndResendRef.current(err)) return;\n if (cdecliRoundHandledRef.current) return;\n cdecliRoundHandledRef.current = true;\n pendingSteersRef.current = [];\n setError(err || 'CDeCLI stream error.');\n finalizeCdecliRound();\n })();\n },\n }),\n [saveMessages, accountUserId, finalizeCdecliRound, flushPendingStream, clearPendingStream],\n );\n\n const {\n sendMessage: sendCdecliMessage,\n steer: steerCdecliMessage,\n cancel: cancelCdecliTurn,\n } = useCdecliChannel(routing.channelConnected, routing.accountId, streamChannelId, cdecliCallbacks);\n\n const flushPendingSteers = useCallback(async () => {\n if (!sessionLiveRef.current || !isSendingRef.current) return;\n const sid = saveSessionIdRef.current;\n if (!sid) return;\n\n while (pendingSteersRef.current.length > 0 && sessionLiveRef.current && isSendingRef.current) {\n const next = pendingSteersRef.current[0];\n const result = await steerCdecliMessage(next, sid);\n if (result.ok) {\n pendingSteersRef.current.shift();\n continue;\n }\n if (isNoActiveSessionError(result.error)) {\n return;\n }\n pendingSteersRef.current.shift();\n setError(result.error || 'Could not send follow-up. Try again.');\n return;\n }\n }, [steerCdecliMessage]);\n\n flushPendingSteersRef.current = flushPendingSteers;\n\n useEffect(() => {\n if (sessionId && cdecliStreamOverrideId && sessionId === cdecliStreamOverrideId) {\n setCdecliStreamOverrideId(undefined);\n }\n }, [sessionId, cdecliStreamOverrideId]);\n\n useEffect(() => {\n if (isSendingRef.current) return;\n\n if (!sessionId) {\n setMessages([]);\n setResponse('');\n lastHydratedSessionIdRef.current = null;\n return;\n }\n\n const stampHistoryPreview = (msgs: ChatMessage[]) => {\n const lastAssistant = [...msgs].reverse().find((msg) => msg.role === 'assistant' && msg.content.trim());\n if (lastAssistant) patchChannelHistoryPreview(sessionId, lastAssistant.content);\n };\n\n const sessionChanged = lastHydratedSessionIdRef.current !== sessionId;\n if (sessionChanged) {\n lastHydratedSessionIdRef.current = sessionId;\n // Do not merge the previous channel's in-memory thread into this one.\n if (!backendMessagesLoaded) {\n setMessages([]);\n setResponse('');\n return;\n }\n const formatted = formatBackendThread(backendMessages ?? []);\n stampHistoryPreview(formatted);\n setMessages(formatted);\n setResponse('');\n return;\n }\n\n if (backendMessagesLoaded) {\n const formatted = formatBackendThread(backendMessages ?? []);\n stampHistoryPreview(formatted);\n // Positional merge first so assistant replies the gateway never persisted\n // (cdecli skill turns emit no chatMessageAdded) survive this snapshot instead\n // of being dropped, then preserve in-memory attachment previews on the result.\n setMessages((prev) => preserveAttachmentPreviews(prev, mergeOptimisticGatewayMessages(prev, formatted)));\n setResponse('');\n }\n }, [sessionId, backendMessages, backendMessagesLoaded]);\n\n const sendMessage = useCallback(\n async (\n content: string,\n attachments?: MessageAttachment[],\n sessionIdOverride?: string | null,\n alreadyVisible = false,\n ) => {\n if (!content.trim() && !attachments?.length) return;\n\n const effectiveSessionId = sessionIdOverride !== undefined ? sessionIdOverride : sessionId;\n const rt = routingRef.current;\n const trimmed = content.trim();\n const sendText =\n trimmed ||\n (attachments?.length\n ? `Attached: ${attachments\n .map((a) => a.name)\n .filter(Boolean)\n .join(', ')}`\n : '');\n\n const userMessage: ChatMessage = {\n role: 'user',\n content: sendText,\n attachments,\n };\n\n /**\n * A turn is already in flight. Keep the follow-up visible and queue it.\n * cdecli rejects steer until the agent session exists (\"no active session\"),\n * which is after the first token. Flush then. Never error/LogBox for that race.\n */\n if (isSendingRef.current) {\n if (!rt.channelConnected || !effectiveSessionId) {\n setError(\n !rt.channelConnected\n ? 'CDeCLI is not connected yet. Check gateway status in the header.'\n : 'Missing chat session id.',\n );\n return;\n }\n setMessages((prev) => [...prev, userMessage]);\n setError(null);\n pendingSteersRef.current = [...pendingSteersRef.current, sendText];\n void flushPendingSteers();\n return;\n }\n\n isSendingRef.current = true;\n sessionLiveRef.current = false;\n if (effectiveSessionId && sendText) {\n titlePatchedChannelsRef.current.add(effectiveSessionId);\n patchChannelTitle(effectiveSessionId, sendText, true);\n }\n if (!alreadyVisible) {\n setMessages((prev) => [...prev, userMessage]);\n authRetryUsedRef.current = false;\n }\n setResponse('');\n setIsLoading(true);\n setIsStreaming(true);\n setError(null);\n userMsgForSaveRef.current = userMessage;\n saveSessionIdRef.current = effectiveSessionId ?? null;\n cdecliRoundHandledRef.current = false;\n\n if (!rt.channelConnected) {\n setError('CDeCLI is not connected yet. Check gateway status in the header.');\n if (!alreadyVisible) setMessages((p) => p.slice(0, -1));\n isSendingRef.current = false;\n setIsLoading(false);\n setIsStreaming(false);\n userMsgForSaveRef.current = null;\n saveSessionIdRef.current = null;\n return;\n }\n if (!effectiveSessionId) {\n setError('Missing chat session id.');\n if (!alreadyVisible) setMessages((p) => p.slice(0, -1));\n isSendingRef.current = false;\n setIsLoading(false);\n setIsStreaming(false);\n userMsgForSaveRef.current = null;\n saveSessionIdRef.current = null;\n return;\n }\n\n if (sessionIdOverride) {\n setCdecliStreamOverrideId(sessionIdOverride);\n await new Promise<void>((resolve) => {\n setTimeout(resolve, 0);\n });\n }\n\n const inlineForHostedAgent = shouldInlineGatewayMediaForHostedAgent(\n config.GRAPHQL_URL,\n config.CDECLI_AGENT_ENDPOINT,\n );\n const media = inlineForHostedAgent\n ? buildGatewayMedia(attachments, { includeData: true })\n : await buildGatewayMediaPreferUrls(\n attachments,\n async (filenames) => {\n const result = await createAccountChatFileUploadLinksMutation({\n variables: { filenames },\n });\n return result.data?.createAccountChatFileUploadLinks || [];\n },\n async (urls) => {\n const result = await createAccountChatFileDownloadLinksMutation({\n variables: { urls },\n });\n return result.data?.createAccountChatFileDownloadLinks || [];\n },\n );\n const ok = await sendCdecliMessage(sendText, effectiveSessionId, media);\n if (!ok && !cdecliRoundHandledRef.current && !recoveringAuthRef.current) {\n cdecliRoundHandledRef.current = true;\n setError('Failed to send message via CDeCLI. Check gateway connection.');\n if (!alreadyVisible) setMessages((p) => p.slice(0, -1));\n isSendingRef.current = false;\n setIsLoading(false);\n setIsStreaming(false);\n userMsgForSaveRef.current = null;\n saveSessionIdRef.current = null;\n }\n },\n [\n sessionId,\n sendCdecliMessage,\n patchChannelTitle,\n flushPendingSteers,\n createAccountChatFileUploadLinksMutation,\n createAccountChatFileDownloadLinksMutation,\n ],\n );\n\n sendMessageRef.current = sendMessage;\n\n tryRecoverAndResendRef.current = async (reason: string) => {\n if (authRetryUsedRef.current || cdecliRoundHandledRef.current) return false;\n if (!isAgentJwtRejected(reason)) return false;\n const recover = routingRef.current.recoverAgentAuth;\n if (!recover) return false;\n authRetryUsedRef.current = true;\n recoveringAuthRef.current = true;\n try {\n setError('Refreshing CDeCLI credentials…');\n const recovered = await recover();\n if (!recovered) return false;\n const um = userMsgForSaveRef.current;\n const sid = saveSessionIdRef.current;\n cdecliRoundHandledRef.current = false;\n isSendingRef.current = false;\n setIsLoading(false);\n setIsStreaming(false);\n setError(null);\n if (um && sid) {\n queueMicrotask(() => {\n void sendMessageRef.current(um.content, um.attachments, sid, true);\n });\n }\n return true;\n } catch (err) {\n console.error('[useChatStream] recoverAgentAuth failed:', err);\n return false;\n } finally {\n recoveringAuthRef.current = false;\n }\n };\n\n const cancel = useCallback(() => {\n clearPendingStream();\n pendingSteersRef.current = [];\n sessionLiveRef.current = false;\n const sid = saveSessionIdRef.current ?? sessionId;\n void cancelCdecliTurn(sid ?? 'messenger');\n if (!cdecliRoundHandledRef.current) {\n cdecliRoundHandledRef.current = true;\n finalizeCdecliRound();\n }\n }, [cancelCdecliTurn, finalizeCdecliRound, sessionId, clearPendingStream]);\n\n const clearMessages = useCallback(() => {\n clearPendingStream();\n setMessages([]);\n setResponse('');\n setError(null);\n }, [clearPendingStream]);\n\n const messagesLoading = !!sessionId && backendMessagesLoading && !backendMessagesLoaded;\n\n return {\n messages,\n response,\n error,\n isLoading,\n isStreaming,\n messagesLoading,\n hasMessages: messages.length > 0 || !!response,\n sendMessage,\n cancel,\n clearMessages,\n };\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;AAYA,SAAS,2BAA2B,IAAuB,EAAA;AACzD,EAAM,MAAA,CAAA,GAAI,KAAK,IAAK,EAAA;AACpB,EAAI,IAAA,CAAC,GAAU,OAAA,KAAA;AACf,EAAO,OAAA,YAAA,CAAa,KAAK,CAAC,CAAA,IAAK,oBAAoB,IAAK,CAAA,CAAC,KAAK,oBAAqB,CAAA,IAAA,CAAK,CAAC,CAAK,IAAA,kBAAA,CAAmB,KAAK,CAAC,CAAA,IAAK,wBAAwB,IAAK,CAAA,CAAC,CAAK,IAAA,kBAAA,CAAmB,CAAC,CAAA;AACrL;AAuBA,SAAS,oBAAoB,eAMV,EAAA;AACjB,EAAO,OAAA,6BAAA,CAA8B,eAAgB,CAAA,GAAA,CAAI,CAAI,GAAA,KAAA;AA9C/D,IAAA,IAAA,EAAA,EAAA,EAAA;AA8CmE,IAAA,OAAA;AAAA,MAC/D,MAAM,GAAI,CAAA,IAAA;AAAA,MACV,OAAA,EAAA,CAAS,EAAI,GAAA,GAAA,CAAA,OAAA,KAAJ,IAAe,GAAA,EAAA,GAAA,EAAA;AAAA,MACxB,WAAa,EAAA,CAAA,EAAA,GAAA,GAAA,CAAI,WAAJ,KAAA,IAAA,GAAA,MAAA,GAAA,EAAA,CAAiB,IAAI,CAAM,CAAA,MAAA;AAAA,QACtC,IAAI,CAAE,CAAA,EAAA;AAAA,QACN,MAAM,CAAE,CAAA,IAAA;AAAA,QACR,IAAM,EAAA,CAAA,CAAE,IAAS,KAAA,YAAA,GAAe,YAAe,GAAA,MAAA;AAAA,QAC/C,UAAU,CAAE,CAAA,QAAA;AAAA,QACZ,MAAM,CAAE,CAAA,IAAA;AAAA,QACR,KAAK,CAAE,CAAA;AAAA,OACT,CAAA,CAAA;AAAA,MACA,QAAA,EAAU,IAAI,UAAa,GAAA;AAAA,QACzB,UAAY,EAAA;AAAA,UACV,WAAa,EAAA,CAAA;AAAA,UACb,cAAc,GAAI,CAAA,UAAA;AAAA,UAClB,aAAa,GAAI,CAAA;AAAA,SACnB;AAAA,QACA,OAAO,GAAI,CAAA;AAAA,OACT,GAAA;AAAA,KACN;AAAA,GAAE,CAAC,CAAA;AACL;AAWgB,SAAA,aAAA,CAAc,WAA0B,OAAgC,GAAA;AAAA,EACtF,gBAAkB,EAAA,KAAA;AAAA,EAClB,SAAW,EAAA,SAAA;AAAA,EACX,eAAiB,EAAA;AACnB,CAAG,EAAA;AACD,EAAA,MAAM,CAAC,QAAU,EAAA,WAAW,CAAI,GAAA,QAAA,CAAwB,EAAE,CAAA;AAC1D,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,SAAS,EAAE,CAAA;AAC3C,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAS,KAAK,CAAA;AACpD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAwB,IAAI,CAAA;AACtD,EAAM,MAAA,YAAA,GAAe,OAAO,KAAK,CAAA;AAEjC,EAAM,MAAA,gBAAA,GAAmB,MAAiB,CAAA,EAAE,CAAA;AAE5C,EAAM,MAAA,cAAA,GAAiB,OAAO,KAAK,CAAA;AACnC,EAAM,MAAA,qBAAA,GAAwB,OAA4B,YAAY;AAAA,GAAE,CAAA;AACxE,EAAM,MAAA,cAAA,GAAiB,OAA2I,YAAY;AAAA,GAAE,CAAA;AAGhL,EAAA,MAAM,CAAC,sBAAA,EAAwB,yBAAyB,CAAA,GAAI,SAA6B,MAAS,CAAA;AAClG,EAAM,MAAA,iBAAA,GAAoB,OAA2B,IAAI,CAAA;AACzD,EAAM,MAAA,gBAAA,GAAmB,OAAsB,IAAI,CAAA;AACnD,EAAM,MAAA,YAAA,GAAe,OAAsB,SAAS,CAAA;AACpD,EAAa,YAAA,CAAA,OAAA,GAAU,aAAa,sBAA0B,IAAA,IAAA;AAE9D,EAAM,MAAA,qBAAA,GAAwB,OAAO,KAAK,CAAA;AAE1C,EAAM,MAAA,gBAAA,GAAmB,OAAO,KAAK,CAAA;AACrC,EAAM,MAAA,iBAAA,GAAoB,OAAO,KAAK,CAAA;AACtC,EAAM,MAAA,UAAA,GAAa,OAAO,OAAO,CAAA;AACjC,EAAA,UAAA,CAAW,OAAU,GAAA,OAAA;AACrB,EAAM,MAAA,sBAAA,GAAyB,MAA6C,CAAA,YAAY,KAAK,CAAA;AAG7F,EAAM,MAAA,gBAAA,GAAmB,OAAO,EAAE,CAAA;AAClC,EAAM,MAAA,mBAAA,GAAsB,OAA6C,IAAI,CAAA;AAC7E,EAAM,MAAA,kBAAA,GAAqB,YAAY,MAAM;AAC3C,IAAI,IAAA,mBAAA,CAAoB,WAAW,IAAM,EAAA;AACvC,MAAA,YAAA,CAAa,oBAAoB,OAAO,CAAA;AACxC,MAAA,mBAAA,CAAoB,OAAU,GAAA,IAAA;AAAA;AAEhC,IAAA,gBAAA,CAAiB,OAAU,GAAA,EAAA;AAAA,GAC7B,EAAG,EAAE,CAAA;AACL,EAAM,MAAA,kBAAA,GAAqB,YAAY,MAAM;AAC3C,IAAA,mBAAA,CAAoB,OAAU,GAAA,IAAA;AAC9B,IAAA,MAAM,UAAU,gBAAiB,CAAA,OAAA;AACjC,IAAA,IAAI,CAAC,OAAS,EAAA;AACd,IAAA,gBAAA,CAAiB,OAAU,GAAA,EAAA;AAC3B,IAAY,WAAA,CAAA,CAAA,CAAA,KAAK,IAAI,OAAO,CAAA;AAAA,GAC9B,EAAG,EAAE,CAAA;AACL,EAAA,SAAA,CAAU,MAAM,MAAM,kBAAA,EAAsB,EAAA,CAAC,kBAAkB,CAAC,CAAA;AAChE,EAAM,MAAA;AAAA,IACJ,YAAA;AAAA,IACA;AAAA,MACE,gBAAiB,EAAA;AACrB,EAAA,MAAM,uBAA0B,GAAA,MAAA,iBAAW,IAAA,GAAA,EAAa,CAAA;AACxD,EAAM,MAAA;AAAA,IACJ;AAAA,MACE,kBAAmB,EAAA;AACvB,EAAM,MAAA,CAAC,wCAAwC,CAAA,GAAI,2CAA4C,EAAA;AAC/F,EAAM,MAAA,CAAC,0CAA0C,CAAA,GAAI,6CAA8C,EAAA;AACnG,EAAM,MAAA;AAAA,IACJ,QAAU,EAAA,eAAA;AAAA,IACV,OAAS,EAAA,sBAAA;AAAA,IACT,cAAgB,EAAA;AAAA,GAClB,GAAI,gBAAgB,SAAS,CAAA;AAC7B,EAAM,MAAA,wBAAA,GAA2B,OAAsB,IAAI,CAAA;AAC3D,EAAA,MAAM,kBAAkB,SAAa,IAAA,sBAAA;AACrC,EAAM,MAAA,mBAAA,GAAsB,WAAY,CAAA,CAAC,gBAA8B,KAAA;AACrE,IAAmB,kBAAA,EAAA;AACnB,IAAA,gBAAA,CAAiB,OAAU,GAAA,IAAA;AAC3B,IAAA,iBAAA,CAAkB,OAAU,GAAA,IAAA;AAC5B,IAAA,cAAA,CAAe,OAAU,GAAA,KAAA;AACzB,IAAA,WAAA,CAAY,EAAE,CAAA;AACd,IAAA,YAAA,CAAa,KAAK,CAAA;AAClB,IAAA,cAAA,CAAe,KAAK,CAAA;AACpB,IAAA,YAAA,CAAa,OAAU,GAAA,KAAA;AACvB,IAAA,IAAI,qBAAqB,MAAW,EAAA;AAClC,MAAY,WAAA,CAAA,CAAA,IAAA,KAAQ,yBAAyB,IAAM,EAAA;AAAA,QACjD,IAAM,EAAA,WAAA;AAAA,QACN,OAAS,EAAA;AAAA,OACV,CAAC,CAAA;AACF,MAAM,MAAA,UAAA,GAAa,gBAAiB,CAAA,OAAA,IAAW,YAAa,CAAA,OAAA;AAC5D,MAAI,IAAA,UAAA,EAAuC,0BAAA,CAAA,UAAA,EAAY,gBAAgB,CAAA;AAAA;AACzE,GACF,EAAG,CAAC,kBAAkB,CAAC,CAAA;AACvB,EAAM,MAAA,eAAA,GAAkB,QAAQ,OAAO;AAAA,IACrC,OAAA,EAAS,CAAC,IAAiB,KAAA;AACzB,MAAA,gBAAA,CAAiB,OAAW,IAAA,IAAA;AAC5B,MAAI,IAAA,CAAC,eAAe,OAAS,EAAA;AAC3B,QAAA,cAAA,CAAe,OAAU,GAAA,IAAA;AACzB,QAAA,KAAK,sBAAsB,OAAQ,EAAA;AAAA;AAErC,MAAI,IAAA,mBAAA,CAAoB,WAAW,IAAM,EAAA;AACvC,QAAoB,mBAAA,CAAA,OAAA,GAAU,UAAW,CAAA,kBAAA,EAAoB,EAAE,CAAA;AAAA;AACjE,KACF;AAAA;AAAA;AAAA;AAAA;AAAA,IAKA,YAAA,EAAc,CAAC,IAAiB,KAAA;AAC9B,MAAA,WAAA,CAAY,IAAI,CAAA;AAAA,KAClB;AAAA,IACA,UAAA,EAAY,CAAC,IAAiB,KAAA;AArLlC,MAAA,IAAA,EAAA;AAsLM,MAAmB,kBAAA,EAAA;AACnB,MAAA,IAAI,sBAAsB,OAAS,EAAA;AACjC,QAAA;AAAA;AAEF,MAAI,IAAA,0BAAA,CAA2B,IAAI,CAAG,EAAA;AACpC,QAAA,KAAA,CAAM,YAAY;AAChB,UAAA,IAAI,MAAM,sBAAA,CAAuB,OAAQ,CAAA,IAAI,CAAG,EAAA;AAChD,UAAA,IAAI,sBAAsB,OAAS,EAAA;AACnC,UAAA,qBAAA,CAAsB,OAAU,GAAA,IAAA;AAChC,UAAA,gBAAA,CAAiB,UAAU,EAAC;AAC5B,UAAA,QAAA,CAAS,kBAAmB,CAAA,IAAI,CAAI,GAAA,IAAA,GAAO,6EAA6E,CAAA;AACxH,UAAA,mBAAA,CAAoB,kBAAmB,CAAA,IAAI,CAAI,GAAA,MAAA,GAAY,IAAI,CAAA;AAAA,SAC9D,GAAA;AACH,QAAA;AAAA;AAEF,MAAA,qBAAA,CAAsB,OAAU,GAAA,IAAA;AAChC,MAAA,gBAAA,CAAiB,OAAU,GAAA,KAAA;AAC3B,MAAA,MAAM,MAAM,gBAAiB,CAAA,OAAA;AAC7B,MAAA,MAAM,KAAK,iBAAkB,CAAA,OAAA;AAC7B,MAAA,MAAM,WAAW,gBAAiB,CAAA,OAAA;AAClC,MAAA,gBAAA,CAAiB,UAAU,EAAC;AAC5B,MAAA,gBAAA,CAAiB,OAAU,GAAA,IAAA;AAC3B,MAAA,iBAAA,CAAkB,OAAU,GAAA,IAAA;AAC5B,MAAA,cAAA,CAAe,OAAU,GAAA,KAAA;AACzB,MAAY,WAAA,CAAA,CAAA,IAAA,KAAQ,yBAAyB,IAAM,EAAA;AAAA,QACjD,IAAM,EAAA,WAAA;AAAA,QACN,OAAS,EAAA;AAAA,OACV,CAAC,CAAA;AACF,MAAM,MAAA,UAAA,GAAa,OAAO,YAAa,CAAA,OAAA;AACvC,MAAI,IAAA,UAAA,EAAuC,0BAAA,CAAA,UAAA,EAAY,IAAI,CAAA;AAC3D,MAAA,WAAA,CAAY,EAAE,CAAA;AACd,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,cAAA,CAAe,KAAK,CAAA;AACpB,MAAA,YAAA,CAAa,OAAU,GAAA,KAAA;AACvB,MAAA,MAAM,KAAK,UAAW,CAAA,OAAA;AACtB,MAAM,MAAA,iBAAA,GAAoB,GAAG,eAAoB,KAAA,SAAA;AACjD,MAAI,IAAA,GAAA,IAAO,MAAM,iBAAmB,EAAA;AAClC,QAAa,YAAA,CAAA,aAAA,CAAA,cAAA,CAAA;AAAA,UACX,SAAW,EAAA;AAAA,SAAA,EACP,aAAgB,GAAA;AAAA,UAClB,SAAW,EAAA;AAAA,SACb,GAAI,EAJO,CAAA,EAAA;AAAA,UAKX,WAAa,EAAA;AAAA,YACX,SAAS,EAAG,CAAA,OAAA;AAAA,YACZ,WAAa,EAAA,CAAA,EAAA,GAAA,EAAA,CAAG,WAAH,KAAA,IAAA,GAAA,MAAA,GAAA,EAAA,CAAgB,IAAI,CAAM,CAAA,MAAA;AAAA,cACrC,IAAI,CAAE,CAAA,EAAA;AAAA,cACN,MAAM,CAAE,CAAA,IAAA;AAAA,cACR,MAAM,CAAE,CAAA,IAAA;AAAA,cACR,UAAU,CAAE,CAAA,QAAA;AAAA,cACZ,MAAM,CAAE,CAAA,IAAA;AAAA,cACR,KAAK,CAAE,CAAA;AAAA,aACT,CAAA;AAAA,WACF;AAAA,UACA,gBAAkB,EAAA;AAAA,YAChB,OAAS,EAAA,IAAA;AAAA,YACT,UAAY,EAAA,MAAA;AAAA,YACZ,KAAO,EAAA;AAAA;AACT,SACF,CAAC,CAAE,CAAA,KAAA,CAAM,CAAK,CAAA,KAAA;AACZ,UAAQ,OAAA,CAAA,KAAA,CAAM,0CAA0C,CAAC,CAAA;AAAA,SAC1D,CAAA;AAAA;AAEH,MAAI,IAAA,QAAA,CAAS,SAAS,CAAG,EAAA;AACvB,QAAA,MAAM,CAAC,KAAA,EAAO,GAAG,IAAI,CAAI,GAAA,QAAA;AACzB,QAAA,gBAAA,CAAiB,OAAU,GAAA,IAAA;AAC3B,QAAA,cAAA,CAAe,MAAM;AACnB,UAAA,KAAK,cAAe,CAAA,OAAA,CAAQ,KAAO,EAAA,MAAA,EAAW,KAAK,IAAI,CAAA;AAAA,SACxD,CAAA;AAAA;AACH,KACF;AAAA,IACA,OAAA,EAAS,CAAC,GAAgB,KAAA;AACxB,MAAA,IAAI,sBAAsB,OAAS,EAAA;AACnC,MAAA,KAAA,CAAM,YAAY;AAChB,QAAA,IAAI,MAAM,sBAAA,CAAuB,OAAQ,CAAA,GAAG,CAAG,EAAA;AAC/C,QAAA,IAAI,sBAAsB,OAAS,EAAA;AACnC,QAAA,qBAAA,CAAsB,OAAU,GAAA,IAAA;AAChC,QAAA,gBAAA,CAAiB,UAAU,EAAC;AAC5B,QAAA,QAAA,CAAS,OAAO,sBAAsB,CAAA;AACtC,QAAoB,mBAAA,EAAA;AAAA,OACnB,GAAA;AAAA;AACL,MACE,CAAC,YAAA,EAAc,eAAe,mBAAqB,EAAA,kBAAA,EAAoB,kBAAkB,CAAC,CAAA;AAC9F,EAAM,MAAA;AAAA,IACJ,WAAa,EAAA,iBAAA;AAAA,IACb,KAAO,EAAA,kBAAA;AAAA,IACP,MAAQ,EAAA;AAAA,MACN,gBAAiB,CAAA,OAAA,CAAQ,kBAAkB,OAAQ,CAAA,SAAA,EAAW,iBAAiB,eAAe,CAAA;AAClG,EAAM,MAAA,kBAAA,GAAqB,YAAY,YAAY;AACjD,IAAA,IAAI,CAAC,cAAA,CAAe,OAAW,IAAA,CAAC,aAAa,OAAS,EAAA;AACtD,IAAA,MAAM,MAAM,gBAAiB,CAAA,OAAA;AAC7B,IAAA,IAAI,CAAC,GAAK,EAAA;AACV,IAAA,OAAO,iBAAiB,OAAQ,CAAA,MAAA,GAAS,KAAK,cAAe,CAAA,OAAA,IAAW,aAAa,OAAS,EAAA;AAC5F,MAAM,MAAA,IAAA,GAAO,gBAAiB,CAAA,OAAA,CAAQ,CAAC,CAAA;AACvC,MAAA,MAAM,MAAS,GAAA,MAAM,kBAAmB,CAAA,IAAA,EAAM,GAAG,CAAA;AACjD,MAAA,IAAI,OAAO,EAAI,EAAA;AACb,QAAA,gBAAA,CAAiB,QAAQ,KAAM,EAAA;AAC/B,QAAA;AAAA;AAEF,MAAI,IAAA,sBAAA,CAAuB,MAAO,CAAA,KAAK,CAAG,EAAA;AACxC,QAAA;AAAA;AAEF,MAAA,gBAAA,CAAiB,QAAQ,KAAM,EAAA;AAC/B,MAAS,QAAA,CAAA,MAAA,CAAO,SAAS,sCAAsC,CAAA;AAC/D,MAAA;AAAA;AACF,GACF,EAAG,CAAC,kBAAkB,CAAC,CAAA;AACvB,EAAA,qBAAA,CAAsB,OAAU,GAAA,kBAAA;AAChC,EAAA,SAAA,CAAU,MAAM;AACd,IAAI,IAAA,SAAA,IAAa,sBAA0B,IAAA,SAAA,KAAc,sBAAwB,EAAA;AAC/E,MAAA,yBAAA,CAA0B,MAAS,CAAA;AAAA;AACrC,GACC,EAAA,CAAC,SAAW,EAAA,sBAAsB,CAAC,CAAA;AACtC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,aAAa,OAAS,EAAA;AAC1B,IAAA,IAAI,CAAC,SAAW,EAAA;AACd,MAAA,WAAA,CAAY,EAAE,CAAA;AACd,MAAA,WAAA,CAAY,EAAE,CAAA;AACd,MAAA,wBAAA,CAAyB,OAAU,GAAA,IAAA;AACnC,MAAA;AAAA;AAEF,IAAM,MAAA,mBAAA,GAAsB,CAAC,IAAwB,KAAA;AACnD,MAAA,MAAM,aAAgB,GAAA,CAAC,GAAG,IAAI,EAAE,OAAQ,EAAA,CAAE,IAAK,CAAA,CAAA,GAAA,KAAO,IAAI,IAAS,KAAA,WAAA,IAAe,GAAI,CAAA,OAAA,CAAQ,MAAM,CAAA;AACpG,MAAA,IAAI,aAAe,EAAA,0BAAA,CAA2B,SAAW,EAAA,aAAA,CAAc,OAAO,CAAA;AAAA,KAChF;AACA,IAAM,MAAA,cAAA,GAAiB,yBAAyB,OAAY,KAAA,SAAA;AAC5D,IAAA,IAAI,cAAgB,EAAA;AAClB,MAAA,wBAAA,CAAyB,OAAU,GAAA,SAAA;AAEnC,MAAA,IAAI,CAAC,qBAAuB,EAAA;AAC1B,QAAA,WAAA,CAAY,EAAE,CAAA;AACd,QAAA,WAAA,CAAY,EAAE,CAAA;AACd,QAAA;AAAA;AAEF,MAAA,MAAM,SAAY,GAAA,mBAAA,CAAoB,eAAmB,IAAA,IAAA,GAAA,eAAA,GAAA,EAAE,CAAA;AAC3D,MAAA,mBAAA,CAAoB,SAAS,CAAA;AAC7B,MAAA,WAAA,CAAY,SAAS,CAAA;AACrB,MAAA,WAAA,CAAY,EAAE,CAAA;AACd,MAAA;AAAA;AAEF,IAAA,IAAI,qBAAuB,EAAA;AACzB,MAAA,MAAM,SAAY,GAAA,mBAAA,CAAoB,eAAmB,IAAA,IAAA,GAAA,eAAA,GAAA,EAAE,CAAA;AAC3D,MAAA,mBAAA,CAAoB,SAAS,CAAA;AAI7B,MAAA,WAAA,CAAY,UAAQ,0BAA2B,CAAA,IAAA,EAAM,+BAA+B,IAAM,EAAA,SAAS,CAAC,CAAC,CAAA;AACrG,MAAA,WAAA,CAAY,EAAE,CAAA;AAAA;AAChB,GACC,EAAA,CAAC,SAAW,EAAA,eAAA,EAAiB,qBAAqB,CAAC,CAAA;AACtD,EAAA,MAAM,cAAc,WAAY,CAAA,OAAO,SAAiB,WAAmC,EAAA,iBAAA,EAAmC,iBAAiB,KAAU,KAAA;AACvJ,IAAA,IAAI,CAAC,OAAQ,CAAA,IAAA,EAAU,IAAA,EAAC,2CAAa,MAAQ,CAAA,EAAA;AAC7C,IAAM,MAAA,kBAAA,GAAqB,iBAAsB,KAAA,MAAA,GAAY,iBAAoB,GAAA,SAAA;AACjF,IAAA,MAAM,KAAK,UAAW,CAAA,OAAA;AACtB,IAAM,MAAA,OAAA,GAAU,QAAQ,IAAK,EAAA;AAC7B,IAAA,MAAM,WAAW,OAAY,KAAA,CAAA,WAAA,IAAA,IAAA,GAAA,MAAA,GAAA,WAAA,CAAa,MAAS,IAAA,CAAA,UAAA,EAAa,YAAY,GAAI,CAAA,CAAA,CAAA,KAAK,CAAE,CAAA,IAAI,EAAE,MAAO,CAAA,OAAO,EAAE,IAAK,CAAA,IAAI,CAAC,CAAK,CAAA,GAAA,EAAA,CAAA;AAC5H,IAAA,MAAM,WAA2B,GAAA;AAAA,MAC/B,IAAM,EAAA,MAAA;AAAA,MACN,OAAS,EAAA,QAAA;AAAA,MACT;AAAA,KACF;AAOA,IAAA,IAAI,aAAa,OAAS,EAAA;AACxB,MAAA,IAAI,CAAC,EAAA,CAAG,gBAAoB,IAAA,CAAC,kBAAoB,EAAA;AAC/C,QAAA,QAAA,CAAS,CAAC,EAAA,CAAG,gBAAmB,GAAA,kEAAA,GAAqE,0BAA0B,CAAA;AAC/H,QAAA;AAAA;AAEF,MAAA,WAAA,CAAY,CAAQ,IAAA,KAAA,CAAC,GAAG,IAAA,EAAM,WAAW,CAAC,CAAA;AAC1C,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,gBAAA,CAAiB,OAAU,GAAA,CAAC,GAAG,gBAAA,CAAiB,SAAS,QAAQ,CAAA;AACjE,MAAA,KAAK,kBAAmB,EAAA;AACxB,MAAA;AAAA;AAEF,IAAA,YAAA,CAAa,OAAU,GAAA,IAAA;AACvB,IAAA,cAAA,CAAe,OAAU,GAAA,KAAA;AACzB,IAAA,IAAI,sBAAsB,QAAU,EAAA;AAClC,MAAwB,uBAAA,CAAA,OAAA,CAAQ,IAAI,kBAAkB,CAAA;AACtD,MAAkB,iBAAA,CAAA,kBAAA,EAAoB,UAAU,IAAI,CAAA;AAAA;AAEtD,IAAA,IAAI,CAAC,cAAgB,EAAA;AACnB,MAAA,WAAA,CAAY,CAAQ,IAAA,KAAA,CAAC,GAAG,IAAA,EAAM,WAAW,CAAC,CAAA;AAC1C,MAAA,gBAAA,CAAiB,OAAU,GAAA,KAAA;AAAA;AAE7B,IAAA,WAAA,CAAY,EAAE,CAAA;AACd,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,cAAA,CAAe,IAAI,CAAA;AACnB,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,iBAAA,CAAkB,OAAU,GAAA,WAAA;AAC5B,IAAA,gBAAA,CAAiB,UAAU,kBAAsB,IAAA,IAAA,GAAA,kBAAA,GAAA,IAAA;AACjD,IAAA,qBAAA,CAAsB,OAAU,GAAA,KAAA;AAChC,IAAI,IAAA,CAAC,GAAG,gBAAkB,EAAA;AACxB,MAAA,QAAA,CAAS,kEAAkE,CAAA;AAC3E,MAAI,IAAA,CAAC,gBAA4B,WAAA,CAAA,CAAA,CAAA,KAAK,EAAE,KAAM,CAAA,CAAA,EAAG,EAAE,CAAC,CAAA;AACpD,MAAA,YAAA,CAAa,OAAU,GAAA,KAAA;AACvB,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,cAAA,CAAe,KAAK,CAAA;AACpB,MAAA,iBAAA,CAAkB,OAAU,GAAA,IAAA;AAC5B,MAAA,gBAAA,CAAiB,OAAU,GAAA,IAAA;AAC3B,MAAA;AAAA;AAEF,IAAA,IAAI,CAAC,kBAAoB,EAAA;AACvB,MAAA,QAAA,CAAS,0BAA0B,CAAA;AACnC,MAAI,IAAA,CAAC,gBAA4B,WAAA,CAAA,CAAA,CAAA,KAAK,EAAE,KAAM,CAAA,CAAA,EAAG,EAAE,CAAC,CAAA;AACpD,MAAA,YAAA,CAAa,OAAU,GAAA,KAAA;AACvB,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,cAAA,CAAe,KAAK,CAAA;AACpB,MAAA,iBAAA,CAAkB,OAAU,GAAA,IAAA;AAC5B,MAAA,gBAAA,CAAiB,OAAU,GAAA,IAAA;AAC3B,MAAA;AAAA;AAEF,IAAA,IAAI,iBAAmB,EAAA;AACrB,MAAA,yBAAA,CAA0B,iBAAiB,CAAA;AAC3C,MAAM,MAAA,IAAI,QAAc,CAAW,OAAA,KAAA;AACjC,QAAA,UAAA,CAAW,SAAS,CAAC,CAAA;AAAA,OACtB,CAAA;AAAA;AAEH,IAAA,MAAM,oBAAuB,GAAA,sCAAA,CAAuC,MAAO,CAAA,WAAA,EAAa,OAAO,qBAAqB,CAAA;AACpH,IAAM,MAAA,KAAA,GAAQ,oBAAuB,GAAA,iBAAA,CAAkB,WAAa,EAAA;AAAA,MAClE,WAAa,EAAA;AAAA,KACd,CAAI,GAAA,MAAM,2BAA4B,CAAA,WAAA,EAAa,OAAM,SAAa,KAAA;AArZ3E,MAAA,IAAA,EAAA;AAsZM,MAAM,MAAA,MAAA,GAAS,MAAM,wCAAyC,CAAA;AAAA,QAC5D,SAAW,EAAA;AAAA,UACT;AAAA;AACF,OACD,CAAA;AACD,MAAA,OAAA,CAAA,CAAO,EAAO,GAAA,MAAA,CAAA,IAAA,KAAP,IAAa,GAAA,MAAA,GAAA,EAAA,CAAA,gCAAA,KAAoC,EAAC;AAAA,KAC3D,EAAG,OAAM,IAAQ,KAAA;AA5ZrB,MAAA,IAAA,EAAA;AA6ZM,MAAM,MAAA,MAAA,GAAS,MAAM,0CAA2C,CAAA;AAAA,QAC9D,SAAW,EAAA;AAAA,UACT;AAAA;AACF,OACD,CAAA;AACD,MAAA,OAAA,CAAA,CAAO,EAAO,GAAA,MAAA,CAAA,IAAA,KAAP,IAAa,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,kCAAA,KAAsC,EAAC;AAAA,KAC5D,CAAA;AACD,IAAA,MAAM,EAAK,GAAA,MAAM,iBAAkB,CAAA,QAAA,EAAU,oBAAoB,KAAK,CAAA;AACtE,IAAA,IAAI,CAAC,EAAM,IAAA,CAAC,sBAAsB,OAAW,IAAA,CAAC,kBAAkB,OAAS,EAAA;AACvE,MAAA,qBAAA,CAAsB,OAAU,GAAA,IAAA;AAChC,MAAA,QAAA,CAAS,8DAA8D,CAAA;AACvE,MAAI,IAAA,CAAC,gBAA4B,WAAA,CAAA,CAAA,CAAA,KAAK,EAAE,KAAM,CAAA,CAAA,EAAG,EAAE,CAAC,CAAA;AACpD,MAAA,YAAA,CAAa,OAAU,GAAA,KAAA;AACvB,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,cAAA,CAAe,KAAK,CAAA;AACpB,MAAA,iBAAA,CAAkB,OAAU,GAAA,IAAA;AAC5B,MAAA,gBAAA,CAAiB,OAAU,GAAA,IAAA;AAAA;AAC7B,GACF,EAAG,CAAC,SAAW,EAAA,iBAAA,EAAmB,mBAAmB,kBAAoB,EAAA,wCAAA,EAA0C,0CAA0C,CAAC,CAAA;AAC9J,EAAA,cAAA,CAAe,OAAU,GAAA,WAAA;AACzB,EAAuB,sBAAA,CAAA,OAAA,GAAU,OAAO,MAAmB,KAAA;AACzD,IAAA,IAAI,gBAAiB,CAAA,OAAA,IAAW,qBAAsB,CAAA,OAAA,EAAgB,OAAA,KAAA;AACtE,IAAA,IAAI,CAAC,kBAAA,CAAmB,MAAM,CAAA,EAAU,OAAA,KAAA;AACxC,IAAM,MAAA,OAAA,GAAU,WAAW,OAAQ,CAAA,gBAAA;AACnC,IAAI,IAAA,CAAC,SAAgB,OAAA,KAAA;AACrB,IAAA,gBAAA,CAAiB,OAAU,GAAA,IAAA;AAC3B,IAAA,iBAAA,CAAkB,OAAU,GAAA,IAAA;AAC5B,IAAI,IAAA;AACF,MAAA,QAAA,CAAS,qCAAgC,CAAA;AACzC,MAAM,MAAA,SAAA,GAAY,MAAM,OAAQ,EAAA;AAChC,MAAI,IAAA,CAAC,WAAkB,OAAA,KAAA;AACvB,MAAA,MAAM,KAAK,iBAAkB,CAAA,OAAA;AAC7B,MAAA,MAAM,MAAM,gBAAiB,CAAA,OAAA;AAC7B,MAAA,qBAAA,CAAsB,OAAU,GAAA,KAAA;AAChC,MAAA,YAAA,CAAa,OAAU,GAAA,KAAA;AACvB,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,cAAA,CAAe,KAAK,CAAA;AACpB,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,IAAI,MAAM,GAAK,EAAA;AACb,QAAA,cAAA,CAAe,MAAM;AACnB,UAAA,KAAK,eAAe,OAAQ,CAAA,EAAA,CAAG,SAAS,EAAG,CAAA,WAAA,EAAa,KAAK,IAAI,CAAA;AAAA,SAClE,CAAA;AAAA;AAEH,MAAO,OAAA,IAAA;AAAA,aACA,GAAK,EAAA;AACZ,MAAQ,OAAA,CAAA,KAAA,CAAM,4CAA4C,GAAG,CAAA;AAC7D,MAAO,OAAA,KAAA;AAAA,KACP,SAAA;AACA,MAAA,iBAAA,CAAkB,OAAU,GAAA,KAAA;AAAA;AAC9B,GACF;AACA,EAAM,MAAA,MAAA,GAAS,YAAY,MAAM;AAhdnC,IAAA,IAAA,EAAA;AAidI,IAAmB,kBAAA,EAAA;AACnB,IAAA,gBAAA,CAAiB,UAAU,EAAC;AAC5B,IAAA,cAAA,CAAe,OAAU,GAAA,KAAA;AACzB,IAAM,MAAA,GAAA,GAAA,CAAM,EAAiB,GAAA,gBAAA,CAAA,OAAA,KAAjB,IAA4B,GAAA,EAAA,GAAA,SAAA;AACxC,IAAK,KAAA,gBAAA,CAAiB,oBAAO,WAAW,CAAA;AACxC,IAAI,IAAA,CAAC,sBAAsB,OAAS,EAAA;AAClC,MAAA,qBAAA,CAAsB,OAAU,GAAA,IAAA;AAChC,MAAoB,mBAAA,EAAA;AAAA;AACtB,KACC,CAAC,gBAAA,EAAkB,mBAAqB,EAAA,SAAA,EAAW,kBAAkB,CAAC,CAAA;AACzE,EAAM,MAAA,aAAA,GAAgB,YAAY,MAAM;AACtC,IAAmB,kBAAA,EAAA;AACnB,IAAA,WAAA,CAAY,EAAE,CAAA;AACd,IAAA,WAAA,CAAY,EAAE,CAAA;AACd,IAAA,QAAA,CAAS,IAAI,CAAA;AAAA,GACf,EAAG,CAAC,kBAAkB,CAAC,CAAA;AACvB,EAAA,MAAM,eAAkB,GAAA,CAAC,CAAC,SAAA,IAAa,0BAA0B,CAAC,qBAAA;AAClE,EAAO,OAAA;AAAA,IACL,QAAA;AAAA,IACA,QAAA;AAAA,IACA,KAAA;AAAA,IACA,SAAA;AAAA,IACA,WAAA;AAAA,IACA,eAAA;AAAA,IACA,WAAa,EAAA,QAAA,CAAS,MAAS,GAAA,CAAA,IAAK,CAAC,CAAC,QAAA;AAAA,IACtC,WAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACF;AACF"}
1
+ {"version":3,"file":"useChatStream.js","sources":["../../src/hooks/useChatStream.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n useCreateAccountChatFileDownloadLinksMutation,\n useCreateAccountChatFileUploadLinksMutation,\n} from 'common/graphql';\nimport {\n clearChannelHistoryRunning,\n markChannelHistoryRunning,\n patchChannelHistoryPreview,\n useChatMutations,\n useChatMessages,\n} from './useChatApi';\nimport { isNoActiveSessionError, useCdecliChannel } from './useCdecliChannel';\nimport { usePrerequisiteIds } from './usePrerequisiteIds';\nimport { isAgentJwtRejected, shouldInlineGatewayMediaForHostedAgent } from './systemTokenJwt';\nimport { config } from '../config';\nimport { buildGatewayMedia, buildGatewayMediaPreferUrls } from '../features/attachments/buildGatewayMedia';\nimport { preserveAttachmentPreviews } from '../features/attachments/preserveAttachmentPreviews';\nimport {\n appendOrReplaceAssistant,\n collapseConsecutiveAssistants,\n mergeOptimisticGatewayMessages,\n} from '../state/chatThreadMerge';\n\n/** Agent returned an error while the cdecli-serve channel stayed connected (e.g. bad LLM API key). */\nfunction isCdecliAgentFailureOutput(text: string): boolean {\n const t = text.trim();\n if (!t) return false;\n return (\n /⚠\\s*Error:/.test(t) ||\n /LLM stream error/i.test(t) ||\n /Incorrect API key/i.test(t) ||\n /invalid_api_key/i.test(t) ||\n /authentication_error/i.test(t) ||\n isAgentJwtRejected(t)\n );\n}\n\nexport interface MessageAttachment {\n id: string;\n name: string;\n type: 'file' | 'screenshot';\n dataUrl?: string;\n mimeType?: string;\n size?: number;\n url?: string;\n}\n\nexport interface ChatMessage {\n role: 'user' | 'assistant';\n content: string;\n attachments?: MessageAttachment[];\n metadata?: {\n tokenUsage?: { inputTokens: number; outputTokens: number; totalTokens: number };\n model?: string;\n };\n}\n\nfunction formatBackendThread(\n backendMessages: Array<{\n role: string;\n content?: string;\n attachments?: ChatMessage['attachments'];\n tokenCount?: number;\n model?: string;\n }>,\n): ChatMessage[] {\n return collapseConsecutiveAssistants(\n backendMessages.map((msg) => ({\n role: msg.role as 'user' | 'assistant',\n content: msg.content ?? '',\n attachments: msg.attachments?.map((a) => ({\n id: a.id,\n name: a.name,\n type: a.type === 'screenshot' ? 'screenshot' : 'file',\n mimeType: a.mimeType,\n size: a.size,\n url: a.url,\n })),\n metadata: msg.tokenCount\n ? {\n tokenUsage: {\n inputTokens: 0,\n outputTokens: msg.tokenCount,\n totalTokens: msg.tokenCount,\n },\n model: msg.model,\n }\n : undefined,\n })),\n );\n}\n\n/** Mobile chat routes exclusively through CDeCLI (messenger-gateway). */\nexport interface UseChatStreamRouting {\n channelConnected: boolean;\n accountId: string;\n /** When `'backend'`, the gateway persists posts — skip client `saveMessages`. */\n persistenceMode?: 'backend' | 'frontend';\n /** Remint the system JWT and reconnect after cdecli-agent 401s the session. */\n recoverAgentAuth?: () => Promise<boolean>;\n}\n\nexport function useChatStream(\n sessionId: string | null,\n routing: UseChatStreamRouting = {\n channelConnected: false,\n accountId: 'default',\n persistenceMode: 'backend',\n },\n) {\n const [messages, setMessages] = useState<ChatMessage[]>([]);\n const [response, setResponse] = useState('');\n const [isLoading, setIsLoading] = useState(false);\n const [isStreaming, setIsStreaming] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const isSendingRef = useRef(false);\n /** Follow-ups typed before cdecli has an active session. Flushed after the first token. */\n const pendingSteersRef = useRef<string[]>([]);\n /** True once this turn has produced at least one stream chunk (steer is valid). */\n const sessionLiveRef = useRef(false);\n const flushPendingSteersRef = useRef<() => Promise<void>>(async () => {});\n const sendMessageRef = useRef<\n (\n content: string,\n attachments?: MessageAttachment[],\n sessionIdOverride?: string | null,\n alreadyVisible?: boolean,\n ) => Promise<void>\n >(async () => {});\n\n /** Ensures GraphQL stream subscriptions use the id from createChannel+send before the next parent render. */\n const [cdecliStreamOverrideId, setCdecliStreamOverrideId] = useState<string | undefined>(undefined);\n const userMsgForSaveRef = useRef<ChatMessage | null>(null);\n const saveSessionIdRef = useRef<string | null>(null);\n const sessionIdRef = useRef<string | null>(sessionId);\n sessionIdRef.current = sessionId || cdecliStreamOverrideId || null;\n /** Blocks duplicate cdecli `onComplete` from appending assistant twice / saving twice per send. */\n const cdecliRoundHandledRef = useRef(false);\n /** One remint+resend per turn when cdecli-agent 401s the JWT. */\n const authRetryUsedRef = useRef(false);\n const recoveringAuthRef = useRef(false);\n const routingRef = useRef(routing);\n routingRef.current = routing;\n\n const tryRecoverAndResendRef = useRef<(reason: string) => Promise<boolean>>(async () => false);\n\n /** Coalesce token deltas so Fabric is not committing a native tree every chunk. */\n const pendingStreamRef = useRef('');\n const streamFlushTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const clearPendingStream = useCallback(() => {\n if (streamFlushTimerRef.current != null) {\n clearTimeout(streamFlushTimerRef.current);\n streamFlushTimerRef.current = null;\n }\n pendingStreamRef.current = '';\n }, []);\n\n const flushPendingStream = useCallback(() => {\n streamFlushTimerRef.current = null;\n const pending = pendingStreamRef.current;\n if (!pending) return;\n pendingStreamRef.current = '';\n setResponse((r) => {\n const next = r + pending;\n const sid = sessionIdRef.current;\n if (sid) markChannelHistoryRunning(sid, next);\n return next;\n });\n }, []);\n\n useEffect(() => () => clearPendingStream(), [clearPendingStream]);\n\n const { saveMessages, patchChannelTitle } = useChatMutations();\n const titlePatchedChannelsRef = useRef(new Set<string>());\n const { accountUserId } = usePrerequisiteIds();\n const [createAccountChatFileUploadLinksMutation] = useCreateAccountChatFileUploadLinksMutation();\n const [createAccountChatFileDownloadLinksMutation] = useCreateAccountChatFileDownloadLinksMutation();\n const {\n messages: backendMessages,\n loading: backendMessagesLoading,\n messagesLoaded: backendMessagesLoaded,\n } = useChatMessages(sessionId);\n const lastHydratedSessionIdRef = useRef<string | null>(null);\n\n const streamChannelId = sessionId || cdecliStreamOverrideId;\n\n const finalizeCdecliRound = useCallback(\n (assistantContent?: string) => {\n const previewSid = saveSessionIdRef.current || sessionIdRef.current;\n clearPendingStream();\n saveSessionIdRef.current = null;\n userMsgForSaveRef.current = null;\n sessionLiveRef.current = false;\n setResponse('');\n setIsLoading(false);\n setIsStreaming(false);\n isSendingRef.current = false;\n if (previewSid) clearChannelHistoryRunning(previewSid);\n if (assistantContent !== undefined) {\n setMessages((prev) =>\n appendOrReplaceAssistant(prev, { role: 'assistant' as const, content: assistantContent }),\n );\n if (previewSid) patchChannelHistoryPreview(previewSid, assistantContent);\n }\n },\n [clearPendingStream],\n );\n\n const cdecliCallbacks = useMemo(\n () => ({\n onChunk: (text: string) => {\n if (!isSendingRef.current) {\n isSendingRef.current = true;\n cdecliRoundHandledRef.current = false;\n saveSessionIdRef.current = sessionIdRef.current;\n setIsLoading(true);\n setIsStreaming(true);\n setError(null);\n const sid = sessionIdRef.current;\n if (sid) markChannelHistoryRunning(sid, text);\n }\n pendingStreamRef.current += text;\n if (!sessionLiveRef.current) {\n sessionLiveRef.current = true;\n void flushPendingSteersRef.current();\n }\n if (streamFlushTimerRef.current == null) {\n streamFlushTimerRef.current = setTimeout(flushPendingStream, 50);\n }\n },\n // The brain's provisional answer is the WHOLE reply-so-far, not a chunk:\n // it is set outright, and set to '' when the real stream supersedes it.\n // It deliberately does not mark the session live - steers wait for the\n // agent, which is the only side that can act on them.\n onQuickReply: (text: string) => {\n setResponse(text);\n },\n onComplete: (text: string) => {\n clearPendingStream();\n if (cdecliRoundHandledRef.current) {\n return;\n }\n\n if (isCdecliAgentFailureOutput(text)) {\n void (async () => {\n if (await tryRecoverAndResendRef.current(text)) return;\n if (cdecliRoundHandledRef.current) return;\n cdecliRoundHandledRef.current = true;\n pendingSteersRef.current = [];\n setError(\n isAgentJwtRejected(text)\n ? text\n : 'CDeCLI agent error. Check gateway status and server-side LLM configuration.',\n );\n finalizeCdecliRound(isAgentJwtRejected(text) ? undefined : text);\n })();\n return;\n }\n\n cdecliRoundHandledRef.current = true;\n authRetryUsedRef.current = false;\n\n const sid = saveSessionIdRef.current;\n const um = userMsgForSaveRef.current;\n const leftover = pendingSteersRef.current;\n pendingSteersRef.current = [];\n saveSessionIdRef.current = null;\n userMsgForSaveRef.current = null;\n sessionLiveRef.current = false;\n\n setMessages((prev) => appendOrReplaceAssistant(prev, { role: 'assistant' as const, content: text }));\n const previewSid = sid || sessionIdRef.current;\n if (previewSid) {\n clearChannelHistoryRunning(previewSid);\n patchChannelHistoryPreview(previewSid, text);\n }\n setResponse('');\n setIsLoading(false);\n setIsStreaming(false);\n isSendingRef.current = false;\n\n const rt = routingRef.current;\n const persistClientSide = rt.persistenceMode !== 'backend';\n\n if (sid && um && persistClientSide) {\n saveMessages({\n sessionId: sid,\n ...(accountUserId ? { createdBy: accountUserId } : {}),\n userMessage: {\n content: um.content,\n attachments: um.attachments?.map((a) => ({\n id: a.id,\n name: a.name,\n type: a.type,\n mimeType: a.mimeType,\n size: a.size,\n url: a.url,\n })),\n },\n assistantMessage: {\n content: text,\n tokenCount: undefined,\n model: 'cdecli-serve',\n },\n }).catch((e) => {\n console.error('[useChatStream] saveMessages (cdecli):', e);\n });\n }\n\n if (leftover.length > 0) {\n const [first, ...rest] = leftover;\n pendingSteersRef.current = rest;\n queueMicrotask(() => {\n void sendMessageRef.current(first, undefined, sid, true);\n });\n }\n },\n onError: (err: string) => {\n if (cdecliRoundHandledRef.current) return;\n void (async () => {\n if (await tryRecoverAndResendRef.current(err)) return;\n if (cdecliRoundHandledRef.current) return;\n cdecliRoundHandledRef.current = true;\n pendingSteersRef.current = [];\n setError(err || 'CDeCLI stream error.');\n finalizeCdecliRound();\n })();\n },\n }),\n [saveMessages, accountUserId, finalizeCdecliRound, flushPendingStream, clearPendingStream],\n );\n\n const {\n sendMessage: sendCdecliMessage,\n steer: steerCdecliMessage,\n cancel: cancelCdecliTurn,\n } = useCdecliChannel(routing.channelConnected, routing.accountId, streamChannelId, cdecliCallbacks);\n\n const flushPendingSteers = useCallback(async () => {\n if (!sessionLiveRef.current || !isSendingRef.current) return;\n const sid = saveSessionIdRef.current;\n if (!sid) return;\n\n while (pendingSteersRef.current.length > 0 && sessionLiveRef.current && isSendingRef.current) {\n const next = pendingSteersRef.current[0];\n const result = await steerCdecliMessage(next, sid);\n if (result.ok) {\n pendingSteersRef.current.shift();\n continue;\n }\n if (isNoActiveSessionError(result.error)) {\n return;\n }\n pendingSteersRef.current.shift();\n setError(result.error || 'Could not send follow-up. Try again.');\n return;\n }\n }, [steerCdecliMessage]);\n\n flushPendingSteersRef.current = flushPendingSteers;\n\n useEffect(() => {\n if (sessionId && cdecliStreamOverrideId && sessionId === cdecliStreamOverrideId) {\n setCdecliStreamOverrideId(undefined);\n }\n }, [sessionId, cdecliStreamOverrideId]);\n\n useEffect(() => {\n const prevSid = lastHydratedSessionIdRef.current;\n if (prevSid && sessionId && prevSid !== sessionId && isSendingRef.current) {\n // Switching threads: drop local send flags so this view can hydrate.\n // The previous channel's agent keeps running server-side; history still\n // shows it as running until that turn completes or we reopen it.\n clearPendingStream();\n pendingSteersRef.current = [];\n isSendingRef.current = false;\n sessionLiveRef.current = false;\n cdecliRoundHandledRef.current = false;\n saveSessionIdRef.current = null;\n userMsgForSaveRef.current = null;\n setIsLoading(false);\n setIsStreaming(false);\n setResponse('');\n }\n\n if (!sessionId) {\n setMessages([]);\n setResponse('');\n lastHydratedSessionIdRef.current = null;\n return;\n }\n\n const stampHistoryPreview = (msgs: ChatMessage[]) => {\n const last = msgs[msgs.length - 1];\n const lastAssistant = [...msgs].reverse().find((msg) => msg.role === 'assistant' && msg.content.trim());\n if (lastAssistant && !isSendingRef.current) {\n patchChannelHistoryPreview(sessionId, lastAssistant.content);\n }\n // Finished thread (last post is assistant) — drop the history \"Running\" badge.\n // A live turn ends with a user post until the assistant lands.\n if (!isSendingRef.current && last?.role === 'assistant') {\n clearChannelHistoryRunning(sessionId);\n }\n };\n\n const keepStream = isSendingRef.current;\n const sessionChanged = lastHydratedSessionIdRef.current !== sessionId;\n if (sessionChanged) {\n lastHydratedSessionIdRef.current = sessionId;\n // Do not merge the previous channel's in-memory thread into this one.\n if (!backendMessagesLoaded) {\n if (!keepStream) {\n setMessages([]);\n setResponse('');\n }\n return;\n }\n const formatted = formatBackendThread(backendMessages ?? []);\n stampHistoryPreview(formatted);\n setMessages((prev) => (keepStream ? mergeOptimisticGatewayMessages(prev, formatted) : formatted));\n if (!keepStream) setResponse('');\n return;\n }\n\n if (backendMessagesLoaded) {\n const formatted = formatBackendThread(backendMessages ?? []);\n stampHistoryPreview(formatted);\n // Positional merge first so assistant replies the gateway never persisted\n // (cdecli skill turns emit no chatMessageAdded) survive this snapshot instead\n // of being dropped, then preserve in-memory attachment previews on the result.\n setMessages((prev) => preserveAttachmentPreviews(prev, mergeOptimisticGatewayMessages(prev, formatted)));\n if (!keepStream) setResponse('');\n }\n }, [sessionId, backendMessages, backendMessagesLoaded, clearPendingStream]);\n\n const sendMessage = useCallback(\n async (\n content: string,\n attachments?: MessageAttachment[],\n sessionIdOverride?: string | null,\n alreadyVisible = false,\n ) => {\n if (!content.trim() && !attachments?.length) return;\n\n const effectiveSessionId = sessionIdOverride !== undefined ? sessionIdOverride : sessionId;\n const rt = routingRef.current;\n const trimmed = content.trim();\n const sendText =\n trimmed ||\n (attachments?.length\n ? `Attached: ${attachments\n .map((a) => a.name)\n .filter(Boolean)\n .join(', ')}`\n : '');\n\n const userMessage: ChatMessage = {\n role: 'user',\n content: sendText,\n attachments,\n };\n\n /**\n * A turn is already in flight. Keep the follow-up visible and queue it.\n * cdecli rejects steer until the agent session exists (\"no active session\"),\n * which is after the first token. Flush then. Never error/LogBox for that race.\n */\n if (isSendingRef.current) {\n if (!rt.channelConnected || !effectiveSessionId) {\n setError(\n !rt.channelConnected\n ? 'CDeCLI is not connected yet. Check gateway status in the header.'\n : 'Missing chat session id.',\n );\n return;\n }\n setMessages((prev) => [...prev, userMessage]);\n setError(null);\n pendingSteersRef.current = [...pendingSteersRef.current, sendText];\n void flushPendingSteers();\n return;\n }\n\n isSendingRef.current = true;\n sessionLiveRef.current = false;\n if (effectiveSessionId && sendText) {\n titlePatchedChannelsRef.current.add(effectiveSessionId);\n patchChannelTitle(effectiveSessionId, sendText, true);\n markChannelHistoryRunning(effectiveSessionId);\n }\n if (!alreadyVisible) {\n setMessages((prev) => [...prev, userMessage]);\n authRetryUsedRef.current = false;\n }\n setResponse('');\n setIsLoading(true);\n setIsStreaming(true);\n setError(null);\n userMsgForSaveRef.current = userMessage;\n saveSessionIdRef.current = effectiveSessionId ?? null;\n cdecliRoundHandledRef.current = false;\n\n if (!rt.channelConnected) {\n setError('CDeCLI is not connected yet. Check gateway status in the header.');\n if (!alreadyVisible) setMessages((p) => p.slice(0, -1));\n isSendingRef.current = false;\n setIsLoading(false);\n setIsStreaming(false);\n userMsgForSaveRef.current = null;\n saveSessionIdRef.current = null;\n if (effectiveSessionId) clearChannelHistoryRunning(effectiveSessionId);\n return;\n }\n if (!effectiveSessionId) {\n setError('Missing chat session id.');\n if (!alreadyVisible) setMessages((p) => p.slice(0, -1));\n isSendingRef.current = false;\n setIsLoading(false);\n setIsStreaming(false);\n userMsgForSaveRef.current = null;\n saveSessionIdRef.current = null;\n return;\n }\n\n if (sessionIdOverride) {\n setCdecliStreamOverrideId(sessionIdOverride);\n await new Promise<void>((resolve) => {\n setTimeout(resolve, 0);\n });\n }\n\n const inlineForHostedAgent = shouldInlineGatewayMediaForHostedAgent(\n config.GRAPHQL_URL,\n config.CDECLI_AGENT_ENDPOINT,\n );\n const media = inlineForHostedAgent\n ? buildGatewayMedia(attachments, { includeData: true })\n : await buildGatewayMediaPreferUrls(\n attachments,\n async (filenames) => {\n const result = await createAccountChatFileUploadLinksMutation({\n variables: { filenames },\n });\n return result.data?.createAccountChatFileUploadLinks || [];\n },\n async (urls) => {\n const result = await createAccountChatFileDownloadLinksMutation({\n variables: { urls },\n });\n return result.data?.createAccountChatFileDownloadLinks || [];\n },\n );\n const ok = await sendCdecliMessage(sendText, effectiveSessionId, media);\n if (!ok && !cdecliRoundHandledRef.current && !recoveringAuthRef.current) {\n cdecliRoundHandledRef.current = true;\n setError('Failed to send message via CDeCLI. Check gateway connection.');\n if (!alreadyVisible) setMessages((p) => p.slice(0, -1));\n isSendingRef.current = false;\n setIsLoading(false);\n setIsStreaming(false);\n userMsgForSaveRef.current = null;\n saveSessionIdRef.current = null;\n clearChannelHistoryRunning(effectiveSessionId);\n }\n },\n [\n sessionId,\n sendCdecliMessage,\n patchChannelTitle,\n flushPendingSteers,\n createAccountChatFileUploadLinksMutation,\n createAccountChatFileDownloadLinksMutation,\n ],\n );\n\n sendMessageRef.current = sendMessage;\n\n tryRecoverAndResendRef.current = async (reason: string) => {\n if (authRetryUsedRef.current || cdecliRoundHandledRef.current) return false;\n if (!isAgentJwtRejected(reason)) return false;\n const recover = routingRef.current.recoverAgentAuth;\n if (!recover) return false;\n authRetryUsedRef.current = true;\n recoveringAuthRef.current = true;\n try {\n setError('Refreshing CDeCLI credentials…');\n const recovered = await recover();\n if (!recovered) return false;\n const um = userMsgForSaveRef.current;\n const sid = saveSessionIdRef.current;\n cdecliRoundHandledRef.current = false;\n isSendingRef.current = false;\n setIsLoading(false);\n setIsStreaming(false);\n setError(null);\n if (um && sid) {\n queueMicrotask(() => {\n void sendMessageRef.current(um.content, um.attachments, sid, true);\n });\n }\n return true;\n } catch (err) {\n console.error('[useChatStream] recoverAgentAuth failed:', err);\n return false;\n } finally {\n recoveringAuthRef.current = false;\n }\n };\n\n const cancel = useCallback(() => {\n clearPendingStream();\n pendingSteersRef.current = [];\n sessionLiveRef.current = false;\n const sid = saveSessionIdRef.current ?? sessionId;\n void cancelCdecliTurn(sid ?? 'messenger');\n if (!cdecliRoundHandledRef.current) {\n cdecliRoundHandledRef.current = true;\n finalizeCdecliRound();\n }\n }, [cancelCdecliTurn, finalizeCdecliRound, sessionId, clearPendingStream]);\n\n const clearMessages = useCallback(() => {\n clearPendingStream();\n setMessages([]);\n setResponse('');\n setError(null);\n }, [clearPendingStream]);\n\n const messagesLoading = !!sessionId && backendMessagesLoading && !backendMessagesLoaded;\n\n return {\n messages,\n response,\n error,\n isLoading,\n isStreaming,\n messagesLoading,\n hasMessages: messages.length > 0 || !!response,\n sendMessage,\n cancel,\n clearMessages,\n };\n}\n"],"names":[],"mappings":"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"}
@@ -45,9 +45,7 @@ function ChatScreen() {
45
45
  useEffect(() => {
46
46
  if (!channelId) return void 0;
47
47
  cdecli.setActiveChannelId(channelId);
48
- return () => {
49
- cdecli.setActiveChannelId(void 0);
50
- };
48
+ return void 0;
51
49
  }, [channelId, cdecli.setActiveChannelId]);
52
50
  const chatRouting = useMemo(() => ({
53
51
  channelConnected: cdecli.channelConnected,