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
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
// 官方对照:packages/client/ui-chat/src/client/chat/MessageIconActions.tsx(0.1.7-rc.2 lib/client.js:1098-1163)
|
|
2
|
+
// data-clock=start|end;start 时时钟在行首,end 时「用量 + 时钟」一起放进 endInfo(右对齐)
|
|
3
|
+
// > 复制(Tooltip「复制 / 已复制」,成功 1 秒后复位,用官方 writeClipboard)
|
|
4
|
+
// > extraActions(官方留给 👍👎 之类的插槽,弹窗没有 ⇒ 不传)
|
|
5
|
+
// > 分支(Tooltip「在新对话中分支 / 仅可从已完成轮次的最后一条消息分支」,unavailable 时 aria-disabled)
|
|
6
|
+
// > endInfo:usageAction + time(官方 formatMessageClock)
|
|
7
|
+
import { createElement as h, useEffect, useRef, useState } from 'react';
|
|
8
|
+
import { IconBranchOutlineRegular, IconCheckOutlineRegular, IconCopyOutlineRegular, Tooltip, writeClipboard, } from '../../ui/official.js';
|
|
9
|
+
import { officialClass } from '../official-classes.js';
|
|
10
|
+
import { formatMessageClock } from './message-chrome.js';
|
|
11
|
+
/** 官方「已复制」复位时间。 */
|
|
12
|
+
const COPIED_RESET_MS = 1000;
|
|
13
|
+
/** 消息操作行(复制 / 分支 / 用量 / 时钟)。 */
|
|
14
|
+
export function MessageIconActionsMirror(props) {
|
|
15
|
+
const { text, time, clock, onBranch, branchUnavailable = false, className, extraActions, usageAction, t } = props;
|
|
16
|
+
const [copied, setCopied] = useState(false);
|
|
17
|
+
const [pending, setPending] = useState(false);
|
|
18
|
+
const timerRef = useRef(undefined);
|
|
19
|
+
useEffect(() => () => { if (timerRef.current !== undefined)
|
|
20
|
+
clearTimeout(timerRef.current); }, []);
|
|
21
|
+
const copyLabel = copied ? t('copiedLabel') : t('copyLabel');
|
|
22
|
+
const onCopy = () => {
|
|
23
|
+
if (copied || pending)
|
|
24
|
+
return;
|
|
25
|
+
setPending(true);
|
|
26
|
+
void writeClipboard(text).then((ok) => {
|
|
27
|
+
setPending(false);
|
|
28
|
+
if (!ok)
|
|
29
|
+
return;
|
|
30
|
+
setCopied(true);
|
|
31
|
+
timerRef.current = setTimeout(() => { setCopied(false); }, COPIED_RESET_MS);
|
|
32
|
+
});
|
|
33
|
+
};
|
|
34
|
+
// 官方语义名是 timeStart / timeEnd(assistant 尾部 = timeEnd,字号 13px-1px)——**没有 .clock**。
|
|
35
|
+
// 之前写 'clock' 恒取不到 ⇒ 空类 ⇒ 时间吃浏览器默认 16px(真机 2026-10-23「时间偏大」)。
|
|
36
|
+
// 老版本若叫 clock 也做候选兼容(都是官方语义名,不是自绘样式)。
|
|
37
|
+
const clockClass = (clock === 'end'
|
|
38
|
+
? officialClass('MessageIconActions', 'timeEnd') ?? officialClass('MessageIconActions', 'clock')
|
|
39
|
+
: officialClass('MessageIconActions', 'timeStart') ?? officialClass('MessageIconActions', 'clock')) ?? '';
|
|
40
|
+
const clockEl = time === undefined ? null : h('time', {
|
|
41
|
+
className: clockClass,
|
|
42
|
+
dateTime: new Date(time).toISOString(),
|
|
43
|
+
}, formatMessageClock(time, t));
|
|
44
|
+
const reasonId = 'dshpc-sv-branch-unavailable';
|
|
45
|
+
return h('div', {
|
|
46
|
+
className: `${officialClass('MessageIconActions', 'actions') ?? ''}${className === undefined ? '' : ` ${className}`}`,
|
|
47
|
+
'data-clock': clock,
|
|
48
|
+
}, clock === 'start' ? clockEl : null, h(Tooltip, { label: copyLabel, side: 'bottom' }, h('button', {
|
|
49
|
+
type: 'button',
|
|
50
|
+
className: officialClass('MessageIconActions', 'action') ?? '',
|
|
51
|
+
'aria-label': copyLabel,
|
|
52
|
+
onClick: onCopy,
|
|
53
|
+
}, copied
|
|
54
|
+
? h(IconCheckOutlineRegular, null)
|
|
55
|
+
: h(IconCopyOutlineRegular, null))), extraActions, onBranch === undefined
|
|
56
|
+
? null
|
|
57
|
+
: h(Tooltip, { label: branchUnavailable ? t('branchUnavailableLabel') : t('branchLabel'), side: 'bottom' }, h('button', {
|
|
58
|
+
type: 'button',
|
|
59
|
+
className: officialClass('MessageIconActions', 'action') ?? '',
|
|
60
|
+
'aria-label': t('branchLabel'),
|
|
61
|
+
'aria-disabled': branchUnavailable || undefined,
|
|
62
|
+
'aria-describedby': branchUnavailable ? reasonId : undefined,
|
|
63
|
+
'data-unavailable': branchUnavailable || undefined,
|
|
64
|
+
onClick: branchUnavailable ? undefined : onBranch,
|
|
65
|
+
}, h(IconBranchOutlineRegular, null))), onBranch === undefined || !branchUnavailable
|
|
66
|
+
? null
|
|
67
|
+
: h('span', { id: reasonId, className: officialClass('accessibility', 'visuallyHidden') ?? '' }, t('branchUnavailableLabel')), clock === 'end'
|
|
68
|
+
? h('span', { className: officialClass('MessageIconActions', 'endInfo') ?? '' }, usageAction, clockEl)
|
|
69
|
+
: usageAction);
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=MessageIconActions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MessageIconActions.js","sourceRoot":"","sources":["../../../src/session/mirror/MessageIconActions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { createElement as h } from 'react';
|
|
2
|
+
import type { Translate } from '../../utils/i18n.js';
|
|
3
|
+
/** 助手正文:官方 MarkdownText 渲染 + 官方 AssistantMarkdown.root 类(fallback 自绘)。
|
|
4
|
+
* U11:fileMentions 词表就位时行内 code 文件引用渲成可点链接(官方语义:resolve 不出保持惰性 code)。 */
|
|
5
|
+
export declare function AssistantMarkdown(props: {
|
|
6
|
+
text: string;
|
|
7
|
+
fileMentions?: {
|
|
8
|
+
resolve(value: string): {
|
|
9
|
+
open(): void;
|
|
10
|
+
label: string;
|
|
11
|
+
title: string;
|
|
12
|
+
} | undefined;
|
|
13
|
+
};
|
|
14
|
+
}): ReturnType<typeof h>;
|
|
15
|
+
/** 用户消息里的官方附件(file 块):`FileAttachmentRef` 只有 id / 名字 / 字节数,**没有路径**。 */
|
|
16
|
+
export interface UserFileFace {
|
|
17
|
+
name: string;
|
|
18
|
+
bytes: number;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* 用户消息:官方 MessageItem userRow > userStack > bubble(右对齐气泡)
|
|
22
|
+
* + 气泡下方的 **attachmentRow / fileCard**(官方 MessageItem 的附件行)。
|
|
23
|
+
*
|
|
24
|
+
* 官方附件卡 = 图标 + 文件名 + 大小;**不可点开**——引用里没有路径,宿主也没给出
|
|
25
|
+
* 「按 attachmentId 打开」的公开面 ⇒ 如实降级为只读展示,不伪造打开行为。
|
|
26
|
+
*/
|
|
27
|
+
export declare function UserMessage(props: {
|
|
28
|
+
text: string;
|
|
29
|
+
files?: readonly UserFileFace[];
|
|
30
|
+
}): ReturnType<typeof h>;
|
|
31
|
+
/** 重试节点消费面(官方 ModelRetryNode = LlmRetryEventData & {retryState},records.d.ts:112)。 */
|
|
32
|
+
export interface RetryAttemptFace {
|
|
33
|
+
retryState?: 'scheduled' | 'started' | 'cancelled';
|
|
34
|
+
mode?: string;
|
|
35
|
+
retry?: number;
|
|
36
|
+
maxRetries?: number;
|
|
37
|
+
delayMs?: number;
|
|
38
|
+
failure?: {
|
|
39
|
+
message?: string;
|
|
40
|
+
code?: string;
|
|
41
|
+
} | null;
|
|
42
|
+
}
|
|
43
|
+
/** 轮次失败节点消费面(官方 TurnErrorNode,records.d.ts:127)。 */
|
|
44
|
+
export interface TurnErrorFace {
|
|
45
|
+
message?: string;
|
|
46
|
+
code?: string;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* 重试行(官方 ModelRetryItem):折叠 = 「已重试模型请求 (5/5) · 9s ⌄」摘要;
|
|
50
|
+
* 展开 = 重试延迟 / 失败原因 两行。active(等待重试)时官方走 250ms 倒计时 + 渐隐 shimmer。
|
|
51
|
+
*/
|
|
52
|
+
export declare function ModelRetryItemMirror(props: {
|
|
53
|
+
node: RetryAttemptFace;
|
|
54
|
+
active: boolean;
|
|
55
|
+
t: Translate;
|
|
56
|
+
}): ReturnType<typeof h>;
|
|
57
|
+
/** 轮次失败行(官方 TurnErrorItem):红点 + 红标题「本轮运行失败」+ 灰原因 + 右侧机器码标签。 */
|
|
58
|
+
export declare function TurnErrorItemMirror(props: {
|
|
59
|
+
node: TurnErrorFace;
|
|
60
|
+
t: Translate;
|
|
61
|
+
}): ReturnType<typeof h>;
|
|
62
|
+
/** 限长行(官方 TurnMaxTokensItem):黄点 + 警示标题 + 截断提示。 */
|
|
63
|
+
export declare function TurnMaxTokensItemMirror(props: {
|
|
64
|
+
t: Translate;
|
|
65
|
+
}): ReturnType<typeof h>;
|
|
66
|
+
//# sourceMappingURL=MessageItem.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MessageItem.d.ts","sourceRoot":"","sources":["../../../src/session/mirror/MessageItem.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,aAAa,IAAI,CAAC,EAAgC,MAAM,OAAO,CAAA;AAKxE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAEpD;yEACyE;AACzE,wBAAgB,iBAAiB,CAAC,KAAK,EAAE;IACvC,IAAI,EAAE,MAAM,CAAA;IACZ,YAAY,CAAC,EAAE;QAAE,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG;YAAE,IAAI,IAAI,IAAI,CAAC;YAAC,KAAK,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,GAAG,SAAS,CAAA;KAAE,CAAA;CACtG,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CASvB;AAED,wEAAwE;AACxE,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;CACd;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,SAAS,YAAY,EAAE,CAAA;CAAE,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CA2B1G;AAID,sFAAsF;AACtF,MAAM,WAAW,gBAAgB;IAC/B,UAAU,CAAC,EAAE,WAAW,GAAG,SAAS,GAAG,WAAW,CAAA;IAClD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAA;CACrD;AAED,oDAAoD;AACpD,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAkBD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,CAAC,EAAE,SAAS,CAAA;CAAE,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAyD3H;AAED,+DAA+D;AAC/D,wBAAgB,mBAAmB,CAAC,KAAK,EAAE;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,CAAC,EAAE,SAAS,CAAA;CAAE,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAmBtG;AAED,kDAAkD;AAClD,wBAAgB,uBAAuB,CAAC,KAAK,EAAE;IAAE,CAAC,EAAE,SAAS,CAAA;CAAE,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAYrF"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
// 官方对照:packages/client/ui-chat/src/client/chat/MessageItem.tsx(0.1.7-rc.2)
|
|
2
|
+
// 用户消息:userRow(右对齐,gap 6px)> userStack(宽 ≤ min(内容宽×.702, 82%),gap 8px)
|
|
3
|
+
// > bubble(background:--dsw-specific-bubble; radius-xl; padding:10px 16px; 14px/22px 行高)。
|
|
4
|
+
// 助手正文不走气泡:AssistantMarkdown(root 14px/24px,body 块间 gap 16px)。
|
|
5
|
+
// 重试/轮次失败/限长三件套同在官方 MessageItem.tsx(lib/client.js:1235-1338):
|
|
6
|
+
// ModelRetryItem = <details.retryRow data-active> > summary.retrySummary > span.retryText
|
|
7
|
+
// + div.retryDetails(重试延迟 / 失败原因 两行,retryDetailLabel 标签);
|
|
8
|
+
// active(retryState==='scheduled')时摘要走渐隐 shimmer + 250ms 倒计时。
|
|
9
|
+
// TurnErrorItem = div.turnErrorRow(grid 10px/1fr/auto)> StateDot(error) + turnErrorCopy
|
|
10
|
+
// (标题红 600 + 原因灰)+ code.turnErrorCode(右侧机器路由码,如 SERVER)。
|
|
11
|
+
// TurnMaxTokensItem= 同行结构,StateDot(warning) + maxTokensTitle(警示色)+ 提示语。
|
|
12
|
+
// 文案逐字抄官方词典(message.retry.* / message.turnError / message.maxTokens*,zh+en)。
|
|
13
|
+
import { createElement as h, useEffect, useMemo, useState } from 'react';
|
|
14
|
+
import { FileTypeIcon, MarkdownText, StateDot } from '../../ui/official.js';
|
|
15
|
+
import { officialClass } from '../official-classes.js';
|
|
16
|
+
import { markdownLabels } from '../../explorer/preview/md-labels.js';
|
|
17
|
+
import { formatBytes } from '../../utils/number.js';
|
|
18
|
+
/** 助手正文:官方 MarkdownText 渲染 + 官方 AssistantMarkdown.root 类(fallback 自绘)。
|
|
19
|
+
* U11:fileMentions 词表就位时行内 code 文件引用渲成可点链接(官方语义:resolve 不出保持惰性 code)。 */
|
|
20
|
+
export function AssistantMarkdown(props) {
|
|
21
|
+
if (props.text.trim() === '')
|
|
22
|
+
return h('span', null);
|
|
23
|
+
return h('div', { className: officialClass('AssistantMarkdown', 'root') ?? '' }, h(MarkdownText, {
|
|
24
|
+
text: props.text,
|
|
25
|
+
labels: markdownLabels(),
|
|
26
|
+
fileMentions: props.fileMentions,
|
|
27
|
+
}));
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* 用户消息:官方 MessageItem userRow > userStack > bubble(右对齐气泡)
|
|
31
|
+
* + 气泡下方的 **attachmentRow / fileCard**(官方 MessageItem 的附件行)。
|
|
32
|
+
*
|
|
33
|
+
* 官方附件卡 = 图标 + 文件名 + 大小;**不可点开**——引用里没有路径,宿主也没给出
|
|
34
|
+
* 「按 attachmentId 打开」的公开面 ⇒ 如实降级为只读展示,不伪造打开行为。
|
|
35
|
+
*/
|
|
36
|
+
export function UserMessage(props) {
|
|
37
|
+
const { text, files } = props;
|
|
38
|
+
const chips = files ?? [];
|
|
39
|
+
return h('div', { className: officialClass('MessageItem', 'userRow') ?? '' }, h('div', { className: officialClass('MessageItem', 'userStack') ?? '' }, text === ''
|
|
40
|
+
? null
|
|
41
|
+
: h('div', { className: officialClass('MessageItem', 'bubble') ?? '' }, h(MarkdownText, { text, labels: markdownLabels() })), chips.length === 0
|
|
42
|
+
? null
|
|
43
|
+
: h('div', { className: officialClass('MessageItem', 'attachmentRow') ?? '' }, chips.map((file, index) => h('div', {
|
|
44
|
+
key: `${file.name}:${index}`,
|
|
45
|
+
className: officialClass('MessageItem', 'fileCard') ?? '',
|
|
46
|
+
title: file.name,
|
|
47
|
+
}, h('span', { className: officialClass('MessageItem', 'fileIcon') ?? '' }, h(FileTypeIcon, { path: file.name, size: 16 })), h('span', { className: officialClass('MessageItem', 'fileContent') ?? '' }, h('span', { className: officialClass('MessageItem', 'fileName') ?? '' }, file.name), h('span', { className: officialClass('MessageItem', 'fileMeta') ?? '' }, formatBytes(file.bytes))))))));
|
|
48
|
+
}
|
|
49
|
+
/** 官方 retrySeconds(lib/client.js:1215):下限 1 秒。 */
|
|
50
|
+
function retrySeconds(milliseconds) {
|
|
51
|
+
return Math.max(1, Math.ceil(milliseconds / 1000));
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* 官方 failureMessage(lib/client.js:1219):已知机器码走本地化文案,其余原样展示。
|
|
55
|
+
* 官方判定顺序逐字:ACCOUNT_SIGNED_OUT / ACCOUNT_SIGN_IN_REQUIRED / QUOTA|ACCOUNT_QUOTA / AUTH。
|
|
56
|
+
*/
|
|
57
|
+
function failureMessage(message, code, t) {
|
|
58
|
+
if (code === 'ACCOUNT_SIGNED_OUT')
|
|
59
|
+
return t('failureAccountSignedOut');
|
|
60
|
+
if (code === 'ACCOUNT_SIGN_IN_REQUIRED')
|
|
61
|
+
return t('failureAccountSignInRequired');
|
|
62
|
+
if (code === 'QUOTA' || code === 'ACCOUNT_QUOTA')
|
|
63
|
+
return t('failureQuota');
|
|
64
|
+
return code === 'AUTH' ? t('failureAuth') : (message ?? '');
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* 重试行(官方 ModelRetryItem):折叠 = 「已重试模型请求 (5/5) · 9s ⌄」摘要;
|
|
68
|
+
* 展开 = 重试延迟 / 失败原因 两行。active(等待重试)时官方走 250ms 倒计时 + 渐隐 shimmer。
|
|
69
|
+
*/
|
|
70
|
+
export function ModelRetryItemMirror(props) {
|
|
71
|
+
const { active, t } = props;
|
|
72
|
+
const node = props.node;
|
|
73
|
+
const delayMs = typeof node.delayMs === 'number' ? node.delayMs : 0;
|
|
74
|
+
// 官方 maximum:mode==='normal' 给 maxRetries,否则 ∞(mode 缺失且无 maxRetries 时按 ∞ 兜底)。
|
|
75
|
+
const maximum = node.mode === 'normal' && typeof node.maxRetries === 'number'
|
|
76
|
+
? node.maxRetries
|
|
77
|
+
: '∞';
|
|
78
|
+
const deadline = useMemo(() => Date.now() + delayMs, [delayMs, node.retryState]);
|
|
79
|
+
const scheduledSeconds = retrySeconds(delayMs);
|
|
80
|
+
const [countdown, setCountdown] = useState(() => ({ deadline, seconds: retrySeconds(deadline - Date.now()) }));
|
|
81
|
+
const remainingSeconds = countdown.deadline === deadline
|
|
82
|
+
? countdown.seconds
|
|
83
|
+
: retrySeconds(deadline - Date.now());
|
|
84
|
+
useEffect(() => {
|
|
85
|
+
if (!active)
|
|
86
|
+
return;
|
|
87
|
+
const updateCountdown = () => {
|
|
88
|
+
const next = retrySeconds(deadline - Date.now());
|
|
89
|
+
setCountdown(current => current.deadline === deadline && current.seconds === next
|
|
90
|
+
? current
|
|
91
|
+
: { deadline, seconds: next });
|
|
92
|
+
return next;
|
|
93
|
+
};
|
|
94
|
+
if (updateCountdown() === 1)
|
|
95
|
+
return;
|
|
96
|
+
const timer = window.setInterval(() => {
|
|
97
|
+
if (updateCountdown() === 1)
|
|
98
|
+
window.clearInterval(timer);
|
|
99
|
+
}, 250);
|
|
100
|
+
return () => { window.clearInterval(timer); };
|
|
101
|
+
}, [active, deadline]);
|
|
102
|
+
const label = active
|
|
103
|
+
? t('retryActive')
|
|
104
|
+
: node.retryState === 'cancelled'
|
|
105
|
+
? t('retryCancelled')
|
|
106
|
+
: node.retryState === 'started' ? t('retryStarted') : t('retryScheduled');
|
|
107
|
+
const seconds = active ? remainingSeconds : scheduledSeconds;
|
|
108
|
+
const failure = node.failure;
|
|
109
|
+
return h('details', {
|
|
110
|
+
className: officialClass('MessageItem', 'retryRow') ?? '',
|
|
111
|
+
'data-active': active || undefined,
|
|
112
|
+
}, h('summary', { className: officialClass('MessageItem', 'retrySummary') ?? '' }, h('span', {
|
|
113
|
+
className: officialClass('MessageItem', 'retryText') ?? '',
|
|
114
|
+
role: 'status',
|
|
115
|
+
}, t('retryStatus', { label, retry: node.retry ?? 0, maximum, seconds }))), h('div', { className: officialClass('MessageItem', 'retryDetails') ?? '' }, h('div', null, h('span', { className: officialClass('MessageItem', 'retryDetailLabel') ?? '' }, t('retryDelay')), t('durationMilliseconds', { milliseconds: Math.round(delayMs) })), h('div', null, h('span', { className: officialClass('MessageItem', 'retryDetailLabel') ?? '' }, t('retryFailure')), failureMessage(failure?.message, failure?.code, t))));
|
|
116
|
+
}
|
|
117
|
+
/** 轮次失败行(官方 TurnErrorItem):红点 + 红标题「本轮运行失败」+ 灰原因 + 右侧机器码标签。 */
|
|
118
|
+
export function TurnErrorItemMirror(props) {
|
|
119
|
+
const { node, t } = props;
|
|
120
|
+
return h('div', { className: officialClass('MessageItem', 'turnErrorRow') ?? '', role: 'status' }, h(StateDot, {
|
|
121
|
+
state: 'error',
|
|
122
|
+
className: officialClass('MessageItem', 'turnErrorDot') ?? '',
|
|
123
|
+
}), h('div', { className: officialClass('MessageItem', 'turnErrorCopy') ?? '' }, h('span', { className: officialClass('MessageItem', 'turnErrorTitle') ?? '' }, node.code === 'ACCOUNT_SIGNED_OUT' ? t('accountStopped') : t('turnErrorTitle')), h('span', { className: officialClass('MessageItem', 'turnErrorMessage') ?? '' }, failureMessage(node.message, node.code, t))), node.code !== undefined && node.code !== ''
|
|
124
|
+
? h('code', { className: officialClass('MessageItem', 'turnErrorCode') ?? '' }, node.code)
|
|
125
|
+
: null);
|
|
126
|
+
}
|
|
127
|
+
/** 限长行(官方 TurnMaxTokensItem):黄点 + 警示标题 + 截断提示。 */
|
|
128
|
+
export function TurnMaxTokensItemMirror(props) {
|
|
129
|
+
const { t } = props;
|
|
130
|
+
return h('div', { className: officialClass('MessageItem', 'turnErrorRow') ?? '', role: 'status' }, h(StateDot, {
|
|
131
|
+
state: 'warning',
|
|
132
|
+
className: officialClass('MessageItem', 'turnErrorDot') ?? '',
|
|
133
|
+
}), h('div', { className: officialClass('MessageItem', 'turnErrorCopy') ?? '' }, h('span', { className: officialClass('MessageItem', 'maxTokensTitle') ?? '' }, t('maxTokensTitle')), h('span', { className: officialClass('MessageItem', 'turnErrorMessage') ?? '' }, t('maxTokensHint'))));
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=MessageItem.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MessageItem.js","sourceRoot":"","sources":["../../../src/session/mirror/MessageItem.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { createElement as h } from 'react';
|
|
2
|
+
import type { Translate } from '../../utils/i18n.js';
|
|
3
|
+
/** 思考行:折叠 = 「思考 · 首行预览 ⌄」;展开 = thinkBody 全文(MarkdownText compact)。 */
|
|
4
|
+
export declare function ReasoningRowMirror(props: {
|
|
5
|
+
text: string;
|
|
6
|
+
running?: boolean;
|
|
7
|
+
/** 官方 preview 政策(settledReasoningPreview):完成后是否仍显示首行预览。 */
|
|
8
|
+
preview?: boolean;
|
|
9
|
+
t: Translate;
|
|
10
|
+
}): ReturnType<typeof h> | null;
|
|
11
|
+
//# sourceMappingURL=ReasoningRow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReasoningRow.d.ts","sourceRoot":"","sources":["../../../src/session/mirror/ReasoningRow.ts"],"names":[],"mappings":"AAMA,OAAO,EAAY,aAAa,IAAI,CAAC,EAAY,MAAM,OAAO,CAAA;AAI9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAQpD,sEAAsE;AACtE,wBAAgB,kBAAkB,CAAC,KAAK,EAAE;IACxC,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,2DAA2D;IAC3D,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,CAAC,EAAE,SAAS,CAAA;CACb,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI,CAoC9B"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
// 官方对照:packages/client/ui-chat/src/client/chat/ReasoningRow.tsx(0.1.7-rc.2 lib/client.js:5718-5778)
|
|
2
|
+
// root[data-variant=think][data-state=running|ok][data-expanded][data-preview]
|
|
3
|
+
// > DisclosureRow(icon=IconThinkOutlineRegular 14px,title=t("message.think")=「思考」,
|
|
4
|
+
// collapsedContent = separator(2×2px) + summary(首行、去 **),content = thinkBody MarkdownText compact)
|
|
5
|
+
// 折叠态 root 固定一行高(contain:size layout + height 24px+delta);预览受 settledReasoningPreview 政策控制。
|
|
6
|
+
// 官方截图里组内思考行 = 「思考 · Let me submit the receipt now.」——标题是「思考」,不是「思考过程」。
|
|
7
|
+
import { Fragment, createElement as h, useState } from 'react';
|
|
8
|
+
import { DisclosureRow, IconThinkOutlineRegular, MarkdownText } from '../../ui/official.js';
|
|
9
|
+
import { officialClass } from '../official-classes.js';
|
|
10
|
+
import { markdownLabels } from '../../explorer/preview/md-labels.js';
|
|
11
|
+
/** 官方 firstLine(lib/client.js:5687):首行。 */
|
|
12
|
+
function firstLine(text) {
|
|
13
|
+
const newline = text.indexOf('\n');
|
|
14
|
+
return newline === -1 ? text : text.slice(0, newline);
|
|
15
|
+
}
|
|
16
|
+
/** 思考行:折叠 = 「思考 · 首行预览 ⌄」;展开 = thinkBody 全文(MarkdownText compact)。 */
|
|
17
|
+
export function ReasoningRowMirror(props) {
|
|
18
|
+
const { text, running = false, preview = true, t } = props;
|
|
19
|
+
const [open, setOpen] = useState(false);
|
|
20
|
+
if (text.trim() === '')
|
|
21
|
+
return null;
|
|
22
|
+
// lib 目标是 ES2020(无 String.replaceAll)⇒ split/join 等价去 `**`。
|
|
23
|
+
const summary = firstLine(text).split('**').join('');
|
|
24
|
+
return h('div', {
|
|
25
|
+
className: officialClass('ReasoningRow', 'root') ?? '',
|
|
26
|
+
'data-variant': 'think',
|
|
27
|
+
'data-state': running ? 'running' : 'ok',
|
|
28
|
+
'data-expanded': open || undefined,
|
|
29
|
+
'data-preview': preview && summary !== '' || undefined,
|
|
30
|
+
}, h(DisclosureRow, {
|
|
31
|
+
icon: h(IconThinkOutlineRegular, { size: 14 }),
|
|
32
|
+
title: t('thinkLabel'),
|
|
33
|
+
open,
|
|
34
|
+
expandable: true,
|
|
35
|
+
expandOnRowClick: true,
|
|
36
|
+
onToggle: () => { setOpen(value => !value); },
|
|
37
|
+
rowClassName: officialClass('ReasoningRow', 'row') ?? '',
|
|
38
|
+
leadingClassName: officialClass('ReasoningRow', 'leading') ?? '',
|
|
39
|
+
titleClassName: officialClass('ReasoningRow', 'title') ?? '',
|
|
40
|
+
chevronClassName: officialClass('ReasoningRow', 'chevron') ?? '',
|
|
41
|
+
collapsedContent: h(Fragment, null, h('span', { className: officialClass('ReasoningRow', 'separator') ?? '', 'aria-hidden': true }),
|
|
42
|
+
// 官方是 summary > summaryText 两层:外层 nowrap 截断、内层 text-overflow:ellipsis(省略号)。
|
|
43
|
+
h('span', { className: officialClass('ReasoningRow', 'summary') ?? '' }, h('span', { className: officialClass('ReasoningRow', 'summaryText') ?? '' }, summary))),
|
|
44
|
+
children: open
|
|
45
|
+
? h('div', { className: officialClass('ReasoningRow', 'thinkBody') ?? '' }, h(MarkdownText, { text, labels: markdownLabels(), variant: 'compact' }))
|
|
46
|
+
: undefined,
|
|
47
|
+
}));
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=ReasoningRow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReasoningRow.js","sourceRoot":"","sources":["../../../src/session/mirror/ReasoningRow.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { CSSProperties, RefObject } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* 官方 stat-dialog.ts 的 MEASURE_STYLE:首趟(pos 未定)时面板「隐藏但仍布局」,
|
|
4
|
+
* 好让 useAnchoredPosition 量到真实尺寸。官方要求面板铺 `pos ?? MEASURE_STYLE`;
|
|
5
|
+
* 漏了它 ⇒ 首趟完全无定位、面板落进文档流撑长页面(真机 2026-10-23:点用量无反应 + 滚动条变长)。
|
|
6
|
+
*/
|
|
7
|
+
export declare const STAT_MEASURE_STYLE: CSSProperties;
|
|
8
|
+
export interface StatDialogSeat {
|
|
9
|
+
open: boolean;
|
|
10
|
+
setOpen(open: boolean): void;
|
|
11
|
+
rootRef: RefObject<HTMLSpanElement | null>;
|
|
12
|
+
panelRef: RefObject<HTMLDivElement | null>;
|
|
13
|
+
pos: CSSProperties | undefined;
|
|
14
|
+
}
|
|
15
|
+
/** 官方 useStatDialog:把弹层挂在触发器上方(side: 'top'),点外 / Esc 关闭。 */
|
|
16
|
+
export declare function useStatDialog(controlled?: {
|
|
17
|
+
open?: boolean;
|
|
18
|
+
setOpen?(open: boolean): void;
|
|
19
|
+
}): StatDialogSeat;
|
|
20
|
+
//# sourceMappingURL=StatDialog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StatDialog.d.ts","sourceRoot":"","sources":["../../../src/session/mirror/StatDialog.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAMrD;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,EAAE,aAAyD,CAAA;AAE1F,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,OAAO,CAAA;IACb,OAAO,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAAA;IAC5B,OAAO,EAAE,SAAS,CAAC,eAAe,GAAG,IAAI,CAAC,CAAA;IAC1C,QAAQ,EAAE,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAA;IAC1C,GAAG,EAAE,aAAa,GAAG,SAAS,CAAA;CAC/B;AAED,4DAA4D;AAC5D,wBAAgB,aAAa,CAAC,UAAU,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAAA;CAAE,GAAG,cAAc,CAiB5G"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// 官方对照:packages/client/ui-chat/src/client/chat/stat-dialog.js(0.1.7-rc.2 lib/client.js:6278-6350)
|
|
2
|
+
// PANEL_MARGIN = 12 / PANEL_GAP = 8(lib/client.js:6281-6283)
|
|
3
|
+
// useStatDialog = 受控开关 + useAnchoredPosition(side:'top') + useDismissOnOutsidePointer + Escape 关闭。
|
|
4
|
+
// 官方用的是 primitives 的同名 hook,这里直接复用同一份实现(不是自绘定位)。
|
|
5
|
+
import { useEffect, useRef, useState } from 'react';
|
|
6
|
+
import { useAnchoredPosition, useDismissOnOutsidePointer } from '../../ui/official.js';
|
|
7
|
+
const PANEL_MARGIN = 12;
|
|
8
|
+
const PANEL_GAP = 8;
|
|
9
|
+
/**
|
|
10
|
+
* 官方 stat-dialog.ts 的 MEASURE_STYLE:首趟(pos 未定)时面板「隐藏但仍布局」,
|
|
11
|
+
* 好让 useAnchoredPosition 量到真实尺寸。官方要求面板铺 `pos ?? MEASURE_STYLE`;
|
|
12
|
+
* 漏了它 ⇒ 首趟完全无定位、面板落进文档流撑长页面(真机 2026-10-23:点用量无反应 + 滚动条变长)。
|
|
13
|
+
*/
|
|
14
|
+
export const STAT_MEASURE_STYLE = { visibility: 'hidden', left: 0, top: 0 };
|
|
15
|
+
/** 官方 useStatDialog:把弹层挂在触发器上方(side: 'top'),点外 / Esc 关闭。 */
|
|
16
|
+
export function useStatDialog(controlled) {
|
|
17
|
+
const [ownOpen, setOwnOpen] = useState(false);
|
|
18
|
+
const open = controlled?.open ?? ownOpen;
|
|
19
|
+
const setOpen = controlled?.setOpen ?? setOwnOpen;
|
|
20
|
+
const rootRef = useRef(null);
|
|
21
|
+
const panelRef = useRef(null);
|
|
22
|
+
const pos = useAnchoredPosition({ open, anchorRef: rootRef, panelRef, side: 'top', gap: PANEL_GAP, margin: PANEL_MARGIN });
|
|
23
|
+
useDismissOnOutsidePointer(rootRef, open, setOpen, panelRef);
|
|
24
|
+
useEffect(() => {
|
|
25
|
+
if (!open)
|
|
26
|
+
return;
|
|
27
|
+
const onKeyDown = (event) => {
|
|
28
|
+
if (event.key === 'Escape')
|
|
29
|
+
setOpen(false);
|
|
30
|
+
};
|
|
31
|
+
document.addEventListener('keydown', onKeyDown);
|
|
32
|
+
return () => { document.removeEventListener('keydown', onKeyDown); };
|
|
33
|
+
}, [open, setOpen]);
|
|
34
|
+
return { open, setOpen, rootRef, panelRef, pos };
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=StatDialog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StatDialog.js","sourceRoot":"","sources":["../../../src/session/mirror/StatDialog.ts"],"names":[],"mappings":"AAAA,kGAAkG;AAClG,+DAA+D;AAC/D,qGAAqG;AACrG,iDAAiD;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAEnD,OAAO,EAAE,mBAAmB,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAA;AAEtF,MAAM,YAAY,GAAG,EAAE,CAAA;AACvB,MAAM,SAAS,GAAG,CAAC,CAAA;AAEnB;;;;GAIG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAkB,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAA;AAU1F,4DAA4D;AAC5D,MAAM,UAAU,aAAa,CAAC,UAA8D;IAC1F,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAU,KAAK,CAAC,CAAA;IACtD,MAAM,IAAI,GAAG,UAAU,EAAE,IAAI,IAAI,OAAO,CAAA;IACxC,MAAM,OAAO,GAAG,UAAU,EAAE,OAAO,IAAI,UAAU,CAAA;IACjD,MAAM,OAAO,GAAG,MAAM,CAAyB,IAAI,CAAC,CAAA;IACpD,MAAM,QAAQ,GAAG,MAAM,CAAwB,IAAI,CAAC,CAAA;IACpD,MAAM,GAAG,GAAG,mBAAmB,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAA;IAC1H,0BAA0B,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAA;IAC5D,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,IAAI;YAAE,OAAM;QACjB,MAAM,SAAS,GAAG,CAAC,KAAoB,EAAQ,EAAE;YAC/C,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ;gBAAE,OAAO,CAAC,KAAK,CAAC,CAAA;QAC5C,CAAC,CAAA;QACD,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;QAC/C,OAAO,GAAG,EAAE,GAAG,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA,CAAC,CAAC,CAAA;IACrE,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAA;IACnB,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAA;AAClD,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { createElement as h } from 'react';
|
|
2
|
+
import type { Translate } from '../../utils/i18n.js';
|
|
3
|
+
import type { TurnLocationFace, TurnProcessHandle } from './ChatNodeSeat.js';
|
|
4
|
+
/** Turn 过程行:折叠时只有 label + 箭头;点开由外层 seat 把过程节点放出来。 */
|
|
5
|
+
export declare function TurnProcessNodeViewMirror(props: {
|
|
6
|
+
turn: TurnLocationFace | undefined;
|
|
7
|
+
turnProcess: TurnProcessHandle;
|
|
8
|
+
t: Translate;
|
|
9
|
+
}): ReturnType<typeof h> | null;
|
|
10
|
+
//# sourceMappingURL=TurnProcessNodeView.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TurnProcessNodeView.d.ts","sourceRoot":"","sources":["../../../src/session/mirror/TurnProcessNodeView.ts"],"names":[],"mappings":"AAQA,OAAO,EAAY,aAAa,IAAI,CAAC,EAAuB,MAAM,OAAO,CAAA;AAGzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAM5E,qDAAqD;AACrD,wBAAgB,yBAAyB,CAAC,KAAK,EAAE;IAC/C,IAAI,EAAE,gBAAgB,GAAG,SAAS,CAAA;IAClC,WAAW,EAAE,iBAAiB,CAAA;IAC9B,CAAC,EAAE,SAAS,CAAA;CACb,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI,CAuD9B"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
// 官方对照:packages/client/ui-chat/src/client/chat/TurnProcessNodeView.tsx(0.1.7-rc.2 lib/client.js:6129-6196)
|
|
2
|
+
// root(button,高 calc(33px + delta)、border-bottom .5px border-l2、padding 0 0 8px、flex)
|
|
3
|
+
// :disabled{cursor:default} / :not(:disabled):hover{color:primary} / :not([data-open]){margin-bottom:8px}
|
|
4
|
+
// > label(13px,ellipsis)> chevron(14px caption,[data-open] 旋转 180°)
|
|
5
|
+
// label 官方文案(源码 6167-6170 逐字):
|
|
6
|
+
// running → 「深度求索中,用时D」;aborted → 「已停止」;error → 「处理失败」;
|
|
7
|
+
// 其余 → 有时长「用时 D」、无时长「已完成工作」。D 由 turn 位置(start/end)算出,下限 1 秒。
|
|
8
|
+
// 这就是官方原图里那行「用时 34 秒 ⌄」——它把整个 turn 的过程(工具调用 / 中间文本 / 思考)折在下面。
|
|
9
|
+
import { Fragment, createElement as h, useEffect, useState } from 'react';
|
|
10
|
+
import { IconChevronDownOutlineRegular } from '../../ui/official.js';
|
|
11
|
+
import { officialClass } from '../official-classes.js';
|
|
12
|
+
import { formatLiveRunDuration, formatRunDuration } from './message-chrome.js';
|
|
13
|
+
/** 官方 LIVE_RUN_CLOCK_INTERVAL_MS(lib/client.js:979)。 */
|
|
14
|
+
const LIVE_RUN_CLOCK_INTERVAL_MS = 1000;
|
|
15
|
+
/** Turn 过程行:折叠时只有 label + 箭头;点开由外层 seat 把过程节点放出来。 */
|
|
16
|
+
export function TurnProcessNodeViewMirror(props) {
|
|
17
|
+
const { turn, turnProcess, t } = props;
|
|
18
|
+
const open = !turnProcess.foldable || turnProcess.open;
|
|
19
|
+
const [now, setNow] = useState(() => Date.now());
|
|
20
|
+
const ticking = turn?.status === 'open' && turn.start !== undefined;
|
|
21
|
+
useEffect(() => {
|
|
22
|
+
if (!ticking)
|
|
23
|
+
return;
|
|
24
|
+
setNow(Date.now());
|
|
25
|
+
const timer = setInterval(() => { setNow(Date.now()); }, LIVE_RUN_CLOCK_INTERVAL_MS);
|
|
26
|
+
return () => { clearInterval(timer); };
|
|
27
|
+
}, [ticking]);
|
|
28
|
+
if (turn === undefined || (turn.start === undefined && turn.status !== 'closed'))
|
|
29
|
+
return null;
|
|
30
|
+
const canCollapse = turnProcess.foldable && turnProcess.hasContent && !turnProcess.alwaysOpen;
|
|
31
|
+
const running = turn.status === 'open';
|
|
32
|
+
const reason = turn.end?.data?.reason?.kind;
|
|
33
|
+
const elapsedMs = turn.start === undefined ? undefined : Math.max(1000, (turn.end?.time ?? now) - turn.start.time);
|
|
34
|
+
const duration = elapsedMs === undefined
|
|
35
|
+
? undefined
|
|
36
|
+
: running ? formatLiveRunDuration(elapsedMs, t) : formatRunDuration(elapsedMs, t);
|
|
37
|
+
const label = running
|
|
38
|
+
? (duration === undefined ? t('chatDeepDiving') : t('turnProcessDeepDiving', { duration }))
|
|
39
|
+
: reason === 'aborted' ? t('turnStopped')
|
|
40
|
+
: reason === 'error' ? t('turnProcessFailed')
|
|
41
|
+
: duration === undefined ? t('turnProcessWorked') : t('turnProcessTook', { duration });
|
|
42
|
+
const announcement = running
|
|
43
|
+
? t('chatDeepDiving')
|
|
44
|
+
: reason === 'aborted' ? t('turnStopped')
|
|
45
|
+
: reason === 'error' ? t('turnProcessFailed')
|
|
46
|
+
: t('turnProcessWorked');
|
|
47
|
+
const spec = turnProcess.spec;
|
|
48
|
+
return h(Fragment, null, h('span', {
|
|
49
|
+
className: officialClass('accessibility', 'visuallyHidden') ?? '',
|
|
50
|
+
role: 'status',
|
|
51
|
+
'aria-live': 'polite',
|
|
52
|
+
'aria-atomic': 'true',
|
|
53
|
+
}, announcement), h('button', {
|
|
54
|
+
type: 'button',
|
|
55
|
+
className: officialClass('TurnProcessNodeView', 'root') ?? '',
|
|
56
|
+
'data-open': open || undefined,
|
|
57
|
+
'data-turn-process': spec?.turn,
|
|
58
|
+
'data-turn-process-messages': spec?.messageCount,
|
|
59
|
+
'data-turn-process-tool-calls': spec?.toolCallCount,
|
|
60
|
+
'data-turn-process-subagents': spec?.subagentCount,
|
|
61
|
+
disabled: !canCollapse,
|
|
62
|
+
'aria-expanded': turnProcess.hasContent ? open : undefined,
|
|
63
|
+
onClick: () => { turnProcess.setOpen(!open); },
|
|
64
|
+
}, h('span', { className: officialClass('TurnProcessNodeView', 'label') ?? '' }, label), canCollapse
|
|
65
|
+
? h(IconChevronDownOutlineRegular, { className: officialClass('TurnProcessNodeView', 'chevron') ?? '' })
|
|
66
|
+
: null));
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=TurnProcessNodeView.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TurnProcessNodeView.js","sourceRoot":"","sources":["../../../src/session/mirror/TurnProcessNodeView.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { createElement as h, type ReactNode } from 'react';
|
|
2
|
+
import type { Translate } from '../../utils/i18n.js';
|
|
3
|
+
import { type TurnTokenUsageFace } from './TurnUsagePanel.js';
|
|
4
|
+
/** 官方 AssistantContentBlock 的消费面(只用到 kind / text)。 */
|
|
5
|
+
interface ContentBlockFace {
|
|
6
|
+
kind?: string;
|
|
7
|
+
text?: string;
|
|
8
|
+
}
|
|
9
|
+
/** 官方 TurnTailChatData 的消费面(ui-chat contract/chat-nodes.d.ts:137)。 */
|
|
10
|
+
export interface TurnTailDataFace {
|
|
11
|
+
turn: number;
|
|
12
|
+
seq: number;
|
|
13
|
+
closing: {
|
|
14
|
+
time: number;
|
|
15
|
+
blocks: ReadonlyArray<ContentBlockFace>;
|
|
16
|
+
} | null;
|
|
17
|
+
branchUnavailable?: boolean;
|
|
18
|
+
tokenUsage?: TurnTokenUsageFace;
|
|
19
|
+
}
|
|
20
|
+
/** 官方 hasAssistantReplyContent。 */
|
|
21
|
+
export declare function hasAssistantReplyContent(blocks: ReadonlyArray<ContentBlockFace>): boolean;
|
|
22
|
+
/** Turn 尾部操作行:复制 / 分支 / 用量 / 结束时钟。 */
|
|
23
|
+
export declare function TurnTailNodeViewMirror(props: {
|
|
24
|
+
data: TurnTailDataFace;
|
|
25
|
+
/** 分支:以该轮 tail seq 截断开分支(undefined = 不渲染分支按钮)。 */
|
|
26
|
+
onBranchAt?: (seq: number) => void;
|
|
27
|
+
/** 官方 conversation.chat.turnTail 插槽内容(如 DeliverablesTail),渲染在操作行之前。 */
|
|
28
|
+
tailSlot?: ReactNode;
|
|
29
|
+
t: Translate;
|
|
30
|
+
}): ReturnType<typeof h> | null;
|
|
31
|
+
export {};
|
|
32
|
+
//# sourceMappingURL=TurnTailNodeView.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TurnTailNodeView.d.ts","sourceRoot":"","sources":["../../../src/session/mirror/TurnTailNodeView.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,aAAa,IAAI,CAAC,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAE1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAEpD,OAAO,EAAwB,KAAK,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAEnF,sDAAsD;AACtD,UAAU,gBAAgB;IACxB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,sEAAsE;AACtE,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,aAAa,CAAC,gBAAgB,CAAC,CAAA;KAAE,GAAG,IAAI,CAAA;IACzE,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,UAAU,CAAC,EAAE,kBAAkB,CAAA;CAChC;AAED,mCAAmC;AACnC,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,aAAa,CAAC,gBAAgB,CAAC,GAAG,OAAO,CAMzF;AAOD,sCAAsC;AACtC,wBAAgB,sBAAsB,CAAC,KAAK,EAAE;IAC5C,IAAI,EAAE,gBAAgB,CAAA;IACtB,kDAAkD;IAClD,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IAClC,uEAAuE;IACvE,QAAQ,CAAC,EAAE,SAAS,CAAA;IACpB,CAAC,EAAE,SAAS,CAAA;CACb,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI,CAuB9B"}
|