@schlessera/brain-ui-react 0.30.1 → 0.32.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 (64) 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/passkey-tab.js +1 -1
  28. package/dist/components/settings/passkey-tab.js.map +1 -1
  29. package/dist/components/settings/settings-panel.d.ts.map +1 -1
  30. package/dist/components/settings/settings-panel.js +12 -4
  31. package/dist/components/settings/settings-panel.js.map +1 -1
  32. package/dist/hooks/use-deferred-unmount.d.ts +12 -0
  33. package/dist/hooks/use-deferred-unmount.d.ts.map +1 -0
  34. package/dist/hooks/use-deferred-unmount.js +24 -0
  35. package/dist/hooks/use-deferred-unmount.js.map +1 -0
  36. package/dist/hooks/use-websocket.d.ts +8 -0
  37. package/dist/hooks/use-websocket.d.ts.map +1 -1
  38. package/dist/hooks/use-websocket.js +66 -2
  39. package/dist/hooks/use-websocket.js.map +1 -1
  40. package/dist/index.d.ts +1 -2
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +3 -2
  43. package/dist/index.js.map +1 -1
  44. package/dist/lazy-pages.d.ts +3 -0
  45. package/dist/lazy-pages.d.ts.map +1 -0
  46. package/dist/lazy-pages.js +27 -0
  47. package/dist/lazy-pages.js.map +1 -0
  48. package/dist/styles.css +1 -1
  49. package/dist/theme.css +58 -0
  50. package/package.json +2 -2
  51. package/src/components/chat/brain-markdown.tsx +81 -9
  52. package/src/components/chat/chat-page.tsx +119 -709
  53. package/src/components/chat/composer.tsx +617 -0
  54. package/src/components/chat/message-bubble.tsx +24 -6
  55. package/src/components/chat/use-chat-commands.ts +87 -0
  56. package/src/components/files/file-panel.tsx +25 -8
  57. package/src/components/layout/slide-panel.tsx +13 -1
  58. package/src/components/settings/passkey-tab.tsx +2 -2
  59. package/src/components/settings/settings-panel.tsx +21 -10
  60. package/src/hooks/use-deferred-unmount.ts +24 -0
  61. package/src/hooks/use-websocket.ts +79 -2
  62. package/src/index.ts +3 -2
  63. package/src/lazy-pages.tsx +41 -0
  64. package/src/theme.css +58 -0
@@ -1,18 +1,12 @@
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, ArrowDown, 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";
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState, useRef, useEffect, useLayoutEffect, useCallback } from "react";
3
+ import { ArrowDown, ChevronUp } from "lucide-react";
4
+ import { useChatStore, activeChat } from "../../stores/chat-store.js";
8
5
  import { useUIStore } from "../../stores/ui-store.js";
9
6
  import { useWebSocket } from "../../hooks/use-websocket.js";
10
7
  import { MaskEditor } from "../images/mask-editor.js";
11
- import { fileToAttachment, validateAttachments, } from "../../lib/image-attachments.js";
12
8
  import { MessageBubble } from "./message-bubble.js";
13
9
  import { WelcomeState } from "./welcome-state.js";
14
- import { ShareIntake } from "./share-card.js";
15
- import { CommandPalette } from "./command-palette.js";
16
10
  import { SessionDrawer } from "./session-drawer.js";
17
11
  import { SubagentView } from "./subagent-view.js";
18
12
  import { DigestCard } from "../activity/digest-card.js";
@@ -22,64 +16,41 @@ import { WhatsupPanel } from "../quick-actions/whatsup-modal.js";
22
16
  import { SearchPanel } from "../quick-actions/search-modal.js";
23
17
  import { AddPanel } from "../quick-actions/add-modal.js";
24
18
  import { FilePanel } from "../files/file-panel.js";
25
- import { MicButton } from "../voice/mic-button.js";
26
- import { DictationSheet } from "../voice/dictation-sheet.js";
27
- import { ReviewCard } from "../voice/review-card.js";
28
- import { useDictation } from "../../voice/use-dictation.js";
29
- import { useVoiceStore } from "../../voice/voice-store.js";
30
- import { api } from "../../lib/api-client.js";
19
+ import { Composer } from "./composer.js";
20
+ import { useChatCommands } from "./use-chat-commands.js";
31
21
  import { getBackendUrl } from "../../lib/backend.js";
