@tagit/ai-client-react 0.1.3-beta.1 → 0.3.0-beta.1
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 +296 -0
- package/dist/chat-conversation.d.ts +10 -0
- package/dist/chat-conversation.d.ts.map +1 -0
- package/dist/chat-conversation.js +157 -0
- package/dist/chat-conversation.js.map +1 -0
- package/dist/chat-widget.d.ts +3 -2
- package/dist/chat-widget.d.ts.map +1 -1
- package/dist/chat-widget.js +14 -2
- package/dist/chat-widget.js.map +1 -1
- package/dist/index.d.ts +3 -12
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -12
- package/dist/index.js.map +1 -1
- package/dist/renderers/ChartRenderer.d.ts +7 -0
- package/dist/renderers/ChartRenderer.d.ts.map +1 -0
- package/dist/renderers/ChartRenderer.js +52 -0
- package/dist/renderers/ChartRenderer.js.map +1 -0
- package/dist/renderers/ContentBlockRenderer.d.ts +10 -0
- package/dist/renderers/ContentBlockRenderer.d.ts.map +1 -0
- package/dist/renderers/ContentBlockRenderer.js +13 -0
- package/dist/renderers/ContentBlockRenderer.js.map +1 -0
- package/dist/renderers/MarkdownRenderer.d.ts +8 -0
- package/dist/renderers/MarkdownRenderer.d.ts.map +1 -0
- package/dist/renderers/MarkdownRenderer.js +57 -0
- package/dist/renderers/MarkdownRenderer.js.map +1 -0
- package/package.json +12 -3
- package/src/chat-widget.css +619 -2
package/README.md
ADDED
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
# @tagit/ai-client-react
|
|
2
|
+
|
|
3
|
+
React integration layer for tagIt AI.
|
|
4
|
+
|
|
5
|
+
Use this package when you want a self-contained chat experience in a React app. It builds on `@tagit/ai-client-core`, which owns the client engine, orchestrator transport, state, and collector emission.
|
|
6
|
+
|
|
7
|
+
This README is the source of truth for integrating the React package.
|
|
8
|
+
|
|
9
|
+
## What This Package Provides
|
|
10
|
+
|
|
11
|
+
- `AIClientProvider` for React context
|
|
12
|
+
- `useAIClient`, `useConversation`, and `useClientEvents`
|
|
13
|
+
- `ChatWidget` for a full embeddable chat shell
|
|
14
|
+
- `ChatConversation` for a lighter conversation surface
|
|
15
|
+
- the widget stylesheet for direct import
|
|
16
|
+
|
|
17
|
+
## Public Imports
|
|
18
|
+
|
|
19
|
+
Supported public imports:
|
|
20
|
+
|
|
21
|
+
- `@tagit/ai-client-core`
|
|
22
|
+
- `@tagit/ai-client-core/config`
|
|
23
|
+
- `@tagit/ai-client-core/types`
|
|
24
|
+
- `@tagit/ai-client-react`
|
|
25
|
+
- `@tagit/ai-client-react/chat-widget`
|
|
26
|
+
- `@tagit/ai-client-react/chat-widget.css`
|
|
27
|
+
- `@tagit/ai-client-react/hooks`
|
|
28
|
+
- `@tagit/ai-client-react/provider`
|
|
29
|
+
- `@tagit/ai-client-react/conversation`
|
|
30
|
+
|
|
31
|
+
Do not import from `dist/*` or from internal source paths.
|
|
32
|
+
|
|
33
|
+
## Install
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
npm install @tagit/ai-client-core @tagit/ai-client-react
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Minimal Working Example
|
|
40
|
+
|
|
41
|
+
This is the smallest known-good React embed.
|
|
42
|
+
|
|
43
|
+
```tsx
|
|
44
|
+
import { AIClient, createDefaultConfig } from '@tagit/ai-client-core';
|
|
45
|
+
import { AIClientProvider, ChatWidget } from '@tagit/ai-client-react';
|
|
46
|
+
import '@tagit/ai-client-react/chat-widget.css';
|
|
47
|
+
|
|
48
|
+
const client = new AIClient(
|
|
49
|
+
createDefaultConfig('your-use-case-id', 'https://your-orchestrator.example.com', {
|
|
50
|
+
collector: {
|
|
51
|
+
enabled: false,
|
|
52
|
+
},
|
|
53
|
+
}),
|
|
54
|
+
);
|
|
55
|
+
|
|
56
|
+
export default function App() {
|
|
57
|
+
return (
|
|
58
|
+
<AIClientProvider client={client}>
|
|
59
|
+
<ChatWidget />
|
|
60
|
+
</AIClientProvider>
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
If that exact example does not render the default empty state and footer, verify the package install and runtime config before customizing anything.
|
|
66
|
+
|
|
67
|
+
## Core Concepts
|
|
68
|
+
|
|
69
|
+
### `@tagit/ai-client-core`
|
|
70
|
+
|
|
71
|
+
This is the headless engine:
|
|
72
|
+
|
|
73
|
+
- orchestrator config and transport
|
|
74
|
+
- conversation state
|
|
75
|
+
- SSE streaming
|
|
76
|
+
- retry and timeout handling
|
|
77
|
+
- collector emission
|
|
78
|
+
|
|
79
|
+
### `@tagit/ai-client-react`
|
|
80
|
+
|
|
81
|
+
This is the React shell:
|
|
82
|
+
|
|
83
|
+
- provider + hooks
|
|
84
|
+
- stock chat widget
|
|
85
|
+
- inline or overlay rendering
|
|
86
|
+
- shell styling and theming
|
|
87
|
+
|
|
88
|
+
Treat the core package as the engine and the React package as the UI layer on top.
|
|
89
|
+
|
|
90
|
+
## Widget Modes
|
|
91
|
+
|
|
92
|
+
`ChatWidget` supports two modes:
|
|
93
|
+
|
|
94
|
+
- `mode="overlay"` for floating chat
|
|
95
|
+
- `mode="inline"` for embedded layouts
|
|
96
|
+
|
|
97
|
+
For inline mode, there are two common host patterns:
|
|
98
|
+
|
|
99
|
+
- `dockMode="page"` for a page-anchored rail
|
|
100
|
+
- `dockMode="viewport"` for a viewport-docked rail that stays fixed to the browser edge
|
|
101
|
+
|
|
102
|
+
Use `dockMode="viewport"` when the widget should behave like a fixed browser sidebar and the host page needs to shift content away from it.
|
|
103
|
+
|
|
104
|
+
### Overlay Example
|
|
105
|
+
|
|
106
|
+
```tsx
|
|
107
|
+
<ChatWidget
|
|
108
|
+
mode="overlay"
|
|
109
|
+
side="right"
|
|
110
|
+
title="tagIt Assistant"
|
|
111
|
+
showBackdrop
|
|
112
|
+
closeOnOutsideClick
|
|
113
|
+
/>
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### Page-Rail Inline Example
|
|
117
|
+
|
|
118
|
+
```tsx
|
|
119
|
+
<ChatWidget
|
|
120
|
+
mode="inline"
|
|
121
|
+
dockMode="page"
|
|
122
|
+
side="right"
|
|
123
|
+
open={true}
|
|
124
|
+
title="tagIt Assistant"
|
|
125
|
+
tabLabel="AI Client"
|
|
126
|
+
/>
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### Viewport-Docked Inline Example
|
|
130
|
+
|
|
131
|
+
```tsx
|
|
132
|
+
<ChatWidget
|
|
133
|
+
mode="inline"
|
|
134
|
+
dockMode="viewport"
|
|
135
|
+
side="right"
|
|
136
|
+
open={isOpen}
|
|
137
|
+
onOpenChange={setIsOpen}
|
|
138
|
+
title="tagIt Assistant"
|
|
139
|
+
tabLabel="AI Client"
|
|
140
|
+
tabHeightPercent={18}
|
|
141
|
+
width={440}
|
|
142
|
+
minWidthPx={360}
|
|
143
|
+
maxWidthPx={440}
|
|
144
|
+
/>
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
## Open / Close Control
|
|
148
|
+
|
|
149
|
+
`ChatWidget` supports both controlled and uncontrolled open state.
|
|
150
|
+
|
|
151
|
+
- `open` + `onOpenChange` for controlled usage
|
|
152
|
+
- `defaultOpen` for uncontrolled usage
|
|
153
|
+
|
|
154
|
+
Use controlled state when the host page needs to:
|
|
155
|
+
|
|
156
|
+
- reserve layout space only while the panel is open
|
|
157
|
+
- coordinate open state with surrounding page layout
|
|
158
|
+
- keep the tab at the browser edge in a viewport-docked integration
|
|
159
|
+
|
|
160
|
+
## `ChatConversation`
|
|
161
|
+
|
|
162
|
+
Use `ChatConversation` when you want a lighter conversation surface and you are already handling the shell yourself.
|
|
163
|
+
|
|
164
|
+
```tsx
|
|
165
|
+
import { AIClientProvider, ChatConversation } from '@tagit/ai-client-react';
|
|
166
|
+
|
|
167
|
+
export default function App() {
|
|
168
|
+
return (
|
|
169
|
+
<AIClientProvider client={client}>
|
|
170
|
+
<ChatConversation />
|
|
171
|
+
</AIClientProvider>
|
|
172
|
+
);
|
|
173
|
+
}
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
Use `ChatWidget` when you want the full built-in shell, header, tab, and sizing controls.
|
|
177
|
+
|
|
178
|
+
## Custom Conversation Body
|
|
179
|
+
|
|
180
|
+
Only pass `children` to `ChatWidget` if you intentionally want to replace the built-in conversation body.
|
|
181
|
+
|
|
182
|
+
```tsx
|
|
183
|
+
<ChatWidget mode="overlay" side="right" title="tagIt Assistant">
|
|
184
|
+
<CustomConversation />
|
|
185
|
+
</ChatWidget>
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
If you do not pass `children`, the stock conversation UI is rendered automatically.
|
|
189
|
+
|
|
190
|
+
## Configuration
|
|
191
|
+
|
|
192
|
+
### Orchestrator
|
|
193
|
+
|
|
194
|
+
`orchestrator.baseUrl` should point to the orchestrator root URL, not `/v1/chat`. The client appends `/v1/chat` internally.
|
|
195
|
+
|
|
196
|
+
Required orchestrator fields:
|
|
197
|
+
|
|
198
|
+
- `baseUrl`
|
|
199
|
+
- `useCaseId`
|
|
200
|
+
|
|
201
|
+
Optional orchestrator fields:
|
|
202
|
+
|
|
203
|
+
- `apiKey`
|
|
204
|
+
- `snapshotId`
|
|
205
|
+
- `timeoutMs`
|
|
206
|
+
- `maxRetries`
|
|
207
|
+
|
|
208
|
+
### Collector
|
|
209
|
+
|
|
210
|
+
Collector is optional and can be disabled.
|
|
211
|
+
|
|
212
|
+
If enabled, set:
|
|
213
|
+
|
|
214
|
+
- `collector.baseUrl`
|
|
215
|
+
- `collector.tagId`
|
|
216
|
+
- `collector.enabled = true`
|
|
217
|
+
|
|
218
|
+
Additional collector fields are supported when needed, including:
|
|
219
|
+
|
|
220
|
+
- `acceptCookies`
|
|
221
|
+
- `userId`
|
|
222
|
+
- `agentId`
|
|
223
|
+
- `entityId`
|
|
224
|
+
- `entityidType`
|
|
225
|
+
- `entityidAlgo`
|
|
226
|
+
- `entityidOwner`
|
|
227
|
+
- `spaceId`
|
|
228
|
+
- `sessionId`
|
|
229
|
+
- privacy metadata
|
|
230
|
+
|
|
231
|
+
### UI
|
|
232
|
+
|
|
233
|
+
Common UI options include:
|
|
234
|
+
|
|
235
|
+
- `theme`
|
|
236
|
+
- `streaming`
|
|
237
|
+
- `showToolCalls`
|
|
238
|
+
|
|
239
|
+
## Starter Harness
|
|
240
|
+
|
|
241
|
+
The starter app in `apps/starter` is the local demo and shell playground.
|
|
242
|
+
|
|
243
|
+
Use it to test:
|
|
244
|
+
|
|
245
|
+
- overlay mode
|
|
246
|
+
- inline page-rail mode
|
|
247
|
+
- inline viewport-docked mode
|
|
248
|
+
- theming and color schemes
|
|
249
|
+
- tab labels and tooltips
|
|
250
|
+
- open/close behavior
|
|
251
|
+
- sizing and resize behavior
|
|
252
|
+
|
|
253
|
+
The starter is not the distributable package.
|
|
254
|
+
|
|
255
|
+
## Recommended Integration Patterns
|
|
256
|
+
|
|
257
|
+
### Simple Embed
|
|
258
|
+
|
|
259
|
+
Use this when you want the fastest possible install:
|
|
260
|
+
|
|
261
|
+
- create one `AIClient`
|
|
262
|
+
- wrap the app with `AIClientProvider`
|
|
263
|
+
- render `<ChatWidget />`
|
|
264
|
+
- import `@tagit/ai-client-react/chat-widget.css`
|
|
265
|
+
|
|
266
|
+
### Viewport-Docked Sidebar
|
|
267
|
+
|
|
268
|
+
Use this when the chat should feel like a persistent product rail:
|
|
269
|
+
|
|
270
|
+
- keep the widget fixed to the browser edge
|
|
271
|
+
- reserve page width only when open
|
|
272
|
+
- let the tab collapse back to the browser edge
|
|
273
|
+
- keep the host page scroll independent of the rail
|
|
274
|
+
|
|
275
|
+
### Custom Shell
|
|
276
|
+
|
|
277
|
+
Use `useConversation()` when the host app wants to render its own shell and only consume conversation state and actions.
|
|
278
|
+
|
|
279
|
+
## Troubleshooting
|
|
280
|
+
|
|
281
|
+
| Symptom | Likely cause | Check |
|
|
282
|
+
|---|---|---|
|
|
283
|
+
| Header/tab only, empty shell | stale package cache or old bundle | clear `node_modules/.vite`, restart dev server, confirm `children` is not being passed |
|
|
284
|
+
| No styling | CSS not imported | verify `@tagit/ai-client-react/chat-widget.css` import |
|
|
285
|
+
| Missing body after passing custom JSX | `children` overrides stock body | remove `children` to restore the stock widget |
|
|
286
|
+
| No messages sent | invalid orchestrator config | verify `orchestrator.baseUrl` and `useCaseId`, confirm `baseUrl` does not include `/v1/chat` |
|
|
287
|
+
| Runtime import error | unsupported import path | use only documented public exports |
|
|
288
|
+
| Collector events do not appear | collector config incomplete or disabled | confirm `collector.enabled`, `collector.baseUrl`, and `collector.tagId` |
|
|
289
|
+
| Inline mode looks cramped | panel width too small | pass a wider `width` or start with `dockMode="viewport"` |
|
|
290
|
+
|
|
291
|
+
## Related Docs
|
|
292
|
+
|
|
293
|
+
- [`AGENTS.md`](../../AGENTS.md)
|
|
294
|
+
- [`README.md`](../../README.md)
|
|
295
|
+
- [`apps/starter`](../../apps/starter)
|
|
296
|
+
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface ChatConversationProps {
|
|
2
|
+
className?: string;
|
|
3
|
+
}
|
|
4
|
+
/**
|
|
5
|
+
* Fully self-contained chat surface for the TagIt AI client.
|
|
6
|
+
* This renders the default welcome state, message list, tool call output,
|
|
7
|
+
* streaming indicator, inline errors, and composer footer.
|
|
8
|
+
*/
|
|
9
|
+
export declare function ChatConversation({ className }: ChatConversationProps): import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
//# sourceMappingURL=chat-conversation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-conversation.d.ts","sourceRoot":"","sources":["../src/chat-conversation.tsx"],"names":[],"mappings":"AAqCA,MAAM,WAAW,qBAAqB;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,SAAS,EAAE,EAAE,qBAAqB,2CAmUpE"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react';
|
|
3
|
+
import { Check, Copy, Pencil, RotateCcw } from 'lucide-react';
|
|
4
|
+
import { useConversation } from './provider.js';
|
|
5
|
+
import { ContentBlockRenderer } from './renderers/ContentBlockRenderer.js';
|
|
6
|
+
function MessageCopyButton({ text }) {
|
|
7
|
+
const [copied, setCopied] = useState(false);
|
|
8
|
+
const timerRef = useRef(null);
|
|
9
|
+
const handleCopy = () => {
|
|
10
|
+
navigator.clipboard
|
|
11
|
+
.writeText(text)
|
|
12
|
+
.then(() => {
|
|
13
|
+
setCopied(true);
|
|
14
|
+
if (timerRef.current)
|
|
15
|
+
clearTimeout(timerRef.current);
|
|
16
|
+
timerRef.current = setTimeout(() => setCopied(false), 1500);
|
|
17
|
+
})
|
|
18
|
+
.catch(() => {
|
|
19
|
+
// Clipboard access is best-effort.
|
|
20
|
+
});
|
|
21
|
+
};
|
|
22
|
+
return (_jsx("button", { type: "button", className: "tagIt-chat-message-action-btn", onClick: handleCopy, "data-copied": copied ? '' : undefined, "aria-label": copied ? 'Copied' : 'Copy message', title: copied ? 'Copied!' : 'Copy', children: copied ? _jsx(Check, { size: 16 }) : _jsx(Copy, { size: 16 }) }));
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Fully self-contained chat surface for the TagIt AI client.
|
|
26
|
+
* This renders the default welcome state, message list, tool call output,
|
|
27
|
+
* streaming indicator, inline errors, and composer footer.
|
|
28
|
+
*/
|
|
29
|
+
export function ChatConversation({ className }) {
|
|
30
|
+
const { messages, sendMessage, cancel, retry, reEditMessage, isLoading, isStreaming, error, lastError, } = useConversation();
|
|
31
|
+
const [inputValue, setInputValue] = useState('');
|
|
32
|
+
const [isReEditMode, setIsReEditMode] = useState(false);
|
|
33
|
+
const textareaRef = useRef(null);
|
|
34
|
+
const [isAtBottom, setIsAtBottom] = useState(true);
|
|
35
|
+
const wasLoadingRef = useRef(false);
|
|
36
|
+
const messagesAreaRef = useRef(null);
|
|
37
|
+
const scrollEndRef = useRef(null);
|
|
38
|
+
const lastUserMsgRef = useRef(null);
|
|
39
|
+
const shouldAutoScrollRef = useRef(true);
|
|
40
|
+
const prevMessageCountRef = useRef(messages.length);
|
|
41
|
+
const handleScroll = useCallback(() => {
|
|
42
|
+
const el = messagesAreaRef.current;
|
|
43
|
+
if (!el)
|
|
44
|
+
return;
|
|
45
|
+
const atBottom = el.scrollHeight - el.scrollTop - el.clientHeight < 60;
|
|
46
|
+
setIsAtBottom(atBottom);
|
|
47
|
+
shouldAutoScrollRef.current = atBottom;
|
|
48
|
+
}, []);
|
|
49
|
+
useLayoutEffect(() => {
|
|
50
|
+
if (!shouldAutoScrollRef.current)
|
|
51
|
+
return;
|
|
52
|
+
const el = messagesAreaRef.current;
|
|
53
|
+
if (!el)
|
|
54
|
+
return;
|
|
55
|
+
if (el.scrollHeight - el.scrollTop - el.clientHeight > 5) {
|
|
56
|
+
el.scrollTop = el.scrollHeight;
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
useEffect(() => {
|
|
60
|
+
const currCount = messages.length;
|
|
61
|
+
const prevCount = prevMessageCountRef.current;
|
|
62
|
+
prevMessageCountRef.current = currCount;
|
|
63
|
+
if (currCount > prevCount) {
|
|
64
|
+
const lastMsg = messages[currCount - 1];
|
|
65
|
+
if (lastMsg?.role === 'user') {
|
|
66
|
+
requestAnimationFrame(() => {
|
|
67
|
+
lastUserMsgRef.current?.scrollIntoView({ behavior: 'smooth', block: 'start' });
|
|
68
|
+
shouldAutoScrollRef.current = true;
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}, [messages.length]);
|
|
73
|
+
const scrollToBottom = () => {
|
|
74
|
+
scrollEndRef.current?.scrollIntoView({ behavior: 'smooth' });
|
|
75
|
+
shouldAutoScrollRef.current = true;
|
|
76
|
+
setIsAtBottom(true);
|
|
77
|
+
};
|
|
78
|
+
const handleSubmit = (event) => {
|
|
79
|
+
event.preventDefault();
|
|
80
|
+
const trimmed = inputValue.trim();
|
|
81
|
+
if (trimmed && !isLoading) {
|
|
82
|
+
sendMessage(trimmed);
|
|
83
|
+
setInputValue('');
|
|
84
|
+
setIsReEditMode(false);
|
|
85
|
+
if (textareaRef.current)
|
|
86
|
+
textareaRef.current.style.height = '';
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
const handleKeyDown = (event) => {
|
|
90
|
+
if (event.key === 'Escape' && isReEditMode) {
|
|
91
|
+
event.preventDefault();
|
|
92
|
+
setInputValue('');
|
|
93
|
+
setIsReEditMode(false);
|
|
94
|
+
const el = textareaRef.current;
|
|
95
|
+
if (el) {
|
|
96
|
+
el.style.height = '';
|
|
97
|
+
}
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
if (event.key === 'Enter' && !event.shiftKey) {
|
|
101
|
+
event.preventDefault();
|
|
102
|
+
const trimmed = inputValue.trim();
|
|
103
|
+
if (trimmed && !isLoading) {
|
|
104
|
+
sendMessage(trimmed);
|
|
105
|
+
setInputValue('');
|
|
106
|
+
setIsReEditMode(false);
|
|
107
|
+
if (textareaRef.current)
|
|
108
|
+
textareaRef.current.style.height = '';
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
const handleInputChange = (event) => {
|
|
113
|
+
setInputValue(event.target.value);
|
|
114
|
+
const el = event.target;
|
|
115
|
+
el.style.height = '';
|
|
116
|
+
el.style.height = `${el.scrollHeight}px`;
|
|
117
|
+
};
|
|
118
|
+
const handleRetry = async () => {
|
|
119
|
+
try {
|
|
120
|
+
await retry();
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
// Errors are surfaced in the inline error row.
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
const handleReEdit = (messageId) => {
|
|
127
|
+
const content = reEditMessage(messageId);
|
|
128
|
+
if (!content)
|
|
129
|
+
return;
|
|
130
|
+
setInputValue(content);
|
|
131
|
+
setIsReEditMode(true);
|
|
132
|
+
requestAnimationFrame(() => {
|
|
133
|
+
const el = textareaRef.current;
|
|
134
|
+
if (!el)
|
|
135
|
+
return;
|
|
136
|
+
el.style.height = '';
|
|
137
|
+
el.style.height = `${el.scrollHeight}px`;
|
|
138
|
+
el.focus();
|
|
139
|
+
});
|
|
140
|
+
};
|
|
141
|
+
useEffect(() => {
|
|
142
|
+
if (wasLoadingRef.current && !isLoading) {
|
|
143
|
+
textareaRef.current?.focus();
|
|
144
|
+
}
|
|
145
|
+
wasLoadingRef.current = isLoading;
|
|
146
|
+
}, [isLoading]);
|
|
147
|
+
const isEmpty = messages.length === 0 && !isLoading;
|
|
148
|
+
const lastMsg = messages.length > 0 ? messages[messages.length - 1] : null;
|
|
149
|
+
const showTypingIndicator = isLoading && !(isStreaming && lastMsg?.role === 'assistant');
|
|
150
|
+
const showError = Boolean(error) && !isLoading && lastError?.code !== 'CANCELED';
|
|
151
|
+
return (_jsxs("div", { className: ['tagIt-chat-conversation', className || ''].join(' ').trim(), children: [_jsxs("div", { className: "tagIt-chat-viewport", ref: messagesAreaRef, onScroll: handleScroll, role: "log", "aria-label": "Conversation", "aria-live": "polite", children: [isEmpty && (_jsxs("div", { className: "tagIt-chat-empty", children: [_jsx("div", { className: "tagIt-chat-empty-icon", "aria-hidden": "true", children: "Chat" }), _jsx("h2", { className: "tagIt-chat-empty-title", children: "How can I help?" }), _jsx("p", { className: "tagIt-chat-empty-subtitle", children: "Ask me anything to get started." })] })), messages.map((message, index) => {
|
|
152
|
+
const isLastMsg = index === messages.length - 1;
|
|
153
|
+
const isLastUserMsg = message.role === 'user' && isLastMsg;
|
|
154
|
+
return (_jsx("div", { ref: isLastUserMsg ? (el) => { lastUserMsgRef.current = el; } : undefined, className: "tagIt-chat-message", "data-role": message.role, children: _jsx("div", { className: "tagIt-chat-message-body", children: message.role === 'user' ? (_jsxs(_Fragment, { children: [_jsx("div", { className: "tagIt-chat-message-bubble", children: _jsx(ContentBlockRenderer, { role: message.role, content: message.content }) }), !isLoading && (_jsxs("div", { className: "tagIt-chat-message-actions", children: [_jsx(MessageCopyButton, { text: message.content }), _jsx("button", { type: "button", className: "tagIt-chat-message-action-btn", onClick: () => handleReEdit(message.id), "aria-label": "Edit this message", title: "Edit", children: _jsx(Pencil, { size: 16 }) })] }))] })) : (_jsxs(_Fragment, { children: [_jsx("div", { className: "tagIt-chat-assistant-content", children: _jsx(ContentBlockRenderer, { role: message.role, content: message.content, showStreamingCursor: isStreaming && isLastMsg }) }), message.toolCalls && message.toolCalls.length > 0 && (_jsx("div", { className: "tagIt-chat-tool-calls", children: message.toolCalls.map((tool, idx) => (_jsxs("div", { className: "tagIt-chat-tool-call", children: [_jsx("span", { className: "tagIt-chat-tool-name", children: tool.name }), tool.status && (_jsx("span", { className: `tagIt-chat-tool-status tagIt-chat-tool-status-${tool.status}`, children: tool.status }))] }, idx))) })), !isLoading && !isStreaming && (_jsxs("div", { className: "tagIt-chat-message-actions", children: [_jsx(MessageCopyButton, { text: message.content }), isLastMsg && (_jsx("button", { type: "button", className: "tagIt-chat-message-action-btn", onClick: handleRetry, "aria-label": "Regenerate response", title: "Regenerate", children: _jsx(RotateCcw, { size: 16 }) }))] }))] })) }) }, message.id));
|
|
155
|
+
}), showTypingIndicator && (_jsx("div", { className: "tagIt-chat-message", "data-role": "assistant", "aria-label": "Assistant is typing", children: _jsx("div", { className: "tagIt-chat-message-body", children: _jsxs("div", { className: "tagIt-chat-typing-indicator", "aria-hidden": "true", children: [_jsx("span", {}), _jsx("span", {}), _jsx("span", {})] }) }) })), showError && (_jsxs("div", { className: "tagIt-chat-error-row", role: "alert", children: [_jsx("span", { className: "tagIt-chat-error-text", children: "Something went wrong - please try again." }), _jsx("button", { type: "button", className: "tagIt-chat-error-retry", onClick: handleRetry, children: "Retry" })] })), messages.length > 0 && _jsx("div", { className: "tagIt-chat-viewport-slack", "aria-hidden": "true" }), _jsx("div", { ref: scrollEndRef })] }), _jsx("div", { className: "tagIt-chat-scroll-to-bottom-anchor", children: _jsx("div", { className: "tagIt-chat-scroll-to-bottom-wrap", "data-visible": !isAtBottom ? '' : undefined, "aria-hidden": isAtBottom, children: _jsx("button", { type: "button", className: "tagIt-chat-scroll-to-bottom", onClick: scrollToBottom, "aria-label": "Scroll to bottom", tabIndex: isAtBottom ? -1 : 0, children: "v" }) }) }), _jsx("form", { onSubmit: handleSubmit, className: "tagIt-chat-input-form", children: _jsxs("div", { className: "tagIt-chat-input-wrap", children: [_jsx("textarea", { ref: textareaRef, value: inputValue, onChange: handleInputChange, onKeyDown: handleKeyDown, placeholder: "Type your message...", disabled: isLoading, className: "tagIt-chat-input", rows: 3, autoFocus: true }), _jsx("div", { className: "tagIt-chat-input-actions", children: isLoading ? (_jsx("button", { type: "button", onClick: () => cancel(), className: "tagIt-chat-stop-button", "aria-label": "Stop generating", children: "Stop" })) : (_jsx("button", { type: "submit", disabled: !inputValue.trim(), className: "tagIt-chat-send-button", "aria-label": "Send message", children: "Send" })) })] }) })] }));
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=chat-conversation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-conversation.js","sourceRoot":"","sources":["../src/chat-conversation.tsx"],"names":[],"mappings":"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"}
|
package/dist/chat-widget.d.ts
CHANGED
|
@@ -23,6 +23,7 @@ export type ChatColorScheme = {
|
|
|
23
23
|
};
|
|
24
24
|
export type ChatWidgetProps = {
|
|
25
25
|
mode?: ChatWidgetMode;
|
|
26
|
+
dockMode?: 'page' | 'viewport';
|
|
26
27
|
side?: ChatWidgetSide;
|
|
27
28
|
title?: string;
|
|
28
29
|
titleIconUrl?: string | null;
|
|
@@ -47,7 +48,7 @@ export type ChatWidgetProps = {
|
|
|
47
48
|
closeOnOutsideClick?: boolean;
|
|
48
49
|
onNewChat?: () => void;
|
|
49
50
|
className?: string;
|
|
50
|
-
children
|
|
51
|
+
children?: React.ReactNode;
|
|
51
52
|
};
|
|
52
|
-
export declare function ChatWidget({ mode, side, title, titleIconUrl, open, defaultOpen, onOpenChange, theme, colorScheme, colorSchemes, tabIcon, tabLabel, tabTooltipOpen, tabTooltipClose, tabIconUrl, tabHeightPercent, width, resizable, minWidthPx, maxWidthPx, onWidthChange, showBackdrop, closeOnOutsideClick, onNewChat, className, children, }: ChatWidgetProps): import("react/jsx-runtime").JSX.Element;
|
|
53
|
+
export declare function ChatWidget({ mode, dockMode, side, title, titleIconUrl, open, defaultOpen, onOpenChange, theme, colorScheme, colorSchemes, tabIcon, tabLabel, tabTooltipOpen, tabTooltipClose, tabIconUrl, tabHeightPercent, width, resizable, minWidthPx, maxWidthPx, onWidthChange, showBackdrop, closeOnOutsideClick, onNewChat, className, children, }: ChatWidgetProps): import("react/jsx-runtime").JSX.Element;
|
|
53
54
|
//# sourceMappingURL=chat-widget.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-widget.d.ts","sourceRoot":"","sources":["../src/chat-widget.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"chat-widget.d.ts","sourceRoot":"","sources":["../src/chat-widget.tsx"],"names":[],"mappings":"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"}
|
package/dist/chat-widget.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { useEffect, useMemo, useRef, useState } from 'react';
|
|
3
3
|
import { SquareArrowOutUpRight, X } from 'lucide-react';
|
|
4
|
+
import { ChatConversation } from './chat-conversation.js';
|
|
5
|
+
import { useAIClient } from './provider.js';
|
|
4
6
|
function resolveTheme(theme) {
|
|
5
7
|
if (theme === 'light' || theme === 'dark') {
|
|
6
8
|
return theme;
|
|
@@ -10,11 +12,12 @@ function resolveTheme(theme) {
|
|
|
10
12
|
}
|
|
11
13
|
return 'light';
|
|
12
14
|
}
|
|
13
|
-
export function ChatWidget({ mode = 'overlay', side = 'right', title = 'Ask TagIt', titleIconUrl, open, defaultOpen = false, onOpenChange, theme = 'system', colorScheme, colorSchemes, tabIcon, tabLabel = 'Chat', tabTooltipOpen, tabTooltipClose, tabIconUrl, tabHeightPercent = 40, width = 420, resizable = true, minWidthPx = 280, maxWidthPx, onWidthChange, showBackdrop = false, closeOnOutsideClick = false, onNewChat, className, children, }) {
|
|
15
|
+
export function ChatWidget({ mode = 'overlay', dockMode = 'page', side = 'right', title = 'Ask TagIt', titleIconUrl, open, defaultOpen = false, onOpenChange, theme = 'system', colorScheme, colorSchemes, tabIcon, tabLabel = 'Chat', tabTooltipOpen, tabTooltipClose, tabIconUrl, tabHeightPercent = 40, width = 420, resizable = true, minWidthPx = 280, maxWidthPx, onWidthChange, showBackdrop = false, closeOnOutsideClick = false, onNewChat, className, children, }) {
|
|
14
16
|
const [internalOpen, setInternalOpen] = useState(defaultOpen);
|
|
15
17
|
const [internalWidth, setInternalWidth] = useState(typeof width === 'number' ? `${width}px` : String(width));
|
|
16
18
|
const [resolvedTheme, setResolvedTheme] = useState(() => resolveTheme(theme));
|
|
17
19
|
const panelRef = useRef(null);
|
|
20
|
+
const client = useAIClient();
|
|
18
21
|
const isControlled = typeof open === 'boolean';
|
|
19
22
|
const isOpen = isControlled ? Boolean(open) : internalOpen;
|
|
20
23
|
useEffect(() => {
|
|
@@ -113,6 +116,8 @@ export function ChatWidget({ mode = 'overlay', side = 'right', title = 'Ask TagI
|
|
|
113
116
|
return (_jsxs("div", { className: [
|
|
114
117
|
'tagIt-chat-widget',
|
|
115
118
|
`tagIt-chat-widget-${mode}`,
|
|
119
|
+
`tagIt-chat-widget-dock-${dockMode}`,
|
|
120
|
+
isOpen ? 'tagIt-chat-widget-open' : 'tagIt-chat-widget-closed',
|
|
116
121
|
`tagIt-chat-side-${side}`,
|
|
117
122
|
`tagIt-chat-theme-${resolvedTheme}`,
|
|
118
123
|
className || '',
|
|
@@ -129,6 +134,13 @@ export function ChatWidget({ mode = 'overlay', side = 'right', title = 'Ask TagI
|
|
|
129
134
|
'tagIt-chat-tab',
|
|
130
135
|
tabLabel?.trim() ? '' : 'tagIt-chat-tab-icon-only',
|
|
131
136
|
isOpen ? 'tagIt-chat-tab-open' : '',
|
|
132
|
-
].join(' ').trim(), "aria-expanded": isOpen, "aria-label": isOpen ? `Close ${accessibleLabel}` : `Open ${accessibleLabel}`, title: hoverTitle, onClick: () => setOpen(!isOpen), children: [_jsx("span", { className: "tagIt-chat-tab-icon", "aria-hidden": true, children: isOpen ? collapseIcon : tabIconUrl ? _jsx("img", { src: tabIconUrl, alt: "" }) : tabIcon || 'AI' }), tabLabel?.trim() ? _jsx("span", { className: "tagIt-chat-tab-label", children: tabLabel }) : null] }), _jsxs("aside", { ref: panelRef, className: `tagIt-chat-panel ${isOpen ? 'tagIt-chat-panel-open' : ''}`, children: [resizable ? (_jsx("button", { type: "button", className: "tagIt-chat-resize-handle", "aria-label": "Resize chat panel", onMouseDown: startResize })) : null, _jsxs("header", { className: "tagIt-chat-panel-header", children: [_jsxs("div", { className: "tagIt-chat-panel-title-wrap", children: [titleIconUrl?.trim() ? (_jsx("img", { src: titleIconUrl, alt: "", "aria-hidden": true, className: "tagIt-chat-panel-title-icon" })) : null, _jsx("h2", { children: title })] }), _jsxs("div", { className: "tagIt-chat-panel-header-actions", children: [
|
|
137
|
+
].join(' ').trim(), "aria-expanded": isOpen, "aria-label": isOpen ? `Close ${accessibleLabel}` : `Open ${accessibleLabel}`, title: hoverTitle, onClick: () => setOpen(!isOpen), children: [_jsx("span", { className: "tagIt-chat-tab-icon", "aria-hidden": true, children: isOpen ? collapseIcon : tabIconUrl ? _jsx("img", { src: tabIconUrl, alt: "" }) : tabIcon || 'AI' }), tabLabel?.trim() ? _jsx("span", { className: "tagIt-chat-tab-label", children: tabLabel }) : null] }), _jsxs("aside", { ref: panelRef, className: `tagIt-chat-panel ${isOpen ? 'tagIt-chat-panel-open' : ''}`, children: [resizable ? (_jsx("button", { type: "button", className: "tagIt-chat-resize-handle", "aria-label": "Resize chat panel", onMouseDown: startResize })) : null, _jsxs("header", { className: "tagIt-chat-panel-header", children: [_jsxs("div", { className: "tagIt-chat-panel-title-wrap", children: [titleIconUrl?.trim() ? (_jsx("img", { src: titleIconUrl, alt: "", "aria-hidden": true, className: "tagIt-chat-panel-title-icon" })) : null, _jsx("h2", { children: title })] }), _jsxs("div", { className: "tagIt-chat-panel-header-actions", children: [_jsx("button", { type: "button", className: "tagIt-chat-header-btn", "aria-label": "New chat", title: "New chat", onClick: () => {
|
|
138
|
+
if (onNewChat) {
|
|
139
|
+
onNewChat();
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
client.cancel();
|
|
143
|
+
client.clearHistory();
|
|
144
|
+
}, children: _jsx(SquareArrowOutUpRight, { size: 22 }) }), _jsx("button", { type: "button", className: "tagIt-chat-close", "aria-label": "Close chat", onClick: () => setOpen(false), children: _jsx(X, { size: 22 }) })] })] }), _jsx("div", { className: "tagIt-chat-panel-body", children: children === undefined ? _jsx(ChatConversation, {}) : children })] })] }));
|
|
133
145
|
}
|
|
134
146
|
//# sourceMappingURL=chat-widget.js.map
|
package/dist/chat-widget.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-widget.js","sourceRoot":"","sources":["../src/chat-widget.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,CAAC,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"chat-widget.js","sourceRoot":"","sources":["../src/chat-widget.tsx"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -7,25 +7,15 @@
|
|
|
7
7
|
* @example
|
|
8
8
|
* ```tsx
|
|
9
9
|
* import { AIClient, createDefaultConfig } from '@tagit/ai-client-core';
|
|
10
|
-
* import { AIClientProvider,
|
|
10
|
+
* import { AIClientProvider, ChatWidget } from '@tagit/ai-client-react';
|
|
11
11
|
*
|
|
12
12
|
* const config = createDefaultConfig('use-case-id', 'https://orchestrator.url');
|
|
13
13
|
* const client = new AIClient(config);
|
|
14
14
|
*
|
|
15
|
-
* function ChatApp() {
|
|
16
|
-
* const { messages, sendMessage, isLoading } = useConversation();
|
|
17
|
-
* return (
|
|
18
|
-
* <div>
|
|
19
|
-
* {messages.map(m => <div key={m.id}>{m.role}: {m.content}</div>)}
|
|
20
|
-
* <button onClick={() => sendMessage('Hello')}>Send</button>
|
|
21
|
-
* </div>
|
|
22
|
-
* );
|
|
23
|
-
* }
|
|
24
|
-
*
|
|
25
15
|
* export default function App() {
|
|
26
16
|
* return (
|
|
27
17
|
* <AIClientProvider client={client}>
|
|
28
|
-
* <
|
|
18
|
+
* <ChatWidget mode="overlay" side="right" title="tagIt Assistant" />
|
|
29
19
|
* </AIClientProvider>
|
|
30
20
|
* );
|
|
31
21
|
* }
|
|
@@ -33,4 +23,5 @@
|
|
|
33
23
|
*/
|
|
34
24
|
export { AIClientProvider, useAIClient, useConversation, useClientEvents, } from './provider.js';
|
|
35
25
|
export { ChatWidget, type ChatWidgetProps, type ChatWidgetMode, type ChatWidgetSide, type ChatWidgetTheme, type ChatColorScheme, } from './chat-widget.js';
|
|
26
|
+
export { ChatConversation, type ChatConversationProps, } from './chat-conversation.js';
|
|
36
27
|
//# sourceMappingURL=index.d.ts.map
|