@schlessera/brain-ui-react 0.30.1 → 0.31.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.
Files changed (61) hide show
  1. package/dist/components/chat/brain-markdown.d.ts +6 -1
  2. package/dist/components/chat/brain-markdown.d.ts.map +1 -1
  3. package/dist/components/chat/brain-markdown.js +66 -7
  4. package/dist/components/chat/brain-markdown.js.map +1 -1
  5. package/dist/components/chat/chat-page.d.ts +9 -0
  6. package/dist/components/chat/chat-page.d.ts.map +1 -1
  7. package/dist/components/chat/chat-page.js +75 -388
  8. package/dist/components/chat/chat-page.js.map +1 -1
  9. package/dist/components/chat/composer.d.ts +18 -0
  10. package/dist/components/chat/composer.d.ts.map +1 -0
  11. package/dist/components/chat/composer.js +319 -0
  12. package/dist/components/chat/composer.js.map +1 -0
  13. package/dist/components/chat/message-bubble.d.ts +13 -2
  14. package/dist/components/chat/message-bubble.d.ts.map +1 -1
  15. package/dist/components/chat/message-bubble.js +16 -5
  16. package/dist/components/chat/message-bubble.js.map +1 -1
  17. package/dist/components/chat/use-chat-commands.d.ts +12 -0
  18. package/dist/components/chat/use-chat-commands.d.ts.map +1 -0
  19. package/dist/components/chat/use-chat-commands.js +82 -0
  20. package/dist/components/chat/use-chat-commands.js.map +1 -0
  21. package/dist/components/files/file-panel.d.ts.map +1 -1
  22. package/dist/components/files/file-panel.js +16 -5
  23. package/dist/components/files/file-panel.js.map +1 -1
  24. package/dist/components/layout/slide-panel.d.ts.map +1 -1
  25. package/dist/components/layout/slide-panel.js +11 -1
  26. package/dist/components/layout/slide-panel.js.map +1 -1
  27. package/dist/components/settings/settings-panel.d.ts.map +1 -1
  28. package/dist/components/settings/settings-panel.js +12 -4
  29. package/dist/components/settings/settings-panel.js.map +1 -1
  30. package/dist/hooks/use-deferred-unmount.d.ts +12 -0
  31. package/dist/hooks/use-deferred-unmount.d.ts.map +1 -0
  32. package/dist/hooks/use-deferred-unmount.js +24 -0
  33. package/dist/hooks/use-deferred-unmount.js.map +1 -0
  34. package/dist/hooks/use-websocket.d.ts +8 -0
  35. package/dist/hooks/use-websocket.d.ts.map +1 -1
  36. package/dist/hooks/use-websocket.js +66 -2
  37. package/dist/hooks/use-websocket.js.map +1 -1
  38. package/dist/index.d.ts +1 -2
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +3 -2
  41. package/dist/index.js.map +1 -1
  42. package/dist/lazy-pages.d.ts +3 -0
  43. package/dist/lazy-pages.d.ts.map +1 -0
  44. package/dist/lazy-pages.js +27 -0
  45. package/dist/lazy-pages.js.map +1 -0
  46. package/dist/styles.css +1 -1
  47. package/dist/theme.css +58 -0
  48. package/package.json +2 -2
  49. package/src/components/chat/brain-markdown.tsx +81 -9
  50. package/src/components/chat/chat-page.tsx +119 -709
  51. package/src/components/chat/composer.tsx +617 -0
  52. package/src/components/chat/message-bubble.tsx +24 -6
  53. package/src/components/chat/use-chat-commands.ts +87 -0
  54. package/src/components/files/file-panel.tsx +25 -8
  55. package/src/components/layout/slide-panel.tsx +13 -1
  56. package/src/components/settings/settings-panel.tsx +21 -10
  57. package/src/hooks/use-deferred-unmount.ts +24 -0
  58. package/src/hooks/use-websocket.ts +79 -2
  59. package/src/index.ts +3 -2
  60. package/src/lazy-pages.tsx +41 -0
  61. package/src/theme.css +58 -0
