@agents24/chat-react 0.5.0 → 0.5.2

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 (133) hide show
  1. package/README.md +90 -21
  2. package/compatibility.json +10 -10
  3. package/dist/chunk-SSUO4EPD.js +189 -0
  4. package/dist/chunk-SSUO4EPD.js.map +1 -0
  5. package/dist/chunk-ZCNHLFRB.js +108 -0
  6. package/dist/chunk-ZCNHLFRB.js.map +1 -0
  7. package/dist/index.cjs +112 -95
  8. package/dist/index.cjs.map +1 -1
  9. package/dist/index.d.ts +0 -1
  10. package/dist/index.js +362 -68
  11. package/dist/index.js.map +1 -1
  12. package/dist/mcp-oauth.d.ts +13 -0
  13. package/dist/runtime/index.cjs +594 -0
  14. package/dist/runtime/index.cjs.map +1 -0
  15. package/dist/runtime/index.d.ts +2 -0
  16. package/dist/runtime/index.js +458 -0
  17. package/dist/runtime/index.js.map +1 -0
  18. package/dist/runtime/input-contract.d.ts +20 -0
  19. package/dist/runtime/use-agent-chat-runtime.d.ts +83 -0
  20. package/dist/scaffold/app.d.ts +30 -0
  21. package/dist/scaffold/components/chat/chat-composer.d.ts +21 -0
  22. package/dist/scaffold/components/chat/chat-message.d.ts +21 -0
  23. package/dist/scaffold/components/chat/chat-shell.d.ts +8 -0
  24. package/dist/scaffold/components/chat/collapsible-user-message.d.ts +3 -0
  25. package/dist/scaffold/components/chat/external-link-dialog.d.ts +2 -0
  26. package/dist/scaffold/components/chat/identity-control.d.ts +4 -0
  27. package/dist/scaffold/components/chat/message-parts.d.ts +12 -0
  28. package/dist/scaffold/components/chat/theme-menu.d.ts +1 -0
  29. package/dist/scaffold/components/chat/thread-sidebar.d.ts +16 -0
  30. package/dist/scaffold/components/chat/timeline-loading.d.ts +7 -0
  31. package/dist/scaffold/components/chat/turn-outline.d.ts +4 -0
  32. package/dist/scaffold/components/theme-provider.d.ts +20 -0
  33. package/dist/scaffold/components/ui/attachment.d.ts +24 -0
  34. package/dist/scaffold/components/ui/bubble.d.ts +17 -0
  35. package/dist/scaffold/components/ui/button-group.d.ts +11 -0
  36. package/dist/scaffold/components/ui/button.d.ts +10 -0
  37. package/dist/scaffold/components/ui/dialog.d.ts +17 -0
  38. package/dist/scaffold/components/ui/dropdown-menu.d.ts +29 -0
  39. package/dist/scaffold/components/ui/input.d.ts +3 -0
  40. package/dist/scaffold/components/ui/marker.d.ts +11 -0
  41. package/dist/scaffold/components/ui/message-scroller.d.ts +10 -0
  42. package/dist/scaffold/components/ui/message.d.ts +10 -0
  43. package/dist/scaffold/components/ui/popover.d.ts +6 -0
  44. package/dist/scaffold/components/ui/select.d.ts +8 -0
  45. package/dist/scaffold/components/ui/separator.d.ts +4 -0
  46. package/dist/scaffold/components/ui/sheet.d.ts +14 -0
  47. package/dist/scaffold/components/ui/sidebar.d.ts +69 -0
  48. package/dist/scaffold/components/ui/skeleton.d.ts +2 -0
  49. package/dist/scaffold/components/ui/textarea.d.ts +3 -0
  50. package/dist/scaffold/components/ui/tooltip.d.ts +15 -0
  51. package/dist/scaffold/hooks/use-mobile.d.ts +1 -0
  52. package/dist/scaffold/identity.d.ts +10 -0
  53. package/dist/scaffold/index.cjs +2270 -0
  54. package/dist/scaffold/index.cjs.map +1 -0
  55. package/dist/scaffold/index.d.ts +14 -0
  56. package/dist/scaffold/index.js +2244 -0
  57. package/dist/scaffold/index.js.map +1 -0
  58. package/dist/scaffold/lib/utils.d.ts +2 -0
  59. package/dist/styles.css +137 -378
  60. package/dist/types.d.ts +3 -13
  61. package/dist/ui/adapters.d.ts +1 -1
  62. package/dist/ui/agent-chat-actions.d.ts +12 -5
  63. package/dist/ui/agent-chat-composer.d.ts +2 -1
  64. package/dist/ui/agent-chat-context-compression-row.d.ts +5 -0
  65. package/dist/ui/agent-chat-context-status.d.ts +13 -0
  66. package/dist/ui/agent-chat-message.d.ts +7 -5
  67. package/dist/ui/agent-response-timeline.d.ts +29 -7
  68. package/dist/ui/ask-user-interaction-state.d.ts +20 -0
  69. package/dist/ui/ask-user-interaction.d.ts +8 -0
  70. package/dist/ui/index.cjs +1391 -271
  71. package/dist/ui/index.cjs.map +1 -1
  72. package/dist/ui/index.d.ts +5 -0
  73. package/dist/ui/index.js +2380 -65
  74. package/dist/ui/index.js.map +1 -1
  75. package/dist/ui/tool-sessions.d.ts +70 -0
  76. package/dist/ui/use-audio-recorder.d.ts +8 -0
  77. package/package.json +27 -12
  78. package/scaffold/components.json +25 -0
  79. package/scaffold/manifest.json +28 -0
  80. package/scaffold/src/app.tsx +71 -0
  81. package/scaffold/src/chat.css +54 -0
  82. package/scaffold/src/components/chat/chat-composer.tsx +237 -0
  83. package/scaffold/src/components/chat/chat-message.tsx +76 -0
  84. package/scaffold/src/components/chat/chat-shell.tsx +257 -0
  85. package/scaffold/src/components/chat/collapsible-user-message.tsx +37 -0
  86. package/scaffold/src/components/chat/external-link-dialog.tsx +48 -0
  87. package/scaffold/src/components/chat/identity-control.tsx +69 -0
  88. package/scaffold/src/components/chat/message-parts.tsx +83 -0
  89. package/scaffold/src/components/chat/theme-menu.tsx +79 -0
  90. package/scaffold/src/components/chat/thread-sidebar.tsx +114 -0
  91. package/scaffold/src/components/chat/timeline-loading.ts +17 -0
  92. package/scaffold/src/components/chat/turn-outline.tsx +73 -0
  93. package/scaffold/src/components/theme-provider.tsx +91 -0
  94. package/scaffold/src/components/ui/attachment.tsx +204 -0
  95. package/scaffold/src/components/ui/bubble.tsx +125 -0
  96. package/scaffold/src/components/ui/button-group.tsx +83 -0
  97. package/scaffold/src/components/ui/button.tsx +65 -0
  98. package/scaffold/src/components/ui/dialog.tsx +171 -0
  99. package/scaffold/src/components/ui/dropdown-menu.tsx +271 -0
  100. package/scaffold/src/components/ui/input.tsx +19 -0
  101. package/scaffold/src/components/ui/marker.tsx +69 -0
  102. package/scaffold/src/components/ui/message-scroller.tsx +129 -0
  103. package/scaffold/src/components/ui/message.tsx +92 -0
  104. package/scaffold/src/components/ui/popover.tsx +40 -0
  105. package/scaffold/src/components/ui/select.tsx +92 -0
  106. package/scaffold/src/components/ui/separator.tsx +28 -0
  107. package/scaffold/src/components/ui/sheet.tsx +150 -0
  108. package/scaffold/src/components/ui/sidebar.tsx +677 -0
  109. package/scaffold/src/components/ui/skeleton.tsx +13 -0
  110. package/scaffold/src/components/ui/textarea.tsx +18 -0
  111. package/scaffold/src/components/ui/tooltip.tsx +56 -0
  112. package/scaffold/src/hooks/use-mobile.ts +24 -0
  113. package/scaffold/src/identity.ts +17 -0
  114. package/scaffold/src/index.css +222 -0
  115. package/scaffold/src/index.tsx +39 -0
  116. package/scaffold/src/lib/utils.ts +6 -0
  117. package/scaffold/styles.css +3 -0
  118. package/dist/chunk-CHAU7FNW.js +0 -140
  119. package/dist/chunk-CHAU7FNW.js.map +0 -1
  120. package/dist/chunk-LI67M74F.js +0 -445
  121. package/dist/chunk-LI67M74F.js.map +0 -1
  122. package/dist/chunk-R7WFL3YR.js +0 -1327
  123. package/dist/chunk-R7WFL3YR.js.map +0 -1
  124. package/dist/renderers.d.ts +0 -10
  125. package/dist/templates/agent-chat-app.d.ts +0 -18
  126. package/dist/templates/agent-chat-layout.d.ts +0 -77
  127. package/dist/templates/agent-chat-shell.d.ts +0 -37
  128. package/dist/templates/appearance-control.d.ts +0 -5
  129. package/dist/templates/index.cjs +0 -2600
  130. package/dist/templates/index.cjs.map +0 -1
  131. package/dist/templates/index.d.ts +0 -4
  132. package/dist/templates/index.js +0 -846
  133. package/dist/templates/index.js.map +0 -1
