@beanx/cathygo-web-core 0.1.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/dist/index.d.ts +363 -0
- package/dist/index.js +2409 -0
- package/dist/styles.css +1394 -0
- package/package.json +35 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
import { Dispatch, RefObject } from 'react';
|
|
3
|
+
import { AgentActivity, LearningTurnEvent, ConversationSummary, GatewayModelStatus } from '@beanx/cathygo-protocol';
|
|
4
|
+
|
|
5
|
+
type AgentIdentityStatus = {
|
|
6
|
+
agent_id?: string | null;
|
|
7
|
+
agent_short_id?: string | null;
|
|
8
|
+
display_name?: string | null;
|
|
9
|
+
};
|
|
10
|
+
declare function agentDisplayName(status?: AgentIdentityStatus): string;
|
|
11
|
+
declare function agentShortId(status?: AgentIdentityStatus): string | undefined;
|
|
12
|
+
|
|
13
|
+
type ComposerAttachmentPolicy = {
|
|
14
|
+
acceptMimeTypes?: readonly string[];
|
|
15
|
+
maxFileSizeBytes?: number;
|
|
16
|
+
maxFiles?: number;
|
|
17
|
+
};
|
|
18
|
+
type ComposerFileLike = Pick<File, 'name' | 'size' | 'type'>;
|
|
19
|
+
type ComposerFileRejectionReason = 'count' | 'size' | 'type';
|
|
20
|
+
type ComposerFileRejection = {
|
|
21
|
+
fileName: string;
|
|
22
|
+
message: string;
|
|
23
|
+
reason: ComposerFileRejectionReason;
|
|
24
|
+
};
|
|
25
|
+
type ComposerFileValidationResult<TFile extends ComposerFileLike = File> = {
|
|
26
|
+
accepted: TFile[];
|
|
27
|
+
error?: string;
|
|
28
|
+
rejected: ComposerFileRejection[];
|
|
29
|
+
};
|
|
30
|
+
declare const DEFAULT_COMPOSER_ATTACHMENT_POLICY: {
|
|
31
|
+
readonly acceptMimeTypes: readonly ["image/png", "image/jpeg", "image/webp"];
|
|
32
|
+
readonly maxFileSizeBytes: number;
|
|
33
|
+
readonly maxFiles: 4;
|
|
34
|
+
};
|
|
35
|
+
declare function normalizeComposerAttachmentPolicy(policy?: ComposerAttachmentPolicy): Required<ComposerAttachmentPolicy>;
|
|
36
|
+
declare function composerAcceptAttribute(policy?: ComposerAttachmentPolicy): string;
|
|
37
|
+
declare function validateComposerFiles<TFile extends ComposerFileLike>(files: TFile[], existingCount?: number, policy?: ComposerAttachmentPolicy): ComposerFileValidationResult<TFile>;
|
|
38
|
+
declare function formatBytes(bytes: number): string;
|
|
39
|
+
|
|
40
|
+
type PendingComposerAttachment = {
|
|
41
|
+
id: string;
|
|
42
|
+
name: string;
|
|
43
|
+
previewUrl: string;
|
|
44
|
+
};
|
|
45
|
+
type MessageComposerHandle = {
|
|
46
|
+
openFilePicker: () => void;
|
|
47
|
+
};
|
|
48
|
+
type MessageComposerProps = {
|
|
49
|
+
value: string;
|
|
50
|
+
attachments?: PendingComposerAttachment[];
|
|
51
|
+
error?: string;
|
|
52
|
+
attachmentPolicy?: ComposerAttachmentPolicy;
|
|
53
|
+
disabled?: boolean;
|
|
54
|
+
layout?: 'default' | 'hero';
|
|
55
|
+
placeholder?: string;
|
|
56
|
+
showDisclaimer?: boolean;
|
|
57
|
+
onChange: (value: string) => void;
|
|
58
|
+
onFilesSelected?: (files: File[]) => void;
|
|
59
|
+
onRemoveAttachment?: (id: string) => void;
|
|
60
|
+
onSubmit: () => void;
|
|
61
|
+
};
|
|
62
|
+
declare const MessageComposer: react.ForwardRefExoticComponent<MessageComposerProps & react.RefAttributes<MessageComposerHandle>>;
|
|
63
|
+
|
|
64
|
+
type ChatRole = 'user' | 'assistant' | 'system';
|
|
65
|
+
type ChatAttachment = {
|
|
66
|
+
id: string;
|
|
67
|
+
kind: 'image';
|
|
68
|
+
uri: string;
|
|
69
|
+
original_name?: string | null;
|
|
70
|
+
mime_type?: string | null;
|
|
71
|
+
size_bytes?: number | null;
|
|
72
|
+
sha256?: string | null;
|
|
73
|
+
width?: number | null;
|
|
74
|
+
height?: number | null;
|
|
75
|
+
created_at?: string | null;
|
|
76
|
+
};
|
|
77
|
+
type ChatMessagePart = {
|
|
78
|
+
type: 'text';
|
|
79
|
+
text: string;
|
|
80
|
+
} | {
|
|
81
|
+
type: 'image';
|
|
82
|
+
attachment_id: string;
|
|
83
|
+
attachment: ChatAttachment;
|
|
84
|
+
};
|
|
85
|
+
type ChatMessage$1 = {
|
|
86
|
+
id: string;
|
|
87
|
+
role: ChatRole;
|
|
88
|
+
content: string;
|
|
89
|
+
parts?: ChatMessagePart[];
|
|
90
|
+
turnId?: string;
|
|
91
|
+
status?: 'streaming' | 'done' | 'error';
|
|
92
|
+
};
|
|
93
|
+
type ChatState = {
|
|
94
|
+
sessionId?: string;
|
|
95
|
+
activeTurnId?: string;
|
|
96
|
+
messages: ChatMessage$1[];
|
|
97
|
+
activitiesByTurnId: Record<string, AgentActivity[]>;
|
|
98
|
+
progressByTurnId: Record<string, AgentRunProgress>;
|
|
99
|
+
status: string;
|
|
100
|
+
contextMessageCount?: number;
|
|
101
|
+
error?: string;
|
|
102
|
+
errorCode?: string;
|
|
103
|
+
eventCount: number;
|
|
104
|
+
};
|
|
105
|
+
type AgentRunProgressPhase = 'queued' | 'model' | 'reasoning' | 'tool' | 'generating';
|
|
106
|
+
type AgentRunProgress = {
|
|
107
|
+
turnId: string;
|
|
108
|
+
phase: AgentRunProgressPhase;
|
|
109
|
+
status: 'running' | 'completed' | 'failed' | 'cancelled';
|
|
110
|
+
summary: string;
|
|
111
|
+
detail?: string;
|
|
112
|
+
thinking?: AgentRunThinking;
|
|
113
|
+
startedAt: string;
|
|
114
|
+
updatedAt?: string;
|
|
115
|
+
};
|
|
116
|
+
type AgentRunThinking = {
|
|
117
|
+
expanded: boolean;
|
|
118
|
+
lines: string[];
|
|
119
|
+
hiddenCount: number;
|
|
120
|
+
hiddenStartedAt?: string;
|
|
121
|
+
updatedAt: string;
|
|
122
|
+
};
|
|
123
|
+
type ChatAction = {
|
|
124
|
+
type: 'session.created';
|
|
125
|
+
sessionId: string;
|
|
126
|
+
} | {
|
|
127
|
+
type: 'session.loaded';
|
|
128
|
+
sessionId: string;
|
|
129
|
+
messages: ChatMessage$1[];
|
|
130
|
+
activities?: AgentActivity[];
|
|
131
|
+
} | {
|
|
132
|
+
type: 'user.sent';
|
|
133
|
+
id: string;
|
|
134
|
+
content: string;
|
|
135
|
+
parts?: ChatMessagePart[];
|
|
136
|
+
} | {
|
|
137
|
+
type: 'turn.accepted';
|
|
138
|
+
sessionId: string;
|
|
139
|
+
turnId: string;
|
|
140
|
+
} | {
|
|
141
|
+
type: 'send.failed';
|
|
142
|
+
id: string;
|
|
143
|
+
error: string;
|
|
144
|
+
code?: string;
|
|
145
|
+
} | {
|
|
146
|
+
type: 'event.received';
|
|
147
|
+
event: LearningTurnEvent;
|
|
148
|
+
} | {
|
|
149
|
+
type: 'reset';
|
|
150
|
+
};
|
|
151
|
+
|
|
152
|
+
type ChatHomeModeId = 'photo_question' | 'paper_analysis' | 'knowledge_learning';
|
|
153
|
+
type ChatHomeMode = {
|
|
154
|
+
id: ChatHomeModeId;
|
|
155
|
+
label: string;
|
|
156
|
+
placeholder: string;
|
|
157
|
+
emphasizeAttachment?: boolean;
|
|
158
|
+
};
|
|
159
|
+
declare const CHAT_HOME_MODES: ChatHomeMode[];
|
|
160
|
+
declare const DEFAULT_CHAT_HOME_MODE_ID: ChatHomeModeId;
|
|
161
|
+
declare function findChatHomeMode(id: ChatHomeModeId): ChatHomeMode;
|
|
162
|
+
|
|
163
|
+
type CathyGOChatScreen = 'home' | 'chat' | 'history';
|
|
164
|
+
type CathyGOChatAppProps = {
|
|
165
|
+
screen: CathyGOChatScreen;
|
|
166
|
+
chat: ChatState;
|
|
167
|
+
chats?: ConversationSummary[];
|
|
168
|
+
draft: string;
|
|
169
|
+
attachments?: PendingComposerAttachment[];
|
|
170
|
+
attachmentPolicy?: ComposerAttachmentPolicy;
|
|
171
|
+
composerError?: string;
|
|
172
|
+
busy?: boolean;
|
|
173
|
+
connectionStatus: string;
|
|
174
|
+
gatewayLinked?: boolean;
|
|
175
|
+
model?: GatewayModelStatus;
|
|
176
|
+
agentStatus?: AgentIdentityStatus;
|
|
177
|
+
homeAvatarSrc?: string;
|
|
178
|
+
onDraftChange: (value: string) => void;
|
|
179
|
+
onFilesSelected?: (files: File[]) => void;
|
|
180
|
+
onRemoveAttachment?: (id: string) => void;
|
|
181
|
+
onSendMessage: () => void;
|
|
182
|
+
onSendHomeMessage: (modeId: ChatHomeModeId) => void;
|
|
183
|
+
onAbort: () => void;
|
|
184
|
+
onSuggest?: (text: string) => void;
|
|
185
|
+
onOpenChat: (sessionId: string) => void;
|
|
186
|
+
onNewChat: () => void;
|
|
187
|
+
};
|
|
188
|
+
declare function CathyGOChatApp({ screen, chat, chats, draft, attachments, attachmentPolicy, composerError, busy, connectionStatus, gatewayLinked, model, agentStatus, homeAvatarSrc, onDraftChange, onFilesSelected, onRemoveAttachment, onSendMessage, onSendHomeMessage, onAbort, onSuggest, onOpenChat, onNewChat, }: CathyGOChatAppProps): react.JSX.Element;
|
|
189
|
+
|
|
190
|
+
type UseCathyGOChatResult = {
|
|
191
|
+
chat: ChatState;
|
|
192
|
+
dispatchChat: Dispatch<ChatAction>;
|
|
193
|
+
resetChat: () => void;
|
|
194
|
+
createSession: (sessionId: string) => void;
|
|
195
|
+
loadSession: (sessionId: string, messages: ChatMessage$1[], activities?: ChatState['activitiesByTurnId'][string]) => void;
|
|
196
|
+
applyTurnEvent: (event: LearningTurnEvent) => void;
|
|
197
|
+
};
|
|
198
|
+
declare function useCathyGOChat(initialState?: ChatState): UseCathyGOChatResult;
|
|
199
|
+
|
|
200
|
+
declare const initialChatState: ChatState;
|
|
201
|
+
declare function reduceChat(state: ChatState, action: ChatAction): ChatState;
|
|
202
|
+
|
|
203
|
+
/** Strip LaTeX delimiters for compact sidebar / list previews. */
|
|
204
|
+
declare function stripMathForPreview(text: string, maxLen?: number): string;
|
|
205
|
+
|
|
206
|
+
declare function fixCommonLatexMistakes(source: string): string;
|
|
207
|
+
declare function normalizeMathDelimiters(source: string): string;
|
|
208
|
+
/** Full preprocess pipeline used by all Web chat/agent message renderers. */
|
|
209
|
+
declare function prepareMathMarkdown(source: string): string;
|
|
210
|
+
|
|
211
|
+
type AgentActivityTimelineProps = {
|
|
212
|
+
activities: AgentActivity[];
|
|
213
|
+
progress?: AgentRunProgress;
|
|
214
|
+
};
|
|
215
|
+
declare function AgentActivityTimeline({ activities, progress }: AgentActivityTimelineProps): react.JSX.Element | null;
|
|
216
|
+
|
|
217
|
+
type ChatAgentIdentityProps = {
|
|
218
|
+
agentStatus?: AgentIdentityStatus;
|
|
219
|
+
};
|
|
220
|
+
declare function ChatAgentIdentity({ agentStatus }: ChatAgentIdentityProps): react.JSX.Element;
|
|
221
|
+
|
|
222
|
+
type ChatMessageProps = {
|
|
223
|
+
message: ChatMessage$1;
|
|
224
|
+
};
|
|
225
|
+
declare function ChatMessage({ message }: ChatMessageProps): react.JSX.Element;
|
|
226
|
+
|
|
227
|
+
type ChatRuntimeId = 'lite' | 'local';
|
|
228
|
+
type ChatRuntimeSelectorProps = {
|
|
229
|
+
agentStatus?: AgentIdentityStatus;
|
|
230
|
+
value?: ChatRuntimeId;
|
|
231
|
+
onChange?: (id: ChatRuntimeId) => void;
|
|
232
|
+
};
|
|
233
|
+
type RuntimeOption = {
|
|
234
|
+
id: ChatRuntimeId;
|
|
235
|
+
label: string;
|
|
236
|
+
icon: 'cloud' | 'local';
|
|
237
|
+
};
|
|
238
|
+
declare function buildRuntimeOptions(agentStatus?: AgentIdentityStatus): RuntimeOption[];
|
|
239
|
+
declare function ChatRuntimeSelector({ agentStatus, value, onChange, }: ChatRuntimeSelectorProps): react.JSX.Element;
|
|
240
|
+
|
|
241
|
+
type ChatTopBarProps = {
|
|
242
|
+
agentStatus?: AgentIdentityStatus;
|
|
243
|
+
connectionStatus: string;
|
|
244
|
+
gatewayLinked?: boolean;
|
|
245
|
+
model?: GatewayModelStatus;
|
|
246
|
+
debugUI?: boolean;
|
|
247
|
+
canAbort?: boolean;
|
|
248
|
+
onAbort?: () => void;
|
|
249
|
+
};
|
|
250
|
+
declare function ChatTopBar({ agentStatus, connectionStatus, gatewayLinked, model, debugUI, canAbort, onAbort, }: ChatTopBarProps): react.JSX.Element;
|
|
251
|
+
|
|
252
|
+
type ChatTranscriptProps = {
|
|
253
|
+
messages: ChatMessage$1[];
|
|
254
|
+
activitiesByTurnId?: Record<string, AgentActivity[]>;
|
|
255
|
+
progressByTurnId?: Record<string, AgentRunProgress>;
|
|
256
|
+
activeTurnId?: string;
|
|
257
|
+
onSuggest?: (text: string) => void;
|
|
258
|
+
};
|
|
259
|
+
declare function ChatTranscript({ messages, activitiesByTurnId, progressByTurnId, activeTurnId, onSuggest, }: ChatTranscriptProps): react.JSX.Element;
|
|
260
|
+
|
|
261
|
+
type MathMarkdownProps = {
|
|
262
|
+
content: string;
|
|
263
|
+
};
|
|
264
|
+
declare const MathMarkdown: react.NamedExoticComponent<MathMarkdownProps>;
|
|
265
|
+
|
|
266
|
+
type RunStatusProps = {
|
|
267
|
+
status: string;
|
|
268
|
+
sessionId?: string;
|
|
269
|
+
activeTurnId?: string;
|
|
270
|
+
contextMessageCount?: number;
|
|
271
|
+
error?: string;
|
|
272
|
+
errorCode?: string;
|
|
273
|
+
};
|
|
274
|
+
declare function RunStatus({ status, sessionId, activeTurnId, contextMessageCount, error, errorCode, }: RunStatusProps): react.JSX.Element;
|
|
275
|
+
|
|
276
|
+
type ScrollToBottomButtonProps = {
|
|
277
|
+
containerRef: RefObject<HTMLElement | null>;
|
|
278
|
+
endRef: RefObject<HTMLElement | null>;
|
|
279
|
+
watchKey: unknown;
|
|
280
|
+
};
|
|
281
|
+
declare function ScrollToBottomButton({ containerRef, endRef, watchKey, }: ScrollToBottomButtonProps): react.JSX.Element | null;
|
|
282
|
+
|
|
283
|
+
type IconProps = {
|
|
284
|
+
className?: string;
|
|
285
|
+
};
|
|
286
|
+
declare function IconNewChat({ className }: IconProps): react.JSX.Element;
|
|
287
|
+
declare function IconPencil({ className }: IconProps): react.JSX.Element;
|
|
288
|
+
declare function IconCalendar({ className }: IconProps): react.JSX.Element;
|
|
289
|
+
declare function IconMessage({ className }: IconProps): react.JSX.Element;
|
|
290
|
+
declare function IconDocument({ className }: IconProps): react.JSX.Element;
|
|
291
|
+
declare function IconSearch({ className }: IconProps): react.JSX.Element;
|
|
292
|
+
declare function IconSettings({ className }: IconProps): react.JSX.Element;
|
|
293
|
+
declare function IconImageUpload({ className }: IconProps): react.JSX.Element;
|
|
294
|
+
declare function IconChevronRight({ className }: IconProps): react.JSX.Element;
|
|
295
|
+
declare function IconMore({ className }: IconProps): react.JSX.Element;
|
|
296
|
+
declare function IconExternalLink({ className }: IconProps): react.JSX.Element;
|
|
297
|
+
declare function IconHome({ className }: IconProps): react.JSX.Element;
|
|
298
|
+
declare function IconGithub({ className }: IconProps): react.JSX.Element;
|
|
299
|
+
declare function IconBack({ className }: IconProps): react.JSX.Element;
|
|
300
|
+
declare function IconClose({ className }: IconProps): react.JSX.Element;
|
|
301
|
+
declare function IconPlug({ className }: IconProps): react.JSX.Element;
|
|
302
|
+
declare function IconBrain({ className }: IconProps): react.JSX.Element;
|
|
303
|
+
declare function IconDevice({ className }: IconProps): react.JSX.Element;
|
|
304
|
+
declare function IconDevices({ className }: IconProps): react.JSX.Element;
|
|
305
|
+
declare function IconSmartphone({ className }: IconProps): react.JSX.Element;
|
|
306
|
+
declare function IconShield({ className }: IconProps): react.JSX.Element;
|
|
307
|
+
declare function IconCode({ className }: IconProps): react.JSX.Element;
|
|
308
|
+
declare function IconInfo({ className }: IconProps): react.JSX.Element;
|
|
309
|
+
declare function IconCloud({ className }: IconProps): react.JSX.Element;
|
|
310
|
+
declare function IconLocalComputer({ className }: IconProps): react.JSX.Element;
|
|
311
|
+
declare function IconChevronDown({ className }: IconProps): react.JSX.Element;
|
|
312
|
+
declare function IconGatewayOnline({ className }: IconProps): react.JSX.Element;
|
|
313
|
+
declare function IconGatewayConnecting({ className }: IconProps): react.JSX.Element;
|
|
314
|
+
declare function IconGatewayOffline({ className }: IconProps): react.JSX.Element;
|
|
315
|
+
declare function IconSend({ className }: IconProps): react.JSX.Element;
|
|
316
|
+
|
|
317
|
+
interface ChatHomeViewProps {
|
|
318
|
+
draft: string;
|
|
319
|
+
attachments?: PendingComposerAttachment[];
|
|
320
|
+
attachmentPolicy?: ComposerAttachmentPolicy;
|
|
321
|
+
error?: string;
|
|
322
|
+
busy?: boolean;
|
|
323
|
+
connectionStatus: string;
|
|
324
|
+
gatewayLinked?: boolean;
|
|
325
|
+
model?: GatewayModelStatus;
|
|
326
|
+
agentStatus?: AgentIdentityStatus;
|
|
327
|
+
avatarSrc?: string;
|
|
328
|
+
onDraftChange: (value: string) => void;
|
|
329
|
+
onFilesSelected?: (files: File[]) => void;
|
|
330
|
+
onRemoveAttachment?: (id: string) => void;
|
|
331
|
+
onSend: (modeId: ChatHomeModeId) => void;
|
|
332
|
+
}
|
|
333
|
+
declare function ChatHomeView({ draft, attachments, attachmentPolicy, error, busy, connectionStatus, gatewayLinked, model, agentStatus, avatarSrc, onDraftChange, onFilesSelected, onRemoveAttachment, onSend, }: ChatHomeViewProps): react.JSX.Element;
|
|
334
|
+
|
|
335
|
+
interface ChatListViewProps {
|
|
336
|
+
chats: ConversationSummary[];
|
|
337
|
+
onOpen: (sessionId: string) => void;
|
|
338
|
+
onNewChat: () => void;
|
|
339
|
+
}
|
|
340
|
+
declare function ChatListView({ chats, onOpen, onNewChat }: ChatListViewProps): react.JSX.Element;
|
|
341
|
+
|
|
342
|
+
interface ChatViewProps {
|
|
343
|
+
chat: ChatState;
|
|
344
|
+
draft: string;
|
|
345
|
+
attachments?: PendingComposerAttachment[];
|
|
346
|
+
attachmentPolicy?: ComposerAttachmentPolicy;
|
|
347
|
+
composerError?: string;
|
|
348
|
+
connectionStatus: string;
|
|
349
|
+
gatewayLinked?: boolean;
|
|
350
|
+
model?: GatewayModelStatus;
|
|
351
|
+
agentStatus?: AgentIdentityStatus;
|
|
352
|
+
onDraftChange: (value: string) => void;
|
|
353
|
+
onFilesSelected?: (files: File[]) => void;
|
|
354
|
+
onRemoveAttachment?: (id: string) => void;
|
|
355
|
+
onSend: () => void;
|
|
356
|
+
onAbort: () => void;
|
|
357
|
+
onSuggest?: (text: string) => void;
|
|
358
|
+
}
|
|
359
|
+
declare function ChatView({ chat, draft, attachments, attachmentPolicy, composerError, connectionStatus, gatewayLinked, model, agentStatus, onDraftChange, onFilesSelected, onRemoveAttachment, onSend, onAbort, onSuggest, }: ChatViewProps): react.JSX.Element;
|
|
360
|
+
|
|
361
|
+
declare function modelStatusText(model: GatewayModelStatus): string;
|
|
362
|
+
|
|
363
|
+
export { AgentActivityTimeline, type AgentIdentityStatus, type AgentRunProgress, type AgentRunProgressPhase, type AgentRunThinking, CHAT_HOME_MODES, CathyGOChatApp, type CathyGOChatAppProps, type CathyGOChatScreen, type ChatAction, ChatAgentIdentity, type ChatAttachment, type ChatHomeMode, type ChatHomeModeId, ChatHomeView, ChatListView, type ChatMessage$1 as ChatMessage, type ChatMessagePart, ChatMessage as ChatMessageView, type ChatRole, type ChatRuntimeId, ChatRuntimeSelector, type ChatRuntimeSelectorProps, type ChatState, ChatTopBar, ChatTranscript, ChatView, type ComposerAttachmentPolicy, type ComposerFileLike, type ComposerFileRejection, type ComposerFileRejectionReason, type ComposerFileValidationResult, DEFAULT_CHAT_HOME_MODE_ID, DEFAULT_COMPOSER_ATTACHMENT_POLICY, IconBack, IconBrain, IconCalendar, IconChevronDown, IconChevronRight, IconClose, IconCloud, IconCode, IconDevice, IconDevices, IconDocument, IconExternalLink, IconGatewayConnecting, IconGatewayOffline, IconGatewayOnline, IconGithub, IconHome, IconImageUpload, IconInfo, IconLocalComputer, IconMessage, IconMore, IconNewChat, IconPencil, IconPlug, IconSearch, IconSend, IconSettings, IconShield, IconSmartphone, MathMarkdown, MessageComposer, type MessageComposerHandle, type PendingComposerAttachment, RunStatus, type RuntimeOption, ScrollToBottomButton, type UseCathyGOChatResult, agentDisplayName, agentShortId, buildRuntimeOptions, composerAcceptAttribute, findChatHomeMode, fixCommonLatexMistakes, formatBytes, initialChatState, modelStatusText, normalizeComposerAttachmentPolicy, normalizeMathDelimiters, prepareMathMarkdown, reduceChat, stripMathForPreview, useCathyGOChat, validateComposerFiles };
|