@parallelworks/ui 0.18.0 → 0.19.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (349) hide show
  1. package/README.md +86 -6
  2. package/dist/ai/adapter/memoryStore.d.ts +8 -0
  3. package/dist/ai/adapter/memoryStore.js +152 -0
  4. package/dist/ai/adapter/mock/index.d.ts +2 -0
  5. package/dist/ai/adapter/mock/index.js +3 -0
  6. package/dist/ai/adapter/mock/mockAdapter.d.ts +4 -0
  7. package/dist/ai/adapter/mock/mockAdapter.js +81 -0
  8. package/dist/ai/adapter/openai/createOpenAIStream.d.ts +9 -0
  9. package/dist/ai/adapter/openai/createOpenAIStream.js +33 -0
  10. package/dist/ai/adapter/openai/errors.d.ts +3 -0
  11. package/dist/ai/adapter/openai/errors.js +37 -0
  12. package/dist/ai/adapter/openai/index.d.ts +6 -0
  13. package/dist/ai/adapter/openai/index.js +6 -0
  14. package/dist/ai/adapter/openai/openaiAdapter.d.ts +9 -0
  15. package/dist/ai/adapter/openai/openaiAdapter.js +54 -0
  16. package/dist/ai/adapter/openai/responses.d.ts +4 -0
  17. package/dist/ai/adapter/openai/responses.js +108 -0
  18. package/dist/ai/adapter/openai/sse.d.ts +24 -0
  19. package/dist/ai/adapter/openai/sse.js +112 -0
  20. package/dist/ai/adapter/openai/wire.d.ts +40 -0
  21. package/dist/ai/adapter/types.d.ts +131 -0
  22. package/dist/ai/adapter/types.js +11 -0
  23. package/dist/ai/agent/classifier.d.ts +2 -0
  24. package/dist/ai/agent/classifier.js +12 -0
  25. package/dist/ai/agent/diff.d.ts +35 -0
  26. package/dist/ai/agent/diff.js +223 -0
  27. package/dist/ai/agent/diffHighlight.d.ts +6 -0
  28. package/dist/ai/agent/diffHighlight.js +101 -0
  29. package/dist/ai/agent/index.d.ts +6 -0
  30. package/dist/ai/agent/permissions.d.ts +11 -0
  31. package/dist/ai/agent/permissions.js +29 -0
  32. package/dist/ai/agent/toolfmt.d.ts +18 -0
  33. package/dist/ai/agent/toolfmt.js +383 -0
  34. package/dist/ai/agent/transcript.d.ts +38 -0
  35. package/dist/ai/agent/transcript.js +127 -0
  36. package/dist/ai/ai.css +325 -0
  37. package/dist/ai/components/AllocationSelector.d.ts +4 -0
  38. package/dist/ai/components/AllocationSelector.js +56 -0
  39. package/dist/ai/components/AttachmentManager.d.ts +1 -0
  40. package/dist/ai/components/AttachmentManager.js +144 -0
  41. package/dist/ai/components/AttachmentUpload.d.ts +24 -0
  42. package/dist/ai/components/AttachmentUpload.js +179 -0
  43. package/dist/ai/components/BlockedGroupBanner.d.ts +1 -0
  44. package/dist/ai/components/BlockedGroupBanner.js +29 -0
  45. package/dist/ai/components/BranchNavigator.d.ts +8 -0
  46. package/dist/ai/components/BranchNavigator.js +57 -0
  47. package/dist/ai/components/ChatEmptyState.d.ts +3 -0
  48. package/dist/ai/components/ChatEmptyState.js +171 -0
  49. package/dist/ai/components/ChatInput.d.ts +45 -0
  50. package/dist/ai/components/ChatInput.js +265 -0
  51. package/dist/ai/components/ChatLayout.d.ts +5 -0
  52. package/dist/ai/components/ChatLayout.js +15 -0
  53. package/dist/ai/components/ChatMessage.d.ts +24 -0
  54. package/dist/ai/components/ChatMessage.js +338 -0
  55. package/dist/ai/components/ChatMessageList.d.ts +35 -0
  56. package/dist/ai/components/ChatMessageList.js +301 -0
  57. package/dist/ai/components/ChatSidebar.d.ts +5 -0
  58. package/dist/ai/components/ChatSidebar.js +345 -0
  59. package/dist/ai/components/ChatThread.d.ts +3 -0
  60. package/dist/ai/components/ChatThread.js +198 -0
  61. package/dist/ai/components/ComposerChrome.d.ts +18 -0
  62. package/dist/ai/components/ComposerChrome.js +50 -0
  63. package/dist/ai/components/ComposerFrame.d.ts +16 -0
  64. package/dist/ai/components/ComposerFrame.js +33 -0
  65. package/dist/ai/components/DragOverlay.d.ts +5 -0
  66. package/dist/ai/components/DragOverlay.js +20 -0
  67. package/dist/ai/components/ModelSelector.d.ts +6 -0
  68. package/dist/ai/components/ModelSelector.js +343 -0
  69. package/dist/ai/components/ShareDialog.d.ts +11 -0
  70. package/dist/ai/components/ShareDialog.js +260 -0
  71. package/dist/ai/components/SlashMenu.d.ts +28 -0
  72. package/dist/ai/components/SlashMenu.js +91 -0
  73. package/dist/ai/components/agent/ActivityLine.d.ts +21 -0
  74. package/dist/ai/components/agent/ActivityLine.js +151 -0
  75. package/dist/ai/components/agent/AgentMessageParts.d.ts +54 -0
  76. package/dist/ai/components/agent/AgentMessageParts.js +721 -0
  77. package/dist/ai/components/agent/PermissionPicker.d.ts +11 -0
  78. package/dist/ai/components/agent/PermissionPicker.js +38 -0
  79. package/dist/ai/components/attachmentKeys.d.ts +4 -0
  80. package/dist/ai/components/attachmentKeys.js +10 -0
  81. package/dist/ai/core/ChatProvider.d.ts +66 -0
  82. package/dist/ai/core/ChatProvider.js +848 -0
  83. package/dist/ai/core/KeyboardShortcutsProvider.d.ts +5 -0
  84. package/dist/ai/core/KeyboardShortcutsProvider.js +9 -0
  85. package/dist/ai/core/chatReducer.d.ts +114 -0
  86. package/dist/ai/core/chatReducer.js +223 -0
  87. package/dist/ai/core/config.d.ts +47 -0
  88. package/dist/ai/core/config.js +45 -0
  89. package/dist/ai/core/events.d.ts +1 -0
  90. package/dist/ai/core/events.js +4 -0
  91. package/dist/ai/core/exportConversation.d.ts +4 -0
  92. package/dist/ai/core/exportConversation.js +42 -0
  93. package/dist/ai/core/greeting.d.ts +3 -0
  94. package/dist/ai/core/greeting.js +38 -0
  95. package/dist/ai/core/parts.d.ts +11 -0
  96. package/dist/ai/core/parts.js +84 -0
  97. package/dist/ai/core/useDragDrop.d.ts +14 -0
  98. package/dist/ai/core/useDragDrop.js +36 -0
  99. package/dist/ai/core/useKeyboardShortcuts.d.ts +12 -0
  100. package/dist/ai/core/useKeyboardShortcuts.js +77 -0
  101. package/dist/ai/core/useSSEStream.d.ts +34 -0
  102. package/dist/ai/core/useSSEStream.js +98 -0
  103. package/dist/ai/index.d.ts +40 -0
  104. package/dist/ai/index.js +44 -0
  105. package/dist/ai/strings.d.ts +167 -0
  106. package/dist/ai/strings.js +175 -0
  107. package/dist/ai/types.d.ts +236 -0
  108. package/dist/ai/ui/Avatar.d.ts +8 -0
  109. package/dist/ai/ui/Avatar.js +35 -0
  110. package/dist/ai/ui/Dropdown.d.ts +31 -0
  111. package/dist/ai/ui/Dropdown.js +110 -0
  112. package/dist/ai/ui/Markdown.d.ts +8 -0
  113. package/dist/ai/ui/Markdown.js +79 -0
  114. package/dist/ai/ui/Notice.d.ts +21 -0
  115. package/dist/ai/ui/Notice.js +77 -0
  116. package/dist/ai/ui/buttons.d.ts +1 -0
  117. package/dist/ai/ui/codeBreaks.d.ts +16 -0
  118. package/dist/ai/ui/codeBreaks.js +36 -0
  119. package/dist/ai/ui/prose.d.ts +1 -0
  120. package/dist/ai/ui/prose.js +13 -0
  121. package/dist/ai/ui/sidebar.d.ts +81 -0
  122. package/dist/ai/ui/sidebar.js +148 -0
  123. package/dist/ai/utils.d.ts +4 -0
  124. package/dist/ai/utils.js +23 -0
  125. package/dist/assets/{editor.worker-CuBRIwi-.js → editor.worker-BmHUIVG4.js} +194 -163
  126. package/dist/assets/{json.worker-8ytS02vz.js → json.worker-D8bJ92nw.js} +384 -338
  127. package/dist/assets/{yaml.worker-DJC-VUcv.js → yaml.worker-C4gyGAko.js} +15657 -13823
  128. package/dist/components/AddMenu.js +46 -0
  129. package/dist/components/Avatar.d.ts +1 -1
  130. package/dist/components/Avatar.js +46 -0
  131. package/dist/{chunks/BareModal-BtRiQezg.js → components/BareModal.js} +1 -1
  132. package/dist/components/Breadcrumbs.d.ts +1 -1
  133. package/dist/components/Breadcrumbs.js +83 -0
  134. package/dist/components/Button.js +83 -0
  135. package/dist/components/Callout.js +23 -0
  136. package/dist/components/Card.js +31 -0
  137. package/dist/components/CollapsiblePanel.js +77 -0
  138. package/dist/components/ConfirmModal.js +74 -0
  139. package/dist/components/CopyToClipboard.js +81 -0
  140. package/dist/{chunks/CreateModal-BY6DLmur.js → components/CreateModal.js} +10 -189
  141. package/dist/components/DescriptionList.js +42 -0
  142. package/dist/components/Dropdown.d.ts +1 -1
  143. package/dist/components/Dropdown.js +349 -0
  144. package/dist/components/EmptyState.d.ts +1 -1
  145. package/dist/components/EmptyState.js +27 -0
  146. package/dist/components/Filter.js +32 -0
  147. package/dist/components/FilterPill.js +13 -0
  148. package/dist/components/IconButton.js +34 -0
  149. package/dist/components/Indicator.d.ts +2 -2
  150. package/dist/{chunks/Indicator-hBSIxOPK.js → components/Indicator.js} +1 -1
  151. package/dist/components/Input.d.ts +1 -1
  152. package/dist/components/Input.js +88 -0
  153. package/dist/components/LetterBadge.d.ts +1 -1
  154. package/dist/components/LetterBadge.js +13 -0
  155. package/dist/components/Listbox.js +123 -0
  156. package/dist/{chunks/Loader-BXoXTZGc.js → components/Loader.js} +1 -1
  157. package/dist/components/Markdown.js +15 -0
  158. package/dist/components/MarkdownImpl.d.ts +1 -1
  159. package/dist/components/MultiSelect.js +171 -0
  160. package/dist/components/Overview.js +39 -0
  161. package/dist/components/PageHeader.js +194 -0
  162. package/dist/components/Pagination.js +35 -0
  163. package/dist/components/Provider.d.ts +16 -65
  164. package/dist/{chunks/Provider-Ghua9PkN.js → components/Provider.js} +54 -20
  165. package/dist/{chunks/RequiredMark-DfLdYbYZ.js → components/RequiredMark.js} +1 -1
  166. package/dist/components/SectionHeader.js +11 -0
  167. package/dist/components/SettingModeOption.js +30 -0
  168. package/dist/components/SettingRow.d.ts +1 -1
  169. package/dist/components/SettingRow.js +35 -0
  170. package/dist/components/SettingsCard.js +31 -0
  171. package/dist/components/SettingsGroup.d.ts +1 -1
  172. package/dist/components/SettingsGroup.js +17 -0
  173. package/dist/components/Sort.js +42 -0
  174. package/dist/components/StatusBadge.js +63 -0
  175. package/dist/components/SwitchToggle.js +59 -0
  176. package/dist/{chunks/SwitchToggleSmall-FcsaYSTs.js → components/SwitchToggleSmall.js} +1 -1
  177. package/dist/{chunks/Table-4OHjdKdO.js → components/Table.js} +7 -5
  178. package/dist/components/Toggle.js +20 -0
  179. package/dist/{chunks/Tooltip-Crxo_eU_.js → components/Tooltip.js} +6 -4
  180. package/dist/{chunks/StatusBadge-C1Blx_cW.js → components/dropdownUtils.js} +2 -63
  181. package/dist/components/focus.d.ts +2 -0
  182. package/dist/components/focus.js +7 -0
  183. package/dist/components/ghostButton.js +7 -0
  184. package/dist/components/inputClasses.js +4 -0
  185. package/dist/components/keys.d.ts +12 -0
  186. package/dist/components/keys.js +27 -0
  187. package/dist/components/relativeTime.js +32 -0
  188. package/dist/{chunks/useCssIsDark-DHr05dG2.js → components/useCssIsDark.js} +1 -1
  189. package/dist/duration.d.ts +3 -0
  190. package/dist/duration.js +17 -0
  191. package/dist/editor/Editor.js +13 -0
  192. package/dist/editor/EditorField.js +53 -0
  193. package/dist/editor/FormCodePanel.js +173 -0
  194. package/dist/editor/Monaco.d.ts +1 -20
  195. package/dist/editor/Monaco.js +112 -0
  196. package/dist/editor/index.d.ts +2 -1
  197. package/dist/editor/index.js +7 -2
  198. package/dist/editor/themes.js +91 -0
  199. package/dist/editor/workers.js +29 -0
  200. package/dist/editor/yaml.d.ts +5 -0
  201. package/dist/editor/yaml.js +15 -0
  202. package/dist/engine.d.ts +98 -0
  203. package/dist/file-explorer/FileExplorer.d.ts +11 -2
  204. package/dist/file-explorer/FileExplorer.js +1402 -0
  205. package/dist/file-explorer/FileExplorerContext.d.ts +1 -1
  206. package/dist/file-explorer/FileExplorerContext.js +370 -0
  207. package/dist/file-explorer/FilePreview/CodePreviewEditor.d.ts +1 -1
  208. package/dist/{chunks/CodePreviewEditor-4lx3kE-w.js → file-explorer/FilePreview/CodePreviewEditor.js} +3 -2
  209. package/dist/file-explorer/FilePreview/Inline.js +45 -0
  210. package/dist/file-explorer/FilePreview/StreamedBadge.js +16 -0
  211. package/dist/file-explorer/FilePreview/Viewer.js +526 -0
  212. package/dist/file-explorer/FilePreview/index.js +266 -0
  213. package/dist/file-explorer/FilePreview/parse.js +63 -0
  214. package/dist/file-explorer/FilePreview/previewCache.js +98 -0
  215. package/dist/file-explorer/FilePreview/previewType.d.ts +1 -1
  216. package/dist/file-explorer/FilePreview/previewType.js +151 -0
  217. package/dist/file-explorer/FilePreview/readCappedBytes.js +196 -0
  218. package/dist/file-explorer/FilePreview/useObjectBlobUrl.js +95 -0
  219. package/dist/file-explorer/FilePreview/useObjectText.js +109 -0
  220. package/dist/file-explorer/FilePreview/usePresignedUrl.js +73 -0
  221. package/dist/file-explorer/FileRow.d.ts +1 -1
  222. package/dist/file-explorer/FileRow.js +165 -0
  223. package/dist/file-explorer/FileRowsWindow.js +92 -0
  224. package/dist/file-explorer/FileTable.js +172 -0
  225. package/dist/file-explorer/FileTableHeaders.js +49 -0
  226. package/dist/file-explorer/LoadMoreRow.js +46 -0
  227. package/dist/file-explorer/TreeView.js +376 -0
  228. package/dist/file-explorer/helpers.d.ts +4 -4
  229. package/dist/file-explorer/helpers.js +537 -0
  230. package/dist/file-explorer/index.d.ts +3 -3
  231. package/dist/file-explorer/index.js +7 -5705
  232. package/dist/file-explorer/lib/batch.js +39 -0
  233. package/dist/file-explorer/lib/errors.js +9 -0
  234. package/dist/file-explorer/lib/paging.js +124 -0
  235. package/dist/file-explorer/lib/types.d.ts +6 -1
  236. package/dist/file-explorer/lib/utils.d.ts +1 -3
  237. package/dist/file-explorer/lib/utils.js +322 -0
  238. package/dist/file-explorer/toasts.js +400 -0
  239. package/dist/file-explorer/treeRows.js +73 -0
  240. package/dist/file-explorer/useNearEnd.d.ts +1 -1
  241. package/dist/file-explorer/useNearEnd.js +27 -0
  242. package/dist/form/FieldWrapper.d.ts +2 -2
  243. package/dist/form/FieldWrapper.js +54 -0
  244. package/dist/form/Fields/BooleanField.js +51 -0
  245. package/dist/form/Fields/CheckboxGroupField.js +72 -0
  246. package/dist/form/Fields/ColorField.js +33 -0
  247. package/dist/form/Fields/DropdownField.js +49 -0
  248. package/dist/form/Fields/DurationField.js +130 -0
  249. package/dist/form/Fields/LabelField.js +19 -0
  250. package/dist/form/Fields/MultiDropdownField.js +40 -0
  251. package/dist/form/Fields/NumberField.js +51 -0
  252. package/dist/form/Fields/ObjectField.js +54 -0
  253. package/dist/form/Fields/RadioField.js +49 -0
  254. package/dist/form/Fields/RangeField.js +58 -0
  255. package/dist/form/Fields/ResourceOptionIcon.d.ts +1 -1
  256. package/dist/form/Fields/ResourceOptionIcon.js +21 -0
  257. package/dist/form/Fields/StepField.js +6 -0
  258. package/dist/form/Fields/StringField.js +37 -0
  259. package/dist/form/Fields/TextAreaField.js +31 -0
  260. package/dist/form/Fields/durationValidity.js +11 -0
  261. package/dist/form/Form.d.ts +4 -21
  262. package/dist/form/Form.js +643 -0
  263. package/dist/form/SpecialTypes/DropdownWrapper.js +30 -0
  264. package/dist/form/SpecialTypes/FormikCustomDropdown.js +122 -0
  265. package/dist/form/SpecialTypes/FormikCustomInput.js +111 -0
  266. package/dist/form/SpecialTypes/FormikMultiSelectDropdown.js +31 -0
  267. package/dist/form/SpecialTypes/FormikNumericInput.js +60 -0
  268. package/dist/form/Wizard/WizardContainer.js +138 -0
  269. package/dist/form/Wizard/WizardNavigation.js +92 -0
  270. package/dist/form/Wizard/WizardStepContent.js +35 -0
  271. package/dist/form/Wizard/WizardStepIndicator.js +108 -0
  272. package/dist/form/Wizard/useWizardState.js +118 -0
  273. package/dist/form/Wizard/utils.js +34 -0
  274. package/dist/form/fieldContext.js +26 -0
  275. package/dist/form/fieldRegistry.js +50 -0
  276. package/dist/form/index.d.ts +11 -12
  277. package/dist/form/index.js +18 -2445
  278. package/dist/form/lib.d.ts +6 -1
  279. package/dist/{chunks/FieldWrapper-Bef01EWO.js → form/lib.js} +5 -104
  280. package/dist/form/types/fieldComponentTypes.d.ts +3 -2
  281. package/dist/form/types/fieldTypes.d.ts +6 -20
  282. package/dist/form/useParsedOpts.d.ts +1 -1
  283. package/dist/form/useParsedOpts.js +62 -0
  284. package/dist/form/usePrevious.js +11 -0
  285. package/dist/form/utils/checkShowIfObject.js +14 -0
  286. package/dist/form/utils/{slurmDuration.d.ts → duration.d.ts} +2 -2
  287. package/dist/form/utils/duration.js +69 -0
  288. package/dist/form/utils/getParentValue.js +23 -0
  289. package/dist/form/utils/getPlaceholder.js +9 -0
  290. package/dist/form/utils/getValueUsingPath.js +23 -0
  291. package/dist/form/utils/secondaryField.js +22 -0
  292. package/dist/graph/AnnotationBanner.js +141 -0
  293. package/dist/graph/Collapse.js +41 -0
  294. package/dist/{workflow/index.js → graph/DependencyGraph.js} +76 -1163
  295. package/dist/graph/JobSummary.js +104 -0
  296. package/dist/{workflow → graph}/MatrixGroup.d.ts +2 -2
  297. package/dist/graph/MatrixGroup.js +107 -0
  298. package/dist/graph/Reveal.js +57 -0
  299. package/dist/graph/TreeView.js +711 -0
  300. package/dist/{workflow → graph}/index.d.ts +1 -1
  301. package/dist/graph/index.js +2 -0
  302. package/dist/{workflow → graph}/types.d.ts +3 -3
  303. package/dist/graph/types.js +6 -0
  304. package/dist/icons.d.ts +20 -21
  305. package/dist/index.d.ts +38 -40
  306. package/dist/index.js +47 -599
  307. package/dist/list/ActionToolbar.js +184 -0
  308. package/dist/list/HoverCard.js +73 -0
  309. package/dist/list/ListPage.js +145 -0
  310. package/dist/list/ListPager.js +59 -0
  311. package/dist/list/ListTable.d.ts +1 -1
  312. package/dist/list/ListTable.js +163 -0
  313. package/dist/list/ListViewControls.d.ts +2 -2
  314. package/dist/list/ListViewControls.js +372 -0
  315. package/dist/list/RowContextMenu.js +350 -0
  316. package/dist/list/UserHoverCard.js +117 -0
  317. package/dist/list/index.d.ts +9 -9
  318. package/dist/list/index.js +11 -2
  319. package/dist/list/listSearch.js +137 -0
  320. package/dist/list/listView.js +210 -0
  321. package/dist/list/textEntry.js +10 -0
  322. package/dist/logviewer/LogViewer.d.ts +1 -1
  323. package/dist/logviewer/LogViewer.js +750 -0
  324. package/dist/logviewer/index.d.ts +1 -0
  325. package/dist/logviewer/index.js +3 -742
  326. package/dist/logviewer/segments.d.ts +9 -0
  327. package/dist/logviewer/segments.js +80 -0
  328. package/dist/styles/fonts.css +4 -4
  329. package/dist/styles/theme.css +6 -4
  330. package/dist/styles.css +1 -1
  331. package/dist/theme/index.js +2 -2
  332. package/package.json +38 -14
  333. package/LICENSE +0 -202
  334. package/dist/chunks/Monaco-C1POOdVv.js +0 -1046
  335. package/dist/chunks/PageHeader-l49p1nM9.js +0 -690
  336. package/dist/chunks/SwitchToggle-CHPP8uZQ.js +0 -755
  337. package/dist/chunks/editor-9_uVtUyy.js +0 -347
  338. package/dist/chunks/list-qrojZZNv.js +0 -1411
  339. package/dist/editor/usesGitlab.d.ts +0 -97
  340. package/dist/form/Fields/BucketReadOnlyField.d.ts +0 -7
  341. package/dist/form/types/workflow-schema.d.ts +0 -1145
  342. package/dist/form/utils/pwResolver.d.ts +0 -18
  343. package/dist/{chunks/MarkdownImpl-Bq4QhrtA.js → components/MarkdownImpl.js} +1 -1
  344. /package/dist/{workflow → graph}/AnnotationBanner.d.ts +0 -0
  345. /package/dist/{workflow → graph}/Collapse.d.ts +0 -0
  346. /package/dist/{workflow → graph}/DependencyGraph.d.ts +0 -0
  347. /package/dist/{workflow → graph}/JobSummary.d.ts +0 -0
  348. /package/dist/{workflow → graph}/Reveal.d.ts +0 -0
  349. /package/dist/{workflow → graph}/TreeView.d.ts +0 -0
