reachat 2.1.2 → 2.2.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.
Files changed (36) hide show
  1. package/dist/{CSVFileRenderer-DXI8PDqR.js → CSVFileRenderer-BOdL4Jte.js} +2 -2
  2. package/dist/{CSVFileRenderer-DXI8PDqR.js.map → CSVFileRenderer-BOdL4Jte.js.map} +1 -1
  3. package/dist/{DefaultFileRenderer-Bi8LNDio.js → DefaultFileRenderer-C2MsQ9wz.js} +3 -3
  4. package/dist/{DefaultFileRenderer-Bi8LNDio.js.map → DefaultFileRenderer-C2MsQ9wz.js.map} +1 -1
  5. package/dist/Markdown/plugins/index.d.ts +2 -0
  6. package/dist/Markdown/plugins/redactMatchers.d.ts +21 -0
  7. package/dist/Markdown/plugins/remarkRedact.d.ts +37 -0
  8. package/dist/SessionMessages/SessionMessage/MessageActions.d.ts +2 -2
  9. package/dist/SessionMessages/SessionMessage/MessageFiles.d.ts +2 -2
  10. package/dist/SessionMessages/SessionMessage/MessageQuestion.d.ts +2 -2
  11. package/dist/SessionMessages/SessionMessage/MessageResponse.d.ts +2 -2
  12. package/dist/SessionMessages/SessionMessage/MessageSources.d.ts +2 -2
  13. package/dist/SessionMessages/SessionMessage/SessionMessage.d.ts +2 -2
  14. package/dist/SessionsList/SessionListItem.d.ts +2 -2
  15. package/dist/docs.json +5 -13
  16. package/dist/{index-CBHNcMyR.js → index-DdRyk11n.js} +783 -1458
  17. package/dist/index-DdRyk11n.js.map +1 -0
  18. package/dist/index.css +6 -1
  19. package/dist/index.d.ts +1 -0
  20. package/dist/index.js +53 -46
  21. package/dist/index.umd.cjs +735 -1412
  22. package/dist/index.umd.cjs.map +1 -1
  23. package/dist/stories/AgUi.stories.tsx +118 -0
  24. package/dist/stories/Chat.stories.tsx +6 -1
  25. package/dist/stories/ChatSuggestions.stories.tsx +9 -81
  26. package/dist/stories/Companion.stories.tsx +7 -1
  27. package/dist/stories/Console.stories.tsx +66 -21
  28. package/dist/stories/EnhancedInput.stories.tsx +7 -1
  29. package/dist/stories/Redact.stories.tsx +175 -0
  30. package/dist/stories/examples.ts +31 -0
  31. package/dist/useAgUi/index.d.ts +4 -0
  32. package/dist/useAgUi/types.d.ts +157 -0
  33. package/dist/useAgUi/useAgUi.d.ts +119 -0
  34. package/dist/useAgUi/useAgUi.spec.d.ts +1 -0
  35. package/package.json +3 -1
  36. package/dist/index-CBHNcMyR.js.map +0 -1
