dsh-plugin-core 0.2.14 → 0.4.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/LICENSE +21 -0
- 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 +4 -0
- package/dist/ui/Segmented.d.ts.map +1 -1
- package/dist/ui/Segmented.js +88 -31
- 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
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
// 官方对照:packages/client/ui-chat/src/client/chat/ChatGroupSeat.js(0.1.7-rc.2 lib/client.js:2178-2385)
|
|
2
|
+
// 二级收折:root[data-step-process] > title(button,activity 图标 ↔ 箭头 hover/展开互换,
|
|
3
|
+
// label = processTitle(summary))+ body(max-height min(400px,50vh),上下 24px 渐隐遮罩,
|
|
4
|
+
// --dsh-chat-flow-gap:8px)> content > 组内条目(ChatNodeSeat 逐个,三级各自展开)。
|
|
5
|
+
// 外层可见性沿用官方 outerHidden:foldCompleted && turn 已闭合 && 有 spec && !alwaysOpen
|
|
6
|
+
// && 存储的 answerStep 不匹配 ⇒ 整组 hidden(一级「用时 N 秒」行收起时组随之隐藏)。
|
|
7
|
+
// grouped(历史轮才收折:policy.stepGrouping === 'history' && turn 非 open)为 false 时
|
|
8
|
+
// 隐藏标题行、body 展开不限高(expandedBody)。
|
|
9
|
+
import { createElement as h, useCallback, useEffect, useRef, useState } from 'react';
|
|
10
|
+
import { IconAgentPresetOutlineRegular, IconApiOutlineRegular, IconBrowseOutlineRegular, IconChevronDownOutlineRegular, IconChevronUpOutlineRegular, IconCodeOutlineRegular, IconEditOutlineRegular, IconGlobeOutlineRegular, IconPlanOutlineRegular, IconQuestionOutlineRegular, IconSearchOutlineRegular, IconSparkleRegular, IconThinkOutlineRegular, } from '../../ui/official.js';
|
|
11
|
+
import { officialClass } from '../official-classes.js';
|
|
12
|
+
import { ChatNodeSeatMirror, readPresentation } from './ChatNodeSeat.js';
|
|
13
|
+
import { processTitle } from './process-groups.js';
|
|
14
|
+
/** 官方 PROCESS_ICONS(lib/client.js:2187-2201);工具行图标同源(edit/write=铅笔、generic=sparkle)。 */
|
|
15
|
+
export const PROCESS_ICONS = {
|
|
16
|
+
thinking: IconThinkOutlineRegular,
|
|
17
|
+
read: IconBrowseOutlineRegular,
|
|
18
|
+
readImage: IconBrowseOutlineRegular,
|
|
19
|
+
search: IconSearchOutlineRegular,
|
|
20
|
+
edit: IconEditOutlineRegular,
|
|
21
|
+
write: IconEditOutlineRegular,
|
|
22
|
+
commands: IconApiOutlineRegular,
|
|
23
|
+
code: IconCodeOutlineRegular,
|
|
24
|
+
webSearch: IconGlobeOutlineRegular,
|
|
25
|
+
webFetch: IconBrowseOutlineRegular,
|
|
26
|
+
subagents: IconAgentPresetOutlineRegular,
|
|
27
|
+
plan: IconPlanOutlineRegular,
|
|
28
|
+
questions: IconQuestionOutlineRegular,
|
|
29
|
+
tools: IconSparkleRegular,
|
|
30
|
+
};
|
|
31
|
+
/** 官方图标尺寸(14px,除 thinking/commands/webSearch/plan/questions 用默认)。 */
|
|
32
|
+
const SMALL_ICONS = new Set([
|
|
33
|
+
'read', 'readImage', 'search', 'edit', 'write', 'code', 'webFetch', 'subagents', 'tools',
|
|
34
|
+
]);
|
|
35
|
+
/** 过程分组(二级收折):汇总行 + 组内条目。 */
|
|
36
|
+
export function ChatGroupSeatMirror(props) {
|
|
37
|
+
const { group, grouped, store, openState, onSetOpen, foldCompleted, renderNode, t } = props;
|
|
38
|
+
const [open, setOpen] = useState(false);
|
|
39
|
+
const first = group.members[0];
|
|
40
|
+
const firstNode = first === undefined ? undefined : store?.get(first.key);
|
|
41
|
+
const presentation = first === undefined
|
|
42
|
+
? undefined
|
|
43
|
+
: readPresentation(store, first.key);
|
|
44
|
+
const spec = presentation?.spec ?? undefined;
|
|
45
|
+
const location = firstNode?.location;
|
|
46
|
+
const reason = location?.kind === 'turn' || location?.kind === 'step'
|
|
47
|
+
? location.turn?.end?.data?.reason?.kind
|
|
48
|
+
: undefined;
|
|
49
|
+
// 官方 ChatGroupSeat 的 alwaysOpen(2301):与 seat 的版本略有差异(多 turnClosed === false 分支)。
|
|
50
|
+
const alwaysOpen = presentation?.turnClosed === false
|
|
51
|
+
|| presentation?.hasInterleavedInput === true
|
|
52
|
+
|| reason === 'aborted'
|
|
53
|
+
|| reason === 'error';
|
|
54
|
+
const storedAnswerStep = openState.get(group.data.turn);
|
|
55
|
+
const outerHidden = foldCompleted && presentation?.turnClosed === true && spec !== undefined
|
|
56
|
+
&& !alwaysOpen && storedAnswerStep !== (spec.answerStep ?? 0);
|
|
57
|
+
useEffect(() => {
|
|
58
|
+
if (outerHidden)
|
|
59
|
+
setOpen(false);
|
|
60
|
+
}, [outerHidden]);
|
|
61
|
+
const bodyRef = useRef(null);
|
|
62
|
+
const [edges, setEdges] = useState({ up: false, down: false });
|
|
63
|
+
const measure = useCallback(() => {
|
|
64
|
+
const el = bodyRef.current;
|
|
65
|
+
if (el === null)
|
|
66
|
+
return;
|
|
67
|
+
setEdges({
|
|
68
|
+
up: el.scrollTop > 1,
|
|
69
|
+
down: el.scrollTop + el.clientHeight < el.scrollHeight - 1,
|
|
70
|
+
});
|
|
71
|
+
}, []);
|
|
72
|
+
useEffect(() => {
|
|
73
|
+
if (grouped && open)
|
|
74
|
+
measure();
|
|
75
|
+
}, [grouped, open, measure]);
|
|
76
|
+
if (first === undefined || firstNode === undefined)
|
|
77
|
+
return null;
|
|
78
|
+
const label = group.data.closed ? processTitle(group.data.summary, t) : t('stepProcessDoneThinking');
|
|
79
|
+
const activity = group.data.summary.counts[0]?.kind ?? 'thinking';
|
|
80
|
+
const ActivityIcon = PROCESS_ICONS[activity] ?? IconThinkOutlineRegular;
|
|
81
|
+
const bodyClass = [
|
|
82
|
+
officialClass('ChatGroupSeat', 'body') ?? '',
|
|
83
|
+
grouped ? '' : officialClass('ChatGroupSeat', 'expandedBody') ?? '',
|
|
84
|
+
grouped && edges.up ? officialClass('ChatGroupSeat', 'fadeTop') ?? '' : '',
|
|
85
|
+
grouped && edges.down ? officialClass('ChatGroupSeat', 'fadeBottom') ?? '' : '',
|
|
86
|
+
].filter(part => part !== '').join(' ');
|
|
87
|
+
return h('div', {
|
|
88
|
+
className: officialClass('ChatGroupSeat', 'root') ?? '',
|
|
89
|
+
'data-chat-group-key': group.key,
|
|
90
|
+
'data-chat-flow-key': group.key,
|
|
91
|
+
'data-chat-anchor-key': `group:${group.key}`,
|
|
92
|
+
'data-chat-turn': group.data.turn,
|
|
93
|
+
'data-step-process': true,
|
|
94
|
+
'data-group-expanded-mode': !grouped || undefined,
|
|
95
|
+
hidden: outerHidden || undefined,
|
|
96
|
+
}, grouped
|
|
97
|
+
? h('button', {
|
|
98
|
+
type: 'button',
|
|
99
|
+
className: officialClass('ChatGroupSeat', 'title') ?? '',
|
|
100
|
+
'aria-expanded': open,
|
|
101
|
+
onClick: () => { setOpen(value => !value); },
|
|
102
|
+
}, h('span', {
|
|
103
|
+
className: officialClass('ChatGroupSeat', 'leading') ?? '',
|
|
104
|
+
'aria-hidden': true,
|
|
105
|
+
}, h('span', {
|
|
106
|
+
className: officialClass('ChatGroupSeat', 'activityIcon') ?? '',
|
|
107
|
+
'data-step-process-icon': true,
|
|
108
|
+
}, h(ActivityIcon, SMALL_ICONS.has(activity) ? { size: 14 } : {})), open
|
|
109
|
+
? h(IconChevronUpOutlineRegular, { className: officialClass('ChatGroupSeat', 'chevron') ?? '' })
|
|
110
|
+
: h(IconChevronDownOutlineRegular, { className: officialClass('ChatGroupSeat', 'chevron') ?? '' })), h('span', { className: officialClass('ChatGroupSeat', 'label') ?? '' }, label))
|
|
111
|
+
: null, h('div', {
|
|
112
|
+
ref: bodyRef,
|
|
113
|
+
className: bodyClass,
|
|
114
|
+
'data-step-process-body': true,
|
|
115
|
+
'data-scroll-up': edges.up || undefined,
|
|
116
|
+
'data-scroll-down': edges.down || undefined,
|
|
117
|
+
onScroll: measure,
|
|
118
|
+
hidden: grouped && !open || undefined,
|
|
119
|
+
}, h('div', {
|
|
120
|
+
className: officialClass('ChatGroupSeat', 'content') ?? '',
|
|
121
|
+
'data-step-process-content': true,
|
|
122
|
+
'data-chat-flow': '',
|
|
123
|
+
}, group.members.map(member => h(ChatNodeSeatMirror, {
|
|
124
|
+
key: JSON.stringify([member.key, member.groupPart ?? null]),
|
|
125
|
+
node: store?.get(member.key) ?? { key: member.key, kind: '', anchorSeq: 0 },
|
|
126
|
+
groupPart: member.groupPart,
|
|
127
|
+
store,
|
|
128
|
+
openState,
|
|
129
|
+
onSetOpen,
|
|
130
|
+
foldCompleted,
|
|
131
|
+
renderNode,
|
|
132
|
+
})))));
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=ChatGroupSeat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChatGroupSeat.js","sourceRoot":"","sources":["../../../src/session/mirror/ChatGroupSeat.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { createElement as h } from 'react';
|
|
2
|
+
import type { ReactNode } from 'react';
|
|
3
|
+
import type { ChatNodeFace, ChatNodeStoreFace, NodeLocationFace, TurnLocationFace, TurnProcessPresentationFace, TurnProcessSpecFace } from '../faces.js';
|
|
4
|
+
/**
|
|
5
|
+
* 官方 TURN_PROCESS_INDEPENDENT_KINDS(lib/client.js:1525):这些 kind 永远不进过程折叠区。
|
|
6
|
+
*/
|
|
7
|
+
export declare const TURN_PROCESS_INDEPENDENT_KINDS: ReadonlySet<string>;
|
|
8
|
+
/**
|
|
9
|
+
* 读过程席位快照。宿主 API 形态变了也只降级成「不折叠」,不让整个弹窗白屏。
|
|
10
|
+
*/
|
|
11
|
+
export declare function readPresentation(store: ChatNodeStoreFace | undefined, key: string): TurnProcessPresentationFace | undefined;
|
|
12
|
+
/** 交给节点视图的 Turn 过程席位(官方 owner.turnProcess,ChatNodeSeat.tsx:1693-1706)。 */
|
|
13
|
+
export interface TurnProcessHandle {
|
|
14
|
+
spec?: TurnProcessSpecFace;
|
|
15
|
+
foldable: boolean;
|
|
16
|
+
hasContent: boolean;
|
|
17
|
+
open: boolean;
|
|
18
|
+
/** 官方 turnProcessAlwaysOpen(node):live / 已停止 / 失败的 turn 不允许折叠。 */
|
|
19
|
+
alwaysOpen: boolean;
|
|
20
|
+
setOpen(open: boolean): void;
|
|
21
|
+
}
|
|
22
|
+
/** 节点视图渲染函数(官方 slot "conversation.chat.node" 的等价物)。 */
|
|
23
|
+
export type NodeRenderer = (node: ChatNodeFace, turnProcess: TurnProcessHandle | undefined,
|
|
24
|
+
/** 官方 groupPart:'reasoning' 只渲染思考块(组内),'response' 只渲染回复正文(组外)。 */
|
|
25
|
+
groupPart?: 'response' | 'reasoning') => ReactNode;
|
|
26
|
+
/** 取节点所属 turn(官方 turnOf,ChatNodeSeat.tsx:1660)。 */
|
|
27
|
+
export declare function turnOf(node: ChatNodeFace | undefined): number | undefined;
|
|
28
|
+
/** 官方 turnProcessAlwaysOpen(lib/client.js:1558):live / 已停止 / 失败的 turn 不折叠。 */
|
|
29
|
+
export declare function turnProcessAlwaysOpen(node: ChatNodeFace | undefined): boolean;
|
|
30
|
+
/** 一个 keyed 节点 → 一个 flowItem(官方 ChatNodeSeat 的 JSX 等价物)。 */
|
|
31
|
+
export declare function ChatNodeSeatMirror(props: {
|
|
32
|
+
node: ChatNodeFace;
|
|
33
|
+
groupPart?: 'response' | 'reasoning';
|
|
34
|
+
store?: ChatNodeStoreFace;
|
|
35
|
+
/** turn → 已展开的 answerStep(官方 store 的 storedTurnProcessEntry)。 */
|
|
36
|
+
openState: ReadonlyMap<number, number>;
|
|
37
|
+
onSetOpen(turn: number, answerStep: number, open: boolean): void;
|
|
38
|
+
/** 官方 usePresentation(policy => policy.foldCompletedTurns);历史只读视图恒 true。 */
|
|
39
|
+
foldCompleted: boolean;
|
|
40
|
+
renderNode: NodeRenderer;
|
|
41
|
+
}): ReturnType<typeof h> | null;
|
|
42
|
+
export type { NodeLocationFace, TurnLocationFace };
|
|
43
|
+
//# sourceMappingURL=ChatNodeSeat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChatNodeSeat.d.ts","sourceRoot":"","sources":["../../../src/session/mirror/ChatNodeSeat.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,aAAa,IAAI,CAAC,EAAE,MAAM,OAAO,CAAA;AAC1C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAEtC,OAAO,KAAK,EACV,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,2BAA2B,EAC3B,mBAAmB,EACpB,MAAM,aAAa,CAAA;AAEpB;;GAEG;AACH,eAAO,MAAM,8BAA8B,EAAE,WAAW,CAAC,MAAM,CAS7D,CAAA;AAEF;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,iBAAiB,GAAG,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,2BAA2B,GAAG,SAAS,CAS3H;AAED,0EAA0E;AAC1E,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,mBAAmB,CAAA;IAC1B,QAAQ,EAAE,OAAO,CAAA;IACjB,UAAU,EAAE,OAAO,CAAA;IACnB,IAAI,EAAE,OAAO,CAAA;IACb,kEAAkE;IAClE,UAAU,EAAE,OAAO,CAAA;IACnB,OAAO,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAAA;CAC7B;AAED,uDAAuD;AACvD,MAAM,MAAM,YAAY,GAAG,CACzB,IAAI,EAAE,YAAY,EAClB,WAAW,EAAE,iBAAiB,GAAG,SAAS;AAC1C,kEAAkE;AAClE,SAAS,CAAC,EAAE,UAAU,GAAG,WAAW,KACjC,SAAS,CAAA;AAEd,mDAAmD;AACnD,wBAAgB,MAAM,CAAC,IAAI,EAAE,YAAY,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAGzE;AAED,8EAA8E;AAC9E,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,YAAY,GAAG,SAAS,GAAG,OAAO,CAK7E;AAED,4DAA4D;AAC5D,wBAAgB,kBAAkB,CAAC,KAAK,EAAE;IACxC,IAAI,EAAE,YAAY,CAAA;IAClB,SAAS,CAAC,EAAE,UAAU,GAAG,WAAW,CAAA;IACpC,KAAK,CAAC,EAAE,iBAAiB,CAAA;IACzB,iEAAiE;IACjE,SAAS,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACtC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,CAAA;IAChE,4EAA4E;IAC5E,aAAa,EAAE,OAAO,CAAA;IACtB,UAAU,EAAE,YAAY,CAAA;CACzB,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI,CAgE9B;AAED,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,CAAA"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
// 官方对照:packages/client/ui-chat/src/client/chat/ChatNodeSeat.tsx(0.1.7-rc.2 lib/client.js:1668-1771)
|
|
2
|
+
// + 同文件里的 ChatNodeList(lib/client.js:5004-5038,order → seat 列表)。
|
|
3
|
+
//
|
|
4
|
+
// 这是「官方把一个 turn 折成一行」的全部判定,逐行照抄(源码行号见兄弟项目 ui-map §十七):
|
|
5
|
+
// liveProcess = presentation && !turnClosed
|
|
6
|
+
// alwaysOpen = liveProcess || hasInterleavedInput || turnProcessAlwaysOpen(node)
|
|
7
|
+
// processOpen = alwaysOpen || stored.answerStep === spec.answerStep
|
|
8
|
+
// processWindowReady = spec && presentation && foldCompleted && presentation.turn === spec.turn && (turnStarted || turnClosed)
|
|
9
|
+
// processMember = !TURN_PROCESS_INDEPENDENT_KINDS.has(kind) && anchorSeq >= spec.processStartSeq
|
|
10
|
+
// && (liveProcess || spec.answerAnchorSeq === null || anchorSeq < spec.answerAnchorSeq
|
|
11
|
+
// || groupPart === 'reasoning' && kind === 'assistant-step' && data.step === spec.answerStep)
|
|
12
|
+
// processAnswer = !liveProcess && groupPart !== 'reasoning' && kind === 'assistant-step' && data.step === spec.answerStep
|
|
13
|
+
// ownsDisclosure = kind === 'turn-process' || processAnswer
|
|
14
|
+
// foldable = processWindowReady && (liveProcess || processMember || ownsDisclosure)
|
|
15
|
+
// controllerInactive = kind === 'turn-process' && foldCompleted && !foldable
|
|
16
|
+
// compactAnswer = processAnswer && foldable && presentation.compactAnswer && !processOpen
|
|
17
|
+
// processHidden = controllerInactive || (foldable && processMember && !processOpen)
|
|
18
|
+
// 折叠 = 给 flowItem 写 hidden 属性(官方由 useSearchableHidden 响应式置位,这里声明式写)。
|
|
19
|
+
// ⚠ 与官方的两点已知偏差(只读历史场景等价,写在此处便于日后 diff):
|
|
20
|
+
// 1. 官方每个 seat 各自订阅 nodeStore/processSource;我们按「外层快照变化 ⇒ 整体重算」读取。
|
|
21
|
+
// 2. 官方 grouped('chat') 的分组项(ChatGroupSeat)由 process-groups.ts 算法移植补齐。
|
|
22
|
+
import { createElement as h } from 'react';
|
|
23
|
+
import { officialClass } from '../official-classes.js';
|
|
24
|
+
/**
|
|
25
|
+
* 官方 TURN_PROCESS_INDEPENDENT_KINDS(lib/client.js:1525):这些 kind 永远不进过程折叠区。
|
|
26
|
+
*/
|
|
27
|
+
export const TURN_PROCESS_INDEPENDENT_KINDS = new Set([
|
|
28
|
+
'system-prompt',
|
|
29
|
+
'user',
|
|
30
|
+
'steering',
|
|
31
|
+
'turn-trigger',
|
|
32
|
+
'turn-process',
|
|
33
|
+
'turn-error',
|
|
34
|
+
'turn-max-tokens',
|
|
35
|
+
'turn-tail',
|
|
36
|
+
]);
|
|
37
|
+
/**
|
|
38
|
+
* 读过程席位快照。宿主 API 形态变了也只降级成「不折叠」,不让整个弹窗白屏。
|
|
39
|
+
*/
|
|
40
|
+
export function readPresentation(store, key) {
|
|
41
|
+
if (store === undefined)
|
|
42
|
+
return undefined;
|
|
43
|
+
try {
|
|
44
|
+
const source = store.processSource;
|
|
45
|
+
if (typeof source !== 'function')
|
|
46
|
+
return undefined;
|
|
47
|
+
return source.call(store, key)?.getSnapshot();
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
return undefined;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/** 取节点所属 turn(官方 turnOf,ChatNodeSeat.tsx:1660)。 */
|
|
54
|
+
export function turnOf(node) {
|
|
55
|
+
const location = node?.location;
|
|
56
|
+
return location?.kind === 'turn' || location?.kind === 'step' ? location.turn?.turn : undefined;
|
|
57
|
+
}
|
|
58
|
+
/** 官方 turnProcessAlwaysOpen(lib/client.js:1558):live / 已停止 / 失败的 turn 不折叠。 */
|
|
59
|
+
export function turnProcessAlwaysOpen(node) {
|
|
60
|
+
const location = node?.location;
|
|
61
|
+
if (location?.kind !== 'turn' && location?.kind !== 'step')
|
|
62
|
+
return false;
|
|
63
|
+
const reason = location.turn?.end?.data?.reason?.kind;
|
|
64
|
+
return location.turn?.status === 'open' || reason === 'aborted' || reason === 'error';
|
|
65
|
+
}
|
|
66
|
+
/** 一个 keyed 节点 → 一个 flowItem(官方 ChatNodeSeat 的 JSX 等价物)。 */
|
|
67
|
+
export function ChatNodeSeatMirror(props) {
|
|
68
|
+
const { node, groupPart, store, openState, onSetOpen, foldCompleted, renderNode } = props;
|
|
69
|
+
const turn = turnOf(node);
|
|
70
|
+
const presentation = readPresentation(store, node.key);
|
|
71
|
+
// 官方 spec 来自 presentation;弹窗读归档会话时投影可能更薄 ⇒ turn-process 自身 data 兜底。
|
|
72
|
+
const spec = (presentation?.spec ?? undefined)
|
|
73
|
+
?? (node.kind === 'turn-process' ? node.data : undefined);
|
|
74
|
+
const liveProcess = presentation !== undefined && presentation.turnClosed !== true;
|
|
75
|
+
const interleavedInput = presentation?.hasInterleavedInput === true;
|
|
76
|
+
const alwaysOpen = liveProcess || interleavedInput || turnProcessAlwaysOpen(node);
|
|
77
|
+
const storedAnswerStep = turn === undefined ? undefined : openState.get(turn);
|
|
78
|
+
const processOpen = alwaysOpen || (spec !== undefined && storedAnswerStep === (spec.answerStep ?? 0));
|
|
79
|
+
const setOpen = (open) => {
|
|
80
|
+
if (spec !== undefined && !alwaysOpen && turn !== undefined)
|
|
81
|
+
onSetOpen(turn, spec.answerStep ?? 0, open);
|
|
82
|
+
};
|
|
83
|
+
const processWindowReady = spec !== undefined && presentation !== undefined && foldCompleted
|
|
84
|
+
&& presentation.turn === spec.turn
|
|
85
|
+
&& (presentation.turnStarted === true || presentation.turnClosed === true);
|
|
86
|
+
const dataStep = typeof node.data?.step === 'number' ? node.data.step : undefined;
|
|
87
|
+
const processMember = processWindowReady && spec !== undefined
|
|
88
|
+
&& !TURN_PROCESS_INDEPENDENT_KINDS.has(node.kind)
|
|
89
|
+
&& node.anchorSeq >= spec.processStartSeq
|
|
90
|
+
&& (liveProcess
|
|
91
|
+
|| spec.answerAnchorSeq === null
|
|
92
|
+
|| node.anchorSeq < spec.answerAnchorSeq
|
|
93
|
+
|| (groupPart === 'reasoning' && node.kind === 'assistant-step' && dataStep === spec.answerStep));
|
|
94
|
+
const processAnswer = processWindowReady && spec !== undefined && !liveProcess
|
|
95
|
+
&& groupPart !== 'reasoning'
|
|
96
|
+
&& node.kind === 'assistant-step'
|
|
97
|
+
&& dataStep === spec.answerStep;
|
|
98
|
+
const ownsDisclosure = node.kind === 'turn-process' || processAnswer;
|
|
99
|
+
const foldable = processWindowReady && (liveProcess || processMember || ownsDisclosure);
|
|
100
|
+
const turnProcess = spec === undefined ? undefined : {
|
|
101
|
+
spec,
|
|
102
|
+
foldable,
|
|
103
|
+
hasContent: !interleavedInput && (presentation?.hasExternalProcess === true || spec.inlineReasoning),
|
|
104
|
+
open: processOpen,
|
|
105
|
+
alwaysOpen,
|
|
106
|
+
setOpen,
|
|
107
|
+
};
|
|
108
|
+
const controllerInactive = node.kind === 'turn-process' && foldCompleted && !foldable;
|
|
109
|
+
const compactAnswer = processAnswer && foldable && presentation?.compactAnswer === true && !processOpen;
|
|
110
|
+
const processHidden = controllerInactive || (foldable && processMember && !processOpen);
|
|
111
|
+
// ⚠ groupPart 必须传给节点视图:'reasoning' 只渲染思考块、'response' 只渲染回复正文
|
|
112
|
+
// (官方块渲染器 lib/client.js:5824-5825)。漏传会把整步(思考+文本+工具块)全画出来——
|
|
113
|
+
// 步内工具块再画一张 = 与独立工具节点重复(真机踩过,2026-09-27)。
|
|
114
|
+
const inner = renderNode(node, turnProcess, groupPart);
|
|
115
|
+
if (inner === null || inner === undefined)
|
|
116
|
+
return null;
|
|
117
|
+
const flowKey = groupPart === undefined || groupPart === 'response' ? node.key : JSON.stringify([node.key, groupPart]);
|
|
118
|
+
return h('div', {
|
|
119
|
+
className: officialClass('ChatView', 'flowItem') ?? '',
|
|
120
|
+
'data-chat-anchor-key': flowKey,
|
|
121
|
+
'data-chat-flow-key': flowKey,
|
|
122
|
+
'data-chat-paging-anchor': node.kind !== 'turn-process' || undefined,
|
|
123
|
+
'data-chat-node-key': node.key,
|
|
124
|
+
'data-chat-group-part': groupPart,
|
|
125
|
+
'data-chat-flow-kind': node.kind,
|
|
126
|
+
'data-chat-turn': turn,
|
|
127
|
+
'data-turn-process-member': processMember || undefined,
|
|
128
|
+
'data-turn-process-hidden': processHidden || undefined,
|
|
129
|
+
'data-turn-process-answer': compactAnswer || undefined,
|
|
130
|
+
hidden: processHidden || undefined,
|
|
131
|
+
}, inner);
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=ChatNodeSeat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChatNodeSeat.js","sourceRoot":"","sources":["../../../src/session/mirror/ChatNodeSeat.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { createElement as h } from 'react';
|
|
2
|
+
import type { ReactNode } from 'react';
|
|
3
|
+
import type { Translate } from '../../utils/i18n.js';
|
|
4
|
+
import type { ChatNodeStoreFace, TurnsFace } from '../faces.js';
|
|
5
|
+
import type { NodeRenderer } from './ChatNodeSeat.js';
|
|
6
|
+
import type { ChatEntry, ProcessGroupSnapshot } from './process-groups.js';
|
|
7
|
+
/** 会话区骨架:frame > root > scroll > column(类名一律取官方 ChatView.module.css,取不到 = 空类)。
|
|
8
|
+
*
|
|
9
|
+
* `dshpc-sv-frame` / `dshpc-sv-scroll` = 本包**稳定钩子类**(不走 officialClass 发现,官方类命中时也照样挂):
|
|
10
|
+
* 会话区**纵向间距的唯一真源**。官方 scroll 自带纵向 16px、官方 frame 的纵向值又不确定,
|
|
11
|
+
* 归一方案(移植自兄弟项目 2026-10-03 定尺):**scroll 钩子把官方纵向 16px 归零,
|
|
12
|
+
* frame 钩子独自定 17/17**,两条钩子都用双类名提高特异性压过官方 CSS module(0,2,0 > 0,1,0),
|
|
13
|
+
* 不依赖注入顺序 ⇒ 命中 / 未命中两条路径纵向完全一致。
|
|
14
|
+
*/
|
|
15
|
+
export declare function ChatViewFrame(props: {
|
|
16
|
+
children?: ReactNode;
|
|
17
|
+
}): ReturnType<typeof h>;
|
|
18
|
+
/** 官方 ChatNodeList:order → seat 列表(grouped 视图 = entries + groups 路径)。 */
|
|
19
|
+
export declare function ChatNodeListMirror(props: {
|
|
20
|
+
order: readonly string[];
|
|
21
|
+
store?: ChatNodeStoreFace;
|
|
22
|
+
/** 官方 grouped('chat') 的 entries + 组快照(buildProcessGroups 产出);缺省走 order 兜底。 */
|
|
23
|
+
entries?: ReadonlyArray<ChatEntry>;
|
|
24
|
+
groups?: ReadonlyMap<string, ProcessGroupSnapshot>;
|
|
25
|
+
/** 官方 timeline.turns(判 turn 是否 open ⇒ grouped 政策)。 */
|
|
26
|
+
turns?: TurnsFace;
|
|
27
|
+
openState: ReadonlyMap<number, number>;
|
|
28
|
+
onSetOpen(turn: number, answerStep: number, open: boolean): void;
|
|
29
|
+
foldCompleted: boolean;
|
|
30
|
+
renderNode: NodeRenderer;
|
|
31
|
+
t: Translate;
|
|
32
|
+
}): Array<ReturnType<typeof h> | null>;
|
|
33
|
+
/** 加载 / 空态提示行(13px tertiary)。 */
|
|
34
|
+
export declare function ChatHint(props: {
|
|
35
|
+
text: string;
|
|
36
|
+
}): ReturnType<typeof h>;
|
|
37
|
+
/** 「加载更早记录」按钮(官方 older:按钮 4px 12px / 12px 字号 / radius-sm / 底色 interactive-bg-hover-solid)。 */
|
|
38
|
+
export declare function ChatOlderButton(props: {
|
|
39
|
+
label: string;
|
|
40
|
+
onClick: () => void;
|
|
41
|
+
}): ReturnType<typeof h>;
|
|
42
|
+
/** 「到底部」悬浮钮(官方 toBottom:34×34 圆形悬浮,仅在有更多历史时显示)。 */
|
|
43
|
+
export declare function ChatToBottom(props: {
|
|
44
|
+
label: string;
|
|
45
|
+
onClick: () => void;
|
|
46
|
+
}): ReturnType<typeof h>;
|
|
47
|
+
//# sourceMappingURL=ChatView.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChatView.d.ts","sourceRoot":"","sources":["../../../src/session/mirror/ChatView.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,aAAa,IAAI,CAAC,EAAE,MAAM,OAAO,CAAA;AAC1C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAEtC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAC/D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAGrD,OAAO,KAAK,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAE1E;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE;IAAE,QAAQ,CAAC,EAAE,SAAS,CAAA;CAAE,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAQnF;AAED,yEAAyE;AACzE,wBAAgB,kBAAkB,CAAC,KAAK,EAAE;IACxC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAA;IACxB,KAAK,CAAC,EAAE,iBAAiB,CAAA;IACzB,8EAA8E;IAC9E,OAAO,CAAC,EAAE,aAAa,CAAC,SAAS,CAAC,CAAA;IAClC,MAAM,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAA;IAClD,sDAAsD;IACtD,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,SAAS,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACtC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,CAAA;IAChE,aAAa,EAAE,OAAO,CAAA;IACtB,UAAU,EAAE,YAAY,CAAA;IACxB,CAAC,EAAE,SAAS,CAAA;CACb,GAAG,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CA8ErC;AAQD,iCAAiC;AACjC,wBAAgB,QAAQ,CAAC,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAEtE;AAED,8FAA8F;AAC9F,wBAAgB,eAAe,CAAC,KAAK,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,IAAI,CAAA;CAAE,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAInG;AAED,mDAAmD;AACnD,wBAAgB,YAAY,CAAC,KAAK,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,IAAI,CAAA;CAAE,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAIhG"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
// 官方对照:packages/client/ui-chat/src/client/chat/ChatView.tsx(0.1.7-rc.2 lib/client.js:5004-5260)
|
|
2
|
+
// 骨架四层:frame(> TurnNavigator)> root[data-chat-following-tail] > scroll > column[data-chat-flow]
|
|
3
|
+
// column 子项:hint(loading)/ openError / older(hasMore)/ 各 flowItem(ChatNodeList)
|
|
4
|
+
// root 内另有 toBottomSlot(官方按「是否贴尾」显隐,弹窗恒贴尾 ⇒ 不渲染)。
|
|
5
|
+
// ChatNodeList:entries → seat;官方 entries 优先取 grouped('chat'),取不到时 = order.map(key)。
|
|
6
|
+
import { createElement as h } from 'react';
|
|
7
|
+
import { officialClass } from '../official-classes.js';
|
|
8
|
+
import { ChatGroupSeatMirror } from './ChatGroupSeat.js';
|
|
9
|
+
import { ChatNodeSeatMirror } from './ChatNodeSeat.js';
|
|
10
|
+
/** 会话区骨架:frame > root > scroll > column(类名一律取官方 ChatView.module.css,取不到 = 空类)。
|
|
11
|
+
*
|
|
12
|
+
* `dshpc-sv-frame` / `dshpc-sv-scroll` = 本包**稳定钩子类**(不走 officialClass 发现,官方类命中时也照样挂):
|
|
13
|
+
* 会话区**纵向间距的唯一真源**。官方 scroll 自带纵向 16px、官方 frame 的纵向值又不确定,
|
|
14
|
+
* 归一方案(移植自兄弟项目 2026-10-03 定尺):**scroll 钩子把官方纵向 16px 归零,
|
|
15
|
+
* frame 钩子独自定 17/17**,两条钩子都用双类名提高特异性压过官方 CSS module(0,2,0 > 0,1,0),
|
|
16
|
+
* 不依赖注入顺序 ⇒ 命中 / 未命中两条路径纵向完全一致。
|
|
17
|
+
*/
|
|
18
|
+
export function ChatViewFrame(props) {
|
|
19
|
+
return h('div', { className: `${officialClass('ChatView', 'frame') ?? ''} dshpc-sv-frame dshpc-sv-chat` }, h('div', { className: officialClass('ChatView', 'root') ?? '' }, h('div', { className: `${officialClass('ChatView', 'scroll') ?? ''} dshpc-sv-scroll` }, h('div', { className: officialClass('ChatView', 'column') ?? '', 'data-chat-flow': '' }, props.children))));
|
|
20
|
+
}
|
|
21
|
+
/** 官方 ChatNodeList:order → seat 列表(grouped 视图 = entries + groups 路径)。 */
|
|
22
|
+
export function ChatNodeListMirror(props) {
|
|
23
|
+
const { order, store, entries, groups, turns, openState, onSetOpen, foldCompleted, renderNode, t } = props;
|
|
24
|
+
const rows = [];
|
|
25
|
+
const read = store === undefined ? undefined : store.get;
|
|
26
|
+
if (typeof read !== 'function' || store === undefined)
|
|
27
|
+
return rows;
|
|
28
|
+
const readSafe = (key) => {
|
|
29
|
+
try {
|
|
30
|
+
return read.call(store, key);
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return undefined;
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
if (entries !== undefined && groups !== undefined) {
|
|
37
|
+
// 官方 deferCollapse:**每一轮(turn)的最后那一个过程组**保持 flat
|
|
38
|
+
// (不画「已完成分析…」头、组内条目直接铺开),该轮其余组照常收折。
|
|
39
|
+
// 例:turn 1 切出 2 组 ⇒ 前 1 组收折、最后 1 组平铺;turn 3 切出 5 组 ⇒ 前 4 组收折、最后 1 组平铺。
|
|
40
|
+
// ⚠️ turn = -1 的组(command 节点无 turn location,process-groups.ts:176 `turn ?? -1`)
|
|
41
|
+
// **不开新轮**,并入它前面那一轮 —— 否则会被单独当成一轮、多平铺一处(真机 2026-10-23)。
|
|
42
|
+
const flatKeys = new Set();
|
|
43
|
+
{
|
|
44
|
+
let bucket = [];
|
|
45
|
+
let bucketTurn;
|
|
46
|
+
const closeBucket = () => {
|
|
47
|
+
const last = bucket[bucket.length - 1];
|
|
48
|
+
if (last !== undefined)
|
|
49
|
+
flatKeys.add(last);
|
|
50
|
+
bucket = [];
|
|
51
|
+
};
|
|
52
|
+
for (const entry of entries) {
|
|
53
|
+
if (entry.kind !== 'group')
|
|
54
|
+
continue;
|
|
55
|
+
const turn = groups.get(entry.key)?.data.turn ?? -1;
|
|
56
|
+
if (turn >= 1) {
|
|
57
|
+
if (bucketTurn !== undefined && turn !== bucketTurn)
|
|
58
|
+
closeBucket();
|
|
59
|
+
bucketTurn = turn;
|
|
60
|
+
}
|
|
61
|
+
bucket.push(entry.key);
|
|
62
|
+
}
|
|
63
|
+
closeBucket();
|
|
64
|
+
}
|
|
65
|
+
// 官方 ChatNodeList 的 entries 路径:group 条目 → ChatGroupSeat(二级收折)。
|
|
66
|
+
for (const entry of entries) {
|
|
67
|
+
if (entry.kind === 'group') {
|
|
68
|
+
const group = groups.get(entry.key);
|
|
69
|
+
if (group === undefined)
|
|
70
|
+
continue;
|
|
71
|
+
const latest = flatKeys.has(group.key);
|
|
72
|
+
rows.push(h(ChatGroupSeatMirror, {
|
|
73
|
+
key: entry.key,
|
|
74
|
+
group,
|
|
75
|
+
grouped: turnStatus(turns, group.data.turn) !== 'open' && !latest,
|
|
76
|
+
store,
|
|
77
|
+
openState,
|
|
78
|
+
onSetOpen,
|
|
79
|
+
foldCompleted,
|
|
80
|
+
renderNode,
|
|
81
|
+
t,
|
|
82
|
+
}));
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
const node = readSafe(entry.key);
|
|
86
|
+
if (node === undefined)
|
|
87
|
+
continue;
|
|
88
|
+
rows.push(h(ChatNodeSeatMirror, {
|
|
89
|
+
key: JSON.stringify([entry.key, entry.groupPart ?? null]),
|
|
90
|
+
node,
|
|
91
|
+
groupPart: entry.groupPart,
|
|
92
|
+
store,
|
|
93
|
+
openState,
|
|
94
|
+
onSetOpen,
|
|
95
|
+
foldCompleted,
|
|
96
|
+
renderNode,
|
|
97
|
+
}));
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return rows;
|
|
101
|
+
}
|
|
102
|
+
for (const key of order) {
|
|
103
|
+
const node = readSafe(key);
|
|
104
|
+
if (node === undefined)
|
|
105
|
+
continue;
|
|
106
|
+
rows.push(h(ChatNodeSeatMirror, { key, node, store, openState, onSetOpen, foldCompleted, renderNode }));
|
|
107
|
+
}
|
|
108
|
+
return rows;
|
|
109
|
+
}
|
|
110
|
+
/** turn 状态(官方 turns.get(turn)?.status)。 */
|
|
111
|
+
function turnStatus(turns, turn) {
|
|
112
|
+
const row = turns?.get(turn) ?? turns?.get(String(turn));
|
|
113
|
+
return row?.status;
|
|
114
|
+
}
|
|
115
|
+
/** 加载 / 空态提示行(13px tertiary)。 */
|
|
116
|
+
export function ChatHint(props) {
|
|
117
|
+
return h('div', { className: officialClass('ChatView', 'hint') ?? '' }, props.text);
|
|
118
|
+
}
|
|
119
|
+
/** 「加载更早记录」按钮(官方 older:按钮 4px 12px / 12px 字号 / radius-sm / 底色 interactive-bg-hover-solid)。 */
|
|
120
|
+
export function ChatOlderButton(props) {
|
|
121
|
+
return h('div', { className: officialClass('ChatView', 'older') ?? '' }, h('button', { type: 'button', onClick: props.onClick }, props.label));
|
|
122
|
+
}
|
|
123
|
+
/** 「到底部」悬浮钮(官方 toBottom:34×34 圆形悬浮,仅在有更多历史时显示)。 */
|
|
124
|
+
export function ChatToBottom(props) {
|
|
125
|
+
return h('div', { className: officialClass('ChatView', 'toBottomSlot') ?? '' }, h('button', { type: 'button', className: officialClass('ChatView', 'toBottom') ?? '', onClick: props.onClick, 'aria-label': props.label }, '↓'));
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=ChatView.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChatView.js","sourceRoot":"","sources":["../../../src/session/mirror/ChatView.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
import type { Translate } from '../../utils/i18n.js';
|
|
3
|
+
/** 官方 CommandNode(conversation-nodes/command.ts / records.d.ts):斜杠命令生命周期节点。 */
|
|
4
|
+
export interface CommandNodeFace {
|
|
5
|
+
readonly name?: string | null;
|
|
6
|
+
readonly args?: string | null;
|
|
7
|
+
readonly outcome?: {
|
|
8
|
+
readonly kind?: string;
|
|
9
|
+
readonly text?: string;
|
|
10
|
+
} | null;
|
|
11
|
+
}
|
|
12
|
+
/** 命令卡(官方 GenericCommandCard 镜像):裸命令名 + 落定摘要 + 多行输出可展开。 */
|
|
13
|
+
export declare function CommandCard(props: {
|
|
14
|
+
/** 官方 CommandNode(name/args/outcome)。 */
|
|
15
|
+
node: CommandNodeFace;
|
|
16
|
+
t: Translate;
|
|
17
|
+
/** 未决态运行文案;缺省用 t('commandRunning')(官方 command.running)。 */
|
|
18
|
+
runningSummary?: string;
|
|
19
|
+
}): ReactNode;
|
|
20
|
+
//# sourceMappingURL=CommandCard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CommandCard.d.ts","sourceRoot":"","sources":["../../../src/session/mirror/CommandCard.ts"],"names":[],"mappings":"AAUA,OAAO,EAAuD,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAG3F,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAEpD,+EAA+E;AAC/E,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,QAAQ,CAAC,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAA;CAC7E;AAaD,2DAA2D;AAC3D,wBAAgB,WAAW,CAAC,KAAK,EAAE;IACjC,yCAAyC;IACzC,IAAI,EAAE,eAAe,CAAA;IACrB,CAAC,EAAE,SAAS,CAAA;IACZ,2DAA2D;IAC3D,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB,GAAG,SAAS,CAkDZ"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
// 官方 GenericCommandCard(ui-chat/src/client/chat/GenericCommandCard.tsx @ master,原样复刻)镜像:
|
|
2
|
+
// · 行标题 = 裸命令名 node.name,缺席兜底 t('commandTitle')(官方 command.title = 指令 / Command)。
|
|
3
|
+
// · 摘要 = outcome 落定 text:未决(outcome===null) = t('commandRunning')(执行中…);
|
|
4
|
+
// 已决无 text 按 kind 取 t('commandFailed')(指令失败)/ t('commandDone')(已完成)。**不用 args**。
|
|
5
|
+
// · state = running(未决) / error(outcome.kind==='error') / ok;running/error 各挂一个 visually-hidden 读屏状态词。
|
|
6
|
+
// · 展开体仅当 outcome.text 含换行(多行)才可展开;展开体 = 原文 pre-wrap。
|
|
7
|
+
// · 分隔符 = 2×2 小圆点;错误态 summary/body 用 error 色。
|
|
8
|
+
// 样式一律取宿主注入的官方 GenericCommandCard.module.css 类(officialClass),**不写自绘兜底**:
|
|
9
|
+
// 本包只跑在 DSH 宿主上、官方样式必在场;官方大版本更新我们跟着更,兜底既防不住「官方加东西」也无意义
|
|
10
|
+
// (用户 2026-10-23 定)。取不到官方类时退化为空类(裸结构、不白屏);读屏 visually-hidden 复用 ToolRow 同名工具类。
|
|
11
|
+
import { Fragment, createElement as h, useCallback, useState } from 'react';
|
|
12
|
+
import { DisclosureRow, IconApiOutlineRegular, TextShimmer } from '../../ui/official.js';
|
|
13
|
+
import { officialClass } from '../official-classes.js';
|
|
14
|
+
/** 官方 GenericCommandCard 模块类(宿主必注入;缺席 = 空串,裸结构不白屏,不写自绘兜底)。 */
|
|
15
|
+
const gcc = (semantic) => officialClass('GenericCommandCard', semantic) ?? '';
|
|
16
|
+
/** 官方 stateOf:未决 = running;outcome.kind==='error' = error;否则 ok。 */
|
|
17
|
+
function stateOf(outcome) {
|
|
18
|
+
if (outcome === null || outcome === undefined)
|
|
19
|
+
return 'running';
|
|
20
|
+
return outcome.kind === 'error' ? 'error' : 'ok';
|
|
21
|
+
}
|
|
22
|
+
/** 命令卡(官方 GenericCommandCard 镜像):裸命令名 + 落定摘要 + 多行输出可展开。 */
|
|
23
|
+
export function CommandCard(props) {
|
|
24
|
+
const { node, t, runningSummary } = props;
|
|
25
|
+
const [expanded, setExpanded] = useState(false);
|
|
26
|
+
const outcome = node.outcome ?? null;
|
|
27
|
+
const text = outcome?.text;
|
|
28
|
+
const summary = outcome === null
|
|
29
|
+
? runningSummary ?? t('commandRunning')
|
|
30
|
+
: text ?? (outcome.kind === 'error' ? t('commandFailed') : t('commandDone'));
|
|
31
|
+
const title = node.name ?? t('commandTitle');
|
|
32
|
+
const state = stateOf(outcome);
|
|
33
|
+
const running = state === 'running';
|
|
34
|
+
// 官方:仅多行 text 才给展开体(单行摘要已够,不出 chevron)。
|
|
35
|
+
const body = text !== undefined && text.includes('\n') ? text : null;
|
|
36
|
+
const open = expanded && body !== null;
|
|
37
|
+
const toggle = useCallback(() => { setExpanded((value) => !value); }, []);
|
|
38
|
+
// 读屏 visually-hidden:复用 ToolRow 同名工具类(既有,非新写兜底)。
|
|
39
|
+
const hidden = officialClass('ToolRow', 'visuallyHidden') ?? '';
|
|
40
|
+
return h('div', { className: gcc('root'), 'data-state': state },
|
|
41
|
+
// 官方 a11y:running/error 的读屏状态词(visually-hidden,不占可见空间)。
|
|
42
|
+
state === 'running'
|
|
43
|
+
? h('span', { className: hidden }, t('rowRunning'))
|
|
44
|
+
: state === 'error'
|
|
45
|
+
? h('span', { className: hidden }, t('rowFailed'))
|
|
46
|
+
: null, h(DisclosureRow, {
|
|
47
|
+
leadingClassName: gcc('leading'),
|
|
48
|
+
titleClassName: gcc('title'),
|
|
49
|
+
icon: h(IconApiOutlineRegular, { size: 14 }),
|
|
50
|
+
title,
|
|
51
|
+
running,
|
|
52
|
+
open,
|
|
53
|
+
expandable: body !== null,
|
|
54
|
+
expandOnRowClick: true,
|
|
55
|
+
keepContentWhenOpen: true,
|
|
56
|
+
onToggle: toggle,
|
|
57
|
+
collapsedContent: h(Fragment, null, h('span', { className: gcc('separator'), 'aria-hidden': true }), h('span', {
|
|
58
|
+
className: gcc('summary'),
|
|
59
|
+
'data-error': state === 'error' || undefined,
|
|
60
|
+
}, h(TextShimmer, { active: running }, summary))),
|
|
61
|
+
children: open && body !== null
|
|
62
|
+
? h('div', {
|
|
63
|
+
className: gcc('body'),
|
|
64
|
+
'data-error': state === 'error' || undefined,
|
|
65
|
+
}, body)
|
|
66
|
+
: undefined,
|
|
67
|
+
}));
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=CommandCard.js.map
|