32
- import { detectClientEnvironment, primeClientEnvironment, READING_COLUMN_ATTR, } from "../../lib/client-environment.js";
33
- import { cn } from "../../lib/utils.js";
22
+ import { primeClientEnvironment, READING_COLUMN_ATTR, } from "../../lib/client-environment.js";
23
+ /**
24
+ * How much of a long transcript is rendered at once, and how much more each
25
+ * "show earlier" reveals.
26
+ *
27
+ * The transcript is the one part of this app with no natural size limit: a
28
+ * resumed session can replay hundreds of messages, and every one of them is a
29
+ * parsed markdown tree that the browser then has to lay out and keep. Rendering
30
+ * a window instead bounds the DOM without a virtualiser — messages are wildly
31
+ * variable in height, and estimating that is where virtualisers get scroll
32
+ * position wrong.
33
+ */
34
+ const WINDOW_SIZE = 40;
35
+ const WINDOW_STEP = 40;
36
+ /**
37
+ * The chat surface: transcript, panels, and the composer.
38
+ *
39
+ * This component holds transcript-scale state only. The draft lives one level
40
+ * down in <Composer>, so a keystroke never reaches the message list — see the
41
+ * note there. Every callback handed to a message is wrapped in useCallback for
42
+ * the same reason: MessageBubble is memoized, and an unstable prop would undo
43
+ * that on the first re-render.
44
+ */
34
45
  export function ChatPage() {
35
- const [input, setInput] = useState("");
36
- const [lastPrompt, setLastPrompt] = useState("");
37
- const [showCommandPalette, setShowCommandPalette] = useState(false);
38
46
  const scrollRef = useRef(null);
39
47
  const autoScrollRef = useRef(true);
40
48
  const [showScrollButton, setShowScrollButton] = useState(false);
41
- const textareaRef = useRef(null);
42
49
  const { send } = useWebSocket();
43
- // Image attachments. `attachmentsRef` mirrors state so async add/merge logic
44
- // reads the current set synchronously (avoids stale closures / updater races).
45
- const [attachments, setAttachments] = useState([]);
46
- const attachmentsRef = useRef([]);
47
- const [attachErrors, setAttachErrors] = useState([]);
48
- const libraryInputRef = useRef(null);
49
- const cameraInputRef = useRef(null);
50
- useEffect(() => {
51
- attachmentsRef.current = attachments;
52
- }, [attachments]);
53
- // Revoke preview URLs of attachments that were never sent (unmount cleanup;
54
- // sent attachments transfer URL ownership to the message in the chat store).
55
- useEffect(() => () => {
56
- for (const a of attachmentsRef.current)
57
- URL.revokeObjectURL(a.previewUrl);
58
- }, []);
59
- // Provider picker
60
- const [providerMenuOpen, setProviderMenuOpen] = useState(false);
61
- const providerMenuRef = useRef(null);
62
50
  const messages = useChatStore((s) => activeChat(s).messages);
63
- const isStreaming = useChatStore((s) => activeChat(s).isStreaming);
64
51
  const sessionId = useChatStore((s) => s.activeSessionId);
65
52
  const clearMessages = useChatStore((s) => s.clearMessages);
66
53
  const setActiveSession = useChatStore((s) => s.setActiveSession);
67
- // Key-bound buffer actions: this page always operates on the buffer in view
68
- // (the active session, or the draft when no session is bound yet).
69
- const startAssistantMessage = () => useChatStore.getState().startAssistantMessage(sessionId);
70
- const addUserMessage = (text, source, atts) => useChatStore.getState().addUserMessage(sessionId, text, source, atts);
71
- const resolveToolApproval = (toolUseId, approved) => useChatStore.getState().resolveToolApproval(sessionId, toolUseId, approved);
72
- const submitAskUserAnswers = (requestId, answers, annotations) => useChatStore.getState().submitAskUserAnswers(sessionId, requestId, answers, annotations);
73
- const cancelAskUser = (requestId) => useChatStore.getState().cancelAskUser(sessionId, requestId);
74
- const appendText = (text) => useChatStore.getState().appendText(sessionId, text);
75
- const finishAssistantMessage = () => useChatStore.getState().finishAssistantMessage(sessionId);
76
- const wsStatus = useConnectionStore((s) => s.wsStatus);
77
- const providers = useProviderStore((s) => s.available);
78
- const selectedProviderId = useProviderStore((s) => s.selectedId);
79
- const pinnedProviderId = useProviderStore((s) => s.pinnedId);
80
- const setSelectedProvider = useProviderStore((s) => s.setSelected);
81
- const loadProviders = useProviderStore((s) => s.loadProviders);
82
- const backends = useProviderStore((s) => s.backends);
83
54
  const sessionPanelOpen = useUIStore((s) => s.sessionPanelOpen);
84
55
  const setSessionPanelOpen = useUIStore((s) => s.setSessionPanelOpen);
85
56
  const subagentStack = useUIStore((s) => s.subagentStack);
@@ -95,11 +66,36 @@ export function ChatPage() {
95
66
  const setFilePanelOpen = useUIStore((s) => s.setFilePanelOpen);
96
67
  const settingsPanelOpen = useUIStore((s) => s.settingsPanelOpen);
97
68
  const setSettingsPanelOpen = useUIStore((s) => s.setSettingsPanelOpen);
98
- // Voice dictation state
99
- const voiceMode = useVoiceStore((s) => s.mode);
100
- const reviewText = useVoiceStore((s) => s.reviewText);
101
- const clearReview = useVoiceStore((s) => s.clearReview);
102
- const dictation = useDictation();
69
+ const runCommand = useChatCommands();
70
+ // Only the tail of a long transcript is rendered; the rest is one tap away.
71
+ const [visibleCount, setVisibleCount] = useState(WINDOW_SIZE);
72
+ // Switching sessions starts a fresh window. Adjusted during render rather
73
+ // than in an effect, so the new session never paints with the old window.
74
+ const [windowedSession, setWindowedSession] = useState(sessionId);
75
+ if (windowedSession !== sessionId) {
76
+ setWindowedSession(sessionId);
77
+ setVisibleCount(WINDOW_SIZE);
78
+ }
79
+ const hiddenCount = Math.max(0, messages.length - visibleCount);
80
+ const visibleMessages = hiddenCount > 0 ? messages.slice(hiddenCount) : messages;
81
+ // Revealing earlier messages prepends content, which would otherwise shove
82
+ // the view down by the height of everything added. Remember the distance to
83
+ // the BOTTOM across the change and restore it, so the message the user was
84
+ // reading stays where it was.
85
+ const scrollAnchorRef = useRef(null);
86
+ const showEarlier = useCallback(() => {
87
+ const el = scrollRef.current;
88
+ scrollAnchorRef.current = el ? el.scrollHeight - el.scrollTop : null;
89
+ setVisibleCount((n) => n + WINDOW_STEP);
90
+ }, []);
91
+ useLayoutEffect(() => {
92
+ const el = scrollRef.current;
93
+ const anchor = scrollAnchorRef.current;
94
+ if (el && anchor !== null) {
95
+ el.scrollTop = el.scrollHeight - anchor;
96
+ scrollAnchorRef.current = null;
97
+ }
98
+ });
103
99
  // Auto-scroll on new content when tailing is active
104
100
  useEffect(() => {
105
101
  const el = scrollRef.current;
@@ -126,347 +122,38 @@ export function ChatPage() {
126
122
  el.addEventListener("scroll", handleScroll, { passive: true });
127
123
  return () => el.removeEventListener("scroll", handleScroll);
128
124
  }, [hasMessages]);
129
- // Auto-grow textarea
130
- useEffect(() => {
131
- const el = textareaRef.current;
132
- if (el) {
133
- el.style.height = "auto";
134
- el.style.height = Math.min(el.scrollHeight, 200) + "px";
135
- }
136
- }, [input]);
137
- // Show/hide command palette based on input
138
- useEffect(() => {
139
- if (input.startsWith("/")) {
140
- setShowCommandPalette(true);
141
- }
142
- else {
143
- setShowCommandPalette(false);
144
- }
145
- }, [input]);
146
- // Load the available provider combos once on mount.
147
- useEffect(() => {
148
- void loadProviders();
149
- }, [loadProviders]);
150
- // Dismiss the provider popover on outside-click / Escape.
151
- useEffect(() => {
152
- if (!providerMenuOpen)
153
- return;
154
- const onDocClick = (e) => {
155
- if (!providerMenuRef.current?.contains(e.target)) {
156
- setProviderMenuOpen(false);
157
- }
158
- };
159
- const onKey = (e) => {
160
- if (e.key === "Escape")
161
- setProviderMenuOpen(false);
162
- };
163
- document.addEventListener("mousedown", onDocClick);
164
- document.addEventListener("keydown", onKey);
165
- return () => {
166
- document.removeEventListener("mousedown", onDocClick);
167
- document.removeEventListener("keydown", onKey);
168
- };
169
- }, [providerMenuOpen]);
170
- /**
171
- * The draft is whatever is visible above the send button: composer text
172
- * plus any voice text under review. Both send paths submit the combined
173
- * draft so nothing is silently dropped.
174
- */
175
- function draftText() {
176
- return [input.trim(), reviewText.trim()].filter(Boolean).join("\n");
177
- }
178
- /**
179
- * Decode, downscale and validate incoming image files, merging them with any
180
- * already-pending attachments. Rejected files (bad type / oversize / over the
181
- * per-message caps) surface as inline error lines; their object URLs are
182
- * revoked so nothing leaks.
183
- */
184
- async function addFiles(files) {
185
- const list = Array.from(files).filter((f) => f.type.startsWith("image/"));
186
- if (list.length === 0)
187
- return;
188
- const results = await Promise.all(list.map((f) => fileToAttachment(f)));
189
- const fresh = [];
190
- const errors = [];
191
- results.forEach((r, i) => {
192
- if ("error" in r) {
193
- errors.push(r.error);
194
- }
195
- else {
196
- fresh.push({ ...r, name: list[i].name });
197
- }
198
- });
199
- const { accepted } = validateAttachments([
200
- ...attachmentsRef.current,
201
- ...fresh,
202
- ]);
203
- // Revoke URLs of freshly-decoded images that didn't make the cut.
204
- for (const f of fresh) {
205
- if (!accepted.includes(f)) {
206
- URL.revokeObjectURL(f.previewUrl);
207
- errors.push(`${f.name}: not added (message limit reached)`);
208
- }
209
- }
210
- attachmentsRef.current = accepted;
211
- setAttachments(accepted);
212
- setAttachErrors(errors);
213
- }
214
- function removeAttachment(index) {
215
- const next = attachmentsRef.current.filter((item, i) => {
216
- if (i === index)
217
- URL.revokeObjectURL(item.previewUrl);
218
- return i !== index;
219
- });
220
- attachmentsRef.current = next;
221
- setAttachments(next);
222
- }
223
- async function onFilePick(e) {
224
- const files = e.target.files;
225
- if (files && files.length > 0)
226
- await addFiles(files);
227
- // Reset so picking the same file again still fires onChange.
228
- e.target.value = "";
229
- }
230
- function handleSubmit() {
231
- const text = draftText();
232
- const hasAttachments = attachments.length > 0;
233
- if ((!text && !hasAttachments) || wsStatus !== "connected")
234
- return;
235
- if (text)
236
- setLastPrompt(text);
237
- const messageAttachments = attachments.map((a) => ({
238
- previewUrl: a.previewUrl,
239
- mediaType: a.attachment.mediaType,
240
- }));
241
- addUserMessage(text, reviewText.trim() ? "voice-dictate" : "typed", messageAttachments.length > 0 ? messageAttachments : undefined);
242
- // A send while the session is already streaming is a follow-up — the server
243
- // queues it or delivers it live; don't pre-start a second assistant bubble
244
- // (the backend's next frames start it).
245
- if (!isStreaming)
246
- startAssistantMessage();
247
- // Correlate this turn when it is starting a NEW conversation, so its
248
- // session_info can be told apart from a background turn's.
249
- const draftId = sessionId ? undefined : useChatStore.getState().startDraftTurn();
250
- send({
251
- type: "chat_message",
252
- text,
253
- sessionId: sessionId ?? undefined,
254
- ...(draftId ? { draftId } : {}),
255
- // Provider only applies to new conversations; resumed sessions are
256
- // pinned server-side to their original combo.
257
- // Only send a provider the server actually offers — a stale persisted
258
- // id (e.g. key removed server-side) falls back to the server default
259
- // instead of erroring with PROVIDER_UNAVAILABLE.
260
- providerId: sessionId || !providers.some((p) => p.id === selectedProviderId)
261
- ? undefined
262
- : selectedProviderId,
263
- attachments: hasAttachments
264
- ? attachments.map((a) => a.attachment)
265
- : undefined,
266
- // Measured per send, not once per session: the same tab can rotate,
267
- // move to an external display, or be installed as a PWA mid-conversation.
268
- client: detectClientEnvironment(),
269
- });
270
- setInput("");
271
- clearReview();
272
- // Ownership of the preview URLs transfers to the rendered user message
273
- // (revoked later by the chat store on clear/resume) — don't revoke here.
274
- attachmentsRef.current = [];
275
- setAttachments([]);
276
- setAttachErrors([]);
277
- }
278
- function handleMicTap() {
279
- if (voiceMode === "dictate") {
280
- void dictation.stop(true);
281
- }
282
- else {
283
- // Defensive: blur composer so the keyboard never fights the mic sheet on Android
284
- textareaRef.current?.blur();
285
- // Any existing review text stays put — the new capture appends to it.
286
- void dictation.start();
287
- }
288
- }
289
- function handleVoiceSend() {
290
- if (!draftText() || isStreaming || wsStatus !== "connected") {
291
- // If we cannot send right now, fall back to editing
292
- handleVoiceEdit();
293
- return;
294
- }
295
- handleSubmit();
296
- }
297
- function handleVoiceEdit() {
298
- setInput((prev) => (prev ? `${prev}\n${reviewText}` : reviewText));
299
- clearReview();
300
- setTimeout(() => textareaRef.current?.focus(), 50);
301
- }
302
- function handleVoiceAppend() {
303
- // Review text stays in place; the next capture appends to it on stop.
304
- void dictation.start();
305
- }
306
- function handleRecall() {
307
- if (lastPrompt && !input.trim()) {
308
- setInput(lastPrompt);
309
- setTimeout(() => textareaRef.current?.focus(), 50);
310
- }
311
- }
312
- function handleCancel() {
313
- // Scope the cancel to the session in view so it is unambiguous when several
314
- // sessions are running.
315
- send({ type: "cancel", sessionId: sessionId ?? undefined });
316
- }
317
- function handleToolApproval(toolUseId, approved, always) {
318
- resolveToolApproval(toolUseId, approved);
125
+ const handleToolApproval = useCallback((toolUseId, approved, always) => {
126
+ useChatStore.getState().resolveToolApproval(sessionId, toolUseId, approved);
319
127
  if (approved) {
320
128
  send({ type: "tool_approval", toolUseId, ...(always ? { always: true } : {}) });
321
129
  }
322
130
  else {
323
131
  send({ type: "tool_denial", toolUseId, message: "Denied by user" });
324
132
  }
325
- }
326
- function handleAskUserSubmit(requestId, answers, annotations) {
327
- submitAskUserAnswers(requestId, answers, annotations);
133
+ }, [send, sessionId]);
134
+ const handleAskUserSubmit = useCallback((requestId, answers, annotations) => {
135
+ useChatStore
136
+ .getState()
137
+ .submitAskUserAnswers(sessionId, requestId, answers, annotations);
328
138
  send({ type: "ask_user_response", requestId, answers, annotations });
329
- }
330
- function handleAskUserCancel(requestId) {
331
- cancelAskUser(requestId);
139
+ }, [send, sessionId]);
140
+ const handleAskUserCancel = useCallback((requestId) => {
141
+ useChatStore.getState().cancelAskUser(sessionId, requestId);
332
142
  send({ type: "ask_user_cancel", requestId, reason: "User dismissed" });
333
- }
334
- function handleSessionResume(resumeSessionId) {
143
+ }, [send, sessionId]);
144
+ const handleSessionResume = useCallback((resumeSessionId) => {
335
145
  clearMessages();
336
146
  setActiveSession(resumeSessionId);
337
147
  send({ type: "session_resume", sessionId: resumeSessionId });
338
- }
339
- function handleCommand(command) {
340
- setInput("");
341
- setShowCommandPalette(false);
342
- // Search and add talk to the brain CLI over REST, not to the agent — they
343
- // stay available while a turn streams or the socket is down.
344
- switch (command) {
345
- case "search":
346
- setSearchPanelOpen(true);
347
- return;
348
- case "add":
349
- setAddPanelOpen(true);
350
- return;
351
- }
352
- const disabled = wsStatus !== "connected" || isStreaming;
353
- if (disabled)
354
- return;
355
- switch (command) {
356
- case "sync":
357
- setSyncPanelOpen(true);
358
- break;
359
- case "whatsup":
360
- setWhatsupPanelOpen(true);
361
- break;
362
- case "stats":
363
- runStatsAction();
364
- break;
365
- }
366
- }
367
- async function runStatsAction() {
368
- addUserMessage("Stats");
369
- startAssistantMessage();
370
- try {
371
- const stats = await api.brainStats();
372
- const result = [
373
- `**Brain Statistics**`,
374
- `- Documents: ${stats.documents}`,
375
- `- Tags: ${stats.tags}`,
376
- `- Links: ${stats.links}`,
377
- ``,
378
- `**By Type:** ${Object.entries(stats.byType)
379
- .sort(([, a], [, b]) => b - a)
380
- .map(([t, n]) => `${t} (${n})`)
381
- .join(", ")}`,
382
- ``,
383
- `**By Status:** ${Object.entries(stats.byStatus)
384
- .map(([s, n]) => `${s} (${n})`)
385
- .join(", ")}`,
386
- ].join("\n");
387
- appendText(result);
388
- }
389
- catch (err) {
390
- appendText(`**Error:** ${err instanceof Error ? err.message : "Action failed"}`);
391
- }
392
- finally {
393
- finishAssistantMessage();
394
- }
395
- }
396
- function scrollToBottom() {
148
+ }, [send, clearMessages, setActiveSession]);
149
+ const scrollToBottom = useCallback(() => {
397
150
  const el = scrollRef.current;
398
151
  if (el) {
399
152
  el.scrollTop = el.scrollHeight;
400
153
  autoScrollRef.current = true;
401
154
  setShowScrollButton(false);
402
155
  }
403
- }
404
- function handleWelcomeAction(action) {
405
- handleCommand(action);
406
- }
407
- const hasDraft = Boolean(input.trim() || reviewText.trim() || attachments.length > 0);
408
- // A send while a session is running is a follow-up (not blocked by streaming).
409
- const canSend = hasDraft && wsStatus === "connected";
410
- // Provider picker: locked to the pinned combo once a session is live.
411
- // Lock while streaming too: the first send of a new conversation pins the
412
- // provider server-side before session_info delivers the sessionId.
413
- const providerLocked = sessionId != null || isStreaming;
414
- const displayProviderId = providerLocked
415
- ? pinnedProviderId ?? selectedProviderId
416
- : selectedProviderId;
417
- const displayProvider = providers.find((p) => p.id === displayProviderId);
418
- // A session can be pinned to a profile the user has since hidden — it is gone
419
- // from the picker but still running the turn. Show its id rather than
420
- // claiming "Default model", which would name a different model than the one
421
- // actually answering.
422
- const displayProviderLabel = displayProvider?.label ?? displayProviderId ?? "Default model";
423
- const showProviderPicker = providers.length > 1;
424
- // What happens if the user sends into the currently-running session.
425
- const displayBackendId = displayProvider?.backendId;
426
- const followUpLive = displayBackendId
427
- ? backends[displayBackendId]?.capabilities.followUp ?? false
428
- : false;
429
- const followUpHint = isStreaming && sessionId
430
- ? followUpLive
431
- ? "Follows up live"
432
- : "Will queue"
433
- : null;
434
- return (_jsxs("div", { className: "flex flex-1 flex-col overflow-hidden", children: [_jsx(MaskEditor, { onSubmit: (requestId, maskPng) => send({ type: "mask_response", requestId, maskPng }), onCancel: (requestId, message) => send({ type: "mask_error", requestId, code: "cancelled", message }) }), subagentStack.length > 0 && (_jsx("div", { className: "fixed inset-0 z-40 bg-background", children: _jsx(SubagentView, { spanId: subagentStack[subagentStack.length - 1], onApproval: handleToolApproval }) })), _jsx(SessionDrawer, { open: sessionPanelOpen, onClose: () => setSessionPanelOpen(false), onResume: handleSessionResume }), _jsx(SettingsPanel, { open: settingsPanelOpen, onClose: () => setSettingsPanelOpen(false) }), _jsx(StreamingPanel, { open: syncPanelOpen, onClose: () => setSyncPanelOpen(false), title: "Brain Sync", endpoint: getBackendUrl("/api/brain/sync") }), _jsx(WhatsupPanel, { open: whatsupPanelOpen, onClose: () => setWhatsupPanelOpen(false) }), _jsx(SearchPanel, { open: searchPanelOpen, onClose: () => setSearchPanelOpen(false) }), _jsx(AddPanel, { open: addPanelOpen, onClose: () => setAddPanelOpen(false) }), _jsx(FilePanel, { open: filePanelOpen, onClose: () => setFilePanelOpen(false) }), _jsxs("div", { className: "relative flex-1 overflow-hidden", children: [messages.length === 0 ? (_jsxs("div", { className: "h-full overflow-y-auto", children: [_jsx("div", { className: "px-4 pt-3 md:px-6", children: _jsx(DigestCard, {}) }), _jsx(WelcomeState, { onAction: handleWelcomeAction })] })) : (_jsx("div", { ref: scrollRef, className: "h-full overflow-y-auto px-4 md:px-6", children: _jsx("div", { [READING_COLUMN_ATTR]: "", className: "mx-auto max-w-3xl divide-y divide-border/20", children: messages.map((msg) => (_jsx(MessageBubble, { message: msg, onToolApproval: handleToolApproval, onAskUserSubmit: handleAskUserSubmit, onAskUserCancel: handleAskUserCancel }, msg.id))) }) })), showScrollButton && (_jsx("button", { type: "button", onClick: scrollToBottom, title: "Scroll to bottom", className: "absolute bottom-4 left-1/2 -translate-x-1/2 flex h-8 w-8 items-center justify-center rounded-full border border-border bg-surface shadow-md text-muted-foreground transition-all duration-150 hover:text-foreground", children: _jsx(ArrowDown, { className: "h-4 w-4" }) }))] }), _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("textarea", { ref: textareaRef, value: input, onChange: (e) => setInput(e.target.value), onPaste: (e) => {
435
- const files = e.clipboardData?.files;
436
- if (files && files.length > 0) {
437
- const images = Array.from(files).filter((f) => f.type.startsWith("image/"));
438
- if (images.length > 0) {
439
- e.preventDefault();
440
- void addFiles(images);
441
- }
442
- }
443
- }, onKeyDown: (e) => {
444
- if (e.key === "Enter" && !e.shiftKey) {
445
- if (showCommandPalette)
446
- return;
447
- // On desktop (>=768px), Enter sends. On mobile, Enter inserts newline.
448
- if (window.matchMedia("(min-width: 768px)").matches) {
449
- e.preventDefault();
450
- handleSubmit();
451
- }
452
- }
453
- if (e.key === "ArrowUp" && !input.trim()) {
454
- handleRecall();
455
- }
456
- if (e.key === "Escape") {
457
- setShowCommandPalette(false);
458
- }
459
- }, placeholder: wsStatus !== "connected"
460
- ? "Connecting..."
461
- : uiConfig.composerPlaceholder, disabled: wsStatus !== "connected", rows: 1, className: "w-full resize-none bg-transparent px-5 py-4 text-sm text-foreground placeholder:text-muted-foreground/40 focus:outline-none disabled:opacity-50", style: { minHeight: "56px", maxHeight: "200px" } }), _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
462
- ? "Provider is fixed for this conversation"
463
- : "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
464
- ? "cursor-default text-muted-foreground/60"
465
- : "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: () => {
466
- setSelectedProvider(p.id);
467
- setProviderMenuOpen(false);
468
- }, 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
469
- ? "opacity-100"
470
- : "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" }) }))] })] })] })] }) })] }));
156
+ }, []);
157
+ return (_jsxs("div", { className: "flex flex-1 flex-col overflow-hidden", children: [_jsx(MaskEditor, { onSubmit: (requestId, maskPng) => send({ type: "mask_response", requestId, maskPng }), onCancel: (requestId, message) => send({ type: "mask_error", requestId, code: "cancelled", message }) }), subagentStack.length > 0 && (_jsx("div", { className: "fixed inset-0 z-40 bg-background", children: _jsx(SubagentView, { spanId: subagentStack[subagentStack.length - 1], onApproval: handleToolApproval }) })), _jsx(SessionDrawer, { open: sessionPanelOpen, onClose: () => setSessionPanelOpen(false), onResume: handleSessionResume }), _jsx(SettingsPanel, { open: settingsPanelOpen, onClose: () => setSettingsPanelOpen(false) }), _jsx(StreamingPanel, { open: syncPanelOpen, onClose: () => setSyncPanelOpen(false), title: "Brain Sync", endpoint: getBackendUrl("/api/brain/sync") }), _jsx(WhatsupPanel, { open: whatsupPanelOpen, onClose: () => setWhatsupPanelOpen(false) }), _jsx(SearchPanel, { open: searchPanelOpen, onClose: () => setSearchPanelOpen(false) }), _jsx(AddPanel, { open: addPanelOpen, onClose: () => setAddPanelOpen(false) }), _jsx(FilePanel, { open: filePanelOpen, onClose: () => setFilePanelOpen(false) }), _jsxs("div", { className: "relative flex-1 overflow-hidden", children: [messages.length === 0 ? (_jsxs("div", { className: "h-full overflow-y-auto", children: [_jsx("div", { className: "px-4 pt-3 md:px-6", children: _jsx(DigestCard, {}) }), _jsx(WelcomeState, { onAction: runCommand })] })) : (_jsx("div", { ref: scrollRef, className: "h-full overflow-y-auto px-4 md:px-6", children: _jsxs("div", { [READING_COLUMN_ATTR]: "", className: "mx-auto max-w-3xl divide-y divide-border/20", children: [hiddenCount > 0 && (_jsx("div", { className: "flex justify-center py-3", children: _jsxs("button", { type: "button", onClick: showEarlier, className: "flex items-center gap-1.5 rounded-lg border border-border bg-surface px-3 py-1.5 text-xs text-muted-foreground transition-colors hover:text-foreground", children: [_jsx(ChevronUp, { className: "h-3.5 w-3.5" }), "Show ", Math.min(hiddenCount, WINDOW_STEP), " earlier message", Math.min(hiddenCount, WINDOW_STEP) === 1 ? "" : "s", _jsxs("span", { className: "text-muted-foreground/50", children: ["(", hiddenCount, " hidden)"] })] }) })), visibleMessages.map((msg) => (_jsx(MessageBubble, { message: msg, onToolApproval: handleToolApproval, onAskUserSubmit: handleAskUserSubmit, onAskUserCancel: handleAskUserCancel }, msg.id)))] }) })), showScrollButton && (_jsx("button", { type: "button", onClick: scrollToBottom, title: "Scroll to bottom", className: "absolute bottom-4 left-1/2 -translate-x-1/2 flex h-8 w-8 items-center justify-center rounded-full border border-border bg-surface shadow-md text-muted-foreground transition-all duration-150 hover:text-foreground", children: _jsx(ArrowDown, { className: "h-4 w-4" }) }))] }), _jsx(Composer, { send: send })] }));
471
158
  }
