@nextclaw/agent-chat-ui 0.2.21 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/dist/index.d.ts +246 -234
  2. package/dist/index.js +3037 -3592
  3. package/package.json +2 -3
package/dist/index.d.ts CHANGED
@@ -1,319 +1,331 @@
1
- import * as react from 'react';
2
- import { RefObject } from 'react';
3
- import * as react_jsx_runtime from 'react/jsx-runtime';
1
+ import * as _$react from "react";
2
+ import { ReactNode, RefObject } from "react";
3
+ import * as _$react_jsx_runtime0 from "react/jsx-runtime";
4
4
 
5
+ //#region src/components/chat/view-models/chat-ui.types.d.ts
5
6
  type ChatTexts = {
6
- slashLoadingLabel: string;
7
- slashSectionLabel: string;
8
- slashEmptyLabel: string;
9
- slashHintLabel: string;
10
- slashSkillHintLabel: string;
11
- sendButtonLabel: string;
12
- stopButtonLabel: string;
7
+ slashLoadingLabel: string;
8
+ slashSectionLabel: string;
9
+ slashEmptyLabel: string;
10
+ slashHintLabel: string;
11
+ slashSkillHintLabel: string;
12
+ sendButtonLabel: string;
13
+ stopButtonLabel: string;
13
14
  };
14
15
  type ChatSlashItem = {
15
- key: string;
16
- title: string;
17
- subtitle: string;
18
- description: string;
19
- detailLines: string[];
20
- value?: string;
16
+ key: string;
17
+ title: string;
18
+ subtitle: string;
19
+ description: string;
20
+ detailLines: string[];
21
+ value?: string;
21
22
  };
22
23
  type ChatSelectedItem = {
23
- key: string;
24
- label: string;
24
+ key: string;
25
+ label: string;
25
26
  };
26
27
  type ChatComposerTokenKind = "skill" | "file";
27
28
  type ChatComposerTextNode = {
28
- id: string;
29
- type: "text";
30
- text: string;
29
+ id: string;
30
+ type: "text";
31
+ text: string;
31
32
  };
32
33
  type ChatComposerTokenNode = {
33
- id: string;
34
- type: "token";
35
- tokenKind: ChatComposerTokenKind;
36
- tokenKey: string;
37
- label: string;
34
+ id: string;
35
+ type: "token";
36
+ tokenKind: ChatComposerTokenKind;
37
+ tokenKey: string;
38
+ label: string;
38
39
  };
39
40
  type ChatComposerNode = ChatComposerTextNode | ChatComposerTokenNode;
40
41
  type ChatComposerSelection = {
41
- start: number;
42
- end: number;
42
+ start: number;
43
+ end: number;
43
44
  };
44
45
  type ChatToolbarIcon = "sparkles" | "brain";
45
46
  type ChatToolbarAccessoryIcon = ChatToolbarIcon | "paperclip";
46
47
  type ChatToolbarSelectOption = {
47
- value: string;
48
- label: string;
49
- description?: string;
48
+ value: string;
49
+ label: string;
50
+ description?: string;
50
51
  };
51
52
  type ChatToolbarSelectGroup = {
52
- key: string;
53
- label?: string;
54
- options: ChatToolbarSelectOption[];
53
+ key: string;
54
+ label?: string;
55
+ options: ChatToolbarSelectOption[];
55
56
  };
56
57
  type ChatToolbarSelect = {
57
- key: string;
58
- value?: string;
59
- placeholder: string;
60
- selectedLabel?: string;
61
- icon?: ChatToolbarIcon;
62
- options: ChatToolbarSelectOption[];
63
- groups?: ChatToolbarSelectGroup[];
64
- disabled?: boolean;
65
- loading?: boolean;
66
- emptyLabel?: string;
67
- onValueChange: (value: string) => void;
58
+ key: string;
59
+ value?: string;
60
+ placeholder: string;
61
+ selectedLabel?: string;
62
+ icon?: ChatToolbarIcon;
63
+ options: ChatToolbarSelectOption[];
64
+ groups?: ChatToolbarSelectGroup[];
65
+ disabled?: boolean;
66
+ loading?: boolean;
67
+ emptyLabel?: string;
68
+ onValueChange: (value: string) => void;
68
69
  };