@@ -0,0 +1,175 @@
1
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
2
+ //#region src/ai/strings.tsx
3
+ var defaultChatStrings = {
4
+ modal: {
5
+ cancel: "Cancel",
6
+ save: "Save",
7
+ loading: "Loading…"
8
+ },
9
+ shareConversation: {
10
+ title: "Share Conversation",
11
+ loadError: "Failed to load sharing settings",
12
+ saveSuccess: "Sharing settings saved",
13
+ orgAccess: "Organization Access",
14
+ orgCanView: "Anyone in the organization can view",
15
+ allowCollaboration: "Allow collaboration (edit messages)",
16
+ groupAccess: "Group Access",
17
+ noGroups: "No groups have access yet",
18
+ viewOnly: "View only",
19
+ canCollaborate: "Can collaborate",
20
+ remove: "Remove",
21
+ addGroups: "Add groups…",
22
+ info: /* @__PURE__ */ jsxs(Fragment, { children: [
23
+ /* @__PURE__ */ jsx("strong", { children: "View" }),
24
+ " permission allows reading the conversation.",
25
+ /* @__PURE__ */ jsx("br", {}),
26
+ /* @__PURE__ */ jsx("strong", { children: "Collaborate" }),
27
+ " permission allows adding messages."
28
+ ] }),
29
+ shareButton: "Share conversation"
30
+ },
31
+ blockedGroup: {
32
+ title: "Billing group \"{group}\" is over its allocation",
33
+ message: "It has reached its allocation limit. Messages to this provider are paused until your administrator increases the allocation."
34
+ },
35
+ queue: { remove: "Remove queued message" },
36
+ activity: {
37
+ tokens: (input, output) => `↑${input} ↓${output} tokens`,
38
+ stop: "Stop"
39
+ },
40
+ emptyState: {
41
+ greeting: null,
42
+ modernSubtitle: "Pick a starter below or type a question to your selected model.",
43
+ noProvidersTitle: "No AI providers configured",
44
+ noProvidersBody: "To start chatting, add an AI provider.",
45
+ addProvider: "Add a provider",
46
+ sessionUnreachableTitle: (session) => /* @__PURE__ */ jsxs(Fragment, { children: [
47
+ "Session “",
48
+ session,
49
+ "” is not reachable"
50
+ ] }),
51
+ sessionUnreachableBody: "The session may be offline or still starting up. You can select a different model to continue.",
52
+ retry: "Retry"
53
+ },
54
+ input: {
55
+ placeholder: "Ask anything",
56
+ placeholderLoading: "Loading models...",
57
+ placeholderNoProviders: "Add an AI provider to start chatting",
58
+ attachFiles: "Attach files",
59
+ stopGenerating: "Stop generating (Escape)",
60
+ sendMessage: "Send message (Enter)",
61
+ filesAttached: (count) => `${count} file${count > 1 ? "s" : ""} attached`
62
+ },
63
+ thinking: {
64
+ label: "Thinking",
65
+ ellipsis: "Thinking...",
66
+ thoughtFor: (duration) => `Thought for ${duration}`,
67
+ activity: "Activity"
68
+ },
69
+ thread: { viewOnly: "You have view only access" },
70
+ sidebar: {
71
+ groupToday: "Today",
72
+ groupYesterday: "Yesterday",
73
+ groupThisWeek: "This Week",
74
+ groupThisMonth: "This Month",
75
+ groupOlder: "Older",
76
+ untitled: "Untitled",
77
+ rename: "Rename",
78
+ share: "Share",
79
+ delete: "Delete",
80
+ sharedWithYou: "Shared with you",
81
+ moreOptions: "More options",
82
+ openSidebar: "Open sidebar",
83
+ closeSidebar: "Close sidebar",
84
+ newChat: "New chat",
85
+ attachments: "Attachments",
86
+ connectTools: "Connect Tools",
87
+ manageProviders: "Manage Providers",
88
+ noConversations: "No conversations yet",
89
+ deleteTitle: "Delete Conversation",
90
+ deleteBody: "Are you sure you want to delete this conversation? This action cannot be undone.",
91
+ deleteAction: "Delete",
92
+ renameTitle: "Rename Conversation",
93
+ renameAction: "Rename",
94
+ renameLabel: "Conversation title",
95
+ renamePlaceholder: "Enter a new title"
96
+ },
97
+ attachmentUpload: {
98
+ fileTooLarge: (maxSize) => `File too large. Maximum size is ${maxSize}`,
99
+ maxFilesAllowed: (max) => `Maximum ${max} files allowed`,
100
+ remove: "Remove",
101
+ dropFilesHere: "Drop files here",
102
+ addFiles: "Add files (drag or click)"
103
+ },
104
+ attachmentManager: {
105
+ title: "Attachments",
106
+ empty: "No attachments yet",
107
+ download: "Download",
108
+ delete: "Delete",
109
+ loadMore: "Load more",
110
+ loading: "Loading..."
111
+ },
112
+ branch: {
113
+ previous: "Previous branch",
114
+ next: "Next branch"
115
+ },
116
+ chrome: {
117
+ searchPlaceholder: "Search conversations",
118
+ searchLabel: "Search conversations (⌘/Ctrl+Shift+F)",
119
+ noMatches: "No conversations match your search",
120
+ download: "Download",
121
+ exportError: "Failed to export conversation",
122
+ jumpToLatest: "Jump to latest"
123
+ },
124
+ messageMeta: {
125
+ stopped: "Stopped",
126
+ showMore: "Show more",
127
+ showLess: "Show less",
128
+ tokens: (total) => `${total.toLocaleString()} tokens`,
129
+ tokensBreakdown: (prompt, completion) => `${prompt.toLocaleString()} in · ${completion.toLocaleString()} out`,
130
+ copy: "Copy message",
131
+ edit: "Edit message",
132
+ regenerate: "Regenerate response",
133
+ retry: "Retry",
134
+ editPlaceholder: "Edit your message...",
135
+ cancel: "Cancel",
136
+ send: "Send"
137
+ },
138
+ permissions: {
139
+ choose: "Choose what the agent may do",
140
+ readOnly: "Read only",
141
+ acceptEdits: "Accept edits",
142
+ bypassPermissions: "Bypass permissions",
143
+ plan: "Plan",
144
+ readOnlyHint: "The workspace can be read but not changed.",
145
+ acceptEditsHint: "File edits are applied without asking. The workspace can be changed without your review.",
146
+ bypassPermissionsHint: "Every action is taken without asking, including commands that change the system.",
147
+ planHint: "The workspace is left unchanged while a plan is drafted."
148
+ },
149
+ agentTranscript: {
150
+ showMore: "Show more",
151
+ showLess: "Show less",
152
+ running: "Running…",
153
+ done: "Done",
154
+ failed: "Failed",
155
+ interrupted: "Interrupted",
156
+ noOutput: "(no output)",
157
+ diffTruncated: "Diff truncated",
158
+ moreLines: "+{count} more lines",
159
+ allowOnce: "Yes, allow this command",
160
+ allowDirectory: "Yes, and allow this directory for the session",
161
+ deny: "No, deny this command",
162
+ denyWithFeedback: "No, and provide feedback to the agent",
163
+ feedbackPlaceholder: "Tell the agent what to do instead…",
164
+ send: "Send",
165
+ answered: "Answered",
166
+ writeOwnAnswer: "Write my own answer…",
167
+ subagent: "Task",
168
+ tasks: "Tasks",
169
+ planPending: "Plan awaiting approval in the terminal",
170
+ approvalPending: "Waiting for an answer in the terminal",
171
+ approvalOptions: "Offered choices"
172
+ }
173
+ };
174
+ //#endregion
175
+ export { defaultChatStrings };
@@ -0,0 +1,236 @@
1
+ export interface ChatUser {
2
+ id: string;
3
+ username: string;
4
+ name?: string;
5
+ avatarUrl?: string;
6
+ }
7
+ export interface AttachmentRef {
8
+ id: string;
9
+ filename: string;
10
+ contentType: string;
11
+ size: number;
12
+ uploadedAt: string;
13
+ conversationId?: string;
14
+ messageId?: string;
15
+ }
16
+ export interface FunctionCall {
17
+ name: string;
18
+ arguments: string;
19
+ }
20
+ export interface ToolCall {
21
+ function: FunctionCall;
22
+ id?: string;
23
+ index?: number;
24
+ type?: string;
25
+ }
26
+ export interface ToolCallDelta {
27
+ index?: number;
28
+ id?: string;
29
+ type?: string;
30
+ function?: {
31
+ name?: string;
32
+ arguments?: string;
33
+ };
34
+ }
35
+ export interface TokenUsage {
36
+ prompt_tokens?: number;
37
+ completion_tokens?: number;
38
+ total_tokens?: number;
39
+ }
40
+ export type ToolCallStatus = 'running' | 'ok' | 'error';
41
+ export interface TextPart {
42
+ kind: 'text';
43
+ text: string;
44
+ }
45
+ export interface ReasoningPart {
46
+ kind: 'reasoning';
47
+ text: string;
48
+ durationMs?: number;
49
+ }
50
+ export interface ToolCallPart {
51
+ kind: 'tool_call';
52
+ id: string;
53
+ name: string;
54
+ args: string;
55
+ status: ToolCallStatus;
56
+ result?: string;
57
+ startLine?: number;
58
+ }
59
+ export type SubagentStatus = 'running' | 'done' | 'failed';
60
+ export interface SubagentPart {
61
+ kind: 'subagent';
62
+ id: string;
63
+ status: SubagentStatus;
64
+ agentType?: string;
65
+ color?: string;
66
+ background?: boolean;
67
+ description?: string;
68
+ actions?: string[];
69
+ summary?: string;
70
+ report?: string;
71
+ }
72
+ export interface ApprovalOption {
73
+ label: string;
74
+ description?: string;
75
+ }
76
+ export type ApprovalAnswerValue = {
77
+ kind: 'confirm';
78
+ allowed: boolean;
79
+ allowDir?: boolean;
80
+ denyMessage?: string;
81
+ } | {
82
+ kind: 'ask';
83
+ text: string;
84
+ chat?: boolean;
85
+ };
86
+ export interface ApprovalPart {
87
+ kind: 'approval';
88
+ id: string;
89
+ approvalKind: 'confirm' | 'ask' | 'plan';
90
+ toolName?: string;
91
+ command?: string;
92
+ reason?: string;
93
+ agent?: string;
94
+ mode?: string;
95
+ question?: string;
96
+ header?: string;
97
+ multiSelect?: boolean;
98
+ options?: ApprovalOption[];
99
+ plan?: string;
100
+ canAllowDirectory?: boolean;
101
+ resolved?: boolean;
102
+ answer?: string;
103
+ }
104
+ export interface NoticePart {
105
+ kind: 'notice' | 'warning' | 'error';
106
+ text: string;
107
+ detail?: string;
108
+ }
109
+ export type TodoStatus = 'pending' | 'in_progress' | 'completed';
110
+ export interface TodoItem {
111
+ content: string;
112
+ status: TodoStatus;
113
+ activeForm?: string;
114
+ }
115
+ export interface TodoSnapshotPart {
116
+ kind: 'todo_snapshot';
117
+ todos: TodoItem[];
118
+ }
119
+ export type MessagePart = TextPart | ReasoningPart | ToolCallPart | SubagentPart | ApprovalPart | NoticePart | TodoSnapshotPart;
120
+ export type MessagePartKind = MessagePart['kind'];
121
+ export type PseudoUserKind = 'command-input' | 'shell-input' | 'compaction';
122
+ export interface ChatMessage {
123
+ id: string;
124
+ role: string;
125
+ content?: string | null | undefined;
126
+ parentId?: string | null | undefined;
127
+ model?: string | null | undefined;
128
+ providerId?: string | null | undefined;
129
+ reasoning?: string | undefined;
130
+ reasoningDuration?: number | undefined;
131
+ responsesOutput?: unknown[] | null | undefined;
132
+ stopped?: boolean | undefined;
133
+ timestamp?: string | undefined;
134
+ tokensUsed?: TokenUsage | undefined;
135
+ toolCallId?: string | undefined;
136
+ toolCalls?: ToolCall[] | null | undefined;
137
+ attachments?: AttachmentRef[] | null | undefined;
138
+ author?: ChatUser | undefined;
139
+ conversationId?: string | undefined;
140
+ error?: string | null | undefined;
141
+ parts?: MessagePart[] | null | undefined;
142
+ pseudo?: PseudoUserKind | null | undefined;
143
+ }
144
+ export interface Conversation {
145
+ id: string;
146
+ messages: ChatMessage[];
147
+ title?: string | null;
148
+ activeBranchId?: string | null;
149
+ branches?: string[] | null;
150
+ canCollaborate?: boolean;
151
+ createdAt?: string;
152
+ isOwner?: boolean;
153
+ updatedAt?: string | null;
154
+ }
155
+ export interface ConversationSummary {
156
+ id: string;
157
+ canCollaborate: boolean;
158
+ createdAt: string;
159
+ isOwner: boolean;
160
+ messageCount: number;
161
+ activeBranchId?: string;
162
+ preview?: string;
163
+ title?: string;
164
+ updatedAt?: string;
165
+ }
166
+ export interface ChatModel {
167
+ id: string;
168
+ object: string;
169
+ created: number;
170
+ owned_by: string;
171
+ tool_calling_mode: 'native' | 'emulated' | 'none';
172
+ name?: string;
173
+ provider?: string;
174
+ provider_name?: string;
175
+ provider_owner?: string;
176
+ provider_type?: string;
177
+ context_window?: number;
178
+ input_rate?: number;
179
+ output_rate?: number;
180
+ reasoning_efforts?: string[] | null;
181
+ supports_responses?: boolean;
182
+ supports_usage?: boolean;
183
+ usage_not_supported?: boolean;
184
+ }
185
+ export interface UnreachableSession {
186
+ name: string;
187
+ owner: string;
188
+ }
189
+ export type CspKind = 'openai' | 'anthropic' | 'google' | 'azure' | 'aws' | 'other';
190
+ export interface ProviderInfo {
191
+ id: string;
192
+ name: string;
193
+ displayName?: string;
194
+ user: string;
195
+ cspKind: CspKind;
196
+ platformLabel?: string;
197
+ status: string;
198
+ group?: string;
199
+ groupBlocked?: boolean;
200
+ }
201
+ export interface Allocation {
202
+ name: string;
203
+ total: number;
204
+ used?: number;
205
+ }
206
+ export interface ChatNavigation {
207
+ toConversation(id: string): void;
208
+ toNewChat(): void;
209
+ toAttachments(): void;
210
+ }
211
+ export interface ChatNotify {
212
+ success(message: string): void;
213
+ error(message: string): void;
214
+ info(message: string): void;
215
+ }
216
+ export type SharePermissionLevel = 'view' | 'collaborate';
217
+ export interface SharePermission {
218
+ id?: string;
219
+ team?: string | null;
220
+ teamName?: string | null;
221
+ permission: SharePermissionLevel;
222
+ entireOrganization: boolean;
223
+ }
224
+ export interface ShareGroup {
225
+ id: string;
226
+ name: string;
227
+ }
228
+ export type ChatLinkTarget = {
229
+ kind: 'conversation';
230
+ id: string;
231
+ } | {
232
+ kind: 'attachments';
233
+ } | {
234
+ kind: 'external';
235
+ href: string;
236
+ };
@@ -0,0 +1,8 @@
1
+ interface AvatarProps {
2
+ src?: string | undefined;
3
+ name?: string;
4
+ size?: 'sm' | 'md' | 'lg' | 'xl' | '2xl';
5
+ className?: string;
6
+ }
7
+ export declare function Avatar({ src, name, size, className }: AvatarProps): import("react").JSX.Element;
8
+ export {};
@@ -0,0 +1,35 @@
1
+ import cx from "classnames";
2
+ import { useMemo, useState } from "react";
3
+ import { jsx } from "react/jsx-runtime";
4
+ //#region src/ai/ui/Avatar.tsx
5
+ var sizeClasses = {
6
+ sm: "w-6 h-6 text-xs",
7
+ md: "w-8 h-8 text-sm",
8
+ lg: "w-10 h-10 text-base",
9
+ xl: "w-12 h-12 text-lg",
10
+ "2xl": "w-16 h-16 text-xl"
11
+ };
12
+ function Avatar({ src, name, size = "md", className }) {
13
+ const [erroredUrl, setErroredUrl] = useState(null);
14
+ const errored = erroredUrl !== null && erroredUrl === src;
15
+ const initials = useMemo(() => {
16
+ if (!name) return "?";
17
+ const parts = name.split(/[\s.]+/).filter(Boolean);
18
+ if (parts.length >= 2) return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();
19
+ return parts[0]?.[0]?.toUpperCase() || "?";
20
+ }, [name]);
21
+ return /* @__PURE__ */ jsx("div", {
22
+ className: cx("relative inline-flex", className),
23
+ children: !src || errored ? /* @__PURE__ */ jsx("div", {
24
+ className: cx("rounded-full flex items-center justify-center font-medium", "bg-(--theme-element,#3b82f6) text-(--theme-element-text,#ffffff)", sizeClasses[size]),
25
+ children: initials
26
+ }) : /* @__PURE__ */ jsx("img", {
27
+ src,
28
+ alt: name || "User avatar",
29
+ onError: () => setErroredUrl(src),
30
+ className: cx("rounded-full object-cover", sizeClasses[size])
31
+ })
32
+ });
33
+ }
34
+ //#endregion
35
+ export { Avatar };
@@ -0,0 +1,31 @@
1
+ import { type ReactNode } from 'react';
2
+ export interface DropdownOption {
3
+ label: string;
4
+ value: string;
5
+ /** A second line under the label, for choices that need explaining. */
6
+ description?: string;
7
+ /** Rendered as a plain option; the trailing checkmark and bold never apply. */
8
+ muted?: boolean;
9
+ }
10
+ interface DropdownProps {
11
+ options: DropdownOption[];
12
+ value: string;
13
+ onChange: (value: string) => void;
14
+ placeholder?: string;
15
+ disabled?: boolean;
16
+ /** 'bare' drops the input background and text colour, for a trigger that
17
+ * reads as a chip or as toolbar text. */
18
+ variant?: 'default' | 'bare';
19
+ /** Leading content in the trigger, before the label. */
20
+ icon?: ReactNode;
21
+ /** Shown in the trigger instead of the selected option's label. */
22
+ valueLabel?: string;
23
+ ariaLabel?: string;
24
+ /** Tooltip on the closed trigger. */
25
+ hint?: string;
26
+ wrapperClassName?: string;
27
+ textBoxClassName?: string;
28
+ listClassName?: string;
29
+ }
30
+ export default function Dropdown({ options, value, onChange, placeholder, disabled, variant, icon, valueLabel, ariaLabel, hint, wrapperClassName, textBoxClassName, listClassName, }: DropdownProps): import("react").JSX.Element;
31
+ export {};
@@ -0,0 +1,110 @@
1
+ import { ChevronDownIcon } from "../../icons.js";
2
+ import { TOOLTIP_ID } from "../../components/Tooltip.js";
3
+ import cx from "classnames";
4
+ import { useCallback, useEffect, useRef, useState } from "react";
5
+ import { jsx, jsxs } from "react/jsx-runtime";
6
+ import { createPortal } from "react-dom";
7
+ //#region src/ai/ui/Dropdown.tsx
8
+ /** Matches the list's max-h-60, so the flip decision matches what renders. */
9
+ var MAX_LIST_HEIGHT_PX = 240;
10
+ function Dropdown({ options, value, onChange, placeholder = "", disabled = false, variant = "default", icon, valueLabel, ariaLabel, hint, wrapperClassName, textBoxClassName, listClassName }) {
11
+ const [open, setOpen] = useState(false);
12
+ const wrapperRef = useRef(null);
13
+ const listRef = useRef(null);
14
+ const [position, setPosition] = useState({
15
+ top: 0,
16
+ bottom: 0,
17
+ left: 0,
18
+ width: 0,
19
+ flipped: false
20
+ });
21
+ const updatePosition = useCallback(() => {
22
+ const rect = wrapperRef.current?.getBoundingClientRect();
23
+ if (!rect) return;
24
+ const below = window.innerHeight - rect.bottom;
25
+ const flipped = below < MAX_LIST_HEIGHT_PX && rect.top > below;
26
+ setPosition({
27
+ top: rect.bottom + 4,
28
+ bottom: window.innerHeight - rect.top + 4,
29
+ left: rect.left,
30
+ width: rect.width,
31
+ flipped
32
+ });
33
+ }, []);
34
+ useEffect(() => {
35
+ if (!open) return;
36
+ updatePosition();
37
+ const onPointerDown = (e) => {
38
+ const target = e.target;
39
+ if (!wrapperRef.current?.contains(target) && !listRef.current?.contains(target)) setOpen(false);
40
+ };
41
+ const onKey = (e) => {
42
+ if (e.key === "Escape") setOpen(false);
43
+ };
44
+ window.addEventListener("mousedown", onPointerDown);
45
+ window.addEventListener("keydown", onKey);
46
+ window.addEventListener("scroll", updatePosition, true);
47
+ window.addEventListener("resize", updatePosition);
48
+ return () => {
49
+ window.removeEventListener("mousedown", onPointerDown);
50
+ window.removeEventListener("keydown", onKey);
51
+ window.removeEventListener("scroll", updatePosition, true);
52
+ window.removeEventListener("resize", updatePosition);
53
+ };
54
+ }, [open, updatePosition]);
55
+ const selected = options.find((o) => o.value === value);
56
+ const shown = valueLabel ?? selected?.label;
57
+ const tooltip = hint && !open ? {
58
+ "data-tooltip-id": TOOLTIP_ID,
59
+ "data-tooltip-content": hint
60
+ } : {};
61
+ return /* @__PURE__ */ jsxs("div", {
62
+ ref: wrapperRef,
63
+ className: cx("relative", wrapperClassName),
64
+ children: [/* @__PURE__ */ jsxs("button", {
65
+ type: "button",
66
+ disabled,
67
+ onClick: () => setOpen((o) => !o),
68
+ "aria-haspopup": "listbox",
69
+ "aria-expanded": open,
70
+ "aria-label": ariaLabel,
71
+ ...tooltip,
72
+ className: cx("flex items-center justify-between gap-2 cursor-pointer", variant === "default" && "bg-(--theme-input-bg,#f9fafb) text-(--theme-input,#000000)", "disabled:opacity-50 disabled:cursor-not-allowed", textBoxClassName || "text-sm border border-(--theme-border,#d1d5db) rounded px-2 py-1.5 w-full"),
73
+ children: [
74
+ icon,
75
+ /* @__PURE__ */ jsx("span", {
76
+ className: cx("truncate", !shown && "text-(--theme-muted-text-color,#6c757d)"),
77
+ children: shown || placeholder
78
+ }),
79
+ /* @__PURE__ */ jsx(ChevronDownIcon, { className: "h-3 w-3 shrink-0 opacity-60" })
80
+ ]
81
+ }), open && createPortal(/* @__PURE__ */ jsx("ul", {
82
+ ref: listRef,
83
+ style: {
84
+ position: "fixed",
85
+ ...position.flipped ? { bottom: position.bottom } : { top: position.top },
86
+ left: position.left,
87
+ minWidth: position.width,
88
+ zIndex: 300
89
+ },
90
+ className: cx("max-h-60 overflow-auto rounded-md border border-(--theme-border,#e5e7eb) bg-(--theme-panel-bg,#ffffff) py-1 shadow-lg", listClassName),
91
+ children: options.map((option) => /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsxs("button", {
92
+ type: "button",
93
+ onClick: () => {
94
+ onChange(option.value);
95
+ setOpen(false);
96
+ },
97
+ className: cx("w-full cursor-pointer px-3 py-1.5 text-left text-sm hover:bg-(--theme-hover,#f3f4f6)", option.muted ? "text-(--theme-muted-text-color,#6c757d)" : "text-(--theme-panel,#000000)", option.value === value && !option.muted && "font-semibold"),
98
+ children: [/* @__PURE__ */ jsx("span", {
99
+ className: "block truncate",
100
+ children: option.label
101
+ }), option.description && /* @__PURE__ */ jsx("span", {
102
+ className: "mt-0.5 block text-xs font-normal leading-snug text-(--theme-muted-text-color,#6c757d)",
103
+ children: option.description
104
+ })]
105
+ }) }, option.value))
106
+ }), document.body)]
107
+ });
108
+ }
109
+ //#endregion
110
+ export { Dropdown as default };
@@ -0,0 +1,8 @@
1
+ import { type ControlsConfig } from 'streamdown';
2
+ interface MarkdownProps {
3
+ children: string;
4
+ isStreaming?: boolean;
5
+ controls?: ControlsConfig;
6
+ }
7
+ export default function Markdown({ children, isStreaming, controls }: MarkdownProps): import("react").JSX.Element;
8
+ export {};
@@ -0,0 +1,79 @@
1
+ import { useChatConfig } from "../core/config.js";
2
+ import { rehypeCodeBreaks } from "./codeBreaks.js";
3
+ import cx from "classnames";
4
+ import { useEffect, useState } from "react";
5
+ import { jsx } from "react/jsx-runtime";
6
+ import { code } from "@streamdown/code";
7
+ import { math } from "@streamdown/math";
8
+ import { Streamdown, defaultRehypePlugins } from "streamdown";
9
+ //#region src/ai/ui/Markdown.tsx
10
+ function schemeIsDark() {
11
+ if (typeof document === "undefined") return false;
12
+ const scheme = getComputedStyle(document.documentElement).colorScheme;
13
+ if (scheme.includes("dark") !== scheme.includes("light")) return scheme.includes("dark");
14
+ return typeof window.matchMedia === "function" && window.matchMedia("(prefers-color-scheme: dark)").matches;
15
+ }
16
+ var basePlugins = {
17
+ code,
18
+ math
19
+ };
20
+ var pluginsWithMermaid;
21
+ var mermaidLoad;
22
+ function loadMermaid() {
23
+ mermaidLoad ??= import("@streamdown/mermaid").then(({ createMermaidPlugin }) => {
24
+ const base = createMermaidPlugin();
25
+ pluginsWithMermaid = {
26
+ ...basePlugins,
27
+ mermaid: {
28
+ ...base,
29
+ getMermaid: (config) => base.getMermaid({
30
+ theme: schemeIsDark() ? "dark" : "neutral",
31
+ ...config
32
+ })
33
+ }
34
+ };
35
+ });
36
+ return mermaidLoad;
37
+ }
38
+ var shikiTheme = ["github-light", "github-dark"];
39
+ var rehypePlugins = [...Object.values(defaultRehypePlugins), rehypeCodeBreaks];
40
+ function Markdown({ children, isStreaming, controls }) {
41
+ const { markdownComponents } = useChatConfig();
42
+ const needsMermaid = !!children && children.includes("```mermaid");
43
+ const [, setMermaidReady] = useState(() => !!pluginsWithMermaid);
44
+ useEffect(() => {
45
+ if (!needsMermaid || pluginsWithMermaid) return;
46
+ let live = true;
47
+ loadMermaid().then(() => {
48
+ if (live) setMermaidReady(true);
49
+ });
50
+ return () => {
51
+ live = false;
52
+ };
53
+ }, [needsMermaid]);
54
+ const plugins = needsMermaid && pluginsWithMermaid ? pluginsWithMermaid : basePlugins;
55
+ return /* @__PURE__ */ jsx("div", {
56
+ className: "markdown whitespace-normal text-start w-full",
57
+ children: /* @__PURE__ */ jsx(Streamdown, {
58
+ mode: isStreaming ? "streaming" : "static",
59
+ ...isStreaming === void 0 ? {} : { isAnimating: isStreaming },
60
+ ...isStreaming ? { caret: "block" } : {},
61
+ ...controls === void 0 ? {} : { controls },
62
+ plugins,
63
+ rehypePlugins,
64
+ shikiTheme,
65
+ components: {
66
+ a: ({ node, ...props }) => /* @__PURE__ */ jsx("a", {
67
+ ...props,
68
+ className: cx("link wrap-break-word", props.className),
69
+ target: "_blank",
70
+ rel: "noopener noreferrer"
71
+ }),
72
+ ...markdownComponents
73
+ },
74
+ children: children || ""
75
+ })
76
+ });
77
+ }
78
+ //#endregion
79
+ export { Markdown as default };