@agno-hq/chat-react 0.3.1 → 0.3.3

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/README.md CHANGED
@@ -177,7 +177,9 @@ as `R, G, B` triples:
177
177
  | `<ChatLauncher>` | Floating support-widget shell: a corner bubble that opens any chat surface. |
178
178
  | `<QuickPrompts>` | Suggested-prompt chips. |
179
179
  | `<MessageList>` | Auto-scrolling transcript with live status + footer slot. |
180
- | `<Message>` | A single message: content, behind-the-scenes panel, media, citations, follow-ups. |
180
+ | `<Message>` | A single message: content, behind-the-scenes panel, media, citations, follow-ups, action row. |
181
+ | `<MessageActions>` | The icon row under a finished answer — copy, plus whatever the product adds. |
182
+ | `<CopyButton>` | The copy control, with the "copied" flash and clipboard fallbacks — the one code blocks and answers use. |
181
183
  | `<BehindTheScenes>` | One collapsible timeline over a run's reasoning, tools, member turns, steps and events — doubles as the live status line. |
182
184
  | `<ChatInput>` | Multiline input with file attach, send, and stop; opens up for @mentions, context chips and a custom textarea. |
183
185
  | `<ToolCalls>` | Collapsible tool-call cards (name, args, result, status). |
@@ -383,16 +385,18 @@ with `<EventLog>` wherever you want it:
383
385
 
384
386
  Whatever a run cites — knowledge-base chunks in `references`, browsed links in
385
387
  `citations.urls` — is flattened into one numbered list and rendered as cards
386
- under the answer: the site's favicon and the title, linking to the source. A
387
- `[1]` in the answer text becomes a chip pointing at card one, and hovering
388
- either the chip or a link opens a preview with the URL and the cited passage:
388
+ under the answer: the site's favicon and the title, linking to the source,
389
+ with the rest behind a "+N more" card past the first three. A `[1]` in the
390
+ answer text becomes a numbered disc pointing at card one, and hovering either
391
+ the disc or a link opens a preview with the URL and the cited passage:
389
392
 
390
393
  ```tsx
391
394
  <Message message={message} /> // markers, cards and previews, no props
392
395
  <Message message={message} hideSources /> // just the answer
393
396
  ```
394
397
 
395
- The hostname and favicon come from the URL itself, and the title and passage
398
+ The hostname and favicon (`/favicon.ico`, then `/favicon.svg`) come from the
399
+ URL itself, and the title and passage
396
400
  from the citation payload, so previews need no network of their own. To fill in
397
401
  OpenGraph metadata, hand the provider a `resolveLinkPreview` — the browser can't
398
402
  read another origin's meta tags, so back it with an endpoint of your own. It is
@@ -475,6 +479,32 @@ tree:
475
479
  <AgnoChat codeCopy={false} />
476
480
  ```
477
481
 
482
+ ### Message actions
483
+
484
+ A finished answer carries an action row — the AgentOS strip of small icon
485
+ buttons under the text, shown when the message is pointed at. The package
486
+ ships copy; the row is a slot for the rest:
487
+
488
+ ```tsx
489
+ <Message
490
+ message={m}
491
+ actions={<>
492
+ <button className="agno-msg__action" onClick={() => regenerate(m)} aria-label="Regenerate">
493
+ <RotateCw size={14} />
494
+ </button>
495
+ <button className="agno-msg__action" onClick={() => rate(m, 'up')} aria-label="Good answer">
496
+ <ThumbsUp size={14} />
497
+ </button>
498
+ </>}
499
+ />
500
+ <Message message={m} hideActions /> // no row at all
501
+ ```
502
+
503
+ `<MessageActions message={m}>` is the row on its own, for a transcript you
504
+ render yourself, and `<CopyButton text={…}>` is the control inside it — the
505
+ same one a code block's header uses, so every copy affordance flashes the same
506
+ tick and falls back the same way when the Clipboard API is unavailable.
507
+
478
508
  Prefer a different renderer? `renderMarkdown` replaces it entirely:
479
509
 
480
510
  ```tsx
@@ -1,334 +1,346 @@
1
1
  'use client';
2
2
  'use strict';
3
3
 
4
- var chunkJEPFGKHH_cjs = require('../chunk-JEPFGKHH.cjs');
4
+ var chunk3IEYJIYJ_cjs = require('../chunk-3IEYJIYJ.cjs');
5
5
  require('../chunk-55HQJGLP.cjs');
6
6
 
7
7
 
8
8
 
9
9
  Object.defineProperty(exports, "AgnoChat", {
10
10
  enumerable: true,
11
- get: function () { return chunkJEPFGKHH_cjs.AgnoChat; }
11
+ get: function () { return chunk3IEYJIYJ_cjs.AgnoChat; }
12
12
  });
13
13
  Object.defineProperty(exports, "AgnoMark", {
14
14
  enumerable: true,
15
- get: function () { return chunkJEPFGKHH_cjs.AgnoMark; }
15
+ get: function () { return chunk3IEYJIYJ_cjs.AgnoMark; }
16
16
  });