69
70
  type ChatToolbarAccessory = {
70
- key: string;
71
- label: string;
72
- icon?: ChatToolbarAccessoryIcon;
73
- iconOnly?: boolean;
74
- disabled?: boolean;
75
- tooltip?: string;
76
- onClick?: () => void;
71
+ key: string;
72
+ label: string;
73
+ icon?: ChatToolbarAccessoryIcon;
74
+ iconOnly?: boolean;
75
+ disabled?: boolean;
76
+ tooltip?: string;
77
+ onClick?: () => void;
77
78
  };
78
79
  type ChatSkillPickerOption = {
79
- key: string;
80
- label: string;
81
- description?: string;
82
- badgeLabel?: string;
80
+ key: string;
81
+ label: string;
82
+ description?: string;
83
+ badgeLabel?: string;
83
84
  };
84
85
  type ChatSkillPickerOptionGroup = {
85
- key: string;
86
- label?: string;
87
- options: ChatSkillPickerOption[];
86
+ key: string;
87
+ label?: string;
88
+ options: ChatSkillPickerOption[];
88
89
  };
89
90
  type ChatSkillPickerProps = {
90
- title: string;
91
- searchPlaceholder: string;
92
- emptyLabel: string;
93
- loadingLabel: string;
94
- isLoading?: boolean;
95
- manageLabel?: string;
96
- manageHref?: string;
97
- options: ChatSkillPickerOption[];
98
- groups?: ChatSkillPickerOptionGroup[];
99
- selectedKeys: string[];
100
- onSelectedKeysChange: (next: string[]) => void;
91
+ title: string;
92
+ searchPlaceholder: string;
93
+ emptyLabel: string;
94
+ loadingLabel: string;
95
+ isLoading?: boolean;
96
+ manageLabel?: string;
97
+ manageHref?: string;
98
+ options: ChatSkillPickerOption[];
99
+ groups?: ChatSkillPickerOptionGroup[];
100
+ selectedKeys: string[];
101
+ onSelectedKeysChange: (next: string[]) => void;
101
102
  };
102
103
  type ChatInputBarActionsProps = {
103
- sendError?: string | null;
104
- isSending: boolean;
105
- canStopGeneration: boolean;
106
- sendDisabled: boolean;
107
- stopDisabled: boolean;
108
- stopHint: string;
109
- sendButtonLabel: string;
110
- stopButtonLabel: string;
111
- onSend: () => Promise<void> | void;
112
- onStop: () => Promise<void> | void;
104
+ sendError?: string | null;
105
+ isSending: boolean;
106
+ canStopGeneration: boolean;
107
+ sendDisabled: boolean;
108
+ stopDisabled: boolean;
109
+ stopHint: string;
110
+ sendButtonLabel: string;
111
+ stopButtonLabel: string;
112
+ onSend: () => Promise<void> | void;
113
+ onStop: () => Promise<void> | void;
113
114
  };
114
115
  type ChatInputBarToolbarProps = {
115
- selects: ChatToolbarSelect[];
116
- accessories?: ChatToolbarAccessory[];
117
- skillPicker?: ChatSkillPickerProps | null;
118
- actions: ChatInputBarActionsProps;
116
+ selects: ChatToolbarSelect[];
117
+ accessories?: ChatToolbarAccessory[];
118
+ skillPicker?: ChatSkillPickerProps | null;
119
+ actions: ChatInputBarActionsProps;
119
120
  };
120
121
  type ChatInlineHint = {
121
- tone: "neutral" | "warning";
122
- loading?: boolean;
123
- text?: string;
124
- actionLabel?: string;
125
- onAction?: () => void;
122
+ tone: "neutral" | "warning";
123
+ loading?: boolean;
124
+ text?: string;
125
+ actionLabel?: string;
126
+ onAction?: () => void;
126
127
  };
