@parallelworks/ui 0.77.0 → 0.78.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 (262) hide show
  1. package/README.md +30 -5
  2. package/dist/access/AccessDrawer.d.ts +28 -7
  3. package/dist/access/AccessDrawer.js +216 -35
  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 +18 -0
  13. package/dist/access/strings.js +20 -2
  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 +2 -2
  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 +26 -2
  60. package/dist/components/ConfirmModal.js +81 -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 +16 -4
  66. package/dist/components/CreateModal.js +27 -16
  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 +38 -2
  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 +13 -2
  113. package/dist/components/Popover.js +20 -21
  114. package/dist/components/Provider.d.ts +140 -3
  115. package/dist/components/Provider.js +142 -12
  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 +7 -7
  214. package/dist/graph/MatrixGroup.js +2 -2
  215. package/dist/graph/ProblemsButton.js +3 -3
  216. package/dist/graph/Reveal.js +1 -1
  217. package/dist/graph/RunWarningsList.js +1 -1
  218. package/dist/graph/ShortcutsButton.js +25 -8
  219. package/dist/graph/StepSummaries.js +1 -1
  220. package/dist/graph/TreeView.js +2 -2
  221. package/dist/graph/WorkflowSettingsDialog.js +3 -3
  222. package/dist/graph/editorFields.js +3 -3
  223. package/dist/graph/editorPrimitives.js +1 -1
  224. package/dist/graph/editorRows.js +5 -5
  225. package/dist/graph/fieldProblems.js +2 -2
  226. package/dist/graph/inputRefs.js +7 -6
  227. package/dist/graph/stepWith.js +2 -2
  228. package/dist/index.d.ts +30 -21
  229. package/dist/index.js +20 -12
  230. package/dist/list/ActionToolbar.d.ts +4 -0
  231. package/dist/list/ActionToolbar.js +35 -12
  232. package/dist/list/ListFilterBar.d.ts +42 -0
  233. package/dist/list/ListFilterBar.js +789 -0
  234. package/dist/list/ListPage.d.ts +42 -4
  235. package/dist/list/ListPage.js +56 -22
  236. package/dist/list/ListTable.d.ts +27 -3
  237. package/dist/list/ListTable.js +48 -23
  238. package/dist/list/ListToolbar.d.ts +31 -0
  239. package/dist/list/ListToolbar.js +43 -0
  240. package/dist/list/ListViewControls.d.ts +8 -4
  241. package/dist/list/ListViewControls.js +22 -14
  242. package/dist/list/UserHoverCard.d.ts +8 -2
  243. package/dist/list/UserHoverCard.js +26 -13
  244. package/dist/list/filterModel.d.ts +122 -0
  245. package/dist/list/filterModel.js +308 -0
  246. package/dist/list/index.d.ts +6 -2
  247. package/dist/list/index.js +6 -2
  248. package/dist/list/listSearch.d.ts +1 -1
  249. package/dist/list/listSearch.js +8 -4
  250. package/dist/list/listView.d.ts +24 -2
  251. package/dist/list/listView.js +47 -45
  252. package/dist/list/rowMenu.d.ts +10 -5
  253. package/dist/list/rowMenu.js +17 -7
  254. package/dist/list/useListFilters.d.ts +68 -0
  255. package/dist/list/useListFilters.js +252 -0
  256. package/dist/logviewer/LogViewer.js +4 -4
  257. package/dist/styles/theme.css +94 -0
  258. package/dist/styles.css +1 -1
  259. package/package.json +11 -11
  260. package/dist/assets/yaml.worker-k9AdOqzf.js +0 -1441
  261. package/dist/components/fullscreen.d.ts +0 -4
  262. package/dist/components/fullscreen.js +0 -18