17
17
  Object.defineProperty(exports, "ArrowUp", {
18
18
  enumerable: true,
19
- get: function () { return chunkJEPFGKHH_cjs.ArrowUp; }
19
+ get: function () { return chunk3IEYJIYJ_cjs.ArrowUp; }
20
20
  });
21
21
  Object.defineProperty(exports, "BehindTheScenes", {
22
22
  enumerable: true,
23
- get: function () { return chunkJEPFGKHH_cjs.BehindTheScenes; }
23
+ get: function () { return chunk3IEYJIYJ_cjs.BehindTheScenes; }
24
24
  });
25
25
  Object.defineProperty(exports, "BookOpen", {
26
26
  enumerable: true,
27
- get: function () { return chunkJEPFGKHH_cjs.BookOpen; }
27
+ get: function () { return chunk3IEYJIYJ_cjs.BookOpen; }
28
28
  });
29
29
  Object.defineProperty(exports, "Box", {
30
30
  enumerable: true,
31
- get: function () { return chunkJEPFGKHH_cjs.Box; }
31
+ get: function () { return chunk3IEYJIYJ_cjs.Box; }
32
32
  });
33
33
  Object.defineProperty(exports, "Brain", {
34
34
  enumerable: true,
35
- get: function () { return chunkJEPFGKHH_cjs.Brain; }
35
+ get: function () { return chunk3IEYJIYJ_cjs.Brain; }
36
36
  });
37
37
  Object.defineProperty(exports, "ChatBubble", {
38
38
  enumerable: true,
39
- get: function () { return chunkJEPFGKHH_cjs.ChatBubble; }
39
+ get: function () { return chunk3IEYJIYJ_cjs.ChatBubble; }
40
40
  });
41
41
  Object.defineProperty(exports, "ChatInput", {
42
42
  enumerable: true,
43
- get: function () { return chunkJEPFGKHH_cjs.ChatInput; }
43
+ get: function () { return chunk3IEYJIYJ_cjs.ChatInput; }
44
44
  });
45
45
  Object.defineProperty(exports, "ChatLauncher", {
46
46
  enumerable: true,
47
- get: function () { return chunkJEPFGKHH_cjs.ChatLauncher; }
47
+ get: function () { return chunk3IEYJIYJ_cjs.ChatLauncher; }
48
48
  });
49
49
  Object.defineProperty(exports, "ChatProvider", {
50
50
  enumerable: true,
51
- get: function () { return chunkJEPFGKHH_cjs.ChatProvider; }
51
+ get: function () { return chunk3IEYJIYJ_cjs.ChatProvider; }
52
52
  });
53
53
  Object.defineProperty(exports, "ChatWindow", {
54
54
  enumerable: true,
55
- get: function () { return chunkJEPFGKHH_cjs.ChatWindow; }
55
+ get: function () { return chunk3IEYJIYJ_cjs.ChatWindow; }
56
56
  });
57
57
  Object.defineProperty(exports, "Check", {
58
58
  enumerable: true,
59
- get: function () { return chunkJEPFGKHH_cjs.Check; }
59
+ get: function () { return chunk3IEYJIYJ_cjs.Check; }
60
60
  });
61
61
  Object.defineProperty(exports, "ChevronDown", {
62
62
  enumerable: true,
63
- get: function () { return chunkJEPFGKHH_cjs.ChevronDown; }
63
+ get: function () { return chunk3IEYJIYJ_cjs.ChevronDown; }
64
64
  });
65
65
  Object.defineProperty(exports, "Citations", {
66
66
  enumerable: true,
67
- get: function () { return chunkJEPFGKHH_cjs.Citations; }
67
+ get: function () { return chunk3IEYJIYJ_cjs.Citations; }
68
68
  });
69
69
  Object.defineProperty(exports, "Close", {
70
70
  enumerable: true,
71
- get: function () { return chunkJEPFGKHH_cjs.Close; }
71
+ get: function () { return chunk3IEYJIYJ_cjs.Close; }
72
72
  });
73
73
  Object.defineProperty(exports, "Copy", {
74
74
  enumerable: true,
75
- get: function () { return chunkJEPFGKHH_cjs.Copy; }
75
+ get: function () { return chunk3IEYJIYJ_cjs.Copy; }
76
+ });
77
+ Object.defineProperty(exports, "CopyButton", {
78
+ enumerable: true,
79
+ get: function () { return chunk3IEYJIYJ_cjs.CopyButton; }
76
80
  });
77
81
  Object.defineProperty(exports, "EntityBadge", {
78
82
  enumerable: true,
79
- get: function () { return chunkJEPFGKHH_cjs.EntityBadge; }
83
+ get: function () { return chunk3IEYJIYJ_cjs.EntityBadge; }
80
84
  });
81
85
  Object.defineProperty(exports, "EntitySelector", {
82
86
  enumerable: true,
83
- get: function () { return chunkJEPFGKHH_cjs.EntitySelector; }
87
+ get: function () { return chunk3IEYJIYJ_cjs.EntitySelector; }
84
88
  });
85
89
  Object.defineProperty(exports, "EventLog", {
86
90
  enumerable: true,
87
- get: function () { return chunkJEPFGKHH_cjs.EventLog; }
91
+ get: function () { return chunk3IEYJIYJ_cjs.EventLog; }
88
92
  });