127
128
  type ChatSlashMenuProps = {
128
- isOpen: boolean;
129
- isLoading: boolean;
130
- items: ChatSlashItem[];
131
- activeIndex: number;
132
- activeItem: ChatSlashItem | null;
133
- texts: Pick<ChatTexts, "slashLoadingLabel" | "slashSectionLabel" | "slashEmptyLabel" | "slashHintLabel" | "slashSkillHintLabel">;
134
- onSelectItem: (item: ChatSlashItem) => void;
135
- onOpenChange: (open: boolean) => void;
136
- onSetActiveIndex: (index: number) => void;
129
+ isOpen: boolean;
130
+ isLoading: boolean;
131
+ items: ChatSlashItem[];
132
+ activeIndex: number;
133
+ activeItem: ChatSlashItem | null;
134
+ texts: Pick<ChatTexts, "slashLoadingLabel" | "slashSectionLabel" | "slashEmptyLabel" | "slashHintLabel" | "slashSkillHintLabel">;
135
+ onSelectItem: (item: ChatSlashItem) => void;
136
+ onOpenChange: (open: boolean) => void;
137
+ onSetActiveIndex: (index: number) => void;
137
138
  };
138
139
  type ChatInputBarProps = {
139
- composer: {
140
- nodes: ChatComposerNode[];
141
- placeholder: string;
142
- disabled: boolean;
143
- onNodesChange: (nodes: ChatComposerNode[]) => void;
144
- onFilesAdd?: (files: File[]) => Promise<void> | void;
145
- onSlashQueryChange?: (query: string | null) => void;
146
- };
147
- slashMenu: Pick<ChatSlashMenuProps, "isLoading" | "items" | "texts"> & {
148
- onSelectItem?: (item: ChatSlashItem) => void;
149
- };
150
- hint?: ChatInlineHint | null;
151
- toolbar: ChatInputBarToolbarProps;
140
+ composer: {
141
+ nodes: ChatComposerNode[];
142
+ placeholder: string;
143
+ disabled: boolean;
144
+ onNodesChange: (nodes: ChatComposerNode[]) => void;
145
+ onFilesAdd?: (files: File[]) => Promise<void> | void;
146
+ onSlashQueryChange?: (query: string | null) => void;
147
+ };
148
+ slashMenu: Pick<ChatSlashMenuProps, "isLoading" | "items" | "texts"> & {
149
+ onSelectItem?: (item: ChatSlashItem) => void;
150
+ };
151
+ hint?: ChatInlineHint | null;
152
+ toolbar: ChatInputBarToolbarProps;
152
153
  };
153
154
  type ChatMessageRole = "user" | "assistant" | "tool" | "system" | "message";
154
155
  type ChatFileOperationLineViewModel = {
155
- kind: "context" | "add" | "remove";
156
- text: string;
157
- oldLineNumber?: number;
158
- newLineNumber?: number;
156
+ kind: "context" | "add" | "remove";
157
+ text: string;
158
+ oldLineNumber?: number;
159
+ newLineNumber?: number;
159
160
  };
160
161
  type ChatFileOperationBlockViewModel = {
161
- key: string;
162
- path: string;
163
- display?: "preview" | "diff";
164
- caption?: string;
165
- lines: ChatFileOperationLineViewModel[];
166
- rawText?: string;
167
- truncated?: boolean;
162
+ key: string;
163
+ path: string;
164
+ display?: "preview" | "diff";
165
+ caption?: string;
166
+ lines: ChatFileOperationLineViewModel[];
167
+ rawText?: string;
168
+ truncated?: boolean;
168
169
  };
169
170
  type ChatToolActionViewModel = {
170
- kind: "open-session";
171
- sessionId: string;
172
- sessionKind: "child" | "session";
173
- label?: string;
174
- parentSessionId?: string;
171
+ kind: "open-session";
172
+ sessionId: string;
173
+ sessionKind: "child" | "session";
174
+ agentId?: string;
175
+ label?: string;
176
+ parentSessionId?: string;
175
177
  };
176
178
  type ChatToolPartViewModel = {
177
- kind: "call" | "result";
178
- toolName: string;
179
- summary?: string;
180
- inputLabel?: string;
181
- input?: string;
182
- output?: string;
183
- outputData?: unknown;
184
- hasResult: boolean;
185
- statusTone: "running" | "success" | "error" | "cancelled";
186
- statusLabel: string;
187
- titleLabel: string;
188
- outputLabel: string;
189
- emptyLabel: string;
190
- action?: ChatToolActionViewModel;
191
- fileOperation?: {
192
- blocks: ChatFileOperationBlockViewModel[];
193
- };
179
+ kind: "call" | "result";
180
+ toolName: string;
181
+ agentId?: string;
182
+ summary?: string;
183
+ inputLabel?: string;
184
+ input?: string;
185
+ output?: string;
186
+ outputData?: unknown;
187
+ hasResult: boolean;
188
+ statusTone: "running" | "success" | "error" | "cancelled";
189
+ statusLabel: string;
190
+ titleLabel: string;
191
+ outputLabel: string;
192
+ emptyLabel: string;
193
+ action?: ChatToolActionViewModel;
194
+ fileOperation?: {
195
+ blocks: ChatFileOperationBlockViewModel[];
196
+ };
194
197
  };