@@ -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();
@@ -268,7 +268,7 @@ function ChatMessageList({ messages, allMessages, streamingMessage: streamingMes
268
268
  children: [
269
269
  removable ? /* @__PURE__ */ jsx(ClockIcon, { className: "h-3 w-3" }) : /* @__PURE__ */ jsx(CheckIcon, { className: "h-3 w-3" }),
270
270
  /* @__PURE__ */ jsx("span", { children: status }),
271
- onRemoveQueued && removable && /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("span", {
271
+ onRemoveQueued && removable && /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx("span", {
272
272
  "aria-hidden": "true",
273
273
  children: "·"
274
274
  }), /* @__PURE__ */ jsx("button", {
@@ -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;
@@ -1,7 +1,6 @@
1
- import { cx } from "../../cx.js";
2
- import { panelClassName, panelItemClassName } from "../../components/floating.js";
1
+ import { ListboxOption, ListboxPanel, useListboxNavigation } from "../../components/Listbox.js";
2
+ import { useEffect, useState } from "react";
3
3
  import { jsx, jsxs } from "react/jsx-runtime";
4
- import { useEffect, useId, useState } from "react";
5
4
  //#region src/ai/components/SlashMenu.tsx
6
5
  var MAX_SHOWN = 8;
7
6
  var TYPING_NAME = /^\/([\w:-]*)$/;
@@ -16,8 +15,6 @@ function slashMatches(input, commands) {
16
15
  * from a multi-line composer, so the textarea stays a textbox that points at the list:
17
16
  * spread `inputProps` on it. */
18
17
  function useSlashMenu(input, config, setInput) {
19
- const listId = useId();
20
- const [active, setActive] = useState(0);
21
18
  const [dismissed, setDismissed] = useState(false);
22
19
  const matches = config ? slashMatches(input, config.commands) : [];
23
20
  const exact = matches.length === 1 && `/${matches[0]?.name}` === input;
@@ -27,80 +24,56 @@ function useSlashMenu(input, config, setInput) {
27
24
  useEffect(() => {
28
25
  if (startsCommand) onOpen?.();
29
26
  }, [startsCommand, onOpen]);
27
+ const choose = (name) => setInput(`/${name} `);
28
+ const list = useListboxNavigation({
29
+ items: matches,
30
+ open,
31
+ onChoose: (command) => choose(command.name),
32
+ onDismiss: () => setDismissed(true)
33
+ });
30
34
  const query = TYPING_NAME.exec(input)?.[1] ?? null;
31
35
  const [shownQuery, setShownQuery] = useState(query);
32
36
  if (query !== shownQuery) {
33
37
  setShownQuery(query);
34
- setActive(0);
38
+ list.setActive(0);
35
39
  setDismissed(false);
36
40
  }
37
- const choose = (name) => setInput(`/${name} `);
38
- const shown = Math.min(active, matches.length - 1);
39
41
  /** True when the key belonged to the menu. */
40
- const handleKey = (e) => {
41
- if (!open) return false;
42
- switch (e.key) {
43
- case "ArrowDown":
44
- setActive((i) => (i + 1) % matches.length);
45
- break;
46
- case "ArrowUp":
47
- setActive((i) => (i - 1 + matches.length) % matches.length);
48
- break;
49
- case "Tab":
50
- case "Enter": {
51
- if (e.shiftKey) return false;
52
- const pick = matches[shown];
53
- if (!pick) return false;
54
- choose(pick.name);
55
- break;
56
- }
57
- case "Escape":
58
- setDismissed(true);
59
- break;
60
- default: return false;
61
- }
62
- e.preventDefault();
63
- return true;
64
- };
42
+ const handleKey = (e) => list.handleKey(e);
65
43
  return {
66
44
  open,
67
45
  matches,
68
- active: shown,
46
+ active: list.active,
69
47
  choose,
70
48
  handleKey,
71
- listId,
72
- inputProps: {
73
- "aria-autocomplete": "list",
74
- "aria-controls": open ? listId : void 0,
75
- "aria-activedescendant": open ? optionId(listId, shown) : void 0
76
- }
49
+ listId: list.listId,
50
+ inputProps: list.hostProps,
51
+ list
77
52
  };
78
53
  }
79
- var optionId = (listId, index) => `${listId}-${index}`;
80
- function SlashMenu({ label, listId, matches, active, onChoose }) {
54
+ function SlashMenu({ label, menu, onChoose }) {
81
55
  return /* @__PURE__ */ jsx("div", {
82
- id: listId,
83
- role: "listbox",
84
- "aria-label": label,
85
56
  "data-testid": "slash-menu",
86
- className: cx("absolute bottom-full left-0 right-0 z-20 mb-2 overflow-hidden", "p-1", panelClassName),
87
- children: matches.map((c, i) => /* @__PURE__ */ jsxs("div", {
88
- id: optionId(listId, i),
89
- role: "option",
90
- tabIndex: -1,
91
- "aria-selected": i === active,
92
- "data-highlighted": i === active || void 0,
93
- onMouseDown: (e) => e.preventDefault(),
94
- onClick: () => onChoose(c.name),
95
- className: cx("items-baseline gap-3", panelItemClassName),
96
- children: [/* @__PURE__ */ jsxs("span", {
97
- className: "font-mono",
98
- children: ["/", c.name]
99
- }), c.description && /* @__PURE__ */ jsx("span", {
100
- className: "truncate text-xs text-(--theme-muted-text-color)",
101
- children: c.description
102
- })]
103
- }, c.name))
57
+ className: "absolute bottom-full left-0 right-0 z-20 mb-2",
58
+ children: /* @__PURE__ */ jsx(ListboxPanel, {
59
+ listProps: menu.list.listProps,
60
+ "aria-label": label,
61
+ children: menu.matches.map((c, i) => {
62
+ const option = menu.list.optionProps(i);
63
+ return /* @__PURE__ */ jsx(ListboxOption, {
64
+ option: {
65
+ ...option,
66
+ onClick: () => onChoose(c.name)
67
+ },
68
+ inline: true,
69
+ label: /* @__PURE__ */ jsxs("span", {
70
+ className: "font-mono",
71
+ children: ["/", c.name]
72
+ }),
73
+ description: c.description
74
+ }, c.name);
75
+ })
76
+ })
104
77
  });
105
78
  }
106
79
  //#endregion
@@ -4,8 +4,8 @@ import { Loader } from "../../../components/Loader.js";
4
4
  import { formatCount, formatDuration } from "../../../format.js";
5
5
  import { useElapsed } from "../../../components/relativeTime.js";
6
6
  import { useChatConfig } from "../../core/config.js";
7
- import { jsx, jsxs } from "react/jsx-runtime";
8
7
  import { useEffect, useRef, useState } from "react";
8
+ import { jsx, jsxs } from "react/jsx-runtime";
9
9
  //#region src/ai/components/agent/ActivityLine.tsx
10
10
  function randomIndex() {
11
11
  return Math.floor(Math.random() * 1e6);
@@ -17,14 +17,14 @@ import { useChatConfig } from "../../core/config.js";
17
17
  import Markdown from "../../ui/Markdown.js";
18
18
  import { chatProseClasses } from "../../ui/prose.js";
19
19
  import { Reasoning, ReasoningBody } from "../Reasoning.js";
20
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
21
20
  import { memo, useEffect, useId, useMemo, useState } from "react";
21
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
22
22
  import { DateTime } from "luxon";
23
23
  //#region src/ai/components/agent/AgentMessageParts.tsx
24
24
  var COLLAPSED_RESULT_LINES = 12;
25
25
  function LineSpans({ text, tokens, emphasis }) {
26
26
  const pieces = tokens ?? [{ content: text }];
27
- if (!emphasis || emphasis.length === 0) return /* @__PURE__ */ jsx(Fragment, { children: pieces.map((t, i) => /* @__PURE__ */ jsx("span", {
27
+ if (!emphasis || emphasis.length === 0) return /* @__PURE__ */ jsx(Fragment$1, { children: pieces.map((t, i) => /* @__PURE__ */ jsx("span", {
28
28
  style: t.color ? { color: t.color } : void 0,
29
29
  children: t.content
30
30
  }, i)) });
@@ -47,7 +47,7 @@ function LineSpans({ text, tokens, emphasis }) {
47
47
  }
48
48
  offset += t.content.length;
49
49
  }
50
- return /* @__PURE__ */ jsx(Fragment, { children: out });
50
+ return /* @__PURE__ */ jsx(Fragment$1, { children: out });
51
51
  }
52
52
  function DiffRows({ rows, lang }) {
53
53
  const [tokens, setTokens] = useState(null);
@@ -188,7 +188,7 @@ function ResultBody({ part }) {
188
188
  /** A status mark, which color alone tells apart, with its status in words for
189
189
  * a screen reader. */
190
190
  function StatusMark({ status, children }) {
191
- return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("span", {
191
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx("span", {
192
192
  "aria-hidden": "true",
193
193
  className: "contents",
194
194
  children
@@ -262,7 +262,7 @@ function ToolCallBlock({ part, children }) {
262
262
  onOpenChange: setExpanded,
263
263
  disabled: isDiff,
264
264
  summaryClassName: rowSummaryClasses,
265
- summary: /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(ToolStatusDot, { part }), /* @__PURE__ */ jsxs("span", {
265
+ summary: /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(ToolStatusDot, { part }), /* @__PURE__ */ jsxs("span", {
266
266
  className: "font-mono text-[13px] leading-5 min-w-0 truncate",
267
267
  children: [/* @__PURE__ */ jsx("span", {
268
268
  className: "font-semibold",
@@ -320,14 +320,14 @@ function DecisionLine({ decision }) {
320
320
  className: "flex min-w-0 flex-wrap items-baseline gap-x-1",
321
321
  children: [
322
322
  /* @__PURE__ */ jsx("span", { children: decisionLabel(decision, strings.agentTranscript) }),
323
- decision.at && /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("span", {
323
+ decision.at && /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx("span", {
324
324
  "aria-hidden": "true",
325
325
  children: "·"
326
326
  }), /* @__PURE__ */ jsx(RelativeTime, {
327
327
  value: decision.at,
328
328
  className: "shrink-0"
329
329
  })] }),
330
- decision.note && /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("span", {
330
+ decision.note && /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx("span", {
331
331
  "aria-hidden": "true",
332
332
  children: "·"
333
333
  }), /* @__PURE__ */ jsx("span", {
@@ -362,7 +362,7 @@ function SubagentCard({ part }) {
362
362
  onOpenChange: setExpanded,
363
363
  disabled: !canExpand,
364
364
  summaryClassName: rowSummaryClasses,
365
- summary: /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(StatusMark, {
365
+ summary: /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(StatusMark, {
366
366
  status: part.status === "running" ? t.running : part.status === "failed" ? t.failed : t.done,
367
367
  children: part.status === "running" ? /* @__PURE__ */ jsx("span", {
368
368
  className: "mt-[3px]",
@@ -437,7 +437,7 @@ function ConfirmApproval({ part, onAnswer }) {
437
437
  path: [t.allowPath, t.denyPath],
438
438
  call: [t.allowCall, t.denyCall]
439
439
  }[part.subject ?? "command"];
440
- return /* @__PURE__ */ jsxs(Fragment, { children: [
440
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [
441
441
  part.command && /* @__PURE__ */ jsx("pre", {
442
442
  className: "overflow-x-auto rounded-md bg-(--theme-muted-panel-bg) p-2 font-mono text-xs whitespace-pre-wrap",
443
443
  children: part.command
@@ -525,7 +525,7 @@ function AskApproval({ part, onAnswer }) {
525
525
  kind: "ask",
526
526
  text
527
527
  });
528
- if (!onAnswer) return /* @__PURE__ */ jsxs(Fragment, { children: [
528
+ if (!onAnswer) return /* @__PURE__ */ jsxs(Fragment$1, { children: [
529
529
  part.question && /* @__PURE__ */ jsx("div", {
530
530
  className: "text-sm",
531
531
  children: part.question
@@ -542,7 +542,7 @@ function AskApproval({ part, onAnswer }) {
542
542
  children: t.approvalPending
543
543
  })
544
544
  ] });
545
- return /* @__PURE__ */ jsxs(Fragment, { children: [part.question && /* @__PURE__ */ jsx("div", {
545
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [part.question && /* @__PURE__ */ jsx("div", {
546
546
  className: "text-sm",
547
547
  children: part.question
548
548
  }), own === null ? /* @__PURE__ */ jsxs("div", {
@@ -617,7 +617,7 @@ function ApprovalBlock({ part, onApprovalAnswer }) {
617
617
  function PlanApproval({ part }) {
618
618
  const { strings } = useChatConfig();
619
619
  const t = strings.agentTranscript;
620
- return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("div", {
620
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx("div", {
621
621
  className: "text-xs theme-muted-text",
622
622
  children: t.planPending
623
623
  }), part.plan && /* @__PURE__ */ jsx("div", {
@@ -877,7 +877,7 @@ function RollupGroup({ members, message }) {
877
877
  children: /* @__PURE__ */ jsx(Disclosure, {
878
878
  keepMounted: true,
879
879
  summaryClassName: rowSummaryClasses,
880
- summary: /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("span", {
880
+ summary: /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx("span", {
881
881
  className: "text-(--theme-success) leading-none",
882
882
  "aria-hidden": "true",
883
883
  children: "●"