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
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# 运行逻辑
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
系统级分层、边界、触发关系与不变量。不写接口细节(那些在帮助文档区 `docs/help/`)。
|
|
4
4
|
|
|
5
5
|
## 一句话
|
|
6
6
|
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
```
|
|
10
10
|
dsh-plugin-core/
|
|
11
11
|
├── design/ token + createStyleKit 注入器工厂 + 主题判据 (零 React)
|
|
12
|
-
├── ui/
|
|
12
|
+
├── ui/ 基础控件与布局容器(Button / Input / Picker / Modal / toast / PanelDock …) (依赖 design)
|
|
13
13
|
├── utils/ 纯方法:日期 / 字符串 / 字节 / 时间区间 / HTTP / 路径 (零 React / DOM)
|
|
14
14
|
├── adv.explorer/ 文件浏览成品(目录树 + 面包屑 + 预览) (依赖 ui + utils)
|
|
15
15
|
└── adv.session/ 会话记录预览成品 (依赖 ui + utils)
|
|
@@ -51,21 +51,51 @@ utils(谁都不依赖,谁都可以用)
|
|
|
51
51
|
为什么必须运行时注入:DSH 客户端产物是 `window.__ModuleLoader__.load({ id, factory })` 的
|
|
52
52
|
CJS 闭包,`import './x.css'` 只会产出独立 css 资源、**内核不加载它** ⇒ CSS 只能以字符串在运行时注入。
|
|
53
53
|
|
|
54
|
+
**但那只约束产物,不约束源码**。样式是分三层走的:
|
|
55
|
+
|
|
56
|
+
```
|
|
57
|
+
src/**/*.css 真源 —— 编辑器高亮 / 括号匹配 / 格式化 / CSS lint 都生效
|
|
58
|
+
│ scripts/gen-css.mjs(构建期:lightningcss 解析 + JSON.stringify)
|
|
59
|
+
▼
|
|
60
|
+
*.generated.ts 字符串常量(入库,勿手改)
|
|
61
|
+
│ tsc 1:1 编译
|
|
62
|
+
▼
|
|
63
|
+
dist/** 产物形态不变,仍由 createStyleKit 拼成一份文本注入 <style>
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
为什么要这一层:2026-10-19 曾因手写模板字符串结尾多一个反斜杠,在注入文本里留下字面反引号,
|
|
67
|
+
吞掉紧随其后那条规则的选择器,排查耗掉一天(见 `docs/design/external/dsh-host.md` §9)。
|
|
68
|
+
`JSON.stringify` 生成 + 构建期解析闸,把这类事故从根上删掉,产物形态却一点没变。
|
|
69
|
+
|
|
70
|
+
改样式的正确姿势:改 `src/**/*.css` → `pnpm run gen:css`(或 `pnpm run build`)→ 提交含生成物与
|
|
71
|
+
`dist/`。`pnpm test` 的 `pretest` 会跑 `gen:css --check`,生成物不同步直接红。
|
|
72
|
+
|
|
54
73
|
为什么是工厂而不是模块级单例:单例只有一个固定 style id,多个插件同处一页时会抢同一个 `<style>` 标签、
|
|
55
74
|
后挂载的覆盖先挂载的。每个插件领一套自己的(`id` 按插件唯一);变量前缀全生态统一 `dshpc`。
|
|
56
75
|
|
|
57
76
|
为什么 core 可以用模块级变量存「当前 kit」:core 会被**内联进每个插件各自的 bundle**(不是共享运行时),
|
|
58
77
|
模块级变量天然按插件隔离,不像共享模块那样会互相踩。
|
|
59
78
|
|
|
60
|
-
##
|
|
79
|
+
## 数据从哪来
|
|
80
|
+
|
|
81
|
+
工作区列表、模型列表、会话消息都要跨 host↔client 边界。分两条口径(2026-10-20 拍板):
|
|
61
82
|
|
|
62
|
-
|
|
63
|
-
|
|
83
|
+
- **通用控件是纯零件**:数据由调用方经 props 给,宿主能力经接口注入(`FileBrowser` /
|
|
84
|
+
`openFilePreview` / `pickWorkspaceFile`、`SessionPreview`、通用 `Picker` 都算这类)。
|
|
85
|
+
- **领域选择器自带数据面**:`ModelPicker` / `WorkspacePicker` 经接线后**自己取数自己显示**,
|
|
86
|
+
消费方不再传数组。两条通路(2026-10-20 真机核实):
|
|
87
|
+
- 工作区:client 侧 `ctx.inject(['workspaces'])` 的快照(getSnapshot + subscribe,follow 流实时更新),
|
|
88
|
+
封装在 `src/ui/host-data.ts` 的 `workspaceList`。
|
|
89
|
+
- 模型目录:client 侧 remote **拿不到**每个 provider 的模型 ⇒ 插件宿主侧
|
|
90
|
+
`llm.listModels()` 现查、`serveModelCatalog()`(`src/host/index.ts`,`./host` 子路径)挂成只读路由,
|
|
91
|
+
client 侧 `connectHost(ctx, { modelsPath })` fetch。两侧共用同一个 path 常量。
|
|
92
|
+
任一通路缺席只影响那一块,选择器渲染空态 / 降级提示。
|
|
64
93
|
|
|
65
|
-
| 组件 |
|
|
94
|
+
| 组件 | 数据从哪来 |
|
|
66
95
|
|---|---|
|
|
67
|
-
| `Picker`
|
|
68
|
-
| `
|
|
96
|
+
| `Picker` | 选项数据(props) |
|
|
97
|
+
| `ModelPicker` / `WorkspacePicker` | 自取(connectHost 接线;`groups` 参数仅作覆盖) |
|
|
98
|
+
| `FileBrowser` / `openFilePreview` / `pickWorkspaceFile` | `WorkspaceFilesFace`(从 ctx 取出后注入) |
|
|
69
99
|
| `SessionPreview` | `SessionSource`(同上) |
|
|
70
100
|
|
|
71
101
|
不传整个 `ctx`:ctx 是宿主给的整个大对象,传进来就把本包和宿主版本焊死;只传需要的那一小块,
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
# 文案撰写规范(.doc.ts 真源里的用户可见文案)
|
|
2
|
+
|
|
3
|
+
适用:`docs/**/*.doc.ts` 里的 `heading` / `prose` / `api[].desc` / `code[].src`。
|
|
4
|
+
由 `scripts/gen-docs.mjs` 投影成两份:`docs/**/*.md`(Agent / 人读,随包发布)与
|
|
5
|
+
`doc-data.generated.ts`(demo 站读),所以**一份文案同时喂两个读者**,标准必须两头都成立。
|
|
6
|
+
EN: Copy rules for every user-visible string in `docs/**/*.doc.ts`. One source feeds two projections
|
|
7
|
+
(`docs/**/*.md` for agents/humans, `doc-data.generated.ts` for the demo site), so each rule must hold for both readers.
|
|
8
|
+
|
|
9
|
+
## 读者定性
|
|
10
|
+
|
|
11
|
+
**第一读者是 Agent。** demo 站是同一份文案的人类视图。
|
|
12
|
+
Agent 打开文档只问三件事:**这是什么 / 怎么用 / 每个参数是什么**。答完即止。
|
|
13
|
+
EN: The primary reader is an agent; the demo site is the human view of the same text. An agent asks only
|
|
14
|
+
three things: what is it / how do I use it / what is each argument. Answer those and stop.
|
|
15
|
+
|
|
16
|
+
## R1 · 禁止过程叙事 · No process narrative
|
|
17
|
+
|
|
18
|
+
文档记录**现在是什么**,不记录**怎么变成这样**。
|
|
19
|
+
|
|
20
|
+
| 禁写 | 改写成 |
|
|
21
|
+
|---|---|
|
|
22
|
+
| 日期、`2026-10-22 解包核实`、`unpack xxx@0.2.0-rc.2` | 直接给结论(结论要溯源就指 `external/` 里的核实文档) |
|
|
23
|
+
| `拍板` / `定` / `二次拍板` / `ivc用户接受,不要自行优化` | 写成约束句:`必须 X` / `不要 Y` |
|
|
24
|
+
| `推翻此前结论` / `此前以为…后来发现…` | 只写当前成立的事实 |
|
|
25
|
+
| `已证伪、勿再尝试` / `某某方案已删` / `备选方案 ` | 删掉。若某写法确实危险,写成约束:`不要用 X(会 Y)` |
|
|
26
|
+
| `已接上` / `已对齐官方结构` / `已上线` | 删掉,直接描述当前能力 |
|
|
27
|
+
|
|
28
|
+
判据:一句话里如果出现了「曾经的另一个状态」,它就是过程,删。
|
|
29
|
+
EN: Never record dates, who decided what,推翻/已删/已对齐, or any earlier state. Write the current fact only.
|
|
30
|
+
Test: if a sentence contains a previous state of anything, it is process — delete it.
|
|
31
|
+
|
|
32
|
+
## R2 · 一段一事、一段两句 · One fact per paragraph
|
|
33
|
+
|
|
34
|
+
- 每段 ≤ 2 句,每段 ≤ 110 字(zh);每句 ≤ 40 字。
|
|
35
|
+
**反引号内的 API 标识符不计入**(代码块、参数名不是散文,按字数惩罚它们会把有用信息砍掉)。
|
|
36
|
+
- 一个 section 的 `prose` ≤ 5 段。写不下 = 拆 section,不是堆段。
|
|
37
|
+
- 段首不用「另外 / 同时 / 值得一提」起句。
|
|
38
|
+
- 例外:**步骤清单型**(一段一个整数编号步骤、几乎无标点扩充)不受段数限制,它是
|
|
39
|
+
「有一个以上代码块等待处、每步对应一句」的导航条,不是散文。`quickstart` 是例子。
|
|
40
|
+
EN: ≤ 2 sentences and ≤ 110 characters (zh) per paragraph. A section carries ≤ 5 prose paragraphs; overflow
|
|
41
|
+
means split the section. Exception: **stepped lists** (one numbered step per paragraph, each indexed against
|
|
42
|
+
the code blocks below) are navigation, not prose, so the count limit does not apply — `quickstart` is the example.
|
|
43
|
+
|
|
44
|
+
## R3 · 表格只装参数 · API cells are not essays
|
|
45
|
+
|
|
46
|
+
`desc` 一格 = 一句话动词短语,写**是什么 / 不给会怎样**:
|
|
47
|
+
|
|
48
|
+
| 差的写法 | 好的写法 |
|
|
49
|
+
|---|---|
|
|
50
|
+
| `本包 ui 已零官方依赖;要用官方件就在插件侧自己处理平台模块` | `本包 ui 不依赖官方件;要用请自行处理平台模块` |
|
|
51
|
+
| `造型太花时间:因为右侧分栏在场时遮罩已让位,100vw 会溢出到分栏上` | `宽度用遮罩盒的 100%,不要用 100vw(会溢出到右侧分栏)` |
|
|
52
|
+
| `归档 = 开分支确认框,未归档 = 直跳官方会话页,当然归档会话不进主视图` | `true = 开分支确认框;false = 直跳官方会话页` |
|
|
53
|
+
|
|
54
|
+
- 默认值写进 `def`,不写进 `desc`。
|
|
55
|
+
- 背景与动机写进 `prose`,不写进表格。
|
|
56
|
+
EN: `desc` is one verb phrase stating what it is or what happens without it. Defaults go in `def`, rationale goes in `prose`.
|
|
57
|
+
|
|
58
|
+
## R4 · 三处不许重复 · Say it once
|
|
59
|
+
|
|
60
|
+
同一事实只能在 `prose` / `api.desc` / `code` 注释里出现**一次**。
|
|
61
|
+
能在表里说清的,不进散文;能在代码里看懂的,不进表。
|
|
62
|
+
EN: A fact appears exactly once, in the cheapest slot: table beats prose, code beats table.
|
|
63
|
+
|
|
64
|
+
## R5 · 保留不变式,丢掉考古 · Keep invariants, drop archaeology
|
|
65
|
+
|
|
66
|
+
保留:必填项、默认值、失败/降级行为、禁写顾忌、必须成对出现的参数。
|
|
67
|
+
删除:调查路径、版本解包、被否方案、工作量描述(「无额外开发」这类)。
|
|
68
|
+
EN: Keep required/default/failure behaviour and constraints. Drop investigation paths and rejected alternatives.
|
|
69
|
+
|
|
70
|
+
## R6 · 双语对译 · Bilingual parity
|
|
71
|
+
|
|
72
|
+
- `zh` / `en` 是**同一信息的两种语言**,不是翻译腔。术语表固定:`token`、`selector`、`invoke`、`dock`、`snapshot`、`fallback`、`mask`(EN 侧统一拼写,不用 Modal/弹出)。
|
|
73
|
+
- 两个字段的段数、句数、信息量相同 —— `en` 不得比 `zh` 少半句或多一整段背景。
|
|
74
|
+
- 代码块里的注释跟着 `lang` 走:代码块本身不双语,注释用英文。
|
|
75
|
+
EN: `zh`/`en` carry identical information in identical shape — same count of paragraphs and facts.
|
|
76
|
+
Code comments are English-only.
|
|
77
|
+
|
|
78
|
+
## R7 · 格式与字段不变 · Format is frozen
|
|
79
|
+
|
|
80
|
+
`id` / `heading` / `prose` / `api` / `code` 字段与 `section.id` 一律不动(demo 站按 id 取值)。
|
|
81
|
+
本次只改文案内容,不改结构。新增/删除 section 是另一次变更。
|
|
82
|
+
EN: Field names and `section.id` values are frozen — the demo reads entries by id. Only copy changes here.
|
|
83
|
+
|
|
84
|
+
## 自检
|
|
85
|
+
|
|
86
|
+
改完跑:
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
pnpm gen:docs && pnpm typecheck:docs
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
复审清单:① 全文搜 `\d{4}-\d{2}-\d{2}` 应零命中;② 搜 `拍板|推翻|证伪|已删|改造|当前不同的是` 应零命中;
|
|
93
|
+
③ 任一 section 的 prose 段数 ≤ 4;④ 抽 3 条 desc,确认「一句话说得清」。
|
|
94
|
+
EN: After editing run `pnpm gen:docs && pnpm typecheck:docs`. Review checklist: zero date hits, zero process-word hits,
|
|
95
|
+
≤ 4 prose paragraphs per section, three sampled `desc` values readable in one breath.
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# 文档格式规范(.doc.ts 真源 + 双投影)
|
|
2
|
+
|
|
3
|
+
## 一句话
|
|
4
|
+
|
|
5
|
+
所有「既给 demo 展示、也给 Agent 读」的内容,**唯一真源**是 `docs/**/*.doc.ts`(typed 数据模块)。`scripts/gen-docs.mjs` 在构建期把它投影成两份:
|
|
6
|
+
|
|
7
|
+
- `docs/**/*.md` —— 给 Agent / 人读,随包发布(`files: ["dist","docs"]`)。
|
|
8
|
+
- `packages/demo/src/doc-data.generated.ts` —— 给 demo 零解析消费(入库、勿手改)。
|
|
9
|
+
|
|
10
|
+
本仓既有铁律「真源在别处就不抄第二份」(`docs/README.md` 三条硬约定)在此落为机制:demo 与 md 都从 `.doc.ts` 派生,绝不手写第二份内容。
|
|
11
|
+
|
|
12
|
+
## 为什么不是 MD 真源
|
|
13
|
+
|
|
14
|
+
- `md → 数据` 是解析,永远缺斤少甲:转义管道、列头校验、禁多行单元格……防不住子集外的写法。
|
|
15
|
+
- `数据 → md` 是渲染,容易且完备。
|
|
16
|
+
- TS 两头占:机器侧同 JSON 之强且**类型即 schema**(`tsc` 编译期校验),人侧 prose 走模板字符串(`src/utils/i18n.ts` 59KB 同款先例),零新依赖。
|
|
17
|
+
- JSON prose 满篇转义、YAML 要引解析器依赖或手搓子集(重回 fragile),均否。
|
|
18
|
+
|
|
19
|
+
## 文件组织
|
|
20
|
+
|
|
21
|
+
| 角色 | 落位 | 说明 |
|
|
22
|
+
|---|---|---|
|
|
23
|
+
| 真源(手写) | `docs/help/<主题>.doc.ts` | 一主题一文件(`index` / `integration` / `ui` / `design` / `utils` / `explorer` / `session`);帮助侧唯一的输入 |
|
|
24
|
+
| 生成(引用方 / Agent 读) | `docs/help/<主题>.md` | 由 gen-docs 从 `.doc.ts` 生成,覆盖同名手写文件;**勿手改** |
|
|
25
|
+
| 生成(demo 消费) | `packages/demo/src/doc-data.generated.ts` | 按 `section.id` 扁平聚合;**勿手改** |
|
|
26
|
+
|
|
27
|
+
真源只放**帮助侧**(`docs/help/`):开发侧文档(`requirements.md` / `architecture.md` / `structure.md` /
|
|
28
|
+
`external/**` / 本文件 / `copywriting.md`)保持手写 md,不进投影——demo 不展示、无漂移风险。
|
|
29
|
+
手写的 `.doc.ts` 若写在别处,必须在 `gen-docs.mjs` 的 `MAP` 里登记才会被处理。
|
|
30
|
+
|
|
31
|
+
## schema(权威定义在 `docs/design/doc-format.ts`)
|
|
32
|
+
|
|
33
|
+
```ts
|
|
34
|
+
export type Bilingual = { zh: string; en: string }
|
|
35
|
+
export type ApiRow = { name: string; type: string; def: string; required?: string; desc: Bilingual }
|
|
36
|
+
export type ApiTable = { id: string; rows: ApiRow[] }
|
|
37
|
+
export type CodeBlock = { id: string; lang: string; src: string }
|
|
38
|
+
export type Section = {
|
|
39
|
+
id: string // 全局唯一,且 1:1 对应 demo 的 SectionId
|
|
40
|
+
heading: Bilingual
|
|
41
|
+
prose?: Bilingual[]
|
|
42
|
+
api?: ApiTable[] // 一个 section 可有多张表,按数组顺序渲染
|
|
43
|
+
code?: CodeBlock[]
|
|
44
|
+
}
|
|
45
|
+
export type DocTopic = {
|
|
46
|
+
title: Bilingual
|
|
47
|
+
topics?: string[]
|
|
48
|
+
exports?: string[]
|
|
49
|
+
display?: Record<string, Bilingual>
|
|
50
|
+
sections: Section[]
|
|
51
|
+
}
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## section.id 契约(解耦关键)
|
|
55
|
+
|
|
56
|
+
- 每个 `section.id` **全局唯一**,且 **1:1 对应** demo 的 `SectionId`(`packages/demo/src/sections/index.tsx`)。
|
|
57
|
+
- gen-docs 把所有 `.doc.ts` 的 `sections` **按 id 扁平聚合**成 `docData[id]`;demo 只写 `docData[sectionId]`,与「这段在哪个文件、属于哪个子包」无关。
|
|
58
|
+
- **重分类零成本**:拆文件 / 挪 group 只动 `MAP` 和文件内 section 摆放,demo 页(按 id 取)一行不动。
|
|
59
|
+
- 重 id → gen-docs 直接报错退出(闸)。`--check` 还会校验「每个 demo `SectionId` 都有对应 doc `section.id`」(见阶段4 测试)。
|
|
60
|
+
|
|
61
|
+
## 双语
|
|
62
|
+
|
|
63
|
+
所有用户可见文案都是 `{ zh, en }`。demo 的 `locale` 选对应字段;样式、组件、布局**不进真源**(已在仓库 CSS 生成链 `gen-css.mjs` 单独处理)。
|
|
64
|
+
|
|
65
|
+
## 类型闸与生成
|
|
66
|
+
|
|
67
|
+
| 命令 | 作用 |
|
|
68
|
+
|---|---|
|
|
69
|
+
| `pnpm typecheck:docs` | `tsc -p tsconfig.docs.json` 校验 `.doc.ts` 结构(schema 即闸) |
|
|
70
|
+
| `pnpm gen:docs` | 重新生成两份投影 |
|
|
71
|
+
| `pnpm gen:docs --check` | 比对已落盘的 `doc-data.generated.ts` 是否最新,不一致退出 1(挂 `pretest`) |
|
|
72
|
+
|
|
73
|
+
`build` 含 `gen:docs`;`pretest` 含 `gen:docs --check`;`prepublishOnly` 双保险(发布前 regen)。
|
|
74
|
+
|
|
75
|
+
## 随包与 Agent 读取
|
|
76
|
+
|
|
77
|
+
- core 包 `files: ["dist","docs"]` 同时发 `.md` 与 `.doc.ts`;Agent 的入口是
|
|
78
|
+
`node_modules/dsh-plugin-core/docs/help/index.md`(按任务挑一份,不必全读)。
|
|
79
|
+
- 插件产物不含文档:bundler 不吃 `.md`/`.ts` 文档(无 md/text loader),文档不进 bundle。
|
|
80
|
+
- 消费方指引句(抄进各插件项目 `AGENTS.md`)见本仓 `docs/README.md` 阶段5 行。
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
// 文档真源(.doc.ts)的类型 schema。改这里 = 改结构;tsconfig.docs.json 编译期校验。
|
|
2
|
+
export type Bilingual = { zh: string; en: string }
|
|
3
|
+
|
|
4
|
+
export type ApiRow = {
|
|
5
|
+
name: string
|
|
6
|
+
type: string
|
|
7
|
+
def: string
|
|
8
|
+
required?: string // 可选:「必填」列(是/否)
|
|
9
|
+
desc: Bilingual
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export type ApiTable = {
|
|
13
|
+
id: string
|
|
14
|
+
rows: ApiRow[]
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export type CodeBlock = {
|
|
18
|
+
id: string
|
|
19
|
+
lang: string
|
|
20
|
+
src: string
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// section.id 必须全局唯一,且 1:1 对应 demo 的 SectionId(packages/demo/src/sections/index.tsx)。
|
|
24
|
+
// gen-docs 按 id 扁平聚合 docData[id];重 id 直接报错退出。
|
|
25
|
+
export type Section = {
|
|
26
|
+
id: string
|
|
27
|
+
heading: Bilingual
|
|
28
|
+
prose?: Bilingual[]
|
|
29
|
+
api?: ApiTable[] // 一个 section 可有多张表,按数组顺序渲染
|
|
30
|
+
code?: CodeBlock[]
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export type DocTopic = {
|
|
34
|
+
title: Bilingual
|
|
35
|
+
topics?: string[]
|
|
36
|
+
exports?: string[]
|
|
37
|
+
display?: Record<string, Bilingual>
|
|
38
|
+
sections: Section[]
|
|
39
|
+
}
|
|
@@ -14,7 +14,10 @@
|
|
|
14
14
|
但它同样要回答「css 资源谁来加载」——而内核不加载(见上),哈希类名对应的规则页面上根本不存在。
|
|
15
15
|
- 官方自己的做法也是运行时注入:官方 CSS module 由宿主注入 `<style data-plugin-css="…">`。
|
|
16
16
|
- ⇒ 本包把 CSS 以 **TS 字符串**分发、运行时注入。这不是偏好,是宿主产物形态决定的。
|
|
17
|
-
-
|
|
17
|
+
- ⚠️ 这条只约束**产物**:源码自 2026-10-19 起就是真的 `.css` 文件(`src/**/*.css`),
|
|
18
|
+
由 `scripts/gen-css.mjs` 在构建期转成 `*.generated.ts`(见 `docs/design/architecture.md` §样式注入)。
|
|
19
|
+
两者不冲突——真源享受编辑器的高亮/括号匹配/格式化,产物仍是一段字符串。
|
|
20
|
+
- 若将来宿主支持加载 css 资源,可让产物也回归 `.css` + CSS Module——那是破坏性变更,要发 major。
|
|
18
21
|
- 来源:同上(三处 css.ts 注释结论 + 官方 `official-classes.ts` 观察到的注入形态)。
|
|
19
22
|
|
|
20
23
|
## 2. 官方包只在宿主编解,Node / 非内核环境不可解析
|
|
@@ -35,6 +38,22 @@
|
|
|
35
38
|
- 后果:本包调用处一律显式传 `{}`。
|
|
36
39
|
- 来源:`dsh-task-dispatch-table/src/client/file-preview.tsx` 的 `WorkspaceFilesFace` 注释(真机 2026-10-03 踩坑记录)。
|
|
37
40
|
|
|
41
|
+
## 3.1 `read` / `readBytes` 参数的**取值**约束(2026-10-21 读官方源码核实)
|
|
42
|
+
|
|
43
|
+
- 版本:`@deepseek-ai/dsh-api-workspace-files@0.2.1-rc.2`(`lib/index.js` / `lib/typert.remote-client.js`)。
|
|
44
|
+
- `read` 的 `range = { offset?, limit? }`:`offset` **从 1 起算**(`resolvePage` 里
|
|
45
|
+
`integerAtLeast(range.offset, 1)`,缺省 1);`limit` 缺省 `maxLines`,**超过即抛
|
|
46
|
+
`gateway/bad-request`**(部署默认 `maxLines = 5000`)。⇒ 首页传 `{}`、翻页传 `{ offset }`,
|
|
47
|
+
**不要自己塞 limit**(曾经塞 `limit: 5000` 且 `offset: 0`,所有文件一律「加载失败」)。
|
|
48
|
+
- `readBytes` 的 `options` 是 **strictObject**,只认 `range` / `baseFile` 两个键,
|
|
49
|
+
`{}` 合法;不带 `range` = 读全量,上限是部署 `maxFileBytes`(默认 32MiB),超出抛
|
|
50
|
+
`workspace-file/too-large`。
|
|
51
|
+
- 两者成功体都在信封 payload:`read → { offset, text, lines, eof, absolutePath, version, bytes? }`,
|
|
52
|
+
`readBytes → { offset, data: Uint8Array, eof, absolutePath, version, bytes? }`。
|
|
53
|
+
- 定位共用 `locateFile`:`path` 为空抛 `gateway/bad-request`,不存在抛 `workspace-file/not-found`,
|
|
54
|
+
非普通文件抛 `workspace-file/not-regular-file`。
|
|
55
|
+
- 来源:官方包 `lib/index.js:427/447/536/546/589`、`lib/typert.remote-client.js:44-76`。
|
|
56
|
+
|
|
38
57
|
## 4. 明暗判据
|
|
39
58
|
|
|
40
59
|
- 事实:宿主启动脚本 `toggleAttribute` 往 body 写 `data-ds-dark-theme`,是**唯一**明暗判据,
|
|
@@ -73,3 +92,133 @@
|
|
|
73
92
|
- 后果:`dsh-task-dispatch-table/src/client/mirror/` 有 15 个逐行镜像官方 `ui-tool` 的文件;
|
|
74
93
|
「会话预览要长得像官方」必须自己维护这套镜像,且**宿主升级就要跟着改**。
|
|
75
94
|
- 状态:本包 `session` **尚未搬入**这套镜像,只有最简渲染 + `renderMessage` 扩展点。
|
|
95
|
+
|
|
96
|
+
## 9. 插件注入的 CSS 曾被自己的模板字符串污染(2026-10-19,已修复)
|
|
97
|
+
|
|
98
|
+
- ❌ **已作废的结论**:本项目曾长期认为「宿主会吃掉 token 块之后的**第一条** CSS 规则」,
|
|
99
|
+
并据此在控件样式最前面加了一条 `.dshpc-css-guard{display:none}` 牺牲规则。**这是误判,
|
|
100
|
+
官方没有这种行为。** 该牺牲规则机制已整体删除。
|
|
101
|
+
- **真因**:`src/design/tokens-css.ts` 模板字符串结尾多写了一个反斜杠(写成 `\`` 而非 `` ` ``),
|
|
102
|
+
字符串内容里因此多出一个**字面反引号**。所有 CSS 拼成一份文本写进 `<style>` 时,反引号正好落在
|
|
103
|
+
tokens 与控件样式的交界处;CSS 解析器把它当成不合格选择器的开头,一路吞到下一个 `{`,
|
|
104
|
+
⇒ **紧随其后的那条规则的整个选择器**被污染(`.dshpc-seg` → `` `.dshpc-seg ``),永远匹配不到元素。
|
|
105
|
+
- **后果**:规则仍在 CSSOM 里(所以按选择器名去查会误判为“规则不存在”),但永不生效。
|
|
106
|
+
当时排首位的是 `.dshpc-seg{display:inline-flex;}` ⇒ 轨道退化成 `block` ⇒ `gap`/`padding`
|
|
107
|
+
对 block 容器无效 ⇒ 星期方块挤成一坨。拆成多条单声明时「只有第一条失效」也是同一原因。
|
|
108
|
+
- **为什么长期没被发现**:CSS 天生容错(非法 token 走错误恢复,不抛错、不打日志);TS 里
|
|
109
|
+
`\`` 是**合法转义**(语法完全正确);而当年的牺牲规则恰好排反引号之后替它挨刀,
|
|
110
|
+
现象被“修好了”,反而加固了错误结论。
|
|
111
|
+
- **官方侧核实**(`github.com/deepseek-ai/deepseek-harness`):插件 `<style>` 相关代码只有两处——
|
|
112
|
+
`packages/client/modules/src/client/system.ts` 的 `claimStyles`(给 factory 执行期新增的、
|
|
113
|
+
未标记的 `<style>` 打 `data-plugin` 并登记 `data-plugin-css`)与
|
|
114
|
+
`packages/client/modules/src/client/entry-lifecycle.ts` 的 `removeOwnedStyles`(卸载时 `el.remove()`)。
|
|
115
|
+
**没有任何代码改写 `textContent` 或操作 `cssRules`。**
|
|
116
|
+
官方自己的注入顺序是 `textContent` 先、`appendChild` 后(`packages/client/tsdown.client.ts`),
|
|
117
|
+
与本仓相反——但**该差异与本次事故无关**(用 `replaceSync` 即可复现,完全不经 DOM 插入)。
|
|
118
|
+
- **防再犯**:`test/css-contract.test.mjs` 现在断言——注入文本(tokens + 控件)不得含反引号/反斜杠、
|
|
119
|
+
tokens 模板必须以 `}` 收尾、括号与注释平衡。
|
|
120
|
+
- ⚠️ **教训**:只凭现象推断的“谁吃了规则”,在读到对方源码前不要写成结论;先看拼接处的原始字节。
|
|
121
|
+
- 来源:`packages/demo/src/probes.ts` P27–P34 实测(2026-10-19,用户回传读数)+ 官方仓库源码 +
|
|
122
|
+
本仓 `ledger/worklog/202610/19-1604-按钮与输入分区控件样式全面梳理与修复-823a.md`。
|
|
123
|
+
|
|
124
|
+
## 10. 官方 HoverCard 的 compact 变体不设文字色(2026-10-19 实测)
|
|
125
|
+
|
|
126
|
+
- **事实**:`HoverCard` 的默认 `variant` 就是 `'compact'`,走 `.card`。该变体**只写背景、不写 `color`**:
|
|
127
|
+
|
|
128
|
+
| 变体 | 背景 | 文字色 |
|
|
129
|
+
|---|---|---|
|
|
130
|
+
| `.card`(compact,默认) | `--dsw-hovercard-bg: #2C2C2E`(**硬编码,不随明暗变**) | **无声明** |
|
|
131
|
+
| `.preview` | `--dsw-alias-bg-layer-1`(跟随主题) | `--dsw-alias-label-primary` |
|
|
132
|
+
|
|
133
|
+
卡片最终 `createPortal(card, document.body)` ⇒ 挂在 `body` 直下 ⇒ 文字色退化为**继承**。
|
|
134
|
+
- **后果**:亮色主题下继承到 body 的前景色(实测 `rgb(15,17,21)` ≈ `#0f1115`),压在 `#2C2C2E` 深底上
|
|
135
|
+
⇒ **黑字看不清**;暗色下继承到近白,看起来正常。**只有亮色暴露。**
|
|
136
|
+
- **为什么官方自己不暴露**:`.card` 的 `content` 收任意 ReactNode,宿主自己传的都是官方组件(自带 color)。
|
|
137
|
+
传裸 `div` / 纯文本就会踩到。本仓 demo 正是这么踩到的(已修)。
|
|
138
|
+
- **修法**:由**调用方自己给内容色**。因为背景恒为 `#2C2C2E`(官方写死的深色),内容就该恒亮——
|
|
139
|
+
用官方在同场景(Tooltip 深底)使用的常量 `--dsw-static-neutral-bluish-00`(`#fff`)。
|
|
140
|
+
⚠️ 别用 `--dsw-alias-label-primary`:它在亮色下是近黑,压深底正好复现这个 bug。
|
|
141
|
+
- **对照:官方 Tooltip 没有这个问题**——`.bubble` 两条声明齐全
|
|
142
|
+
(`background: var(--dsw-alias-tooltip-bg)` + `color: var(--dsw-static-neutral-bluish-00)`),
|
|
143
|
+
实测亮/暗都正常。气泡带 `role="tooltip"`,需要选中它时可用该属性(不要用 CSS-module 哈希类名)。
|
|
144
|
+
- 来源:`@deepseek-ai/dsh-client-ui-primitives@0.2.1-rc.2`
|
|
145
|
+
· `lib/HoverCard.module.css` 的 `.card` / `.preview`
|
|
146
|
+
· `lib/index.js` 的 `function HoverCard({ …, variant = "compact", … })`
|
|
147
|
+
· 真机实测 2026-10-19(宿主**亮色**):浮层类名 `_card_38jqx_9`、`role: null`、
|
|
148
|
+
父节点 `BODY`、`color: rgb(15,17,21)`、`background: rgb(44,44,46)`。
|
|
149
|
+
|
|
150
|
+
## 11. client 侧现成数据面:`workspaces` 服务与 `remote.llm`(2026-10-20 核实)
|
|
151
|
+
|
|
152
|
+
- 事实 1(工作区):官方 client 挂了 cordis 服务 **`workspaces`**(`IWorkspaces`),
|
|
153
|
+
其 `list` 是 observable 快照源(`getSnapshot()` + `subscribe()`);
|
|
154
|
+
快照 `items: readonly WorkspaceView[]`,每行含 `workspaceId` / `path` / `title` /
|
|
155
|
+
`sessionIds` / `createdAt` / `updatedAt`;数据由宿主 `workspace/follow` 流实时推送。
|
|
156
|
+
- 事实 2(模型):client remote 命名空间 **`llm`** 有 `listProviders()`(已注册路由,
|
|
157
|
+
`{id, name}`)与 `listConfigurableProviders()`(可配置目录,带 `settingsNs` /
|
|
158
|
+
`settingsPath`)。**各 provider 的已配模型不在 remote 里**——要读设置镜像
|
|
159
|
+
(`configForms.describe()`)里该 provider profile 的 `models` 数组,且只认用户层
|
|
160
|
+
真正写过的(空壳 profile 不算)。写法照 `dsh-session-title-pattern` 的 DirectoryStore。
|
|
161
|
+
- 事实 3(归档集合,2026-10-22 解包 `0.2.0-rc.2` 核实):`workspaces.list` 快照**还带**
|
|
162
|
+
`archivedSessionIds: readonly SessionId[]` —— **registry-global** 归档集合(宿主
|
|
163
|
+
`workspaceRegistry.archivedSessionIds` 那一份,**不是每工作区一份**),由 follow 流的
|
|
164
|
+
baseline / `archived` 增量整体替换(`client/model.js` `installArchived`、
|
|
165
|
+
`client/index.js` `accept.replaceArchived`)。某会话是否已归档 = `archivedSessionIds` 里有它。
|
|
166
|
+
- ⚠️ **推翻的旧结论(2026-10-22)**:曾以为「归档集合 client 读不到,只能宿主侧读
|
|
167
|
+
`workspaceRegistry` 挂只读路由」,且误按**每个工作区实体**的 `archivedSessionIds` 取数
|
|
168
|
+
(实体的这个字段根本不存在;`types.d.ts` 里它只出现在 `WorkspaceArchiveValue` /
|
|
169
|
+
`WorkspaceBaseline` / follow 增量上)⇒ 集合恒为空,已归档会话一个都标不出来。
|
|
170
|
+
那条宿主路由(`serveArchivedSessions`)已删除,改走 `workspaces` 快照。
|
|
171
|
+
- 后果:工作区在 client 侧 `ctx.inject(['workspaces'])` 即可自取(本包 `workspaceList` 就是它的镜像)。
|
|
172
|
+
- ⚠️ **模型不能只靠 client**:`remote.llm` 只有 `listProviders` / `listConfigurableProviders` /
|
|
173
|
+
`discoverModels`,**没有「某 provider 的模型列表」**;模型只能宿主侧
|
|
174
|
+
`llm.listModels(providerId)` 取(`dsh-task-dispatch-table/src/dispatch.ts:81-88` 实测用法)。
|
|
175
|
+
⇒ 要模型就得插件 host 半侧挂一条只读路由(本包 `src/host/index.ts` 的 `serveModelCatalog`)。
|
|
176
|
+
- ❌ **已废弃的结论(2026-10-20)**:曾以为「读设置镜像 `configForms.describe()` 里各 provider
|
|
177
|
+
profile 的 `models`」能拿全(照抄 dsh-session-title-pattern 的 DirectoryStore)。真机上 demo
|
|
178
|
+
按此路子读出来是 0 个供应商(describe 快照里的命名空间不保证含 provider 模型)。别再走它。
|
|
179
|
+
- 来源:`@deepseek-ai/dsh-api-workspace-controller@0.2.0-rc.1`
|
|
180
|
+
· `lib/types/client/index.d.ts:19`(`workspaces: IWorkspaces`)、`lib/types/client/index.js:8`
|
|
181
|
+
(client 模块 inject = `['remote','remote.workspace']`)、`lib/types/client/service.d.ts:38`
|
|
182
|
+
· `@deepseek-ai/dsh-llm` `lib/typert.remote-client.d.ts:10-12`
|
|
183
|
+
· `dsh-session-title-pattern/src/client/model-pair.tsx:32-217`(模型目录组装口径)
|
|
184
|
+
|
|
185
|
+
### 11.1 插件宿主侧数据面:`llm.listModels` + `webServer.register`(2026-10-20 核实)
|
|
186
|
+
|
|
187
|
+
- 事实(`@deepseek-ai/dsh-llm` 宿主服务):`listProviders()` 同步返回已注册 provider
|
|
188
|
+
`{id,name}`;`listModels(providerId)` **异步**返回该 provider 可发现的模型
|
|
189
|
+
(advisory,未列出 ≠ 不可用)。单个 provider 抛错要局部跳过,不整表失败。
|
|
190
|
+
- 事实(`webServer` 服务):`register({ kind:'exact' | 'prefix', path, handler(req,res) })`;
|
|
191
|
+
客户端同源相对路径 `fetch('/api/xxx')` 即可取(`dsh-task-ledger` / `dsh-task-dispatch-table` 同款)。
|
|
192
|
+
- 口径:**模型目录必须走宿主 → 路由 → client**;client 侧 remote 只够列供应商名字。
|
|
193
|
+
本包 `src/host/index.ts` 的 `serveModelCatalog()` 封装了这条链路,`connectHost(ctx, { modelsPath })`
|
|
194
|
+
在 client 侧 fetch 同一个 path。
|
|
195
|
+
- 来源:`dsh-task-dispatch-table/src/host.ts:214-232`(`HostLlm` 面)、`src/dispatch.ts:81-88`(listModels 用法)、
|
|
196
|
+
`dsh-task-ledger/packages/plugin/src/host/routes.ts:20-44`(webServer.register + sendJson)。
|
|
197
|
+
|
|
198
|
+
## 12. workspaceFiles.list / read 的路径语义与越界判定(2026-10-22 解包核实)
|
|
199
|
+
|
|
200
|
+
- 版本:`@deepseek-ai/dsh-api-workspace-files@0.2.1-rc.2`(npm 拉包读 `lib/index.js`;0.2.0-rc.2 / 0.2.1-rc.1 的 confine 逻辑一致)。
|
|
201
|
+
- **list 的 path 绝对/相对都收**(jsDoc `index.js:491` "absolute or relative to the workspace root"):`inspect`
|
|
202
|
+
用 `lstat(path, { cwd: workspaceRoot })`(`index.js:563-571`),空 path 抛 `gateway/bad-request`
|
|
203
|
+
(本仓 `listPathOf('') → '.'` 的由来),不存在抛 `workspace-file/not-found`,非目录抛 `not-directory`。
|
|
204
|
+
- **目录列举限会话工作区内**:`confine`(`index.js:576-583`)`resolve` 后
|
|
205
|
+
`contains(root, target)` 为假 ⇒ 抛 `workspace-file/outside-workspace`。**这是 list 专属**。
|
|
206
|
+
- **read / readBytes 允许工作区外文件**(jsDoc `index.js:421` / `480` "files outside it are allowed"),
|
|
207
|
+
无 contains 检查 ⇒ 绝对路径直读任何 OS 可达文件。**后果**:同一绝对路径,read 成功而 list(父目录)
|
|
208
|
+
被拒是官方设计的不对称,不是 bug——表现为「文件预览正常、路径栏/目录树退化成只读」。
|
|
209
|
+
- **list 是会话作用域服务**:`workspaceFileScope.workspaceRoot` 按 sessionId 派生(`index.js:563`;
|
|
210
|
+
兄弟项目 `dsh-task-dispatch-table/src/host.ts:177` 注释同结论:「list 以 sessionId 解析工作区根,
|
|
211
|
+
必须有属于该工作区的会话才能列其文件」)。⇒ 调用方只给绝对路径时,默认 sessionId 的根未必含它。
|
|
212
|
+
- **错误码全集(0.2.1-rc.2)**:`gateway/bad-request`、`workspace-file/not-found`、`not-directory`、
|
|
213
|
+
`not-regular-file`、`outside-workspace`、`too-large`、`not-text`、`invocation-unavailable`、
|
|
214
|
+
`service-unavailable`。⚠️ **没有 `lookup-not-found`**(本仓 `errView` / `noteOutside` 曾误引,
|
|
215
|
+
2026-10-22 移除,来源为初版 commit eca3f25,无官方依据)。
|
|
216
|
+
- **对照**(`github.com/omdsh-dev/DSH-better-sidebar`,2026-10-22 读):它的文件树**不走**官方
|
|
217
|
+
`workspaceFiles.list`,走自建 host 路由 `fs.tree`(host 直接 fs);且 v0.23.0 起删掉了自己的
|
|
218
|
+
workspace fence(README 原话:「fs 路由不做 workspace 包含检查……调用方不得把这些路由当作有栅栏的」)
|
|
219
|
+
⇒ 它那里「跨工作区随便逛」是绕开官方 confinement 的结果,**不代表官方 API 贯通**。
|
|
220
|
+
- 处置(本仓):`workspaceAnchorForPath`(`src/explorer/types.ts`)按最长前缀把绝对路径解析到
|
|
221
|
+
宿主工作区清单里的所属工作区,list 换该工作区名下的会话 id;`openFilePreview({ workspaceAnchors })`
|
|
222
|
+
透传;匹配不到 ⇒ 回落 `props.sessionId` + `crumbBarPlain` 的 hint 说破原因。
|
|
223
|
+
- 来源:官方包 `lib/index.js:489-512 / 563-583 / 421 / 480`;`dsh-task-dispatch-table/src/host.ts:174-187`;
|
|
224
|
+
`dsh-better-sidebar` README + `docs/plans/2026-08-29-workspace-fence-toggle-design.md` + `src/client/use-session-root.ts`。
|
package/docs/design/features.md
CHANGED
|
@@ -1,19 +1,6 @@
|
|
|
1
|
-
#
|
|
1
|
+
# 功能总索引(不适用)
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
本槽位由帮助索引 `docs/help/index.md` 承担:它按「你要做的事」路由到各功能文档,
|
|
4
|
+
并在随包发布时直接作为引用方与 Agent 的入口。本文件不再维护第二份内容。
|
|
4
5
|
|
|
5
|
-
|
|
6
|
-
|---|---|---|
|
|
7
|
-
| `dsh-plugin-core/design` | token 变量表(含深色段)、`createStyleKit` 注入器工厂、`DARK_THEME_SELECTOR` | [`features/design.md`](features/design.md) |
|
|
8
|
-
| `dsh-plugin-core/ui` | 控件:Button / IconButton / Segmented / Textarea / Checkbox / Input 家族 / Picker / ModelPicker / WorkspacePicker / FilePicker / **Card** / **StripCard** / **Chip** / Modal / toast / Loading / SectionHead / MarqueeText / LiveText / BackToTop / resizer / EmptyState / ErrorBoundary | [`features/ui.md`](features/ui.md) |
|
|
9
|
-
| `dsh-plugin-core/utils` | 日期(含相对时间过去/未来)、字符串、字节/计数、时间区间、HTTP 取数、内置中英多语言 | [`features/utils.md`](features/utils.md) |
|
|
10
|
-
| `dsh-plugin-core/explorer` | `ExplorerPanel`(面包屑 + 目录树 + 预览)、`WorkspaceFilesFace` 契约与路径工具(**不含选择器**——选工作区/选文件在 ui) | [`features/explorer.md`](features/explorer.md) |
|
|
11
|
-
| `dsh-plugin-core/explorer/preview` | 单文件预览体(文本 / 图片 / 不支持兜底) | 同上 |
|
|
12
|
-
| `dsh-plugin-core/session` | `SessionPreview`(弹窗 / 侧栏 / 整页三种承载)、`SessionSource` 契约、`renderMessage` 定制扩展点 | [`features/session.md`](features/session.md) |
|
|
13
|
-
|
|
14
|
-
## 不提供什么
|
|
15
|
-
|
|
16
|
-
- 官方会话 UI 的完整镜像(工具卡 / 代码块 / 推理行)—— `session` 目前只有最简渲染,
|
|
17
|
-
富内容走 `renderMessage` 扩展点。
|
|
18
|
-
- 代码语法高亮 / PDF / Office 预览 —— `explorer` 的预览只有文本与图片。
|
|
19
|
-
- 设置页骨架、i18n 框架(插件自己的文案插件自己管)、`host` 宿主类型面。
|
|
6
|
+
本槽位在上级规则里是**路径固定**的,故保留文件与槽位行,不删、不改名、不挪位。
|
package/docs/design/methods.md
CHANGED
|
@@ -1,43 +1,22 @@
|
|
|
1
|
-
#
|
|
1
|
+
# 方法规范(本仓内部)
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
新增方法时按这一页的口径来,别自创一套。
|
|
3
|
+
> EN: Helper conventions (internal)
|
|
5
4
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
| 输入解析失败(日期 / 数字) | **不抛错**,返回调用方兜底;兜底可传则传,不可传用固定占位 |
|
|
11
|
-
| 固定占位 | 日期类 `—`,时刻类 `-`,体积类 `—`;调用方可用 `opts.fallback` 覆盖 |
|
|
12
|
-
| 空值(`null` / `undefined` / 空串) | 与解析失败同口径,不特殊崩 |
|
|
13
|
-
| 边界值(0 / 负数 / NaN) | 明确处理并写进注释,不静默通过 |
|
|
14
|
-
| 时区 | 一律**本机时区**(沿用三家现有口径);要显式时区请在调用方转换后再传 |
|
|
15
|
-
|
|
16
|
-
## 为什么解析失败不抛错
|
|
17
|
-
|
|
18
|
-
这些函数大量用在渲染路径上(列表每一行都调)。一个坏数据让整页崩 vs 显示一个占位符——
|
|
19
|
-
后者明显是我们要的。**但兜底不能编造**:不知道就不显示,不要猜一个时间。
|
|
20
|
-
|
|
21
|
-
## 分模块口径
|
|
22
|
-
|
|
23
|
-
- **日期**:见 [`features/utils.md`](features/utils.md) 的表格,每个函数的失败返回都列了。
|
|
24
|
-
`relativePast` / `relativeFuture` 对偶,别用错。
|
|
25
|
-
- **字符串**:`truncateBytes` 按 **UTF-8 字节**截断,不切半个字(中文场景必须)。
|
|
26
|
-
`baseNameOf` 处理目录尾斜杠,不会取成空串。
|
|
27
|
-
- **数字**:`formatBytes` 对 0 与负数返回 `—`,不显示「0 B」这种假精确。
|
|
28
|
-
- **HTTP**:默认 10s 超时;超时抛 `AbortError`,非 2xx 抛带 `status` 的 `HttpError`。
|
|
29
|
-
|
|
30
|
-
## 多语言口径
|
|
31
|
-
|
|
32
|
-
- 核心提供的固定提示语 ⇒ 本包内置中英(`setLocale` 切)。
|
|
33
|
-
- 需要文案的 API 一律可传 `translate: Translate` 覆盖,默认走内置。
|
|
34
|
-
- 插件自己界面的文案 ⇒ 插件自己管,本包不提供插件级 i18n 框架。
|
|
35
|
-
- 新增 key 必须被真正使用(`test/no-dead-keys.test.mjs` 盯着,死 key 会让测试红)。
|
|
5
|
+
使用侧内容(统一口径与返回值约定)在帮助文档区 `docs/help/`。
|
|
6
|
+
本文件只留**往 `utils` 里加方法时**要守的东西。
|
|
7
|
+
EN: The caller-facing material (shared contract and return values) lives in `docs/help/`. What stays here is
|
|
8
|
+
only what you must honour when **adding a helper to `utils`**.
|
|
36
9
|
|
|
37
10
|
## 新增一个方法的 checklist
|
|
38
11
|
|
|
12
|
+
> EN: Checklist for a new helper
|
|
13
|
+
|
|
39
14
|
- [ ] 失败路径有明确兜底,且兜底可覆盖
|
|
40
15
|
- [ ] 边界值(空 / 0 / 负 / NaN)有测试
|
|
41
16
|
- [ ] 进了 `src/utils/index.ts` 出口(曾漏过 `relativeFuture`)
|
|
42
17
|
- [ ] 需要文案的走 `t()` + `translate` 参数
|
|
43
|
-
- [ ]
|
|
18
|
+
- [ ] 在帮助文档区 `docs/help/` 的对应参数表里登记一行
|
|
19
|
+
|
|
20
|
+
EN: Failure path has a clear, overridable fallback; edge cases (empty / 0 / negative / NaN) covered by tests;
|
|
21
|
+
exported from `src/utils/index.ts`; text goes through `t()` + `translate`; registered as a row in the
|
|
22
|
+
matching parameter table under `docs/help/`.
|