rift-ds 1.7.0 → 1.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +31 -8
- package/bin/rift-ds.mjs +142 -29
- package/bin/templates/chat/.env.chat.example +21 -0
- package/bin/templates/chat/app/api/chat/feedback/route.ts +12 -0
- package/bin/templates/chat/app/api/chat/followups/route.ts +23 -0
- package/bin/templates/chat/app/api/chat/guardrails.ts +18 -0
- package/bin/templates/chat/app/api/chat/route.ts +31 -0
- package/bin/templates/chat/components/chat/ChatMount.tsx +52 -0
- package/bin/templates/chat/components/chat/models.ts +29 -0
- package/chat/AssistantTurn.d.ts +5 -0
- package/chat/AssistantTurn.js +82 -0
- package/chat/ChatAgentPane.css +56 -0
- package/chat/ChatAgentPane.d.ts +24 -0
- package/chat/ChatAgentPane.js +28 -0
- package/chat/ChatArtifactCard.d.ts +13 -0
- package/chat/ChatArtifactCard.js +21 -0
- package/chat/ChatArtifactPane.d.ts +18 -0
- package/chat/ChatArtifactPane.js +43 -0
- package/chat/ChatLauncher.d.ts +64 -0
- package/chat/ChatLauncher.js +347 -0
- package/chat/ChatProvider.d.ts +55 -0
- package/chat/ChatProvider.js +196 -0
- package/chat/ChatTabs.d.ts +13 -0
- package/chat/ChatTabs.js +24 -0
- package/chat/ChatThreads.d.ts +26 -0
- package/chat/ChatThreads.js +55 -0
- package/chat/ChatWidget.css +1259 -0
- package/chat/ChatWidget.d.ts +115 -0
- package/chat/ChatWidget.js +709 -0
- package/chat/DemoWelcome.d.ts +13 -0
- package/chat/DemoWelcome.js +131 -0
- package/chat/FollowupSuggestions.d.ts +23 -0
- package/chat/FollowupSuggestions.js +34 -0
- package/chat/ResponseActions.d.ts +18 -0
- package/chat/ResponseActions.js +79 -0
- package/chat/TurnContent.d.ts +11 -0
- package/chat/TurnContent.js +19 -0
- package/chat/artifacts.d.ts +5 -0
- package/chat/artifacts.js +14 -0
- package/chat/context.d.ts +82 -0
- package/chat/context.js +29 -0
- package/chat/demo-agent-panes.d.ts +5 -0
- package/chat/demo-agent-panes.js +49 -0
- package/chat/demo-agent.d.ts +3 -0
- package/chat/demo-agent.js +28 -0
- package/chat/demo-artifacts.d.ts +6 -0
- package/chat/demo-artifacts.js +80 -0
- package/chat/demo-card-components.d.ts +48 -0
- package/chat/demo-card-components.js +66 -0
- package/chat/demo-cards.d.ts +32 -0
- package/chat/demo-cards.js +59 -0
- package/chat/demo-fixtures.d.ts +20 -0
- package/chat/demo-fixtures.js +113 -0
- package/chat/demo-script.d.ts +6 -0
- package/chat/demo-script.js +237 -0
- package/chat/demo.css +52 -0
- package/chat/demo.d.ts +10 -0
- package/chat/demo.js +28 -0
- package/chat/followups.d.ts +41 -0
- package/chat/followups.js +55 -0
- package/chat/greeting.d.ts +11 -0
- package/chat/greeting.js +21 -0
- package/chat/index.d.ts +37 -0
- package/chat/index.js +90 -0
- package/chat/placement.d.ts +48 -0
- package/chat/placement.js +39 -0
- package/chat/queries.d.ts +18 -0
- package/chat/queries.js +26 -0
- package/chat/registry.d.ts +25 -0
- package/chat/registry.js +9 -0
- package/chat/registry.json.d.ts +74 -0
- package/chat/registry.json.js +11 -0
- package/chat/server.d.ts +217 -0
- package/chat/server.js +488 -0
- package/chat/sim.d.ts +71 -0
- package/chat/sim.js +125 -0
- package/chat/starters.d.ts +15 -0
- package/chat/starters.js +38 -0
- package/chat/suggestions.d.ts +22 -0
- package/chat/suggestions.js +9 -0
- package/chat/threads.d.ts +73 -0
- package/chat/threads.js +270 -0
- package/chat/transport.d.ts +49 -0
- package/chat/transport.js +105 -0
- package/chat/types.d.ts +246 -0
- package/chat/types.js +18 -0
- package/chat/upstash.d.ts +63 -0
- package/chat/upstash.js +147 -0
- package/chat/useChat.d.ts +64 -0
- package/chat/useChat.js +241 -0
- package/cli/templates/chat/app/api/chat/feedback/route.d.ts +3 -0
- package/cli/templates/chat/app/api/chat/followups/route.d.ts +3 -0
- package/cli/templates/chat/app/api/chat/guardrails.d.ts +10 -0
- package/cli/templates/chat/app/api/chat/route.d.ts +4 -0
- package/cli/templates/chat/components/chat/ChatMount.d.ts +1 -0
- package/cli/templates/chat/components/chat/models.d.ts +11 -0
- package/components/AgentRail/AgentRail.css +14 -5
- package/components/AgentRail/AgentRail.d.ts +2 -0
- package/components/AgentRail/AgentRail.js +3 -2
- package/components/ArtifactCard/ArtifactCard.css +106 -0
- package/components/ArtifactCard/ArtifactCard.d.ts +27 -0
- package/components/ArtifactCard/ArtifactCard.js +29 -0
- package/components/ArtifactPanel/ArtifactPanel.css +159 -0
- package/components/ArtifactPanel/ArtifactPanel.d.ts +70 -0
- package/components/ArtifactPanel/ArtifactPanel.js +131 -0
- package/components/ShaderField/ShaderField.d.ts +3 -2
- package/components/ShaderField/useShaderField.d.ts +2 -1
- package/components/ShaderField/useShaderField.js +6 -6
- package/components/ThreadPanel/ThreadPanel.css +87 -33
- package/components/ThreadPanel/ThreadPanel.js +21 -10
- package/components/registry.json +16 -0
- package/components/registry.json.d.ts +16 -0
- package/components/registry.json.js +1 -1
- package/fonts/material-symbols.css +2 -1
- package/index.d.ts +2 -0
- package/index.js +4 -0
- package/package.json +39 -2
- package/tokens/presets/coral.css +18 -2
- package/tokens/presets/forest.css +18 -2
- package/tokens/presets/gold.css +18 -2
- package/tokens/presets/mono.css +18 -2
- package/tokens/presets/pink.css +18 -2
- package/tokens/presets/terminal.css +18 -2
- package/tokens/presets/violet.css +18 -2
- package/tokens/presets/warm.css +18 -2
- package/tokens/presets/zest.css +18 -2
- package/tokens/registry.json +6 -0
- package/tokens/registry.json.d.ts +6 -0
- package/tokens/registry.json.js +1 -1
- package/tokens/tokens-dark.css +10 -0
- package/tokens/tokens-light.css +10 -0
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
import { useState, useMemo, useRef, useEffect, useCallback } from "react";
|
|
4
|
+
import { MOTION_EXIT_SYNC_MS } from "../tokens/motion.js";
|
|
5
|
+
import { createFeedbackPoster, isInternalPath, ChatWidgetContext } from "./context.js";
|
|
6
|
+
import { createFollowupsFetcher, followupTarget, DEFAULT_FALLBACK_FOLLOWUPS, pickFallbackFollowups } from "./followups.js";
|
|
7
|
+
import { useThreads } from "./threads.js";
|
|
8
|
+
import { createFetchTransport } from "./transport.js";
|
|
9
|
+
import { DEFAULT_PLACEHOLDER_COPY, useChat } from "./useChat.js";
|
|
10
|
+
const defaultRenderLink = ({ href, children, onNavigate }) => /* @__PURE__ */ jsx("a", { href, onClick: onNavigate, children });
|
|
11
|
+
function ChatProvider({
|
|
12
|
+
transport,
|
|
13
|
+
endpoint = "/api/chat",
|
|
14
|
+
defaultPlacement = "right",
|
|
15
|
+
followups = "/api/chat/followups",
|
|
16
|
+
fallbackFollowups = DEFAULT_FALLBACK_FOLLOWUPS,
|
|
17
|
+
feedback = "/api/chat/feedback",
|
|
18
|
+
renderers,
|
|
19
|
+
artifactRenderers,
|
|
20
|
+
renderLink = defaultRenderLink,
|
|
21
|
+
isInternalHref = isInternalPath,
|
|
22
|
+
threads: threadsOptions,
|
|
23
|
+
placeholders,
|
|
24
|
+
children
|
|
25
|
+
}) {
|
|
26
|
+
const [chosenModel, setChosenModel] = useState(null);
|
|
27
|
+
const fallbackTransport = useMemo(
|
|
28
|
+
() => createFetchTransport(endpoint, { getModel: () => chosenModel }),
|
|
29
|
+
[endpoint, chosenModel]
|
|
30
|
+
);
|
|
31
|
+
const placeholderCopy = useMemo(
|
|
32
|
+
() => ({ ...DEFAULT_PLACEHOLDER_COPY, ...placeholders }),
|
|
33
|
+
[placeholders]
|
|
34
|
+
);
|
|
35
|
+
const chat = useChat(transport ?? fallbackTransport, placeholderCopy);
|
|
36
|
+
const threads = useThreads(chat, threadsOptions);
|
|
37
|
+
const followupsSource = useMemo(() => {
|
|
38
|
+
if (followups === false) return null;
|
|
39
|
+
return typeof followups === "string" ? createFollowupsFetcher(followups) : followups;
|
|
40
|
+
}, [followups]);
|
|
41
|
+
const { setTurnFollowups } = chat;
|
|
42
|
+
const target = useMemo(() => followupTarget(chat.turns), [chat.turns]);
|
|
43
|
+
const askedRef = useRef(/* @__PURE__ */ new Set());
|
|
44
|
+
const [freshFollowupsId, setFreshFollowupsId] = useState(null);
|
|
45
|
+
useEffect(() => {
|
|
46
|
+
if (!target || askedRef.current.has(target.id)) return;
|
|
47
|
+
askedRef.current.add(target.id);
|
|
48
|
+
const offer = (suggestions) => {
|
|
49
|
+
const offered = suggestions.length > 0 ? suggestions : pickFallbackFollowups(fallbackFollowups, target.id, target.question);
|
|
50
|
+
setTurnFollowups(target.id, offered);
|
|
51
|
+
setFreshFollowupsId(target.id);
|
|
52
|
+
};
|
|
53
|
+
if (!followupsSource) {
|
|
54
|
+
offer([]);
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
void followupsSource(target.question, target.answer, AbortSignal.timeout(1e4)).catch(() => []).then(offer);
|
|
58
|
+
}, [target, setTurnFollowups, followupsSource, fallbackFollowups]);
|
|
59
|
+
const feedbackSink = useMemo(() => {
|
|
60
|
+
if (feedback === false) return null;
|
|
61
|
+
return typeof feedback === "string" ? createFeedbackPoster(feedback) : feedback;
|
|
62
|
+
}, [feedback]);
|
|
63
|
+
const { setTurnFeedback } = chat;
|
|
64
|
+
const submitFeedback = useMemo(
|
|
65
|
+
() => feedbackSink ? (turnId, exchangeId, verdict) => {
|
|
66
|
+
setTurnFeedback(turnId, verdict);
|
|
67
|
+
void feedbackSink(exchangeId, verdict).catch(() => {
|
|
68
|
+
});
|
|
69
|
+
} : null,
|
|
70
|
+
[feedbackSink, setTurnFeedback]
|
|
71
|
+
);
|
|
72
|
+
const [starterRevealKey, setStarterRevealKey] = useState(null);
|
|
73
|
+
const [starterSeed, setStarterSeed] = useState(() => Math.random());
|
|
74
|
+
const [artifact, setArtifact] = useState(null);
|
|
75
|
+
const openArtifact = useCallback((next) => setArtifact(next), []);
|
|
76
|
+
const closeArtifact = useCallback(() => setArtifact(null), []);
|
|
77
|
+
if (artifact && chat.turns.length === 0 && !chat.live) setArtifact(null);
|
|
78
|
+
const { reset: resetChat } = chat;
|
|
79
|
+
const reset = useCallback(() => {
|
|
80
|
+
resetChat();
|
|
81
|
+
setArtifact(null);
|
|
82
|
+
setStarterSeed(Math.random());
|
|
83
|
+
setStarterRevealKey(null);
|
|
84
|
+
}, [resetChat]);
|
|
85
|
+
const [open, setOpenState] = useState(false);
|
|
86
|
+
const [panelPhase, setPanelPhase] = useState("closed");
|
|
87
|
+
const closeTimer = useRef(null);
|
|
88
|
+
useEffect(
|
|
89
|
+
() => () => {
|
|
90
|
+
if (closeTimer.current) clearTimeout(closeTimer.current);
|
|
91
|
+
},
|
|
92
|
+
[]
|
|
93
|
+
);
|
|
94
|
+
const setOpen = useCallback((next) => {
|
|
95
|
+
if (next) {
|
|
96
|
+
if (closeTimer.current) {
|
|
97
|
+
clearTimeout(closeTimer.current);
|
|
98
|
+
closeTimer.current = null;
|
|
99
|
+
}
|
|
100
|
+
setPanelPhase("open");
|
|
101
|
+
setOpenState(true);
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
setFreshFollowupsId(null);
|
|
105
|
+
setOpenState(false);
|
|
106
|
+
setPanelPhase((phase) => phase === "open" ? "closing" : phase);
|
|
107
|
+
closeTimer.current = setTimeout(() => {
|
|
108
|
+
closeTimer.current = null;
|
|
109
|
+
setPanelPhase("closed");
|
|
110
|
+
}, MOTION_EXIT_SYNC_MS);
|
|
111
|
+
}, []);
|
|
112
|
+
const [view, setView] = useState("panel");
|
|
113
|
+
const [side, setSide] = useState(
|
|
114
|
+
defaultPlacement === "floating" ? "right" : defaultPlacement
|
|
115
|
+
);
|
|
116
|
+
const [floating, setFloating] = useState(defaultPlacement === "floating");
|
|
117
|
+
const placement = floating ? "floating" : side;
|
|
118
|
+
const setPlacement = useCallback((next) => {
|
|
119
|
+
if (next === "floating") {
|
|
120
|
+
setFloating(true);
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
setFloating(false);
|
|
124
|
+
setSide(next);
|
|
125
|
+
}, []);
|
|
126
|
+
const [draft, setDraft] = useState("");
|
|
127
|
+
const returnFocusRef = useRef(null);
|
|
128
|
+
const toggleOpen = useCallback(() => setOpen(!open), [open, setOpen]);
|
|
129
|
+
const renderersValue = useMemo(() => renderers ?? {}, [renderers]);
|
|
130
|
+
const artifactRenderersValue = useMemo(() => artifactRenderers ?? {}, [artifactRenderers]);
|
|
131
|
+
const value = useMemo(
|
|
132
|
+
() => ({
|
|
133
|
+
...chat,
|
|
134
|
+
reset,
|
|
135
|
+
chosenModel,
|
|
136
|
+
setChosenModel,
|
|
137
|
+
open,
|
|
138
|
+
setOpen,
|
|
139
|
+
toggleOpen,
|
|
140
|
+
panelPhase,
|
|
141
|
+
starterRevealKey,
|
|
142
|
+
setStarterRevealKey,
|
|
143
|
+
starterSeed,
|
|
144
|
+
freshFollowupsId,
|
|
145
|
+
view,
|
|
146
|
+
setView,
|
|
147
|
+
placement,
|
|
148
|
+
setPlacement,
|
|
149
|
+
side,
|
|
150
|
+
floating,
|
|
151
|
+
draft,
|
|
152
|
+
setDraft,
|
|
153
|
+
returnFocusRef,
|
|
154
|
+
threads,
|
|
155
|
+
renderers: renderersValue,
|
|
156
|
+
artifact,
|
|
157
|
+
openArtifact,
|
|
158
|
+
closeArtifact,
|
|
159
|
+
artifactRenderers: artifactRenderersValue,
|
|
160
|
+
renderLink,
|
|
161
|
+
isInternalHref,
|
|
162
|
+
submitFeedback
|
|
163
|
+
}),
|
|
164
|
+
[
|
|
165
|
+
chat,
|
|
166
|
+
reset,
|
|
167
|
+
chosenModel,
|
|
168
|
+
open,
|
|
169
|
+
setOpen,
|
|
170
|
+
toggleOpen,
|
|
171
|
+
panelPhase,
|
|
172
|
+
starterRevealKey,
|
|
173
|
+
starterSeed,
|
|
174
|
+
freshFollowupsId,
|
|
175
|
+
view,
|
|
176
|
+
placement,
|
|
177
|
+
setPlacement,
|
|
178
|
+
side,
|
|
179
|
+
floating,
|
|
180
|
+
draft,
|
|
181
|
+
threads,
|
|
182
|
+
renderersValue,
|
|
183
|
+
artifact,
|
|
184
|
+
openArtifact,
|
|
185
|
+
closeArtifact,
|
|
186
|
+
artifactRenderersValue,
|
|
187
|
+
renderLink,
|
|
188
|
+
isInternalHref,
|
|
189
|
+
submitFeedback
|
|
190
|
+
]
|
|
191
|
+
);
|
|
192
|
+
return /* @__PURE__ */ jsx(ChatWidgetContext.Provider, { value, children });
|
|
193
|
+
}
|
|
194
|
+
export {
|
|
195
|
+
ChatProvider
|
|
196
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The built-in open-sessions strip: a ThreadTabs over the provider's
|
|
3
|
+
* thread lifecycle. Tabs hold thread ids; selecting one moves the rail's
|
|
4
|
+
* selection, the trailing plus is the same New chat as everywhere else, and
|
|
5
|
+
* closing the last tab lands back on the greeting. Renders nothing while no
|
|
6
|
+
* session is open: a bare plus over the greeting would be the header's pen
|
|
7
|
+
* restated.
|
|
8
|
+
*/
|
|
9
|
+
export interface ChatTabsProps {
|
|
10
|
+
/** Accessible name for the tab strip. */
|
|
11
|
+
ariaLabel?: string;
|
|
12
|
+
}
|
|
13
|
+
export declare function ChatTabs({ ariaLabel }: ChatTabsProps): import("react").JSX.Element | null;
|
package/chat/ChatTabs.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
import { ThreadTabs } from "../components/ThreadTabs/ThreadTabs.js";
|
|
4
|
+
import { useChatWidget } from "./context.js";
|
|
5
|
+
function ChatTabs({ ariaLabel = "Open chats" }) {
|
|
6
|
+
const { threads } = useChatWidget();
|
|
7
|
+
if (threads.tabs.length === 0) return null;
|
|
8
|
+
return /* @__PURE__ */ jsx(
|
|
9
|
+
ThreadTabs,
|
|
10
|
+
{
|
|
11
|
+
tabs: threads.tabs,
|
|
12
|
+
activeId: threads.activeThreadId || void 0,
|
|
13
|
+
onTabSelect: threads.select,
|
|
14
|
+
onTabClose: threads.closeTab,
|
|
15
|
+
onAdd: threads.startNew,
|
|
16
|
+
addLabel: threads.newThreadLabel,
|
|
17
|
+
closeLabel: "Close chat",
|
|
18
|
+
ariaLabel
|
|
19
|
+
}
|
|
20
|
+
);
|
|
21
|
+
}
|
|
22
|
+
export {
|
|
23
|
+
ChatTabs
|
|
24
|
+
};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
import { ThreadPanelProfile } from '../components/ThreadPanel/ThreadPanel';
|
|
3
|
+
export interface ChatThreadsProps {
|
|
4
|
+
/** The widget seated the rail as a sheet over the conversation rather than beside it. */
|
|
5
|
+
overlay: boolean;
|
|
6
|
+
/** Closes the sheet; a no-op on the inline rail. */
|
|
7
|
+
close: () => void;
|
|
8
|
+
/** The brand row's mark, in both seats. */
|
|
9
|
+
logo?: ReactNode;
|
|
10
|
+
/** The brand row's text. Shown on the sheet by default, where the chat header is hidden behind it. */
|
|
11
|
+
logoText?: string;
|
|
12
|
+
/** The signed-in person, shown on the inline rail. */
|
|
13
|
+
profile?: ThreadPanelProfile;
|
|
14
|
+
/** Whether the inline rail can collapse to its icon strip. */
|
|
15
|
+
collapsible?: boolean;
|
|
16
|
+
/** Whether the rail starts collapsed. */
|
|
17
|
+
defaultExpanded?: boolean;
|
|
18
|
+
/** Accessible heading over the history. */
|
|
19
|
+
historyLabel?: string;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* The built-in session-history rail: a ThreadPanel over the provider's
|
|
23
|
+
* thread lifecycle (`useThreads`). The widget seats it inline on a wide
|
|
24
|
+
* host and as a slide-over sheet on a narrow one, and tells it which.
|
|
25
|
+
*/
|
|
26
|
+
export declare function ChatThreads({ overlay, close, logo, logoText, profile, collapsible, defaultExpanded, historyLabel, }: ChatThreadsProps): import("react").JSX.Element;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
import { useState } from "react";
|
|
4
|
+
import { ThreadPanel } from "../components/ThreadPanel/ThreadPanel.js";
|
|
5
|
+
import { useChatWidget } from "./context.js";
|
|
6
|
+
function ChatThreads({
|
|
7
|
+
overlay,
|
|
8
|
+
close,
|
|
9
|
+
logo,
|
|
10
|
+
logoText,
|
|
11
|
+
profile,
|
|
12
|
+
collapsible = true,
|
|
13
|
+
defaultExpanded = false,
|
|
14
|
+
historyLabel = "Chat history"
|
|
15
|
+
}) {
|
|
16
|
+
const { threads } = useChatWidget();
|
|
17
|
+
const [expanded, setExpanded] = useState(defaultExpanded);
|
|
18
|
+
const hasProjects = threads.projects.length > 0;
|
|
19
|
+
return /* @__PURE__ */ jsx(
|
|
20
|
+
ThreadPanel,
|
|
21
|
+
{
|
|
22
|
+
groups: threads.groups,
|
|
23
|
+
activeThreadId: threads.activeThreadId,
|
|
24
|
+
onThreadSelect: (id) => {
|
|
25
|
+
threads.select(id);
|
|
26
|
+
close();
|
|
27
|
+
},
|
|
28
|
+
onThreadAction: threads.runAction,
|
|
29
|
+
renamingThreadId: threads.renamingId ?? void 0,
|
|
30
|
+
onThreadRename: threads.rename,
|
|
31
|
+
onRenameCancel: () => threads.setRenamingId(null),
|
|
32
|
+
newThreadLabel: threads.newThreadLabel,
|
|
33
|
+
onNewThread: () => {
|
|
34
|
+
threads.startNew();
|
|
35
|
+
close();
|
|
36
|
+
},
|
|
37
|
+
historyLabel,
|
|
38
|
+
projects: hasProjects ? threads.projects : void 0,
|
|
39
|
+
activeProjectId: threads.activeProjectId,
|
|
40
|
+
onProjectSelect: (id) => {
|
|
41
|
+
threads.selectProject(id);
|
|
42
|
+
close();
|
|
43
|
+
},
|
|
44
|
+
onProjectCreate: hasProjects ? threads.createProject : void 0,
|
|
45
|
+
logo,
|
|
46
|
+
logoText: overlay ? logoText : void 0,
|
|
47
|
+
expanded: overlay || !collapsible ? true : expanded,
|
|
48
|
+
onExpandedChange: overlay || !collapsible ? void 0 : setExpanded,
|
|
49
|
+
profile: overlay ? void 0 : profile
|
|
50
|
+
}
|
|
51
|
+
);
|
|
52
|
+
}
|
|
53
|
+
export {
|
|
54
|
+
ChatThreads
|
|
55
|
+
};
|