89
93
  Object.defineProperty(exports, "Favicon", {
90
94
  enumerable: true,
91
- get: function () { return chunkJEPFGKHH_cjs.Favicon; }
95
+ get: function () { return chunk3IEYJIYJ_cjs.Favicon; }
92
96
  });
93
97
  Object.defineProperty(exports, "FileAudio", {
94
98
  enumerable: true,
95
- get: function () { return chunkJEPFGKHH_cjs.FileAudio; }
99
+ get: function () { return chunk3IEYJIYJ_cjs.FileAudio; }
96
100
  });
97
101
  Object.defineProperty(exports, "FileIcon", {
98
102
  enumerable: true,
99
- get: function () { return chunkJEPFGKHH_cjs.FileIcon; }
103
+ get: function () { return chunk3IEYJIYJ_cjs.FileIcon; }
100
104
  });
101
105
  Object.defineProperty(exports, "FilePreview", {
102
106
  enumerable: true,
103
- get: function () { return chunkJEPFGKHH_cjs.FilePreview; }
107
+ get: function () { return chunk3IEYJIYJ_cjs.FilePreview; }
104
108
  });
105
109
  Object.defineProperty(exports, "FileType", {
106
110
  enumerable: true,
107
- get: function () { return chunkJEPFGKHH_cjs.FileType; }
111
+ get: function () { return chunk3IEYJIYJ_cjs.FileType; }
108
112
  });
109
113
  Object.defineProperty(exports, "FileVideo", {
110
114
  enumerable: true,
111
- get: function () { return chunkJEPFGKHH_cjs.FileVideo; }
115
+ get: function () { return chunk3IEYJIYJ_cjs.FileVideo; }
112
116
  });
113
117
  Object.defineProperty(exports, "Followups", {
114
118
  enumerable: true,
115
- get: function () { return chunkJEPFGKHH_cjs.Followups; }
119
+ get: function () { return chunk3IEYJIYJ_cjs.Followups; }
116
120
  });
117
121
  Object.defineProperty(exports, "Globe", {
118
122
  enumerable: true,
119
- get: function () { return chunkJEPFGKHH_cjs.Globe; }
123
+ get: function () { return chunk3IEYJIYJ_cjs.Globe; }
120
124
  });
121
125
  Object.defineProperty(exports, "GridLoader", {
122
126
  enumerable: true,
123
- get: function () { return chunkJEPFGKHH_cjs.GridLoader; }
127
+ get: function () { return chunk3IEYJIYJ_cjs.GridLoader; }
124
128
  });
125
129
  Object.defineProperty(exports, "HoverPreview", {
126
130
  enumerable: true,
127
- get: function () { return chunkJEPFGKHH_cjs.HoverPreview; }
131
+ get: function () { return chunk3IEYJIYJ_cjs.HoverPreview; }
128
132
  });
129
133
  Object.defineProperty(exports, "HumanInput", {
130
134
  enumerable: true,
131
- get: function () { return chunkJEPFGKHH_cjs.HumanInput; }
135
+ get: function () { return chunk3IEYJIYJ_cjs.HumanInput; }
132
136
  });
133
137
  Object.defineProperty(exports, "LinkIcon", {
134
138
  enumerable: true,
135
- get: function () { return chunkJEPFGKHH_cjs.LinkIcon; }
139
+ get: function () { return chunk3IEYJIYJ_cjs.LinkIcon; }
136
140
  });
137
141
  Object.defineProperty(exports, "LinkPreviewCard", {
138
142
  enumerable: true,
139
- get: function () { return chunkJEPFGKHH_cjs.LinkPreviewCard; }
143
+ get: function () { return chunk3IEYJIYJ_cjs.LinkPreviewCard; }
140
144
  });
141
145
  Object.defineProperty(exports, "Markdown", {
142
146
  enumerable: true,
143
- get: function () { return chunkJEPFGKHH_cjs.Markdown; }
147
+ get: function () { return chunk3IEYJIYJ_cjs.Markdown; }
144
148
  });
145
149
  Object.defineProperty(exports, "MemberResponses", {
146
150
  enumerable: true,
147
- get: function () { return chunkJEPFGKHH_cjs.MemberResponses; }
151
+ get: function () { return chunk3IEYJIYJ_cjs.MemberResponses; }
148
152
  });
149
153
  Object.defineProperty(exports, "Memory", {
150
154
  enumerable: true,
151
- get: function () { return chunkJEPFGKHH_cjs.Memory; }
155
+ get: function () { return chunk3IEYJIYJ_cjs.Memory; }
152
156
  });
153
157
  Object.defineProperty(exports, "Message", {
154
158
  enumerable: true,
155
- get: function () { return chunkJEPFGKHH_cjs.Message; }
159
+ get: function () { return chunk3IEYJIYJ_cjs.Message; }
160
+ });
161
+ Object.defineProperty(exports, "MessageActions", {
162
+ enumerable: true,
163
+ get: function () { return chunk3IEYJIYJ_cjs.MessageActions; }
156
164
  });