@@ -0,0 +1,319 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useState, useRef, useEffect } from "react";
3
+ import { ArrowUp, Square, CornerLeftUp, Paperclip, Camera, X, Check, ChevronDown, Lock, } from "lucide-react";
4
+ import { useChatStore, activeChat } from "../../stores/chat-store.js";
5
+ import { uiConfig } from "../../config.js";
6
+ import { useConnectionStore } from "../../stores/connection-store.js";
7
+ import { useProviderStore } from "../../stores/provider-store.js";
8
+ import { fileToAttachment, validateAttachments, } from "../../lib/image-attachments.js";
9
+ import { ShareIntake } from "./share-card.js";
10
+ import { CommandPalette } from "./command-palette.js";
11
+ import { MicButton } from "../voice/mic-button.js";
12
+ import { DictationSheet } from "../voice/dictation-sheet.js";
13
+ import { ReviewCard } from "../voice/review-card.js";
14
+ import { useDictation } from "../../voice/use-dictation.js";
15
+ import { useVoiceStore } from "../../voice/voice-store.js";
16
+ import { detectClientEnvironment } from "../../lib/client-environment.js";
17
+ import { useChatCommands } from "./use-chat-commands.js";
18
+ import { cn } from "../../lib/utils.js";
19
+ /**
20
+ * The composer — everything below the transcript: draft text, attachments,
21
+ * voice review, provider picker, send/cancel.
22
+ *
23
+ * It is its own component for one reason: it owns the draft, and the draft
24
+ * changes on every keystroke. While this lived inside ChatPage, a character
25
+ * typed re-rendered the entire transcript, so typing cost grew with the length
26
+ * of the conversation. Keeping the state here bounds a keystroke to this
27
+ * subtree. Nothing above it re-renders, whatever the transcript holds.
28
+ *
29
+ * The corollary is a rule for future edits: transcript-scale state does not
30
+ * belong in this file, and draft state does not belong above it.
31
+ */
32
+ export function Composer({ send }) {
33
+ const [input, setInput] = useState("");
34
+ const [lastPrompt, setLastPrompt] = useState("");
35
+ const textareaRef = useRef(null);
36
+ // Image attachments. `attachmentsRef` mirrors state so async add/merge logic
37
+ // reads the current set synchronously (avoids stale closures / updater races).
38
+ const [attachments, setAttachments] = useState([]);
39
+ const attachmentsRef = useRef([]);
40
+ const [attachErrors, setAttachErrors] = useState([]);
41
+ const libraryInputRef = useRef(null);
42
+ const cameraInputRef = useRef(null);
43
+ useEffect(() => {
44
+ attachmentsRef.current = attachments;
45
+ }, [attachments]);
46
+ // Revoke preview URLs of attachments that were never sent (unmount cleanup;
47
+ // sent attachments transfer URL ownership to the message in the chat store).
48
+ useEffect(() => () => {
49
+ for (const a of attachmentsRef.current)
50
+ URL.revokeObjectURL(a.previewUrl);
51
+ }, []);
52
+ // Provider picker
53
+ const [providerMenuOpen, setProviderMenuOpen] = useState(false);
54
+ const providerMenuRef = useRef(null);
55
+ const isStreaming = useChatStore((s) => activeChat(s).isStreaming);
56
+ const sessionId = useChatStore((s) => s.activeSessionId);
57
+ const wsStatus = useConnectionStore((s) => s.wsStatus);
58
+ const providers = useProviderStore((s) => s.available);
59
+ const selectedProviderId = useProviderStore((s) => s.selectedId);
60
+ const pinnedProviderId = useProviderStore((s) => s.pinnedId);
61
+ const setSelectedProvider = useProviderStore((s) => s.setSelected);
62
+ const loadProviders = useProviderStore((s) => s.loadProviders);
63
+ const backends = useProviderStore((s) => s.backends);
64
+ // Voice dictation state
65
+ const voiceMode = useVoiceStore((s) => s.mode);
66
+ const reviewText = useVoiceStore((s) => s.reviewText);
67
+ const clearReview = useVoiceStore((s) => s.clearReview);
68
+ const dictation = useDictation();
69
+ const runCommand = useChatCommands();
70
+ // Derived during render, not synchronised through an effect: an effect would
71
+ // cost a second render pass on every single keystroke. Escape dismisses the
72
+ // palette without clearing the draft; typing brings it back.
73
+ const [paletteDismissed, setPaletteDismissed] = useState(false);
74
+ const showCommandPalette = input.startsWith("/") && !paletteDismissed;
75
+ // Load the available provider combos once on mount.
76
+ useEffect(() => {
77
+ void loadProviders();
78
+ }, [loadProviders]);
79
+ // Dismiss the provider popover on outside-click / Escape.
80
+ useEffect(() => {
81
+ if (!providerMenuOpen)
82
+ return;
83
+ const onDocClick = (e) => {
84
+ if (!providerMenuRef.current?.contains(e.target)) {
85
+ setProviderMenuOpen(false);
86
+ }
87
+ };
88
+ const onKey = (e) => {
89
+ if (e.key === "Escape")
90
+ setProviderMenuOpen(false);
91
+ };
92
+ document.addEventListener("mousedown", onDocClick);
93
+ document.addEventListener("keydown", onKey);
94
+ return () => {
95
+ document.removeEventListener("mousedown", onDocClick);
96
+ document.removeEventListener("keydown", onKey);
97
+ };
98
+ }, [providerMenuOpen]);
99
+ /**
100
+ * The draft is whatever is visible above the send button: composer text
101
+ * plus any voice text under review. Both send paths submit the combined
102
+ * draft so nothing is silently dropped.
103
+ */
104
+ function draftText() {
105
+ return [input.trim(), reviewText.trim()].filter(Boolean).join("\n");
106
+ }
107
+ /**
108
+ * Decode, downscale and validate incoming image files, merging them with any
109
+ * already-pending attachments. Rejected files (bad type / oversize / over the
110
+ * per-message caps) surface as inline error lines; their object URLs are
111
+ * revoked so nothing leaks.
112
+ */
113
+ async function addFiles(files) {
114
+ const list = Array.from(files).filter((f) => f.type.startsWith("image/"));
115
+ if (list.length === 0)
116
+ return;
117
+ const results = await Promise.all(list.map((f) => fileToAttachment(f)));
118
+ const fresh = [];
119
+ const errors = [];
120
+ results.forEach((r, i) => {
121
+ if ("error" in r) {
122
+ errors.push(r.error);
123
+ }
124
+ else {
125
+ fresh.push({ ...r, name: list[i].name });
126
+ }
127
+ });
128
+ const { accepted } = validateAttachments([
129
+ ...attachmentsRef.current,
130
+ ...fresh,
131
+ ]);
132
+ // Revoke URLs of freshly-decoded images that didn't make the cut.
133
+ for (const f of fresh) {
134
+ if (!accepted.includes(f)) {
135
+ URL.revokeObjectURL(f.previewUrl);
136
+ errors.push(`${f.name}: not added (message limit reached)`);
137
+ }
138
+ }
139
+ attachmentsRef.current = accepted;
140
+ setAttachments(accepted);
141
+ setAttachErrors(errors);
142
+ }
143
+ function removeAttachment(index) {
144
+ const next = attachmentsRef.current.filter((item, i) => {
145
+ if (i === index)
146
+ URL.revokeObjectURL(item.previewUrl);
147
+ return i !== index;
148
+ });
149
+ attachmentsRef.current = next;
150
+ setAttachments(next);
151
+ }
152
+ async function onFilePick(e) {
153
+ const files = e.target.files;
154
+ if (files && files.length > 0)
155
+ await addFiles(files);
156
+ // Reset so picking the same file again still fires onChange.
157
+ e.target.value = "";
158
+ }
159
+ function handleSubmit() {
160
+ const text = draftText();
161
+ const hasAttachments = attachments.length > 0;
162
+ if ((!text && !hasAttachments) || wsStatus !== "connected")
163
+ return;
164
+ if (text)
165
+ setLastPrompt(text);
166
+ const messageAttachments = attachments.map((a) => ({
167
+ previewUrl: a.previewUrl,
168
+ mediaType: a.attachment.mediaType,
169
+ }));
170
+ const chat = useChatStore.getState();
171
+ chat.addUserMessage(sessionId, text, reviewText.trim() ? "voice-dictate" : "typed", messageAttachments.length > 0 ? messageAttachments : undefined);
172
+ // A send while the session is already streaming is a follow-up — the server
173
+ // queues it or delivers it live; don't pre-start a second assistant bubble
174
+ // (the backend's next frames start it).
175
+ if (!isStreaming)
176
+ chat.startAssistantMessage(sessionId);
177
+ // Correlate this turn when it is starting a NEW conversation, so its
178
+ // session_info can be told apart from a background turn's.
179
+ const draftId = sessionId ? undefined : chat.startDraftTurn();
180
+ send({
181
+ type: "chat_message",
182
+ text,
183
+ sessionId: sessionId ?? undefined,
184
+ ...(draftId ? { draftId } : {}),
185
+ // Provider only applies to new conversations; resumed sessions are
186
+ // pinned server-side to their original combo.
187
+ // Only send a provider the server actually offers — a stale persisted
188
+ // id (e.g. key removed server-side) falls back to the server default
189
+ // instead of erroring with PROVIDER_UNAVAILABLE.
190
+ providerId: sessionId || !providers.some((p) => p.id === selectedProviderId)
191
+ ? undefined
192
+ : selectedProviderId,
193
+ attachments: hasAttachments
194
+ ? attachments.map((a) => a.attachment)
195
+ : undefined,
196
+ // Measured per send, not once per session: the same tab can rotate,
197
+ // move to an external display, or be installed as a PWA mid-conversation.
198
+ client: detectClientEnvironment(),
199
+ });
200
+ setInput("");
201
+ clearReview();
202
+ // Ownership of the preview URLs transfers to the rendered user message
203
+ // (revoked later by the chat store on clear/resume) — don't revoke here.
204
+ attachmentsRef.current = [];
205
+ setAttachments([]);
206
+ setAttachErrors([]);
207
+ }
208
+ function handleMicTap() {
209
+ if (voiceMode === "dictate") {
210
+ void dictation.stop(true);
211
+ }
212
+ else {
213
+ // Defensive: blur composer so the keyboard never fights the mic sheet on Android
214
+ textareaRef.current?.blur();
215
+ // Any existing review text stays put — the new capture appends to it.
216
+ void dictation.start();
217
+ }
218
+ }
219
+ function handleVoiceSend() {
220
+ if (!draftText() || isStreaming || wsStatus !== "connected") {
221
+ // If we cannot send right now, fall back to editing
222
+ handleVoiceEdit();
223
+ return;
224
+ }
225
+ handleSubmit();
226
+ }
227
+ function handleVoiceEdit() {
228
+ setInput((prev) => (prev ? `${prev}\n${reviewText}` : reviewText));
229
+ clearReview();
230
+ setTimeout(() => textareaRef.current?.focus(), 50);
231
+ }
232
+ function handleVoiceAppend() {
233
+ // Review text stays in place; the next capture appends to it on stop.
234
+ void dictation.start();
235
+ }
236
+ function handleRecall() {
237
+ if (lastPrompt && !input.trim()) {
238
+ setInput(lastPrompt);
239
+ setTimeout(() => textareaRef.current?.focus(), 50);
240
+ }
241
+ }
242
+ function handleCancel() {
243
+ // Scope the cancel to the session in view so it is unambiguous when several
244
+ // sessions are running.
245
+ send({ type: "cancel", sessionId: sessionId ?? undefined });
246
+ }
247
+ function handleCommand(command) {
248
+ setInput("");
249
+ runCommand(command);
250
+ }
251
+ const hasDraft = Boolean(input.trim() || reviewText.trim() || attachments.length > 0);
252
+ // A send while a session is running is a follow-up (not blocked by streaming).
253
+ const canSend = hasDraft && wsStatus === "connected";
254
+ // Provider picker: locked to the pinned combo once a session is live.
255
+ // Lock while streaming too: the first send of a new conversation pins the
256
+ // provider server-side before session_info delivers the sessionId.
257
+ const providerLocked = sessionId != null || isStreaming;
258
+ const displayProviderId = providerLocked
259
+ ? pinnedProviderId ?? selectedProviderId
260
+ : selectedProviderId;
261
+ const displayProvider = providers.find((p) => p.id === displayProviderId);
262
+ // A session can be pinned to a profile the user has since hidden — it is gone
263
+ // from the picker but still running the turn. Show its id rather than
264
+ // claiming "Default model", which would name a different model than the one
265
+ // actually answering.
266
+ const displayProviderLabel = displayProvider?.label ?? displayProviderId ?? "Default model";
267
+ const showProviderPicker = providers.length > 1;
268
+ // What happens if the user sends into the currently-running session.
269
+ const displayBackendId = displayProvider?.backendId;
270
+ const followUpLive = displayBackendId
271
+ ? backends[displayBackendId]?.capabilities.followUp ?? false
272
+ : false;
273
+ const followUpHint = isStreaming && sessionId
274
+ ? followUpLive
275
+ ? "Follows up live"
276
+ : "Will queue"
277
+ : null;
278
+ return (_jsxs(_Fragment, { children: [_jsx(DictationSheet, { open: voiceMode === "dictate", onStop: () => dictation.stop(true), onCancel: () => dictation.cancel() }), _jsx("div", { className: "px-4 pt-2 pb-4 md:px-6 md:pb-6", children: _jsxs("div", { className: "mx-auto max-w-3xl", children: [_jsx(ShareIntake, {}), _jsx(ReviewCard, { text: reviewText, onSend: handleVoiceSend, onEdit: handleVoiceEdit, onDiscard: clearReview, onAppend: handleVoiceAppend }), attachErrors.length > 0 && (_jsxs("div", { className: "mb-2 flex items-start gap-2 rounded-lg border border-destructive/30 bg-destructive/5 px-3 py-2 text-[11px] text-destructive", children: [_jsx("div", { className: "flex-1 space-y-0.5", children: attachErrors.map((e, i) => (_jsx("div", { children: e }, i))) }), _jsx("button", { type: "button", onClick: () => setAttachErrors([]), title: "Dismiss", className: "shrink-0 rounded p-0.5 transition-colors hover:text-foreground", children: _jsx(X, { className: "h-3.5 w-3.5" }) })] })), attachments.length > 0 && (_jsx("div", { className: "mb-2 flex flex-wrap gap-2", children: attachments.map((a, i) => (_jsxs("div", { className: "relative h-16 w-16 shrink-0", children: [_jsx("img", { src: a.previewUrl, alt: a.name, className: "h-16 w-16 rounded-lg border border-border object-cover" }), _jsx("button", { type: "button", onClick: () => removeAttachment(i), title: "Remove", className: "absolute -right-1.5 -top-1.5 flex h-5 w-5 items-center justify-center rounded-full border border-border bg-surface text-muted-foreground shadow transition-colors hover:text-destructive", children: _jsx(X, { className: "h-3 w-3" }) })] }, i))) })), _jsxs("div", { className: cn("relative rounded-2xl border border-border bg-surface shadow-lg transition-all duration-200", "focus-within:border-primary/40 focus-within:shadow-[0_0_20px_rgba(224,159,62,0.05)]"), children: [showCommandPalette && (_jsx(CommandPalette, { filter: input.slice(1), onSelect: handleCommand })), _jsx("input", { ref: libraryInputRef, type: "file", accept: "image/*", multiple: true, hidden: true, onChange: onFilePick }), _jsx("input", { ref: cameraInputRef, type: "file", accept: "image/*", capture: "environment", hidden: true, onChange: onFilePick }), _jsx("div", { className: "composer-grow", "data-value": input + " ", children: _jsx("textarea", { ref: textareaRef, value: input, onChange: (e) => {
279
+ setInput(e.target.value);
280
+ setPaletteDismissed(false);
281
+ }, onPaste: (e) => {
282
+ const files = e.clipboardData?.files;
283
+ if (files && files.length > 0) {
284
+ const images = Array.from(files).filter((f) => f.type.startsWith("image/"));
285
+ if (images.length > 0) {
286
+ e.preventDefault();
287
+ void addFiles(images);
288
+ }
289
+ }
290
+ }, onKeyDown: (e) => {
291
+ if (e.key === "Enter" && !e.shiftKey) {
292
+ if (showCommandPalette)
293
+ return;
294
+ // On desktop (>=768px), Enter sends. On mobile, Enter inserts newline.
295
+ if (window.matchMedia("(min-width: 768px)").matches) {
296
+ e.preventDefault();
297
+ handleSubmit();
298
+ }
299
+ }
300
+ if (e.key === "ArrowUp" && !input.trim()) {
301
+ handleRecall();
302
+ }
303
+ if (e.key === "Escape") {
304
+ setPaletteDismissed(true);
305
+ }
306
+ }, placeholder: wsStatus !== "connected"
307
+ ? "Connecting..."
308
+ : uiConfig.composerPlaceholder, disabled: wsStatus !== "connected", rows: 1, className: "w-full resize-none bg-transparent text-sm text-foreground placeholder:text-muted-foreground/40 focus:outline-none disabled:opacity-50" }) }), _jsxs("div", { className: "flex items-center justify-between px-4 pb-3", children: [_jsxs("div", { className: "flex min-w-0 items-center gap-3 text-[11px] text-muted-foreground/50", children: [showProviderPicker && (_jsxs("div", { ref: providerMenuRef, className: "relative", children: [_jsxs("button", { type: "button", onClick: () => !providerLocked && setProviderMenuOpen((v) => !v), disabled: providerLocked, title: providerLocked
309
+ ? "Provider is fixed for this conversation"
310
+ : "Choose model", className: cn("flex max-w-[9rem] items-center gap-1 rounded-lg px-2 py-1 text-[11px] transition-colors md:max-w-[14rem]", providerLocked
311
+ ? "cursor-default text-muted-foreground/60"
312
+ : "text-muted-foreground hover:bg-surface-raised hover:text-foreground"), children: [providerLocked && (_jsx(Lock, { className: "h-3 w-3 shrink-0 opacity-70" })), _jsx("span", { className: "truncate", children: displayProviderLabel }), !providerLocked && (_jsx(ChevronDown, { className: "h-3 w-3 shrink-0 opacity-70" }))] }), providerMenuOpen && !providerLocked && (_jsx("div", { role: "menu", className: "absolute bottom-full left-0 z-50 mb-1 min-w-[14rem] overflow-hidden rounded-xl border border-border bg-surface-overlay py-1 shadow-2xl", children: providers.map((p) => (_jsxs("button", { role: "menuitem", type: "button", onClick: () => {
313
+ setSelectedProvider(p.id);
314
+ setProviderMenuOpen(false);
315
+ }, className: "flex w-full items-center gap-2 px-3 py-2 text-left text-xs text-foreground transition-colors hover:bg-surface-raised", children: [_jsx(Check, { className: cn("h-3.5 w-3.5 shrink-0 text-primary", p.id === selectedProviderId
316
+ ? "opacity-100"
317
+ : "opacity-0") }), _jsx("span", { className: "truncate", children: p.label })] }, p.id))) }))] })), followUpHint ? (_jsx("span", { className: "text-primary/70", children: followUpHint })) : (_jsxs(_Fragment, { children: [_jsxs("span", { className: "hidden sm:inline", children: [_jsx("span", { className: "font-[family-name:var(--font-mono)]", children: "/" }), " ", "for commands"] }), _jsx("span", { className: "hidden md:inline", children: "Shift+Enter for newline" })] }))] }), _jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx("button", { type: "button", onClick: () => libraryInputRef.current?.click(), disabled: isStreaming || wsStatus !== "connected", title: "Attach images", "aria-label": "Attach images", className: "flex h-8 w-8 items-center justify-center rounded-lg text-muted-foreground transition-all duration-150 hover:bg-surface-raised hover:text-foreground disabled:cursor-not-allowed disabled:opacity-30", children: _jsx(Paperclip, { className: "h-4 w-4" }) }), _jsx("button", { type: "button", onClick: () => cameraInputRef.current?.click(), disabled: isStreaming || wsStatus !== "connected", title: "Take a photo", "aria-label": "Take a photo", className: "flex h-8 w-8 items-center justify-center rounded-lg text-muted-foreground transition-all duration-150 hover:bg-surface-raised hover:text-foreground disabled:cursor-not-allowed disabled:opacity-30", children: _jsx(Camera, { className: "h-4 w-4" }) }), lastPrompt && !input.trim() && !isStreaming && (_jsx("button", { type: "button", onClick: handleRecall, title: "Recall last prompt", className: "flex h-8 w-8 items-center justify-center rounded-lg text-muted-foreground transition-all duration-150 hover:bg-surface-raised hover:text-foreground", children: _jsx(CornerLeftUp, { className: "h-4 w-4" }) })), _jsx(MicButton, { active: voiceMode === "dictate", disabled: isStreaming || wsStatus !== "connected", onTap: handleMicTap }), isStreaming && !hasDraft ? (_jsx("button", { type: "button", onClick: handleCancel, title: "Stop the running turn", className: "flex h-8 w-8 items-center justify-center rounded-lg bg-destructive text-primary-foreground transition-all duration-150", children: _jsx(Square, { className: "h-3.5 w-3.5" }) })) : (_jsx("button", { type: "button", onClick: handleSubmit, disabled: !canSend, title: followUpHint ?? "Send", className: "flex h-8 w-8 items-center justify-center rounded-lg bg-primary text-primary-foreground transition-all duration-150 hover:brightness-110 disabled:opacity-30", children: _jsx(ArrowUp, { className: "h-4 w-4" }) }))] })] })] })] }) })] }));
318
+ }
319
+ //# sourceMappingURL=composer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composer.js","sourceRoot":"","sources":["../../../src/components/chat/composer.tsx"],"names":[],"mappings":"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"}
@@ -1,9 +1,20 @@
1
1
  import type { ChatMessage } from "../../stores/chat-store.js";
