@schlessera/brain-ui-react 0.4.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 (311) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +70 -0
  3. package/dist/components/chat/ask-user-card.d.ts +12 -0
  4. package/dist/components/chat/ask-user-card.d.ts.map +1 -0
  5. package/dist/components/chat/ask-user-card.js +185 -0
  6. package/dist/components/chat/ask-user-card.js.map +1 -0
  7. package/dist/components/chat/brain-markdown.d.ts +35 -0
  8. package/dist/components/chat/brain-markdown.d.ts.map +1 -0
  9. package/dist/components/chat/brain-markdown.js +363 -0
  10. package/dist/components/chat/brain-markdown.js.map +1 -0
  11. package/dist/components/chat/chat-page.d.ts +2 -0
  12. package/dist/components/chat/chat-page.d.ts.map +1 -0
  13. package/dist/components/chat/chat-page.js +442 -0
  14. package/dist/components/chat/chat-page.js.map +1 -0
  15. package/dist/components/chat/command-palette.d.ts +5 -0
  16. package/dist/components/chat/command-palette.d.ts.map +1 -0
  17. package/dist/components/chat/command-palette.js +18 -0
  18. package/dist/components/chat/command-palette.js.map +1 -0
  19. package/dist/components/chat/markdown-content.d.ts +4 -0
  20. package/dist/components/chat/markdown-content.d.ts.map +1 -0
  21. package/dist/components/chat/markdown-content.js +6 -0
  22. package/dist/components/chat/markdown-content.js.map +1 -0
  23. package/dist/components/chat/message-bubble.d.ts +9 -0
  24. package/dist/components/chat/message-bubble.d.ts.map +1 -0
  25. package/dist/components/chat/message-bubble.js +129 -0
  26. package/dist/components/chat/message-bubble.js.map +1 -0
  27. package/dist/components/chat/message-share.d.ts +10 -0
  28. package/dist/components/chat/message-share.d.ts.map +1 -0
  29. package/dist/components/chat/message-share.js +65 -0
  30. package/dist/components/chat/message-share.js.map +1 -0
  31. package/dist/components/chat/renderers/claude-tools.d.ts +3 -0
  32. package/dist/components/chat/renderers/claude-tools.d.ts.map +1 -0
  33. package/dist/components/chat/renderers/claude-tools.js +38 -0
  34. package/dist/components/chat/renderers/claude-tools.js.map +1 -0
  35. package/dist/components/chat/renderers/generic.d.ts +9 -0
  36. package/dist/components/chat/renderers/generic.d.ts.map +1 -0
  37. package/dist/components/chat/renderers/generic.js +68 -0
  38. package/dist/components/chat/renderers/generic.js.map +1 -0
  39. package/dist/components/chat/renderers/index.d.ts +5 -0
  40. package/dist/components/chat/renderers/index.d.ts.map +1 -0
  41. package/dist/components/chat/renderers/index.js +17 -0
  42. package/dist/components/chat/renderers/index.js.map +1 -0
  43. package/dist/components/chat/risk-hints.d.ts +20 -0
  44. package/dist/components/chat/risk-hints.d.ts.map +1 -0
  45. package/dist/components/chat/risk-hints.js +81 -0
  46. package/dist/components/chat/risk-hints.js.map +1 -0
  47. package/dist/components/chat/session-drawer.d.ts +6 -0
  48. package/dist/components/chat/session-drawer.d.ts.map +1 -0
  49. package/dist/components/chat/session-drawer.js +96 -0
  50. package/dist/components/chat/session-drawer.js.map +1 -0
  51. package/dist/components/chat/share-block.d.ts +9 -0
  52. package/dist/components/chat/share-block.d.ts.map +1 -0
  53. package/dist/components/chat/share-block.js +70 -0
  54. package/dist/components/chat/share-block.js.map +1 -0
  55. package/dist/components/chat/tool-call-timeline.d.ts +8 -0
  56. package/dist/components/chat/tool-call-timeline.d.ts.map +1 -0
  57. package/dist/components/chat/tool-call-timeline.js +100 -0
  58. package/dist/components/chat/tool-call-timeline.js.map +1 -0
  59. package/dist/components/chat/tool-views.d.ts +116 -0
  60. package/dist/components/chat/tool-views.d.ts.map +1 -0
  61. package/dist/components/chat/tool-views.js +628 -0
  62. package/dist/components/chat/tool-views.js.map +1 -0
  63. package/dist/components/chat/welcome-state.d.ts +4 -0
  64. package/dist/components/chat/welcome-state.d.ts.map +1 -0
  65. package/dist/components/chat/welcome-state.js +10 -0
  66. package/dist/components/chat/welcome-state.js.map +1 -0
  67. package/dist/components/connectivity/connection-gate.d.ts +5 -0
  68. package/dist/components/connectivity/connection-gate.d.ts.map +1 -0
  69. package/dist/components/connectivity/connection-gate.js +42 -0
  70. package/dist/components/connectivity/connection-gate.js.map +1 -0
  71. package/dist/components/connectivity/login-screen.d.ts +9 -0
  72. package/dist/components/connectivity/login-screen.d.ts.map +1 -0
  73. package/dist/components/connectivity/login-screen.js +99 -0
  74. package/dist/components/connectivity/login-screen.js.map +1 -0
  75. package/dist/components/files/file-panel.d.ts +5 -0
  76. package/dist/components/files/file-panel.d.ts.map +1 -0
  77. package/dist/components/files/file-panel.js +46 -0
  78. package/dist/components/files/file-panel.js.map +1 -0
  79. package/dist/components/files/file-tree.d.ts +2 -0
  80. package/dist/components/files/file-tree.d.ts.map +1 -0
  81. package/dist/components/files/file-tree.js +63 -0
  82. package/dist/components/files/file-tree.js.map +1 -0
  83. package/dist/components/files/file-viewer-binary.d.ts +5 -0
  84. package/dist/components/files/file-viewer-binary.d.ts.map +1 -0
  85. package/dist/components/files/file-viewer-binary.js +20 -0
  86. package/dist/components/files/file-viewer-binary.js.map +1 -0
  87. package/dist/components/files/file-viewer-html.d.ts +4 -0
  88. package/dist/components/files/file-viewer-html.d.ts.map +1 -0
  89. package/dist/components/files/file-viewer-html.js +5 -0
  90. package/dist/components/files/file-viewer-html.js.map +1 -0
  91. package/dist/components/files/file-viewer-markdown.d.ts +4 -0
  92. package/dist/components/files/file-viewer-markdown.d.ts.map +1 -0
  93. package/dist/components/files/file-viewer-markdown.js +10 -0
  94. package/dist/components/files/file-viewer-markdown.js.map +1 -0
  95. package/dist/components/files/file-viewer-raw.d.ts +5 -0
  96. package/dist/components/files/file-viewer-raw.d.ts.map +1 -0
  97. package/dist/components/files/file-viewer-raw.js +15 -0
  98. package/dist/components/files/file-viewer-raw.js.map +1 -0
  99. package/dist/components/files/file-viewer.d.ts +2 -0
  100. package/dist/components/files/file-viewer.d.ts.map +1 -0
  101. package/dist/components/files/file-viewer.js +175 -0
  102. package/dist/components/files/file-viewer.js.map +1 -0
  103. package/dist/components/files/frontmatter-panel.d.ts +5 -0
  104. package/dist/components/files/frontmatter-panel.d.ts.map +1 -0
  105. package/dist/components/files/frontmatter-panel.js +12 -0
  106. package/dist/components/files/frontmatter-panel.js.map +1 -0
  107. package/dist/components/layout/app-shell.d.ts +5 -0
  108. package/dist/components/layout/app-shell.d.ts.map +1 -0
  109. package/dist/components/layout/app-shell.js +10 -0
  110. package/dist/components/layout/app-shell.js.map +1 -0
  111. package/dist/components/layout/mobile-tab-bar.d.ts +2 -0
  112. package/dist/components/layout/mobile-tab-bar.d.ts.map +1 -0
  113. package/dist/components/layout/mobile-tab-bar.js +16 -0
  114. package/dist/components/layout/mobile-tab-bar.js.map +1 -0
  115. package/dist/components/layout/side-rail.d.ts +2 -0
  116. package/dist/components/layout/side-rail.d.ts.map +1 -0
  117. package/dist/components/layout/side-rail.js +26 -0
  118. package/dist/components/layout/side-rail.js.map +1 -0
  119. package/dist/components/layout/slide-panel.d.ts +9 -0
  120. package/dist/components/layout/slide-panel.d.ts.map +1 -0
  121. package/dist/components/layout/slide-panel.js +18 -0
  122. package/dist/components/layout/slide-panel.js.map +1 -0
  123. package/dist/components/quick-actions/streaming-modal.d.ts +8 -0
  124. package/dist/components/quick-actions/streaming-modal.d.ts.map +1 -0
  125. package/dist/components/quick-actions/streaming-modal.js +92 -0
  126. package/dist/components/quick-actions/streaming-modal.js.map +1 -0
  127. package/dist/components/quick-actions/whatsup-modal.d.ts +5 -0
  128. package/dist/components/quick-actions/whatsup-modal.d.ts.map +1 -0
  129. package/dist/components/quick-actions/whatsup-modal.js +82 -0
  130. package/dist/components/quick-actions/whatsup-modal.js.map +1 -0
  131. package/dist/components/settings/passkey-panel.d.ts +10 -0
  132. package/dist/components/settings/passkey-panel.d.ts.map +1 -0
  133. package/dist/components/settings/passkey-panel.js +118 -0
  134. package/dist/components/settings/passkey-panel.js.map +1 -0
  135. package/dist/components/share/share-menu.d.ts +23 -0
  136. package/dist/components/share/share-menu.d.ts.map +1 -0
  137. package/dist/components/share/share-menu.js +58 -0
  138. package/dist/components/share/share-menu.js.map +1 -0
  139. package/dist/components/voice/dictation-sheet.d.ts +6 -0
  140. package/dist/components/voice/dictation-sheet.d.ts.map +1 -0
  141. package/dist/components/voice/dictation-sheet.js +91 -0
  142. package/dist/components/voice/dictation-sheet.js.map +1 -0
  143. package/dist/components/voice/mic-button.d.ts +6 -0
  144. package/dist/components/voice/mic-button.d.ts.map +1 -0
  145. package/dist/components/voice/mic-button.js +9 -0
  146. package/dist/components/voice/mic-button.js.map +1 -0
  147. package/dist/components/voice/review-card.d.ts +8 -0
  148. package/dist/components/voice/review-card.d.ts.map +1 -0
  149. package/dist/components/voice/review-card.js +8 -0
  150. package/dist/components/voice/review-card.js.map +1 -0
  151. package/dist/config.d.ts +19 -0
  152. package/dist/config.d.ts.map +1 -0
  153. package/dist/config.js +10 -0
  154. package/dist/config.js.map +1 -0
  155. package/dist/hooks/use-vpn-status.d.ts +2 -0
  156. package/dist/hooks/use-vpn-status.d.ts.map +1 -0
  157. package/dist/hooks/use-vpn-status.js +71 -0
  158. package/dist/hooks/use-vpn-status.js.map +1 -0
  159. package/dist/hooks/use-websocket.d.ts +8 -0
  160. package/dist/hooks/use-websocket.d.ts.map +1 -0
  161. package/dist/hooks/use-websocket.js +366 -0
  162. package/dist/hooks/use-websocket.js.map +1 -0
  163. package/dist/index.d.ts +25 -0
  164. package/dist/index.d.ts.map +1 -0
  165. package/dist/index.js +31 -0
  166. package/dist/index.js.map +1 -0
  167. package/dist/lib/api-client.d.ts +115 -0
  168. package/dist/lib/api-client.d.ts.map +1 -0
  169. package/dist/lib/api-client.js +70 -0
  170. package/dist/lib/api-client.js.map +1 -0
  171. package/dist/lib/backend.d.ts +7 -0
  172. package/dist/lib/backend.d.ts.map +1 -0
  173. package/dist/lib/backend.js +33 -0
  174. package/dist/lib/backend.js.map +1 -0
  175. package/dist/lib/frontmatter.d.ts +21 -0
  176. package/dist/lib/frontmatter.d.ts.map +1 -0
  177. package/dist/lib/frontmatter.js +88 -0
  178. package/dist/lib/frontmatter.js.map +1 -0
  179. package/dist/lib/image-attachments.d.ts +36 -0
  180. package/dist/lib/image-attachments.d.ts.map +1 -0
  181. package/dist/lib/image-attachments.js +175 -0
  182. package/dist/lib/image-attachments.js.map +1 -0
  183. package/dist/lib/passkeys.d.ts +18 -0
  184. package/dist/lib/passkeys.d.ts.map +1 -0
  185. package/dist/lib/passkeys.js +36 -0
  186. package/dist/lib/passkeys.js.map +1 -0
  187. package/dist/lib/share.d.ts +53 -0
  188. package/dist/lib/share.d.ts.map +1 -0
  189. package/dist/lib/share.js +144 -0
  190. package/dist/lib/share.js.map +1 -0
  191. package/dist/lib/strip-markdown.d.ts +10 -0
  192. package/dist/lib/strip-markdown.d.ts.map +1 -0
  193. package/dist/lib/strip-markdown.js +37 -0
  194. package/dist/lib/strip-markdown.js.map +1 -0
  195. package/dist/lib/tool-names.d.ts +17 -0
  196. package/dist/lib/tool-names.d.ts.map +1 -0
  197. package/dist/lib/tool-names.js +23 -0
  198. package/dist/lib/tool-names.js.map +1 -0
  199. package/dist/lib/utils.d.ts +3 -0
  200. package/dist/lib/utils.d.ts.map +1 -0
  201. package/dist/lib/utils.js +6 -0
  202. package/dist/lib/utils.js.map +1 -0
  203. package/dist/lib/ws-client.d.ts +26 -0
  204. package/dist/lib/ws-client.d.ts.map +1 -0
  205. package/dist/lib/ws-client.js +93 -0
  206. package/dist/lib/ws-client.js.map +1 -0
  207. package/dist/stores/chat-store.d.ts +131 -0
  208. package/dist/stores/chat-store.d.ts.map +1 -0
  209. package/dist/stores/chat-store.js +376 -0
  210. package/dist/stores/chat-store.js.map +1 -0
  211. package/dist/stores/connection-store.d.ts +11 -0
  212. package/dist/stores/connection-store.d.ts.map +1 -0
  213. package/dist/stores/connection-store.js +8 -0
  214. package/dist/stores/connection-store.js.map +1 -0
  215. package/dist/stores/file-store.d.ts +53 -0
  216. package/dist/stores/file-store.d.ts.map +1 -0
  217. package/dist/stores/file-store.js +284 -0
  218. package/dist/stores/file-store.js.map +1 -0
  219. package/dist/stores/provider-store.d.ts +24 -0
  220. package/dist/stores/provider-store.d.ts.map +1 -0
  221. package/dist/stores/provider-store.js +56 -0
  222. package/dist/stores/provider-store.js.map +1 -0
  223. package/dist/stores/ui-store.d.ts +21 -0
  224. package/dist/stores/ui-store.d.ts.map +1 -0
  225. package/dist/stores/ui-store.js +23 -0
  226. package/dist/stores/ui-store.js.map +1 -0
  227. package/dist/styles.css +2 -0
  228. package/dist/voice/asr-clients.d.ts +2 -0
  229. package/dist/voice/asr-clients.d.ts.map +1 -0
  230. package/dist/voice/asr-clients.js +33 -0
  231. package/dist/voice/asr-clients.js.map +1 -0
  232. package/dist/voice/asr-deepgram.d.ts +38 -0
  233. package/dist/voice/asr-deepgram.d.ts.map +1 -0
  234. package/dist/voice/asr-deepgram.js +307 -0
  235. package/dist/voice/asr-deepgram.js.map +1 -0
  236. package/dist/voice/asr-webspeech.d.ts +23 -0
  237. package/dist/voice/asr-webspeech.d.ts.map +1 -0
  238. package/dist/voice/asr-webspeech.js +93 -0
  239. package/dist/voice/asr-webspeech.js.map +1 -0
  240. package/dist/voice/use-dictation.d.ts +6 -0
  241. package/dist/voice/use-dictation.d.ts.map +1 -0
  242. package/dist/voice/use-dictation.js +174 -0
  243. package/dist/voice/use-dictation.js.map +1 -0
  244. package/dist/voice/voice-store.d.ts +26 -0
  245. package/dist/voice/voice-store.d.ts.map +1 -0
  246. package/dist/voice/voice-store.js +27 -0
  247. package/dist/voice/voice-store.js.map +1 -0
  248. package/package.json +71 -0
  249. package/src/components/chat/ask-user-card.tsx +451 -0
  250. package/src/components/chat/brain-markdown.tsx +547 -0
  251. package/src/components/chat/chat-page.tsx +820 -0
  252. package/src/components/chat/command-palette.tsx +68 -0
  253. package/src/components/chat/markdown-content.tsx +5 -0
  254. package/src/components/chat/message-bubble.tsx +362 -0
  255. package/src/components/chat/message-share.ts +78 -0
  256. package/src/components/chat/renderers/claude-tools.tsx +53 -0
  257. package/src/components/chat/renderers/generic.tsx +85 -0
  258. package/src/components/chat/renderers/index.ts +19 -0
  259. package/src/components/chat/risk-hints.ts +95 -0
  260. package/src/components/chat/session-drawer.tsx +213 -0
  261. package/src/components/chat/share-block.tsx +128 -0
  262. package/src/components/chat/tool-call-timeline.tsx +322 -0
  263. package/src/components/chat/tool-views.tsx +898 -0
  264. package/src/components/chat/welcome-state.tsx +105 -0
  265. package/src/components/connectivity/connection-gate.tsx +137 -0
  266. package/src/components/connectivity/login-screen.tsx +169 -0
  267. package/src/components/files/file-panel.tsx +116 -0
  268. package/src/components/files/file-tree.tsx +143 -0
  269. package/src/components/files/file-viewer-binary.tsx +63 -0
  270. package/src/components/files/file-viewer-html.tsx +10 -0
  271. package/src/components/files/file-viewer-markdown.tsx +14 -0
  272. package/src/components/files/file-viewer-raw.tsx +44 -0
  273. package/src/components/files/file-viewer.tsx +290 -0
  274. package/src/components/files/frontmatter-panel.tsx +78 -0
  275. package/src/components/layout/app-shell.tsx +25 -0
  276. package/src/components/layout/mobile-tab-bar.tsx +54 -0
  277. package/src/components/layout/side-rail.tsx +128 -0
  278. package/src/components/layout/slide-panel.tsx +64 -0
  279. package/src/components/quick-actions/streaming-modal.tsx +168 -0
  280. package/src/components/quick-actions/whatsup-modal.tsx +149 -0
  281. package/src/components/settings/passkey-panel.tsx +281 -0
  282. package/src/components/share/share-menu.tsx +121 -0
  283. package/src/components/voice/dictation-sheet.tsx +217 -0
  284. package/src/components/voice/mic-button.tsx +31 -0
  285. package/src/components/voice/review-card.tsx +66 -0
  286. package/src/config.ts +27 -0
  287. package/src/hooks/use-vpn-status.ts +75 -0
  288. package/src/hooks/use-websocket.ts +403 -0
  289. package/src/index.ts +46 -0
  290. package/src/lib/api-client.ts +173 -0
  291. package/src/lib/backend.ts +35 -0
  292. package/src/lib/frontmatter.ts +99 -0
  293. package/src/lib/image-attachments.ts +221 -0
  294. package/src/lib/passkeys.ts +50 -0
  295. package/src/lib/share.ts +167 -0
  296. package/src/lib/strip-markdown.ts +38 -0
  297. package/src/lib/tool-names.ts +27 -0
  298. package/src/lib/utils.ts +6 -0
  299. package/src/lib/ws-client.ts +109 -0
  300. package/src/stores/chat-store.ts +619 -0
  301. package/src/stores/connection-store.ts +23 -0
  302. package/src/stores/file-store.ts +344 -0
  303. package/src/stores/provider-store.ts +85 -0
  304. package/src/stores/ui-store.ts +48 -0
  305. package/src/styles.css +4 -0
  306. package/src/theme.css +425 -0
  307. package/src/voice/asr-clients.ts +45 -0
  308. package/src/voice/asr-deepgram.ts +325 -0
  309. package/src/voice/asr-webspeech.ts +135 -0
  310. package/src/voice/use-dictation.ts +187 -0
  311. package/src/voice/voice-store.ts +55 -0