157
165
  Object.defineProperty(exports, "MessageList", {
158
166
  enumerable: true,
159
- get: function () { return chunkJEPFGKHH_cjs.MessageList; }
167
+ get: function () { return chunk3IEYJIYJ_cjs.MessageList; }
160
168
  });
161
169
  Object.defineProperty(exports, "Multimedia", {
162
170
  enumerable: true,
163
- get: function () { return chunkJEPFGKHH_cjs.Multimedia; }
171
+ get: function () { return chunk3IEYJIYJ_cjs.Multimedia; }
164
172
  });
165
173
  Object.defineProperty(exports, "Paperclip", {
166
174
  enumerable: true,
167
- get: function () { return chunkJEPFGKHH_cjs.Paperclip; }
175
+ get: function () { return chunk3IEYJIYJ_cjs.Paperclip; }
168
176
  });
169
177
  Object.defineProperty(exports, "Plus", {
170
178
  enumerable: true,
171
- get: function () { return chunkJEPFGKHH_cjs.Plus; }
179
+ get: function () { return chunk3IEYJIYJ_cjs.Plus; }
172
180
  });
173
181
  Object.defineProperty(exports, "Pulse", {
174
182
  enumerable: true,
175
- get: function () { return chunkJEPFGKHH_cjs.Pulse; }
183
+ get: function () { return chunk3IEYJIYJ_cjs.Pulse; }
176
184
  });
177
185
  Object.defineProperty(exports, "QuickPrompts", {
178
186
  enumerable: true,
179
- get: function () { return chunkJEPFGKHH_cjs.QuickPrompts; }
187
+ get: function () { return chunk3IEYJIYJ_cjs.QuickPrompts; }
180
188
  });
181
189
  Object.defineProperty(exports, "Reasoning", {
182
190
  enumerable: true,
183
- get: function () { return chunkJEPFGKHH_cjs.Reasoning; }
191
+ get: function () { return chunk3IEYJIYJ_cjs.Reasoning; }
184
192
  });
185
193
  Object.defineProperty(exports, "Rerun", {
186
194
  enumerable: true,
187
- get: function () { return chunkJEPFGKHH_cjs.Rerun; }
195
+ get: function () { return chunk3IEYJIYJ_cjs.Rerun; }
188
196
  });
189
197
  Object.defineProperty(exports, "SessionList", {
190
198
  enumerable: true,
191
- get: function () { return chunkJEPFGKHH_cjs.SessionList; }
199
+ get: function () { return chunk3IEYJIYJ_cjs.SessionList; }
192
200
  });
193
201
  Object.defineProperty(exports, "SourceCard", {
194
202
  enumerable: true,
195
- get: function () { return chunkJEPFGKHH_cjs.SourceCard; }
203
+ get: function () { return chunk3IEYJIYJ_cjs.SourceCard; }
196
204
  });
197
205
  Object.defineProperty(exports, "SourcesProvider", {
198
206
  enumerable: true,
199
- get: function () { return chunkJEPFGKHH_cjs.SourcesProvider; }
207
+ get: function () { return chunk3IEYJIYJ_cjs.SourcesProvider; }
200
208
  });
201
209
  Object.defineProperty(exports, "Spinner", {
202
210
  enumerable: true,
203
- get: function () { return chunkJEPFGKHH_cjs.Spinner; }
211
+ get: function () { return chunk3IEYJIYJ_cjs.Spinner; }
204
212
  });
205
213
  Object.defineProperty(exports, "StatusIndicator", {
206
214
  enumerable: true,
207
- get: function () { return chunkJEPFGKHH_cjs.StatusIndicator; }
215
+ get: function () { return chunk3IEYJIYJ_cjs.StatusIndicator; }
208
216
  });
209
217
  Object.defineProperty(exports, "Stop", {
210
218
  enumerable: true,
211
- get: function () { return chunkJEPFGKHH_cjs.Stop; }
219
+ get: function () { return chunk3IEYJIYJ_cjs.Stop; }
212
220
  });
213
221
  Object.defineProperty(exports, "TeamGlyph", {
214
222
  enumerable: true,
215
- get: function () { return chunkJEPFGKHH_cjs.TeamGlyph; }
223
+ get: function () { return chunk3IEYJIYJ_cjs.TeamGlyph; }
216
224
  });
217
225
  Object.defineProperty(exports, "ToolCalls", {
218
226
  enumerable: true,
219
- get: function () { return chunkJEPFGKHH_cjs.ToolCalls; }
227
+ get: function () { return chunk3IEYJIYJ_cjs.ToolCalls; }
220
228
  });
221
229
  Object.defineProperty(exports, "Trash", {
222
230
  enumerable: true,
223
- get: function () { return chunkJEPFGKHH_cjs.Trash; }
231
+ get: function () { return chunk3IEYJIYJ_cjs.Trash; }
224
232
  });
225
233
  Object.defineProperty(exports, "WorkflowSteps", {
226
234
  enumerable: true,
227
- get: function () { return chunkJEPFGKHH_cjs.WorkflowSteps; }
235
+ get: function () { return chunk3IEYJIYJ_cjs.WorkflowSteps; }
228
236
  });