2
2
  import type { AskUserAnnotation } from "@schlessera/brain-ui-sdk/protocol";
3
- export declare function MessageBubble({ message, onToolApproval, onAskUserSubmit, onAskUserCancel, }: {
3
+ /**
4
+ * One message in the transcript.
5
+ *
6
+ * Memoized, and the memo is load-bearing rather than a micro-optimisation: the
7
+ * chat store replaces only the message it touches, so every OTHER message keeps
8
+ * its object identity across a store write. Without the memo, one streamed
9
+ * token re-rendered — and re-parsed the markdown of — the whole conversation.
10
+ *
11
+ * The contract that keeps it working: every callback prop must be stable.
12
+ * ChatPage wraps all three in useCallback for exactly this reason.
13
+ */
14
+ export declare const MessageBubble: import("react").MemoExoticComponent<({ message, onToolApproval, onAskUserSubmit, onAskUserCancel, }: {
4
15
  message: ChatMessage;
5
16
  onToolApproval: (toolUseId: string, approved: boolean) => void;
6
17
  onAskUserSubmit: (requestId: string, answers: Record<string, string>, annotations?: Record<string, AskUserAnnotation>) => void;
7
18
  onAskUserCancel: (requestId: string) => void;
8
- }): import("react").JSX.Element;
19
+ }) => import("react").JSX.Element>;
9
20
  //# sourceMappingURL=message-bubble.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"message-bubble.d.ts","sourceRoot":"","sources":["../../../src/components/chat/message-bubble.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,WAAW,EAIZ,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAW3E,wBAAgB,aAAa,CAAC,EAC5B,OAAO,EACP,cAAc,EACd,eAAe,EACf,eAAe,GAChB,EAAE;IACD,OAAO,EAAE,WAAW,CAAC;IACrB,cAAc,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;IAC/D,eAAe,EAAE,CACf,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,KAC5C,IAAI,CAAC;IACV,eAAe,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9C,+BA6DA"}