@@ -0,0 +1,118 @@
1
+ import { FC, ReactNode, useState } from 'react';
2
+ import { Meta } from '@storybook/react';
3
+ import {
4
+ Chat,
5
+ SessionsList,
6
+ NewSessionButton,
7
+ SessionMessages,
8
+ SessionGroups,
9
+ ChatInput,
10
+ SessionMessagePanel,
11
+ SessionMessagesHeader,
12
+ useAgUi,
13
+ UseAgUiOptions
14
+ } from 'reachat';
15
+ import { Input } from 'reablocks';
16
+
17
+ export default {
18
+ title: 'Demos/AG-UI Protocol',
19
+ component: Chat
20
+ } as Meta;
21
+
22
+ const AgUiStory: FC<{ options?: Partial<UseAgUiOptions>; children?: ReactNode }> = ({
23
+ options
24
+ }) => {
25
+ const [endpoint, setEndpoint] = useState('');
26
+
27
+ const agui = useAgUi({
28
+ agent: endpoint || 'http://localhost:3000/api/agent',
29
+ onError: err => console.error('AG-UI error:', err),
30
+ onEvent: event => console.log('AG-UI event:', event),
31
+ ...options
32
+ });
33
+
34
+ return (
35
+ <div
36
+ className="dark:bg-gray-950 bg-white"
37
+ style={{
38
+ position: 'absolute',
39
+ top: 0,
40
+ left: 0,
41
+ right: 0,
42
+ bottom: 0,
43
+ padding: 20,
44
+ margin: 20,
45
+ borderRadius: 5,
46
+ display: 'flex',
47
+ flexDirection: 'column',
48
+ overflow: 'hidden'
49
+ }}
50
+ >
51
+ <div style={{ paddingBottom: 8, flexShrink: 0 }}>
52
+ <Input
53
+ placeholder="AG-UI agent endpoint URL"
54
+ value={endpoint}
55
+ onChange={e => setEndpoint((e.target as HTMLInputElement).value)}
56
+ />
57
+ </div>
58
+ <Chat
59
+ style={{ flex: 1, minHeight: 0 }}
60
+ viewType="console"
61
+ sessions={agui.sessions}
62
+ activeSessionId={agui.activeSessionId}
63
+ isLoading={agui.isLoading}
64
+ onSelectSession={agui.selectSession}
65
+ onDeleteSession={agui.deleteSession}
66
+ onNewSession={agui.createSession}
67
+ onSendMessage={agui.sendMessage}
68
+ onStopMessage={agui.stopMessage}
69
+ >
70
+ <SessionsList>
71
+ <NewSessionButton />
72
+ <SessionGroups />
73
+ </SessionsList>
74
+ <SessionMessagePanel>
75
+ <SessionMessagesHeader />
76
+ <SessionMessages />
77
+ <ChatInput />
78
+ </SessionMessagePanel>
79
+ </Chat>
80
+ </div>
81
+ );
82
+ };
83
+
84
+ export const Basic = () => <AgUiStory />;
85
+
86
+ export const WithToolCalls = () => (
87
+ <AgUiStory
88
+ options={{
89
+ tools: [
90
+ {
91
+ name: 'get_weather',
92
+ description: 'Get the current weather for a location',
93
+ parameters: {
94
+ type: 'object',
95
+ properties: {
96
+ location: {
97
+ type: 'string',
98
+ description: 'City name'
99
+ }
100
+ },
101
+ required: ['location']
102
+ }
103
+ }
104
+ ],
105
+ onToolCall: async toolCall => {
106
+ console.log('Tool called:', toolCall);
107
+ if (toolCall.toolCallName === 'get_weather') {
108
+ const args = JSON.parse(toolCall.args);
109
+ console.log('Weather result:', {
110
+ location: args.location,
111
+ temperature: 72,
112
+ condition: 'sunny'
113
+ });
114
+ }
115
+ }
116
+ }}
117
+ />
118
+ );
@@ -11,7 +11,8 @@ import {
11
11
  import {
12
12
  fakeSessions,
13
13
  sessionWithSources,
14
- sessionsWithFiles
14
+ sessionsWithFiles,
15
+ createSendMessageHandler
15
16
  } from './examples';
16
17
  import { useState } from 'react';
17
18
  import Placeholder from './assets/placeholder.svg?react';
@@ -64,6 +65,7 @@ export const Compact = () => {
64
65
  }}
65
66
  onSelectSession={setActiveId}
66
67
  onDeleteSession={() => alert('delete!')}
68
+ onSendMessage={createSendMessageHandler(setSessions, activeId)}
67
69
  >
68
70
  <SessionMessagePanel>
69
71
  <SessionMessages />
@@ -116,6 +118,7 @@ export const FullScreen = () => {
116
118
  }}
117
119
  onSelectSession={setActiveId}
118
120
  onDeleteSession={() => alert('delete!')}