229
237
  Object.defineProperty(exports, "Wrench", {
230
238
  enumerable: true,
231
- get: function () { return chunkJEPFGKHH_cjs.Wrench; }
239
+ get: function () { return chunk3IEYJIYJ_cjs.Wrench; }
232
240
  });
233
241
  Object.defineProperty(exports, "admitFiles", {
234
242
  enumerable: true,
235
- get: function () { return chunkJEPFGKHH_cjs.admitFiles; }
243
+ get: function () { return chunk3IEYJIYJ_cjs.admitFiles; }
236
244
  });
237
245
  Object.defineProperty(exports, "behindTheScenesItems", {
238
246
  enumerable: true,
239
- get: function () { return chunkJEPFGKHH_cjs.behindTheScenesItems; }
247
+ get: function () { return chunk3IEYJIYJ_cjs.behindTheScenesItems; }
240
248
  });
241
249
  Object.defineProperty(exports, "behindTheScenesLabel", {
242
250
  enumerable: true,
243
- get: function () { return chunkJEPFGKHH_cjs.behindTheScenesLabel; }
251
+ get: function () { return chunk3IEYJIYJ_cjs.behindTheScenesLabel; }
244
252
  });
245
253
  Object.defineProperty(exports, "collectSources", {
246
254
  enumerable: true,
247
- get: function () { return chunkJEPFGKHH_cjs.collectSources; }
255
+ get: function () { return chunk3IEYJIYJ_cjs.collectSources; }
248
256
  });
249
257
  Object.defineProperty(exports, "displayUrl", {
250
258
  enumerable: true,
251
- get: function () { return chunkJEPFGKHH_cjs.displayUrl; }
259
+ get: function () { return chunk3IEYJIYJ_cjs.displayUrl; }
260
+ });
261
+ Object.defineProperty(exports, "faviconFallbacks", {
262
+ enumerable: true,
263
+ get: function () { return chunk3IEYJIYJ_cjs.faviconFallbacks; }
252
264
  });
253
265
  Object.defineProperty(exports, "faviconUrl", {
254
266
  enumerable: true,
255
- get: function () { return chunkJEPFGKHH_cjs.faviconUrl; }
267
+ get: function () { return chunk3IEYJIYJ_cjs.faviconUrl; }
256
268
  });
257
269
  Object.defineProperty(exports, "fileAccepted", {
258
270
  enumerable: true,
259
- get: function () { return chunkJEPFGKHH_cjs.fileAccepted; }
271
+ get: function () { return chunk3IEYJIYJ_cjs.fileAccepted; }
260
272
  });
261
273
  Object.defineProperty(exports, "getProviderIcon", {
262
274
  enumerable: true,
263
- get: function () { return chunkJEPFGKHH_cjs.getProviderIcon; }
275
+ get: function () { return chunk3IEYJIYJ_cjs.getProviderIcon; }
264
276
  });
265
277
  Object.defineProperty(exports, "hasBehindTheScenes", {
266
278
  enumerable: true,
267
- get: function () { return chunkJEPFGKHH_cjs.hasBehindTheScenes; }
279
+ get: function () { return chunk3IEYJIYJ_cjs.hasBehindTheScenes; }
268
280
  });
269
281
  Object.defineProperty(exports, "linkCitations", {
270
282
  enumerable: true,
271
- get: function () { return chunkJEPFGKHH_cjs.linkCitations; }
283
+ get: function () { return chunk3IEYJIYJ_cjs.linkCitations; }
272
284
  });
273
285
  Object.defineProperty(exports, "normalizeFollowups", {
274
286
  enumerable: true,
275
- get: function () { return chunkJEPFGKHH_cjs.normalizeFollowups; }
287
+ get: function () { return chunk3IEYJIYJ_cjs.normalizeFollowups; }
276
288
  });
277
289
  Object.defineProperty(exports, "quickPromptLabel", {
278
290
  enumerable: true,
279
- get: function () { return chunkJEPFGKHH_cjs.quickPromptLabel; }
291
+ get: function () { return chunk3IEYJIYJ_cjs.quickPromptLabel; }
280
292
  });
281
293
  Object.defineProperty(exports, "quickPromptText", {
282
294
  enumerable: true,
283
- get: function () { return chunkJEPFGKHH_cjs.quickPromptText; }
295
+ get: function () { return chunk3IEYJIYJ_cjs.quickPromptText; }
284
296
  });
285
297
  Object.defineProperty(exports, "sourceHost", {
286
298
  enumerable: true,
287
- get: function () { return chunkJEPFGKHH_cjs.sourceHost; }
299
+ get: function () { return chunk3IEYJIYJ_cjs.sourceHost; }
288
300
  });
289
301
  Object.defineProperty(exports, "sourcesFromMarkdown", {
290
302
  enumerable: true,
291
- get: function () { return chunkJEPFGKHH_cjs.sourcesFromMarkdown; }
303
+ get: function () { return chunk3IEYJIYJ_cjs.sourcesFromMarkdown; }
292
304
  });
293
305
  Object.defineProperty(exports, "useAgnoChat", {
294
306
  enumerable: true,
295
- get: function () { return chunkJEPFGKHH_cjs.useAgnoChat; }
307
+ get: function () { return chunk3IEYJIYJ_cjs.useAgnoChat; }
296
308
  });