1
+ {"version":3,"file":"message-bubble.d.ts","sourceRoot":"","sources":["../../../src/components/chat/message-bubble.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,WAAW,EAIZ,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAW3E;;;;;;;;;;GAUG;AACH,eAAO,MAAM,aAAa,uGAKvB;IACD,OAAO,EAAE,WAAW,CAAC;IACrB,cAAc,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;IAC/D,eAAe,EAAE,CACf,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,KAC5C,IAAI,CAAC;IACV,eAAe,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9C,iCA6DC,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { uiConfig } from "../../config.js";
3
- import { useEffect, useRef, useState } from "react";
3
+ import { memo, useEffect, useRef, useState } from "react";
4
4
  import { ChevronDown, Sparkles, Mic, Image as ImageIcon } from "lucide-react";
5
5
  import { ToolCallTimeline } from "./tool-call-timeline.js";
6
6
  import { MarkdownContent } from "./markdown-content.js";
@@ -11,7 +11,18 @@ import { motion } from "framer-motion";
11
11
  import { buildMessageShareOptions } from "./message-share.js";
12
12
  import { ShareMenu } from "../share/share-menu.js";
13
13
  import { ZoomableImage } from "../images/zoomable-image.js";
14
- export function MessageBubble({ message, onToolApproval, onAskUserSubmit, onAskUserCancel, }) {
14
+ /**
15
+ * One message in the transcript.
16
+ *
17
+ * Memoized, and the memo is load-bearing rather than a micro-optimisation: the
18
+ * chat store replaces only the message it touches, so every OTHER message keeps
19
+ * its object identity across a store write. Without the memo, one streamed
20
+ * token re-rendered — and re-parsed the markdown of — the whole conversation.
21
+ *
22
+ * The contract that keeps it working: every callback prop must be stable.
23
+ * ChatPage wraps all three in useCallback for exactly this reason.
24
+ */
25
+ export const MessageBubble = memo(function MessageBubble({ message, onToolApproval, onAskUserSubmit, onAskUserCancel, }) {
15
26
  const isUser = message.role === "user";
16
27
  return (_jsxs(motion.div, { initial: { opacity: 0, y: 6 }, animate: { opacity: 1, y: 0 }, transition: { duration: 0.2, ease: "easeOut" }, className: "py-4", children: [_jsxs("div", { className: "mb-2 flex items-center gap-3", children: [_jsx("span", { className: isUser
17
28
  ? "select-none font-[family-name:var(--font-mono)] text-xs font-semibold uppercase tracking-widest text-primary/80"
@@ -19,8 +30,8 @@ export function MessageBubble({ message, onToolApproval, onAskUserSubmit, onAskU
19
30
  ? "h-3 w-3 text-primary/70"
20
31
  : "h-3 w-3 text-primary/50", "aria-label": message.source === "voice-conversation"
21
32
  ? "Voice conversation"
22
- : "Voice dictation" })), _jsx("span", { className: "font-[family-name:var(--font-mono)] text-[10px] text-muted-foreground/40", children: formatTime(message.timestamp) })] }), isUser ? (_jsxs("div", { className: "space-y-2", children: [_jsx(UserAttachments, { message: message }), message.content && (_jsx("div", { className: "text-sm leading-relaxed text-foreground whitespace-pre-wrap", children: linkifyPaths(message.content) }))] })) : (_jsx(AssistantContent, { message: message, onToolApproval: onToolApproval, onAskUserSubmit: onAskUserSubmit, onAskUserCancel: onAskUserCancel }))] }));
23
- }
33
+ : "Voice dictation" })), _jsx("span", { className: "font-[family-name:var(--font-mono)] text-[10px] text-muted-foreground/40", children: formatTime(message.timestamp) })] }), isUser ? (_jsxs("div", { className: "space-y-2", children: [_jsx(UserAttachments, { message: message }), message.content && (_jsx("div", { className: "chat-message-body text-sm leading-relaxed text-foreground whitespace-pre-wrap", children: linkifyPaths(message.content) }))] })) : (_jsx(AssistantContent, { message: message, onToolApproval: onToolApproval, onAskUserSubmit: onAskUserSubmit, onAskUserCancel: onAskUserCancel }))] }));
34
+ });
24
35
  /**
25
36
  * User-message image attachments. Live messages render real thumbnails from
26
37
  * their local object URLs; resumed-from-history messages carry only a count,
@@ -108,7 +119,7 @@ function AssistantContent({ message, onToolApproval, onAskUserSubmit, onAskUserC
108
119
  case "text":
109
120
  // The final text block carries the share affordance; text/markdown
110
121
  // share formats still use the full message content.
111
- return group.isLastText ? (_jsxs("div", { className: "group relative", ref: contentRef, children: [_jsx(MarkdownContent, { content: group.text }), showShare && shareOptions.length > 0 && (_jsx("div", { className: "mt-1 flex justify-end opacity-0 transition-opacity group-hover:opacity-100 focus-within:opacity-100", children: _jsx(ShareMenu, { options: shareOptions, title: "Share message" }) }))] }, i)) : (_jsx(MarkdownContent, { content: group.text }, i));
122
+ return group.isLastText ? (_jsxs("div", { className: "group relative", ref: contentRef, children: [_jsx("div", { className: "chat-message-body", children: _jsx(MarkdownContent, { content: group.text }) }), showShare && shareOptions.length > 0 && (_jsx("div", { className: "mt-1 flex justify-end opacity-0 transition-opacity group-hover:opacity-100 focus-within:opacity-100", children: _jsx(ShareMenu, { options: shareOptions, title: "Share message" }) }))] }, i)) : (_jsx("div", { className: "chat-message-body", children: _jsx(MarkdownContent, { content: group.text }) }, i));
112
123
  }
113
124
  }), unmatchedExchanges.map((ex) => (_jsx(AskUserCard, { requestId: ex.requestId, questions: ex.questions, answered: ex.answers, cancelled: ex.cancelled, live: message.isStreaming, onSubmit: onAskUserSubmit, onCancel: onAskUserCancel }, ex.requestId))), message.isStreaming && groups.length === 0 && unmatchedExchanges.length === 0 && (_jsxs("div", { className: "flex items-center gap-2 text-xs text-muted-foreground", children: [_jsx("span", { className: "inline-block h-1.5 w-1.5 rounded-full bg-primary", style: { animation: "breathe 2s ease-in-out infinite" } }), "Thinking..."] }))] }));
114
125
  }
@@ -1 +1 @@
1
- {"version":3,"file":"message-bubble.js","sourceRoot":"","sources":["../../../src/components/chat/message-bubble.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"message-bubble.js","sourceRoot":"","sources":["../../../src/components/chat/message-bubble.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Slash-command dispatch, shared by the composer's palette and the welcome
3
+ * screen's shortcut buttons.
4
+ *
5
+ * Every piece of state a command needs is read through `getState()` at the
6
+ * moment it runs rather than subscribed to, so the returned callback is stable
7
+ * for the life of the component. That matters because the composer is the
8
+ * component that re-renders on every keystroke: a command handler that changed
9
+ * identity per character would defeat the memoization around it.
10
+ */
11
+ export declare function useChatCommands(): (command: string) => void;
12
+ //# sourceMappingURL=use-chat-commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-chat-commands.d.ts","sourceRoot":"","sources":["../../../src/components/chat/use-chat-commands.ts"],"names":[],"mappings":"AAMA;;;;;;;;;GASG;AACH,wBAAgB,eAAe,IAAI,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAmC3D"}
@@ -0,0 +1,82 @@
1
+ import { useCallback } from "react";
2
+ import { useChatStore } from "../../stores/chat-store.js";
3
+ import { useConnectionStore } from "../../stores/connection-store.js";
4
+ import { useUIStore } from "../../stores/ui-store.js";
5
+ import { api } from "../../lib/api-client.js";
6
+ /**
7
+ * Slash-command dispatch, shared by the composer's palette and the welcome
8
+ * screen's shortcut buttons.
9
+ *
10
+ * Every piece of state a command needs is read through `getState()` at the
11
+ * moment it runs rather than subscribed to, so the returned callback is stable
12
+ * for the life of the component. That matters because the composer is the
13
+ * component that re-renders on every keystroke: a command handler that changed
14
+ * identity per character would defeat the memoization around it.
15
+ */
16
+ export function useChatCommands() {
17
+ return useCallback((command) => {
18
+ const ui = useUIStore.getState();
19
+ // Search and add talk to the brain CLI over REST, not to the agent — they
20
+ // stay available while a turn streams or the socket is down.
21
+ switch (command) {
22
+ case "search":
23
+ ui.setSearchPanelOpen(true);
24
+ return;
25
+ case "add":
26
+ ui.setAddPanelOpen(true);
27
+ return;
28
+ }
29
+ const chat = useChatStore.getState();
30
+ const sessionId = chat.activeSessionId;
31
+ const buffer = sessionId ? chat.buffers[sessionId] : chat.draft;
32
+ const disabled = useConnectionStore.getState().wsStatus !== "connected" ||
33
+ Boolean(buffer?.isStreaming);
34
+ if (disabled)
35
+ return;
36
+ switch (command) {
37
+ case "sync":
38
+ ui.setSyncPanelOpen(true);
39
+ break;
40
+ case "whatsup":
41
+ ui.setWhatsupPanelOpen(true);
42
+ break;
43
+ case "stats":
44
+ void runStats(sessionId);
45
+ break;
46
+ }
47
+ }, []);
48
+ }
49
+ /** Brain statistics rendered into the transcript as an assistant turn. */
50
+ async function runStats(sessionId) {
51
+ const chat = useChatStore.getState();
52
+ chat.addUserMessage(sessionId, "Stats");
53
+ chat.startAssistantMessage(sessionId);
54
+ try {
55
+ const stats = await api.brainStats();
56
+ const result = [
57
+ `**Brain Statistics**`,
58
+ `- Documents: ${stats.documents}`,
59
+ `- Tags: ${stats.tags}`,
60
+ `- Links: ${stats.links}`,
61
+ ``,
62
+ `**By Type:** ${Object.entries(stats.byType)
63
+ .sort(([, a], [, b]) => b - a)
64
+ .map(([t, n]) => `${t} (${n})`)
65
+ .join(", ")}`,
66
+ ``,
67
+ `**By Status:** ${Object.entries(stats.byStatus)
68
+ .map(([s, n]) => `${s} (${n})`)
69
+ .join(", ")}`,
70
+ ].join("\n");
71
+ useChatStore.getState().appendText(sessionId, result);
72
+ }
73
+ catch (err) {
74
+ useChatStore
75
+ .getState()
76
+ .appendText(sessionId, `**Error:** ${err instanceof Error ? err.message : "Action failed"}`);
77
+ }
78
+ finally {
79
+ useChatStore.getState().finishAssistantMessage(sessionId);
80
+ }
81
+ }
82
+ //# sourceMappingURL=use-chat-commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-chat-commands.js","sourceRoot":"","sources":["../../../src/components/chat/use-chat-commands.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"file-panel.d.ts","sourceRoot":"","sources":["../../../src/components/files/file-panel.tsx"],"names":[],"mappings":"AAOA,wBAAgB,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,IAAI,CAAA;CAAE,+BA4GlF"}
1
+ {"version":3,"file":"file-panel.d.ts","sourceRoot":"","sources":["../../../src/components/files/file-panel.tsx"],"names":[],"mappings":"AAiBA,wBAAgB,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,IAAI,CAAA;CAAE,+BAmHlF"}