dsh-plugin-core 0.2.14 → 0.3.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.
- package/README.md +52 -83
- package/dist/design/tokens-css.d.ts +1 -1
- package/dist/design/tokens-css.d.ts.map +1 -1
- package/dist/design/tokens-css.generated.d.ts +2 -0
- package/dist/design/tokens-css.generated.d.ts.map +1 -0
- package/dist/design/tokens-css.generated.js +4 -0
- package/dist/design/tokens-css.generated.js.map +1 -0
- package/dist/design/tokens-css.js +1 -252
- package/dist/design/tokens-css.js.map +1 -1
- package/dist/explorer/FileBrowser.d.ts +41 -0
- package/dist/explorer/FileBrowser.d.ts.map +1 -0
- package/dist/explorer/FileBrowser.js +659 -0
- package/dist/explorer/FileBrowser.js.map +1 -0
- package/dist/explorer/explorer-css.d.ts +1 -1
- package/dist/explorer/explorer-css.d.ts.map +1 -1
- package/dist/explorer/explorer-css.generated.d.ts +2 -0
- package/dist/explorer/explorer-css.generated.d.ts.map +1 -0
- package/dist/explorer/explorer-css.generated.js +4 -0
- package/dist/explorer/explorer-css.generated.js.map +1 -0
- package/dist/explorer/explorer-css.js +1 -31
- package/dist/explorer/explorer-css.js.map +1 -1
- package/dist/explorer/index.d.ts +4 -2
- package/dist/explorer/index.d.ts.map +1 -1
- package/dist/explorer/index.js +4 -2
- package/dist/explorer/index.js.map +1 -1
- package/dist/explorer/open.d.ts +103 -0
- package/dist/explorer/open.d.ts.map +1 -0
- package/dist/explorer/open.js +282 -0
- package/dist/explorer/open.js.map +1 -0
- package/dist/explorer/preview/BytesPreview.d.ts +13 -0
- package/dist/explorer/preview/BytesPreview.d.ts.map +1 -0
- package/dist/explorer/preview/BytesPreview.js +56 -0
- package/dist/explorer/preview/BytesPreview.js.map +1 -0
- package/dist/explorer/preview/HtmlPreview.d.ts +18 -0
- package/dist/explorer/preview/HtmlPreview.d.ts.map +1 -0
- package/dist/explorer/preview/HtmlPreview.js +112 -0
- package/dist/explorer/preview/HtmlPreview.js.map +1 -0
- package/dist/explorer/preview/OfficePreview.d.ts +11 -0
- package/dist/explorer/preview/OfficePreview.d.ts.map +1 -0
- package/dist/explorer/preview/OfficePreview.js +53 -0
- package/dist/explorer/preview/OfficePreview.js.map +1 -0
- package/dist/explorer/preview/TextPreview.d.ts +17 -0
- package/dist/explorer/preview/TextPreview.d.ts.map +1 -0
- package/dist/explorer/preview/TextPreview.js +95 -0
- package/dist/explorer/preview/TextPreview.js.map +1 -0
- package/dist/explorer/preview/index.d.ts +10 -3
- package/dist/explorer/preview/index.d.ts.map +1 -1
- package/dist/explorer/preview/index.js +52 -55
- package/dist/explorer/preview/index.js.map +1 -1
- package/dist/explorer/preview/md-labels.d.ts +3 -0
- package/dist/explorer/preview/md-labels.d.ts.map +1 -0
- package/dist/explorer/preview/md-labels.js +12 -0
- package/dist/explorer/preview/md-labels.js.map +1 -0
- package/dist/explorer/types.d.ts +186 -4
- package/dist/explorer/types.d.ts.map +1 -1
- package/dist/explorer/types.js +401 -14
- package/dist/explorer/types.js.map +1 -1
- package/dist/host/index.d.ts +66 -0
- package/dist/host/index.d.ts.map +1 -0
- package/dist/host/index.js +60 -0
- package/dist/host/index.js.map +1 -0
- package/dist/session/SessionViewModal.d.ts +42 -0
- package/dist/session/SessionViewModal.d.ts.map +1 -0
- package/dist/session/SessionViewModal.js +997 -0
- package/dist/session/SessionViewModal.js.map +1 -0
- package/dist/session/changes.d.ts +73 -0
- package/dist/session/changes.d.ts.map +1 -0
- package/dist/session/changes.js +134 -0
- package/dist/session/changes.js.map +1 -0
- package/dist/session/faces.d.ts +198 -0
- package/dist/session/faces.d.ts.map +1 -0
- package/dist/session/faces.js +17 -0
- package/dist/session/faces.js.map +1 -0
- package/dist/session/index.d.ts +5 -23
- package/dist/session/index.d.ts.map +1 -1
- package/dist/session/index.js +25 -70
- package/dist/session/index.js.map +1 -1
- package/dist/session/mirror/ChangedFileDiff.d.ts +22 -0
- package/dist/session/mirror/ChangedFileDiff.d.ts.map +1 -0
- package/dist/session/mirror/ChangedFileDiff.js +157 -0
- package/dist/session/mirror/ChangedFileDiff.js.map +1 -0
- package/dist/session/mirror/ChangedFilesCard.d.ts +18 -0
- package/dist/session/mirror/ChangedFilesCard.d.ts.map +1 -0
- package/dist/session/mirror/ChangedFilesCard.js +158 -0
- package/dist/session/mirror/ChangedFilesCard.js.map +1 -0
- package/dist/session/mirror/ChatGroupSeat.d.ts +24 -0
- package/dist/session/mirror/ChatGroupSeat.d.ts.map +1 -0
- package/dist/session/mirror/ChatGroupSeat.js +134 -0
- package/dist/session/mirror/ChatGroupSeat.js.map +1 -0
- package/dist/session/mirror/ChatNodeSeat.d.ts +43 -0
- package/dist/session/mirror/ChatNodeSeat.d.ts.map +1 -0
- package/dist/session/mirror/ChatNodeSeat.js +133 -0
- package/dist/session/mirror/ChatNodeSeat.js.map +1 -0
- package/dist/session/mirror/ChatView.d.ts +47 -0
- package/dist/session/mirror/ChatView.d.ts.map +1 -0
- package/dist/session/mirror/ChatView.js +127 -0
- package/dist/session/mirror/ChatView.js.map +1 -0
- package/dist/session/mirror/CommandCard.d.ts +20 -0
- package/dist/session/mirror/CommandCard.d.ts.map +1 -0
- package/dist/session/mirror/CommandCard.js +69 -0
- package/dist/session/mirror/CommandCard.js.map +1 -0
- package/dist/session/mirror/Deliverables.d.ts +24 -0
- package/dist/session/mirror/Deliverables.d.ts.map +1 -0
- package/dist/session/mirror/Deliverables.js +134 -0
- package/dist/session/mirror/Deliverables.js.map +1 -0
- package/dist/session/mirror/GenericCommandCard.d.ts +25 -0
- package/dist/session/mirror/GenericCommandCard.d.ts.map +1 -0
- package/dist/session/mirror/GenericCommandCard.js +567 -0
- package/dist/session/mirror/GenericCommandCard.js.map +1 -0
- package/dist/session/mirror/MessageIconActions.d.ts +16 -0
- package/dist/session/mirror/MessageIconActions.d.ts.map +1 -0
- package/dist/session/mirror/MessageIconActions.js +71 -0
- package/dist/session/mirror/MessageIconActions.js.map +1 -0
- package/dist/session/mirror/MessageItem.d.ts +66 -0
- package/dist/session/mirror/MessageItem.d.ts.map +1 -0
- package/dist/session/mirror/MessageItem.js +135 -0
- package/dist/session/mirror/MessageItem.js.map +1 -0
- package/dist/session/mirror/ReasoningRow.d.ts +11 -0
- package/dist/session/mirror/ReasoningRow.d.ts.map +1 -0
- package/dist/session/mirror/ReasoningRow.js +49 -0
- package/dist/session/mirror/ReasoningRow.js.map +1 -0
- package/dist/session/mirror/StatDialog.d.ts +20 -0
- package/dist/session/mirror/StatDialog.d.ts.map +1 -0
- package/dist/session/mirror/StatDialog.js +36 -0
- package/dist/session/mirror/StatDialog.js.map +1 -0
- package/dist/session/mirror/TurnProcessNodeView.d.ts +10 -0
- package/dist/session/mirror/TurnProcessNodeView.d.ts.map +1 -0
- package/dist/session/mirror/TurnProcessNodeView.js +68 -0
- package/dist/session/mirror/TurnProcessNodeView.js.map +1 -0
- package/dist/session/mirror/TurnTailNodeView.d.ts +32 -0
- package/dist/session/mirror/TurnTailNodeView.d.ts.map +1 -0
- package/dist/session/mirror/TurnTailNodeView.js +48 -0
- package/dist/session/mirror/TurnTailNodeView.js.map +1 -0
- package/dist/session/mirror/TurnTriggerNodeView.d.ts +14 -0
- package/dist/session/mirror/TurnTriggerNodeView.d.ts.map +1 -0
- package/dist/session/mirror/TurnTriggerNodeView.js +87 -0
- package/dist/session/mirror/TurnTriggerNodeView.js.map +1 -0
- package/dist/session/mirror/TurnUsagePanel.d.ts +21 -0
- package/dist/session/mirror/TurnUsagePanel.d.ts.map +1 -0
- package/dist/session/mirror/TurnUsagePanel.js +41 -0
- package/dist/session/mirror/TurnUsagePanel.js.map +1 -0
- package/dist/session/mirror/message-chrome.d.ts +33 -0
- package/dist/session/mirror/message-chrome.d.ts.map +1 -0
- package/dist/session/mirror/message-chrome.js +158 -0
- package/dist/session/mirror/message-chrome.js.map +1 -0
- package/dist/session/mirror/process-groups.d.ts +56 -0
- package/dist/session/mirror/process-groups.d.ts.map +1 -0
- package/dist/session/mirror/process-groups.js +202 -0
- package/dist/session/mirror/process-groups.js.map +1 -0
- package/dist/session/official-classes.d.ts +28 -0
- package/dist/session/official-classes.d.ts.map +1 -0
- package/dist/session/official-classes.js +146 -0
- package/dist/session/official-classes.js.map +1 -0
- package/dist/session/open-session-view.d.ts +17 -0
- package/dist/session/open-session-view.d.ts.map +1 -0
- package/dist/session/open-session-view.js +136 -0
- package/dist/session/open-session-view.js.map +1 -0
- package/dist/session/session-css.d.ts +1 -1
- package/dist/session/session-css.d.ts.map +1 -1
- package/dist/session/session-css.generated.d.ts +2 -0
- package/dist/session/session-css.generated.d.ts.map +1 -0
- package/dist/session/session-css.generated.js +4 -0
- package/dist/session/session-css.generated.js.map +1 -0
- package/dist/session/session-css.js +1 -17
- package/dist/session/session-css.js.map +1 -1
- package/dist/ui/AlertModal.d.ts +28 -0
- package/dist/ui/AlertModal.d.ts.map +1 -0
- package/dist/ui/AlertModal.js +29 -0
- package/dist/ui/AlertModal.js.map +1 -0
- package/dist/ui/Button.d.ts.map +1 -1
- package/dist/ui/Button.js +14 -1
- package/dist/ui/Button.js.map +1 -1
- package/dist/ui/Card.d.ts +4 -2
- package/dist/ui/Card.d.ts.map +1 -1
- package/dist/ui/Card.js +12 -6
- package/dist/ui/Card.js.map +1 -1
- package/dist/ui/Chip.d.ts +9 -1
- package/dist/ui/Chip.d.ts.map +1 -1
- package/dist/ui/Chip.js +8 -2
- package/dist/ui/Chip.js.map +1 -1
- package/dist/ui/CodeViewer.d.ts +36 -0
- package/dist/ui/CodeViewer.d.ts.map +1 -0
- package/dist/ui/CodeViewer.js +90 -0
- package/dist/ui/CodeViewer.js.map +1 -0
- package/dist/ui/ConfirmModal.d.ts +30 -0
- package/dist/ui/ConfirmModal.d.ts.map +1 -0
- package/dist/ui/ConfirmModal.js +23 -0
- package/dist/ui/ConfirmModal.js.map +1 -0
- package/dist/ui/DateTimePicker.d.ts +45 -0
- package/dist/ui/DateTimePicker.d.ts.map +1 -0
- package/dist/ui/DateTimePicker.js +447 -0
- package/dist/ui/DateTimePicker.js.map +1 -0
- package/dist/ui/Field.d.ts +11 -2
- package/dist/ui/Field.d.ts.map +1 -1
- package/dist/ui/Field.js +15 -5
- package/dist/ui/Field.js.map +1 -1
- package/dist/ui/MarqueeText.d.ts.map +1 -1
- package/dist/ui/MarqueeText.js +3 -1
- package/dist/ui/MarqueeText.js.map +1 -1
- package/dist/ui/Modal.d.ts +25 -3
- package/dist/ui/Modal.d.ts.map +1 -1
- package/dist/ui/Modal.js +41 -7
- package/dist/ui/Modal.js.map +1 -1
- package/dist/ui/ModelPicker.d.ts +25 -12
- package/dist/ui/ModelPicker.d.ts.map +1 -1
- package/dist/ui/ModelPicker.js +67 -19
- package/dist/ui/ModelPicker.js.map +1 -1
- package/dist/ui/PanelDock.d.ts +127 -0
- package/dist/ui/PanelDock.d.ts.map +1 -0
- package/dist/ui/PanelDock.js +297 -0
- package/dist/ui/PanelDock.js.map +1 -0
- package/dist/ui/Picker.d.ts +8 -2
- package/dist/ui/Picker.d.ts.map +1 -1
- package/dist/ui/Picker.js +86 -18
- package/dist/ui/Picker.js.map +1 -1
- package/dist/ui/SectionHead.d.ts +3 -3
- package/dist/ui/SectionHead.d.ts.map +1 -1
- package/dist/ui/SectionHead.js +4 -4
- package/dist/ui/SectionHead.js.map +1 -1
- package/dist/ui/Segmented.d.ts +2 -0
- package/dist/ui/Segmented.d.ts.map +1 -1
- package/dist/ui/Segmented.js +3 -1
- package/dist/ui/Segmented.js.map +1 -1
- package/dist/ui/Textarea.d.ts +2 -0
- package/dist/ui/Textarea.d.ts.map +1 -1
- package/dist/ui/Textarea.js +6 -1
- package/dist/ui/Textarea.js.map +1 -1
- package/dist/ui/Toast.d.ts +41 -8
- package/dist/ui/Toast.d.ts.map +1 -1
- package/dist/ui/Toast.js +216 -28
- package/dist/ui/Toast.js.map +1 -1
- package/dist/ui/WorkspacePicker.d.ts +15 -28
- package/dist/ui/WorkspacePicker.d.ts.map +1 -1
- package/dist/ui/WorkspacePicker.js +18 -27
- package/dist/ui/WorkspacePicker.js.map +1 -1
- package/dist/ui/card-css.d.ts +1 -1
- package/dist/ui/card-css.d.ts.map +1 -1
- package/dist/ui/card-css.generated.d.ts +2 -0
- package/dist/ui/card-css.generated.d.ts.map +1 -0
- package/dist/ui/card-css.generated.js +4 -0
- package/dist/ui/card-css.generated.js.map +1 -0
- package/dist/ui/card-css.js +1 -35
- package/dist/ui/card-css.js.map +1 -1
- package/dist/ui/chip-css.d.ts +1 -1
- package/dist/ui/chip-css.d.ts.map +1 -1
- package/dist/ui/chip-css.generated.d.ts +2 -0
- package/dist/ui/chip-css.generated.d.ts.map +1 -0
- package/dist/ui/chip-css.generated.js +4 -0
- package/dist/ui/chip-css.generated.js.map +1 -0
- package/dist/ui/chip-css.js +1 -17
- package/dist/ui/chip-css.js.map +1 -1
- package/dist/ui/code-viewer-css.d.ts +2 -0
- package/dist/ui/code-viewer-css.d.ts.map +1 -0
- package/dist/ui/code-viewer-css.generated.d.ts +2 -0
- package/dist/ui/code-viewer-css.generated.d.ts.map +1 -0
- package/dist/ui/code-viewer-css.generated.js +4 -0
- package/dist/ui/code-viewer-css.generated.js.map +1 -0
- package/dist/ui/code-viewer-css.js +3 -0
- package/dist/ui/code-viewer-css.js.map +1 -0
- package/dist/ui/code-viewer-lang.d.ts +15 -0
- package/dist/ui/code-viewer-lang.d.ts.map +1 -0
- package/dist/ui/code-viewer-lang.js +190 -0
- package/dist/ui/code-viewer-lang.js.map +1 -0
- package/dist/ui/code-viewer-theme.d.ts +5 -0
- package/dist/ui/code-viewer-theme.d.ts.map +1 -0
- package/dist/ui/code-viewer-theme.js +138 -0
- package/dist/ui/code-viewer-theme.js.map +1 -0
- package/dist/ui/controls/back-to-top-css.generated.d.ts +2 -0
- package/dist/ui/controls/back-to-top-css.generated.d.ts.map +1 -0
- package/dist/ui/controls/back-to-top-css.generated.js +4 -0
- package/dist/ui/controls/back-to-top-css.generated.js.map +1 -0
- package/dist/ui/controls/button-css.generated.d.ts +2 -0
- package/dist/ui/controls/button-css.generated.d.ts.map +1 -0
- package/dist/ui/controls/button-css.generated.js +4 -0
- package/dist/ui/controls/button-css.generated.js.map +1 -0
- package/dist/ui/controls/datetime-css.generated.d.ts +2 -0
- package/dist/ui/controls/datetime-css.generated.d.ts.map +1 -0
- package/dist/ui/controls/datetime-css.generated.js +4 -0
- package/dist/ui/controls/datetime-css.generated.js.map +1 -0
- package/dist/ui/controls/field-css.generated.d.ts +2 -0
- package/dist/ui/controls/field-css.generated.d.ts.map +1 -0
- package/dist/ui/controls/field-css.generated.js +4 -0
- package/dist/ui/controls/field-css.generated.js.map +1 -0
- package/dist/ui/controls/hint-css.generated.d.ts +2 -0
- package/dist/ui/controls/hint-css.generated.d.ts.map +1 -0
- package/dist/ui/controls/hint-css.generated.js +4 -0
- package/dist/ui/controls/hint-css.generated.js.map +1 -0
- package/dist/ui/controls/loading-css.generated.d.ts +2 -0
- package/dist/ui/controls/loading-css.generated.d.ts.map +1 -0
- package/dist/ui/controls/loading-css.generated.js +4 -0
- package/dist/ui/controls/loading-css.generated.js.map +1 -0
- package/dist/ui/controls/segmented-css.generated.d.ts +2 -0
- package/dist/ui/controls/segmented-css.generated.d.ts.map +1 -0
- package/dist/ui/controls/segmented-css.generated.js +4 -0
- package/dist/ui/controls/segmented-css.generated.js.map +1 -0
- package/dist/ui/controls-css.d.ts +7 -8
- package/dist/ui/controls-css.d.ts.map +1 -1
- package/dist/ui/controls-css.js +13 -11
- package/dist/ui/controls-css.js.map +1 -1
- package/dist/ui/css.d.ts +5 -0
- package/dist/ui/css.d.ts.map +1 -1
- package/dist/ui/css.js +13 -4
- package/dist/ui/css.js.map +1 -1
- package/dist/ui/datetime-logic.d.ts +100 -0
- package/dist/ui/datetime-logic.d.ts.map +1 -0
- package/dist/ui/datetime-logic.js +193 -0
- package/dist/ui/datetime-logic.js.map +1 -0
- package/dist/ui/feedback-css.d.ts +1 -1
- package/dist/ui/feedback-css.d.ts.map +1 -1
- package/dist/ui/feedback-css.generated.d.ts +2 -0
- package/dist/ui/feedback-css.generated.d.ts.map +1 -0
- package/dist/ui/feedback-css.generated.js +4 -0
- package/dist/ui/feedback-css.generated.js.map +1 -0
- package/dist/ui/feedback-css.js +1 -53
- package/dist/ui/feedback-css.js.map +1 -1
- package/dist/ui/host-data.d.ts +103 -0
- package/dist/ui/host-data.d.ts.map +1 -0
- package/dist/ui/host-data.js +106 -0
- package/dist/ui/host-data.js.map +1 -0
- package/dist/ui/host-toast.d.ts +23 -0
- package/dist/ui/host-toast.d.ts.map +1 -0
- package/dist/ui/host-toast.js +34 -0
- package/dist/ui/host-toast.js.map +1 -0
- package/dist/ui/index.d.ts +12 -6
- package/dist/ui/index.d.ts.map +1 -1
- package/dist/ui/index.js +10 -4
- package/dist/ui/index.js.map +1 -1
- package/dist/ui/marquee-css.d.ts +2 -0
- package/dist/ui/marquee-css.d.ts.map +1 -0
- package/dist/ui/marquee-css.generated.d.ts +2 -0
- package/dist/ui/marquee-css.generated.d.ts.map +1 -0
- package/dist/ui/marquee-css.generated.js +4 -0
- package/dist/ui/marquee-css.generated.js.map +1 -0
- package/dist/ui/marquee-css.js +4 -0
- package/dist/ui/marquee-css.js.map +1 -0
- package/dist/ui/modal-host.d.ts +30 -0
- package/dist/ui/modal-host.d.ts.map +1 -0
- package/dist/ui/modal-host.js +101 -0
- package/dist/ui/modal-host.js.map +1 -0
- package/dist/ui/official.d.ts.map +1 -1
- package/dist/ui/official.js +45 -1
- package/dist/ui/official.js.map +1 -1
- package/dist/ui/panel-dock-css.d.ts +2 -0
- package/dist/ui/panel-dock-css.d.ts.map +1 -0
- package/dist/ui/panel-dock-css.generated.d.ts +2 -0
- package/dist/ui/panel-dock-css.generated.d.ts.map +1 -0
- package/dist/ui/panel-dock-css.generated.js +4 -0
- package/dist/ui/panel-dock-css.generated.js.map +1 -0
- package/dist/ui/panel-dock-css.js +4 -0
- package/dist/ui/panel-dock-css.js.map +1 -0
- package/dist/ui/panel-dock-logic.d.ts +50 -0
- package/dist/ui/panel-dock-logic.d.ts.map +1 -0
- package/dist/ui/panel-dock-logic.js +64 -0
- package/dist/ui/panel-dock-logic.js.map +1 -0
- package/dist/ui/picker-css.d.ts +1 -1
- package/dist/ui/picker-css.d.ts.map +1 -1
- package/dist/ui/picker-css.generated.d.ts +2 -0
- package/dist/ui/picker-css.generated.d.ts.map +1 -0
- package/dist/ui/picker-css.generated.js +4 -0
- package/dist/ui/picker-css.generated.js.map +1 -0
- package/dist/ui/picker-css.js +1 -48
- package/dist/ui/picker-css.js.map +1 -1
- package/dist/ui/picker-icons.d.ts +12 -0
- package/dist/ui/picker-icons.d.ts.map +1 -0
- package/dist/ui/picker-icons.js +29 -0
- package/dist/ui/picker-icons.js.map +1 -0
- package/dist/ui/picker-logic.d.ts +4 -1
- package/dist/ui/picker-logic.d.ts.map +1 -1
- package/dist/ui/picker-logic.js +1 -2
- package/dist/ui/picker-logic.js.map +1 -1
- package/dist/ui/resizer.d.ts +3 -1
- package/dist/ui/resizer.d.ts.map +1 -1
- package/dist/ui/resizer.js +1 -1
- package/dist/ui/resizer.js.map +1 -1
- package/dist/ui/toast-host.d.ts +24 -0
- package/dist/ui/toast-host.d.ts.map +1 -0
- package/dist/ui/toast-host.js +20 -0
- package/dist/ui/toast-host.js.map +1 -0
- package/dist/utils/date.d.ts +8 -0
- package/dist/utils/date.d.ts.map +1 -1
- package/dist/utils/date.js +16 -0
- package/dist/utils/date.js.map +1 -1
- package/dist/utils/i18n.d.ts +1 -1
- package/dist/utils/i18n.d.ts.map +1 -1
- package/dist/utils/i18n.js +437 -18
- package/dist/utils/i18n.js.map +1 -1
- package/dist/utils/index.d.ts +1 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -1
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/path.d.ts.map +1 -1
- package/dist/utils/path.js +1 -0
- package/dist/utils/path.js.map +1 -1
- package/docs/README.md +12 -5
- package/docs/design/architecture.md +38 -8
- package/docs/design/copywriting.md +95 -0
- package/docs/design/doc-format.md +80 -0
- package/docs/design/doc-format.ts +39 -0
- package/docs/design/external/dsh-host.md +150 -1
- package/docs/design/features.md +4 -17
- package/docs/design/methods.md +13 -34
- package/docs/design/structure.md +25 -22
- package/docs/design/style.md +24 -50
- package/docs/help/design.doc.ts +112 -0
- package/docs/help/design.md +88 -0
- package/docs/help/explorer.doc.ts +136 -0
- package/docs/help/explorer.md +68 -0
- package/docs/help/index.doc.ts +79 -0
- package/docs/help/index.md +28 -0
- package/docs/help/integration.doc.ts +114 -0
- package/docs/help/integration.md +127 -0
- package/docs/help/methods.md +58 -0
- package/docs/help/session.doc.ts +154 -0
- package/docs/help/session.md +91 -0
- package/docs/help/style.md +80 -0
- package/docs/help/ui.doc.ts +404 -0
- package/docs/help/ui.md +342 -0
- package/docs/help/utils.doc.ts +133 -0
- package/docs/help/utils.md +96 -0
- package/docs/requirements.md +33 -12
- package/package.json +44 -3
- package/dist/ui/ErrorBoundary.d.ts +0 -22
- package/dist/ui/ErrorBoundary.d.ts.map +0 -1
- package/dist/ui/ErrorBoundary.js +0 -30
- package/dist/ui/ErrorBoundary.js.map +0 -1
- package/docs/design/features/design.md +0 -55
- package/docs/design/features/explorer.md +0 -73
- package/docs/design/features/session.md +0 -70
- package/docs/design/features/ui.md +0 -225
- package/docs/design/features/utils.md +0 -64
- package/docs/examples/integration.md +0 -103
package/dist/explorer/types.js
CHANGED
|
@@ -1,20 +1,407 @@
|
|
|
1
|
-
//
|
|
1
|
+
// 与宿主「工作区文件」能力对接的**最小接口面** + 文件浏览的纯逻辑。
|
|
2
|
+
//
|
|
3
|
+
// 本文件是 explorer 的纯逻辑层:**零 React、零官方件**——node 单测直接引它
|
|
4
|
+
// (面板/预览体在别的文件,静态 import 官方 primitives,Node 下会
|
|
5
|
+
// ERR_MODULE_NOT_FOUND,那是宿主才有的平台模块)。
|
|
2
6
|
//
|
|
3
7
|
// 为什么不直接用 `ctx`:ctx 是宿主给的整个大对象,传进来就把本包和宿主版本焊死了。
|
|
4
8
|
// 插件从 ctx 里取出这一小块传给我们,宿主 breaking 时改的是插件「取出」的一行(需求文档 §5.5)。
|
|
5
|
-
import { extOf, mimeOf } from '../utils/path.js';
|
|
6
|
-
/**
|
|
7
|
-
export
|
|
8
|
-
|
|
9
|
-
|
|
9
|
+
import { extOf, mimeOf, parentOf } from '../utils/path.js';
|
|
10
|
+
/** HTML 静态预览的扩展名(与官方 htmlBodyDefinition 同款)。 */
|
|
11
|
+
export const HTML_KINDS = ['html', 'htm'];
|
|
12
|
+
/**
|
|
13
|
+
* Office 预览扩展名(官方 remote.officeToPdf 转 PDF 后再渲染)。
|
|
14
|
+
* ⚠️ 官方 OfficeExtension 还含 xls / xlsx,按兄弟项目 2026-10-05 拍板「Excel 向后讨论」不纳入。
|
|
15
|
+
*/
|
|
16
|
+
export const OFFICE_KINDS = ['doc', 'docx', 'ppt', 'pptx'];
|
|
17
|
+
/** 源码态读取上限(256K,UTF-8 边界安全由截断处处理)。 */
|
|
18
|
+
export const SOURCE_MAX_BYTES = 256 * 1024;
|
|
19
|
+
/**
|
|
20
|
+
* 按扩展名分发预览类型。**没有 unsupported 档**:认不出的扩展名一律按 text 走,
|
|
21
|
+
* 由 read 抛 not-text 落「不是文本文件」空态——官方 read 才是真源,不本地猜二进制清单。
|
|
22
|
+
*/
|
|
23
|
+
export function previewInfoOf(path) {
|
|
10
24
|
const ext = extOf(path);
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
25
|
+
const mime = mimeOf(path);
|
|
26
|
+
if (mime !== undefined)
|
|
27
|
+
return { kind: 'image', ext, mime };
|
|
28
|
+
if (ext === 'pdf')
|
|
29
|
+
return { kind: 'pdf', ext, mime: 'application/pdf' };
|
|
30
|
+
if (ext === 'md' || ext === 'markdown')
|
|
31
|
+
return { kind: 'md', ext };
|
|
32
|
+
if (HTML_KINDS.includes(ext))
|
|
33
|
+
return { kind: 'html', ext };
|
|
34
|
+
if (OFFICE_KINDS.includes(ext))
|
|
35
|
+
return { kind: 'office', ext, mime: 'application/pdf' };
|
|
36
|
+
return { kind: 'text', ext };
|
|
37
|
+
}
|
|
38
|
+
/** 只要 kind(兼容旧用法);要 ext/mime 用 previewInfoOf。 */
|
|
39
|
+
export function previewKindOf(path) {
|
|
40
|
+
return previewInfoOf(path).kind;
|
|
41
|
+
}
|
|
42
|
+
export function unwrapEnvelope(result) {
|
|
43
|
+
if (typeof result === 'object' && result !== null) {
|
|
44
|
+
const r = result;
|
|
45
|
+
if (r.ok === false)
|
|
46
|
+
return { kind: 'error', error: r.error };
|
|
47
|
+
if (r.ok === true && 'value' in r)
|
|
48
|
+
return { kind: 'ok', payload: r.value };
|
|
49
|
+
}
|
|
50
|
+
return { kind: 'ok', payload: result };
|
|
51
|
+
}
|
|
52
|
+
/** 失败分支判空(TS 收窄用)。 */
|
|
53
|
+
export function isFailed(value) {
|
|
54
|
+
return typeof value === 'object' && value !== null && 'failed' in value;
|
|
55
|
+
}
|
|
56
|
+
/** `list` 结果防御解析:返回 Listing 或失败/非法信封。 */
|
|
57
|
+
export function listingOf(result) {
|
|
58
|
+
const envelope = unwrapEnvelope(result);
|
|
59
|
+
if (envelope.kind === 'error')
|
|
60
|
+
return { failed: envelope.error };
|
|
61
|
+
const raw = envelope.payload;
|
|
62
|
+
if (typeof raw !== 'object' || raw === null) {
|
|
63
|
+
console.warn('[dsh-plugin-core:explorer] list 返回非对象');
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
const r = raw;
|
|
67
|
+
if (typeof r.path !== 'string' || !Array.isArray(r.entries) || typeof r.truncated !== 'boolean') {
|
|
68
|
+
console.warn('[dsh-plugin-core:explorer] list 返回形状不符契约');
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
return { path: r.path, entries: r.entries, truncated: r.truncated };
|
|
72
|
+
}
|
|
73
|
+
/** `read` 结果防御解析:page.text 必须是字符串,否则错误态(防渲染器内部抛错整页黑屏)。 */
|
|
74
|
+
export function textPageOf(result) {
|
|
75
|
+
const envelope = unwrapEnvelope(result);
|
|
76
|
+
if (envelope.kind === 'error')
|
|
77
|
+
return { failed: envelope.error };
|
|
78
|
+
const raw = envelope.payload;
|
|
79
|
+
if (typeof raw !== 'object' || raw === null) {
|
|
80
|
+
console.warn('[dsh-plugin-core:explorer] read 返回非对象');
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
const r = raw;
|
|
84
|
+
if (typeof r.text !== 'string') {
|
|
85
|
+
console.warn('[dsh-plugin-core:explorer] read 返回形状不符契约(无 text 字段)');
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
const offset = typeof r.offset === 'number' ? r.offset : 0;
|
|
89
|
+
const lines = typeof r.lines === 'number' ? r.lines : r.text === '' ? 0 : r.text.split('\n').length;
|
|
90
|
+
return { text: r.text, offset, lines, eof: r.eof !== false };
|
|
91
|
+
}
|
|
92
|
+
/** `readBytes` 结果防御解析:data 必须是 Uint8Array,否则错误态。 */
|
|
93
|
+
export function bytesOf(result) {
|
|
94
|
+
const envelope = unwrapEnvelope(result);
|
|
95
|
+
if (envelope.kind === 'error')
|
|
96
|
+
return { failed: envelope.error };
|
|
97
|
+
const data = envelope.payload?.data;
|
|
98
|
+
if (data instanceof Uint8Array)
|
|
99
|
+
return data;
|
|
100
|
+
console.warn('[dsh-plugin-core:explorer] readBytes 返回形状不符契约');
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
/** `stat` 结果防御解析:只取 absolutePath(信封剥壳同款;stat 仅认 regular file)。 */
|
|
104
|
+
export function absolutePathOf(result) {
|
|
105
|
+
const envelope = unwrapEnvelope(result);
|
|
106
|
+
if (envelope.kind === 'error')
|
|
107
|
+
return null;
|
|
108
|
+
const raw = envelope.payload;
|
|
109
|
+
if (typeof raw !== 'object' || raw === null)
|
|
110
|
+
return null;
|
|
111
|
+
const abs = raw.absolutePath;
|
|
112
|
+
return typeof abs === 'string' && abs !== '' ? abs : null;
|
|
113
|
+
}
|
|
114
|
+
// ── 错误码 → 文案(官方 RemoteError 按 code 分支,不按消息文本) ──
|
|
115
|
+
/** 剥 wire 命名空间前缀(如 `workspace-file/not-found` ⇒ `not-found`)。 */
|
|
116
|
+
export function bareCode(raw) {
|
|
117
|
+
if (typeof raw === 'string') {
|
|
118
|
+
const slash = raw.lastIndexOf('/');
|
|
119
|
+
return slash >= 0 ? raw.slice(slash + 1) : raw;
|
|
120
|
+
}
|
|
121
|
+
if (typeof raw === 'object' && raw !== null) {
|
|
122
|
+
const code = raw.code;
|
|
123
|
+
if (typeof code === 'string')
|
|
124
|
+
return bareCode(code);
|
|
125
|
+
}
|
|
126
|
+
return '';
|
|
127
|
+
}
|
|
128
|
+
/** 任意抛错/reject ⇒ 文案键。官方 code 分支 + 未知回落,绝不按消息文本猜。 */
|
|
129
|
+
export function errView(error) {
|
|
130
|
+
const code = bareCode(error);
|
|
131
|
+
switch (code) {
|
|
132
|
+
case 'outside-workspace':
|
|
133
|
+
return { key: 'previewOutside' };
|
|
134
|
+
case 'not-found':
|
|
135
|
+
return { key: 'previewNotFound' };
|
|
136
|
+
case 'not-directory':
|
|
137
|
+
return { key: 'previewNotDirectory' };
|
|
138
|
+
case 'not-regular-file':
|
|
139
|
+
return { key: 'previewNotDirectory' };
|
|
140
|
+
case 'too-large':
|
|
141
|
+
return { key: 'previewTooLarge' };
|
|
142
|
+
case 'not-text':
|
|
143
|
+
return { key: 'previewNotText' };
|
|
144
|
+
case 'invocation-unavailable':
|
|
145
|
+
case 'service-unavailable':
|
|
146
|
+
return { key: 'previewOfficeUnavailable' };
|
|
147
|
+
default:
|
|
148
|
+
// 未映射的机器码**必须留痕**:写死「加载失败」会让消费方和我们自己都永远查不出是谁的锅
|
|
149
|
+
// (HTML/图片预览曾因此只剩一句「加载失败」,无法定位是远端拒了还是形状不对)。
|
|
150
|
+
console.warn('[dsh-plugin-core:explorer] 预览失败:未映射的远端错误码', code, error);
|
|
151
|
+
return { key: 'previewFailedCode', params: { code } };
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
// ── 目录条目 ──
|
|
155
|
+
/** 子项排序:目录在前,文件在后,各自按名称(不区分大小写)升序。 */
|
|
156
|
+
export function sortEntries(entries) {
|
|
157
|
+
return [...entries].sort((a, b) => {
|
|
158
|
+
const ad = a.type === 'directory' ? 0 : 1;
|
|
159
|
+
const bd = b.type === 'directory' ? 0 : 1;
|
|
160
|
+
if (ad !== bd)
|
|
161
|
+
return ad - bd;
|
|
162
|
+
return a.name.toLowerCase().localeCompare(b.name.toLowerCase());
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* 0.2.0-rc.1 起官方 list **拒绝空路径** ⇒ 空串(= 工作区根)一律以 `'.'` 上线
|
|
167
|
+
* (`'.'` 按 cwd = 工作区根归一解析为根本身;响应里根的 path 仍是 `''`)。
|
|
168
|
+
*/
|
|
169
|
+
export function listPathOf(dir) {
|
|
170
|
+
return dir === '' ? '.' : dir;
|
|
171
|
+
}
|
|
172
|
+
export function createRootCache() {
|
|
173
|
+
const map = new Map();
|
|
174
|
+
return {
|
|
175
|
+
get: (sessionId) => map.get(sessionId),
|
|
176
|
+
set: (sessionId, root) => {
|
|
177
|
+
map.set(sessionId, root);
|
|
178
|
+
},
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
/** 宿主绝对路径形态(/ 开头或 Windows 盘符)。 */
|
|
182
|
+
export function isAbsoluteish(p) {
|
|
183
|
+
return p.startsWith('/') || p.startsWith('\\') || /^[a-zA-Z]:[\\/]/.test(p);
|
|
184
|
+
}
|
|
185
|
+
/** 工作区相对拼接(根下直接 name,不补前导 /)。 */
|
|
186
|
+
export function relJoin(dir, name) {
|
|
187
|
+
return dir.replace(/\/+$/, '') === '' ? name : `${dir.replace(/\/+$/, '')}/${name}`;
|
|
188
|
+
}
|
|
189
|
+
/** 由「相对路径 + 该文件宿主绝对路径」反推工作区根并写入缓存;学不出返回 null。 */
|
|
190
|
+
export function learnRoot(cache, sessionId, relativePath, absolutePath) {
|
|
191
|
+
const rel = relativePath.replace(/^\/+/, '').replace(/\/+$/, '');
|
|
192
|
+
if (rel === '' || !absolutePath.endsWith(`/${rel}`))
|
|
193
|
+
return null;
|
|
194
|
+
const root = absolutePath.slice(0, absolutePath.length - rel.length - 1);
|
|
195
|
+
cache.set(sessionId, root);
|
|
196
|
+
return root;
|
|
197
|
+
}
|
|
198
|
+
/** 把宿主绝对路径剥回工作区相对(根未知或不在根下 ⇒ 原样返回,退化)。 */
|
|
199
|
+
export function relativizeToRoot(cache, sessionId, dir) {
|
|
200
|
+
if (!isAbsoluteish(dir))
|
|
201
|
+
return dir;
|
|
202
|
+
const root = cache.get(sessionId);
|
|
203
|
+
if (root === undefined)
|
|
204
|
+
return dir;
|
|
205
|
+
const norm = root.replace(/\/+$/, '');
|
|
206
|
+
if (dir === norm)
|
|
207
|
+
return '';
|
|
208
|
+
if (dir.startsWith(`${norm}/`))
|
|
209
|
+
return dir.slice(norm.length + 1);
|
|
210
|
+
return dir;
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* 在相对目录树里找**任意一个文件**并 stat(广度优先、有界:每层最多 5 个目录、最多 3 层)。
|
|
214
|
+
* 用于目标目录本身没有文件子项(空目录 / 只有子目录)时反推工作区根。
|
|
215
|
+
*/
|
|
216
|
+
export async function findAnyFileAbs(workspaceFiles, sessionId, startDir) {
|
|
217
|
+
const stat = workspaceFiles.stat;
|
|
218
|
+
if (stat === undefined)
|
|
219
|
+
return null;
|
|
220
|
+
let frontier = [startDir];
|
|
221
|
+
for (let depth = 0; depth < 3 && frontier.length > 0; depth++) {
|
|
222
|
+
const nextDirs = [];
|
|
223
|
+
for (const dir of frontier.slice(0, 5)) {
|
|
224
|
+
let entries;
|
|
225
|
+
try {
|
|
226
|
+
const parsed = listingOf(await workspaceFiles.list(sessionId, listPathOf(dir)));
|
|
227
|
+
if (parsed === null || isFailed(parsed))
|
|
228
|
+
continue;
|
|
229
|
+
entries = parsed.entries;
|
|
230
|
+
}
|
|
231
|
+
catch {
|
|
232
|
+
continue;
|
|
233
|
+
}
|
|
234
|
+
const file = entries.find((entry) => entry.type === 'file');
|
|
235
|
+
if (file !== undefined) {
|
|
236
|
+
const rel = relJoin(dir, file.name);
|
|
237
|
+
try {
|
|
238
|
+
const abs = absolutePathOf(await stat(sessionId, rel));
|
|
239
|
+
if (abs !== null)
|
|
240
|
+
return { absolutePath: abs, relativePath: rel };
|
|
241
|
+
}
|
|
242
|
+
catch {
|
|
243
|
+
/* 换下一个候选 */
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
for (const entry of entries) {
|
|
247
|
+
if (entry.type === 'directory' && nextDirs.length < 5)
|
|
248
|
+
nextDirs.push(relJoin(dir, entry.name));
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
frontier = nextDirs;
|
|
252
|
+
}
|
|
253
|
+
return null;
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* 把「工作区相对名」的目录解析成宿主绝对路径(面包屑才能从工作区根往下列)。
|
|
257
|
+
* 优先级:① 根已缓存 ⇒ 根 + '/' + 规范相对路径(覆盖空目录 / 只有子目录);
|
|
258
|
+
* ② 目录里有文件子项 ⇒ stat 它反推根;③ 有界 BFS 找任一文件反推根。
|
|
259
|
+
* 全部失败 ⇒ 退回入参,浏览不受影响。
|
|
260
|
+
*/
|
|
261
|
+
export async function absolutizeDir(cache, workspaceFiles, sessionId, dir, canonical, entries) {
|
|
262
|
+
if (isAbsoluteish(dir))
|
|
263
|
+
return dir;
|
|
264
|
+
const rel = canonical !== '' ? canonical : dir;
|
|
265
|
+
const cached = cache.get(sessionId);
|
|
266
|
+
if (cached !== undefined)
|
|
267
|
+
return `${cached}/${rel}`;
|
|
268
|
+
const stat = workspaceFiles.stat;
|
|
269
|
+
if (stat === undefined)
|
|
270
|
+
return dir;
|
|
271
|
+
// ② 本目录里的文件子项
|
|
272
|
+
const file = entries.find((entry) => entry.type === 'file');
|
|
273
|
+
if (file !== undefined) {
|
|
274
|
+
try {
|
|
275
|
+
const sub = relJoin(rel, file.name);
|
|
276
|
+
const abs = absolutePathOf(await stat(sessionId, sub));
|
|
277
|
+
if (abs?.endsWith(`/${file.name}`) === true && learnRoot(cache, sessionId, sub, abs) !== null) {
|
|
278
|
+
return abs.slice(0, abs.length - file.name.length - 1);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
catch {
|
|
282
|
+
/* 落到 ③ */
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
// ③ 有界 BFS 找一个文件反推根
|
|
286
|
+
const found = await findAnyFileAbs(workspaceFiles, sessionId, rel);
|
|
287
|
+
if (found === null)
|
|
288
|
+
return dir;
|
|
289
|
+
const root = learnRoot(cache, sessionId, found.relativePath, found.absolutePath);
|
|
290
|
+
return root === null ? dir : `${root}/${rel}`;
|
|
291
|
+
}
|
|
292
|
+
export function matchesFilter(path, isDir, filter) {
|
|
293
|
+
if (filter === undefined)
|
|
294
|
+
return true;
|
|
295
|
+
if (filter.dirs === true)
|
|
296
|
+
return isDir;
|
|
297
|
+
if (filter.exts === undefined || filter.exts.length === 0)
|
|
298
|
+
return true;
|
|
299
|
+
if (isDir)
|
|
300
|
+
return true;
|
|
301
|
+
return filter.exts.includes(extOf(path));
|
|
302
|
+
}
|
|
303
|
+
// ── 面包屑 ──
|
|
304
|
+
/** 面包屑段:把目录路径拆成可点层级(绝对路径保留前导 /)。 */
|
|
305
|
+
export function crumbsOfDir(dir) {
|
|
306
|
+
const isAbs = isAbsoluteish(dir);
|
|
307
|
+
const segs = dir.split('/').filter((s) => s.length > 0);
|
|
308
|
+
const out = [];
|
|
309
|
+
let acc = '';
|
|
310
|
+
for (const seg of segs) {
|
|
311
|
+
acc = acc === '' ? (isAbs ? `/${seg}` : seg) : `${acc}/${seg}`;
|
|
312
|
+
out.push({ label: seg, path: acc });
|
|
313
|
+
}
|
|
314
|
+
return out;
|
|
315
|
+
}
|
|
316
|
+
/** 文件/目录的显示名(末段)。 */
|
|
317
|
+
export function baseNameOfPath(p) {
|
|
318
|
+
const i = Math.max(p.lastIndexOf('/'), p.lastIndexOf('\\'));
|
|
319
|
+
return i < 0 ? p : p.slice(i + 1);
|
|
320
|
+
}
|
|
321
|
+
/** 父目录(无父 = 空串)。 */
|
|
322
|
+
export function dirnameOf(p) {
|
|
323
|
+
return parentOf(p);
|
|
324
|
+
}
|
|
325
|
+
/** 路径拼接(处理根与绝对/相对;沿用 utils/path 的 joinPath 语义)。 */
|
|
326
|
+
export { joinPath } from '../utils/path.js';
|
|
327
|
+
/** mimeOf 再导出(预览体要用,避免各自 import utils)。 */
|
|
328
|
+
export { extOf, mimeOf };
|
|
329
|
+
/**
|
|
330
|
+
* 从宿主工作区清单里挑一个**真实浏览锚点**:最近更新过、且有会话的工作区。
|
|
331
|
+
*
|
|
332
|
+
* `workspaceFiles` 是会话作用域服务(list/read 都要 sessionId),所以「打开文件夹」必须先
|
|
333
|
+
* 落到一个真会话上 —— 这里是它的唯一落点。
|
|
334
|
+
*
|
|
335
|
+
* @param items 宿主工作区清单(真实快照)。
|
|
336
|
+
* @returns 锚点;清单为空 / 都没有会话则返回 null。
|
|
337
|
+
*/
|
|
338
|
+
export function pickWorkspaceAnchor(items) {
|
|
339
|
+
let best = null;
|
|
340
|
+
let bestAt = Number.NEGATIVE_INFINITY;
|
|
341
|
+
for (const item of items) {
|
|
342
|
+
const sessionId = item.sessionIds?.[item.sessionIds.length - 1];
|
|
343
|
+
if (typeof item.title !== 'string' || item.title === '' || typeof sessionId !== 'string' || sessionId === '')
|
|
344
|
+
continue;
|
|
345
|
+
const at = typeof item.updatedAt === 'number' && Number.isFinite(item.updatedAt) ? item.updatedAt : Number.NEGATIVE_INFINITY;
|
|
346
|
+
// 等号不覆盖 ⇒ 时间戳相同(含都缺失)时保留靠前的那个。
|
|
347
|
+
if (best !== null && at <= bestAt)
|
|
348
|
+
continue;
|
|
349
|
+
best = { title: item.title, sessionId };
|
|
350
|
+
bestAt = at;
|
|
351
|
+
}
|
|
352
|
+
return best;
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* 按**工作区 title** 取浏览锚点会话(`workspaceAnchors` 里该 title 最近一个会话)。
|
|
356
|
+
*
|
|
357
|
+
* 与 `workspaceAnchorForPath`(按路径匹配)互补:调用方有 title 归属信息时用这个
|
|
358
|
+
* (兄弟项目 `GET /options` 的 `Record<title, 会话id>` 同口径,无歧义);
|
|
359
|
+
* 只有裸绝对路径时才走路径匹配。没有该 title / 没有会话 ⇒ null。
|
|
360
|
+
*/
|
|
361
|
+
export function anchorSessionForTitle(items, title) {
|
|
362
|
+
if (title === '')
|
|
363
|
+
return null;
|
|
364
|
+
const item = items.find((it) => it.title === title);
|
|
365
|
+
const sessionId = item?.sessionIds?.[item.sessionIds.length - 1];
|
|
366
|
+
return typeof sessionId === 'string' && sessionId !== '' ? sessionId : null;
|
|
367
|
+
}
|
|
368
|
+
/**
|
|
369
|
+
* 目标**绝对路径**落在哪个工作区 ⇒ 该工作区最近一个会话 id(list 的 sessionId)。
|
|
370
|
+
*
|
|
371
|
+
* 为什么需要:`workspaceFiles.list` 是会话作用域服务(按 sessionId 解析工作区根,目录 confinement
|
|
372
|
+
* 检查 `contains(root, target)`,官方 `lib/index.js:576-583`)。调用方只甩一个绝对路径进来时,
|
|
373
|
+
* 默认 sessionId 的工作区根未必含它 ⇒ 官方报 `outside-workspace` ⇒ 面板整条退化成只读。
|
|
374
|
+
* 这里把「路径 → 工作区 → 会话」的解析收敛到核心,调用方只需把宿主工作区清单(带 path)传进来。
|
|
375
|
+
*
|
|
376
|
+
* 口径:**最长前缀**赢(嵌套工作区取最具体的);尾斜杠归一;字面大小写(宿主 path 与调用方
|
|
377
|
+
* 路径同源,不做大小写折叠——Windows 跨形态比较是调用方归一的责任)。
|
|
378
|
+
* shortcut: 只解一次(入口 path),不跟踪 dir 切换;跨工作区跳转由调用方经 onSelectWorkspace 处理。
|
|
379
|
+
*
|
|
380
|
+
* @returns 锚点;无 path 字段 / 都不匹配 / 命中工作区没有会话 ⇒ null(调用方回落默认 sessionId)。
|
|
381
|
+
*/
|
|
382
|
+
export function workspaceAnchorForPath(path, items) {
|
|
383
|
+
if (!isAbsoluteish(path) || path === '')
|
|
384
|
+
return null;
|
|
385
|
+
const norm = (p) => p.replace(/\/+$/, '');
|
|
386
|
+
const target = norm(path);
|
|
387
|
+
let best = null;
|
|
388
|
+
let bestLen = -1;
|
|
389
|
+
for (const item of items) {
|
|
390
|
+
if (typeof item.path !== 'string' || item.path === '')
|
|
391
|
+
continue;
|
|
392
|
+
const root = norm(item.path);
|
|
393
|
+
if (root === '' || !(target === root || target.startsWith(`${root}/`)))
|
|
394
|
+
continue;
|
|
395
|
+
if (root.length > bestLen) {
|
|
396
|
+
best = item;
|
|
397
|
+
bestLen = root.length;
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
if (best === null)
|
|
401
|
+
return null;
|
|
402
|
+
const sessionId = best.sessionIds?.[best.sessionIds.length - 1];
|
|
403
|
+
if (typeof sessionId !== 'string' || sessionId === '')
|
|
404
|
+
return null;
|
|
405
|
+
return { title: best.title, sessionId };
|
|
19
406
|
}
|
|
20
407
|
//# sourceMappingURL=types.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/explorer/types.ts"],"names":[],"mappings":"AAAA,4BAA4B;AAC5B,EAAE;AACF,gDAAgD;AAChD,4DAA4D;AAE5D,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AA0DhD,mDAAmD;AACnD,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,OAAO,CAAA;IAC9C,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,CAAA;IACvB,IAAI,GAAG,KAAK,EAAE;QAAE,OAAO,MAAM,CAAA;IAC7B,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC;QACvB,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK;QAC3E,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK;QACjF,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK;KAC1C,CAAC,CAAA;IACF,OAAO,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,CAAA;AACnD,CAAC"}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/explorer/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 宿主侧数据面:把「供应商 → 模型」目录挂成一条只读 HTTP 路由,供 client 侧自取。
|
|
3
|
+
*
|
|
4
|
+
* 为什么必须走宿主侧(2026-10-20 真机定位):client 的 `remote.llm` 命名空间只有
|
|
5
|
+
* `listProviders` / `listConfigurableProviders`,**没有每个 provider 的模型列表**;
|
|
6
|
+
* 模型只能宿主侧 `llm.listModels(providerId)` 取(兄弟仓 dsh-task-dispatch-table
|
|
7
|
+
* `src/dispatch.ts:81-88` 同口径)。之前照抄「读设置镜像 profile.models」的路子在
|
|
8
|
+
* demo 里读不出任何供应商,已废弃。
|
|
9
|
+
*
|
|
10
|
+
* ⚠️ 本文件是 Node 侧入口:**不得** import React / DOM。零 `@deepseek-ai/*` 运行时依赖,
|
|
11
|
+
* 宿主面一律结构化声明(同兄弟仓红线)。
|
|
12
|
+
*/
|
|
13
|
+
/** 宿主 `llm` 服务的最小面(0.1.x 实测形状)。 */
|
|
14
|
+
export interface HostLlmLike {
|
|
15
|
+
/** 已注册 provider,按注册序(同步)。 */
|
|
16
|
+
listProviders: () => readonly {
|
|
17
|
+
id: string;
|
|
18
|
+
name: string;
|
|
19
|
+
}[];
|
|
20
|
+
/** 某 provider 可发现的模型,按适配器偏好序(异步)。 */
|
|
21
|
+
listModels: (provider: string) => Promise<readonly {
|
|
22
|
+
id: string;
|
|
23
|
+
name?: string;
|
|
24
|
+
}[]>;
|
|
25
|
+
}
|
|
26
|
+
/** 宿主 `webServer` 服务的最小面(WebRoute 形状)。 */
|
|
27
|
+
export interface HostWebServerLike {
|
|
28
|
+
register: (route: {
|
|
29
|
+
kind: 'exact' | 'prefix';
|
|
30
|
+
path: string;
|
|
31
|
+
handler: (req: {
|
|
32
|
+
url?: string;
|
|
33
|
+
}, res: {
|
|
34
|
+
writeHead: (status: number, headers: Record<string, string>) => void;
|
|
35
|
+
end: (body: string) => void;
|
|
36
|
+
}) => void | Promise<void>;
|
|
37
|
+
}) => unknown;
|
|
38
|
+
}
|
|
39
|
+
/** 插件宿主 ctx 的最小面。 */
|
|
40
|
+
export interface HostContextLike {
|
|
41
|
+
inject: (deps: string[], cb: (services: Record<string, unknown>) => void) => void;
|
|
42
|
+
}
|
|
43
|
+
/** 一条路由:一个供应商 + 它的模型。 */
|
|
44
|
+
export interface ModelRouteData {
|
|
45
|
+
provider: string;
|
|
46
|
+
displayName: string;
|
|
47
|
+
models: {
|
|
48
|
+
id: string;
|
|
49
|
+
name?: string;
|
|
50
|
+
}[];
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* 现查一遍「供应商 → 模型」目录(单个 provider 列不出来就跳过它,不影响其它家)。
|
|
54
|
+
* 导出是为了单测与「不用 HTTP 也要这份数据」的宿主场景。
|
|
55
|
+
*/
|
|
56
|
+
export declare function buildModelRoutes(llm: HostLlmLike): Promise<ModelRouteData[]>;
|
|
57
|
+
/**
|
|
58
|
+
* 注册模型目录路由(插件宿主 `apply` 里调一次)。
|
|
59
|
+
*
|
|
60
|
+
* @param ctx 插件宿主 ctx(`llm` / `webServer` 两条注入线,缺任一条就不注册)。
|
|
61
|
+
* @param options.path 路由路径,客户端要用**同一个常量**去 fetch(如 `/api/x/models`)。
|
|
62
|
+
*/
|
|
63
|
+
export declare function serveModelCatalog(ctx: HostContextLike, options: {
|
|
64
|
+
path: string;
|
|
65
|
+
}): void;
|
|
66
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/host/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,mCAAmC;AACnC,MAAM,WAAW,WAAW;IAC1B,6BAA6B;IAC7B,aAAa,EAAE,MAAM,SAAS;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IAC5D,qCAAqC;IACrC,UAAU,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC,CAAA;CACpF;AAED,0CAA0C;AAC1C,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,CAAC,KAAK,EAAE;QAChB,IAAI,EAAE,OAAO,GAAG,QAAQ,CAAA;QACxB,IAAI,EAAE,MAAM,CAAA;QACZ,OAAO,EAAE,CAAC,GAAG,EAAE;YAAE,GAAG,CAAC,EAAE,MAAM,CAAA;SAAE,EAAE,GAAG,EAAE;YAAE,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,IAAI,CAAC;YAAC,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;SAAE,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;KACrK,KAAK,OAAO,CAAA;CACd;AAED,qBAAqB;AACrB,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,KAAK,IAAI,CAAA;CAClF;AAED,yBAAyB;AACzB,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CACxC;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAiBlF;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,eAAe,EAAE,OAAO,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAevF"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 宿主侧数据面:把「供应商 → 模型」目录挂成一条只读 HTTP 路由,供 client 侧自取。
|
|
3
|
+
*
|
|
4
|
+
* 为什么必须走宿主侧(2026-10-20 真机定位):client 的 `remote.llm` 命名空间只有
|
|
5
|
+
* `listProviders` / `listConfigurableProviders`,**没有每个 provider 的模型列表**;
|
|
6
|
+
* 模型只能宿主侧 `llm.listModels(providerId)` 取(兄弟仓 dsh-task-dispatch-table
|
|
7
|
+
* `src/dispatch.ts:81-88` 同口径)。之前照抄「读设置镜像 profile.models」的路子在
|
|
8
|
+
* demo 里读不出任何供应商,已废弃。
|
|
9
|
+
*
|
|
10
|
+
* ⚠️ 本文件是 Node 侧入口:**不得** import React / DOM。零 `@deepseek-ai/*` 运行时依赖,
|
|
11
|
+
* 宿主面一律结构化声明(同兄弟仓红线)。
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* 现查一遍「供应商 → 模型」目录(单个 provider 列不出来就跳过它,不影响其它家)。
|
|
15
|
+
* 导出是为了单测与「不用 HTTP 也要这份数据」的宿主场景。
|
|
16
|
+
*/
|
|
17
|
+
export async function buildModelRoutes(llm) {
|
|
18
|
+
const routes = [];
|
|
19
|
+
for (const provider of llm.listProviders()) {
|
|
20
|
+
try {
|
|
21
|
+
const models = await llm.listModels(provider.id);
|
|
22
|
+
if (models.length === 0)
|
|
23
|
+
continue;
|
|
24
|
+
routes.push({
|
|
25
|
+
provider: provider.id,
|
|
26
|
+
displayName: provider.name,
|
|
27
|
+
models: models.map((model) => (model.name === undefined ? { id: model.id } : { id: model.id, name: model.name })),
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
// 该 provider 列不出模型(没配 key / 端点不可达):跳过,不整表失败
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
routes.sort((left, right) => left.displayName.localeCompare(right.displayName));
|
|
35
|
+
return routes;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* 注册模型目录路由(插件宿主 `apply` 里调一次)。
|
|
39
|
+
*
|
|
40
|
+
* @param ctx 插件宿主 ctx(`llm` / `webServer` 两条注入线,缺任一条就不注册)。
|
|
41
|
+
* @param options.path 路由路径,客户端要用**同一个常量**去 fetch(如 `/api/x/models`)。
|
|
42
|
+
*/
|
|
43
|
+
export function serveModelCatalog(ctx, options) {
|
|
44
|
+
ctx.inject(['llm', 'webServer'], (services) => {
|
|
45
|
+
const llm = services.llm;
|
|
46
|
+
const webServer = services.webServer;
|
|
47
|
+
if (llm === undefined || webServer === undefined)
|
|
48
|
+
return;
|
|
49
|
+
webServer.register({
|
|
50
|
+
kind: 'exact',
|
|
51
|
+
path: options.path,
|
|
52
|
+
handler: async (_req, res) => {
|
|
53
|
+
const routes = await buildModelRoutes(llm);
|
|
54
|
+
res.writeHead(200, { 'content-type': 'application/json; charset=utf-8' });
|
|
55
|
+
res.end(JSON.stringify({ routes }));
|
|
56
|
+
},
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/host/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AA+BH;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,GAAgB;IACrD,MAAM,MAAM,GAAqB,EAAE,CAAA;IACnC,KAAK,MAAM,QAAQ,IAAI,GAAG,CAAC,aAAa,EAAE,EAAE,CAAC;QAC3C,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;YAChD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAQ;YACjC,MAAM,CAAC,IAAI,CAAC;gBACV,QAAQ,EAAE,QAAQ,CAAC,EAAE;gBACrB,WAAW,EAAE,QAAQ,CAAC,IAAI;gBAC1B,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;aAClH,CAAC,CAAA;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,4CAA4C;QAC9C,CAAC;IACH,CAAC;IACD,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAA;IAC/E,OAAO,MAAM,CAAA;AACf,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAoB,EAAE,OAAyB;IAC/E,GAAG,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,EAAE;QAC5C,MAAM,GAAG,GAAG,QAAQ,CAAC,GAA8B,CAAA;QACnD,MAAM,SAAS,GAAG,QAAQ,CAAC,SAA0C,CAAA;QACrE,IAAI,GAAG,KAAK,SAAS,IAAI,SAAS,KAAK,SAAS;YAAE,OAAM;QACxD,SAAS,CAAC,QAAQ,CAAC;YACjB,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;gBAC3B,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,GAAG,CAAC,CAAA;gBAC1C,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,iCAAiC,EAAE,CAAC,CAAA;gBACzE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAA;YACrC,CAAC;SACF,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { createElement as h } from 'react';
|
|
2
|
+
import type { Translate } from '../utils/i18n.js';
|
|
3
|
+
import type { SessionViewTarget } from './open-session-view.js';
|
|
4
|
+
import { type ChangedFileReviewLocator } from './mirror/ChangedFilesCard.js';
|
|
5
|
+
export interface SessionViewModalProps {
|
|
6
|
+
t?: Translate;
|
|
7
|
+
/** 弹窗标题:**会话自己的标题**(宿主 sessions.list 的 displayTitle);缺省用「会话预览」。 */
|
|
8
|
+
heading?: string;
|
|
9
|
+
sessionId: string;
|
|
10
|
+
view: SessionViewTarget;
|
|
11
|
+
onClose: () => void;
|
|
12
|
+
/**
|
|
13
|
+
* 会话是否已归档(由调用方注入:官方 client 服务 `workspaces` 的快照字段 `archivedSessionIds`,
|
|
14
|
+
* registry-global、随 follow 流实时更新,见 docs/design/external/dsh-host.md §11)。
|
|
15
|
+
* 分化「继续对话」行为:已归档 = 开分支图标 + 确认框(fork 后跳官方区);
|
|
16
|
+
* 未归档 / 未提供 = 会话图标,点击直跳官方会话页。undefined = 调用方不知道,按未归档处理。
|
|
17
|
+
*/
|
|
18
|
+
archived?: boolean;
|
|
19
|
+
/** fork 源会话:`sessions.fork({ sessionId, increaseTitle: true })`,解析为子会话 id。 */
|
|
20
|
+
forkSession?: (sessionId: string, atSeq?: number) => Promise<string>;
|
|
21
|
+
/** 官方导航跳转:`uiWorkspace.openSession(id)`(会话区打开目标会话)。 */
|
|
22
|
+
openHostSession?: (sessionId: string) => void;
|
|
23
|
+
/**
|
|
24
|
+
* 暂存输入框的「确定」:调用方完成 fork + host 侧 agent.send 起轮次 + 跳官方视图。
|
|
25
|
+
* 缺省 = 不渲染暂存输入框(插件未接线续聊能力时功能降级,不影响预览)。
|
|
26
|
+
*/
|
|
27
|
+
onContinue?: (message: string) => Promise<void>;
|
|
28
|
+
/** 文件打开出口(工具卡 fileLink / md 行内 mention / 交付卡共用);缺省 = 链接降级纯文本。
|
|
29
|
+
* 第二个参数带「文件所属的会话 id」(本视图自己在 props.sessionId 上,自动透传),
|
|
30
|
+
* 消费方据此在正确的工作区会话作用域里定位文件,避免用错会话导致 not-found。 */
|
|
31
|
+
onOpenFile?: (path: string, sessionId: string) => void;
|
|
32
|
+
/** 变更文件点击出口(官方 openReview 等价):带「改动身份」(sessionId+seq+index),
|
|
33
|
+
* 消费方据此开审阅(本包走 openFilePreview 的 content 槽)。缺省 = 变更卡整张不可点。 */
|
|
34
|
+
onOpenReview?: (locator: ChangedFileReviewLocator) => void;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* 面板内只读会话弹窗:只读、不可在框内续聊(底层 keyed 数组是只读快照,官方无写面)。
|
|
38
|
+
* 续聊正道 = 头部「继续对话(开分支)」/ 消息行分支 icon(fork → openSession),
|
|
39
|
+
* 以及底部暂存输入框(打字 → 确定 → onContinue 带话开分支并起轮次)。
|
|
40
|
+
*/
|
|
41
|
+
export declare function SessionViewModal(props: SessionViewModalProps): ReturnType<typeof h>;
|
|
42
|
+
//# sourceMappingURL=SessionViewModal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SessionViewModal.d.ts","sourceRoot":"","sources":["../../src/session/SessionViewModal.ts"],"names":[],"mappings":"AAUA,OAAO,EAAY,aAAa,IAAI,CAAC,EAA2E,MAAM,OAAO,CAAA;AAK7H,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAUjD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAY/D,OAAO,EAAoB,KAAK,wBAAwB,EAAE,MAAM,8BAA8B,CAAA;AAunB9F,MAAM,WAAW,qBAAqB;IACpC,CAAC,CAAC,EAAE,SAAS,CAAA;IACb,mEAAmE;IACnE,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,iBAAiB,CAAA;IACvB,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,8EAA8E;IAC9E,WAAW,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;IACpE,uDAAuD;IACvD,eAAe,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAA;IAC7C;;;OAGG;IACH,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC/C;;qDAEiD;IACjD,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,CAAA;IACtD;mEAC+D;IAC/D,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,wBAAwB,KAAK,IAAI,CAAA;CAC3D;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CA4VnF"}
|