472
159
  //# sourceMappingURL=chat-page.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"chat-page.js","sourceRoot":"","sources":["../../../src/components/chat/chat-page.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"chat-page.js","sourceRoot":"","sources":["../../../src/components/chat/chat-page.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { ClientMessage } from "@schlessera/brain-ui-sdk/protocol";
2
+ /**
3
+ * The composer — everything below the transcript: draft text, attachments,
4
+ * voice review, provider picker, send/cancel.
5
+ *
6
+ * It is its own component for one reason: it owns the draft, and the draft
7
+ * changes on every keystroke. While this lived inside ChatPage, a character
8
+ * typed re-rendered the entire transcript, so typing cost grew with the length
9
+ * of the conversation. Keeping the state here bounds a keystroke to this
10
+ * subtree. Nothing above it re-renders, whatever the transcript holds.
11
+ *
12
+ * The corollary is a rule for future edits: transcript-scale state does not
13
+ * belong in this file, and draft state does not belong above it.
14
+ */
15
+ export declare function Composer({ send }: {
16
+ send: (msg: ClientMessage) => void;
17
+ }): import("react").JSX.Element;
18
+ //# sourceMappingURL=composer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composer.d.ts","sourceRoot":"","sources":["../../../src/components/chat/composer.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAqBvE;;;;;;;;;;;;GAYG;AACH,wBAAgB,QAAQ,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,IAAI,CAAA;CAAE,+BA0jBxE"}