121
+ onSendMessage={createSendMessageHandler(setSessions, activeId)}
119
122
  >
120
123
  <SessionMessagePanel>
121
124
  <SessionMessages />
@@ -160,6 +163,7 @@ export const Empty = () => {
160
163
  }}
161
164
  onSelectSession={setActiveId}
162
165
  onDeleteSession={() => alert('delete!')}
166
+ onSendMessage={createSendMessageHandler(setSessions, activeId)}
163
167
  >
164
168
  <SessionMessagePanel>
165
169
  <SessionMessages
@@ -229,6 +233,7 @@ export const WithAppBar = () => {
229
233
  }}
230
234
  onSelectSession={setActiveId}
231
235
  onDeleteSession={() => alert('delete!')}
236
+ onSendMessage={createSendMessageHandler(setSessions, activeId)}
232
237
  >
233
238
  <div className="flex flex-col h-full">
234
239
  <AppBar
@@ -13,7 +13,11 @@ import {
13
13
  ChatSuggestions,
14
14
  Suggestion
15
15
  } from 'reachat';
16
- import { defaultSuggestions, sessionWithSuggestions } from './examples';
16
+ import {
17
+ defaultSuggestions,
18
+ sessionWithSuggestions,
19
+ createSendMessageHandler
20
+ } from './examples';
17
21
  import Placeholder from './assets/placeholder.svg?react';
18
22
  import PlaceholderDark from './assets/placeholder-dark.svg?react';
19
23
  import SparklesIcon from './assets/sparkles.svg?react';