195
198
  type ChatInlineTokenViewModel = {
196
- kind: string;
197
- key: string;
198
- label: string;
199
- rawText: string;
199
+ kind: string;
200
+ key: string;
201
+ label: string;
202
+ rawText: string;
200
203
  };
201
204
  type ChatInlineContentSegmentViewModel = {
202
- type: "markdown";
203
- text: string;
205
+ type: "markdown";
206
+ text: string;
204
207
  } | {
205
- type: "token";
206
- token: ChatInlineTokenViewModel;
208
+ type: "token";
209
+ token: ChatInlineTokenViewModel;
207
210
  };
208
211
  type ChatMessagePartViewModel = {
209
- type: "markdown";
210
- text: string;
211
- } | {
212
- type: "inline-content";
213
- segments: ChatInlineContentSegmentViewModel[];
212
+ type: "markdown";
213
+ text: string;
214
214
  } | {
215
- type: "reasoning";
216
- text: string;
217
- label: string;
215
+ type: "inline-content";
216
+ segments: ChatInlineContentSegmentViewModel[];
218
217
  } | {
219
- type: "tool-card";
220
- card: ChatToolPartViewModel;
218
+ type: "reasoning";
219
+ text: string;
220
+ label: string;
221
221
  } | {
222
- type: "file";
223
- file: {
224
- label: string;
225
- mimeType: string;
226
- dataUrl?: string;
227
- sizeBytes?: number;
228
- isImage: boolean;
229
- };
222
+ type: "tool-card";
223
+ card: ChatToolPartViewModel;
230
224
  } | {
231
- type: "unknown";
225
+ type: "file";
226
+ file: {
232
227
  label: string;
233
- rawType: string;
234
- text?: string;
228
+ mimeType: string;
229
+ dataUrl?: string;
230
+ sizeBytes?: number;
231
+ isImage: boolean;
232
+ };
233
+ } | {
234
+ type: "unknown";
235
+ label: string;
236
+ rawType: string;
237
+ text?: string;
235
238
  };
236
239
  type ChatMessageViewModel = {
237
- id: string;
238
- role: ChatMessageRole;
239
- roleLabel: string;
240
- timestampLabel: string;
241
- parts: ChatMessagePartViewModel[];
242
- status?: string;
240
+ id: string;
241
+ role: ChatMessageRole;
242
+ roleLabel: string;
243
+ timestampLabel: string;
244
+ parts: ChatMessagePartViewModel[];
245
+ status?: string;
243
246
  };
244
247
  type ChatMessageTexts = {
245
- copyCodeLabel: string;
246
- copiedCodeLabel: string;
247
- copyMessageLabel: string;
248
- copiedMessageLabel: string;
249
- typingLabel: string;
248
+ copyCodeLabel: string;
249
+ copiedCodeLabel: string;
250
+ copyMessageLabel: string;
251
+ copiedMessageLabel: string;
252
+ typingLabel: string;
250
253
  };
