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