@parallelworks/ui 0.77.0 → 0.79.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 (268) hide show
  1. package/README.md +42 -6
  2. package/dist/access/AccessDrawer.d.ts +49 -7
  3. package/dist/access/AccessDrawer.js +243 -38
  4. package/dist/access/AccessList.d.ts +19 -1
  5. package/dist/access/AccessList.js +220 -9
  6. package/dist/access/GrantView.d.ts +3 -1
  7. package/dist/access/GrantView.js +17 -4
  8. package/dist/access/PrincipalPicker.js +5 -5
  9. package/dist/access/focus.js +1 -1
  10. package/dist/access/index.d.ts +2 -2
  11. package/dist/access/index.js +2 -2
  12. package/dist/access/strings.d.ts +25 -1
  13. package/dist/access/strings.js +27 -3
  14. package/dist/access/types.d.ts +26 -0
  15. package/dist/ai/components/AllocationSelector.js +1 -1
  16. package/dist/ai/components/AttachmentManager.js +5 -5
  17. package/dist/ai/components/AttachmentUpload.js +2 -2
  18. package/dist/ai/components/BranchNavigator.js +1 -1
  19. package/dist/ai/components/ChatActivity.js +1 -1
  20. package/dist/ai/components/ChatEmptyState.js +3 -3
  21. package/dist/ai/components/ChatInput.js +3 -5
  22. package/dist/ai/components/ChatLayout.js +1 -1
  23. package/dist/ai/components/ChatMessage.js +1 -1
  24. package/dist/ai/components/ChatMessageList.js +23 -8
  25. package/dist/ai/components/ChatSidebar.js +3 -3
  26. package/dist/ai/components/ChatThread.js +4 -4
  27. package/dist/ai/components/ComposerAddMenu.js +9 -20
  28. package/dist/ai/components/ModelSelector.js +3 -3
  29. package/dist/ai/components/PastedText.js +5 -5
  30. package/dist/ai/components/SessionView.js +1 -1
  31. package/dist/ai/components/ShareDialog.js +3 -3
  32. package/dist/ai/components/SlashMenu.d.ts +31 -4
  33. package/dist/ai/components/SlashMenu.js +36 -63
  34. package/dist/ai/components/agent/ActivityLine.js +1 -1
  35. package/dist/ai/components/agent/AgentMessageParts.js +13 -13
  36. package/dist/ai/components/conversationActions.js +3 -3
  37. package/dist/ai/core/ChatProvider.js +1 -1
  38. package/dist/ai/core/config.js +1 -1
  39. package/dist/ai/ui/ConversationSidebar.js +3 -3
  40. package/dist/ai/ui/sidebar.js +3 -3
  41. package/dist/assets/yaml.worker-DOBV2lND.js +884 -0
  42. package/dist/components/ActionMenu.d.ts +38 -9
  43. package/dist/components/ActionMenu.js +48 -22
  44. package/dist/components/Avatar.d.ts +66 -6
  45. package/dist/components/Avatar.js +130 -18
  46. package/dist/components/Breadcrumbs.d.ts +4 -0
  47. package/dist/components/Breadcrumbs.js +26 -10
  48. package/dist/components/Button.d.ts +3 -2
  49. package/dist/components/Button.js +11 -1
  50. package/dist/components/Callout.d.ts +3 -2
  51. package/dist/components/Callout.js +3 -2
  52. package/dist/components/Card.d.ts +33 -9
  53. package/dist/components/Card.js +24 -8
  54. package/dist/components/Checkbox.d.ts +3 -1
  55. package/dist/components/Checkbox.js +4 -2
  56. package/dist/components/ColorInput.js +1 -1
  57. package/dist/components/Combobox.d.ts +23 -0
  58. package/dist/components/Combobox.js +252 -86
  59. package/dist/components/ConfirmModal.d.ts +28 -2
  60. package/dist/components/ConfirmModal.js +100 -15
  61. package/dist/components/ContextMenu.d.ts +29 -2
  62. package/dist/components/ContextMenu.js +60 -8
  63. package/dist/components/CopyButton.d.ts +21 -8
  64. package/dist/components/CopyButton.js +29 -9
  65. package/dist/components/CreateModal.d.ts +20 -4
  66. package/dist/components/CreateModal.js +28 -17
  67. package/dist/components/DatePicker.d.ts +31 -1
  68. package/dist/components/DatePicker.js +178 -47
  69. package/dist/components/DescriptionList.d.ts +13 -3
  70. package/dist/components/DescriptionList.js +43 -11
  71. package/dist/components/Disclosure.d.ts +10 -2
  72. package/dist/components/Disclosure.js +18 -7
  73. package/dist/components/Drawer.js +5 -5
  74. package/dist/components/EmptyState.d.ts +12 -4
  75. package/dist/components/EmptyState.js +18 -10
  76. package/dist/components/ErrorPage.d.ts +40 -0
  77. package/dist/components/ErrorPage.js +101 -0
  78. package/dist/components/ExternalLink.d.ts +4 -1
  79. package/dist/components/ExternalLink.js +4 -5
  80. package/dist/components/Field.d.ts +21 -6
  81. package/dist/components/Field.js +32 -16
  82. package/dist/components/FileButton.d.ts +19 -0
  83. package/dist/components/FileButton.js +32 -0
  84. package/dist/components/HoverCard.d.ts +26 -6
  85. package/dist/components/HoverCard.js +11 -5
  86. package/dist/components/IconButton.js +4 -2
  87. package/dist/components/InfoTip.js +3 -3
  88. package/dist/components/Input.d.ts +33 -3
  89. package/dist/components/Input.js +149 -14
  90. package/dist/components/Kbd.d.ts +40 -0
  91. package/dist/components/Kbd.js +168 -0
  92. package/dist/components/Listbox.d.ts +103 -0
  93. package/dist/components/Listbox.js +190 -0
  94. package/dist/components/Loader.d.ts +8 -2
  95. package/dist/components/Loader.js +16 -1
  96. package/dist/components/Markdown.js +1 -1
  97. package/dist/components/MarkdownImpl.js +1 -1
  98. package/dist/components/Menu.d.ts +20 -2
  99. package/dist/components/Menu.js +48 -19
  100. package/dist/components/MenuEntries.d.ts +41 -4
  101. package/dist/components/MenuEntries.js +266 -39
  102. package/dist/components/Meter.d.ts +50 -11
  103. package/dist/components/Meter.js +71 -21
  104. package/dist/components/Modal.d.ts +9 -3
  105. package/dist/components/Modal.js +68 -29
  106. package/dist/components/OneTimeCodeInput.js +1 -1
  107. package/dist/components/PageHeader.js +111 -7
  108. package/dist/components/PageHeaderAction.d.ts +8 -3
  109. package/dist/components/PageHeaderAction.js +122 -34
  110. package/dist/components/Pagination.d.ts +13 -1
  111. package/dist/components/Pagination.js +90 -19
  112. package/dist/components/Popover.d.ts +16 -2
  113. package/dist/components/Popover.js +20 -21
  114. package/dist/components/Provider.d.ts +172 -5
  115. package/dist/components/Provider.js +157 -14
  116. package/dist/components/RefreshButton.d.ts +13 -6
  117. package/dist/components/RefreshButton.js +17 -9
  118. package/dist/components/RunStatusIcon.d.ts +16 -7
  119. package/dist/components/RunStatusIcon.js +21 -8
  120. package/dist/components/Section.d.ts +11 -4
  121. package/dist/components/Section.js +33 -22
  122. package/dist/components/SegmentedControl.d.ts +16 -3
  123. package/dist/components/SegmentedControl.js +7 -3
  124. package/dist/components/Select.d.ts +19 -3
  125. package/dist/components/Select.js +114 -68
  126. package/dist/components/SelectionCopy.d.ts +10 -0
  127. package/dist/components/SelectionCopy.js +105 -0
  128. package/dist/components/SettingModeOption.js +1 -1
  129. package/dist/components/SettingsCard.js +1 -1
  130. package/dist/components/Skeleton.js +1 -1
  131. package/dist/components/StatusBadge.d.ts +55 -10
  132. package/dist/components/StatusBadge.js +91 -15
  133. package/dist/components/StickyBar.js +1 -1
  134. package/dist/components/Table.d.ts +22 -4
  135. package/dist/components/Table.js +46 -24
  136. package/dist/components/Tabs.d.ts +9 -4
  137. package/dist/components/Tabs.js +9 -4
  138. package/dist/components/Tag.d.ts +49 -0
  139. package/dist/components/Tag.js +199 -0
  140. package/dist/components/ThemeEditor.js +1 -1
  141. package/dist/components/Toast.js +1 -1
  142. package/dist/components/ToggleGroup.d.ts +4 -1
  143. package/dist/components/ToggleGroup.js +30 -13
  144. package/dist/components/Tooltip.d.ts +9 -3
  145. package/dist/components/Tooltip.js +55 -39
  146. package/dist/components/buttonClasses.d.ts +5 -2
  147. package/dist/components/buttonClasses.js +11 -10
  148. package/dist/components/chart.d.ts +69 -0
  149. package/dist/components/chart.js +145 -0
  150. package/dist/components/comboboxItems.d.ts +7 -1
  151. package/dist/components/comboboxItems.js +6 -2
  152. package/dist/components/dismiss.d.ts +5 -1
  153. package/dist/components/dismiss.js +6 -2
  154. package/dist/components/floating.d.ts +4 -4
  155. package/dist/components/floating.js +5 -5
  156. package/dist/components/headerActionsFit.d.ts +37 -0
  157. package/dist/components/headerActionsFit.js +81 -0
  158. package/dist/components/pageHeaderStore.d.ts +3 -0
  159. package/dist/components/pageHeaderStore.js +3 -0
  160. package/dist/components/pathBreaks.js +2 -2
  161. package/dist/components/popupContainer.d.ts +17 -0
  162. package/dist/components/popupContainer.js +69 -0
  163. package/dist/components/relativeTime.d.ts +21 -10
  164. package/dist/components/relativeTime.js +50 -22
  165. package/dist/components/segmented.d.ts +18 -4
  166. package/dist/components/segmented.js +48 -6
  167. package/dist/components/typedDate.d.ts +5 -0
  168. package/dist/components/typedDate.js +50 -0
  169. package/dist/components/useClosingValue.d.ts +4 -0
  170. package/dist/components/useClosingValue.js +12 -0
  171. package/dist/components/useCopy.d.ts +6 -0
  172. package/dist/components/useCopy.js +3 -3
  173. package/dist/components/useNarrow.d.ts +2 -0
  174. package/dist/components/useNarrow.js +16 -0
  175. package/dist/editor/Editor.js +1 -1
  176. package/dist/editor/FormCodePanel.js +1 -1
  177. package/dist/editor/Monaco.js +1 -1
  178. package/dist/editor/workers.js +1 -1
  179. package/dist/file-explorer/FileExplorer.js +16 -15
  180. package/dist/file-explorer/FileExplorerContext.js +2 -2
  181. package/dist/file-explorer/FilePreview/Viewer.js +3 -3
  182. package/dist/file-explorer/FilePreview/index.js +2 -2
  183. package/dist/file-explorer/FileRowsWindow.js +3 -3
  184. package/dist/file-explorer/FileTable.js +1 -1
  185. package/dist/file-explorer/LoadMoreRow.js +1 -1
  186. package/dist/file-explorer/TreeView.js +5 -5
  187. package/dist/file-explorer/helpers.js +2 -2
  188. package/dist/file-explorer/toasts.js +2 -2
  189. package/dist/form/Fields/CheckboxGroupField.js +1 -1
  190. package/dist/form/Fields/DropdownField.js +1 -1
  191. package/dist/form/Fields/DurationField.js +2 -2
  192. package/dist/form/Fields/MultiDropdownField.js +1 -1
  193. package/dist/form/Fields/NumberField.js +1 -1
  194. package/dist/form/Fields/ObjectField.js +1 -1
  195. package/dist/form/Fields/RangeField.js +1 -1
  196. package/dist/form/Fields/StringField.js +1 -1
  197. package/dist/form/Form.js +3 -3
  198. package/dist/form/FormLayout.js +1 -1
  199. package/dist/form/Wizard/WizardContainer.js +1 -1
  200. package/dist/form/Wizard/WizardNavigation.js +1 -1
  201. package/dist/form/Wizard/WizardStepContent.js +1 -1
  202. package/dist/form/fieldRegistry.js +1 -1
  203. package/dist/form/formEditing.js +1 -1
  204. package/dist/format.d.ts +17 -7
  205. package/dist/format.js +39 -16
  206. package/dist/graph/AnnotationBanner.js +2 -2
  207. package/dist/graph/Connectors.js +5 -5
  208. package/dist/graph/DependencyGraph.js +10 -9
  209. package/dist/graph/GraphEditor.js +4 -4
  210. package/dist/graph/GraphEditorDialogs.js +13 -12
  211. package/dist/graph/GraphNode.js +1 -1
  212. package/dist/graph/InputDialog.js +5 -5
  213. package/dist/graph/InputsEditor.js +10 -9
  214. package/dist/graph/MatrixGroup.js +2 -2
  215. package/dist/graph/ProblemPageLink.d.ts +9 -0
  216. package/dist/graph/ProblemPageLink.js +21 -0
  217. package/dist/graph/ProblemsButton.js +26 -16
  218. package/dist/graph/Reveal.js +1 -1
  219. package/dist/graph/RunWarningsList.js +21 -12
  220. package/dist/graph/ShortcutsButton.js +25 -8
  221. package/dist/graph/StepSummaries.js +1 -1
  222. package/dist/graph/TreeView.js +2 -2
  223. package/dist/graph/WorkflowSettingsDialog.js +3 -3
  224. package/dist/graph/editorApi.d.ts +10 -0
  225. package/dist/graph/editorFields.js +3 -3
  226. package/dist/graph/editorPrimitives.js +1 -1
  227. package/dist/graph/editorRows.js +8 -6
  228. package/dist/graph/editorStrings.d.ts +1 -0
  229. package/dist/graph/editorStrings.js +1 -0
  230. package/dist/graph/fieldProblems.js +2 -2
  231. package/dist/graph/inputRefs.js +7 -6
  232. package/dist/graph/runWarnings.d.ts +12 -1
  233. package/dist/graph/stepWith.js +2 -2
  234. package/dist/index.d.ts +30 -21
  235. package/dist/index.js +20 -12
  236. package/dist/list/ActionToolbar.d.ts +4 -0
  237. package/dist/list/ActionToolbar.js +35 -12
  238. package/dist/list/ListFilterBar.d.ts +42 -0
  239. package/dist/list/ListFilterBar.js +789 -0
  240. package/dist/list/ListPage.d.ts +42 -4
  241. package/dist/list/ListPage.js +56 -22
  242. package/dist/list/ListTable.d.ts +27 -3
  243. package/dist/list/ListTable.js +48 -23
  244. package/dist/list/ListToolbar.d.ts +31 -0
  245. package/dist/list/ListToolbar.js +43 -0
  246. package/dist/list/ListViewControls.d.ts +8 -4
  247. package/dist/list/ListViewControls.js +22 -14
  248. package/dist/list/UserHoverCard.d.ts +8 -2
  249. package/dist/list/UserHoverCard.js +26 -13
  250. package/dist/list/filterModel.d.ts +122 -0
  251. package/dist/list/filterModel.js +308 -0
  252. package/dist/list/index.d.ts +6 -2
  253. package/dist/list/index.js +6 -2
  254. package/dist/list/listSearch.d.ts +1 -1
  255. package/dist/list/listSearch.js +8 -4
  256. package/dist/list/listView.d.ts +24 -2
  257. package/dist/list/listView.js +47 -45
  258. package/dist/list/rowMenu.d.ts +10 -5
  259. package/dist/list/rowMenu.js +17 -7
  260. package/dist/list/useListFilters.d.ts +68 -0
  261. package/dist/list/useListFilters.js +252 -0
  262. package/dist/logviewer/LogViewer.js +4 -4
  263. package/dist/styles/theme.css +94 -0
  264. package/dist/styles.css +1 -1
  265. package/package.json +11 -11
  266. package/dist/assets/yaml.worker-k9AdOqzf.js +0 -1441
  267. package/dist/components/fullscreen.d.ts +0 -4
  268. package/dist/components/fullscreen.js +0 -18
