@tangle-network/ui 1.0.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/CHANGELOG.md +12 -0
- package/LICENSE +21 -0
- package/README.md +33 -0
- package/dist/active-sessions-store-CeOmXgv5.d.ts +85 -0
- package/dist/artifact-pane-DvJyPWV4.d.ts +24 -0
- package/dist/auth.d.ts +74 -0
- package/dist/auth.js +15 -0
- package/dist/button-CMQuQEW_.d.ts +17 -0
- package/dist/chat.d.ts +232 -0
- package/dist/chat.js +30 -0
- package/dist/chunk-2NFQRQOD.js +1009 -0
- package/dist/chunk-2VH6PUXD.js +186 -0
- package/dist/chunk-34A66VBG.js +214 -0
- package/dist/chunk-3OI2QKFD.js +0 -0
- package/dist/chunk-4CLN43XT.js +45 -0
- package/dist/chunk-54SQQMMM.js +156 -0
- package/dist/chunk-5Z5ZYMOJ.js +0 -0
- package/dist/chunk-66BNMOVT.js +167 -0
- package/dist/chunk-6BGQA4BQ.js +0 -0
- package/dist/chunk-7UO2ZMRQ.js +133 -0
- package/dist/chunk-BX6AQMUS.js +183 -0
- package/dist/chunk-CD53GZOM.js +59 -0
- package/dist/chunk-CSAIKY36.js +54 -0
- package/dist/chunk-EEE55AVS.js +1201 -0
- package/dist/chunk-GYPQXTJU.js +230 -0
- package/dist/chunk-HFL6R6IF.js +37 -0
- package/dist/chunk-HJKCSXCH.js +737 -0
- package/dist/chunk-LISXUB4D.js +1222 -0
- package/dist/chunk-LQS34IGP.js +0 -0
- package/dist/chunk-MKTSMWVD.js +109 -0
- package/dist/chunk-NKDZ7GZE.js +192 -0
- package/dist/chunk-OEX7NZE3.js +321 -0
- package/dist/chunk-Q56BYXQF.js +61 -0
- package/dist/chunk-Q7EIIWTC.js +0 -0
- package/dist/chunk-REJESC5U.js +117 -0
- package/dist/chunk-RQGKSCEZ.js +0 -0
- package/dist/chunk-RQHJBTEU.js +10 -0
- package/dist/chunk-TMFOPHHN.js +299 -0
- package/dist/chunk-XGKULLYE.js +40 -0
- package/dist/chunk-XIHMJ7ZQ.js +614 -0
- package/dist/chunk-YJ2G3XO5.js +1048 -0
- package/dist/chunk-YNN4O57I.js +754 -0
- package/dist/code-block-DjXf8eOG.d.ts +19 -0
- package/dist/document-editor-pane-A5LT5H4N.js +12 -0
- package/dist/document-editor-pane-DyDEX_Zm.d.ts +124 -0
- package/dist/editor.d.ts +120 -0
- package/dist/editor.js +34 -0
- package/dist/files.d.ts +175 -0
- package/dist/files.js +20 -0
- package/dist/hooks.d.ts +56 -0
- package/dist/hooks.js +41 -0
- package/dist/index.d.ts +43 -0
- package/dist/index.js +446 -0
- package/dist/markdown.d.ts +15 -0
- package/dist/markdown.js +14 -0
- package/dist/message-BHWbxBtT.d.ts +15 -0
- package/dist/openui.d.ts +115 -0
- package/dist/openui.js +12 -0
- package/dist/parts-dj7AcUg0.d.ts +36 -0
- package/dist/primitives.d.ts +332 -0
- package/dist/primitives.js +191 -0
- package/dist/run-PfLmDAox.d.ts +41 -0
- package/dist/run.d.ts +69 -0
- package/dist/run.js +36 -0
- package/dist/sdk-hooks.d.ts +285 -0
- package/dist/sdk-hooks.js +31 -0
- package/dist/stores.d.ts +17 -0
- package/dist/stores.js +76 -0
- package/dist/tool-call-feed-Bs3MyQMT.d.ts +68 -0
- package/dist/tool-display-z4JcDmMQ.d.ts +32 -0
- package/dist/tool-previews.d.ts +48 -0
- package/dist/tool-previews.js +21 -0
- package/dist/types.d.ts +19 -0
- package/dist/types.js +1 -0
- package/dist/utils.d.ts +45 -0
- package/dist/utils.js +32 -0
- package/package.json +193 -0
- package/src/auth/auth.tsx +228 -0
- package/src/auth/index.ts +13 -0
- package/src/auth/login-layout.tsx +46 -0
- package/src/chat/agent-timeline.stories.tsx +429 -0
- package/src/chat/agent-timeline.tsx +360 -0
- package/src/chat/chat-container.tsx +486 -0
- package/src/chat/chat-input.stories.tsx +142 -0
- package/src/chat/chat-input.tsx +389 -0
- package/src/chat/chat-message.stories.tsx +237 -0
- package/src/chat/chat-message.tsx +129 -0
- package/src/chat/index.ts +18 -0
- package/src/chat/message-list.stories.tsx +336 -0
- package/src/chat/message-list.tsx +79 -0
- package/src/chat/thinking-indicator.stories.tsx +56 -0
- package/src/chat/thinking-indicator.tsx +30 -0
- package/src/chat/user-message.stories.tsx +92 -0
- package/src/chat/user-message.tsx +43 -0
- package/src/editor/document-editor-pane.tsx +351 -0
- package/src/editor/editor-provider.tsx +428 -0
- package/src/editor/editor-toolbar.tsx +130 -0
- package/src/editor/index.ts +31 -0
- package/src/editor/markdown-conversion.ts +21 -0
- package/src/editor/markdown-document-editor.tsx +137 -0
- package/src/editor/tiptap-editor.tsx +331 -0
- package/src/editor/use-editor.ts +221 -0
- package/src/files/file-artifact-pane.tsx +183 -0
- package/src/files/file-preview.tsx +342 -0
- package/src/files/file-tabs.tsx +71 -0
- package/src/files/file-tree.tsx +258 -0
- package/src/files/index.ts +17 -0
- package/src/files/rich-file-tree.stories.tsx +104 -0
- package/src/files/rich-file-tree.test.tsx +42 -0
- package/src/files/rich-file-tree.tsx +232 -0
- package/src/hooks/index.ts +10 -0
- package/src/hooks/use-auth.ts +153 -0
- package/src/hooks/use-auto-scroll.ts +59 -0
- package/src/hooks/use-dropdown-menu.ts +40 -0
- package/src/hooks/use-live-time.test.tsx +40 -0
- package/src/hooks/use-live-time.ts +27 -0
- package/src/hooks/use-realtime-session.ts +319 -0
- package/src/hooks/use-run-collapse-state.ts +25 -0
- package/src/hooks/use-run-groups.ts +111 -0
- package/src/hooks/use-sdk-session.ts +575 -0
- package/src/hooks/use-sse-stream.ts +475 -0
- package/src/hooks/use-tool-call-stream.ts +96 -0
- package/src/index.ts +14 -0
- package/src/lib/utils.ts +6 -0
- package/src/markdown/code-block.tsx +198 -0
- package/src/markdown/index.ts +2 -0
- package/src/markdown/markdown.stories.tsx +190 -0
- package/src/markdown/markdown.tsx +62 -0
- package/src/openui/index.ts +20 -0
- package/src/openui/openui-artifact-renderer.tsx +542 -0
- package/src/primitives/artifact-pane.tsx +91 -0
- package/src/primitives/avatar.stories.tsx +95 -0
- package/src/primitives/avatar.tsx +47 -0
- package/src/primitives/badge.stories.tsx +57 -0
- package/src/primitives/badge.tsx +97 -0
- package/src/primitives/button.stories.tsx +48 -0
- package/src/primitives/button.tsx +115 -0
- package/src/primitives/card.stories.tsx +53 -0
- package/src/primitives/card.tsx +98 -0
- package/src/primitives/code-block.stories.tsx +115 -0
- package/src/primitives/code-block.tsx +22 -0
- package/src/primitives/design-tokens.stories.tsx +162 -0
- package/src/primitives/dialog.stories.tsx +176 -0
- package/src/primitives/dialog.tsx +137 -0
- package/src/primitives/drop-zone.stories.tsx +123 -0
- package/src/primitives/drop-zone.tsx +131 -0
- package/src/primitives/dropdown-menu.stories.tsx +122 -0
- package/src/primitives/dropdown-menu.tsx +214 -0
- package/src/primitives/empty-state.stories.tsx +81 -0
- package/src/primitives/empty-state.tsx +40 -0
- package/src/primitives/index.ts +118 -0
- package/src/primitives/input.stories.tsx +113 -0
- package/src/primitives/input.tsx +136 -0
- package/src/primitives/label.stories.tsx +84 -0
- package/src/primitives/label.tsx +24 -0
- package/src/primitives/progress.stories.tsx +93 -0
- package/src/primitives/progress.tsx +50 -0
- package/src/primitives/segmented-control.test.tsx +328 -0
- package/src/primitives/segmented-control.tsx +154 -0
- package/src/primitives/select.stories.tsx +164 -0
- package/src/primitives/select.tsx +158 -0
- package/src/primitives/sidebar-drop-zone.stories.tsx +100 -0
- package/src/primitives/sidebar-drop-zone.tsx +149 -0
- package/src/primitives/skeleton.stories.tsx +79 -0
- package/src/primitives/skeleton.tsx +55 -0
- package/src/primitives/stat-card.stories.tsx +137 -0
- package/src/primitives/stat-card.tsx +97 -0
- package/src/primitives/switch.stories.tsx +85 -0
- package/src/primitives/switch.tsx +28 -0
- package/src/primitives/table.stories.tsx +170 -0
- package/src/primitives/table.tsx +116 -0
- package/src/primitives/tabs.stories.tsx +180 -0
- package/src/primitives/tabs.tsx +71 -0
- package/src/primitives/terminal-display.stories.tsx +191 -0
- package/src/primitives/terminal-display.tsx +189 -0
- package/src/primitives/theme-toggle.stories.tsx +32 -0
- package/src/primitives/theme-toggle.tsx +96 -0
- package/src/primitives/toast.stories.tsx +155 -0
- package/src/primitives/toast.tsx +190 -0
- package/src/primitives/upload-progress.stories.tsx +120 -0
- package/src/primitives/upload-progress.tsx +110 -0
- package/src/run/expanded-tool-detail.stories.tsx +182 -0
- package/src/run/expanded-tool-detail.tsx +186 -0
- package/src/run/index.ts +13 -0
- package/src/run/inline-thinking-item.stories.tsx +136 -0
- package/src/run/inline-thinking-item.tsx +120 -0
- package/src/run/inline-tool-item.stories.tsx +222 -0
- package/src/run/inline-tool-item.tsx +190 -0
- package/src/run/run-group.stories.tsx +322 -0
- package/src/run/run-group.tsx +569 -0
- package/src/run/run-item-primitives.tsx +17 -0
- package/src/run/tool-call-feed.stories.tsx +294 -0
- package/src/run/tool-call-feed.tsx +192 -0
- package/src/run/tool-call-step.stories.tsx +198 -0
- package/src/run/tool-call-step.tsx +240 -0
- package/src/sdk-hooks.ts +38 -0
- package/src/stores/active-sessions-store.ts +455 -0
- package/src/stores/chat-store.ts +43 -0
- package/src/stores/index.ts +2 -0
- package/src/tool-previews/command-preview.tsx +116 -0
- package/src/tool-previews/diff-preview.tsx +85 -0
- package/src/tool-previews/glob-results-preview.tsx +98 -0
- package/src/tool-previews/grep-results-preview.tsx +157 -0
- package/src/tool-previews/index.ts +22 -0
- package/src/tool-previews/preview-primitives.tsx +84 -0
- package/src/tool-previews/question-preview.tsx +101 -0
- package/src/tool-previews/web-search-preview.tsx +117 -0
- package/src/tool-previews/write-file-preview.tsx +80 -0
- package/src/types/branding.ts +11 -0
- package/src/types/index.ts +5 -0
- package/src/types/message.ts +13 -0
- package/src/types/parts.ts +51 -0
- package/src/types/run.ts +56 -0
- package/src/types/tool-display.ts +41 -0
- package/src/utils/copy-text.ts +30 -0
- package/src/utils/format.test.ts +43 -0
- package/src/utils/format.ts +56 -0
- package/src/utils/index.ts +10 -0
- package/src/utils/time-ago.ts +9 -0
- package/src/utils/tool-display.ts +238 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# @tangle-network/ui
|
|
2
|
+
|
|
3
|
+
## 1.0.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- b72f91d: Initial public release. 14 subpath exports: `primitives`, `chat`, `run`, `openui`, `files`, `editor`, `markdown`, `auth`, `hooks`, `sdk-hooks`, `stores`, `types`, `utils`, `tool-previews`. Bulk-imported from `@tangle-network/sandbox-ui`. Logo re-exported from `@tangle-network/brand`. `InlineCode` and themed `CodeBlock`/`CopyButton` exposed on the primitives subpath. Tailwind v4-native; no CSS shipped — consumers re-import `@tangle-network/brand/styles`.
|
|
8
|
+
|
|
9
|
+
### Patch Changes
|
|
10
|
+
|
|
11
|
+
- Updated dependencies [2330781]
|
|
12
|
+
- @tangle-network/brand@0.3.0
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Tangle Network
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# @tangle-network/ui
|
|
2
|
+
|
|
3
|
+
Generic React UI components for Tangle products. Imports tokens from `@tangle-network/brand` (peer dep). Tailwind v4-native.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```sh
|
|
8
|
+
pnpm add @tangle-network/ui @tangle-network/brand react react-dom
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Use
|
|
12
|
+
|
|
13
|
+
```tsx
|
|
14
|
+
import { Button } from "@tangle-network/ui/primitives";
|
|
15
|
+
import { Logo } from "@tangle-network/brand";
|
|
16
|
+
|
|
17
|
+
export function App() {
|
|
18
|
+
return (
|
|
19
|
+
<>
|
|
20
|
+
<Logo size="md" />
|
|
21
|
+
<Button>Click</Button>
|
|
22
|
+
</>
|
|
23
|
+
);
|
|
24
|
+
}
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Subpaths
|
|
28
|
+
|
|
29
|
+
Fourteen named exports: `primitives`, `chat`, `run`, `openui`, `files`, `editor`, `markdown`, `auth`, `hooks`, `sdk-hooks`, `stores`, `types`, `utils`, `tool-previews`.
|
|
30
|
+
|
|
31
|
+
## Optional peers
|
|
32
|
+
|
|
33
|
+
`@nanostores/react`, `nanostores`, `@tanstack/react-query`, `@hocuspocus/provider`, `@tiptap/*`, `yjs` — install only the peers you actually use. The package will type-check and tree-shake without them.
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import * as nanostores from 'nanostores';
|
|
2
|
+
|
|
3
|
+
type SessionProjectKey = string | number;
|
|
4
|
+
type ActiveSessionStatus = "idle" | "running" | "attention-needed" | "error";
|
|
5
|
+
type ActiveSessionReconnectState = "idle" | "reconnecting" | "failed";
|
|
6
|
+
type ActiveSessionConnectionState = "disconnected" | "connecting" | "connected" | "reconnecting" | "error";
|
|
7
|
+
type ActiveSessionTransportMode = "websocket" | "sse" | "polling" | "custom";
|
|
8
|
+
interface ActiveSessionRecord {
|
|
9
|
+
sessionId: string;
|
|
10
|
+
projectId: SessionProjectKey | null;
|
|
11
|
+
projectLabel?: string;
|
|
12
|
+
title?: string;
|
|
13
|
+
href?: string;
|
|
14
|
+
registeredAt: number;
|
|
15
|
+
lastActivityAt: number;
|
|
16
|
+
lastEventAt: number | null;
|
|
17
|
+
status: ActiveSessionStatus;
|
|
18
|
+
isRunning: boolean;
|
|
19
|
+
isForeground: boolean;
|
|
20
|
+
needsAttention: boolean;
|
|
21
|
+
connectionState: ActiveSessionConnectionState;
|
|
22
|
+
reconnectState: ActiveSessionReconnectState;
|
|
23
|
+
transportMode: ActiveSessionTransportMode | null;
|
|
24
|
+
lastError: string | null;
|
|
25
|
+
metadata?: Record<string, unknown>;
|
|
26
|
+
}
|
|
27
|
+
interface ActiveSessionsState {
|
|
28
|
+
sessions: Record<string, ActiveSessionRecord>;
|
|
29
|
+
lastUpdatedAt: number;
|
|
30
|
+
}
|
|
31
|
+
interface RegisterActiveSessionOptions {
|
|
32
|
+
sessionId: string;
|
|
33
|
+
projectId?: SessionProjectKey | null;
|
|
34
|
+
projectLabel?: string;
|
|
35
|
+
title?: string;
|
|
36
|
+
href?: string;
|
|
37
|
+
metadata?: Record<string, unknown>;
|
|
38
|
+
}
|
|
39
|
+
interface ActiveSessionConnectionOptions {
|
|
40
|
+
connectionState: ActiveSessionConnectionState;
|
|
41
|
+
reconnectState?: ActiveSessionReconnectState;
|
|
42
|
+
transportMode?: ActiveSessionTransportMode | null;
|
|
43
|
+
lastError?: string | null;
|
|
44
|
+
lastEventAt?: number | null;
|
|
45
|
+
}
|
|
46
|
+
interface ActiveSessionActivityOptions {
|
|
47
|
+
lastEventAt?: number | null;
|
|
48
|
+
}
|
|
49
|
+
interface ActiveProjectActivity {
|
|
50
|
+
projectId: SessionProjectKey;
|
|
51
|
+
projectLabel?: string;
|
|
52
|
+
activeSessionCount: number;
|
|
53
|
+
runningSessionIds: string[];
|
|
54
|
+
lastActivityAt: number;
|
|
55
|
+
}
|
|
56
|
+
declare const activeSessionsAtom: nanostores.PreinitializedWritableAtom<ActiveSessionsState> & object;
|
|
57
|
+
declare function registerActiveSession(options: RegisterActiveSessionOptions): void;
|
|
58
|
+
declare function unregisterActiveSession(sessionId: string): void;
|
|
59
|
+
declare function setForegroundActiveSession(sessionId: string | null): void;
|
|
60
|
+
declare function updateActiveSessionMeta(sessionId: string, meta: Partial<Pick<ActiveSessionRecord, "title" | "href" | "projectId" | "projectLabel" | "metadata">>): void;
|
|
61
|
+
declare function setActiveSessionConnection(sessionId: string, options: ActiveSessionConnectionOptions): void;
|
|
62
|
+
declare function setActiveSessionRunning(sessionId: string, isRunning: boolean, options?: ActiveSessionActivityOptions): void;
|
|
63
|
+
declare function setActiveSessionAttention(sessionId: string, needsAttention: boolean, options?: ActiveSessionActivityOptions): void;
|
|
64
|
+
declare function setActiveSessionError(sessionId: string, error: string | null): void;
|
|
65
|
+
declare function bumpActiveSessionActivity(sessionId: string, options?: ActiveSessionActivityOptions): void;
|
|
66
|
+
declare function resetActiveSessions(): void;
|
|
67
|
+
declare function getAllActiveSessions(state: ActiveSessionsState): ActiveSessionRecord[];
|
|
68
|
+
declare function getActiveSession(state: ActiveSessionsState, sessionId: string): ActiveSessionRecord | null;
|
|
69
|
+
declare function getSessionsForProject(state: ActiveSessionsState, projectId: SessionProjectKey): ActiveSessionRecord[];
|
|
70
|
+
declare function getSessionsForNavbar(state: ActiveSessionsState, projectId?: SessionProjectKey | null): ActiveSessionRecord[];
|
|
71
|
+
declare function getSessionsByActivity(state: ActiveSessionsState): ActiveSessionRecord[];
|
|
72
|
+
declare function getTotalRunningSessionCount(state: ActiveSessionsState): number;
|
|
73
|
+
declare function hasBackgroundRunningSessions(state: ActiveSessionsState): boolean;
|
|
74
|
+
declare function getAllProjectActivity(state: ActiveSessionsState): ActiveProjectActivity[];
|
|
75
|
+
declare function useActiveSessionsState(): ActiveSessionsState;
|
|
76
|
+
declare function useActiveSessions(): ActiveSessionRecord[];
|
|
77
|
+
declare function useActiveSession(sessionId: string | null): ActiveSessionRecord | null;
|
|
78
|
+
declare function useProjectSessions(projectId: SessionProjectKey | null): ActiveSessionRecord[];
|
|
79
|
+
declare function useNavbarSessions(projectId?: SessionProjectKey | null): ActiveSessionRecord[];
|
|
80
|
+
declare function useSessionsByActivity(): ActiveSessionRecord[];
|
|
81
|
+
declare function useProjectActivity(): ActiveProjectActivity[];
|
|
82
|
+
declare function useTotalRunningSessions(): number;
|
|
83
|
+
declare function useHasBackgroundRunningSessions(): boolean;
|
|
84
|
+
|
|
85
|
+
export { type ActiveProjectActivity as A, updateActiveSessionMeta as B, useActiveSession as C, useActiveSessions as D, useActiveSessionsState as E, useHasBackgroundRunningSessions as F, useNavbarSessions as G, useProjectActivity as H, useProjectSessions as I, useSessionsByActivity as J, useTotalRunningSessions as K, type RegisterActiveSessionOptions as R, type SessionProjectKey as S, type ActiveSessionActivityOptions as a, type ActiveSessionConnectionOptions as b, type ActiveSessionConnectionState as c, type ActiveSessionReconnectState as d, type ActiveSessionRecord as e, type ActiveSessionStatus as f, type ActiveSessionTransportMode as g, type ActiveSessionsState as h, activeSessionsAtom as i, bumpActiveSessionActivity as j, getActiveSession as k, getAllActiveSessions as l, getAllProjectActivity as m, getSessionsByActivity as n, getSessionsForNavbar as o, getSessionsForProject as p, getTotalRunningSessionCount as q, hasBackgroundRunningSessions as r, registerActiveSession as s, resetActiveSessions as t, setActiveSessionAttention as u, setActiveSessionConnection as v, setActiveSessionError as w, setActiveSessionRunning as x, setForegroundActiveSession as y, unregisterActiveSession as z };
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { ReactNode } from 'react';
|
|
3
|
+
|
|
4
|
+
interface ArtifactPaneProps {
|
|
5
|
+
eyebrow?: ReactNode;
|
|
6
|
+
title: ReactNode;
|
|
7
|
+
subtitle?: ReactNode;
|
|
8
|
+
meta?: ReactNode;
|
|
9
|
+
headerActions?: ReactNode;
|
|
10
|
+
tabs?: ReactNode;
|
|
11
|
+
toolbar?: ReactNode;
|
|
12
|
+
footer?: ReactNode;
|
|
13
|
+
emptyState?: ReactNode;
|
|
14
|
+
children?: ReactNode;
|
|
15
|
+
className?: string;
|
|
16
|
+
contentClassName?: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* ArtifactPane — shared frame for files, previews, documents, inspectors, and
|
|
20
|
+
* other artifact-like surfaces inside sandbox applications.
|
|
21
|
+
*/
|
|
22
|
+
declare function ArtifactPane({ eyebrow, title, subtitle, meta, headerActions, tabs, toolbar, footer, emptyState, children, className, contentClassName, }: ArtifactPaneProps): react_jsx_runtime.JSX.Element;
|
|
23
|
+
|
|
24
|
+
export { ArtifactPane as A, type ArtifactPaneProps as a };
|
package/dist/auth.d.ts
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { a as ButtonProps } from './button-CMQuQEW_.js';
|
|
4
|
+
import 'class-variance-authority/types';
|
|
5
|
+
|
|
6
|
+
interface SessionUser {
|
|
7
|
+
customer_id: string;
|
|
8
|
+
email: string;
|
|
9
|
+
name?: string;
|
|
10
|
+
tier?: string;
|
|
11
|
+
github?: {
|
|
12
|
+
login: string;
|
|
13
|
+
connected: boolean;
|
|
14
|
+
} | null;
|
|
15
|
+
session_expires_at: string;
|
|
16
|
+
}
|
|
17
|
+
interface GitHubLoginButtonProps extends Omit<ButtonProps, "onClick"> {
|
|
18
|
+
/** API base URL (defaults to /auth/github) */
|
|
19
|
+
authUrl?: string;
|
|
20
|
+
/** Product variant for styling */
|
|
21
|
+
variant?: "sandbox" | "default" | "outline";
|
|
22
|
+
}
|
|
23
|
+
declare function GitHubLoginButton({ authUrl, variant, className, children, ...props }: GitHubLoginButtonProps): react_jsx_runtime.JSX.Element;
|
|
24
|
+
interface UserMenuProps {
|
|
25
|
+
user: SessionUser;
|
|
26
|
+
/** API base URL for logout */
|
|
27
|
+
logoutUrl?: string;
|
|
28
|
+
/** Links to show in menu */
|
|
29
|
+
links?: Array<{
|
|
30
|
+
href: string;
|
|
31
|
+
label: string;
|
|
32
|
+
icon?: React.ReactNode;
|
|
33
|
+
}>;
|
|
34
|
+
/** Product variant for styling */
|
|
35
|
+
variant?: "sandbox";
|
|
36
|
+
/** Callback when logout is clicked */
|
|
37
|
+
onLogout?: () => void;
|
|
38
|
+
}
|
|
39
|
+
declare function UserMenu({ user, logoutUrl, links, variant, onLogout, }: UserMenuProps): react_jsx_runtime.JSX.Element;
|
|
40
|
+
interface AuthHeaderProps {
|
|
41
|
+
/** Current session user (null if not logged in) */
|
|
42
|
+
user: SessionUser | null;
|
|
43
|
+
/** Whether session is loading */
|
|
44
|
+
loading?: boolean;
|
|
45
|
+
/** Product variant */
|
|
46
|
+
variant?: "sandbox";
|
|
47
|
+
/** API base URL */
|
|
48
|
+
apiBaseUrl?: string;
|
|
49
|
+
/** Links for user menu */
|
|
50
|
+
menuLinks?: UserMenuProps["links"];
|
|
51
|
+
/** Custom className */
|
|
52
|
+
className?: string;
|
|
53
|
+
}
|
|
54
|
+
declare function AuthHeader({ user, loading, variant, apiBaseUrl, menuLinks, className, }: AuthHeaderProps): react_jsx_runtime.JSX.Element;
|
|
55
|
+
|
|
56
|
+
interface LoginLayoutProps {
|
|
57
|
+
title?: React.ReactNode;
|
|
58
|
+
subtitle?: React.ReactNode;
|
|
59
|
+
brandIcon?: React.ReactNode;
|
|
60
|
+
children: React.ReactNode;
|
|
61
|
+
className?: string;
|
|
62
|
+
/** (Deprecated) terminal lines from legacy layout, kept for backwards compatibility */
|
|
63
|
+
terminalLines?: string[];
|
|
64
|
+
/** (Deprecated) tagline, kept for backwards compatibility */
|
|
65
|
+
tagline?: React.ReactNode;
|
|
66
|
+
/** (Deprecated) footerLinks, kept for backwards compatibility */
|
|
67
|
+
footerLinks?: {
|
|
68
|
+
label: string;
|
|
69
|
+
href: string;
|
|
70
|
+
}[];
|
|
71
|
+
}
|
|
72
|
+
declare function LoginLayout({ title, subtitle, brandIcon, children, className, }: LoginLayoutProps): react_jsx_runtime.JSX.Element;
|
|
73
|
+
|
|
74
|
+
export { AuthHeader, type AuthHeaderProps, GitHubLoginButton, type GitHubLoginButtonProps, LoginLayout, type LoginLayoutProps, type SessionUser, UserMenu, type UserMenuProps };
|
package/dist/auth.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import {
|
|
2
|
+
AuthHeader,
|
|
3
|
+
GitHubLoginButton,
|
|
4
|
+
LoginLayout,
|
|
5
|
+
UserMenu
|
|
6
|
+
} from "./chunk-NKDZ7GZE.js";
|
|
7
|
+
import "./chunk-34A66VBG.js";
|
|
8
|
+
import "./chunk-MKTSMWVD.js";
|
|
9
|
+
import "./chunk-RQHJBTEU.js";
|
|
10
|
+
export {
|
|
11
|
+
AuthHeader,
|
|
12
|
+
GitHubLoginButton,
|
|
13
|
+
LoginLayout,
|
|
14
|
+
UserMenu
|
|
15
|
+
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import * as class_variance_authority_types from 'class-variance-authority/types';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
|
|
4
|
+
declare const buttonVariants: (props?: ({
|
|
5
|
+
variant?: "default" | "destructive" | "outline" | "secondary" | "ghost" | "link" | "sandbox" | null | undefined;
|
|
6
|
+
size?: "default" | "sm" | "lg" | "xl" | "icon" | null | undefined;
|
|
7
|
+
} & class_variance_authority_types.ClassProp) | undefined) => string;
|
|
8
|
+
interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
|
|
9
|
+
variant?: "default" | "destructive" | "outline" | "secondary" | "ghost" | "link" | "sandbox" | null;
|
|
10
|
+
size?: "default" | "sm" | "lg" | "xl" | "icon" | null;
|
|
11
|
+
asChild?: boolean;
|
|
12
|
+
loading?: boolean;
|
|
13
|
+
children?: React.ReactNode;
|
|
14
|
+
}
|
|
15
|
+
declare const Button: React.ForwardRefExoticComponent<ButtonProps & React.RefAttributes<HTMLButtonElement>>;
|
|
16
|
+
|
|
17
|
+
export { Button as B, type ButtonProps as a, buttonVariants as b };
|
package/dist/chat.d.ts
ADDED
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { ReactNode } from 'react';
|
|
3
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
4
|
+
import { S as SessionMessage } from './message-BHWbxBtT.js';
|
|
5
|
+
import { S as SessionPart, a as ToolPart } from './parts-dj7AcUg0.js';
|
|
6
|
+
import { AgentBranding } from './types.js';
|
|
7
|
+
import { C as CustomToolRenderer } from './tool-display-z4JcDmMQ.js';
|
|
8
|
+
import { R as Run, G as GroupedMessage } from './run-PfLmDAox.js';
|
|
9
|
+
import { OpenUIAction } from './openui.js';
|
|
10
|
+
import { T as ToolCallData } from './tool-call-feed-Bs3MyQMT.js';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* ChatInput — message input bar with file attach, drag-and-drop, send/cancel.
|
|
14
|
+
*
|
|
15
|
+
* - Auto-resizing textarea (up to max height)
|
|
16
|
+
* - Enter to send, Shift+Enter for newline
|
|
17
|
+
* - Drag-and-drop files onto the input with styled overlay
|
|
18
|
+
* - File attachment button (files) + folder attachment button
|
|
19
|
+
* - Pending file/folder chips
|
|
20
|
+
* - Cancel button when streaming
|
|
21
|
+
* - Optional model selector pill
|
|
22
|
+
*/
|
|
23
|
+
interface PendingFile {
|
|
24
|
+
id: string;
|
|
25
|
+
name: string;
|
|
26
|
+
size: number;
|
|
27
|
+
type: "file" | "folder";
|
|
28
|
+
/** Number of files inside (for folders) */
|
|
29
|
+
fileCount?: number;
|
|
30
|
+
status: "pending" | "uploading" | "ready" | "error";
|
|
31
|
+
}
|
|
32
|
+
interface ChatInputProps {
|
|
33
|
+
onSend: (message: string, files?: File[]) => void;
|
|
34
|
+
onCancel?: () => void;
|
|
35
|
+
isStreaming?: boolean;
|
|
36
|
+
disabled?: boolean;
|
|
37
|
+
placeholder?: string;
|
|
38
|
+
/** Currently selected model label */
|
|
39
|
+
modelLabel?: string;
|
|
40
|
+
onModelClick?: () => void;
|
|
41
|
+
/** Pending uploaded files */
|
|
42
|
+
pendingFiles?: PendingFile[];
|
|
43
|
+
onRemoveFile?: (id: string) => void;
|
|
44
|
+
/** Called when files are attached (via button or drag-and-drop) */
|
|
45
|
+
onAttach?: (files: FileList) => void;
|
|
46
|
+
/** Called when a folder is selected via the folder button */
|
|
47
|
+
onAttachFolder?: (files: FileList) => void;
|
|
48
|
+
/** Accepted file types for the file input (e.g. ".pdf,.csv") */
|
|
49
|
+
accept?: string;
|
|
50
|
+
/** Drop zone overlay title */
|
|
51
|
+
dropTitle?: string;
|
|
52
|
+
/** Drop zone overlay description */
|
|
53
|
+
dropDescription?: string;
|
|
54
|
+
className?: string;
|
|
55
|
+
/** Label above the input. Set to null to hide. Default: "Agent Command Deck" */
|
|
56
|
+
inputLabel?: string | null;
|
|
57
|
+
/** Status text shown when idle. Set to null to hide. Default: "Ready for next instruction" */
|
|
58
|
+
idleStatus?: string | null;
|
|
59
|
+
/** Status text shown when streaming. Set to null to hide. Default: "Streaming response" */
|
|
60
|
+
streamingStatus?: string | null;
|
|
61
|
+
/** Hide the Cmd+L focus shortcut hint */
|
|
62
|
+
hideShortcutHint?: boolean;
|
|
63
|
+
}
|
|
64
|
+
declare function ChatInput({ onSend, onCancel, isStreaming, disabled, placeholder, modelLabel, onModelClick, pendingFiles, onRemoveFile, onAttach, onAttachFolder, accept, dropTitle, dropDescription, className, inputLabel, idleStatus, streamingStatus, hideShortcutHint, }: ChatInputProps): react_jsx_runtime.JSX.Element;
|
|
65
|
+
|
|
66
|
+
interface ChatContainerProps {
|
|
67
|
+
messages: SessionMessage[];
|
|
68
|
+
partMap: Record<string, SessionPart[]>;
|
|
69
|
+
isStreaming: boolean;
|
|
70
|
+
onSend?: (text: string) => void;
|
|
71
|
+
onCancel?: () => void;
|
|
72
|
+
branding?: AgentBranding;
|
|
73
|
+
placeholder?: string;
|
|
74
|
+
className?: string;
|
|
75
|
+
/** Hide the input area (useful for read-only views). */
|
|
76
|
+
hideInput?: boolean;
|
|
77
|
+
/** Custom renderer for tool details. Return ReactNode to override, null to use default. */
|
|
78
|
+
renderToolDetail?: CustomToolRenderer;
|
|
79
|
+
/** Presentation mode for the session view. */
|
|
80
|
+
presentation?: "runs" | "timeline";
|
|
81
|
+
modelLabel?: string;
|
|
82
|
+
onModelClick?: () => void;
|
|
83
|
+
pendingFiles?: PendingFile[];
|
|
84
|
+
onRemoveFile?: (id: string) => void;
|
|
85
|
+
onAttach?: (files: FileList) => void;
|
|
86
|
+
disabled?: boolean;
|
|
87
|
+
/** Callback when an OpenUI action button is pressed within inline OpenUI blocks. */
|
|
88
|
+
onOpenUIAction?: (action: OpenUIAction) => void;
|
|
89
|
+
/** Enable rendering OpenUI schemas inline in the chat timeline. Defaults to true. */
|
|
90
|
+
enableOpenUI?: boolean;
|
|
91
|
+
/** Optional actions rendered beside each grouped assistant run. */
|
|
92
|
+
renderRunActions?: (run: Run) => ReactNode;
|
|
93
|
+
/** Optional actions rendered below each user message bubble. */
|
|
94
|
+
renderUserMessageActions?: (message: SessionMessage, parts: SessionPart[]) => ReactNode;
|
|
95
|
+
/** Optional actions rendered beside individual tool items. */
|
|
96
|
+
renderToolActions?: (part: ToolPart, options: {
|
|
97
|
+
run: Run;
|
|
98
|
+
messageId: string;
|
|
99
|
+
partIndex: number;
|
|
100
|
+
}) => ReactNode;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Full chat container: message list + auto-scroll + input area.
|
|
104
|
+
* Orchestrates useRunGroups, useRunCollapseState, and useAutoScroll.
|
|
105
|
+
*/
|
|
106
|
+
declare const ChatContainer: React.MemoExoticComponent<({ messages, partMap, isStreaming, onSend, onCancel, branding, placeholder, className, hideInput, renderToolDetail, presentation, modelLabel, onModelClick, pendingFiles, onRemoveFile, onAttach, disabled, onOpenUIAction, enableOpenUI, renderRunActions, renderUserMessageActions, renderToolActions, }: ChatContainerProps) => react_jsx_runtime.JSX.Element>;
|
|
107
|
+
|
|
108
|
+
interface MessageListProps {
|
|
109
|
+
groups: GroupedMessage[];
|
|
110
|
+
partMap: Record<string, SessionPart[]>;
|
|
111
|
+
isCollapsed: (runId: string) => boolean;
|
|
112
|
+
onToggleCollapse: (runId: string) => void;
|
|
113
|
+
branding?: AgentBranding;
|
|
114
|
+
renderToolDetail?: CustomToolRenderer;
|
|
115
|
+
renderRunActions?: (group: Extract<GroupedMessage, {
|
|
116
|
+
type: "run";
|
|
117
|
+
}>["run"]) => ReactNode;
|
|
118
|
+
renderUserMessageActions?: (message: SessionMessage, parts: SessionPart[]) => ReactNode;
|
|
119
|
+
renderToolActions?: (part: ToolPart, options: {
|
|
120
|
+
run: Extract<GroupedMessage, {
|
|
121
|
+
type: "run";
|
|
122
|
+
}>["run"];
|
|
123
|
+
messageId: string;
|
|
124
|
+
partIndex: number;
|
|
125
|
+
}) => ReactNode;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Maps GroupedMessage[] to UserMessage and RunGroup components.
|
|
129
|
+
* This is the main render list for the chat view.
|
|
130
|
+
*/
|
|
131
|
+
declare const MessageList: React.MemoExoticComponent<({ groups, partMap, isCollapsed, onToggleCollapse, branding, renderToolDetail, renderRunActions, renderUserMessageActions, renderToolActions, }: MessageListProps) => react_jsx_runtime.JSX.Element>;
|
|
132
|
+
|
|
133
|
+
interface UserMessageProps {
|
|
134
|
+
message: SessionMessage;
|
|
135
|
+
parts: SessionPart[];
|
|
136
|
+
actions?: ReactNode;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Simple user message bubble.
|
|
140
|
+
* Renders text parts from the user's message.
|
|
141
|
+
*/
|
|
142
|
+
declare const UserMessage: React.MemoExoticComponent<({ message, parts, actions }: UserMessageProps) => react_jsx_runtime.JSX.Element | null>;
|
|
143
|
+
|
|
144
|
+
type MessageRole = "user" | "assistant" | "system";
|
|
145
|
+
interface ChatMessageProps {
|
|
146
|
+
role: MessageRole;
|
|
147
|
+
content: string;
|
|
148
|
+
/** Inline tool call activity rendered between text chunks */
|
|
149
|
+
toolCalls?: ReactNode;
|
|
150
|
+
/** Whether the message is still streaming */
|
|
151
|
+
isStreaming?: boolean;
|
|
152
|
+
/** Timestamp */
|
|
153
|
+
timestamp?: Date;
|
|
154
|
+
className?: string;
|
|
155
|
+
/** Custom user label. Default: "You" */
|
|
156
|
+
userLabel?: string;
|
|
157
|
+
/** Custom assistant label. Default: "Agent" */
|
|
158
|
+
assistantLabel?: string;
|
|
159
|
+
/** Hide the role label row entirely */
|
|
160
|
+
hideRoleLabel?: boolean;
|
|
161
|
+
/** Hide the avatar icon */
|
|
162
|
+
hideAvatar?: boolean;
|
|
163
|
+
/** Custom avatar element (replaces default User/Bot icon) */
|
|
164
|
+
avatar?: ReactNode;
|
|
165
|
+
}
|
|
166
|
+
declare function ChatMessage({ role, content, toolCalls, isStreaming, timestamp, className, userLabel, assistantLabel, hideRoleLabel, hideAvatar, avatar, }: ChatMessageProps): react_jsx_runtime.JSX.Element;
|
|
167
|
+
|
|
168
|
+
interface ThinkingIndicatorProps {
|
|
169
|
+
className?: string;
|
|
170
|
+
}
|
|
171
|
+
declare function ThinkingIndicator({ className }: ThinkingIndicatorProps): react_jsx_runtime.JSX.Element;
|
|
172
|
+
|
|
173
|
+
type AgentTimelineTone = "default" | "info" | "success" | "warning" | "error";
|
|
174
|
+
interface AgentTimelineMessageItem {
|
|
175
|
+
id: string;
|
|
176
|
+
kind: "message";
|
|
177
|
+
role: MessageRole;
|
|
178
|
+
content: string;
|
|
179
|
+
toolCalls?: ReactNode;
|
|
180
|
+
isStreaming?: boolean;
|
|
181
|
+
timestamp?: Date;
|
|
182
|
+
after?: ReactNode;
|
|
183
|
+
}
|
|
184
|
+
interface AgentTimelineToolItem {
|
|
185
|
+
id: string;
|
|
186
|
+
kind: "tool";
|
|
187
|
+
call: ToolCallData;
|
|
188
|
+
}
|
|
189
|
+
interface AgentTimelineToolGroupItem {
|
|
190
|
+
id: string;
|
|
191
|
+
kind: "tool_group";
|
|
192
|
+
title?: string;
|
|
193
|
+
calls: ToolCallData[];
|
|
194
|
+
}
|
|
195
|
+
interface AgentTimelineStatusItem {
|
|
196
|
+
id: string;
|
|
197
|
+
kind: "status";
|
|
198
|
+
label: string;
|
|
199
|
+
detail?: string;
|
|
200
|
+
tone?: AgentTimelineTone;
|
|
201
|
+
}
|
|
202
|
+
interface AgentTimelineArtifactItem {
|
|
203
|
+
id: string;
|
|
204
|
+
kind: "artifact";
|
|
205
|
+
title: string;
|
|
206
|
+
description?: string;
|
|
207
|
+
meta?: ReactNode;
|
|
208
|
+
icon?: ReactNode;
|
|
209
|
+
tone?: AgentTimelineTone;
|
|
210
|
+
action?: ReactNode;
|
|
211
|
+
onClick?: () => void;
|
|
212
|
+
}
|
|
213
|
+
interface AgentTimelineCustomItem {
|
|
214
|
+
id: string;
|
|
215
|
+
kind: "custom";
|
|
216
|
+
content: ReactNode;
|
|
217
|
+
}
|
|
218
|
+
type AgentTimelineItem = AgentTimelineMessageItem | AgentTimelineToolItem | AgentTimelineToolGroupItem | AgentTimelineStatusItem | AgentTimelineArtifactItem | AgentTimelineCustomItem;
|
|
219
|
+
interface AgentTimelineProps {
|
|
220
|
+
items: AgentTimelineItem[];
|
|
221
|
+
isThinking?: boolean;
|
|
222
|
+
emptyState?: ReactNode;
|
|
223
|
+
className?: string;
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* AgentTimeline — unified mixed-content timeline for agent-backed sandbox
|
|
227
|
+
* sessions. Renders messages, tool steps, status cards, and artifact handoffs in
|
|
228
|
+
* a single execution narrative.
|
|
229
|
+
*/
|
|
230
|
+
declare function AgentTimeline({ items, isThinking, emptyState, className, }: AgentTimelineProps): react_jsx_runtime.JSX.Element | null;
|
|
231
|
+
|
|
232
|
+
export { AgentTimeline, type AgentTimelineArtifactItem, type AgentTimelineCustomItem, type AgentTimelineItem, type AgentTimelineMessageItem, type AgentTimelineProps, type AgentTimelineStatusItem, type AgentTimelineTone, type AgentTimelineToolGroupItem, type AgentTimelineToolItem, ChatContainer, type ChatContainerProps, ChatInput, type ChatInputProps, ChatMessage, type ChatMessageProps, MessageList, type MessageListProps, type MessageRole, type PendingFile, ThinkingIndicator, type ThinkingIndicatorProps, UserMessage, type UserMessageProps };
|
package/dist/chat.js
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import {
|
|
2
|
+
AgentTimeline,
|
|
3
|
+
ChatContainer,
|
|
4
|
+
ChatInput,
|
|
5
|
+
ChatMessage,
|
|
6
|
+
MessageList,
|
|
7
|
+
ThinkingIndicator,
|
|
8
|
+
UserMessage
|
|
9
|
+
} from "./chunk-2NFQRQOD.js";
|
|
10
|
+
import "./chunk-54SQQMMM.js";
|
|
11
|
+
import "./chunk-YNN4O57I.js";
|
|
12
|
+
import "./chunk-2VH6PUXD.js";
|
|
13
|
+
import "./chunk-4CLN43XT.js";
|
|
14
|
+
import "./chunk-BX6AQMUS.js";
|
|
15
|
+
import "./chunk-XIHMJ7ZQ.js";
|
|
16
|
+
import "./chunk-TMFOPHHN.js";
|
|
17
|
+
import "./chunk-GYPQXTJU.js";
|
|
18
|
+
import "./chunk-MKTSMWVD.js";
|
|
19
|
+
import "./chunk-CD53GZOM.js";
|
|
20
|
+
import "./chunk-66BNMOVT.js";
|
|
21
|
+
import "./chunk-RQHJBTEU.js";
|
|
22
|
+
export {
|
|
23
|
+
AgentTimeline,
|
|
24
|
+
ChatContainer,
|
|
25
|
+
ChatInput,
|
|
26
|
+
ChatMessage,
|
|
27
|
+
MessageList,
|
|
28
|
+
ThinkingIndicator,
|
|
29
|
+
UserMessage
|
|
30
|
+
};
|