297
309
  Object.defineProperty(exports, "useChatContext", {
298
310
  enumerable: true,
299
- get: function () { return chunkJEPFGKHH_cjs.useChatContext; }
311
+ get: function () { return chunk3IEYJIYJ_cjs.useChatContext; }
300
312
  });
301
313
  Object.defineProperty(exports, "useLinkComponent", {
302
314
  enumerable: true,
303
- get: function () { return chunkJEPFGKHH_cjs.useLinkComponent; }
315
+ get: function () { return chunk3IEYJIYJ_cjs.useLinkComponent; }
304
316
  });
305
317
  Object.defineProperty(exports, "useLinkPreview", {
306
318
  enumerable: true,
307
- get: function () { return chunkJEPFGKHH_cjs.useLinkPreview; }
319
+ get: function () { return chunk3IEYJIYJ_cjs.useLinkPreview; }
308
320
  });
309
321
  Object.defineProperty(exports, "useOptionalChatContext", {
310
322
  enumerable: true,
311
- get: function () { return chunkJEPFGKHH_cjs.useOptionalChatContext; }
323
+ get: function () { return chunk3IEYJIYJ_cjs.useOptionalChatContext; }
312
324
  });
313
325
  Object.defineProperty(exports, "useResolvedChat", {
314
326
  enumerable: true,
315
- get: function () { return chunkJEPFGKHH_cjs.useResolvedChat; }
327
+ get: function () { return chunk3IEYJIYJ_cjs.useResolvedChat; }
316
328
  });
317
329
  Object.defineProperty(exports, "useResolvedClassNames", {
318
330
  enumerable: true,
319
- get: function () { return chunkJEPFGKHH_cjs.useResolvedClassNames; }
331
+ get: function () { return chunk3IEYJIYJ_cjs.useResolvedClassNames; }
320
332
  });
321
333
  Object.defineProperty(exports, "useSources", {
322
334
  enumerable: true,
323
- get: function () { return chunkJEPFGKHH_cjs.useSources; }
335
+ get: function () { return chunk3IEYJIYJ_cjs.useSources; }
324
336
  });
325
337
  Object.defineProperty(exports, "withoutSourcesLine", {
326
338
  enumerable: true,
327
- get: function () { return chunkJEPFGKHH_cjs.withoutSourcesLine; }
339
+ get: function () { return chunk3IEYJIYJ_cjs.withoutSourcesLine; }
328
340
  });
329
341
  Object.defineProperty(exports, "writeClipboard", {
330
342
  enumerable: true,
331
- get: function () { return chunkJEPFGKHH_cjs.writeClipboard; }
343
+ get: function () { return chunk3IEYJIYJ_cjs.writeClipboard; }
332
344
  });
333
345
  //# sourceMappingURL=index.cjs.map
334
346
  //# sourceMappingURL=index.cjs.map
@@ -148,6 +148,10 @@ interface ChatClassNames {
148
148
  markdown?: string;
149
149
  /** "Working…" line shown while streaming with no content yet. */
150
150
  activity?: string;
151
+ /** `<MessageActions>` — the icon row under a finished answer. */
152
+ messageActions?: string;
153
+ /** The copy button in that row. */
154
+ messageCopyButton?: string;
151
155
  /** `<ChatInput>` wrapper. */
152
156
  input?: string;
153
157
  /** Row holding attach / textarea / send. */
@@ -291,8 +295,12 @@ declare function sourceHost(url?: string): string | undefined;
291
295
  /**
292
296
  * The site's own icon. Same-origin to the site being cited, so no third-party
293
297
  * favicon service is involved and nothing is requested until a card renders.
298
+ * `/favicon.ico` by convention; `/favicon.svg` is the next guess, for sites
299
+ * that only declare an SVG icon (see `faviconFallbacks`).
294
300
  */
295
301
  declare function faviconUrl(url?: string): string | undefined;
302
+ /** Every same-origin icon path worth trying, in order. Empty for a bad URL. */
303
+ declare function faviconFallbacks(url?: string): string[];
296
304
  /** `docs.agno.com/introduction` — the host plus a trimmed path, for card chrome. */
297
305
  declare function displayUrl(url?: string): string | undefined;
298
306
  /**
@@ -356,6 +364,36 @@ declare const SourcesProvider: React$1.Provider<Source[]>;
356
364
  /** The sources of the surrounding message; empty outside one. */
357
365
  declare function useSources(): Source[];
358
366
 
367
+ /**
368
+ * The copy control — one component wherever something can be copied: the
369
+ * header of a fenced code block, the action row under an answer, a host's own
370
+ * surface. It owns the "copied" flash and the clipboard fallbacks, so every
371
+ * copy affordance in a transcript behaves the same way.
372
+ */
373
+
374
+ /**
375
+ * Copy text, by whichever route the browser allows.
376
+ *
377
+ * The async Clipboard API is the right one, but it rejects on an insecure
378
+ * origin and whenever the document isn't focused — so a selection-based copy
379
+ * stands behind it. Returns whether anything was actually copied: the button
380
+ * should not claim success it didn't have.
381
+ *
382
+ * Exported because a host building its own copy affordance wants the same
383
+ * fallbacks, and because the failure paths are worth testing.
384
+ */
385
+ declare function writeClipboard(text: string): Promise<boolean>;
386
+ interface CopyButtonProps {
387
+ /** What to copy — a string, or a function for text that is costly to build. */
388
+ text: string | (() => string);
389
+ /** Accessible name and tooltip. Defaults to "Copy". */
390
+ label?: string;
391
+ /** Icon size, in px. */
392
+ size?: number;
393
+ className?: string;
394
+ }
395
+ declare function CopyButton({ text, label, size, className }: CopyButtonProps): React$1.ReactElement;
396
+
359
397
  /**
360
398
  * Markdown for a chat transcript, rendered by [Streamdown](https://streamdown.ai).
361
399
  *
@@ -399,18 +437,6 @@ interface MarkdownProps {
399
437
  /** Escape hatch onto Streamdown itself — anything not set here. */
400
438
  options?: Omit<StreamdownProps, 'children' | 'className' | 'components'>;
401
439
  }
