@adminide-stack/yantra-mobile 12.0.117 → 12.0.118-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/features/attachments/displayUserMessageText.js +3 -2
- package/lib/features/attachments/displayUserMessageText.js.map +1 -1
- package/lib/features/chat/ChatWidgetCard.js +9 -1
- package/lib/features/chat/ChatWidgetCard.js.map +1 -1
- package/lib/features/chat/TemplatesChatCards.js +175 -0
- package/lib/features/chat/TemplatesChatCards.js.map +1 -0
- package/lib/features/chat/chatWidgets.js +33 -2
- package/lib/features/chat/chatWidgets.js.map +1 -1
- package/lib/hooks/useChatApi.js +3 -1
- package/lib/hooks/useChatApi.js.map +1 -1
- package/package.json +4 -4
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import {isAttachedCaption}from'./historyAttachmentLabel.js';const VISION_HINT_RE = /\n\nLook at the attached images? before answering\.?\s*$/i;
|
|
1
|
+
import {surfaceReplyDisplayText}from'common';import {isAttachedCaption}from'./historyAttachmentLabel.js';const VISION_HINT_RE = /\n\nLook at the attached images? before answering\.?\s*$/i;
|
|
2
2
|
function displayUserMessageText(content, _attachments) {
|
|
3
|
+
var _a;
|
|
3
4
|
const trimmed = (content != null ? content : "").replace(VISION_HINT_RE, "").trim();
|
|
4
5
|
if (!trimmed) return "";
|
|
5
6
|
if (isAttachedCaption(trimmed)) return "";
|
|
6
|
-
return trimmed;
|
|
7
|
+
return (_a = surfaceReplyDisplayText(trimmed)) != null ? _a : trimmed;
|
|
7
8
|
}
|
|
8
9
|
function hasLiveLocalPreview(attachments) {
|
|
9
10
|
return (attachments != null ? attachments : []).some((attachment) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"displayUserMessageText.js","sources":["../../../src/features/attachments/displayUserMessageText.ts"],"sourcesContent":["/**\n * Text that belongs in the user bubble after attachments are drawn visually.\n *\n * Attachment-only sends still go to the gateway as `Attached: filename` so the\n * agent has a caption — that string must not appear in the bubble (web hides\n * this turn entirely when there is no live preview).\n */\nimport { isAttachedCaption } from './historyAttachmentLabel';\n\nconst VISION_HINT_RE = /\\n\\nLook at the attached images? before answering\\.?\\s*$/i;\n\nexport function displayUserMessageText(\n content: string | undefined,\n _attachments?: Array<{ name?: string }> | null,\n): string {\n const trimmed = (content ?? '').replace(VISION_HINT_RE, '').trim();\n if (!trimmed) return '';\n if (isAttachedCaption(trimmed)) return '';\n return trimmed;\n}\n\nfunction hasLiveLocalPreview(attachments?: Array<{ url?: string; dataUrl?: string }> | null): boolean {\n return (attachments ?? []).some((attachment) => {\n if (attachment.dataUrl?.startsWith('data:')) return true;\n const url = attachment.url?.trim();\n return Boolean(url && /^(file:|content:|ph:|assets-library:)/i.test(url));\n });\n}\n\n/**\n * Web omits the user bubble for attachment-only turns (empty query + files).\n * Mobile still shows a live thumbnail while sending; from history, skip the\n * `Attached: filename` row and keep the assistant reply.\n */\nexport function shouldRenderUserTranscriptTurn(\n content: string | undefined,\n attachments?: Array<{ url?: string; dataUrl?: string; name?: string }> | null,\n): boolean {\n if (displayUserMessageText(content, attachments)) return true;\n if (hasLiveLocalPreview(attachments)) return true;\n return false;\n}\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"displayUserMessageText.js","sources":["../../../src/features/attachments/displayUserMessageText.ts"],"sourcesContent":["/**\n * Text that belongs in the user bubble after attachments are drawn visually.\n *\n * Attachment-only sends still go to the gateway as `Attached: filename` so the\n * agent has a caption — that string must not appear in the bubble (web hides\n * this turn entirely when there is no live preview).\n */\nimport { surfaceReplyDisplayText } from 'common';\nimport { isAttachedCaption } from './historyAttachmentLabel';\n\nconst VISION_HINT_RE = /\\n\\nLook at the attached images? before answering\\.?\\s*$/i;\n\nexport function displayUserMessageText(\n content: string | undefined,\n _attachments?: Array<{ name?: string }> | null,\n): string {\n const trimmed = (content ?? '').replace(VISION_HINT_RE, '').trim();\n if (!trimmed) return '';\n if (isAttachedCaption(trimmed)) return '';\n // A template picked on the Templates surface reaches the agent as one control line; the bubble\n // shows the person's words for it (`Use the \"Bold Monogram\" logo template`), as on the web.\n return surfaceReplyDisplayText(trimmed) ?? trimmed;\n}\n\nfunction hasLiveLocalPreview(attachments?: Array<{ url?: string; dataUrl?: string }> | null): boolean {\n return (attachments ?? []).some((attachment) => {\n if (attachment.dataUrl?.startsWith('data:')) return true;\n const url = attachment.url?.trim();\n return Boolean(url && /^(file:|content:|ph:|assets-library:)/i.test(url));\n });\n}\n\n/**\n * Web omits the user bubble for attachment-only turns (empty query + files).\n * Mobile still shows a live thumbnail while sending; from history, skip the\n * `Attached: filename` row and keep the assistant reply.\n */\nexport function shouldRenderUserTranscriptTurn(\n content: string | undefined,\n attachments?: Array<{ url?: string; dataUrl?: string; name?: string }> | null,\n): boolean {\n if (displayUserMessageText(content, attachments)) return true;\n if (hasLiveLocalPreview(attachments)) return true;\n return false;\n}\n"],"names":[],"mappings":"yGASA,MAAM,cAAiB,GAAA,2DAAA;AACP,SAAA,sBAAA,CAAuB,SAA6B,YAEjD,EAAA;AAZnB,EAAA,IAAA,EAAA;AAaE,EAAA,MAAM,WAAW,OAAW,IAAA,IAAA,GAAA,OAAA,GAAA,EAAA,EAAI,QAAQ,cAAgB,EAAA,EAAE,EAAE,IAAK,EAAA;AACjE,EAAI,IAAA,CAAC,SAAgB,OAAA,EAAA;AACrB,EAAI,IAAA,iBAAA,CAAkB,OAAO,CAAA,EAAU,OAAA,EAAA;AAGvC,EAAO,OAAA,CAAA,EAAA,GAAA,uBAAA,CAAwB,OAAO,CAAA,KAA/B,IAAoC,GAAA,EAAA,GAAA,OAAA;AAC7C;AACA,SAAS,oBAAoB,WAGT,EAAA;AAClB,EAAA,OAAA,CAAQ,WAAe,IAAA,IAAA,GAAA,WAAA,GAAA,EAAI,EAAA,IAAA,CAAK,CAAc,UAAA,KAAA;AAxBhD,IAAA,IAAA,EAAA,EAAA,EAAA;AAyBI,IAAA,IAAA,CAAI,EAAW,GAAA,UAAA,CAAA,OAAA,KAAX,IAAoB,GAAA,MAAA,GAAA,EAAA,CAAA,UAAA,CAAW,UAAiB,OAAA,IAAA;AACpD,IAAM,MAAA,GAAA,GAAA,CAAM,EAAW,GAAA,UAAA,CAAA,GAAA,KAAX,IAAgB,GAAA,MAAA,GAAA,EAAA,CAAA,IAAA,EAAA;AAC5B,IAAA,OAAO,OAAQ,CAAA,GAAA,IAAO,wCAAyC,CAAA,IAAA,CAAK,GAAG,CAAC,CAAA;AAAA,GACzE,CAAA;AACH;AAOgB,SAAA,8BAAA,CAA+B,SAA6B,WAIxD,EAAA;AAClB,EAAA,IAAI,sBAAuB,CAAA,OAAoB,CAAA,EAAU,OAAA,IAAA;AACzD,EAAI,IAAA,mBAAA,CAAoB,WAAW,CAAA,EAAU,OAAA,IAAA;AAC7C,EAAO,OAAA,KAAA;AACT"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {jsx}from'react/jsx-runtime';import {memo}from'react';import {Linking}from'react-native';import {isFlightAttachment,FlightCardRow}from'@admin-layout/gluestack-ui-mobile/lib/components/FlightCards/index.js';const openOffer = (url) => {
|
|
1
|
+
import {jsx}from'react/jsx-runtime';import {memo}from'react';import {Linking}from'react-native';import {isFlightAttachment,FlightCardRow}from'@admin-layout/gluestack-ui-mobile/lib/components/FlightCards/index.js';import {TEMPLATES_WIDGET,parseTemplatesOpening,CANVAS_DESIGN_WIDGET,toCanvasDesignAttachment}from'common';import {TemplatesWidgetCard,CanvasDesignWidgetCard}from'./TemplatesChatCards.js';const openOffer = (url) => {
|
|
2
2
|
void Linking.openURL(url);
|
|
3
3
|
};
|
|
4
4
|
const ChatWidgetCard = memo(function ChatWidgetCard2({
|
|
@@ -9,5 +9,13 @@ const ChatWidgetCard = memo(function ChatWidgetCard2({
|
|
|
9
9
|
if (widget.component === "travel" && isFlightAttachment(attachment)) {
|
|
10
10
|
return /* @__PURE__ */ jsx(FlightCardRow, { attachment, onOpenOffer: openOffer, scheme: isDark ? "dark" : "light" });
|
|
11
11
|
}
|
|
12
|
+
if (widget.component === TEMPLATES_WIDGET) {
|
|
13
|
+
const opening = parseTemplatesOpening(widget.attachment);
|
|
14
|
+
return opening ? /* @__PURE__ */ jsx(TemplatesWidgetCard, { opening, isDark }) : null;
|
|
15
|
+
}
|
|
16
|
+
if (widget.component === CANVAS_DESIGN_WIDGET) {
|
|
17
|
+
const design = toCanvasDesignAttachment(widget.attachment);
|
|
18
|
+
return design ? /* @__PURE__ */ jsx(CanvasDesignWidgetCard, { design, isDark }) : null;
|
|
19
|
+
}
|
|
12
20
|
return null;
|
|
13
21
|
});export{ChatWidgetCard};//# sourceMappingURL=ChatWidgetCard.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatWidgetCard.js","sources":["../../../src/features/chat/ChatWidgetCard.tsx"],"sourcesContent":["import React, { memo } from 'react';\nimport { Linking } from 'react-native';\n// The flight-cards entry, not the package root: this renders inside the chat\n// that surface remotes bundle, and the root (layout, redux, client barrel)\n// would ship as a private copy in each of them.\nimport {\n FlightCardRow,\n isFlightAttachment,\n} from '@admin-layout/gluestack-ui-mobile/lib/components/FlightCards/index.js';\nimport type { FlightOfferSetLike } from '@admin-layout/gluestack-ui-mobile/lib/components/FlightCards/index.js';\nimport type { ChatWidget } from './chatWidgets';\n\nconst openOffer = (url: string) => {\n void Linking.openURL(url);\n};\n\n/**\n * The native card for a widget envelope in the main chat. Flights render as\n * the shared gluestack flight cards (the web chat renders the same results\n * with ai-chat-ext's tailwind cards, from the same model). A widget with no\n * native card yet renders nothing: its envelope is still kept out of the\n * text, so the thread never shows raw JSON.\n */\nexport const ChatWidgetCard = memo(function ChatWidgetCard({\n widget,\n isDark,\n}: {\n widget: ChatWidget;\n isDark: boolean;\n}) {\n const attachment = widget.attachment as FlightOfferSetLike & { title?: string; totalCount?: number };\n if (widget.component === 'travel' && isFlightAttachment(attachment)) {\n return <FlightCardRow attachment={attachment} onOpenOffer={openOffer} scheme={isDark ? 'dark' : 'light'} />;\n }\n return null;\n});\n"],"names":["ChatWidgetCard"],"mappings":"
|
|
1
|
+
{"version":3,"file":"ChatWidgetCard.js","sources":["../../../src/features/chat/ChatWidgetCard.tsx"],"sourcesContent":["import React, { memo } from 'react';\nimport { Linking } from 'react-native';\n// The flight-cards entry, not the package root: this renders inside the chat\n// that surface remotes bundle, and the root (layout, redux, client barrel)\n// would ship as a private copy in each of them.\nimport {\n FlightCardRow,\n isFlightAttachment,\n} from '@admin-layout/gluestack-ui-mobile/lib/components/FlightCards/index.js';\nimport type { FlightOfferSetLike } from '@admin-layout/gluestack-ui-mobile/lib/components/FlightCards/index.js';\nimport { CANVAS_DESIGN_WIDGET, TEMPLATES_WIDGET, toCanvasDesignAttachment, parseTemplatesOpening } from 'common';\nimport type { ChatWidget } from './chatWidgets';\nimport { CanvasDesignWidgetCard, TemplatesWidgetCard } from './TemplatesChatCards';\n\nconst openOffer = (url: string) => {\n void Linking.openURL(url);\n};\n\n/**\n * The native card for a widget envelope in the main chat. Flights render as\n * the shared gluestack flight cards (the web chat renders the same results\n * with ai-chat-ext's tailwind cards, from the same model); templates and a\n * design made from one have their own cards (TemplatesChatCards). A widget with no\n * native card yet renders nothing: its envelope is still kept out of the\n * text, so the thread never shows raw JSON.\n */\nexport const ChatWidgetCard = memo(function ChatWidgetCard({\n widget,\n isDark,\n}: {\n widget: ChatWidget;\n isDark: boolean;\n}) {\n const attachment = widget.attachment as FlightOfferSetLike & { title?: string; totalCount?: number };\n if (widget.component === 'travel' && isFlightAttachment(attachment)) {\n return <FlightCardRow attachment={attachment} onOpenOffer={openOffer} scheme={isDark ? 'dark' : 'light'} />;\n }\n if (widget.component === TEMPLATES_WIDGET) {\n const opening = parseTemplatesOpening(widget.attachment);\n return opening ? <TemplatesWidgetCard opening={opening} isDark={isDark} /> : null;\n }\n if (widget.component === CANVAS_DESIGN_WIDGET) {\n const design = toCanvasDesignAttachment(widget.attachment);\n return design ? <CanvasDesignWidgetCard design={design} isDark={isDark} /> : null;\n }\n return null;\n});\n"],"names":["ChatWidgetCard"],"mappings":"gZAUA,MAAM,SAAA,GAAY,CAAC,GAAgB,KAAA;AACjC,EAAK,KAAA,OAAA,CAAQ,QAAQ,GAAG,CAAA;AAC1B,CAAA;AAUa,MAAA,cAAA,GAAiB,IAAK,CAAA,SAASA,eAAe,CAAA;AAAA,EACzD,MAAA;AAAA,EACA;AACF,CAGG,EAAA;AACD,EAAA,MAAM,aAAa,MAAO,CAAA,UAAA;AAI1B,EAAA,IAAI,MAAO,CAAA,SAAA,KAAc,QAAY,IAAA,kBAAA,CAAmB,UAAU,CAAG,EAAA;AACnE,IAAO,uBAAA,GAAA,CAAC,iBAAc,UAAwB,EAAA,WAAA,EAAa,WAAW,MAAQ,EAAA,MAAA,GAAS,SAAS,OAAS,EAAA,CAAA;AAAA;AAE3G,EAAI,IAAA,MAAA,CAAO,cAAc,gBAAkB,EAAA;AACzC,IAAM,MAAA,OAAA,GAAU,qBAAsB,CAAA,MAAA,CAAO,UAAU,CAAA;AACvD,IAAA,OAAO,OAAU,mBAAA,GAAA,CAAC,mBAAoB,EAAA,EAAA,OAAA,EAAkB,QAAgB,CAAK,GAAA,IAAA;AAAA;AAE/E,EAAI,IAAA,MAAA,CAAO,cAAc,oBAAsB,EAAA;AAC7C,IAAM,MAAA,MAAA,GAAS,wBAAyB,CAAA,MAAA,CAAO,UAAU,CAAA;AACzD,IAAA,OAAO,MAAS,mBAAA,GAAA,CAAC,sBAAuB,EAAA,EAAA,MAAA,EAAgB,QAAgB,CAAK,GAAA,IAAA;AAAA;AAE/E,EAAO,OAAA,IAAA;AACT,CAAC"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import {jsx,jsxs}from'react/jsx-runtime';import {memo,useMemo,useCallback,useState}from'react';import {Pressable,StyleSheet,View,Text,ScrollView,Image}from'react-native';import {MaterialCommunityIcons}from'@expo/vector-icons';import {useNavigation}from'@react-navigation/native';import {templatesOpeningTitle,canvasDesignKindLabel,templatesSurfaceUrl}from'common';import {config}from'../../config/env-config.js';import {openSurfaceInApp}from'../links/openInApp.js';const ACCENT = "#2563eb";
|
|
2
|
+
const TEMPLATES_SURFACE_SLUG = "templates";
|
|
3
|
+
function templatesSurfaceLink(surfaceUrlTemplate, opening) {
|
|
4
|
+
const template = surfaceUrlTemplate == null ? void 0 : surfaceUrlTemplate.trim();
|
|
5
|
+
if (!template || !template.includes("{slug}")) return null;
|
|
6
|
+
return templatesSurfaceUrl(template.replace(/\{slug\}/g, TEMPLATES_SURFACE_SLUG), opening);
|
|
7
|
+
}
|
|
8
|
+
function palette(isDark) {
|
|
9
|
+
return {
|
|
10
|
+
card: isDark ? "#111827" : "#ffffff",
|
|
11
|
+
border: isDark ? "#1f2937" : "#e5e7eb",
|
|
12
|
+
title: isDark ? "#f1f5f9" : "#111827",
|
|
13
|
+
muted: isDark ? "#94a3b8" : "#6b7280",
|
|
14
|
+
iconBg: isDark ? "#1e293b" : "#eff6ff",
|
|
15
|
+
icon: isDark ? "#60a5fa" : ACCENT,
|
|
16
|
+
table: isDark ? "#0b1220" : "#f9fafb",
|
|
17
|
+
pressed: isDark ? "#1f2937" : "#f3f4f6"
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
const styles = StyleSheet.create({
|
|
21
|
+
card: {
|
|
22
|
+
width: "100%",
|
|
23
|
+
borderWidth: 1,
|
|
24
|
+
borderRadius: 16,
|
|
25
|
+
marginTop: 4,
|
|
26
|
+
marginBottom: 8,
|
|
27
|
+
overflow: "hidden"
|
|
28
|
+
},
|
|
29
|
+
row: {
|
|
30
|
+
flexDirection: "row",
|
|
31
|
+
alignItems: "center",
|
|
32
|
+
gap: 12,
|
|
33
|
+
padding: 14
|
|
34
|
+
},
|
|
35
|
+
icon: {
|
|
36
|
+
width: 40,
|
|
37
|
+
height: 40,
|
|
38
|
+
borderRadius: 10,
|
|
39
|
+
alignItems: "center",
|
|
40
|
+
justifyContent: "center"
|
|
41
|
+
},
|
|
42
|
+
body: {
|
|
43
|
+
flex: 1,
|
|
44
|
+
minWidth: 0
|
|
45
|
+
},
|
|
46
|
+
title: {
|
|
47
|
+
fontSize: 15,
|
|
48
|
+
fontWeight: "700",
|
|
49
|
+
lineHeight: 20
|
|
50
|
+
},
|
|
51
|
+
subtitle: {
|
|
52
|
+
fontSize: 13,
|
|
53
|
+
lineHeight: 18,
|
|
54
|
+
marginTop: 2
|
|
55
|
+
},
|
|
56
|
+
header: {
|
|
57
|
+
flexDirection: "row",
|
|
58
|
+
alignItems: "center",
|
|
59
|
+
gap: 8,
|
|
60
|
+
paddingHorizontal: 14,
|
|
61
|
+
paddingVertical: 10
|
|
62
|
+
},
|
|
63
|
+
badge: {
|
|
64
|
+
borderRadius: 6,
|
|
65
|
+
paddingHorizontal: 6,
|
|
66
|
+
paddingVertical: 2
|
|
67
|
+
},
|
|
68
|
+
badgeText: {
|
|
69
|
+
fontSize: 11,
|
|
70
|
+
fontWeight: "600"
|
|
71
|
+
},
|
|
72
|
+
pages: {
|
|
73
|
+
paddingHorizontal: 12,
|
|
74
|
+
paddingVertical: 12,
|
|
75
|
+
gap: 10
|
|
76
|
+
},
|
|
77
|
+
page: {
|
|
78
|
+
width: 200,
|
|
79
|
+
height: 150,
|
|
80
|
+
borderRadius: 8
|
|
81
|
+
},
|
|
82
|
+
count: {
|
|
83
|
+
fontSize: 11
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
const TemplatesWidgetCard = memo(function TemplatesWidgetCard2({
|
|
87
|
+
opening,
|
|
88
|
+
isDark
|
|
89
|
+
}) {
|
|
90
|
+
const navigation = useNavigation();
|
|
91
|
+
const colors = palette(isDark);
|
|
92
|
+
const url = useMemo(() => templatesSurfaceLink(config.SURFACE_URL_TEMPLATE, opening), [opening]);
|
|
93
|
+
const title = templatesOpeningTitle(opening);
|
|
94
|
+
const open = useCallback(() => {
|
|
95
|
+
if (url) openSurfaceInApp(navigation, {
|
|
96
|
+
surface: TEMPLATES_SURFACE_SLUG,
|
|
97
|
+
url
|
|
98
|
+
});
|
|
99
|
+
}, [navigation, url]);
|
|
100
|
+
if (!url) return null;
|
|
101
|
+
return /* @__PURE__ */ jsx(Pressable, { onPress: open, accessibilityRole: "button", accessibilityLabel: `Browse ${title.charAt(0).toLowerCase()}${title.slice(1)}`, style: ({
|
|
102
|
+
pressed
|
|
103
|
+
}) => [styles.card, {
|
|
104
|
+
borderColor: colors.border,
|
|
105
|
+
backgroundColor: pressed ? colors.pressed : colors.card
|
|
106
|
+
}], children: /* @__PURE__ */ jsxs(View, { style: styles.row, children: [
|
|
107
|
+
/* @__PURE__ */ jsx(View, { style: [styles.icon, {
|
|
108
|
+
backgroundColor: colors.iconBg
|
|
109
|
+
}], children: /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "view-grid-outline", size: 22, color: colors.icon }) }),
|
|
110
|
+
/* @__PURE__ */ jsxs(View, { style: styles.body, children: [
|
|
111
|
+
/* @__PURE__ */ jsxs(Text, { style: [styles.title, {
|
|
112
|
+
color: colors.title
|
|
113
|
+
}], numberOfLines: 1, children: [
|
|
114
|
+
"Browse ",
|
|
115
|
+
title.charAt(0).toLowerCase() + title.slice(1)
|
|
116
|
+
] }),
|
|
117
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.subtitle, {
|
|
118
|
+
color: colors.muted
|
|
119
|
+
}], numberOfLines: 1, children: opening.query ? `Matching \u201C${opening.query}\u201D` : "Pick one to start from it" })
|
|
120
|
+
] }),
|
|
121
|
+
/* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "chevron-right", size: 20, color: colors.muted })
|
|
122
|
+
] }) });
|
|
123
|
+
});
|
|
124
|
+
function PagePreview({
|
|
125
|
+
uri,
|
|
126
|
+
label,
|
|
127
|
+
isDark
|
|
128
|
+
}) {
|
|
129
|
+
const [failed, setFailed] = useState(false);
|
|
130
|
+
const colors = palette(isDark);
|
|
131
|
+
if (failed) {
|
|
132
|
+
return /* @__PURE__ */ jsx(View, { accessible: true, accessibilityLabel: `${label} (preview unavailable)`, style: [styles.page, {
|
|
133
|
+
backgroundColor: colors.border,
|
|
134
|
+
alignItems: "center",
|
|
135
|
+
justifyContent: "center"
|
|
136
|
+
}], children: /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "image-off-outline", size: 22, color: colors.muted }) });
|
|
137
|
+
}
|
|
138
|
+
return /* @__PURE__ */ jsx(Image, { source: {
|
|
139
|
+
uri
|
|
140
|
+
}, accessibilityLabel: label, resizeMode: "contain", onError: () => setFailed(true), style: styles.page });
|
|
141
|
+
}
|
|
142
|
+
const CanvasDesignWidgetCard = memo(function CanvasDesignWidgetCard2({
|
|
143
|
+
design,
|
|
144
|
+
isDark
|
|
145
|
+
}) {
|
|
146
|
+
var _a;
|
|
147
|
+
const colors = palette(isDark);
|
|
148
|
+
const kind = canvasDesignKindLabel(design);
|
|
149
|
+
const title = (_a = design.title) != null ? _a : `Your ${kind.toLowerCase()}`;
|
|
150
|
+
const pages = design.previews.length;
|
|
151
|
+
return /* @__PURE__ */ jsxs(View, { accessibilityLabel: `${kind}: ${title}`, style: [styles.card, {
|
|
152
|
+
borderColor: colors.border,
|
|
153
|
+
backgroundColor: colors.card
|
|
154
|
+
}], children: [
|
|
155
|
+
/* @__PURE__ */ jsxs(View, { style: styles.header, children: [
|
|
156
|
+
/* @__PURE__ */ jsx(View, { style: [styles.badge, {
|
|
157
|
+
backgroundColor: colors.iconBg
|
|
158
|
+
}], children: /* @__PURE__ */ jsx(Text, { style: [styles.badgeText, {
|
|
159
|
+
color: colors.icon
|
|
160
|
+
}], children: kind }) }),
|
|
161
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.title, styles.body, {
|
|
162
|
+
color: colors.title
|
|
163
|
+
}], numberOfLines: 1, children: title }),
|
|
164
|
+
pages > 1 ? /* @__PURE__ */ jsxs(Text, { style: [styles.count, {
|
|
165
|
+
color: colors.muted
|
|
166
|
+
}], children: [
|
|
167
|
+
pages,
|
|
168
|
+
" pages"
|
|
169
|
+
] }) : null
|
|
170
|
+
] }),
|
|
171
|
+
pages > 0 ? /* @__PURE__ */ jsx(ScrollView, { horizontal: true, showsHorizontalScrollIndicator: false, contentContainerStyle: styles.pages, style: {
|
|
172
|
+
backgroundColor: colors.table
|
|
173
|
+
}, children: design.previews.map((uri, i) => /* @__PURE__ */ jsx(PagePreview, { uri, label: pages > 1 ? `${title}, page ${i + 1} of ${pages}` : title, isDark }, `${i}:${uri}`)) }) : null
|
|
174
|
+
] });
|
|
175
|
+
});export{CanvasDesignWidgetCard,TEMPLATES_SURFACE_SLUG,TemplatesWidgetCard,templatesSurfaceLink};//# sourceMappingURL=TemplatesChatCards.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TemplatesChatCards.js","sources":["../../../src/features/chat/TemplatesChatCards.tsx"],"sourcesContent":["/**\n * The phone's cards for templates in the chat (common TEMPLATES_CHAT_PROTOCOL), the twins of the\n * web's TemplatesMessage and CanvasDesignMessage:\n *\n * - `templates`: one row that opens the Templates surface on that category in the app's surface\n * screen (signed in with this device), where a tap on a template sends the pick back into the\n * chat, as from a texted card.\n * - `canvas-design`: the pages of a design the agent made from a template, side by side.\n */\nimport React, { memo, useCallback, useMemo, useState } from 'react';\nimport { Image, Pressable, ScrollView, StyleSheet, Text, View } from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { useNavigation, type NavigationProp, type ParamListBase } from '@react-navigation/native';\nimport {\n canvasDesignKindLabel,\n templatesOpeningTitle,\n templatesSurfaceUrl,\n type CanvasDesignAttachment,\n type TemplatesOpening,\n} from 'common';\nimport { config } from '../../config/env-config';\nimport { openSurfaceInApp } from '../links/openInApp';\n\nconst ACCENT = '#2563eb';\n/** The Templates surface's slug: `templates-surface.<env>` through SURFACE_URL_TEMPLATE. */\nexport const TEMPLATES_SURFACE_SLUG = 'templates';\n\n/** The Templates surface page for an opening, or null when the template has no `{slug}` (it would open another surface). */\nexport function templatesSurfaceLink(\n surfaceUrlTemplate: string | undefined,\n opening: TemplatesOpening | null | undefined,\n): string | null {\n const template = surfaceUrlTemplate?.trim();\n if (!template || !template.includes('{slug}')) return null;\n return templatesSurfaceUrl(template.replace(/\\{slug\\}/g, TEMPLATES_SURFACE_SLUG), opening);\n}\n\nfunction palette(isDark: boolean) {\n return {\n card: isDark ? '#111827' : '#ffffff',\n border: isDark ? '#1f2937' : '#e5e7eb',\n title: isDark ? '#f1f5f9' : '#111827',\n muted: isDark ? '#94a3b8' : '#6b7280',\n iconBg: isDark ? '#1e293b' : '#eff6ff',\n icon: isDark ? '#60a5fa' : ACCENT,\n table: isDark ? '#0b1220' : '#f9fafb',\n pressed: isDark ? '#1f2937' : '#f3f4f6',\n };\n}\n\nconst styles = StyleSheet.create({\n card: { width: '100%', borderWidth: 1, borderRadius: 16, marginTop: 4, marginBottom: 8, overflow: 'hidden' },\n row: { flexDirection: 'row', alignItems: 'center', gap: 12, padding: 14 },\n icon: { width: 40, height: 40, borderRadius: 10, alignItems: 'center', justifyContent: 'center' },\n body: { flex: 1, minWidth: 0 },\n title: { fontSize: 15, fontWeight: '700', lineHeight: 20 },\n subtitle: { fontSize: 13, lineHeight: 18, marginTop: 2 },\n header: { flexDirection: 'row', alignItems: 'center', gap: 8, paddingHorizontal: 14, paddingVertical: 10 },\n badge: { borderRadius: 6, paddingHorizontal: 6, paddingVertical: 2 },\n badgeText: { fontSize: 11, fontWeight: '600' },\n pages: { paddingHorizontal: 12, paddingVertical: 12, gap: 10 },\n page: { width: 200, height: 150, borderRadius: 8 },\n count: { fontSize: 11 },\n});\n\n/** A `templates` widget: one row that opens the Templates surface on its category. */\nexport const TemplatesWidgetCard = memo(function TemplatesWidgetCard({\n opening,\n isDark,\n}: {\n opening: TemplatesOpening;\n isDark: boolean;\n}) {\n const navigation = useNavigation<NavigationProp<ParamListBase>>();\n const colors = palette(isDark);\n const url = useMemo(() => templatesSurfaceLink(config.SURFACE_URL_TEMPLATE, opening), [opening]);\n const title = templatesOpeningTitle(opening);\n const open = useCallback(() => {\n if (url) openSurfaceInApp(navigation, { surface: TEMPLATES_SURFACE_SLUG, url });\n }, [navigation, url]);\n if (!url) return null;\n return (\n <Pressable\n onPress={open}\n accessibilityRole=\"button\"\n accessibilityLabel={`Browse ${title.charAt(0).toLowerCase()}${title.slice(1)}`}\n style={({ pressed }) => [\n styles.card,\n { borderColor: colors.border, backgroundColor: pressed ? colors.pressed : colors.card },\n ]}\n >\n <View style={styles.row}>\n <View style={[styles.icon, { backgroundColor: colors.iconBg }]}>\n <MaterialCommunityIcons name=\"view-grid-outline\" size={22} color={colors.icon} />\n </View>\n <View style={styles.body}>\n <Text style={[styles.title, { color: colors.title }]} numberOfLines={1}>\n Browse {title.charAt(0).toLowerCase() + title.slice(1)}\n </Text>\n <Text style={[styles.subtitle, { color: colors.muted }]} numberOfLines={1}>\n {opening.query ? `Matching “${opening.query}”` : 'Pick one to start from it'}\n </Text>\n </View>\n <MaterialCommunityIcons name=\"chevron-right\" size={20} color={colors.muted} />\n </View>\n </Pressable>\n );\n});\n\n/** One page; a render that will not load leaves a quiet tile, never a broken image. */\nfunction PagePreview({ uri, label, isDark }: { uri: string; label: string; isDark: boolean }) {\n const [failed, setFailed] = useState(false);\n const colors = palette(isDark);\n if (failed) {\n return (\n <View\n accessible\n accessibilityLabel={`${label} (preview unavailable)`}\n style={[\n styles.page,\n { backgroundColor: colors.border, alignItems: 'center', justifyContent: 'center' },\n ]}\n >\n <MaterialCommunityIcons name=\"image-off-outline\" size={22} color={colors.muted} />\n </View>\n );\n }\n return (\n <Image\n source={{ uri }}\n accessibilityLabel={label}\n resizeMode=\"contain\"\n onError={() => setFailed(true)}\n style={styles.page}\n />\n );\n}\n\n/** A `canvas-design` widget: what was made and its pages, side by side. */\nexport const CanvasDesignWidgetCard = memo(function CanvasDesignWidgetCard({\n design,\n isDark,\n}: {\n design: CanvasDesignAttachment;\n isDark: boolean;\n}) {\n const colors = palette(isDark);\n const kind = canvasDesignKindLabel(design);\n const title = design.title ?? `Your ${kind.toLowerCase()}`;\n const pages = design.previews.length;\n return (\n <View\n accessibilityLabel={`${kind}: ${title}`}\n style={[styles.card, { borderColor: colors.border, backgroundColor: colors.card }]}\n >\n <View style={styles.header}>\n <View style={[styles.badge, { backgroundColor: colors.iconBg }]}>\n <Text style={[styles.badgeText, { color: colors.icon }]}>{kind}</Text>\n </View>\n <Text style={[styles.title, styles.body, { color: colors.title }]} numberOfLines={1}>\n {title}\n </Text>\n {pages > 1 ? <Text style={[styles.count, { color: colors.muted }]}>{pages} pages</Text> : null}\n </View>\n {pages > 0 ? (\n <ScrollView\n horizontal\n showsHorizontalScrollIndicator={false}\n contentContainerStyle={styles.pages}\n style={{ backgroundColor: colors.table }}\n >\n {design.previews.map((uri, i) => (\n <PagePreview\n key={`${i}:${uri}`}\n uri={uri}\n label={pages > 1 ? `${title}, page ${i + 1} of ${pages}` : title}\n isDark={isDark}\n />\n ))}\n </ScrollView>\n ) : null}\n </View>\n );\n});\n"],"names":["TemplatesWidgetCard","CanvasDesignWidgetCard"],"mappings":"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"}
|
|
@@ -1,8 +1,24 @@
|
|
|
1
|
+
import {TEMPLATES_WIDGET,parseTemplatesOpening,CANVAS_DESIGN_WIDGET,canvasDesignFromWidget}from'common';var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
3
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
4
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
5
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
6
|
+
var __spreadValues = (a, b) => {
|
|
7
|
+
for (var prop in b || (b = {}))
|
|
8
|
+
if (__hasOwnProp.call(b, prop))
|
|
9
|
+
__defNormalProp(a, prop, b[prop]);
|
|
10
|
+
if (__getOwnPropSymbols)
|
|
11
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
12
|
+
if (__propIsEnum.call(b, prop))
|
|
13
|
+
__defNormalProp(a, prop, b[prop]);
|
|
14
|
+
}
|
|
15
|
+
return a;
|
|
16
|
+
};
|
|
1
17
|
const WIDGET_FENCE = /```(?:yantra:widget|json)[^\S\n]*\n?([\s\S]*?)```/gi;
|
|
2
18
|
const OPEN_WIDGET_TAIL = /```(?:yantra:widget|json)[^\S\n]*\n?\s*\{\s*"propsComponent"[\s\S]*$/i;
|
|
3
19
|
const OPEN_YANTRA_WIDGET_TAIL = /```yantra:widget[\s\S]*$/i;
|
|
4
20
|
function toWidget(body) {
|
|
5
|
-
var _a, _b, _c;
|
|
21
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
6
22
|
let parsed;
|
|
7
23
|
try {
|
|
8
24
|
parsed = JSON.parse(body.trim());
|
|
@@ -12,7 +28,22 @@ function toWidget(body) {
|
|
|
12
28
|
if (!parsed || typeof parsed !== "object") return null;
|
|
13
29
|
const obj = parsed;
|
|
14
30
|
if (typeof obj.propsComponent !== "string" || !obj.propsComponent) return null;
|
|
15
|
-
|
|
31
|
+
if (obj.propsComponent === TEMPLATES_WIDGET) {
|
|
32
|
+
const contents = (_a = obj.propsConfiguration) == null ? void 0 : _a.contents;
|
|
33
|
+
const opening = parseTemplatesOpening((_d = (_c = (_b = contents == null ? void 0 : contents.attachment) != null ? _b : obj.attachment) != null ? _c : contents) != null ? _d : {});
|
|
34
|
+
return opening ? {
|
|
35
|
+
component: TEMPLATES_WIDGET,
|
|
36
|
+
attachment: __spreadValues({}, opening)
|
|
37
|
+
} : null;
|
|
38
|
+
}
|
|
39
|
+
if (obj.propsComponent === CANVAS_DESIGN_WIDGET) {
|
|
40
|
+
const design = canvasDesignFromWidget(obj);
|
|
41
|
+
return design ? {
|
|
42
|
+
component: CANVAS_DESIGN_WIDGET,
|
|
43
|
+
attachment: __spreadValues({}, design)
|
|
44
|
+
} : null;
|
|
45
|
+
}
|
|
46
|
+
const attachment = (_g = (_f = (_e = obj.propsConfiguration) == null ? void 0 : _e.contents) == null ? void 0 : _f.attachment) != null ? _g : obj.attachment;
|
|
16
47
|
if (!attachment || typeof attachment !== "object") return null;
|
|
17
48
|
return {
|
|
18
49
|
component: obj.propsComponent,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chatWidgets.js","sources":["../../../src/features/chat/chatWidgets.ts"],"sourcesContent":["/**\n * Widget envelopes in an assistant reply, for the mobile main chat.\n *\n * Skills end a reply with a card envelope in a fenced block:\n *\n * ```yantra:widget (or ```json)\n * {\"propsComponent\":\"travel\",\"propsConfiguration\":{\"contents\":{\"attachment\":{…}}}}\n * ```\n *\n * The web chat turns that into a card (parseChatWidget). The mobile chat had no\n * parser, so the envelope rendered as a raw JSON code block, and while\n * streaming it grew in place character by character. This pulls every envelope\n * out of the text and returns what the thread should show instead.\n */\n\nexport interface ChatWidget {\n component: string;\n attachment: Record<string, unknown>;\n}\n\nexport interface ChatWidgetSplit {\n /** The reply with every widget envelope removed. */\n text: string;\n widgets: ChatWidget[];\n}\n\nconst WIDGET_FENCE = /```(?:yantra:widget|json)[^\\S\\n]*\\n?([\\s\\S]*?)```/gi;\n/** An envelope still streaming in: an opened widget fence with no closing fence yet. */\nconst OPEN_WIDGET_TAIL = /```(?:yantra:widget|json)[^\\S\\n]*\\n?\\s*\\{\\s*\"propsComponent\"[\\s\\S]*$/i;\n/** The same, before the JSON reaches the component key. */\nconst OPEN_YANTRA_WIDGET_TAIL = /```yantra:widget[\\s\\S]*$/i;\n\nfunction toWidget(body: string): ChatWidget | null {\n let parsed: unknown;\n try {\n parsed = JSON.parse(body.trim());\n } catch {\n return null;\n }\n if (!parsed || typeof parsed !== 'object') return null;\n const obj = parsed as {\n propsComponent?: unknown;\n propsConfiguration?: { contents?: { attachment?: unknown } };\n attachment?: unknown;\n };\n if (typeof obj.propsComponent !== 'string' || !obj.propsComponent) return null;\n // Canonical path, tolerating the flatter `attachment` the web parser also accepts.\n const attachment = obj.propsConfiguration?.contents?.attachment ?? obj.attachment;\n if (!attachment || typeof attachment !== 'object') return null;\n return { component: obj.propsComponent, attachment: attachment as Record<string, unknown> };\n}\n\nexport function splitChatWidgets(content: string, streaming = false): ChatWidgetSplit {\n const widgets: ChatWidget[] = [];\n let text = content.replace(WIDGET_FENCE, (match, body: string) => {\n const widget = toWidget(body);\n if (!widget) return match; // an ordinary ```json example stays in the answer\n widgets.push(widget);\n return '';\n });\n if (streaming) {\n // Hide an envelope that is still arriving rather than paint half of it.\n text = text.replace(OPEN_WIDGET_TAIL, '').replace(OPEN_YANTRA_WIDGET_TAIL, '');\n }\n return { text: text.replace(/\\n{3,}/g, '\\n\\n').trim(), widgets };\n}\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"chatWidgets.js","sources":["../../../src/features/chat/chatWidgets.ts"],"sourcesContent":["/**\n * Widget envelopes in an assistant reply, for the mobile main chat.\n *\n * Skills end a reply with a card envelope in a fenced block:\n *\n * ```yantra:widget (or ```json)\n * {\"propsComponent\":\"travel\",\"propsConfiguration\":{\"contents\":{\"attachment\":{…}}}}\n * ```\n *\n * The web chat turns that into a card (parseChatWidget). The mobile chat had no\n * parser, so the envelope rendered as a raw JSON code block, and while\n * streaming it grew in place character by character. This pulls every envelope\n * out of the text and returns what the thread should show instead.\n */\n\nimport { CANVAS_DESIGN_WIDGET, canvasDesignFromWidget, parseTemplatesOpening, TEMPLATES_WIDGET } from 'common';\n\nexport interface ChatWidget {\n component: string;\n attachment: Record<string, unknown>;\n}\n\nexport interface ChatWidgetSplit {\n /** The reply with every widget envelope removed. */\n text: string;\n widgets: ChatWidget[];\n}\n\nconst WIDGET_FENCE = /```(?:yantra:widget|json)[^\\S\\n]*\\n?([\\s\\S]*?)```/gi;\n/** An envelope still streaming in: an opened widget fence with no closing fence yet. */\nconst OPEN_WIDGET_TAIL = /```(?:yantra:widget|json)[^\\S\\n]*\\n?\\s*\\{\\s*\"propsComponent\"[\\s\\S]*$/i;\n/** The same, before the JSON reaches the component key. */\nconst OPEN_YANTRA_WIDGET_TAIL = /```yantra:widget[\\s\\S]*$/i;\n\nfunction toWidget(body: string): ChatWidget | null {\n let parsed: unknown;\n try {\n parsed = JSON.parse(body.trim());\n } catch {\n return null;\n }\n if (!parsed || typeof parsed !== 'object') return null;\n const obj = parsed as {\n propsComponent?: unknown;\n propsConfiguration?: { contents?: { attachment?: unknown } };\n attachment?: unknown;\n };\n if (typeof obj.propsComponent !== 'string' || !obj.propsComponent) return null;\n // Templates to browse: every field optional, the opening sometimes flat in `contents`.\n if (obj.propsComponent === TEMPLATES_WIDGET) {\n const contents = obj.propsConfiguration?.contents as Record<string, unknown> | undefined;\n const opening = parseTemplatesOpening(contents?.attachment ?? obj.attachment ?? contents ?? {});\n return opening ? { component: TEMPLATES_WIDGET, attachment: { ...opening } } : null;\n }\n // A design made from a template, only with the canvas artifact it is.\n if (obj.propsComponent === CANVAS_DESIGN_WIDGET) {\n const design = canvasDesignFromWidget(obj as Record<string, unknown>);\n return design ? { component: CANVAS_DESIGN_WIDGET, attachment: { ...design } } : null;\n }\n // Canonical path, tolerating the flatter `attachment` the web parser also accepts.\n const attachment = obj.propsConfiguration?.contents?.attachment ?? obj.attachment;\n if (!attachment || typeof attachment !== 'object') return null;\n return { component: obj.propsComponent, attachment: attachment as Record<string, unknown> };\n}\n\nexport function splitChatWidgets(content: string, streaming = false): ChatWidgetSplit {\n const widgets: ChatWidget[] = [];\n let text = content.replace(WIDGET_FENCE, (match, body: string) => {\n const widget = toWidget(body);\n if (!widget) return match; // an ordinary ```json example stays in the answer\n widgets.push(widget);\n return '';\n });\n if (streaming) {\n // Hide an envelope that is still arriving rather than paint half of it.\n text = text.replace(OPEN_WIDGET_TAIL, '').replace(OPEN_YANTRA_WIDGET_TAIL, '');\n }\n return { text: text.replace(/\\n{3,}/g, '\\n\\n').trim(), widgets };\n}\n"],"names":[],"mappings":"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"}
|
package/lib/hooks/useChatApi.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {useApolloClient}from'@apollo/client/index.js';import {SortEnum,RoomType,PostTypeEnum,isConnectorReply,stripConnectorConnect,AiAgentMessageRole}from'common';import {useGetChannelsByUserWithLastMessageQuery,useMessagesQuery,MessagesDocument,useAddChannelMutation,useSendMessagesMutation,OnChatMessageAddedDocument,GetChannelsByUserWithLastMessageDocument}from'common/graphql';import {useMemo,useCallback,useEffect}from'react';import {v4}from'uuid';import {isAttachedCaption,historyAttachmentTitle,attachmentsFromUserContent}from'../features/attachments/historyAttachmentLabel.js';import {stripAskUser}from'../features/chat/askUser.js';import {parseToolActivity}from'../features/chat/toolActivity.js';import {splitPreResponse}from'../features/chat/preResponse.js';var __defProp = Object.defineProperty;
|
|
1
|
+
import {useApolloClient}from'@apollo/client/index.js';import {SortEnum,RoomType,PostTypeEnum,surfaceReplyDisplayText,isConnectorReply,stripConnectorConnect,AiAgentMessageRole}from'common';import {useGetChannelsByUserWithLastMessageQuery,useMessagesQuery,MessagesDocument,useAddChannelMutation,useSendMessagesMutation,OnChatMessageAddedDocument,GetChannelsByUserWithLastMessageDocument}from'common/graphql';import {useMemo,useCallback,useEffect}from'react';import {v4}from'uuid';import {isAttachedCaption,historyAttachmentTitle,attachmentsFromUserContent}from'../features/attachments/historyAttachmentLabel.js';import {stripAskUser}from'../features/chat/askUser.js';import {parseToolActivity}from'../features/chat/toolActivity.js';import {splitPreResponse}from'../features/chat/preResponse.js';var __defProp = Object.defineProperty;
|
|
2
2
|
var __defProps = Object.defineProperties;
|
|
3
3
|
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
4
4
|
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
@@ -278,6 +278,8 @@ function cleanChannelTitle(rawTitle) {
|
|
|
278
278
|
const ACTIVE_CONNECTORS_PREFIX_RE = /^\s*\[Active connectors:[^\]]*\]\s*/i;
|
|
279
279
|
const SURFACE_CONTEXT_HEADER_RE = /^\s*\[[a-z][a-z ]{0,40} context:[^\]\n]*\]\s*/i;
|
|
280
280
|
function cleanMessageText(raw) {
|
|
281
|
+
const choice = surfaceReplyDisplayText(raw);
|
|
282
|
+
if (choice) return choice;
|
|
281
283
|
return raw.replace(SURFACE_CONTEXT_HEADER_RE, "").replace(ACTIVE_CONNECTORS_PREFIX_RE, "").replace(/\s+/g, " ").trim();
|
|
282
284
|
}
|
|
283
285
|
function isTransientHistoryText(text) {
|
|
@@ -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, isConnectorReply, PostTypeEnum, RoomType, SortEnum, stripConnectorConnect } from 'common';\nimport {\n GetChannelsByUserWithLastMessageDocument,\n MessagesDocument,\n OnChatMessageAddedDocument,\n useAddChannelMutation,\n useGetChannelsByUserWithLastMessageQuery,\n useMessagesQuery,\n useSendMessagesMutation,\n} from 'common/graphql';\nimport type {\n IAccountCreateChatSessionInput,\n IAccountSaveChatMessagesInput as IAccountSaveChatMessagesInputBase,\n IOnChatMessageAddedSubscription,\n IOnChatMessageAddedSubscriptionVariables,\n} from 'common/server';\nimport { useCallback, useEffect, useMemo } from 'react';\nimport { v4 as uuidv4 } from 'uuid';\nimport {\n attachmentsFromUserContent,\n historyAttachmentTitle,\n isAttachedCaption,\n} from '../features/attachments/historyAttachmentLabel';\nimport { stripAskUser } from '../features/chat/askUser';\nimport { parseToolActivity } from '../features/chat/toolActivity';\nimport { splitPreResponse } from '../features/chat/preResponse';\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\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\n/** Variables of a thread read (`useChatMessages`), so other readers share its cache entry. */\nexport function getThreadMessagesQueryVariables(sessionId: string) {\n // Do NOT pass `parentId: null` or a createdAt sort here. `{ parentId: null }` hides\n // threaded assistant replies (they are stored with parentId = the user post). Omitting\n // parentId returns every post in the channel; flattenPostsWithReplies orders them.\n return {\n channelId: sessionId,\n limit: MESSAGES_PAGE_LIMIT,\n skip: 0,\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. Titles that `lastMessage` does not carry are filled from\n * the `messages` query — same page size, same skip, user posts only.\n *\n * This query hits `messages` (not AccountChatSession). Reasons:\n * 1. `channelsByUser` is server-side gated by `orgName` / `members` and can\n * omit threads; `messages` filters Post by `editedBy: accountId`.\n * 2. The user-authored post is the row title when `lastMessage.parent` is missing\n * (typical gateway chats that never persist Channel.lastMessage).\n *\n * - `type: AIASSISTANT` scopes to AI chat (not direct/service rooms).\n * - `editedBy` + `props.role: user` returns prompts, not assistant replies,\n * so limit 10 covers up to 10 channels instead of 10 mixed posts.\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 props: { role: 'user' },\n };\n}\n\nexport function getHistoryChannelMessagesQueryVariables(\n channelId: string,\n options?: { skip?: number; limit?: number },\n) {\n return {\n channelId,\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 };\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 /** True while this channel still has an in-flight assistant turn (history shows it live). */\n isRunning?: boolean;\n /** Epoch ms of the persisted assistant reply when `lastMessage` is one (settles a running row). */\n lastReplyAt?: number;\n}\n\nfunction postChannelId(post: any): string {\n if (post?.channel?.id != null) return String(post.channel.id);\n if (typeof post?.channel === 'string') return post.channel;\n return '';\n}\n\nfunction postRole(post: any): string {\n const contents =\n coerceJsonObject(post?.propsConfiguration?.contents) ?? coerceJsonObject(post?.propsConfiguration?.content);\n return String(post?.props?.role ?? contents?.role ?? '').toUpperCase();\n}\n\n/**\n * Collapse AI-assistant posts (newest first) into one row per channel.\n * Latest user prompt → title; latest non-transient assistant body → preview.\n * Channels with no recoverable user prompt are omitted (never faked as \"New chat\").\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 byChannel = new Map<\n string,\n {\n title: string;\n preview: string;\n updatedAt: Date;\n createdAt: Date;\n isAttachment: boolean;\n }\n >();\n\n for (const post of rows as any[]) {\n const channelId = postChannelId(post);\n if (!channelId) continue;\n\n const raw = cleanMessageText(String(post?.message ?? ''));\n const role = postRole(post);\n const updatedAt = post?.updatedAt ? new Date(post.updatedAt) : new Date();\n const createdAt = post?.createdAt ? new Date(post.createdAt) : updatedAt;\n if (!byChannel.has(channelId)) {\n byChannel.set(channelId, {\n title: '',\n preview: '',\n updatedAt,\n createdAt,\n isAttachment: false,\n });\n }\n const row = byChannel.get(channelId)!;\n if (updatedAt.getTime() > row.updatedAt.getTime()) row.updatedAt = updatedAt;\n\n const isUser =\n role === 'USER' || (!role && raw && !looksLikeAssistantReply(raw, role) && !isTransientHistoryText(raw));\n if (isUser && !row.title && !isTransientHistoryText(raw)) {\n const isAttachment = isAttachedCaption(raw);\n row.title = isAttachment ? historyAttachmentTitle(raw) : raw;\n row.isAttachment = isAttachment;\n continue;\n }\n if (\n !row.preview &&\n raw &&\n (role === 'ASSISTANT' ||\n role === 'AI' ||\n role === 'BOT' ||\n role === 'AGENT' ||\n looksLikeAssistantReply(raw, role))\n ) {\n const preview = cleanHistoryPreview(raw);\n if (preview && !isTransientHistoryText(preview) && preview !== row.title) {\n row.preview = preview;\n }\n }\n }\n\n const sessions: ChatHistorySession[] = [];\n for (const [channelId, row] of byChannel) {\n if (!row.title) continue;\n sessions.push({\n channelId,\n title: row.title,\n preview: row.preview,\n mode: 'chat',\n updatedAt: row.updatedAt,\n createdAt: row.createdAt,\n isPlaceholder: false,\n isAttachment: row.isAttachment,\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 ? getChatHistoryMessagesQueryVariables(accountUserId) : undefined,\n skip,\n fetchPolicy: 'cache-and-network',\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 const totalCount = data?.messages?.totalCount ?? 0;\n\n return { sessions, loading, error, refetch, sourcePostCount, totalCount };\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?: unknown;\n content?: unknown;\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 coerceJsonObject(value: unknown): Record<string, any> | null {\n if (!value) return null;\n if (typeof value === 'string') {\n const trimmed = value.trim();\n if (!trimmed) return null;\n try {\n const parsed = JSON.parse(trimmed);\n return parsed && typeof parsed === 'object' ? (parsed as Record<string, any>) : null;\n } catch {\n return null;\n }\n }\n if (typeof value === 'object') return value as Record<string, any>;\n return null;\n}\n\nfunction lastMessageContents(lastMessage: ChannelLastMessageLike | null | undefined): Record<string, any> | null {\n const cfg = lastMessage?.propsConfiguration;\n return coerceJsonObject(cfg?.contents) ?? coerceJsonObject(cfg?.content);\n}\n\nfunction getLastMessageRole(lastMessage: ChannelLastMessageLike | null | undefined): string {\n const contents = lastMessageContents(lastMessage);\n return String(contents?.role ?? lastMessage?.props?.role ?? '').toUpperCase();\n}\n\nfunction getParentUserPrompt(lastMessage: ChannelLastMessageLike | null | undefined): string {\n const contents = lastMessageContents(lastMessage);\n const parent = contents?.parent;\n if (!parent || typeof parent === 'string') return '';\n return String(parent?.message ?? '').trim();\n}\n\nfunction isBuildLastMessage(lastMessage: ChannelLastMessageLike | null | undefined): boolean {\n if (!lastMessage) return false;\n const contents = lastMessageContents(lastMessage);\n const mode = String(contents?.mode ?? lastMessage?.props?.mode ?? '').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\n/**\n * The agent-only header a native surface puts in front of a turn\n * (`[expenses context: surface=expenses; ...]`, and the same for movies, study,\n * inbox and local services). Each surface strips its own in its transcript; the\n * history list reads every surface's chats, so it strips the shape.\n */\nconst SURFACE_CONTEXT_HEADER_RE = /^\\s*\\[[a-z][a-z ]{0,40} context:[^\\]\\n]*\\]\\s*/i;\n\nfunction cleanMessageText(raw: string): string {\n return raw\n .replace(SURFACE_CONTEXT_HEADER_RE, '')\n .replace(ACTIVE_CONNECTORS_PREFIX_RE, '')\n .replace(/\\s+/g, ' ')\n .trim();\n}\n\n/** Status / tool stubs that must not become a history title or subtitle. */\nfunction isTransientHistoryText(text: string): boolean {\n // A connect card's `[CONNECTOR_CONNECTED:…]` reply is protocol: never a title.\n if (isConnectorReply(text)) return true;\n // Strip tool/ASK_USER lines first — otherwise a tool-using reply is rejected\n // because the raw string starts with ⚙ and the gray subtitle never appears.\n const t = cleanHistoryPreview(text) || 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 // Unlabeled long bodies are usually the assistant lastMessage — not a prompt.\n if (!role && t.length > 180) return true;\n return false;\n}\n\n/** A one-line subtitle is plain text: `**bold**`, `` `code` `` and a leading `#` lose their marks. */\nfunction stripInlineMarkdown(text: string): string {\n return text\n .replace(/^#{1,6}\\s+/, '')\n .replace(/(\\*\\*|__)(.+?)\\1/g, '$2')\n .replace(/`([^`]+)`/g, '$1');\n}\n\nfunction cleanHistoryPreview(raw: string): string {\n if (isConnectorReply(raw)) return '';\n // The agent's answer is the preview. The fast lane's quick answer framed in\n // front (`[PRE_RESPONSE]…`) stands in only for a reply that has nothing else.\n const { preResponse, text: answer } = splitPreResponse(raw);\n // The connect card stands in for its marker; the prose around it is the preview.\n const withoutAsk = stripConnectorConnect(stripAskUser(answer));\n const { text: withoutTools } = parseToolActivity(withoutAsk, false);\n let t = cleanMessageText(withoutTools);\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*/gu, '').trim();\n return stripInlineMarkdown(t || cleanMessageText(preResponse ?? ''));\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 // A mode slug is never a title: \"build-channel-<uuid>\" showed as one on every\n // Build chat (and every template remix's orphan channel).\n if (\n rawDefault &&\n !/^(chat[\\s-]channel|deep[\\s-]search|build[\\s-]channel)[\\s-][0-9a-f][0-9a-f\\s-]{7,}\\.?$/i.test(rawDefault)\n ) {\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 const lastReplyAtRaw =\n lastBody && looksLikeAssistantReply(lastBody, lastMessageRole)\n ? new Date(lastMessage?.createdAt ?? lastMessage?.updatedAt ?? '').getTime()\n : NaN;\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 ...(Number.isFinite(lastReplyAtRaw) && lastReplyAtRaw > 0 ? { lastReplyAt: lastReplyAtRaw } : {}),\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\". */\ntype RememberedHistoryRow = {\n title?: string;\n preview?: string;\n isAttachment?: boolean;\n running?: boolean;\n /** Device time the run was marked; a persisted reply newer than this means it finished. */\n runningSince?: number;\n};\nconst rememberedHistoryTitles = new Map<string, RememberedHistoryRow>();\nconst rememberedHistoryListeners = new Set<() => void>();\n\nexport function resetRememberedHistoryTitles(): void {\n rememberedHistoryTitles.clear();\n rememberedHistoryListeners.forEach((fn) => fn());\n}\n\nexport function subscribeRememberedHistory(listener: () => void): () => void {\n rememberedHistoryListeners.add(listener);\n return () => {\n rememberedHistoryListeners.delete(listener);\n };\n}\n\nfunction mergeRememberedHistory(channelId: string, patch: RememberedHistoryRow, notify = true): RememberedHistoryRow {\n const existing = rememberedHistoryTitles.get(channelId) ?? {};\n const running = patch.running !== undefined ? patch.running : existing.running;\n const next: RememberedHistoryRow = {\n title: patch.title || existing.title,\n preview: patch.preview || existing.preview,\n isAttachment: patch.isAttachment ?? existing.isAttachment,\n running,\n runningSince: running ? (existing.running && existing.runningSince) || Date.now() : undefined,\n };\n rememberedHistoryTitles.set(channelId, next);\n if (\n notify &&\n (next.title !== existing.title || next.preview !== existing.preview || next.running !== existing.running)\n ) {\n queueMicrotask(() => {\n rememberedHistoryListeners.forEach((fn) => fn());\n });\n }\n return next;\n}\n\nfunction rememberHistoryTitle(session: ChatHistorySession): void {\n let existing = rememberedHistoryTitles.get(session.channelId);\n // A persisted assistant reply newer than the run mark: the turn finished while\n // nothing was subscribed (Chat is popped on the way to history). Settle from\n // the data instead of waiting for the thread to be reopened.\n if (\n existing?.running &&\n existing.runningSince &&\n session.lastReplyAt &&\n session.lastReplyAt > existing.runningSince\n ) {\n existing = mergeRememberedHistory(session.channelId, { running: false }, false);\n }\n const title = session.isPlaceholder || /^new chat$/i.test(session.title) ? '' : session.title?.trim();\n // A live stream preview must not be overwritten by a stale GraphQL subtitle.\n if (existing?.running) {\n if (title && !isTransientHistoryText(title)) {\n mergeRememberedHistory(session.channelId, { title }, false);\n }\n return;\n }\n const preview = session.preview?.trim() && !isTransientHistoryText(session.preview) ? session.preview.trim() : '';\n if (title && isTransientHistoryText(title) && !preview) return;\n if (!title && !preview) return;\n // Silent: called while ChatHistoryLanding is mapping rows. Notifying here\n // would setState during render. Stream/title patches notify instead.\n mergeRememberedHistory(\n session.channelId,\n {\n ...(title && !isTransientHistoryText(title) ? { title } : {}),\n ...(preview ? { preview } : {}),\n isAttachment: session.isAttachment,\n },\n false,\n );\n}\n\nfunction deriveHistoryTitleFromPrompt(rawPrompt: string): string {\n const cleaned = cleanMessageText(rawPrompt);\n if (!cleaned || isTransientHistoryText(cleaned) || /^new chat$/i.test(cleaned)) return '';\n if (cleaned.length <= 64) return cleaned;\n return `${cleaned.slice(0, 64).trim()}...`;\n}\n\n/**\n * Gateway chats never run `saveMessages`, so the cached Channel stays at\n * `lastMessage: null` and history shows italic \"New chat\" until pull-to-refresh.\n * Stamp the first user prompt onto Channel.title (scalar only) and remember it\n * so returning to the list matches a refresh without a network wait.\n */\nexport function patchChannelHistoryTitle(\n client: ReturnType<typeof useApolloClient>,\n channelId: string,\n rawPrompt: string,\n) {\n const cleaned = deriveHistoryTitleFromPrompt(rawPrompt);\n if (!channelId || !cleaned) return;\n mergeRememberedHistory(channelId, { title: cleaned, isAttachment: isAttachedCaption(cleaned) });\n const channelCacheId = client.cache.identify({ __typename: 'Channel', id: channelId });\n if (!channelCacheId) return;\n try {\n client.cache.modify({\n id: channelCacheId,\n fields: {\n title(existing: string | null | undefined) {\n return cleanChannelTitle(existing) ? existing : cleaned;\n },\n // Do not touch updatedAt here. Bumping it on open/hydrate moves the\n // row to TODAY / \"now\". Activity time is only written when the user\n // actually sends (touchChannelHistoryUpdatedAt).\n },\n });\n } catch (err) {\n console.warn('[useChatApi] patchChannelHistoryTitle failed:', err);\n }\n}\n\n/** Move a thread to the top of history — only after a real send, never on open. */\nexport function touchChannelHistoryUpdatedAt(client: ReturnType<typeof useApolloClient>, channelId: string) {\n if (!channelId) return;\n const channelCacheId = client.cache.identify({ __typename: 'Channel', id: channelId });\n if (!channelCacheId) return;\n try {\n client.cache.modify({\n id: channelCacheId,\n fields: {\n updatedAt() {\n return new Date().toISOString();\n },\n },\n });\n } catch (err) {\n console.warn('[useChatApi] touchChannelHistoryUpdatedAt failed:', err);\n }\n}\n\n/** Gray subtitle under the history title: last assistant reply, not the user prompt. */\nexport function patchChannelHistoryPreview(channelId: string, rawPreview: string) {\n if (!channelId) return;\n const preview = cleanHistoryPreview(rawPreview);\n if (!preview || isTransientHistoryText(preview) || isAttachedCaption(preview)) return;\n const title = rememberedHistoryTitles.get(channelId)?.title ?? '';\n if (title && preview === title) return;\n mergeRememberedHistory(channelId, { preview });\n}\n\n/** History list: this channel is still streaming (web-style live row). */\nexport function markChannelHistoryRunning(channelId: string, rawPreview?: string) {\n if (!channelId) return;\n const preview = rawPreview ? cleanHistoryPreview(rawPreview) : '';\n const usable = preview && !isTransientHistoryText(preview) && !isAttachedCaption(preview) ? preview : undefined;\n mergeRememberedHistory(channelId, {\n running: true,\n ...(usable ? { preview: usable } : {}),\n });\n}\n\nexport function clearChannelHistoryRunning(channelId: string) {\n if (!channelId) return;\n const existing = rememberedHistoryTitles.get(channelId);\n if (!existing?.running) return;\n mergeRememberedHistory(channelId, { running: false });\n}\n\nfunction applyRememberedHistoryTitles(rows: ChatHistorySession[]): ChatHistorySession[] {\n return rows.map((row) => {\n rememberHistoryTitle(row);\n const mem = rememberedHistoryTitles.get(row.channelId);\n if (!mem) return row;\n const titleMissing = row.isPlaceholder || /^new chat$/i.test(row.title);\n const previewMissing = !row.preview?.trim();\n const nextTitle = titleMissing && mem.title ? mem.title : row.title;\n const livePreview =\n mem.running && mem.preview && mem.preview !== nextTitle\n ? mem.preview\n : previewMissing && mem.preview && mem.preview !== nextTitle\n ? mem.preview\n : row.preview;\n if (!titleMissing && !previewMissing && !mem.running) return row;\n return {\n ...row,\n title: nextTitle,\n preview: livePreview,\n isPlaceholder: titleMissing && mem.title ? false : row.isPlaceholder,\n isAttachment: mem.isAttachment || row.isAttachment,\n isRunning: Boolean(mem.running),\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\nexport function seedRememberedHistoryFromSessions(sessions: ChatHistorySession[] | null | undefined): void {\n if (!sessions?.length) return;\n for (const session of sessions) rememberHistoryTitle(session);\n}\n\n/**\n * Fill titles/previews for channels whose `lastMessage` never persisted (gateway).\n * Also reports the channels that hold no message at all: chats created and never\n * used, which history leaves out. A request that fails says nothing either way.\n */\nexport async function fetchHistorySessionsForChannels(\n client: ReturnType<typeof useApolloClient>,\n channelIds: string[],\n): Promise<{ sessions: ChatHistorySession[]; emptyChannelIds: string[] }> {\n const unique = [...new Set(channelIds.map((id) => String(id || '').trim()).filter(Boolean))];\n if (!unique.length) return { sessions: [], emptyChannelIds: [] };\n const pages = await Promise.all(\n unique.map(async (channelId) => {\n try {\n const result = await client.query({\n query: MessagesDocument,\n variables: getHistoryChannelMessagesQueryVariables(channelId),\n fetchPolicy: 'network-only',\n context: { cacheKey: 'chat-history-channel-messages' },\n });\n const posts = (result.data?.messages?.data ?? []).map((post: any) => ({\n ...post,\n channel: post?.channel?.id ? post.channel : { id: channelId },\n }));\n return {\n channelId,\n empty: posts.length === 0,\n sessions: chatHistorySessionsFromMessages({ messages: { data: posts } }),\n };\n } catch {\n return { channelId, empty: false, sessions: [] as ChatHistorySession[] };\n }\n }),\n );\n return {\n sessions: pages.flatMap((page) => page.sessions),\n emptyChannelIds: pages.filter((page) => page.empty).map((page) => page.channelId),\n };\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 fetchPolicy: 'cache-and-network',\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 client = useApolloClient();\n const { data, loading, error, refetch, subscribeToMore } = useMessagesQuery({\n variables: sessionId ? getThreadMessagesQueryVariables(sessionId) : undefined,\n skip: !sessionId || options?.skip,\n // Same as browser: paint cache immediately, then hit the network so a thread\n // opened from history is not stuck on a cache-first snapshot that only has\n // the latest user post (assistant replies persist after the first query).\n fetchPolicy: 'cache-and-network',\n nextFetchPolicy: 'cache-first',\n errorPolicy: 'all',\n notifyOnNetworkStatusChange: true,\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 // cache-and-network already hits the network on first open of a channel id.\n // A second refetch() here doubled GetMessages on every history tap.\n\n useEffect(() => {\n if (!sessionId || options?.skip) return;\n const unsubscribe = subscribeToMore<IOnChatMessageAddedSubscription, IOnChatMessageAddedSubscriptionVariables>({\n document: OnChatMessageAddedDocument,\n variables: { channelId: sessionId },\n updateQuery: (prev, { subscriptionData }) => {\n const post = subscriptionData?.data?.chatMessageAdded as MinimalPost | undefined;\n if (!post?.id) return prev;\n if (!prev?.messages) return prev;\n\n const existing = (prev.messages.data ?? []) as MinimalPost[];\n const idx = existing.findIndex((row) => row?.id === post.id);\n let nextData: MinimalPost[];\n let nextTotal: number;\n if (idx >= 0) {\n nextData = [...existing.slice(0, idx), post, ...existing.slice(idx + 1)];\n nextTotal = prev.messages.totalCount ?? existing.length;\n } else {\n nextData = [...existing, post];\n nextTotal = (prev.messages.totalCount ?? existing.length) + 1;\n const parentId = post.parentId ?? null;\n if (parentId) {\n nextData = nextData.map((root) => {\n if (root?.id !== parentId) return root;\n const replies = root.replies?.data ?? [];\n if (replies.some((reply) => reply?.id === post.id)) return root;\n return {\n ...root,\n replies: {\n ...(root.replies ?? {}),\n __typename: root.replies?.__typename ?? 'Messages',\n data: [...replies, post],\n totalCount: (root.replies?.totalCount ?? replies.length) + 1,\n },\n };\n });\n }\n }\n\n const seen = new Set<string>();\n nextData = nextData.filter((row) => {\n if (!row?.id || seen.has(row.id)) return false;\n seen.add(row.id);\n return true;\n });\n\n return {\n ...prev,\n messages: {\n ...prev.messages,\n data: nextData,\n totalCount: nextTotal,\n },\n };\n },\n onError: (err) => {\n console.error('[useChatMessages] subscribeToMore error:', err);\n },\n });\n return () => unsubscribe();\n }, [sessionId, options?.skip, subscribeToMore, client]);\n\n /**\n * `messagesLoaded` means \"we have data we can show\". cache-and-network 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 const ownRows = rows.filter((post) => {\n const postChannelId = post?.channel?.id;\n return !postChannelId || postChannelId === sessionId;\n });\n return flattenPostsWithReplies(ownRows, sessionId);\n }, [data, sessionId]);\n\n /** The channel's posts as the server sent them (props, propsConfiguration), for readers of build fragments. */\n const posts = useMemo(() => (sessionId ? ((data?.messages?.data ?? []) as MinimalPost[]) : []), [data, sessionId]);\n\n return { messages, posts, 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\n/**\n * What `createChannel` takes: the session fields plus where the chat lives and\n * its starting settings. Callers cast to `any` / `never` before this existed.\n */\nexport type CreateChatChannelInput = IAccountCreateChatSessionInput & {\n orgName?: string | null;\n projectId?: string | null;\n isShared?: boolean;\n sharedSlug?: string | null;\n isArchived?: boolean;\n isPinned?: boolean;\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?: CreateChatChannelInput): Promise<ChatSessionUI> => {\n const { orgName: orgNameArg, projectId: projectIdArg, ...inputForSettings } = input ?? {};\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 const patchChannelTitle = useCallback(\n (channelId: string, rawPrompt: string, bumpActivity = false) => {\n patchChannelHistoryTitle(client, channelId, rawPrompt);\n if (bumpActivity) touchChannelHistoryUpdatedAt(client, channelId);\n },\n [client],\n );\n\n return {\n createChannel,\n createSession: createChannel,\n saveMessages,\n patchChannelTitle,\n loading: { create: createChannelLoading, saveMessages: sendMessagesLoading },\n };\n}\n"],"names":["_a","_b","_c","_d","_e","uuidv4","postChannelId"],"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 {\n AiAgentMessageRole,\n isConnectorReply,\n PostTypeEnum,\n RoomType,\n SortEnum,\n stripConnectorConnect,\n surfaceReplyDisplayText,\n} from 'common';\nimport {\n GetChannelsByUserWithLastMessageDocument,\n MessagesDocument,\n OnChatMessageAddedDocument,\n useAddChannelMutation,\n useGetChannelsByUserWithLastMessageQuery,\n useMessagesQuery,\n useSendMessagesMutation,\n} from 'common/graphql';\nimport type {\n IAccountCreateChatSessionInput,\n IAccountSaveChatMessagesInput as IAccountSaveChatMessagesInputBase,\n IOnChatMessageAddedSubscription,\n IOnChatMessageAddedSubscriptionVariables,\n} from 'common/server';\nimport { useCallback, useEffect, useMemo } from 'react';\nimport { v4 as uuidv4 } from 'uuid';\nimport {\n attachmentsFromUserContent,\n historyAttachmentTitle,\n isAttachedCaption,\n} from '../features/attachments/historyAttachmentLabel';\nimport { stripAskUser } from '../features/chat/askUser';\nimport { parseToolActivity } from '../features/chat/toolActivity';\nimport { splitPreResponse } from '../features/chat/preResponse';\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\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\n/** Variables of a thread read (`useChatMessages`), so other readers share its cache entry. */\nexport function getThreadMessagesQueryVariables(sessionId: string) {\n // Do NOT pass `parentId: null` or a createdAt sort here. `{ parentId: null }` hides\n // threaded assistant replies (they are stored with parentId = the user post). Omitting\n // parentId returns every post in the channel; flattenPostsWithReplies orders them.\n return {\n channelId: sessionId,\n limit: MESSAGES_PAGE_LIMIT,\n skip: 0,\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. Titles that `lastMessage` does not carry are filled from\n * the `messages` query — same page size, same skip, user posts only.\n *\n * This query hits `messages` (not AccountChatSession). Reasons:\n * 1. `channelsByUser` is server-side gated by `orgName` / `members` and can\n * omit threads; `messages` filters Post by `editedBy: accountId`.\n * 2. The user-authored post is the row title when `lastMessage.parent` is missing\n * (typical gateway chats that never persist Channel.lastMessage).\n *\n * - `type: AIASSISTANT` scopes to AI chat (not direct/service rooms).\n * - `editedBy` + `props.role: user` returns prompts, not assistant replies,\n * so limit 10 covers up to 10 channels instead of 10 mixed posts.\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 props: { role: 'user' },\n };\n}\n\nexport function getHistoryChannelMessagesQueryVariables(\n channelId: string,\n options?: { skip?: number; limit?: number },\n) {\n return {\n channelId,\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 };\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 /** True while this channel still has an in-flight assistant turn (history shows it live). */\n isRunning?: boolean;\n /** Epoch ms of the persisted assistant reply when `lastMessage` is one (settles a running row). */\n lastReplyAt?: number;\n}\n\nfunction postChannelId(post: any): string {\n if (post?.channel?.id != null) return String(post.channel.id);\n if (typeof post?.channel === 'string') return post.channel;\n return '';\n}\n\nfunction postRole(post: any): string {\n const contents =\n coerceJsonObject(post?.propsConfiguration?.contents) ?? coerceJsonObject(post?.propsConfiguration?.content);\n return String(post?.props?.role ?? contents?.role ?? '').toUpperCase();\n}\n\n/**\n * Collapse AI-assistant posts (newest first) into one row per channel.\n * Latest user prompt → title; latest non-transient assistant body → preview.\n * Channels with no recoverable user prompt are omitted (never faked as \"New chat\").\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 byChannel = new Map<\n string,\n {\n title: string;\n preview: string;\n updatedAt: Date;\n createdAt: Date;\n isAttachment: boolean;\n }\n >();\n\n for (const post of rows as any[]) {\n const channelId = postChannelId(post);\n if (!channelId) continue;\n\n const raw = cleanMessageText(String(post?.message ?? ''));\n const role = postRole(post);\n const updatedAt = post?.updatedAt ? new Date(post.updatedAt) : new Date();\n const createdAt = post?.createdAt ? new Date(post.createdAt) : updatedAt;\n if (!byChannel.has(channelId)) {\n byChannel.set(channelId, {\n title: '',\n preview: '',\n updatedAt,\n createdAt,\n isAttachment: false,\n });\n }\n const row = byChannel.get(channelId)!;\n if (updatedAt.getTime() > row.updatedAt.getTime()) row.updatedAt = updatedAt;\n\n const isUser =\n role === 'USER' || (!role && raw && !looksLikeAssistantReply(raw, role) && !isTransientHistoryText(raw));\n if (isUser && !row.title && !isTransientHistoryText(raw)) {\n const isAttachment = isAttachedCaption(raw);\n row.title = isAttachment ? historyAttachmentTitle(raw) : raw;\n row.isAttachment = isAttachment;\n continue;\n }\n if (\n !row.preview &&\n raw &&\n (role === 'ASSISTANT' ||\n role === 'AI' ||\n role === 'BOT' ||\n role === 'AGENT' ||\n looksLikeAssistantReply(raw, role))\n ) {\n const preview = cleanHistoryPreview(raw);\n if (preview && !isTransientHistoryText(preview) && preview !== row.title) {\n row.preview = preview;\n }\n }\n }\n\n const sessions: ChatHistorySession[] = [];\n for (const [channelId, row] of byChannel) {\n if (!row.title) continue;\n sessions.push({\n channelId,\n title: row.title,\n preview: row.preview,\n mode: 'chat',\n updatedAt: row.updatedAt,\n createdAt: row.createdAt,\n isPlaceholder: false,\n isAttachment: row.isAttachment,\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 ? getChatHistoryMessagesQueryVariables(accountUserId) : undefined,\n skip,\n fetchPolicy: 'cache-and-network',\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 const totalCount = data?.messages?.totalCount ?? 0;\n\n return { sessions, loading, error, refetch, sourcePostCount, totalCount };\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?: unknown;\n content?: unknown;\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 coerceJsonObject(value: unknown): Record<string, any> | null {\n if (!value) return null;\n if (typeof value === 'string') {\n const trimmed = value.trim();\n if (!trimmed) return null;\n try {\n const parsed = JSON.parse(trimmed);\n return parsed && typeof parsed === 'object' ? (parsed as Record<string, any>) : null;\n } catch {\n return null;\n }\n }\n if (typeof value === 'object') return value as Record<string, any>;\n return null;\n}\n\nfunction lastMessageContents(lastMessage: ChannelLastMessageLike | null | undefined): Record<string, any> | null {\n const cfg = lastMessage?.propsConfiguration;\n return coerceJsonObject(cfg?.contents) ?? coerceJsonObject(cfg?.content);\n}\n\nfunction getLastMessageRole(lastMessage: ChannelLastMessageLike | null | undefined): string {\n const contents = lastMessageContents(lastMessage);\n return String(contents?.role ?? lastMessage?.props?.role ?? '').toUpperCase();\n}\n\nfunction getParentUserPrompt(lastMessage: ChannelLastMessageLike | null | undefined): string {\n const contents = lastMessageContents(lastMessage);\n const parent = contents?.parent;\n if (!parent || typeof parent === 'string') return '';\n return String(parent?.message ?? '').trim();\n}\n\nfunction isBuildLastMessage(lastMessage: ChannelLastMessageLike | null | undefined): boolean {\n if (!lastMessage) return false;\n const contents = lastMessageContents(lastMessage);\n const mode = String(contents?.mode ?? lastMessage?.props?.mode ?? '').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\n/**\n * The agent-only header a native surface puts in front of a turn\n * (`[expenses context: surface=expenses; ...]`, and the same for movies, study,\n * inbox and local services). Each surface strips its own in its transcript; the\n * history list reads every surface's chats, so it strips the shape.\n */\nconst SURFACE_CONTEXT_HEADER_RE = /^\\s*\\[[a-z][a-z ]{0,40} context:[^\\]\\n]*\\]\\s*/i;\n\nfunction cleanMessageText(raw: string): string {\n // A template pick's control line reads as the person's words for it.\n const choice = surfaceReplyDisplayText(raw);\n if (choice) return choice;\n return raw\n .replace(SURFACE_CONTEXT_HEADER_RE, '')\n .replace(ACTIVE_CONNECTORS_PREFIX_RE, '')\n .replace(/\\s+/g, ' ')\n .trim();\n}\n\n/** Status / tool stubs that must not become a history title or subtitle. */\nfunction isTransientHistoryText(text: string): boolean {\n // A connect card's `[CONNECTOR_CONNECTED:…]` reply is protocol: never a title.\n if (isConnectorReply(text)) return true;\n // Strip tool/ASK_USER lines first — otherwise a tool-using reply is rejected\n // because the raw string starts with ⚙ and the gray subtitle never appears.\n const t = cleanHistoryPreview(text) || 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 // Unlabeled long bodies are usually the assistant lastMessage — not a prompt.\n if (!role && t.length > 180) return true;\n return false;\n}\n\n/** A one-line subtitle is plain text: `**bold**`, `` `code` `` and a leading `#` lose their marks. */\nfunction stripInlineMarkdown(text: string): string {\n return text\n .replace(/^#{1,6}\\s+/, '')\n .replace(/(\\*\\*|__)(.+?)\\1/g, '$2')\n .replace(/`([^`]+)`/g, '$1');\n}\n\nfunction cleanHistoryPreview(raw: string): string {\n if (isConnectorReply(raw)) return '';\n // The agent's answer is the preview. The fast lane's quick answer framed in\n // front (`[PRE_RESPONSE]…`) stands in only for a reply that has nothing else.\n const { preResponse, text: answer } = splitPreResponse(raw);\n // The connect card stands in for its marker; the prose around it is the preview.\n const withoutAsk = stripConnectorConnect(stripAskUser(answer));\n const { text: withoutTools } = parseToolActivity(withoutAsk, false);\n let t = cleanMessageText(withoutTools);\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*/gu, '').trim();\n return stripInlineMarkdown(t || cleanMessageText(preResponse ?? ''));\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 // A mode slug is never a title: \"build-channel-<uuid>\" showed as one on every\n // Build chat (and every template remix's orphan channel).\n if (\n rawDefault &&\n !/^(chat[\\s-]channel|deep[\\s-]search|build[\\s-]channel)[\\s-][0-9a-f][0-9a-f\\s-]{7,}\\.?$/i.test(rawDefault)\n ) {\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 const lastReplyAtRaw =\n lastBody && looksLikeAssistantReply(lastBody, lastMessageRole)\n ? new Date(lastMessage?.createdAt ?? lastMessage?.updatedAt ?? '').getTime()\n : NaN;\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 ...(Number.isFinite(lastReplyAtRaw) && lastReplyAtRaw > 0 ? { lastReplyAt: lastReplyAtRaw } : {}),\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\". */\ntype RememberedHistoryRow = {\n title?: string;\n preview?: string;\n isAttachment?: boolean;\n running?: boolean;\n /** Device time the run was marked; a persisted reply newer than this means it finished. */\n runningSince?: number;\n};\nconst rememberedHistoryTitles = new Map<string, RememberedHistoryRow>();\nconst rememberedHistoryListeners = new Set<() => void>();\n\nexport function resetRememberedHistoryTitles(): void {\n rememberedHistoryTitles.clear();\n rememberedHistoryListeners.forEach((fn) => fn());\n}\n\nexport function subscribeRememberedHistory(listener: () => void): () => void {\n rememberedHistoryListeners.add(listener);\n return () => {\n rememberedHistoryListeners.delete(listener);\n };\n}\n\nfunction mergeRememberedHistory(channelId: string, patch: RememberedHistoryRow, notify = true): RememberedHistoryRow {\n const existing = rememberedHistoryTitles.get(channelId) ?? {};\n const running = patch.running !== undefined ? patch.running : existing.running;\n const next: RememberedHistoryRow = {\n title: patch.title || existing.title,\n preview: patch.preview || existing.preview,\n isAttachment: patch.isAttachment ?? existing.isAttachment,\n running,\n runningSince: running ? (existing.running && existing.runningSince) || Date.now() : undefined,\n };\n rememberedHistoryTitles.set(channelId, next);\n if (\n notify &&\n (next.title !== existing.title || next.preview !== existing.preview || next.running !== existing.running)\n ) {\n queueMicrotask(() => {\n rememberedHistoryListeners.forEach((fn) => fn());\n });\n }\n return next;\n}\n\nfunction rememberHistoryTitle(session: ChatHistorySession): void {\n let existing = rememberedHistoryTitles.get(session.channelId);\n // A persisted assistant reply newer than the run mark: the turn finished while\n // nothing was subscribed (Chat is popped on the way to history). Settle from\n // the data instead of waiting for the thread to be reopened.\n if (\n existing?.running &&\n existing.runningSince &&\n session.lastReplyAt &&\n session.lastReplyAt > existing.runningSince\n ) {\n existing = mergeRememberedHistory(session.channelId, { running: false }, false);\n }\n const title = session.isPlaceholder || /^new chat$/i.test(session.title) ? '' : session.title?.trim();\n // A live stream preview must not be overwritten by a stale GraphQL subtitle.\n if (existing?.running) {\n if (title && !isTransientHistoryText(title)) {\n mergeRememberedHistory(session.channelId, { title }, false);\n }\n return;\n }\n const preview = session.preview?.trim() && !isTransientHistoryText(session.preview) ? session.preview.trim() : '';\n if (title && isTransientHistoryText(title) && !preview) return;\n if (!title && !preview) return;\n // Silent: called while ChatHistoryLanding is mapping rows. Notifying here\n // would setState during render. Stream/title patches notify instead.\n mergeRememberedHistory(\n session.channelId,\n {\n ...(title && !isTransientHistoryText(title) ? { title } : {}),\n ...(preview ? { preview } : {}),\n isAttachment: session.isAttachment,\n },\n false,\n );\n}\n\nfunction deriveHistoryTitleFromPrompt(rawPrompt: string): string {\n const cleaned = cleanMessageText(rawPrompt);\n if (!cleaned || isTransientHistoryText(cleaned) || /^new chat$/i.test(cleaned)) return '';\n if (cleaned.length <= 64) return cleaned;\n return `${cleaned.slice(0, 64).trim()}...`;\n}\n\n/**\n * Gateway chats never run `saveMessages`, so the cached Channel stays at\n * `lastMessage: null` and history shows italic \"New chat\" until pull-to-refresh.\n * Stamp the first user prompt onto Channel.title (scalar only) and remember it\n * so returning to the list matches a refresh without a network wait.\n */\nexport function patchChannelHistoryTitle(\n client: ReturnType<typeof useApolloClient>,\n channelId: string,\n rawPrompt: string,\n) {\n const cleaned = deriveHistoryTitleFromPrompt(rawPrompt);\n if (!channelId || !cleaned) return;\n mergeRememberedHistory(channelId, { title: cleaned, isAttachment: isAttachedCaption(cleaned) });\n const channelCacheId = client.cache.identify({ __typename: 'Channel', id: channelId });\n if (!channelCacheId) return;\n try {\n client.cache.modify({\n id: channelCacheId,\n fields: {\n title(existing: string | null | undefined) {\n return cleanChannelTitle(existing) ? existing : cleaned;\n },\n // Do not touch updatedAt here. Bumping it on open/hydrate moves the\n // row to TODAY / \"now\". Activity time is only written when the user\n // actually sends (touchChannelHistoryUpdatedAt).\n },\n });\n } catch (err) {\n console.warn('[useChatApi] patchChannelHistoryTitle failed:', err);\n }\n}\n\n/** Move a thread to the top of history — only after a real send, never on open. */\nexport function touchChannelHistoryUpdatedAt(client: ReturnType<typeof useApolloClient>, channelId: string) {\n if (!channelId) return;\n const channelCacheId = client.cache.identify({ __typename: 'Channel', id: channelId });\n if (!channelCacheId) return;\n try {\n client.cache.modify({\n id: channelCacheId,\n fields: {\n updatedAt() {\n return new Date().toISOString();\n },\n },\n });\n } catch (err) {\n console.warn('[useChatApi] touchChannelHistoryUpdatedAt failed:', err);\n }\n}\n\n/** Gray subtitle under the history title: last assistant reply, not the user prompt. */\nexport function patchChannelHistoryPreview(channelId: string, rawPreview: string) {\n if (!channelId) return;\n const preview = cleanHistoryPreview(rawPreview);\n if (!preview || isTransientHistoryText(preview) || isAttachedCaption(preview)) return;\n const title = rememberedHistoryTitles.get(channelId)?.title ?? '';\n if (title && preview === title) return;\n mergeRememberedHistory(channelId, { preview });\n}\n\n/** History list: this channel is still streaming (web-style live row). */\nexport function markChannelHistoryRunning(channelId: string, rawPreview?: string) {\n if (!channelId) return;\n const preview = rawPreview ? cleanHistoryPreview(rawPreview) : '';\n const usable = preview && !isTransientHistoryText(preview) && !isAttachedCaption(preview) ? preview : undefined;\n mergeRememberedHistory(channelId, {\n running: true,\n ...(usable ? { preview: usable } : {}),\n });\n}\n\nexport function clearChannelHistoryRunning(channelId: string) {\n if (!channelId) return;\n const existing = rememberedHistoryTitles.get(channelId);\n if (!existing?.running) return;\n mergeRememberedHistory(channelId, { running: false });\n}\n\nfunction applyRememberedHistoryTitles(rows: ChatHistorySession[]): ChatHistorySession[] {\n return rows.map((row) => {\n rememberHistoryTitle(row);\n const mem = rememberedHistoryTitles.get(row.channelId);\n if (!mem) return row;\n const titleMissing = row.isPlaceholder || /^new chat$/i.test(row.title);\n const previewMissing = !row.preview?.trim();\n const nextTitle = titleMissing && mem.title ? mem.title : row.title;\n const livePreview =\n mem.running && mem.preview && mem.preview !== nextTitle\n ? mem.preview\n : previewMissing && mem.preview && mem.preview !== nextTitle\n ? mem.preview\n : row.preview;\n if (!titleMissing && !previewMissing && !mem.running) return row;\n return {\n ...row,\n title: nextTitle,\n preview: livePreview,\n isPlaceholder: titleMissing && mem.title ? false : row.isPlaceholder,\n isAttachment: mem.isAttachment || row.isAttachment,\n isRunning: Boolean(mem.running),\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\nexport function seedRememberedHistoryFromSessions(sessions: ChatHistorySession[] | null | undefined): void {\n if (!sessions?.length) return;\n for (const session of sessions) rememberHistoryTitle(session);\n}\n\n/**\n * Fill titles/previews for channels whose `lastMessage` never persisted (gateway).\n * Also reports the channels that hold no message at all: chats created and never\n * used, which history leaves out. A request that fails says nothing either way.\n */\nexport async function fetchHistorySessionsForChannels(\n client: ReturnType<typeof useApolloClient>,\n channelIds: string[],\n): Promise<{ sessions: ChatHistorySession[]; emptyChannelIds: string[] }> {\n const unique = [...new Set(channelIds.map((id) => String(id || '').trim()).filter(Boolean))];\n if (!unique.length) return { sessions: [], emptyChannelIds: [] };\n const pages = await Promise.all(\n unique.map(async (channelId) => {\n try {\n const result = await client.query({\n query: MessagesDocument,\n variables: getHistoryChannelMessagesQueryVariables(channelId),\n fetchPolicy: 'network-only',\n context: { cacheKey: 'chat-history-channel-messages' },\n });\n const posts = (result.data?.messages?.data ?? []).map((post: any) => ({\n ...post,\n channel: post?.channel?.id ? post.channel : { id: channelId },\n }));\n return {\n channelId,\n empty: posts.length === 0,\n sessions: chatHistorySessionsFromMessages({ messages: { data: posts } }),\n };\n } catch {\n return { channelId, empty: false, sessions: [] as ChatHistorySession[] };\n }\n }),\n );\n return {\n sessions: pages.flatMap((page) => page.sessions),\n emptyChannelIds: pages.filter((page) => page.empty).map((page) => page.channelId),\n };\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 fetchPolicy: 'cache-and-network',\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 client = useApolloClient();\n const { data, loading, error, refetch, subscribeToMore } = useMessagesQuery({\n variables: sessionId ? getThreadMessagesQueryVariables(sessionId) : undefined,\n skip: !sessionId || options?.skip,\n // Same as browser: paint cache immediately, then hit the network so a thread\n // opened from history is not stuck on a cache-first snapshot that only has\n // the latest user post (assistant replies persist after the first query).\n fetchPolicy: 'cache-and-network',\n nextFetchPolicy: 'cache-first',\n errorPolicy: 'all',\n notifyOnNetworkStatusChange: true,\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 // cache-and-network already hits the network on first open of a channel id.\n // A second refetch() here doubled GetMessages on every history tap.\n\n useEffect(() => {\n if (!sessionId || options?.skip) return;\n const unsubscribe = subscribeToMore<IOnChatMessageAddedSubscription, IOnChatMessageAddedSubscriptionVariables>({\n document: OnChatMessageAddedDocument,\n variables: { channelId: sessionId },\n updateQuery: (prev, { subscriptionData }) => {\n const post = subscriptionData?.data?.chatMessageAdded as MinimalPost | undefined;\n if (!post?.id) return prev;\n if (!prev?.messages) return prev;\n\n const existing = (prev.messages.data ?? []) as MinimalPost[];\n const idx = existing.findIndex((row) => row?.id === post.id);\n let nextData: MinimalPost[];\n let nextTotal: number;\n if (idx >= 0) {\n nextData = [...existing.slice(0, idx), post, ...existing.slice(idx + 1)];\n nextTotal = prev.messages.totalCount ?? existing.length;\n } else {\n nextData = [...existing, post];\n nextTotal = (prev.messages.totalCount ?? existing.length) + 1;\n const parentId = post.parentId ?? null;\n if (parentId) {\n nextData = nextData.map((root) => {\n if (root?.id !== parentId) return root;\n const replies = root.replies?.data ?? [];\n if (replies.some((reply) => reply?.id === post.id)) return root;\n return {\n ...root,\n replies: {\n ...(root.replies ?? {}),\n __typename: root.replies?.__typename ?? 'Messages',\n data: [...replies, post],\n totalCount: (root.replies?.totalCount ?? replies.length) + 1,\n },\n };\n });\n }\n }\n\n const seen = new Set<string>();\n nextData = nextData.filter((row) => {\n if (!row?.id || seen.has(row.id)) return false;\n seen.add(row.id);\n return true;\n });\n\n return {\n ...prev,\n messages: {\n ...prev.messages,\n data: nextData,\n totalCount: nextTotal,\n },\n };\n },\n onError: (err) => {\n console.error('[useChatMessages] subscribeToMore error:', err);\n },\n });\n return () => unsubscribe();\n }, [sessionId, options?.skip, subscribeToMore, client]);\n\n /**\n * `messagesLoaded` means \"we have data we can show\". cache-and-network 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 const ownRows = rows.filter((post) => {\n const postChannelId = post?.channel?.id;\n return !postChannelId || postChannelId === sessionId;\n });\n return flattenPostsWithReplies(ownRows, sessionId);\n }, [data, sessionId]);\n\n /** The channel's posts as the server sent them (props, propsConfiguration), for readers of build fragments. */\n const posts = useMemo(() => (sessionId ? ((data?.messages?.data ?? []) as MinimalPost[]) : []), [data, sessionId]);\n\n return { messages, posts, 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\n/**\n * What `createChannel` takes: the session fields plus where the chat lives and\n * its starting settings. Callers cast to `any` / `never` before this existed.\n */\nexport type CreateChatChannelInput = IAccountCreateChatSessionInput & {\n orgName?: string | null;\n projectId?: string | null;\n isShared?: boolean;\n sharedSlug?: string | null;\n isArchived?: boolean;\n isPinned?: boolean;\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?: CreateChatChannelInput): Promise<ChatSessionUI> => {\n const { orgName: orgNameArg, projectId: projectIdArg, ...inputForSettings } = input ?? {};\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 const patchChannelTitle = useCallback(\n (channelId: string, rawPrompt: string, bumpActivity = false) => {\n patchChannelHistoryTitle(client, channelId, rawPrompt);\n if (bumpActivity) touchChannelHistoryUpdatedAt(client, channelId);\n },\n [client],\n );\n\n return {\n createChannel,\n createSession: createChannel,\n saveMessages,\n patchChannelTitle,\n loading: { create: createChannelLoading, saveMessages: sendMessagesLoading },\n };\n}\n"],"names":["_a","_b","_c","_d","_e","uuidv4","postChannelId"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@adminide-stack/yantra-mobile",
|
|
3
|
-
"version": "12.0.
|
|
3
|
+
"version": "12.0.118-alpha.0",
|
|
4
4
|
"description": "Sample core for higher packages to depend on",
|
|
5
5
|
"license": "ISC",
|
|
6
6
|
"author": "CDMBase LLC",
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
"uuid": "^9.0.0"
|
|
28
28
|
},
|
|
29
29
|
"devDependencies": {
|
|
30
|
-
"common": "
|
|
30
|
+
"common": "12.0.118-alpha.0",
|
|
31
31
|
"libphonenumber-js": "^1.13.3"
|
|
32
32
|
},
|
|
33
33
|
"peerDependencies": {
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
"@messenger-box/platform-mobile": "*",
|
|
46
46
|
"@react-native-async-storage/async-storage": "*",
|
|
47
47
|
"@react-navigation/native": "*",
|
|
48
|
-
"common": "12.0.
|
|
48
|
+
"common": "12.0.117-alpha.0",
|
|
49
49
|
"expo-constants": "*",
|
|
50
50
|
"expo-secure-store": "*",
|
|
51
51
|
"expo-web-browser": "*",
|
|
@@ -65,5 +65,5 @@
|
|
|
65
65
|
"typescript": {
|
|
66
66
|
"definition": "lib/index.d.ts"
|
|
67
67
|
},
|
|
68
|
-
"gitHead": "
|
|
68
|
+
"gitHead": "5214133823c0dfbfc2c56b609c1cf700270d3d6a"
|
|
69
69
|
}
|