package/dist/index.js CHANGED
@@ -1,81 +1,374 @@
1
- import {
2
- LatestThreadScroller,
3
- LatestThreadScrollerButton,
4
- LatestThreadScrollerContent,
5
- LatestThreadScrollerItem,
6
- LatestThreadScrollerOutline,
7
- LatestThreadScrollerProvider,
8
- LatestThreadScrollerRoot,
9
- LatestThreadScrollerViewport,
10
- validateMcpCallbackResult,
11
- waitForMcpOauthComplete
12
- } from "./chunk-LI67M74F.js";
13
1
  import {
14
2
  getActiveStreamingTextPartId,
15
3
  isActiveStreamingTextPart,
16
4
  useStreamingText
17
- } from "./chunk-CHAU7FNW.js";
5
+ } from "./chunk-SSUO4EPD.js";
6
+ import {
7
+ browserChatCrypto,
8
+ createMcpPkceProof,
9
+ validateMcpCallbackResult,
10
+ waitForMcpOauthComplete
11
+ } from "./chunk-ZCNHLFRB.js";
18
12
 
19
- // src/renderers.tsx
20
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
21
- var DefaultToolPart = ({ part }) => {
22
- const label = typeof part.presentation?.activity === "string" ? part.presentation.activity : typeof part.presentation?.title === "string" ? part.presentation.title : part.toolName;
23
- const detail = typeof part.presentation?.detail === "string" ? part.presentation.detail : part.errorText || part.state;
24
- return /* @__PURE__ */ jsxs("div", { "data-agents24-tool-part": part.type, "data-state": part.state, children: [
25
- /* @__PURE__ */ jsx("div", { children: label }),
26
- detail ? /* @__PURE__ */ jsx("div", { children: detail }) : null
27
- ] });
28
- };
29
- var DefaultChatPart = ({
30
- part,
31
- message,
32
- renderOptions
33
- }) => {
34
- if (renderOptions?.renderPart) {
35
- return /* @__PURE__ */ jsx(Fragment, { children: renderOptions.renderPart(part, message) });
36
- }
37
- if (part.kind === "text") return /* @__PURE__ */ jsx(Fragment, { children: part.text });
38
- if (part.kind === "tool") {
39
- const ToolRenderer = renderOptions?.toolRenderers?.[part.type] || renderOptions?.fallbackToolRenderer || DefaultToolPart;
40
- return /* @__PURE__ */ jsx(Fragment, { children: ToolRenderer({ part, message }) });
41
- }
42
- if (part.kind === "reasoning") {
43
- return /* @__PURE__ */ jsx("div", { "data-agents24-reasoning-part": true, children: part.text || part.label });
44
- }
45
- if (part.kind === "ui-blocks") {
46
- return /* @__PURE__ */ jsx("div", { "data-agents24-ui-blocks-part": true, "data-state": part.state });
47
- }
48
- if (part.kind === "hitl") {
49
- return /* @__PURE__ */ jsx("div", { "data-agents24-hitl-part": part.interruptId || "" });
50
- }
51
- if (part.kind === "error") {
52
- return /* @__PURE__ */ jsx("div", { "data-agents24-error-part": true, children: part.errorText });
13
+ // src/latest-thread-scroller.tsx
14
+ import * as React from "react";
15
+ import {
16
+ MessageScroller,
17
+ useMessageScroller,
18
+ useMessageScrollerVisibility
19
+ } from "@shadcn/react/message-scroller";
20
+ import { jsx, jsxs } from "react/jsx-runtime";
21
+ var cx = (...values) => values.filter(Boolean).join(" ");
22
+ var LatestThreadScrollerLayoutContext = React.createContext(null);
23
+ var useLatestThreadScrollerLayout = () => React.useContext(LatestThreadScrollerLayoutContext);
24
+ function LatestThreadScrollerProvider({
25
+ autoScroll = true,
26
+ defaultScrollPosition = "last-anchor",
27
+ scrollPreviousItemPeek = 64,
28
+ ...props
29
+ }) {
30
+ return /* @__PURE__ */ jsx(
31
+ MessageScroller.Provider,
32
+ {
33
+ autoScroll,
34
+ defaultScrollPosition,
35
+ scrollPreviousItemPeek,
36
+ ...props
37
+ }
38
+ );
39
+ }
40
+ function LatestThreadScrollerRoot({
41
+ className,
42
+ ref,
43
+ ...props
44
+ }) {
45
+ const [rootElement, setRootElement] = React.useState(null);
46
+ const [contentElement, setContentElement] = React.useState(null);
47
+ const layoutContext = React.useMemo(
48
+ () => ({
49
+ contentElement,
50
+ rootElement,
51
+ setContentElement,
52
+ setRootElement
53
+ }),
54
+ [contentElement, rootElement]
55
+ );
56
+ const setRef = React.useCallback(
57
+ (node) => {
58
+ setRootElement(node);
59
+ if (typeof ref === "function") {
60
+ ref(node);
61
+ } else if (ref) {
62
+ ref.current = node;
63
+ }
64
+ },
65
+ [ref]
66
+ );
67
+ return /* @__PURE__ */ jsx(LatestThreadScrollerLayoutContext.Provider, { value: layoutContext, children: /* @__PURE__ */ jsx(
68
+ MessageScroller.Root,
69
+ {
70
+ ref: setRef,
71
+ className: cx(
72
+ "a24-scroller relative flex size-full min-h-0 flex-1 flex-col overflow-hidden",
73
+ className
74
+ ),
75
+ ...props
76
+ }
77
+ ) });
78
+ }
79
+ function LatestThreadScrollerViewport({
80
+ className,
81
+ onViewportChange,
82
+ preserveScrollOnPrepend = true,
83
+ ref,
84
+ ...props
85
+ }) {
86
+ const setRef = React.useCallback(
87
+ (node) => {
88
+ if (typeof ref === "function") {
89
+ ref(node);
90
+ } else if (ref) {
91
+ ref.current = node;
92
+ }
93
+ onViewportChange?.(node);
94
+ },
95
+ [onViewportChange, ref]
96
+ );
97
+ return /* @__PURE__ */ jsx(
98
+ MessageScroller.Viewport,
99
+ {
100
+ ref: setRef,
101
+ className: cx(
102
+ "a24-scroller__viewport size-full min-h-0 min-w-0 flex-1 overflow-y-auto overscroll-contain",
103
+ className
104
+ ),
105
+ preserveScrollOnPrepend,
106
+ ...props
107
+ }
108
+ );
109
+ }
110
+ function LatestThreadScrollerContent({
111
+ className,
112
+ ref,
113
+ ...props
114
+ }) {
115
+ const layout = useLatestThreadScrollerLayout();
116
+ const setRef = React.useCallback(
117
+ (node) => {
118
+ layout?.setContentElement(node);
119
+ if (typeof ref === "function") {
120
+ ref(node);
121
+ } else if (ref) {
122
+ ref.current = node;
123
+ }
124
+ },
125
+ [layout, ref]
126
+ );
127
+ return /* @__PURE__ */ jsx(
128
+ MessageScroller.Content,
129
+ {
130
+ ref: setRef,
131
+ "data-agents24-latest-thread-content": "",
132
+ className: cx("a24-scroller__content flex h-max min-h-full flex-col gap-8 p-4", className),
133
+ ...props
134
+ }
135
+ );
136
+ }
137
+ function LatestThreadScrollerItem({
138
+ className,
139
+ messageId,
140
+ ...props
141
+ }) {
142
+ return /* @__PURE__ */ jsx(
143
+ MessageScroller.Item,
144
+ {
145
+ className: cx(
146
+ "a24-scroller__item min-w-0 shrink-0 overflow-visible",
147
+ className
148
+ ),
149
+ messageId,
150
+ ...props
151
+ }
152
+ );
153
+ }
154
+ function LatestThreadScrollerButton({
155
+ children,
156
+ className,
157
+ direction = "end",
158
+ render,
159
+ ...props
160
+ }) {
161
+ if (render) {
162
+ return /* @__PURE__ */ jsx(
163
+ MessageScroller.Button,
164
+ {
165
+ direction,
166
+ render,
167
+ ...props
168
+ }
169
+ );
53
170
  }
54
- if (part.kind === "data") {
55
- return /* @__PURE__ */ jsx("div", { "data-agents24-data-part": part.name });
171
+ return /* @__PURE__ */ jsx(
172
+ MessageScroller.Button,
173
+ {
174
+ direction,
175
+ render: (buttonProps) => /* @__PURE__ */ jsx(
176
+ "button",
177
+ {
178
+ ...buttonProps,
179
+ "aria-label": direction === "end" ? "Scroll to latest message" : "Scroll to first message",
180
+ className: cx(
181
+ "a24-scroller__button absolute bottom-4 left-1/2 z-50 flex size-9 -translate-x-1/2 items-center justify-center rounded-full border border-border bg-background text-foreground shadow-md transition-[background-color,border-color,color,opacity,transform] duration-200 data-[active=false]:pointer-events-none data-[active=false]:translate-y-2 data-[active=false]:opacity-0 data-[active=true]:translate-y-0 data-[active=true]:opacity-100",
182
+ className
183
+ ),
184
+ type: "button",
185
+ children: children ?? (direction === "end" ? "\u2193" : "\u2191")
186
+ }
187
+ ),
188
+ ...props
189
+ }
190
+ );
191
+ }
192
+ function LatestThreadScrollerOutline({
193
+ cardClassName,
194
+ className,
195
+ contentMaxWidth = 768,
196
+ dir = "ltr",
197
+ items,
198
+ minContainerWidthForRail = 0,
199
+ minSideGutterForRail = 48,
200
+ side
201
+ }) {
202
+ const navRef = React.useRef(null);
203
+ const layout = useLatestThreadScrollerLayout();
204
+ const [hasSideRoom, setHasSideRoom] = React.useState(false);
205
+ const [hoveredIndex, setHoveredIndex] = React.useState(null);
206
+ const { scrollToMessage } = useMessageScroller();
207
+ const { currentAnchorId, visibleMessageIds } = useMessageScrollerVisibility();
208
+ const visibleMessageIdSet = React.useMemo(
209
+ () => new Set(visibleMessageIds),
210
+ [visibleMessageIds]
211
+ );
212
+ const focusIndex = hoveredIndex ?? -1;
213
+ const railSide = side ?? (dir === "rtl" ? "right" : "left");
214
+ React.useEffect(() => {
215
+ const root = layout?.rootElement ?? navRef.current?.parentElement;
216
+ if (!root) return;
217
+ const updateSideRoom = () => {
218
+ const rootRect = root.getBoundingClientRect();
219
+ const rootWidth = rootRect.width;
220
+ const content2 = layout?.contentElement;
221
+ const sideGutter = content2 ? Math.max(
222
+ 0,
223
+ railSide === "left" ? content2.getBoundingClientRect().left - rootRect.left : rootRect.right - content2.getBoundingClientRect().right
224
+ ) : Math.max(0, (rootWidth - contentMaxWidth) / 2);
225
+ const nextHasSideRoom = rootWidth >= minContainerWidthForRail && sideGutter >= minSideGutterForRail;
226
+ setHasSideRoom(
227
+ (current) => current === nextHasSideRoom ? current : nextHasSideRoom
228
+ );
229
+ };
230
+ updateSideRoom();
231
+ if (typeof ResizeObserver === "undefined") return;
232
+ const resizeObserver = new ResizeObserver(updateSideRoom);
233
+ resizeObserver.observe(root);
234
+ const content = layout?.contentElement;
235
+ if (content) {
236
+ resizeObserver.observe(content);
237
+ }
238
+ return () => resizeObserver.disconnect();
239
+ }, [
240
+ contentMaxWidth,
241
+ layout?.contentElement,
242
+ layout?.rootElement,
243
+ minContainerWidthForRail,
244
+ minSideGutterForRail,
245
+ railSide
246
+ ]);
247
+ if (items.length < 2) {
248
+ return null;
56
249
  }
57
- return null;
250
+ return /* @__PURE__ */ jsx(
251
+ "nav",
252
+ {
253
+ ref: navRef,
254
+ "aria-label": "Transcript outline",
255
+ "data-side": railSide,
256
+ "data-visible": hasSideRoom ? "" : void 0,
257
+ className: cx(
258
+ "a24-outline pointer-events-none absolute top-[46%] z-10 max-h-[min(18rem,calc(100%-10rem))] w-16 -translate-y-1/2 overflow-visible",
259
+ hasSideRoom ? "hidden md:block" : "hidden",
260
+ railSide === "left" ? "left-1" : "right-1",
261
+ className
262
+ ),
263
+ dir,
264
+ children: /* @__PURE__ */ jsx("div", { className: "a24-outline__rail pointer-events-auto flex flex-col gap-0 py-1", children: items.map((item, index) => {
265
+ const itemMessageIds = item.messageIds && item.messageIds.length > 0 ? item.messageIds : [item.id];
266
+ const active = itemMessageIds.some(
267
+ (messageId) => visibleMessageIdSet.has(messageId) || messageId === currentAnchorId
268
+ );
269
+ const distance = focusIndex >= 0 ? Math.abs(index - focusIndex) : Number.POSITIVE_INFINITY;
270
+ const isFocused = distance === 0;
271
+ const isNear = distance === 1;
272
+ const isNextNear = distance === 2;
273
+ const barWidth = isFocused ? 50 : isNear ? 36 : isNextNear ? 23 : 10;
274
+ const barOpacity = isFocused ? 1 : isNear ? 0.78 : isNextNear ? 0.58 : 0.36;
275
+ const fallbackLabel = `Turn ${index + 1}`;
276
+ const previewLabel = item.label && item.label !== fallbackLabel ? item.label : "";
277
+ const responsePreview = (item.responsePreview || "").trim();
278
+ return /* @__PURE__ */ jsxs(
279
+ "button",
280
+ {
281
+ type: "button",
282
+ "data-active": active,
283
+ "data-side": railSide,
284
+ dir: "ltr",
285
+ className: cx(
286
+ "a24-outline__button group relative flex h-2 w-16 items-center rounded-sm outline-none",
287
+ railSide === "left" ? "justify-start" : "justify-end"
288
+ ),
289
+ "aria-label": `Jump to ${item.label || fallbackLabel}`,
290
+ onBlur: () => setHoveredIndex(null),
291
+ onFocus: () => setHoveredIndex(index),
292
+ onMouseEnter: () => setHoveredIndex(index),
293
+ onMouseLeave: () => setHoveredIndex(null),
294
+ onClick: () => scrollToMessage(item.id, {
295
+ align: "start",
296
+ behavior: "smooth"
297
+ }),
298
+ children: [
299
+ /* @__PURE__ */ jsx(
300
+ "span",
301
+ {
302
+ className: "a24-outline__bar h-0.5 rounded-full bg-muted-foreground/55 transition-[width,background-color,opacity] duration-150 ease-out group-hover:bg-foreground group-focus-visible:bg-foreground group-data-[active=true]:bg-foreground",
303
+ style: {
304
+ opacity: barOpacity,
305
+ width: barWidth
306
+ }
307
+ }
308
+ ),
309
+ previewLabel ? /* @__PURE__ */ jsxs(
310
+ "span",
311
+ {
312
+ dir,
313
+ className: cx(
314
+ "a24-outline__preview pointer-events-none absolute top-1/2 z-20 max-h-32 w-64 -translate-y-1/2 overflow-hidden rounded-lg border border-border/80 bg-background p-3 text-start opacity-0 shadow-lg transition-[opacity,transform] duration-200 group-hover:pointer-events-auto group-hover:opacity-100 group-focus-visible:pointer-events-auto group-focus-visible:opacity-100",
315
+ railSide === "left" ? "left-full ml-2 -translate-x-1 group-hover:translate-x-0 group-focus-visible:translate-x-0" : "right-full mr-2 translate-x-1 group-hover:translate-x-0 group-focus-visible:translate-x-0",
316
+ cardClassName
317
+ ),
318
+ children: [
319
+ /* @__PURE__ */ jsx(
320
+ "span",
321
+ {
322
+ className: "block overflow-hidden text-sm leading-5 text-foreground",
323
+ style: {
324
+ display: "-webkit-box",
325
+ WebkitBoxOrient: "vertical",
326
+ WebkitLineClamp: responsePreview ? 2 : 4
327
+ },
328
+ children: previewLabel
329
+ }
330
+ ),
331
+ responsePreview ? /* @__PURE__ */ jsx(
332
+ "span",
333
+ {
334
+ className: "mt-1 block overflow-hidden text-sm leading-5 text-muted-foreground",
335
+ style: {
336
+ display: "-webkit-box",
337
+ WebkitBoxOrient: "vertical",
338
+ WebkitLineClamp: 2
339
+ },
340
+ children: responsePreview
341
+ }
342
+ ) : null
343
+ ]
344
+ }
345
+ ) : null
346
+ ]
347
+ },
348
+ item.id
349
+ );
350
+ }) })
351
+ }
352
+ );
353
+ }
354
+ var LatestThreadScroller = {
355
+ Provider: LatestThreadScrollerProvider,
356
+ Root: LatestThreadScrollerRoot,
357
+ Viewport: LatestThreadScrollerViewport,
358
+ Content: LatestThreadScrollerContent,
359
+ Item: LatestThreadScrollerItem,
360
+ Button: LatestThreadScrollerButton,
361
+ Outline: LatestThreadScrollerOutline
58
362
  };
59
- var renderChatPart = (part, message, renderOptions) => /* @__PURE__ */ jsx(
60
- DefaultChatPart,
61
- {
62
- part,
63
- message,
64
- renderOptions
65
- },
66
- part.id
67
- );
68
363
 
69
364
  // src/viewport.ts
70
365
  import {
71
- MessageScroller,
72
- useMessageScroller,
366
+ MessageScroller as MessageScroller2,
367
+ useMessageScroller as useMessageScroller2,
73
368
  useMessageScrollerScrollable,
74
- useMessageScrollerVisibility
369
+ useMessageScrollerVisibility as useMessageScrollerVisibility2
75
370
  } from "@shadcn/react/message-scroller";
76
371
  export {
77
- DefaultChatPart,
78
- DefaultToolPart,
79
372
  LatestThreadScroller,
80
373
  LatestThreadScrollerButton,
81
374
  LatestThreadScrollerContent,
@@ -84,13 +377,14 @@ export {
84
377
  LatestThreadScrollerProvider,
85
378
  LatestThreadScrollerRoot,
86
379
  LatestThreadScrollerViewport,
87
- MessageScroller,
380
+ MessageScroller2 as MessageScroller,
381
+ browserChatCrypto,
382
+ createMcpPkceProof,
88
383
  getActiveStreamingTextPartId,
89
384
  isActiveStreamingTextPart,
90
- renderChatPart,
91
- useMessageScroller,
385
+ useMessageScroller2 as useMessageScroller,
92
386
  useMessageScrollerScrollable,
93
- useMessageScrollerVisibility,
387
+ useMessageScrollerVisibility2 as useMessageScrollerVisibility,
94
388
  useStreamingText,
95
389
  validateMcpCallbackResult,
96
390
  waitForMcpOauthComplete
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/renderers.tsx","../src/viewport.ts"],"sourcesContent":["import type {\n Agents24ChatRenderOptions,\n ChatMessage,\n ChatPart,\n ChatToolPart,\n} from \"./types\";\n\nexport const DefaultToolPart = ({ part }: { part: ChatToolPart }) => {\n const label =\n typeof part.presentation?.activity === \"string\"\n ? part.presentation.activity\n : typeof part.presentation?.title === \"string\"\n ? part.presentation.title\n : part.toolName;\n const detail =\n typeof part.presentation?.detail === \"string\"\n ? part.presentation.detail\n : part.errorText || part.state;\n\n return (\n <div data-agents24-tool-part={part.type} data-state={part.state}>\n <div>{label}</div>\n {detail ? <div>{detail}</div> : null}\n </div>\n );\n};\n\nexport const DefaultChatPart = ({\n part,\n message,\n renderOptions,\n}: {\n part: ChatPart;\n message: ChatMessage;\n renderOptions?: Agents24ChatRenderOptions;\n}) => {\n if (renderOptions?.renderPart) {\n return <>{renderOptions.renderPart(part, message)}</>;\n }\n\n if (part.kind === \"text\") return <>{part.text}</>;\n\n if (part.kind === \"tool\") {\n const ToolRenderer =\n renderOptions?.toolRenderers?.[part.type] ||\n renderOptions?.fallbackToolRenderer ||\n DefaultToolPart;\n return <>{ToolRenderer({ part, message })}</>;\n }\n\n if (part.kind === \"reasoning\") {\n return <div data-agents24-reasoning-part>{part.text || part.label}</div>;\n }\n\n if (part.kind === \"ui-blocks\") {\n return <div data-agents24-ui-blocks-part data-state={part.state} />;\n }\n\n if (part.kind === \"hitl\") {\n return <div data-agents24-hitl-part={part.interruptId || \"\"} />;\n }\n\n if (part.kind === \"error\") {\n return <div data-agents24-error-part>{part.errorText}</div>;\n }\n\n if (part.kind === \"data\") {\n return <div data-agents24-data-part={part.name} />;\n }\n\n return null;\n};\n\nexport const renderChatPart = (\n part: ChatPart,\n message: ChatMessage,\n renderOptions?: Agents24ChatRenderOptions\n) => (\n <DefaultChatPart\n key={part.id}\n part={part}\n message={message}\n renderOptions={renderOptions}\n />\n);\n","export {\n MessageScroller,\n useMessageScroller,\n useMessageScrollerScrollable,\n useMessageScrollerVisibility,\n} from \"@shadcn/react/message-scroller\";\nexport type {\n MessageScrollerDefaultScrollPosition,\n MessageScrollerScrollAlign,\n MessageScrollerScrollable,\n MessageScrollerScrollOptions,\n MessageScrollerVisibilityState,\n} from \"@shadcn/react/message-scroller\";\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAoBI,SAiBO,UAhBL,KADF;AAbG,IAAM,kBAAkB,CAAC,EAAE,KAAK,MAA8B;AACnE,QAAM,QACJ,OAAO,KAAK,cAAc,aAAa,WACnC,KAAK,aAAa,WAClB,OAAO,KAAK,cAAc,UAAU,WAClC,KAAK,aAAa,QAClB,KAAK;AACb,QAAM,SACJ,OAAO,KAAK,cAAc,WAAW,WACjC,KAAK,aAAa,SAClB,KAAK,aAAa,KAAK;AAE7B,SACE,qBAAC,SAAI,2BAAyB,KAAK,MAAM,cAAY,KAAK,OACxD;AAAA,wBAAC,SAAK,iBAAM;AAAA,IACX,SAAS,oBAAC,SAAK,kBAAO,IAAS;AAAA,KAClC;AAEJ;AAEO,IAAM,kBAAkB,CAAC;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AACF,MAIM;AACJ,MAAI,eAAe,YAAY;AAC7B,WAAO,gCAAG,wBAAc,WAAW,MAAM,OAAO,GAAE;AAAA,EACpD;AAEA,MAAI,KAAK,SAAS,OAAQ,QAAO,gCAAG,eAAK,MAAK;AAE9C,MAAI,KAAK,SAAS,QAAQ;AACxB,UAAM,eACJ,eAAe,gBAAgB,KAAK,IAAI,KACxC,eAAe,wBACf;AACF,WAAO,gCAAG,uBAAa,EAAE,MAAM,QAAQ,CAAC,GAAE;AAAA,EAC5C;AAEA,MAAI,KAAK,SAAS,aAAa;AAC7B,WAAO,oBAAC,SAAI,gCAA4B,MAAE,eAAK,QAAQ,KAAK,OAAM;AAAA,EACpE;AAEA,MAAI,KAAK,SAAS,aAAa;AAC7B,WAAO,oBAAC,SAAI,gCAA4B,MAAC,cAAY,KAAK,OAAO;AAAA,EACnE;AAEA,MAAI,KAAK,SAAS,QAAQ;AACxB,WAAO,oBAAC,SAAI,2BAAyB,KAAK,eAAe,IAAI;AAAA,EAC/D;AAEA,MAAI,KAAK,SAAS,SAAS;AACzB,WAAO,oBAAC,SAAI,4BAAwB,MAAE,eAAK,WAAU;AAAA,EACvD;AAEA,MAAI,KAAK,SAAS,QAAQ;AACxB,WAAO,oBAAC,SAAI,2BAAyB,KAAK,MAAM;AAAA,EAClD;AAEA,SAAO;AACT;AAEO,IAAM,iBAAiB,CAC5B,MACA,SACA,kBAEA;AAAA,EAAC;AAAA;AAAA,IAEC;AAAA,IACA;AAAA,IACA;AAAA;AAAA,EAHK,KAAK;AAIZ;;;ACnFF;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;","names":[]}
1
+ {"version":3,"sources":["../src/latest-thread-scroller.tsx","../src/viewport.ts"],"sourcesContent":["import * as React from \"react\";\nimport {\n MessageScroller,\n useMessageScroller,\n useMessageScrollerVisibility,\n} from \"@shadcn/react/message-scroller\";\n\nconst cx = (...values: Array<string | false | null | undefined>) =>\n values.filter(Boolean).join(\" \");\n\ntype MessageScrollerProviderProps = React.ComponentProps<\n typeof MessageScroller.Provider\n>;\ntype MessageScrollerRootProps = React.ComponentProps<typeof MessageScroller.Root>;\ntype MessageScrollerViewportProps = React.ComponentProps<\n typeof MessageScroller.Viewport\n>;\ntype MessageScrollerContentProps = React.ComponentProps<\n typeof MessageScroller.Content\n>;\ntype MessageScrollerItemProps = React.ComponentProps<typeof MessageScroller.Item>;\ntype MessageScrollerButtonProps = React.ComponentProps<typeof MessageScroller.Button>;\n\ntype LatestThreadScrollerLayoutContextValue = {\n contentElement: HTMLElement | null;\n rootElement: HTMLElement | null;\n setContentElement: (node: HTMLElement | null) => void;\n setRootElement: (node: HTMLElement | null) => void;\n};\n\nconst LatestThreadScrollerLayoutContext =\n React.createContext<LatestThreadScrollerLayoutContextValue | null>(null);\n\nconst useLatestThreadScrollerLayout = () =>\n React.useContext(LatestThreadScrollerLayoutContext);\n\nexport type LatestThreadScrollerProviderProps = MessageScrollerProviderProps;\n\nexport function LatestThreadScrollerProvider({\n autoScroll = true,\n defaultScrollPosition = \"last-anchor\",\n scrollPreviousItemPeek = 64,\n ...props\n}: LatestThreadScrollerProviderProps) {\n return (\n <MessageScroller.Provider\n autoScroll={autoScroll}\n defaultScrollPosition={defaultScrollPosition}\n scrollPreviousItemPeek={scrollPreviousItemPeek}\n {...props}\n />\n );\n}\n\nexport type LatestThreadScrollerRootProps = MessageScrollerRootProps;\n\nexport function LatestThreadScrollerRoot({\n className,\n ref,\n ...props\n}: LatestThreadScrollerRootProps) {\n const [rootElement, setRootElement] = React.useState<HTMLElement | null>(null);\n const [contentElement, setContentElement] =\n React.useState<HTMLElement | null>(null);\n const layoutContext = React.useMemo<LatestThreadScrollerLayoutContextValue>(\n () => ({\n contentElement,\n rootElement,\n setContentElement,\n setRootElement,\n }),\n [contentElement, rootElement]\n );\n const setRef = React.useCallback(\n (node: HTMLDivElement | null) => {\n setRootElement(node);\n if (typeof ref === \"function\") {\n ref(node);\n } else if (ref) {\n ref.current = node;\n }\n },\n [ref]\n );\n\n return (\n <LatestThreadScrollerLayoutContext.Provider value={layoutContext}>\n <MessageScroller.Root\n ref={setRef}\n className={cx(\n \"a24-scroller relative flex size-full min-h-0 flex-1 flex-col overflow-hidden\",\n className\n )}\n {...props}\n />\n </LatestThreadScrollerLayoutContext.Provider>\n );\n}\n\nexport type LatestThreadScrollerViewportProps =\n MessageScrollerViewportProps & {\n onViewportChange?: (node: HTMLElement | null) => void;\n };\n\nexport function LatestThreadScrollerViewport({\n className,\n onViewportChange,\n preserveScrollOnPrepend = true,\n ref,\n ...props\n}: LatestThreadScrollerViewportProps) {\n const setRef = React.useCallback(\n (node: HTMLDivElement | null) => {\n if (typeof ref === \"function\") {\n ref(node);\n } else if (ref) {\n ref.current = node;\n }\n onViewportChange?.(node);\n },\n [onViewportChange, ref]\n );\n\n return (\n <MessageScroller.Viewport\n ref={setRef}\n className={cx(\n \"a24-scroller__viewport size-full min-h-0 min-w-0 flex-1 overflow-y-auto overscroll-contain\",\n className\n )}\n preserveScrollOnPrepend={preserveScrollOnPrepend}\n {...props}\n />\n );\n}\n\nexport type LatestThreadScrollerContentProps = MessageScrollerContentProps;\n\nexport function LatestThreadScrollerContent({\n className,\n ref,\n ...props\n}: LatestThreadScrollerContentProps) {\n const layout = useLatestThreadScrollerLayout();\n const setRef = React.useCallback(\n (node: HTMLDivElement | null) => {\n layout?.setContentElement(node);\n if (typeof ref === \"function\") {\n ref(node);\n } else if (ref) {\n ref.current = node;\n }\n },\n [layout, ref]\n );\n\n return (\n <MessageScroller.Content\n ref={setRef}\n data-agents24-latest-thread-content=\"\"\n className={cx(\"a24-scroller__content flex h-max min-h-full flex-col gap-8 p-4\", className)}\n {...props}\n />\n );\n}\n\nexport type LatestThreadScrollerItemProps = Omit<\n MessageScrollerItemProps,\n \"messageId\"\n> & {\n messageId: string;\n};\n\nexport function LatestThreadScrollerItem({\n className,\n messageId,\n ...props\n}: LatestThreadScrollerItemProps) {\n return (\n <MessageScroller.Item\n className={cx(\n \"a24-scroller__item min-w-0 shrink-0 overflow-visible\",\n className\n )}\n messageId={messageId}\n {...props}\n />\n );\n}\n\nexport type LatestThreadScrollerButtonProps = Omit<\n MessageScrollerButtonProps,\n \"render\"\n> & {\n className?: string;\n render?: MessageScrollerButtonProps[\"render\"];\n};\n\nexport function LatestThreadScrollerButton({\n children,\n className,\n direction = \"end\",\n render,\n ...props\n}: LatestThreadScrollerButtonProps) {\n if (render) {\n return (\n <MessageScroller.Button\n direction={direction}\n render={render}\n {...props}\n />\n );\n }\n\n return (\n <MessageScroller.Button\n direction={direction}\n render={(buttonProps) => (\n <button\n {...(buttonProps as Record<string, unknown>)}\n aria-label={\n direction === \"end\"\n ? \"Scroll to latest message\"\n : \"Scroll to first message\"\n }\n className={cx(\n \"a24-scroller__button absolute bottom-4 left-1/2 z-50 flex size-9 -translate-x-1/2 items-center justify-center rounded-full border border-border bg-background text-foreground shadow-md transition-[background-color,border-color,color,opacity,transform] duration-200 data-[active=false]:pointer-events-none data-[active=false]:translate-y-2 data-[active=false]:opacity-0 data-[active=true]:translate-y-0 data-[active=true]:opacity-100\",\n className\n )}\n type=\"button\"\n >\n {children ?? (direction === \"end\" ? \"↓\" : \"↑\")}\n </button>\n )}\n {...props}\n />\n );\n}\n\nexport type LatestThreadScrollerOutlineItem = {\n id: string;\n label: string;\n messageIds?: string[];\n responsePreview?: string;\n};\n\nexport type LatestThreadScrollerOutlineProps = {\n cardClassName?: string;\n className?: string;\n contentMaxWidth?: number;\n dir?: \"ltr\" | \"rtl\";\n items: LatestThreadScrollerOutlineItem[];\n minContainerWidthForRail?: number;\n minSideGutterForRail?: number;\n side?: \"left\" | \"right\";\n};\n\nexport function LatestThreadScrollerOutline({\n cardClassName,\n className,\n contentMaxWidth = 768,\n dir = \"ltr\",\n items,\n minContainerWidthForRail = 0,\n minSideGutterForRail = 48,\n side,\n}: LatestThreadScrollerOutlineProps) {\n const navRef = React.useRef<HTMLElement | null>(null);\n const layout = useLatestThreadScrollerLayout();\n const [hasSideRoom, setHasSideRoom] = React.useState(false);\n const [hoveredIndex, setHoveredIndex] = React.useState<number | null>(null);\n const { scrollToMessage } = useMessageScroller();\n const { currentAnchorId, visibleMessageIds } = useMessageScrollerVisibility();\n const visibleMessageIdSet = React.useMemo(\n () => new Set(visibleMessageIds),\n [visibleMessageIds]\n );\n const focusIndex = hoveredIndex ?? -1;\n const railSide = side ?? (dir === \"rtl\" ? \"right\" : \"left\");\n\n React.useEffect(() => {\n const root = layout?.rootElement ?? navRef.current?.parentElement;\n if (!root) return;\n\n const updateSideRoom = () => {\n const rootRect = root.getBoundingClientRect();\n const rootWidth = rootRect.width;\n const content = layout?.contentElement;\n const sideGutter = content\n ? Math.max(\n 0,\n railSide === \"left\"\n ? content.getBoundingClientRect().left - rootRect.left\n : rootRect.right - content.getBoundingClientRect().right\n )\n : Math.max(0, (rootWidth - contentMaxWidth) / 2);\n const nextHasSideRoom =\n rootWidth >= minContainerWidthForRail &&\n sideGutter >= minSideGutterForRail;\n setHasSideRoom((current) =>\n current === nextHasSideRoom ? current : nextHasSideRoom\n );\n };\n\n updateSideRoom();\n if (typeof ResizeObserver === \"undefined\") return;\n const resizeObserver = new ResizeObserver(updateSideRoom);\n resizeObserver.observe(root);\n const content = layout?.contentElement;\n if (content) {\n resizeObserver.observe(content);\n }\n return () => resizeObserver.disconnect();\n }, [\n contentMaxWidth,\n layout?.contentElement,\n layout?.rootElement,\n minContainerWidthForRail,\n minSideGutterForRail,\n railSide,\n ]);\n\n if (items.length < 2) {\n return null;\n }\n\n return (\n <nav\n ref={navRef}\n aria-label=\"Transcript outline\"\n data-side={railSide}\n data-visible={hasSideRoom ? \"\" : undefined}\n className={cx(\n \"a24-outline pointer-events-none absolute top-[46%] z-10 max-h-[min(18rem,calc(100%-10rem))] w-16 -translate-y-1/2 overflow-visible\",\n hasSideRoom ? \"hidden md:block\" : \"hidden\",\n railSide === \"left\" ? \"left-1\" : \"right-1\",\n className\n )}\n dir={dir}\n >\n <div className=\"a24-outline__rail pointer-events-auto flex flex-col gap-0 py-1\">\n {items.map((item, index) => {\n const itemMessageIds =\n item.messageIds && item.messageIds.length > 0\n ? item.messageIds\n : [item.id];\n const active = itemMessageIds.some(\n (messageId) =>\n visibleMessageIdSet.has(messageId) || messageId === currentAnchorId\n );\n const distance =\n focusIndex >= 0 ? Math.abs(index - focusIndex) : Number.POSITIVE_INFINITY;\n const isFocused = distance === 0;\n const isNear = distance === 1;\n const isNextNear = distance === 2;\n const barWidth = isFocused\n ? 50\n : isNear\n ? 36\n : isNextNear\n ? 23\n : 10;\n const barOpacity = isFocused ? 1 : isNear ? 0.78 : isNextNear ? 0.58 : 0.36;\n const fallbackLabel = `Turn ${index + 1}`;\n const previewLabel =\n item.label && item.label !== fallbackLabel ? item.label : \"\";\n const responsePreview = (item.responsePreview || \"\").trim();\n\n return (\n <button\n key={item.id}\n type=\"button\"\n data-active={active}\n data-side={railSide}\n dir=\"ltr\"\n className={cx(\n \"a24-outline__button group relative flex h-2 w-16 items-center rounded-sm outline-none\",\n railSide === \"left\" ? \"justify-start\" : \"justify-end\"\n )}\n aria-label={`Jump to ${item.label || fallbackLabel}`}\n onBlur={() => setHoveredIndex(null)}\n onFocus={() => setHoveredIndex(index)}\n onMouseEnter={() => setHoveredIndex(index)}\n onMouseLeave={() => setHoveredIndex(null)}\n onClick={() =>\n scrollToMessage(item.id, {\n align: \"start\",\n behavior: \"smooth\",\n })\n }\n >\n <span\n className=\"a24-outline__bar h-0.5 rounded-full bg-muted-foreground/55 transition-[width,background-color,opacity] duration-150 ease-out group-hover:bg-foreground group-focus-visible:bg-foreground group-data-[active=true]:bg-foreground\"\n style={{\n opacity: barOpacity,\n width: barWidth,\n }}\n />\n {previewLabel ? (\n <span\n dir={dir}\n className={cx(\n \"a24-outline__preview pointer-events-none absolute top-1/2 z-20 max-h-32 w-64 -translate-y-1/2 overflow-hidden rounded-lg border border-border/80 bg-background p-3 text-start opacity-0 shadow-lg transition-[opacity,transform] duration-200 group-hover:pointer-events-auto group-hover:opacity-100 group-focus-visible:pointer-events-auto group-focus-visible:opacity-100\",\n railSide === \"left\"\n ? \"left-full ml-2 -translate-x-1 group-hover:translate-x-0 group-focus-visible:translate-x-0\"\n : \"right-full mr-2 translate-x-1 group-hover:translate-x-0 group-focus-visible:translate-x-0\",\n cardClassName\n )}\n >\n <span\n className=\"block overflow-hidden text-sm leading-5 text-foreground\"\n style={{\n display: \"-webkit-box\",\n WebkitBoxOrient: \"vertical\",\n WebkitLineClamp: responsePreview ? 2 : 4,\n }}\n >\n {previewLabel}\n </span>\n {responsePreview ? (\n <span\n className=\"mt-1 block overflow-hidden text-sm leading-5 text-muted-foreground\"\n style={{\n display: \"-webkit-box\",\n WebkitBoxOrient: \"vertical\",\n WebkitLineClamp: 2,\n }}\n >\n {responsePreview}\n </span>\n ) : null}\n </span>\n ) : null}\n </button>\n );\n })}\n </div>\n </nav>\n );\n}\n\nexport const LatestThreadScroller = {\n Provider: LatestThreadScrollerProvider,\n Root: LatestThreadScrollerRoot,\n Viewport: LatestThreadScrollerViewport,\n Content: LatestThreadScrollerContent,\n Item: LatestThreadScrollerItem,\n Button: LatestThreadScrollerButton,\n Outline: LatestThreadScrollerOutline,\n};\n","export {\n MessageScroller,\n useMessageScroller,\n useMessageScrollerScrollable,\n useMessageScrollerVisibility,\n} from \"@shadcn/react/message-scroller\";\nexport type {\n MessageScrollerDefaultScrollPosition,\n MessageScrollerScrollAlign,\n MessageScrollerScrollable,\n MessageScrollerScrollOptions,\n MessageScrollerVisibilityState,\n} from \"@shadcn/react/message-scroller\";\n"],"mappings":"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","names":["content","MessageScroller","useMessageScroller","useMessageScrollerVisibility"]}
@@ -1,4 +1,17 @@
1
1
  import type { McpCallbackResult } from "@agents24/client";
2
2
  import type { ChatMcpOauthCompletion, WaitForMcpOauthCompleteInput } from "./types";
3
+ type CryptoLike = {
4
+ getRandomValues<T extends Uint8Array>(array: T): T;
5
+ randomUUID(): string;
6
+ subtle: {
7
+ digest(algorithm: string, data: Uint8Array): Promise<ArrayBuffer>;
8
+ };
9
+ };
10
+ export declare function browserChatCrypto(): CryptoLike;
11
+ export declare function createMcpPkceProof(): Promise<{
12
+ challenge: string;
13
+ verifier: string;
14
+ }>;
3
15
  export declare function validateMcpCallbackResult(result: McpCallbackResult, expectedServerId: string): McpCallbackResult;
4
16
  export declare function waitForMcpOauthComplete({ popup, callbackOrigin, popupNonce, requireConnectionId, serverId, timeoutMs, }: WaitForMcpOauthCompleteInput): Promise<ChatMcpOauthCompletion>;
17
+ export {};