251
254
  type ChatMessageListProps = {
252
- messages: ChatMessageViewModel[];
253
- isSending: boolean;
254
- hasAssistantDraft: boolean;
255
- texts: ChatMessageTexts;
256
- className?: string;
257
- onToolAction?: (action: ChatToolActionViewModel) => void;
258
- };
259
-
255
+ messages: ChatMessageViewModel[];
256
+ isSending: boolean;
257
+ hasAssistantDraft: boolean;
258
+ texts: ChatMessageTexts;
259
+ className?: string;
260
+ onToolAction?: (action: ChatToolActionViewModel) => void;
261
+ renderToolAgent?: (agentId: string) => ReactNode;
262
+ };
263
+ //#endregion
264
+ //#region src/components/chat/ui/chat-input-bar/chat-input-bar.d.ts
260
265
  type ChatInputBarHandle = {
261
- insertFileToken: (tokenKey: string, label: string) => void;
262
- insertFileTokens: (tokens: Array<{
263
- tokenKey: string;
264
- label: string;
265
- }>) => void;
266
- focusComposer: () => void;
267
- };
268
- declare const ChatInputBar: react.ForwardRefExoticComponent<ChatInputBarProps & react.RefAttributes<ChatInputBarHandle>>;
269
-
270
- declare function ChatMessageList(props: ChatMessageListProps): react_jsx_runtime.JSX.Element;
271
-
266
+ insertFileToken: (tokenKey: string, label: string) => void;
267
+ insertFileTokens: (tokens: Array<{
268
+ tokenKey: string;
269
+ label: string;
270
+ }>) => void;
271
+ focusComposer: () => void;
272
+ };
273
+ declare const ChatInputBar: _$react.ForwardRefExoticComponent<ChatInputBarProps & _$react.RefAttributes<ChatInputBarHandle>>;
274
+ //#endregion
275
+ //#region src/components/chat/ui/chat-message-list/chat-message-list.d.ts
276
+ declare function ChatMessageList(props: ChatMessageListProps): _$react_jsx_runtime0.JSX.Element;
277
+ //#endregion
278
+ //#region src/components/chat/hooks/use-active-item-scroll.d.ts
272
279
  type UseActiveItemScrollParams = {
273
- containerRef: RefObject<HTMLElement>;
274
- activeIndex: number;
275
- itemCount: number;
276
- isEnabled: boolean;
277
- getItemSelector?: (index: number) => string;
280
+ containerRef: RefObject<HTMLElement>;
281
+ activeIndex: number;
282
+ itemCount: number;
283
+ isEnabled: boolean;
284
+ getItemSelector?: (index: number) => string;
278
285
  };
279
286
  declare function useActiveItemScroll(params: UseActiveItemScrollParams): void;
280
-
287
+ //#endregion
288
+ //#region src/components/chat/hooks/use-copy-feedback.d.ts
281
289
  type UseCopyFeedbackParams = {
282
- text: string;
283
- resetDelayMs?: number;
290
+ text: string;
291
+ resetDelayMs?: number;
284
292
  };
285
293
  type UseCopyFeedbackResult = {
286
- copied: boolean;
287
- copy: () => Promise<void>;
294
+ copied: boolean;
295
+ copy: () => Promise<void>;
288
296
  };
289
297
  declare function useCopyFeedback(params: UseCopyFeedbackParams): UseCopyFeedbackResult;
290
-
298
+ //#endregion
299
+ //#region src/components/chat/hooks/use-element-width.d.ts
291
300
  type UseElementWidthResult<T extends HTMLElement> = {
292
- elementRef: RefObject<T>;
293
- width: number | null;
301
+ elementRef: RefObject<T>;
302
+ width: number | null;
294
303
  };
295
304
  declare function useElementWidth<T extends HTMLElement>(): UseElementWidthResult<T>;
296
-
305
+ //#endregion
306
+ //#region src/components/chat/hooks/use-sticky-bottom-scroll.d.ts
297
307
  type UseStickyBottomScrollParams = {
298
- scrollRef: RefObject<HTMLElement>;
299
- resetKey: string | null;
300
- isLoading: boolean;
301
- hasContent: boolean;
302
- contentVersion: unknown;
303
- stickyThresholdPx?: number;
308
+ scrollRef: RefObject<HTMLElement>;
309
+ resetKey: string | null;
310
+ isLoading: boolean;
311
+ hasContent: boolean;
312
+ contentVersion: unknown;
313
+ stickyThresholdPx?: number;
304
314
  };
305
315
  type UseStickyBottomScrollResult = {
306
- onScroll: () => void;
316
+ onScroll: () => void;
307
317
  };
308
318
  declare function useStickyBottomScroll(params: UseStickyBottomScrollParams): UseStickyBottomScrollResult;
309
-
319
+ //#endregion
320
+ //#region src/components/chat/utils/copy-text.d.ts
310
321
  declare function copyText(text: string): Promise<boolean>;
311
-
322
+ //#endregion
323
+ //#region src/components/chat/ui/chat-input-bar/chat-composer.utils.d.ts
312
324
  declare function createChatComposerTextNode(text?: string): ChatComposerTextNode;