@@ -46,26 +50,7 @@ export const Basic = () => {
46
50
  sessions={sessions}
47
51
  activeSessionId={activeId}
48
52
  onSelectSession={setActiveId}
49
- onSendMessage={message => {
50
- setSessions(prev =>
51
- prev.map(session =>
52
- session.id === activeId
53
- ? {
54
- ...session,
55
- conversations: [
56
- ...session.conversations,
57
- {
58
- id: Date.now().toString(),
59
- question: message,
60
- response: 'This is a response to your question.',
61
- createdAt: new Date()
62
- }
63
- ]
64
- }
65
- : session
66
- )
67
- );
68
- }}
53
+ onSendMessage={createSendMessageHandler(setSessions, activeId)}
69
54
  onDeleteSession={() => alert('delete!')}
70
55
  >
71
56
  <SessionsList>
@@ -128,26 +113,7 @@ export const LongSuggestions = () => {
128
113
  sessions={sessions}
129
114
  activeSessionId={activeId}
130
115
  onSelectSession={setActiveId}
131
- onSendMessage={message => {
132
- setSessions(prev =>
133
- prev.map(session =>
134
- session.id === activeId
135
- ? {
136
- ...session,
137
- conversations: [
138
- ...session.conversations,
139
- {
140
- id: Date.now().toString(),
141
- question: message,
142
- response: 'This is a response to your question.',
143
- createdAt: new Date()
144
- }
145
- ]
146
- }
147
- : session
148
- )
149
- );
150
- }}
116
+ onSendMessage={createSendMessageHandler(setSessions, activeId)}
151
117
  onDeleteSession={() => alert('delete!')}
152
118
  >
153
119
  <SessionsList>
@@ -294,26 +260,7 @@ export const Companion = () => {
294
260
  sessions={sessions}
295
261
  activeSessionId={activeId}
296
262
  onSelectSession={setActiveId}
297
- onSendMessage={message => {
298
- setSessions(prev =>
299
- prev.map(session =>
300
- session.id === activeId
301
- ? {
302
- ...session,
303
- conversations: [
304
- ...session.conversations,
305
- {
306
- id: Date.now().toString(),
307
- question: message,
308
- response: 'This is a response to your question.',
309
- createdAt: new Date()
310
- }
311
- ]
312
- }
313
- : session
314
- )
315
- );
316
- }}
263
+ onSendMessage={createSendMessageHandler(setSessions, activeId)}
317
264
  onDeleteSession={() => alert('delete!')}
318
265
  >
319
266
  <SessionsList>
@@ -360,26 +307,7 @@ export const CustomItemRendering = () => {
360
307
  sessions={sessions}
361
308
  activeSessionId={activeId}
362
309
  onSelectSession={setActiveId}
363
- onSendMessage={message => {
364
- setSessions(prev =>
365
- prev.map(session =>
366
- session.id === activeId
367
- ? {
368
- ...session,
369
- conversations: [
370
- ...session.conversations,
371
- {
372
- id: Date.now().toString(),
373
- question: message,
374
- response: 'This is a response to your question.',
375
- createdAt: new Date()
376
- }
377
- ]
378
- }
379
- : session
380
- )
381
- );
382
- }}
310
+ onSendMessage={createSendMessageHandler(setSessions, activeId)}
383
311
  onDeleteSession={() => alert('delete!')}
384
312
  >
385
313
  <SessionsList>
@@ -16,7 +16,8 @@ import {
16
16
  fakeSessions,
17
17
  sessionWithSources,
18
18
  sessionsWithFiles,
19
- chatTemplates
19
+ chatTemplates,
20
+ createSendMessageHandler
20
21
  } from './examples';
21
22
  import { useState, memo, useCallback } from 'react';
22
23
  import { IconButton } from 'reablocks';
@@ -69,6 +70,7 @@ export const Basic = () => {
69
70
  }}
70
71
  onSelectSession={setActiveId}
71
72
  onDeleteSession={() => alert('delete!')}
73
+ onSendMessage={createSendMessageHandler(setSessions, activeId)}
72
74
  >
73
75
  <SessionsList>
74
76
  <NewSessionButton />
@@ -161,6 +163,7 @@ export const WithAppBar = () => {
161
163
  }}
162
164
  onSelectSession={setActiveId}
163
165
  onDeleteSession={() => alert('delete!')}
166
+ onSendMessage={createSendMessageHandler(setSessions, activeId)}
164
167
  >
165
168
  <AppBar
166
169
  content={
@@ -256,6 +259,7 @@ export const TemplatesView = () => {
256
259
  activeSessionId={activeId}
257
260
  onSelectSession={setActiveId}
258
261
  onDeleteSession={() => alert('delete!')}
262
+ onSendMessage={createSendMessageHandler(setSessions, activeId)}
259
263
  >
260
264
  <div className="flex flex-col h-full">
261
265
  <div className="flex-1 overflow-y-auto">
@@ -321,6 +325,7 @@ export const TemplatesViewWithTitle = () => {
321
325
  activeSessionId={activeId}
322
326
  onSelectSession={setActiveId}
323
327
  onDeleteSession={() => alert('delete!')}
328
+ onSendMessage={createSendMessageHandler(setSessions, activeId)}
324
329
  >
325
330
  <div className="dark:text-white text-gray-500 w-full h-full overflow-hidden flex flex-col">
326
331
  <div className="flex-1 overflow-y-auto">
@@ -398,6 +403,7 @@ export const TemplatesViewWithAppBar = () => {
398
403
  activeSessionId={activeId}
399
404
  onSelectSession={setActiveId}
400
405
  onDeleteSession={() => alert('delete!')}
406
+ onSendMessage={createSendMessageHandler(setSessions, activeId)}
401
407
  >
402
408
  <div className="dark:text-white text-gray-500 w-full h-full overflow-hidden flex flex-col">
403
409
  <div className="flex-1 overflow-y-auto">
@@ -47,7 +47,8 @@ import {
47
47
  sessionWithSources,
48
48
  sessionsWithFiles,
49
49
  sessionsWithPartialConversation,
50
- sessionWithCSVFiles
50
+ sessionWithCSVFiles,
51
+ createSendMessageHandler
51
52
  } from './examples';
52
53
 
53
54
  export default {
@@ -56,6 +57,9 @@ export default {
56
57
  } as Meta;
57
58
 
58
59
  export const Basic = () => {
60
+ const [activeId, setActiveId] = useState<string>(fakeSessions[0].id);
61
+ const [sessions, setSessions] = useState<Session[]>(fakeSessions);
62
+
59
63
  return (
60
64
  <div
61
65
  className="dark:bg-gray-950 bg-white"
@@ -71,9 +75,12 @@ export const Basic = () => {
71
75
  }}
72
76
  >
73
77
  <Chat
74
- sessions={fakeSessions}
78
+ sessions={sessions}
79
+ activeSessionId={activeId}
75
80
  viewType="console"
81
+ onSelectSession={setActiveId}
76
82
  onDeleteSession={() => alert('delete!')}
83
+ onSendMessage={createSendMessageHandler(setSessions, activeId)}
77
84
  >
78
85
  <SessionsList>
79
86
  <NewSessionButton />
@@ -90,6 +97,9 @@ export const Basic = () => {
90
97
  };
91
98
 
92
99
  export const Embeds = () => {
100
+ const [activeId, setActiveId] = useState<string>('1');
101
+ const [sessions, setSessions] = useState<Session[]>(fakeSessionsWithEmbeds);
102
+
93
103
  return (
94
104
  <div
95
105
  className="dark:bg-gray-950 bg-white"
@@ -105,9 +115,11 @@ export const Embeds = () => {
105
115
  }}
106
116
  >
107
117
  <Chat
108
- sessions={fakeSessionsWithEmbeds}
109
- activeSessionId="1"
118
+ sessions={sessions}
119
+ activeSessionId={activeId}
120
+ onSelectSession={setActiveId}
110
121
  onDeleteSession={() => alert('delete!')}
122
+ onSendMessage={createSendMessageHandler(setSessions, activeId)}
111
123
  >
112
124
  <SessionsList>
113
125
  <NewSessionButton />
@@ -124,6 +136,9 @@ export const Embeds = () => {
124
136
  };
125
137
 
126
138
  export const DefaultSession = () => {
139
+ const [activeId, setActiveId] = useState<string>('1');
140
+ const [sessions, setSessions] = useState<Session[]>(fakeSessions);
141
+
127
142
  return (
128
143
  <div
129
144
  className="dark:bg-gray-950 bg-white"
@@ -140,9 +155,11 @@ export const DefaultSession = () => {
140
155
  >
141
156
  <Chat
142
157
  viewType="console"
143
- sessions={fakeSessions}
144
- activeSessionId="1"
158
+ sessions={sessions}
159
+ activeSessionId={activeId}
160
+ onSelectSession={setActiveId}
145
161
  onDeleteSession={() => alert('delete!')}
162
+ onSendMessage={createSendMessageHandler(setSessions, activeId)}
146
163
  >
147
164
  <SessionsList>
148
165
  <NewSessionButton />
@@ -258,6 +275,9 @@ export const FileUploads = () => {
258
275
  };
259
276
 
260
277
  export const DefaultInputValue = () => {
278
+ const [activeId, setActiveId] = useState<string>('1');
279
+ const [sessions, setSessions] = useState<Session[]>(fakeSessions);
280
+
261
281
  return (
262
282
  <div
263
283
  className="dark:bg-gray-950 bg-white"
@@ -274,9 +294,11 @@ export const DefaultInputValue = () => {
274
294
  >
275
295
  <Chat
276
296
  viewType="console"
277
- sessions={fakeSessions}
278
- activeSessionId="1"
297
+ sessions={sessions}
298
+ activeSessionId={activeId}
299
+ onSelectSession={setActiveId}
279
300
  onDeleteSession={() => alert('delete!')}
301
+ onSendMessage={createSendMessageHandler(setSessions, activeId)}
280
302
  >
281
303
  <SessionsList>
282
304
  <NewSessionButton />
@@ -294,6 +316,9 @@ export const DefaultInputValue = () => {
294
316
  };
295
317
 
296
318
  export const UndeleteableSessions = () => {
319
+ const [activeId, setActiveId] = useState<string>('1');
320
+ const [sessions, setSessions] = useState<Session[]>(fakeSessions);
321
+
297
322
  return (
298
323
  <div
299
324
  className="dark:bg-gray-950 bg-white"
@@ -308,7 +333,13 @@ export const UndeleteableSessions = () => {
308
333
  borderRadius: 5
309
334
  }}
310
335
  >
311
- <Chat viewType="console" sessions={fakeSessions} activeSessionId="1">
336
+ <Chat
337
+ viewType="console"
338
+ sessions={sessions}
339
+ activeSessionId={activeId}
340
+ onSelectSession={setActiveId}
341
+ onSendMessage={createSendMessageHandler(setSessions, activeId)}
342
+ >
312
343
  <SessionsList>
313
344
  <NewSessionButton />
314
345
  <SessionGroups>
@@ -818,6 +849,9 @@ export const Empty = () => {
818
849
  };
819
850
 
820
851
  export const ConversationSources = () => {
852
+ const [activeId, setActiveId] = useState<string>('session-sources');
853
+ const [sessions, setSessions] = useState<Session[]>(sessionWithSources);
854
+
821
855
  return (
822
856
  <div
823
857
  className="dark:bg-gray-950 bg-white"
@@ -834,8 +868,10 @@ export const ConversationSources = () => {
834
868
  >
835
869
  <Chat
836
870
  viewType="console"
837
- sessions={sessionWithSources}
838
- activeSessionId="session-sources"
871
+ sessions={sessions}
872
+ activeSessionId={activeId}
873
+ onSelectSession={setActiveId}
874
+ onSendMessage={createSendMessageHandler(setSessions, activeId)}
839
875
  >
840
876
  <SessionsList>
841
877
  <NewSessionButton />
@@ -955,6 +991,13 @@ const CustomSessionListItem: FC<SessionListItemProps> = ({
955
991
  };
956
992
 
957
993
  export const CustomComponents = () => {
994
+ const [activeId, setActiveId] = useState<string>('1');
995
+ const [sessions, setSessions] = useState<Session[]>([
996
+ ...fakeSessions,
997
+ ...sessionsWithFiles,
998
+ ...sessionWithSources
999
+ ]);
1000
+
958
1001
  return (
959
1002
  <div
960
1003
  className="dark:bg-gray-950 bg-white"
@@ -970,12 +1013,10 @@ export const CustomComponents = () => {
970
1013
  }}
971
1014
  >
972
1015
  <Chat
973
- sessions={[
974
- ...fakeSessions,
975
- ...sessionsWithFiles,
976
- ...sessionWithSources
977
- ]}
978
- activeSessionId="1"
1016
+ sessions={sessions}
1017
+ activeSessionId={activeId}
1018
+ onSelectSession={setActiveId}
1019
+ onSendMessage={createSendMessageHandler(setSessions, activeId)}
979
1020
  >
980
1021
  <SessionsList>
981
1022
  <NewSessionButton>
@@ -1063,7 +1104,7 @@ export const ImageFiles = () => {
1063
1104
  }
1064
1105
  ];
1065
1106
 
1066
- const sessionWithImages: Session[] = [
1107
+ const [sessions, setSessions] = useState<Session[]>([
1067
1108
  {
1068
1109
  id: 'session-images',
1069
1110
  title: 'Multiple Image Files Showcase',
@@ -1088,7 +1129,7 @@ export const ImageFiles = () => {
1088
1129
  }
1089
1130
  ]
1090
1131
  }
1091
- ];
1132
+ ]);
1092
1133
 
1093
1134
  return (
1094
1135
  <div
@@ -1106,8 +1147,9 @@ export const ImageFiles = () => {
1106
1147
  >
1107
1148
  <Chat
1108
1149
  viewType="console"
1109
- sessions={sessionWithImages}
1150
+ sessions={sessions}
1110
1151
  activeSessionId="session-images"
1152
+ onSendMessage={createSendMessageHandler(setSessions, 'session-images')}
1111
1153
  >
1112
1154
  <SessionsList>
1113
1155
  <NewSessionButton />
@@ -1125,6 +1167,8 @@ export const ImageFiles = () => {
1125
1167
  };
1126
1168
 
1127
1169
  export const CSVPreview = () => {
1170
+ const [sessions, setSessions] = useState<Session[]>(sessionWithCSVFiles);
1171
+
1128
1172
  return (
1129
1173
  <div
1130
1174
  className="dark:bg-gray-950 bg-white"
@@ -1137,9 +1181,10 @@ export const CSVPreview = () => {
1137
1181
  }}
1138
1182
  >
1139
1183
  <Chat
1140
- sessions={sessionWithCSVFiles}
1184
+ sessions={sessions}
1141
1185
  activeSessionId="1"
1142
1186
  onDeleteSession={() => alert('delete!')}
1187
+ onSendMessage={createSendMessageHandler(setSessions, '1')}
1143
1188
  >
1144
1189
  <SessionsList>
1145
1190
  <NewSessionButton />
@@ -9,7 +9,7 @@ import {
9
9
  MentionItem,
10
10
  SlashCommandItem
11
11
  } from 'reachat';
12
- import { fakeSessions } from './examples';
12
+ import { fakeSessions, createSendMessageHandler } from './examples';
13
13
 
14
14
  const UserIcon = () => (
15
15
  <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" className="w-full h-full">
@@ -112,6 +112,7 @@ export const WithMentions: StoryFn = () => {
112
112
  sessions={sessions}
113
113
  activeSessionId={activeId}
114
114
  onSelectSession={setActiveId}
115
+ onSendMessage={createSendMessageHandler(setSessions, activeId)}
115
116
  >
116
117
  <SessionMessagePanel>
117
118
  <SessionMessages />
@@ -153,6 +154,7 @@ export const WithSlashCommands: StoryFn = () => {
153
154
  sessions={sessions}
154
155
  activeSessionId={activeId}
155
156
  onSelectSession={setActiveId}
157
+ onSendMessage={createSendMessageHandler(setSessions, activeId)}
156
158
  >
157
159
  <SessionMessagePanel>
158
160
  <SessionMessages />
@@ -195,6 +197,7 @@ export const WithAllFeatures: StoryFn = () => {
195
197
  sessions={sessions}
196
198
  activeSessionId={activeId}
197
199
  onSelectSession={setActiveId}
200
+ onSendMessage={createSendMessageHandler(setSessions, activeId)}
198
201
  >
199
202
  <SessionMessagePanel>
200
203
  <SessionMessages />
@@ -240,6 +243,7 @@ export const WithAsyncSearch: StoryFn = () => {
240
243
  sessions={sessions}
241
244
  activeSessionId={activeId}
242
245
  onSelectSession={setActiveId}
246
+ onSendMessage={createSendMessageHandler(setSessions, activeId)}
243
247
  >
244
248
  <SessionMessagePanel>
245
249
  <SessionMessages />
@@ -271,6 +275,7 @@ export const MultiLineEmpty: StoryFn = () => {
271
275
  sessions={sessions}
272
276
  activeSessionId={activeId}
273
277
  onSelectSession={setActiveId}
278
+ onSendMessage={createSendMessageHandler(setSessions, activeId)}
274
279
  >
275
280
  <SessionMessagePanel>
276
281
  <SessionMessages />
@@ -306,6 +311,7 @@ This is line six - still scrolling!`;
306
311
  sessions={sessions}
307
312
  activeSessionId={activeId}
308
313
  onSelectSession={setActiveId}
314
+ onSendMessage={createSendMessageHandler(setSessions, activeId)}
309
315
  >
310
316
  <SessionMessagePanel>
311
317
  <SessionMessages />