@@ -0,0 +1,442 @@
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";
8
+ import { useUIStore } from "../../stores/ui-store.js";
9
+ import { useWebSocket } from "../../hooks/use-websocket.js";
10
+ import { fileToAttachment, validateAttachments, } from "../../lib/image-attachments.js";
11
+ import { MessageBubble } from "./message-bubble.js";
12
+ import { WelcomeState } from "./welcome-state.js";
13
+ import { CommandPalette } from "./command-palette.js";
14
+ import { SessionDrawer } from "./session-drawer.js";
15
+ import { PasskeyPanel } from "../settings/passkey-panel.js";
16
+ import { StreamingPanel } from "../quick-actions/streaming-modal.js";
17
+ import { WhatsupPanel } from "../quick-actions/whatsup-modal.js";
18
+ import { FilePanel } from "../files/file-panel.js";
19
+ import { MicButton } from "../voice/mic-button.js";
20
+ import { DictationSheet } from "../voice/dictation-sheet.js";
21
+ import { ReviewCard } from "../voice/review-card.js";
22
+ import { useDictation } from "../../voice/use-dictation.js";
23
+ import { useVoiceStore } from "../../voice/voice-store.js";
24
+ import { api } from "../../lib/api-client.js";
25
+ import { getBackendUrl } from "../../lib/backend.js";
26
+ import { cn } from "../../lib/utils.js";
27
+ export function ChatPage() {
28
+ const [input, setInput] = useState("");
29
+ const [lastPrompt, setLastPrompt] = useState("");
30
+ const [showCommandPalette, setShowCommandPalette] = useState(false);
31
+ const scrollRef = useRef(null);
32
+ const autoScrollRef = useRef(true);
33
+ const [showScrollButton, setShowScrollButton] = useState(false);
34
+ const textareaRef = useRef(null);
35
+ const { send } = useWebSocket();
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 messages = useChatStore((s) => activeChat(s).messages);
56
+ const isStreaming = useChatStore((s) => activeChat(s).isStreaming);
57
+ const sessionId = useChatStore((s) => s.activeSessionId);
58
+ const clearMessages = useChatStore((s) => s.clearMessages);
59
+ const setActiveSession = useChatStore((s) => s.setActiveSession);
60
+ // Key-bound buffer actions: this page always operates on the buffer in view
61
+ // (the active session, or the draft when no session is bound yet).
62
+ const startAssistantMessage = () => useChatStore.getState().startAssistantMessage(sessionId);
63
+ const addUserMessage = (text, source, atts) => useChatStore.getState().addUserMessage(sessionId, text, source, atts);
64
+ const resolveToolApproval = (toolUseId, approved) => useChatStore.getState().resolveToolApproval(sessionId, toolUseId, approved);
65
+ const submitAskUserAnswers = (requestId, answers, annotations) => useChatStore.getState().submitAskUserAnswers(sessionId, requestId, answers, annotations);
66
+ const cancelAskUser = (requestId) => useChatStore.getState().cancelAskUser(sessionId, requestId);
67
+ const appendText = (text) => useChatStore.getState().appendText(sessionId, text);
68
+ const finishAssistantMessage = () => useChatStore.getState().finishAssistantMessage(sessionId);
69
+ const wsStatus = useConnectionStore((s) => s.wsStatus);
70
+ const providers = useProviderStore((s) => s.available);
71
+ const selectedProviderId = useProviderStore((s) => s.selectedId);
72
+ const pinnedProviderId = useProviderStore((s) => s.pinnedId);
73
+ const setSelectedProvider = useProviderStore((s) => s.setSelected);
74
+ const loadProviders = useProviderStore((s) => s.loadProviders);
75
+ const backends = useProviderStore((s) => s.backends);
76
+ const sessionPanelOpen = useUIStore((s) => s.sessionPanelOpen);
77
+ const setSessionPanelOpen = useUIStore((s) => s.setSessionPanelOpen);
78
+ const syncPanelOpen = useUIStore((s) => s.syncPanelOpen);
79
+ const setSyncPanelOpen = useUIStore((s) => s.setSyncPanelOpen);
80
+ const whatsupPanelOpen = useUIStore((s) => s.whatsupPanelOpen);
81
+ const setWhatsupPanelOpen = useUIStore((s) => s.setWhatsupPanelOpen);
82
+ const filePanelOpen = useUIStore((s) => s.filePanelOpen);
83
+ const setFilePanelOpen = useUIStore((s) => s.setFilePanelOpen);
84
+ const securityPanelOpen = useUIStore((s) => s.securityPanelOpen);
85
+ const setSecurityPanelOpen = useUIStore((s) => s.setSecurityPanelOpen);
86
+ // Voice dictation state
87
+ const voiceMode = useVoiceStore((s) => s.mode);
88
+ const reviewText = useVoiceStore((s) => s.reviewText);
89
+ const clearReview = useVoiceStore((s) => s.clearReview);
90
+ const dictation = useDictation();
91
+ // Auto-scroll on new content when tailing is active
92
+ useEffect(() => {
93
+ const el = scrollRef.current;
94
+ if (el && autoScrollRef.current) {
95
+ el.scrollTop = el.scrollHeight;
96
+ }
97
+ }, [messages]);
98
+ // Scroll listener: disable tailing when user scrolls up, re-enable at bottom
99
+ const hasMessages = messages.length > 0;
100
+ useEffect(() => {
101
+ const el = scrollRef.current;
102
+ if (!el)
103
+ return;
104
+ const handleScroll = () => {
105
+ const atBottom = el.scrollHeight - el.scrollTop - el.clientHeight < 20;
106
+ autoScrollRef.current = atBottom;
107
+ setShowScrollButton(!atBottom);
108
+ };
109
+ el.addEventListener("scroll", handleScroll, { passive: true });
110
+ return () => el.removeEventListener("scroll", handleScroll);
111
+ }, [hasMessages]);
112
+ // Auto-grow textarea
113
+ useEffect(() => {
114
+ const el = textareaRef.current;
115
+ if (el) {
116
+ el.style.height = "auto";
117
+ el.style.height = Math.min(el.scrollHeight, 200) + "px";
118
+ }
119
+ }, [input]);
120
+ // Show/hide command palette based on input
121
+ useEffect(() => {
122
+ if (input.startsWith("/")) {
123
+ setShowCommandPalette(true);
124
+ }
125
+ else {
126
+ setShowCommandPalette(false);
127
+ }
128
+ }, [input]);
129
+ // Load the available provider combos once on mount.
130
+ useEffect(() => {
131
+ void loadProviders();
132
+ }, [loadProviders]);
133
+ // Dismiss the provider popover on outside-click / Escape.
134
+ useEffect(() => {
135
+ if (!providerMenuOpen)
136
+ return;
137
+ const onDocClick = (e) => {
138
+ if (!providerMenuRef.current?.contains(e.target)) {
139
+ setProviderMenuOpen(false);
140
+ }
141
+ };
142
+ const onKey = (e) => {
143
+ if (e.key === "Escape")
144
+ setProviderMenuOpen(false);
145
+ };
146
+ document.addEventListener("mousedown", onDocClick);
147
+ document.addEventListener("keydown", onKey);
148
+ return () => {
149
+ document.removeEventListener("mousedown", onDocClick);
150
+ document.removeEventListener("keydown", onKey);
151
+ };
152
+ }, [providerMenuOpen]);
153
+ /**
154
+ * The draft is whatever is visible above the send button: composer text
155
+ * plus any voice text under review. Both send paths submit the combined
156
+ * draft so nothing is silently dropped.
157
+ */
158
+ function draftText() {
159
+ return [input.trim(), reviewText.trim()].filter(Boolean).join("\n");
160
+ }
161
+ /**
162
+ * Decode, downscale and validate incoming image files, merging them with any
163
+ * already-pending attachments. Rejected files (bad type / oversize / over the
164
+ * per-message caps) surface as inline error lines; their object URLs are
165
+ * revoked so nothing leaks.
166
+ */
167
+ async function addFiles(files) {
168
+ const list = Array.from(files).filter((f) => f.type.startsWith("image/"));
169
+ if (list.length === 0)
170
+ return;
171
+ const results = await Promise.all(list.map((f) => fileToAttachment(f)));
172
+ const fresh = [];
173
+ const errors = [];
174
+ results.forEach((r, i) => {
175
+ if ("error" in r) {
176
+ errors.push(r.error);
177
+ }
178
+ else {
179
+ fresh.push({ ...r, name: list[i].name });
180
+ }
181
+ });
182
+ const { accepted } = validateAttachments([
183
+ ...attachmentsRef.current,
184
+ ...fresh,
185
+ ]);
186
+ // Revoke URLs of freshly-decoded images that didn't make the cut.
187
+ for (const f of fresh) {
188
+ if (!accepted.includes(f)) {
189
+ URL.revokeObjectURL(f.previewUrl);
190
+ errors.push(`${f.name}: not added (message limit reached)`);
191
+ }
192
+ }
193
+ attachmentsRef.current = accepted;
194
+ setAttachments(accepted);
195
+ setAttachErrors(errors);
196
+ }
197
+ function removeAttachment(index) {
198
+ const next = attachmentsRef.current.filter((item, i) => {
199
+ if (i === index)
200
+ URL.revokeObjectURL(item.previewUrl);
201
+ return i !== index;
202
+ });
203
+ attachmentsRef.current = next;
204
+ setAttachments(next);
205
+ }
206
+ async function onFilePick(e) {
207
+ const files = e.target.files;
208
+ if (files && files.length > 0)
209
+ await addFiles(files);
210
+ // Reset so picking the same file again still fires onChange.
211
+ e.target.value = "";
212
+ }
213
+ function handleSubmit() {
214
+ const text = draftText();
215
+ const hasAttachments = attachments.length > 0;
216
+ if ((!text && !hasAttachments) || wsStatus !== "connected")
217
+ return;
218
+ if (text)
219
+ setLastPrompt(text);
220
+ const messageAttachments = attachments.map((a) => ({
221
+ previewUrl: a.previewUrl,
222
+ mediaType: a.attachment.mediaType,
223
+ }));
224
+ addUserMessage(text, reviewText.trim() ? "voice-dictate" : "typed", messageAttachments.length > 0 ? messageAttachments : undefined);
225
+ // A send while the session is already streaming is a follow-up — the server
226
+ // queues it or delivers it live; don't pre-start a second assistant bubble
227
+ // (the backend's next frames start it).
228
+ if (!isStreaming)
229
+ startAssistantMessage();
230
+ send({
231
+ type: "chat_message",
232
+ text,
233
+ sessionId: sessionId ?? undefined,
234
+ // Provider only applies to new conversations; resumed sessions are
235
+ // pinned server-side to their original combo.
236
+ // Only send a provider the server actually offers — a stale persisted
237
+ // id (e.g. key removed server-side) falls back to the server default
238
+ // instead of erroring with PROVIDER_UNAVAILABLE.
239
+ providerId: sessionId || !providers.some((p) => p.id === selectedProviderId)
240
+ ? undefined
241
+ : selectedProviderId,
242
+ attachments: hasAttachments
243
+ ? attachments.map((a) => a.attachment)
244
+ : undefined,
245
+ });
246
+ setInput("");
247
+ clearReview();
248
+ // Ownership of the preview URLs transfers to the rendered user message
249
+ // (revoked later by the chat store on clear/resume) — don't revoke here.
250
+ attachmentsRef.current = [];
251
+ setAttachments([]);
252
+ setAttachErrors([]);
253
+ }
254
+ function handleMicTap() {
255
+ if (voiceMode === "dictate") {
256
+ void dictation.stop(true);
257
+ }
258
+ else {
259
+ // Defensive: blur composer so the keyboard never fights the mic sheet on Android
260
+ textareaRef.current?.blur();
261
+ // Any existing review text stays put — the new capture appends to it.
262
+ void dictation.start();
263
+ }
264
+ }
265
+ function handleVoiceSend() {
266
+ if (!draftText() || isStreaming || wsStatus !== "connected") {
267
+ // If we cannot send right now, fall back to editing
268
+ handleVoiceEdit();
269
+ return;
270
+ }
271
+ handleSubmit();
272
+ }
273
+ function handleVoiceEdit() {
274
+ setInput((prev) => (prev ? `${prev}\n${reviewText}` : reviewText));
275
+ clearReview();
276
+ setTimeout(() => textareaRef.current?.focus(), 50);
277
+ }
278
+ function handleVoiceAppend() {
279
+ // Review text stays in place; the next capture appends to it on stop.
280
+ void dictation.start();
281
+ }
282
+ function handleRecall() {
283
+ if (lastPrompt && !input.trim()) {
284
+ setInput(lastPrompt);
285
+ setTimeout(() => textareaRef.current?.focus(), 50);
286
+ }
287
+ }
288
+ function handleCancel() {
289
+ // Scope the cancel to the session in view so it is unambiguous when several
290
+ // sessions are running.
291
+ send({ type: "cancel", sessionId: sessionId ?? undefined });
292
+ }
293
+ function handleToolApproval(toolUseId, approved) {
294
+ resolveToolApproval(toolUseId, approved);
295
+ if (approved) {
296
+ send({ type: "tool_approval", toolUseId });
297
+ }
298
+ else {
299
+ send({ type: "tool_denial", toolUseId, message: "Denied by user" });
300
+ }
301
+ }
302
+ function handleAskUserSubmit(requestId, answers, annotations) {
303
+ submitAskUserAnswers(requestId, answers, annotations);
304
+ send({ type: "ask_user_response", requestId, answers, annotations });
305
+ }
306
+ function handleAskUserCancel(requestId) {
307
+ cancelAskUser(requestId);
308
+ send({ type: "ask_user_cancel", requestId, reason: "User dismissed" });
309
+ }
310
+ function handleSessionResume(resumeSessionId) {
311
+ clearMessages();
312
+ setActiveSession(resumeSessionId);
313
+ send({ type: "session_resume", sessionId: resumeSessionId });
314
+ }
315
+ function handleCommand(command) {
316
+ setInput("");
317
+ setShowCommandPalette(false);
318
+ const disabled = wsStatus !== "connected" || isStreaming;
319
+ if (disabled)
320
+ return;
321
+ switch (command) {
322
+ case "sync":
323
+ setSyncPanelOpen(true);
324
+ break;
325
+ case "whatsup":
326
+ setWhatsupPanelOpen(true);
327
+ break;
328
+ case "search":
329
+ setInput("");
330
+ // Focus the input with a placeholder hint
331
+ setTimeout(() => textareaRef.current?.focus(), 50);
332
+ break;
333
+ case "add":
334
+ setInput("");
335
+ setTimeout(() => textareaRef.current?.focus(), 50);
336
+ break;
337
+ case "stats":
338
+ runStatsAction();
339
+ break;
340
+ }
341
+ }
342
+ async function runStatsAction() {
343
+ addUserMessage("Stats");
344
+ startAssistantMessage();
345
+ try {
346
+ const stats = await api.brainStats();
347
+ const result = [
348
+ `**Brain Statistics**`,
349
+ `- Documents: ${stats.documents}`,
350
+ `- Tags: ${stats.tags}`,
351
+ `- Links: ${stats.links}`,
352
+ ``,
353
+ `**By Type:** ${Object.entries(stats.byType)
354
+ .sort(([, a], [, b]) => b - a)
355
+ .map(([t, n]) => `${t} (${n})`)
356
+ .join(", ")}`,
357
+ ``,
358
+ `**By Status:** ${Object.entries(stats.byStatus)
359
+ .map(([s, n]) => `${s} (${n})`)
360
+ .join(", ")}`,
361
+ ].join("\n");
362
+ appendText(result);
363
+ }
364
+ catch (err) {
365
+ appendText(`**Error:** ${err instanceof Error ? err.message : "Action failed"}`);
366
+ }
367
+ finally {
368
+ finishAssistantMessage();
369
+ }
370
+ }
371
+ function scrollToBottom() {
372
+ const el = scrollRef.current;
373
+ if (el) {
374
+ el.scrollTop = el.scrollHeight;
375
+ autoScrollRef.current = true;
376
+ setShowScrollButton(false);
377
+ }
378
+ }
379
+ function handleWelcomeAction(action) {
380
+ handleCommand(action);
381
+ }
382
+ const hasDraft = Boolean(input.trim() || reviewText.trim() || attachments.length > 0);
383
+ // A send while a session is running is a follow-up (not blocked by streaming).
384
+ const canSend = hasDraft && wsStatus === "connected";
385
+ // Provider picker: locked to the pinned combo once a session is live.
386
+ // Lock while streaming too: the first send of a new conversation pins the
387
+ // provider server-side before session_info delivers the sessionId.
388
+ const providerLocked = sessionId != null || isStreaming;
389
+ const displayProviderId = providerLocked
390
+ ? pinnedProviderId ?? selectedProviderId
391
+ : selectedProviderId;
392
+ const displayProvider = providers.find((p) => p.id === displayProviderId);
393
+ const showProviderPicker = providers.length > 1;
394
+ // What happens if the user sends into the currently-running session.
395
+ const displayBackendId = displayProvider?.backendId;
396
+ const followUpLive = displayBackendId
397
+ ? backends[displayBackendId]?.capabilities.followUp ?? false
398
+ : false;
399
+ const followUpHint = isStreaming && sessionId
400
+ ? followUpLive
401
+ ? "Follows up live"
402
+ : "Will queue"
403
+ : null;
404
+ return (_jsxs("div", { className: "flex flex-1 flex-col overflow-hidden", children: [_jsx(SessionDrawer, { open: sessionPanelOpen, onClose: () => setSessionPanelOpen(false), onResume: handleSessionResume }), _jsx(PasskeyPanel, { open: securityPanelOpen, onClose: () => setSecurityPanelOpen(false) }), _jsx(StreamingPanel, { open: syncPanelOpen, onClose: () => setSyncPanelOpen(false), title: "Brain Sync", endpoint: getBackendUrl("/api/brain/sync") }), _jsx(WhatsupPanel, { open: whatsupPanelOpen, onClose: () => setWhatsupPanelOpen(false) }), _jsx(FilePanel, { open: filePanelOpen, onClose: () => setFilePanelOpen(false) }), _jsxs("div", { className: "relative flex-1 overflow-hidden", children: [messages.length === 0 ? (_jsx("div", { className: "h-full overflow-y-auto", children: _jsx(WelcomeState, { onAction: handleWelcomeAction }) })) : (_jsx("div", { ref: scrollRef, className: "h-full overflow-y-auto px-4 md:px-6", children: _jsx("div", { 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(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) => {
405
+ const files = e.clipboardData?.files;
406
+ if (files && files.length > 0) {
407
+ const images = Array.from(files).filter((f) => f.type.startsWith("image/"));
408
+ if (images.length > 0) {
409
+ e.preventDefault();
410
+ void addFiles(images);
411
+ }
412
+ }
413
+ }, onKeyDown: (e) => {
414
+ if (e.key === "Enter" && !e.shiftKey) {
415
+ if (showCommandPalette)
416
+ return;
417
+ // On desktop (>=768px), Enter sends. On mobile, Enter inserts newline.
418
+ if (window.matchMedia("(min-width: 768px)").matches) {
419
+ e.preventDefault();
420
+ handleSubmit();
421
+ }
422
+ }
423
+ if (e.key === "ArrowUp" && !input.trim()) {
424
+ handleRecall();
425
+ }
426
+ if (e.key === "Escape") {
427
+ setShowCommandPalette(false);
428
+ }
429
+ }, placeholder: wsStatus !== "connected"
430
+ ? "Connecting..."
431
+ : 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
432
+ ? "Provider is fixed for this conversation"
433
+ : "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
434
+ ? "cursor-default text-muted-foreground/60"
435
+ : "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: displayProvider?.label ?? "Default model" }), !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: () => {
436
+ setSelectedProvider(p.id);
437
+ setProviderMenuOpen(false);
438
+ }, 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
439
+ ? "opacity-100"
440
+ : "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" }) }))] })] })] })] }) })] }));
441
+ }
442
+ //# sourceMappingURL=chat-page.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-page.js","sourceRoot":"","sources":["../../../src/components/chat/chat-page.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare function CommandPalette({ filter, onSelect, }: {
2
+ filter: string;
3
+ onSelect: (command: string) => void;
4
+ }): import("react").JSX.Element | null;
5
+ //# sourceMappingURL=command-palette.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-palette.d.ts","sourceRoot":"","sources":["../../../src/components/chat/command-palette.tsx"],"names":[],"mappings":"AAyBA,wBAAgB,cAAc,CAAC,EAC7B,MAAM,EACN,QAAQ,GACT,EAAE;IACD,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACrC,sCAoCA"}
@@ -0,0 +1,18 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { RefreshCw, Search, Newspaper, Plus, BarChart3, } from "lucide-react";
3
+ import { motion } from "framer-motion";
4
+ const commands = [
5
+ { name: "sync", label: "/sync", description: "Sync brain repository", icon: RefreshCw },
6
+ { name: "search", label: "/search", description: "Search knowledge base", icon: Search },
7
+ { name: "whatsup", label: "/whatsup", description: "Daily briefing", icon: Newspaper },
8
+ { name: "add", label: "/add", description: "Add a note", icon: Plus },
9
+ { name: "stats", label: "/stats", description: "Brain statistics", icon: BarChart3 },
10
+ ];
11
+ export function CommandPalette({ filter, onSelect, }) {
12
+ const filtered = commands.filter((cmd) => cmd.name.startsWith(filter.toLowerCase()) ||
13
+ cmd.label.startsWith("/" + filter.toLowerCase()));
14
+ if (filtered.length === 0)
15
+ return null;
16
+ return (_jsx(motion.div, { initial: { opacity: 0, y: 4 }, animate: { opacity: 1, y: 0 }, exit: { opacity: 0, y: 4 }, transition: { duration: 0.15 }, className: "absolute bottom-full left-0 right-0 mb-2 overflow-hidden rounded-xl border border-border bg-surface-overlay shadow-2xl", children: filtered.map((cmd) => (_jsxs("button", { onClick: () => onSelect(cmd.name), className: "flex w-full items-center gap-3 px-4 py-2.5 text-left transition-colors hover:bg-surface-raised", children: [_jsx(cmd.icon, { className: "h-4 w-4 shrink-0 text-primary" }), _jsxs("div", { className: "min-w-0", children: [_jsx("div", { className: "font-[family-name:var(--font-mono)] text-[13px] font-medium text-foreground", children: cmd.label }), _jsx("div", { className: "text-[11px] text-muted-foreground", children: cmd.description })] })] }, cmd.name))) }));
17
+ }
18
+ //# sourceMappingURL=command-palette.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-palette.js","sourceRoot":"","sources":["../../../src/components/chat/command-palette.tsx"],"names":[],"mappings":";AAAA,OAAO,EACL,SAAS,EACT,MAAM,EACN,SAAS,EACT,IAAI,EACJ,SAAS,GACV,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AASvC,MAAM,QAAQ,GAAc;IAC1B,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,uBAAuB,EAAE,IAAI,EAAE,SAAS,EAAE;IACvF,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,uBAAuB,EAAE,IAAI,EAAE,MAAM,EAAE;IACxF,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,gBAAgB,EAAE,IAAI,EAAE,SAAS,EAAE;IACtF,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE;IACrE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,kBAAkB,EAAE,IAAI,EAAE,SAAS,EAAE;CACrF,CAAC;AAEF,MAAM,UAAU,cAAc,CAAC,EAC7B,MAAM,EACN,QAAQ,GAIT;IACC,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAC9B,CAAC,GAAG,EAAE,EAAE,CACN,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;QACzC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC,CACnD,CAAC;IAEF,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEvC,OAAO,CACL,KAAC,MAAM,CAAC,GAAG,IACT,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAC7B,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAC7B,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAC1B,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,EAC9B,SAAS,EAAC,wHAAwH,YAEjI,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CACrB,kBAEE,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EACjC,SAAS,EAAC,gGAAgG,aAE1G,KAAC,GAAG,CAAC,IAAI,IAAC,SAAS,EAAC,+BAA+B,GAAG,EACtD,eAAK,SAAS,EAAC,SAAS,aACtB,cAAK,SAAS,EAAC,6EAA6E,YACzF,GAAG,CAAC,KAAK,GACN,EACN,cAAK,SAAS,EAAC,mCAAmC,YAC/C,GAAG,CAAC,WAAW,GACZ,IACF,KAZD,GAAG,CAAC,IAAI,CAaN,CACV,CAAC,GACS,CACd,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare function MarkdownContent({ content }: {
2
+ content: string;
3
+ }): import("react").JSX.Element;
4
+ //# sourceMappingURL=markdown-content.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-content.d.ts","sourceRoot":"","sources":["../../../src/components/chat/markdown-content.tsx"],"names":[],"mappings":"AAEA,wBAAgB,eAAe,CAAC,EAAE,OAAO,EAAE,EAAE;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,+BAE/D"}
@@ -0,0 +1,6 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { BrainMarkdown } from "./brain-markdown.js";
3
+ export function MarkdownContent({ content }) {
4
+ return _jsx(BrainMarkdown, { content: content, fileLinks: true });
5
+ }
6
+ //# sourceMappingURL=markdown-content.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-content.js","sourceRoot":"","sources":["../../../src/components/chat/markdown-content.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,UAAU,eAAe,CAAC,EAAE,OAAO,EAAuB;IAC9D,OAAO,KAAC,aAAa,IAAC,OAAO,EAAE,OAAO,EAAE,SAAS,SAAG,CAAC;AACvD,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { ChatMessage } from "../../stores/chat-store.js";
2
+ import type { AskUserAnnotation } from "@schlessera/brain-ui-sdk/protocol";
3
+ export declare function MessageBubble({ message, onToolApproval, onAskUserSubmit, onAskUserCancel, }: {
4
+ message: ChatMessage;
5
+ onToolApproval: (toolUseId: string, approved: boolean) => void;
6
+ onAskUserSubmit: (requestId: string, answers: Record<string, string>, annotations?: Record<string, AskUserAnnotation>) => void;
7
+ onAskUserCancel: (requestId: string) => void;
8
+ }): import("react").JSX.Element;
9
+ //# sourceMappingURL=message-bubble.d.ts.map
@@ -0,0 +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;AAU3E,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"}