313
325
  declare function createChatComposerTokenNode(params: {
314
- tokenKind: ChatComposerTokenKind;
315
- tokenKey: string;
316
- label: string;
326
+ tokenKind: ChatComposerTokenKind;
327
+ tokenKey: string;
328
+ label: string;
317
329
  }): ChatComposerTokenNode;
318
330
  declare function createEmptyChatComposerNodes(): ChatComposerNode[];
319
331
  declare function createChatComposerNodesFromText(text: string): ChatComposerNode[];
@@ -324,9 +336,9 @@ declare function extractChatComposerTokenKeys(nodes: ChatComposerNode[], tokenKi
324
336
  declare function replaceChatComposerRange(nodes: ChatComposerNode[], start: number, end: number, replacement: ChatComposerNode[]): ChatComposerNode[];
325
337
  declare function removeChatComposerTokenNodes(nodes: ChatComposerNode[], predicate: (node: ChatComposerTokenNode) => boolean): ChatComposerNode[];
326
338
  declare function resolveChatComposerSlashTrigger(nodes: ChatComposerNode[], selection: ChatComposerSelection | null): {
327
- query: string;
328
- start: number;
329
- end: number;
339
+ query: string;
340
+ start: number;
341
+ end: number;
330
342
  } | null;
331
-
332
- export { type ChatComposerNode, type ChatComposerSelection, type ChatComposerTextNode, type ChatComposerTokenKind, type ChatComposerTokenNode, type ChatFileOperationBlockViewModel, type ChatFileOperationLineViewModel, type ChatInlineContentSegmentViewModel, type ChatInlineHint, type ChatInlineTokenViewModel, ChatInputBar, type ChatInputBarActionsProps, type ChatInputBarHandle, type ChatInputBarProps, type ChatInputBarToolbarProps, ChatMessageList, type ChatMessageListProps, type ChatMessagePartViewModel, type ChatMessageRole, type ChatMessageTexts, type ChatMessageViewModel, type ChatSelectedItem, type ChatSkillPickerOption, type ChatSkillPickerProps, type ChatSlashItem, type ChatSlashMenuProps, type ChatTexts, type ChatToolActionViewModel, type ChatToolPartViewModel, type ChatToolbarAccessory, type ChatToolbarAccessoryIcon, type ChatToolbarIcon, type ChatToolbarSelect, type ChatToolbarSelectGroup, type ChatToolbarSelectOption, copyText, createChatComposerNodesFromText, createChatComposerTextNode, createChatComposerTokenNode, createEmptyChatComposerNodes, extractChatComposerTokenKeys, normalizeChatComposerNodes, removeChatComposerTokenNodes, replaceChatComposerRange, resolveChatComposerSlashTrigger, serializeChatComposerDocument, serializeChatComposerPlainText, useActiveItemScroll, useCopyFeedback, useElementWidth, useStickyBottomScroll };
343
+ //#endregion
344
+ export { type ChatComposerNode, type ChatComposerSelection, type ChatComposerTextNode, type ChatComposerTokenKind, type ChatComposerTokenNode, type ChatFileOperationBlockViewModel, type ChatFileOperationLineViewModel, type ChatInlineContentSegmentViewModel, type ChatInlineHint, type ChatInlineTokenViewModel, ChatInputBar, type ChatInputBarActionsProps, type ChatInputBarHandle, type ChatInputBarProps, type ChatInputBarToolbarProps, ChatMessageList, type ChatMessageListProps, type ChatMessagePartViewModel, type ChatMessageRole, type ChatMessageTexts, type ChatMessageViewModel, type ChatSelectedItem, type ChatSkillPickerOption, type ChatSkillPickerProps, type ChatSlashItem, type ChatSlashMenuProps, type ChatTexts, type ChatToolActionViewModel, type ChatToolPartViewModel, type ChatToolbarAccessory, type ChatToolbarAccessoryIcon, type ChatToolbarIcon, type ChatToolbarSelect, type ChatToolbarSelectGroup, type ChatToolbarSelectOption, copyText, createChatComposerNodesFromText, createChatComposerTextNode, createChatComposerTokenNode, createEmptyChatComposerNodes, extractChatComposerTokenKeys, normalizeChatComposerNodes, removeChatComposerTokenNodes, replaceChatComposerRange, resolveChatComposerSlashTrigger, serializeChatComposerDocument, serializeChatComposerPlainText, useActiveItemScroll, useCopyFeedback, useElementWidth, useStickyBottomScroll };