@@ -1,18 +1,18 @@
1
1
  import { cx } from "../../cx.js";
2
+ import { EmptyState } from "../../components/EmptyState.js";
2
3
  import { DownloadIcon, FileIcon, TrashIcon } from "../../icons.js";
3
4
  import { safeUrl } from "../../safeUrl.js";
4
5
  import { Loader } from "../../components/Loader.js";
5
6
  import { toast } from "../../components/Toast.js";
6
7
  import { Tooltip } from "../../components/Tooltip.js";
7
8
  import { useStrings } from "../../components/Provider.js";
8
- import { EmptyState } from "../../components/EmptyState.js";
9
9
  import { formatBytes } from "../../format.js";
10
10
  import { RelativeTime } from "../../components/relativeTime.js";
11
11
  import { useChatConfig } from "../core/config.js";
12
12
  import { useChat } from "../core/ChatProvider.js";
13
13
  import { attachmentsPageKey } from "./attachmentKeys.js";
14
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
15
14
  import { useCallback, useMemo, useState } from "react";
15
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
16
16
  import useSWRInfinite from "swr/infinite";
17
17
  //#region src/ai/components/AttachmentManager.tsx
18
18
  function AttachmentManager() {
@@ -64,7 +64,7 @@ function AttachmentManager() {
64
64
  }) : attachments.length === 0 ? /* @__PURE__ */ jsx(EmptyState, {
65
65
  variant: "bare",
66
66
  title: t.empty
67
- }) : /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("div", {
67
+ }) : /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx("div", {
68
68
  className: "grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-4",
69
69
  children: attachments.map((att) => {
70
70
  const downloadUrl = safeUrl(attachmentsAdapter.downloadUrl(att.id));
@@ -72,7 +72,7 @@ function AttachmentManager() {
72
72
  const isDeleting = deleting === att.id;
73
73
  const thumbnail = thumbnails[att.id];
74
74
  const showThumbnail = att.contentType?.startsWith("image/") && thumbnail !== "broken";
75
- const preview = /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(FileIcon, {
75
+ const preview = /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(FileIcon, {
76
76
  "aria-hidden": "true",
77
77
  className: "w-8 h-8 theme-muted-text"
78
78
  }), showThumbnail && /* @__PURE__ */ jsx("img", {
@@ -104,7 +104,7 @@ function AttachmentManager() {
104
104
  children: name
105
105
  }), /* @__PURE__ */ jsxs("p", {
106
106
  className: "truncate theme-muted-text",
107
- children: [att.size ? formatBytes(att.size) : "", att.uploadedAt && /* @__PURE__ */ jsxs(Fragment, { children: [att.size ? " · " : "", /* @__PURE__ */ jsx(RelativeTime, { value: att.uploadedAt })] })]
107
+ children: [att.size ? formatBytes(att.size) : "", att.uploadedAt && /* @__PURE__ */ jsxs(Fragment$1, { children: [att.size ? " · " : "", /* @__PURE__ */ jsx(RelativeTime, { value: att.uploadedAt })] })]
108
108
  })]
109
109
  }), /* @__PURE__ */ jsxs("div", {
110
110
  className: "flex items-center gap-0.5 flex-shrink-0",
@@ -6,8 +6,8 @@ import { formatBytes } from "../../format.js";
6
6
  import { useChatConfig } from "../core/config.js";
7
7
  import { useChat } from "../core/ChatProvider.js";
8
8
  import { ATTACHMENTS_INFINITE_KEY } from "./attachmentKeys.js";
9
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
10
9
  import { useCallback, useImperativeHandle, useLayoutEffect, useRef, useState } from "react";
10
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
11
11
  import { mutate } from "swr";
12
12
  //#region src/ai/components/AttachmentUpload.tsx
13
13
  var DEFAULT_MAX_FILE_SIZE = 26214400;
@@ -118,7 +118,7 @@ function AttachmentUpload({ conversationId, attachments, onAttachmentsChange, di
118
118
  const handleClick = () => {
119
119
  fileInputRef.current?.click();
120
120
  };
121
- return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("input", {
121
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx("input", {
122
122
  ref: fileInputRef,
123
123
  type: "file",
124
124
  multiple: true,
@@ -1,8 +1,8 @@
1
1
  import { ChevronLeftIcon, ChevronRightIcon } from "../../icons.js";
2
2
  import { IconButton } from "../../components/IconButton.js";
3
3
  import { useChatConfig } from "../core/config.js";
4
- import { jsx, jsxs } from "react/jsx-runtime";
5
4
  import { useMemo } from "react";
5
+ import { jsx, jsxs } from "react/jsx-runtime";
6
6
  //#region src/ai/components/BranchNavigator.tsx
7
7
  function findSiblings(messages, messageId) {
8
8
  const message = messages.find((m) => m.id === messageId);
@@ -2,8 +2,8 @@ import { toolHeaderFor } from "../agent/toolfmt.js";
2
2
  import { useChatConfig } from "../core/config.js";
3
3
  import { useChat, useChatStream } from "../core/ChatProvider.js";
4
4
  import ActivityLine from "./agent/ActivityLine.js";
5
- import { jsx } from "react/jsx-runtime";
6
5
  import { useEffect, useState } from "react";
6
+ import { jsx } from "react/jsx-runtime";
7
7
  import { DateTime } from "luxon";
8
8
  //#region src/ai/components/ChatActivity.tsx
9
9
  /** An agent session's working line for the provider's reply, naming its current step. */
@@ -1,6 +1,6 @@
1
1
  import { AddIcon, CloudIcon } from "../../icons.js";
2
- import { keyedByContent } from "../../components/keys.js";
3
2
  import { useStrings } from "../../components/Provider.js";
3
+ import { keyedByContent } from "../../components/keys.js";
4
4
  import { Button } from "../../components/Button.js";
5
5
  import { Callout } from "../../components/Callout.js";
6
6
  import { useChatConfig } from "../core/config.js";
@@ -13,8 +13,8 @@ import DragOverlay from "./DragOverlay.js";
13
13
  import ChatInput from "./ChatInput.js";
14
14
  import ChatStage, { StageList } from "./ChatStage.js";
15
15
  import ProviderIssueBanner from "./ProviderIssueBanner.js";
16
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
17
16
  import { useCallback, useEffect, useMemo, useRef, useState } from "react";
17
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
18
18
  //#region src/ai/components/ChatEmptyState.tsx
19
19
  function pickRandom(arr, count) {
20
20
  return [...arr].sort(() => Math.random() - .5).slice(0, count);
@@ -132,7 +132,7 @@ function ChatEmptyState({ targetSession }) {
132
132
  disabled: isLoading || isLoadingModels || models.length === 0,
133
133
  placeholder: isLoadingModels ? tInput.placeholderLoading : hasLoadedModels && models.length === 0 ? tInput.placeholderNoProviders : tInput.placeholder,
134
134
  settingsLeft: /* @__PURE__ */ jsx(ConnectToolsLink, {}),
135
- settingsRight: /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(ComposerUsage, { children: slots.composerUsage }), /* @__PURE__ */ jsx(ComposerControls, { targetSession })] })
135
+ settingsRight: /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(ComposerUsage, { children: slots.composerUsage }), /* @__PURE__ */ jsx(ComposerControls, { targetSession })] })
136
136
  }),
137
137
  prompts.length > 0 && !(hasLoadedModels && models.length === 0) && /* @__PURE__ */ jsx(StageList, { children: keyedByContent(prompts, (p) => p).map(({ key, item: prompt }) => /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx("button", {
138
138
  type: "button",
@@ -11,8 +11,8 @@ import DragOverlay from "./DragOverlay.js";
11
11
  import { PasteFileCard } from "./PastedText.js";
12
12
  import { SlashMenu, useSlashMenu } from "./SlashMenu.js";
13
13
  import { usePasteCards } from "./usePasteCards.js";
14
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
15
14
  import { useCallback, useEffect, useImperativeHandle, useLayoutEffect, useRef, useState } from "react";
15
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
16
16
  //#region src/ai/components/ChatInput.tsx
17
17
  /** An optional box that is still empty should not wear the filled look of
18
18
  * one waiting to send something. */
@@ -230,9 +230,7 @@ function ChatInput({ onSend, disabled = false, placeholder, conversationId, onEd
230
230
  className: "relative",
231
231
  children: [slash && slashMenu.open && /* @__PURE__ */ jsx(SlashMenu, {
232
232
  label: slash.label,
233
- listId: slashMenu.listId,
234
- matches: slashMenu.matches,
235
- active: slashMenu.active,
233
+ menu: slashMenu,
236
234
  onChoose: (name) => {
237
235
  slashMenu.choose(name);
238
236
  textareaRef.current?.focus();
@@ -290,7 +288,7 @@ function ChatInput({ onSend, disabled = false, placeholder, conversationId, onEd
290
288
  ]
291
289
  })]
292
290
  }),
293
- (settingsLeft || uploadedCount > 0) && /* @__PURE__ */ jsx(ComposerSettings, { left: /* @__PURE__ */ jsxs(Fragment, { children: [settingsLeft, uploadedCount > 0 && /* @__PURE__ */ jsx("span", {
291
+ (settingsLeft || uploadedCount > 0) && /* @__PURE__ */ jsx(ComposerSettings, { left: /* @__PURE__ */ jsxs(Fragment$1, { children: [settingsLeft, uploadedCount > 0 && /* @__PURE__ */ jsx("span", {
294
292
  className: "text-[11px] theme-muted-text",
295
293
  children: t.filesAttached(uploadedCount)
296
294
  })] }) }),
@@ -5,8 +5,8 @@ import { useChat } from "../core/ChatProvider.js";
5
5
  import { KeyboardShortcutsProvider } from "../core/KeyboardShortcutsProvider.js";
6
6
  import { SidebarToggle } from "../ui/sidebar.js";
7
7
  import ChatSidebar from "./ChatSidebar.js";
8
- import { jsx, jsxs } from "react/jsx-runtime";
9
8
  import { useLayoutEffect, useRef, useState } from "react";
9
+ import { jsx, jsxs } from "react/jsx-runtime";
10
10
  //#region src/ai/components/ChatLayout.tsx
11
11
  /** The list at its default width beside the narrowest thread that still
12
12
  * reads comfortably; narrower than that, 'auto' moves the list to a drawer. */
@@ -17,8 +17,8 @@ import BranchNavigator from "./BranchNavigator.js";
17
17
  import { UserMessageText } from "./PastedText.js";
18
18
  import { replyText } from "../core/useKeyboardShortcuts.js";
19
19
  import MessageAttachments from "./MessageAttachments.js";
20
- import { jsx, jsxs } from "react/jsx-runtime";
21
20
  import { memo, useEffect, useRef, useState } from "react";
21
+ import { jsx, jsxs } from "react/jsx-runtime";
22
22
  import { DateTime } from "luxon";
23
23
  //#region src/ai/components/ChatMessage.tsx
24
24
  /** A message action: the chat's square, tinted from the ink on hover. */
@@ -9,8 +9,8 @@ import Markdown from "../ui/Markdown.js";
9
9
  import { Reasoning, ReasoningBody } from "./Reasoning.js";
10
10
  import AgentMessageParts from "./agent/AgentMessageParts.js";
11
11
  import ChatMessage_default from "./ChatMessage.js";
12
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
13
12
  import { memo, useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from "react";
13
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
14
14
  //#region src/ai/components/ChatMessageList.tsx
15
15
  function ChatMessageList({ messages, allMessages, streamingMessage: streamingMessageProp, queuedMessages, onRemoveQueued, canRemoveQueued, queueDelivery = "afterReply", editingMessageId, showAuthor, currentUsername, onNavigateBranch, onEditMessage, onSaveEdit, onCancelEdit, onRegenerateMessage, onRetryMessage, onOpenReasoning, onApprovalAnswer, inputElement, isStreaming: isStreamingProp, flush, label, footer, workingIndicator = true }) {
16
16
  const { adapter, isStreaming: providerStreaming } = useChat();
@@ -45,8 +45,8 @@ function ChatMessageList({ messages, allMessages, streamingMessage: streamingMes
45
45
  const open = adapter.attachments?.onOpen;
46
46
  return open ? open.bind(adapter.attachments) : void 0;
47
47
  }, [adapter]);
48
- const bottomRef = useRef(null);
49
48
  const containerRef = useRef(null);
49
+ const contentRef = useRef(null);
50
50
  const reasoningScrollRef = useRef(null);
51
51
  const messageCount = messages.length;
52
52
  const streamingText = streamingMessage?.content;
@@ -145,8 +145,25 @@ function ChatMessageList({ messages, allMessages, streamingMessage: streamingMes
145
145
  ]);
146
146
  useEffect(() => {
147
147
  if (!containerRef.current || !isNearBottomRef.current || isStreaming || !hadMessagesRef.current) return;
148
- bottomRef.current?.scrollIntoView({ behavior: prefersReducedMotion() ? "auto" : "smooth" });
148
+ const el = containerRef.current;
149
+ el.scrollTo({
150
+ top: el.scrollHeight,
151
+ behavior: prefersReducedMotion() ? "auto" : "smooth"
152
+ });
149
153
  }, [messageCount, isStreaming]);
154
+ useEffect(() => {
155
+ const content = contentRef.current;
156
+ if (!content || typeof ResizeObserver === "undefined") return;
157
+ const observer = new ResizeObserver(() => {
158
+ const el = containerRef.current;
159
+ if (el && isNearBottomRef.current && !hasQueuedMessages) {
160
+ el.scrollTop = el.scrollHeight;
161
+ lastScrollTopRef.current = el.scrollTop;
162
+ }
163
+ });
164
+ observer.observe(content);
165
+ return () => observer.disconnect();
166
+ }, [hasContent, hasQueuedMessages]);
150
167
  if (messages.length === 0 && !streamingMessage && !hasQueuedMessages) return /* @__PURE__ */ jsxs("div", {
151
168
  className: "chat-thread flex-1 overflow-y-auto flex flex-col bg-(--theme-panel-bg)",
152
169
  children: [
@@ -170,6 +187,7 @@ function ChatMessageList({ messages, allMessages, streamingMessage: streamingMes
170
187
  className: "chat-thread flex-1 overflow-y-auto theme-scrollbar flex flex-col bg-(--theme-panel-bg)",
171
188
  children: [
172
189
  /* @__PURE__ */ jsxs("div", {
190
+ ref: contentRef,
173
191
  className: "w-full max-w-[var(--chat-column,50rem)] mx-auto pt-4 pb-6 flex-1 px-4",
174
192
  children: [
175
193
  /* @__PURE__ */ jsx(MessageRows, {
@@ -268,7 +286,7 @@ function ChatMessageList({ messages, allMessages, streamingMessage: streamingMes
268
286
  children: [
269
287
  removable ? /* @__PURE__ */ jsx(ClockIcon, { className: "h-3 w-3" }) : /* @__PURE__ */ jsx(CheckIcon, { className: "h-3 w-3" }),
270
288
  /* @__PURE__ */ jsx("span", { children: status }),
271
- onRemoveQueued && removable && /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("span", {
289
+ onRemoveQueued && removable && /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx("span", {
272
290
  "aria-hidden": "true",
273
291
  children: "·"
274
292
  }), /* @__PURE__ */ jsx("button", {
@@ -283,10 +301,7 @@ function ChatMessageList({ messages, allMessages, streamingMessage: streamingMes
283
301
  }, msg.id);
284
302
  }),
285
303
  footer,
286
- /* @__PURE__ */ jsx("div", {
287
- ref: bottomRef,
288
- className: "h-8"
289
- })
304
+ /* @__PURE__ */ jsx("div", { className: "h-8" })
290
305
  ]
291
306
  }),
292
307
  !pinned && /* @__PURE__ */ jsx("div", {
@@ -10,8 +10,8 @@ import { FOCUS_SIDEBAR_SEARCH_EVENT } from "../core/events.js";
10
10
  import { SidebarEmpty, SidebarRow, SidebarRowBody } from "../ui/sidebar.js";
11
11
  import { ConversationSidebar } from "../ui/ConversationSidebar.js";
12
12
  import { groupConversationsByDate, useConversationActions } from "./conversationActions.js";
13
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
14
13
  import { useEffect, useMemo, useRef, useState } from "react";
14
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
15
15
  //#region src/ai/components/ChatSidebar.tsx
16
16
  function ConversationRow({ conv, isCurrent, menuItems, openMenu, onOpen }) {
17
17
  const { LinkComponent, strings } = useChatConfig();
@@ -122,7 +122,7 @@ function ChatSidebar({ actions = true, top }) {
122
122
  current: filteredConversations.find((conv) => conv.id === activeConversationId),
123
123
  onSelect: (conv) => navigation.toConversation(conv.id)
124
124
  },
125
- top: (top || actions) && /* @__PURE__ */ jsxs(Fragment, { children: [top?.({ collapsed: sidebarCollapsed }), actions && /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsxs("div", {
125
+ top: (top || actions) && /* @__PURE__ */ jsxs(Fragment$1, { children: [top?.({ collapsed: sidebarCollapsed }), actions && /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsxs("div", {
126
126
  className: "flex flex-col gap-0.5 px-2 pt-2 pb-1",
127
127
  children: [/* @__PURE__ */ jsxs(LinkComponent, {
128
128
  target: { kind: "newChat" },
@@ -155,7 +155,7 @@ function ChatSidebar({ actions = true, top }) {
155
155
  })] })] }),
156
156
  footer: /* @__PURE__ */ jsx(ManageProvidersLink, {})
157
157
  });
158
- return /* @__PURE__ */ jsxs(Fragment, { children: [(drawer || sidebar !== "hidden") && list, overlays] });
158
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [(drawer || sidebar !== "hidden") && list, overlays] });
159
159
  }
160
160
  //#endregion
161
161
  export { ChatSidebar as default };
@@ -5,8 +5,8 @@ import { ComposerControls, ComposerUsage, ConnectToolsLink } from "./ComposerChr
5
5
  import ProviderIssueBanner from "./ProviderIssueBanner.js";
6
6
  import { ShareButton, ToolResultsSharedNote } from "./ShareDialog.js";
7
7
  import SessionView from "./SessionView.js";
8
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
9
8
  import { useCallback, useEffect, useMemo, useRef } from "react";
9
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
10
10
  //#region src/ai/components/ChatThread.tsx
11
11
  function ChatThread({ conversationId }) {
12
12
  const { adapter, currentUser, currentConversation, loadConversation, loadProviders, sendMessage, retryMessage, answerToolApproval, tools, isLoadingConversation, navigateToBranch, queuedMessages, removeQueuedMessage } = useChat();
@@ -57,12 +57,12 @@ function ChatThread({ conversationId }) {
57
57
  currentUsername: currentUser.username,
58
58
  loading: isLoadingConversation && !currentConversation,
59
59
  dropFiles: !!adapter.attachments,
60
- banners: /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(BlockedGroupBanner, {}), /* @__PURE__ */ jsx(ProviderIssueBanner, {})] }),
60
+ banners: /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(BlockedGroupBanner, {}), /* @__PURE__ */ jsx(ProviderIssueBanner, {})] }),
61
61
  composer: {
62
62
  disabled: isLoadingConversation || !canWrite,
63
63
  ...canWrite ? {} : { placeholder: strings.thread.viewOnly },
64
- settingsLeft: /* @__PURE__ */ jsxs(Fragment, { children: [currentConversation && currentConversation.isOwner !== false ? /* @__PURE__ */ jsx(ShareButton, { conversationId }) : tools.length > 0 && /* @__PURE__ */ jsx(ToolResultsSharedNote, {}), /* @__PURE__ */ jsx(ConnectToolsLink, {})] }),
65
- settingsRight: /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(ComposerUsage, { children: slots.composerUsage }), /* @__PURE__ */ jsx(ComposerControls, {})] })
64
+ settingsLeft: /* @__PURE__ */ jsxs(Fragment$1, { children: [currentConversation && currentConversation.isOwner !== false ? /* @__PURE__ */ jsx(ShareButton, { conversationId }) : tools.length > 0 && /* @__PURE__ */ jsx(ToolResultsSharedNote, {}), /* @__PURE__ */ jsx(ConnectToolsLink, {})] }),
65
+ settingsRight: /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(ComposerUsage, { children: slots.composerUsage }), /* @__PURE__ */ jsx(ComposerControls, {})] })
66
66
  }
67
67
  });
68
68
  }
@@ -3,6 +3,7 @@ import { AddIcon, AttachmentIcon, ConnectIcon, ToolsIcon } from "../../icons.js"
3
3
  import { panelItemClassName } from "../../components/floating.js";
4
4
  import { MenuItem, MenuLinkItem, MenuPopup, MenuSeparator, MenuSubmenuTrigger } from "../../components/Menu.js";
5
5
  import { useQueryMatch } from "../../components/search.js";
6
+ import { useNarrow } from "../../components/useNarrow.js";
6
7
  import { Button } from "../../components/Button.js";
7
8
  import { Modal } from "../../components/Modal.js";
8
9
  import { Switch } from "../../components/Switch.js";
@@ -10,20 +11,8 @@ import { SearchInput } from "../../components/SearchInput.js";
10
11
  import { useChatConfig } from "../core/config.js";
11
12
  import { useChat } from "../core/ChatProvider.js";
12
13
  import { Menu } from "@base-ui/react/menu";
13
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
14
- import { useId, useState, useSyncExternalStore } from "react";
15
- var NARROW = "(max-width: 639px)";
16
- function subscribeNarrow(onChange) {
17
- if (typeof window === "undefined" || typeof window.matchMedia !== "function") return () => {};
18
- const media = window.matchMedia(NARROW);
19
- media.addEventListener("change", onChange);
20
- return () => media.removeEventListener("change", onChange);
21
- }
22
- var isNarrow = () => typeof window !== "undefined" && typeof window.matchMedia === "function" && window.matchMedia(NARROW).matches;
23
- /** A phone has no room beside the menu for a submenu, and no hover to open one. */
24
- function useNarrow() {
25
- return useSyncExternalStore(subscribeNarrow, isNarrow, () => false);
26
- }
14
+ import { useId, useState } from "react";
15
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
27
16
  function PlusButton({ open, label, hint, className, ...props }) {
28
17
  const name = hint ? `${label} · ${hint}` : label;
29
18
  return /* @__PURE__ */ jsxs("button", {
@@ -162,7 +151,7 @@ function ToolsModal({ open, onClose, listed }) {
162
151
  size: "md",
163
152
  title: t.tools,
164
153
  description: t.toolsDescription,
165
- footer: /* @__PURE__ */ jsxs(Fragment, { children: [footerStart, /* @__PURE__ */ jsx(Button, {
154
+ footer: /* @__PURE__ */ jsxs(Fragment$1, { children: [footerStart, /* @__PURE__ */ jsx(Button, {
166
155
  variant: "primary",
167
156
  onClick: close,
168
157
  children: t.done
@@ -222,7 +211,7 @@ function ComposerAddMenu({ attachmentsOpen, onToggleAttachments, disabled, withT
222
211
  const many = listed.length > 6;
223
212
  const connect = extraLinks.connectTools;
224
213
  const label = onToggleAttachments ? t.label : t.tools;
225
- if (many && !onToggleAttachments) return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(PlusButton, {
214
+ if (many && !onToggleAttachments) return /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(PlusButton, {
226
215
  open: false,
227
216
  "aria-haspopup": "dialog",
228
217
  disabled,
@@ -254,9 +243,9 @@ function ComposerAddMenu({ attachmentsOpen, onToggleAttachments, disabled, withT
254
243
  ] }), /* @__PURE__ */ jsxs(MenuPopup, {
255
244
  side: "inline-end",
256
245
  className: "w-72",
257
- children: [/* @__PURE__ */ jsx(ToolsList, { listed }), connect && /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(MenuSeparator, {}), /* @__PURE__ */ jsx(ConnectToolsRow, { href: connect })] })]
246
+ children: [/* @__PURE__ */ jsx(ToolsList, { listed }), connect && /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(MenuSeparator, {}), /* @__PURE__ */ jsx(ConnectToolsRow, { href: connect })] })]
258
247
  })] }) : null;
259
- return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsxs(Menu.Root, { children: [/* @__PURE__ */ jsx(Menu.Trigger, {
248
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsxs(Menu.Root, { children: [/* @__PURE__ */ jsx(Menu.Trigger, {
260
249
  disabled,
261
250
  render: /* @__PURE__ */ jsx(PlusButton, {
262
251
  open: attachmentsOpen,
@@ -270,10 +259,10 @@ function ComposerAddMenu({ attachmentsOpen, onToggleAttachments, disabled, withT
270
259
  children: [onToggleAttachments && /* @__PURE__ */ jsxs(MenuItem, {
271
260
  onClick: onToggleAttachments,
272
261
  children: [/* @__PURE__ */ jsx(AttachmentIcon, { className: "h-4 w-4 shrink-0 theme-muted-text" }), t.addFiles]
273
- }), toolsEntry ?? /* @__PURE__ */ jsxs(Fragment, { children: [
262
+ }), toolsEntry ?? /* @__PURE__ */ jsxs(Fragment$1, { children: [
274
263
  onToggleAttachments && /* @__PURE__ */ jsx(MenuSeparator, {}),
275
264
  /* @__PURE__ */ jsx(ToolsList, { listed }),
276
- connect && /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(MenuSeparator, {}), /* @__PURE__ */ jsx(ConnectToolsRow, { href: connect })] })
265
+ connect && /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(MenuSeparator, {}), /* @__PURE__ */ jsx(ConnectToolsRow, { href: connect })] })
277
266
  ] })]
278
267
  })] }), many && /* @__PURE__ */ jsx(ToolsModal, {
279
268
  open: modalOpen,
@@ -6,8 +6,8 @@ import { useChatConfig } from "../core/config.js";
6
6
  import { issueDetail, issueLabel, providerIssueFor } from "../core/providerIssues.js";
7
7
  import { useChat } from "../core/ChatProvider.js";
8
8
  import { chipClassName } from "../ui/chip.js";
9
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
10
9
  import { useMemo } from "react";
10
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
11
11
  //#region src/ai/components/ModelSelector.tsx
12
12
  var ORG_OWNER = "org";
13
13
  /** Who registered a provider: the provider list's owner when the adapter
@@ -20,7 +20,7 @@ function providerOwner(info, model) {
20
20
  function CspIcon({ cspKind, className }) {
21
21
  const { slots } = useChatConfig();
22
22
  const custom = slots.providerIcon?.(cspKind, className);
23
- if (custom) return /* @__PURE__ */ jsx(Fragment, { children: custom });
23
+ if (custom) return /* @__PURE__ */ jsx(Fragment$1, { children: custom });
24
24
  return /* @__PURE__ */ jsx(CloudIcon, { className: cx("theme-muted-text", className) });
25
25
  }
26
26
  function getProviderKeyFromModelId(modelId) {
@@ -135,7 +135,7 @@ function ModelSelector({ targetSession, model }) {
135
135
  trigger: /* @__PURE__ */ jsxs("button", {
136
136
  type: "button",
137
137
  className: chipClassName,
138
- children: [selected ? /* @__PURE__ */ jsxs(Fragment, { children: [
138
+ children: [selected ? /* @__PURE__ */ jsxs(Fragment$1, { children: [
139
139
  /* @__PURE__ */ jsx("span", {
140
140
  className: "truncate font-medium theme-text",
141
141
  children: getModelLabel(selected)
@@ -6,8 +6,8 @@ import { useChatConfig } from "../core/config.js";
6
6
  import Markdown from "../ui/Markdown.js";
7
7
  import { fencePaste } from "../core/pasteLanguage.js";
8
8
  import { splitPastes } from "../core/pastes.js";
9
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
10
- import { Fragment as Fragment$1 } from "react";
9
+ import { Fragment } from "react";
10
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
11
11
  //#region src/ai/components/PastedText.tsx
12
12
  /** A paste sent, or about to be sent, as its saved file. */
13
13
  function PasteFileCard({ id, lines, bytes, saving = false, error, onRemove }) {
@@ -49,16 +49,16 @@ function PasteFileCard({ id, lines, bytes, saving = false, error, onRemove }) {
49
49
  * it reads as, one sent as its file as a card. The blank lines the composer puts around a
50
50
  * paste would stack on the block's own spacing, so they are dropped. */
51
51
  function UserMessageText({ content, pastes }) {
52
- if (!pastes?.length) return /* @__PURE__ */ jsx(Fragment, { children: content });
52
+ if (!pastes?.length) return /* @__PURE__ */ jsx(Fragment$1, { children: content });
53
53
  const segments = splitPastes(content, pastes);
54
54
  const shows = (seg) => typeof seg !== "string" || seg.trim() !== "";
55
55
  const blockSpacing = (i) => cx(segments.slice(0, i).some(shows) ? "mt-2.5" : "mt-0", segments.slice(i + 1).some(shows) ? "mb-2.5" : "mb-0");
56
- return /* @__PURE__ */ jsx(Fragment, { children: segments.map((segment, i) => {
56
+ return /* @__PURE__ */ jsx(Fragment$1, { children: segments.map((segment, i) => {
57
57
  if (typeof segment === "string") {
58
58
  let text = segment;
59
59
  if (i > 0) text = text.replace(/^\n+/, "");
60
60
  if (i < segments.length - 1) text = text.replace(/\n+$/, "");
61
- return text ? /* @__PURE__ */ jsx(Fragment$1, { children: text }, i) : null;
61
+ return text ? /* @__PURE__ */ jsx(Fragment, { children: text }, i) : null;
62
62
  }
63
63
  if (segment.inline && segment.text !== void 0) return /* @__PURE__ */ jsx("span", {
64
64
  className: cx("chat-paste-code block", blockSpacing(i)),
@@ -5,8 +5,8 @@ import ChatInput from "./ChatInput.js";
5
5
  import { escapeClosesLayer } from "../core/useKeyboardShortcuts.js";
6
6
  import ChatMessageList from "./ChatMessageList.js";
7
7
  import ChatActivity from "./ChatActivity.js";
8
- import { jsx, jsxs } from "react/jsx-runtime";
9
8
  import { useCallback, useEffect, useRef, useState } from "react";
9
+ import { jsx, jsxs } from "react/jsx-runtime";
10
10
  //#region src/ai/components/SessionView.tsx
11
11
  /** One conversation or agent session: its transcript, with the composer at
12
12
  * the foot of the scrolling column. The host binds its own data and actions;
@@ -9,8 +9,8 @@ import { ConfirmModal } from "../../components/ConfirmModal.js";
9
9
  import { Select } from "../../components/Select.js";
10
10
  import { useChatConfig } from "../core/config.js";
11
11
  import { useChat } from "../core/ChatProvider.js";
12
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
13
12
  import { useCallback, useEffect, useState, useTransition } from "react";
13
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
14
14
  //#region src/ai/components/ShareDialog.tsx
15
15
  function isTeamPermission(p) {
16
16
  return !!p.team && !p.entireOrganization;
@@ -150,7 +150,7 @@ function ShareDialog({ conversationId, isOpen, onClose }) {
150
150
  size: 24,
151
151
  label: common.loading
152
152
  })
153
- }) : /* @__PURE__ */ jsxs(Fragment, { children: [
153
+ }) : /* @__PURE__ */ jsxs(Fragment$1, { children: [
154
154
  /* @__PURE__ */ jsxs("div", {
155
155
  className: "border theme-border rounded-lg p-3",
156
156
  children: [/* @__PURE__ */ jsx("h3", {
@@ -253,7 +253,7 @@ function ShareButton({ conversationId, disabled = false }) {
253
253
  const [isOpen, setIsOpen] = useState(false);
254
254
  const shared = useShared(conversationId, tools.length > 0 && !isOpen);
255
255
  if (!adapter.sharing) return null;
256
- return /* @__PURE__ */ jsxs(Fragment, { children: [
256
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [
257
257
  /* @__PURE__ */ jsxs("button", {
258
258
  type: "button",
259
259
  onClick: () => setIsOpen(true),
@@ -27,11 +27,38 @@ export declare function useSlashMenu(input: string, config: SlashMenuConfig | un
27
27
  'aria-controls': string | undefined;
28
28
  'aria-activedescendant': string | undefined;
29
29
  };
30
+ list: {
31
+ active: number;
32
+ setActive: import("react").Dispatch<import("react").SetStateAction<number>>;
33
+ handleKey: (event: globalThis.KeyboardEvent | KeyboardEvent<Element>) => boolean;
34
+ listId: string;
35
+ hostProps: {
36
+ 'aria-autocomplete': 'list';
37
+ 'aria-controls': string | undefined;
38
+ 'aria-activedescendant': string | undefined;
39
+ };
40
+ listProps: {
41
+ id: string;
42
+ role: 'listbox';
43
+ };
44
+ optionProps: (index: number) => {
45
+ id: string;
46
+ role: 'option';
47
+ tabIndex: number;
48
+ 'aria-selected': boolean;
49
+ 'aria-disabled': true | undefined;
50
+ 'data-highlighted': true | undefined;
51
+ 'data-disabled': true | undefined;
52
+ onMouseDown: (event: {
53
+ preventDefault: () => void;
54
+ }) => void;
55
+ onMouseMove: () => void;
56
+ onClick: () => void;
57
+ };
58
+ };
30
59
  };
31
- export declare function SlashMenu({ label, listId, matches, active, onChoose, }: {
60
+ export declare function SlashMenu({ label, menu, onChoose, }: {
32
61
  label: string;
33
- listId: string;
34
- matches: SlashCommandOption[];
35
- active: number;
62
+ menu: ReturnType<typeof useSlashMenu>;
36
63
  onChoose: (name: string) => void;
37
64
  }): import("react").JSX.Element;