402
- /**
403
- * Copy text, by whichever route the browser allows.
404
- *
405
- * The async Clipboard API is the right one, but it rejects on an insecure
406
- * origin and whenever the document isn't focused — so a selection-based copy
407
- * stands behind it. Returns whether anything was actually copied: the button
408
- * should not claim success it didn't have.
409
- *
410
- * Exported because a host building its own copy affordance wants the same
411
- * fallbacks, and because the failure paths are worth testing.
412
- */
413
- declare function writeClipboard(text: string): Promise<boolean>;
414
440
  declare function Markdown({ content, className, sources, streaming, codeCopy, linkComponent, options, }: MarkdownProps): React$1.ReactElement;
415
441
  type RenderMarkdown = (content: string) => React$1.ReactNode;
416
442
 
@@ -778,6 +804,10 @@ interface MessageProps {
778
804
  hideTools?: boolean;
779
805
  /** Hide the sources block under the answer. */
780
806
  hideSources?: boolean;
807
+ /** Hide the action row (copy, and whatever `actions` adds) under the answer. */
808
+ hideActions?: boolean;
809
+ /** More actions for the row, after copy — regenerate, feedback, and so on. */
810
+ actions?: React$1.ReactNode;
781
811
  /**
782
812
  * Render the "Related questions" the agent suggested under this message,
783
813
  * sending the clicked one here. Off by default: `<ChatWindow>` pins them
@@ -791,7 +821,26 @@ interface MessageProps {
791
821
  className?: string;
792
822
  classNames?: ChatClassNames;
793
823
  }
794
- declare function Message({ message, renderMarkdown, activity, avatar, children, className, classNames, entityType, userInitials, hideReasoning, hideTools, hideSources, onFollowup, }: MessageProps): React$1.ReactElement;
824
+ declare function Message({ message, renderMarkdown, activity, avatar, children, className, classNames, entityType, userInitials, hideReasoning, hideTools, hideSources, hideActions, actions, onFollowup, }: MessageProps): React$1.ReactElement;
825
+
826
+ /**
827
+ * The action row under a finished answer — the Figma `_Chat messages/Actions`
828
+ * strip: small icon buttons in a line, copy first. The package ships copy;
829
+ * anything a product adds (regenerate, feedback, "view JSON") goes in as
830
+ * children and lines up with it.
831
+ */
832
+
833
+ interface MessageActionsProps {
834
+ /** The message the actions apply to; copy takes its content. */
835
+ message: ChatMessage;
836
+ /** Leave the copy button out (a host that copies differently). */
837
+ hideCopy?: boolean;
838
+ /** More actions, rendered after copy. */
839
+ children?: React$1.ReactNode;
840
+ className?: string;
841
+ classNames?: ChatClassNames;
842
+ }
843
+ declare function MessageActions({ message, hideCopy, children, className, classNames, }: MessageActionsProps): React$1.ReactElement | null;
795
844
 
796
845
  /**
797
846
  * The AgentOS chat dock: a rounded card holding an auto-growing textarea and a
@@ -1106,7 +1155,10 @@ declare function useLinkPreview(url: string | undefined, enabled: boolean): {
1106
1155
  preview: LinkPreview | null;
1107
1156
  loading: boolean;
1108
1157
  };
1109
- /** The site's icon, falling back to a glyph when the origin serves none. */
1158
+ /**
1159
+ * The site's icon: `/favicon.ico`, then `/favicon.svg`, then a glyph when the
1160
+ * origin serves neither.
1161
+ */
1110
1162
  declare function Favicon({ url, kind, size, className, }: {
1111
1163
  url?: string;
1112
1164
  kind?: Source['kind'];
@@ -1321,8 +1373,11 @@ declare const Pulse: ({ size, className }: IconProps) => React$1.ReactElement;
1321
1373
  declare const Trash: ({ size, className }: IconProps) => React$1.ReactElement;
1322
1374
  declare const ChatBubble: ({ size, className }: IconProps) => React$1.ReactElement;
1323
1375
  declare const Spinner: ({ size, className }: IconProps) => React$1.ReactElement;
1324
- /** The stop control is a filled square, not an outline. */
1325
- declare function Stop({ size, className }: IconProps): React$1.ReactElement;
1376
+ /**
1377
+ * The stop control: AgentOS's `square-stop`, a small outlined square in the
1378
+ * same button the arrow sends from — 10.67px in a 32px or 24px button.
1379
+ */
1380
+ declare const Stop: ({ size, className }: IconProps) => React$1.ReactElement;
1326
1381
  /** The Agno mark — used as the agent avatar, exactly as in AgentOS. */
1327
1382
  declare function AgnoMark({ size, className }: IconProps): React$1.ReactElement;
1328
1383
  /** The AgentOS `team` glyph, drawn in the current colour. */
@@ -1332,4 +1387,4 @@ declare function GridLoader({ className }: {
1332
1387
  className?: string;
1333
1388
  }): React$1.ReactElement;
1334
1389
 
1335
- export { AgnoChat, type AgnoChatProps, AgnoMark, ArrowUp, BehindTheScenes, type BehindTheScenesProps, BookOpen, Box, Brain, ChatBubble, type ChatClassNames, type ChatContextValue, ChatInput, type ChatInputProps, ChatLauncher, type ChatLauncherProps, ChatProvider, type ChatProviderProps, type ChatTextareaProps, ChatWindow, type ChatWindowProps, Check, ChevronDown, Citations, type CitationsProps, Close, Copy, EntityBadge, type EntityBadgeProps, EntitySelector, EventLog, Favicon, FileAudio, FileIcon, type FileLimits, FilePreview, type FilePreviewProps, FileType, FileVideo, Followups, type FollowupsProps, Globe, GridLoader, HoverPreview, type HoverPreviewProps, HumanInput, type HumanInputProps, type LauncherPanel, type LauncherPosition, type LinkComponent, LinkIcon, type LinkPreview, LinkPreviewCard, type LinkPreviewCardProps, Markdown, type MarkdownProps, MemberResponses, Memory, Message, MessageList, type MessageListProps, type MessageProps, Multimedia, Paperclip, Plus, Pulse, type QuickPrompt, QuickPrompts, type QuickPromptsProps, Reasoning, type RenderMarkdown, Rerun, type ResolveLinkPreview, type SendOptions, SessionList, type SessionListProps, type Source, SourceCard, SourcesProvider, Spinner, StatusIndicator, Stop, TeamGlyph, ToolCalls, Trash, type UseAgnoChat, type UseAgnoChatOptions, WorkflowSteps, Wrench, admitFiles, behindTheScenesItems, behindTheScenesLabel, collectSources, displayUrl, faviconUrl, fileAccepted, getProviderIcon, hasBehindTheScenes, linkCitations, normalizeFollowups, quickPromptLabel, quickPromptText, sourceHost, sourcesFromMarkdown, useAgnoChat, useChatContext, useLinkComponent, useLinkPreview, useOptionalChatContext, useResolvedChat, useResolvedClassNames, useSources, withoutSourcesLine, writeClipboard };
1390
+ export { AgnoChat, type AgnoChatProps, AgnoMark, ArrowUp, BehindTheScenes, type BehindTheScenesProps, BookOpen, Box, Brain, ChatBubble, type ChatClassNames, type ChatContextValue, ChatInput, type ChatInputProps, ChatLauncher, type ChatLauncherProps, ChatProvider, type ChatProviderProps, type ChatTextareaProps, ChatWindow, type ChatWindowProps, Check, ChevronDown, Citations, type CitationsProps, Close, Copy, CopyButton, type CopyButtonProps, EntityBadge, type EntityBadgeProps, EntitySelector, EventLog, Favicon, FileAudio, FileIcon, type FileLimits, FilePreview, type FilePreviewProps, FileType, FileVideo, Followups, type FollowupsProps, Globe, GridLoader, HoverPreview, type HoverPreviewProps, HumanInput, type HumanInputProps, type LauncherPanel, type LauncherPosition, type LinkComponent, LinkIcon, type LinkPreview, LinkPreviewCard, type LinkPreviewCardProps, Markdown, type MarkdownProps, MemberResponses, Memory, Message, MessageActions, type MessageActionsProps, MessageList, type MessageListProps, type MessageProps, Multimedia, Paperclip, Plus, Pulse, type QuickPrompt, QuickPrompts, type QuickPromptsProps, Reasoning, type RenderMarkdown, Rerun, type ResolveLinkPreview, type SendOptions, SessionList, type SessionListProps, type Source, SourceCard, SourcesProvider, Spinner, StatusIndicator, Stop, TeamGlyph, ToolCalls, Trash, type UseAgnoChat, type UseAgnoChatOptions, WorkflowSteps, Wrench, admitFiles, behindTheScenesItems, behindTheScenesLabel, collectSources, displayUrl, faviconFallbacks, faviconUrl, fileAccepted, getProviderIcon, hasBehindTheScenes, linkCitations, normalizeFollowups, quickPromptLabel, quickPromptText, sourceHost, sourcesFromMarkdown, useAgnoChat, useChatContext, useLinkComponent, useLinkPreview, useOptionalChatContext, useResolvedChat, useResolvedClassNames, useSources, withoutSourcesLine, writeClipboard };