dsh-vscode-mode 0.1.17 → 0.1.20
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 +17 -7
- package/lib/client.js +1261 -280
- package/lib/client.js.map +1 -1
- package/lib/index.js +169 -23
- package/lib/index.js.map +1 -1
- package/package.json +1 -1
- package/src/client/addToConversation.ts +211 -0
- package/src/client/diffDock.ts +52 -0
- package/src/client/diffDockStore.ts +87 -0
- package/src/client/editorLayout.ts +19 -0
- package/src/client/events.ts +40 -11
- package/src/client/index.ts +48 -5
- package/src/client/sidebar/SidebarView.ts +73 -0
- package/src/client/sidebar/panels/FileExplorer.ts +161 -0
- package/src/client/sidebar/panels/index.ts +24 -0
- package/src/client/sidebar/registry.ts +52 -0
- package/src/client/sidebar/types.ts +31 -0
- package/src/client/styles/editor.css +127 -5
- package/src/client/ui/ConversationDiffDock.ts +84 -0
- package/src/client/ui/DiffBox.ts +78 -29
- package/src/client/ui/EditorView.ts +375 -68
- package/src/rpc.ts +84 -18
- package/src/shared/rpc.ts +29 -1
- package/src/store.ts +6 -2
- package/src/tree.ts +62 -0
package/src/client/ui/DiffBox.ts
CHANGED
|
@@ -6,24 +6,63 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import React from 'react'
|
|
8
8
|
import { callIdAttr } from '../state/records.js'
|
|
9
|
+
import { diffDockText } from '../diffDock.js'
|
|
9
10
|
import { badgeOf } from './shared.js'
|
|
10
11
|
|
|
12
|
+
/**
|
|
13
|
+
* 折叠控制使用任务栏同尺寸的 chevron 轮廓,避免依赖未声明的运行时图标包。
|
|
14
|
+
* @author ddj 2026年08月25号
|
|
15
|
+
* @param open 是否已展开
|
|
16
|
+
* @returns 14×14 的装饰性 chevron SVG
|
|
17
|
+
*/
|
|
18
|
+
function chevronOf(open) {
|
|
19
|
+
const path = open ? 'M3.25 5.25 7 9l3.75-3.75' : 'M3.25 8.75 7 5l3.75 3.75'
|
|
20
|
+
return React.createElement('svg', {
|
|
21
|
+
width: 14,
|
|
22
|
+
height: 14,
|
|
23
|
+
viewBox: '0 0 14 14',
|
|
24
|
+
fill: 'none',
|
|
25
|
+
'aria-hidden': true,
|
|
26
|
+
focusable: false,
|
|
27
|
+
}, React.createElement('path', {
|
|
28
|
+
d: path,
|
|
29
|
+
stroke: 'currentColor',
|
|
30
|
+
strokeWidth: 1.2,
|
|
31
|
+
strokeLinecap: 'round',
|
|
32
|
+
strokeLinejoin: 'round',
|
|
33
|
+
}))
|
|
34
|
+
}
|
|
35
|
+
|
|
11
36
|
/**
|
|
12
37
|
* 差异条:当前文件内 diff 导航(↑↓←→)、Keep/Undo、展开 hunk 列表、⋮ 二级菜单
|
|
13
38
|
* (Keep All / Undo All / 差异总览 / 归档 / 回滚 / 刷新)+ 其他差异文件小节。
|
|
14
39
|
*/
|
|
15
40
|
export function DiffBox(props) {
|
|
16
41
|
const {
|
|
17
|
-
pendingRegions, staleRegions, onAct, onAcceptFile, onUndoFile, onAcceptAllFiles, onUndoAllFiles,
|
|
18
|
-
allPendingCount, onRollback, onJump, otherFiles, onOpenOther, onOpenLauncher, onRefresh, activePath,
|
|
19
|
-
diffIdx, diffTotal, fileIdx, fileTotal, onPrevDiff, onNextDiff, onPrevFile, onNextFile,
|
|
42
|
+
pendingRegions = [], staleRegions = [], onAct, onAcceptFile, onUndoFile, onAcceptAllFiles, onUndoAllFiles,
|
|
43
|
+
allPendingCount = 0, onRollback, onJump, otherFiles = [], onOpenOther, onOpenLauncher, onRefresh, activePath,
|
|
44
|
+
diffIdx = 0, diffTotal = 0, fileIdx = 0, fileTotal = 0, onPrevDiff, onNextDiff, onPrevFile, onNextFile,
|
|
45
|
+
mode = 'editor', onOpenNextFile, dock = false,
|
|
20
46
|
} = props
|
|
21
47
|
const [expanded, setExpanded] = React.useState(false)
|
|
22
|
-
const [
|
|
48
|
+
const [detailsOpen, setDetailsOpen] = React.useState(false)
|
|
49
|
+
const detailsId = React.useId()
|
|
23
50
|
const canAct = pendingRegions.length > 0
|
|
24
51
|
|
|
25
52
|
const base = String(activePath || '').split(/[\\/]/).pop() || ''
|
|
26
53
|
|
|
54
|
+
if (mode === 'chat' || mode === 'editor-empty') {
|
|
55
|
+
return React.createElement('div', { className: 'edrv-diffbar edrv-diffbar-dock', 'data-edrv-diffbox': '1', 'data-edrv-diff-mode': mode },
|
|
56
|
+
React.createElement('div', { className: 'edrv-diffbar-row edrv-diffbar-dock-row' },
|
|
57
|
+
React.createElement('button', {
|
|
58
|
+
type: 'button',
|
|
59
|
+
className: 'edrv-diffbar-dock-button',
|
|
60
|
+
title: '切换到下一个差异文件',
|
|
61
|
+
'aria-label': diffDockText(fileTotal),
|
|
62
|
+
onClick: onOpenNextFile,
|
|
63
|
+
}, diffDockText(fileTotal))))
|
|
64
|
+
}
|
|
65
|
+
|
|
27
66
|
let bodyEl = null
|
|
28
67
|
if (expanded) {
|
|
29
68
|
const rows = pendingRegions.map((r) => {
|
|
@@ -49,32 +88,42 @@ export function DiffBox(props) {
|
|
|
49
88
|
bodyEl = React.createElement('div', { className: 'edrv-diffbar-body' }, ...rows, ...stale, othersEl)
|
|
50
89
|
}
|
|
51
90
|
|
|
52
|
-
const
|
|
53
|
-
? React.createElement(
|
|
54
|
-
React.createElement('
|
|
55
|
-
React.createElement('
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
React.createElement('button', { className: 'edrv-diffmenu-item', disabled: !canAct, onClick: () => { onRollback(); setMenuOpen(false) } }, '⟲ 回滚文件'),
|
|
63
|
-
React.createElement('button', { className: 'edrv-diffmenu-item', onClick: () => { onRefresh(); setMenuOpen(false) } }, '⟳ 刷新')))
|
|
91
|
+
const details = detailsOpen
|
|
92
|
+
? React.createElement('div', { className: 'edrv-diff-details', id: detailsId },
|
|
93
|
+
React.createElement('button', { className: 'edrv-diffmenu-item', disabled: !allPendingCount, onClick: onAcceptAllFiles }, '✓ Keep All(全部文件采纳)'),
|
|
94
|
+
React.createElement('button', { className: 'edrv-diffmenu-item danger', disabled: !allPendingCount, onClick: onUndoAllFiles }, '↩ Undo All(全部文件不采纳)'),
|
|
95
|
+
React.createElement('div', { className: 'edrv-diffmenu-sep' }),
|
|
96
|
+
React.createElement('button', { className: 'edrv-diffmenu-item', onClick: () => onOpenLauncher('pending') }, '🗂 差异总览'),
|
|
97
|
+
React.createElement('button', { className: 'edrv-diffmenu-item', onClick: () => onOpenLauncher('archive') }, '📁 归档'),
|
|
98
|
+
React.createElement('div', { className: 'edrv-diffmenu-sep' }),
|
|
99
|
+
React.createElement('button', { className: 'edrv-diffmenu-item', disabled: !canAct, onClick: onRollback }, '⟲ 回滚文件'),
|
|
100
|
+
React.createElement('button', { className: 'edrv-diffmenu-item', onClick: onRefresh }, '⟳ 刷新'))
|
|
64
101
|
: null
|
|
65
102
|
|
|
66
|
-
return React.createElement('div', { className: 'edrv-diffbar', 'data-edrv-diffbox': '1' },
|
|
67
|
-
React.createElement('div', { className: 'edrv-diffbar-row' },
|
|
68
|
-
React.createElement('
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
103
|
+
return React.createElement('div', { className: 'edrv-diffbar edrv-diffbar-dock', 'data-edrv-diffbox': '1', 'data-edrv-diff-mode': 'editor' },
|
|
104
|
+
React.createElement('div', { className: 'edrv-diffbar-row edrv-diffbar-editor-row' },
|
|
105
|
+
React.createElement('div', { className: 'edrv-diffbar-editor-content' },
|
|
106
|
+
React.createElement('div', { className: 'edrv-diffbar-nav' },
|
|
107
|
+
React.createElement('button', { className: 'edrv-pill edrv-pill-ghost', title: '上一个差异', disabled: !canAct, onClick: onPrevDiff }, '↑'),
|
|
108
|
+
React.createElement('span', { className: 'edrv-diffbar-count edrv-diffbar-progress', title: '当前文件内差异位置(点击展开/收起差异列表)', onClick: () => setExpanded((v) => !v) }, diffTotal ? (diffIdx + 1) + '/' + diffTotal : '0/0'),
|
|
109
|
+
React.createElement('button', { className: 'edrv-pill edrv-pill-ghost', title: '下一个差异', disabled: !canAct, onClick: onNextDiff }, '↓')),
|
|
110
|
+
React.createElement('div', { className: 'edrv-diffbar-files' },
|
|
111
|
+
React.createElement('button', { className: 'edrv-pill edrv-pill-ghost', title: '上一个差异文件', disabled: !fileTotal, onClick: onPrevFile }, '←'),
|
|
112
|
+
React.createElement('span', { className: 'edrv-diffbar-count edrv-count-file edrv-diffbar-progress', title: '差异文件位置' }, fileTotal ? (fileIdx + 1) + '/' + fileTotal + ' 文件' : '0/0 文件'),
|
|
113
|
+
React.createElement('button', { className: 'edrv-pill edrv-pill-ghost', title: '下一个差异文件', disabled: !fileTotal, onClick: onNextFile }, '→'),
|
|
114
|
+
React.createElement('span', { className: 'edrv-diffbar-file edrv-diffbar-summary', title: activePath || '' }, base)),
|
|
115
|
+
|
|
116
|
+
React.createElement('div', { className: 'edrv-diffbar-actions' },
|
|
117
|
+
React.createElement('button', { className: 'edrv-pill edrv-pill-keep', title: '采纳当前文件的全部差异', disabled: !canAct, onClick: onAcceptFile }, '✓ Keep'),
|
|
118
|
+
React.createElement('button', { className: 'edrv-pill edrv-pill-undo', title: '不采纳当前文件的全部差异(回滚)', disabled: !canAct, onClick: onUndoFile }, '↩ Undo'),
|
|
119
|
+
React.createElement('button', {
|
|
120
|
+
className: 'edrv-pill edrv-pill-ghost edrv-diff-details-toggle',
|
|
121
|
+
title: detailsOpen ? '收起差异操作' : '展开差异操作',
|
|
122
|
+
'aria-label': detailsOpen ? '收起差异操作' : '展开差异操作',
|
|
123
|
+
'aria-expanded': detailsOpen,
|
|
124
|
+
'aria-controls': detailsId,
|
|
125
|
+
onClick: () => setDetailsOpen((value) => !value),
|
|
126
|
+
}, chevronOf(detailsOpen))))),
|
|
78
127
|
bodyEl,
|
|
79
|
-
|
|
128
|
+
details)
|
|
80
129
|
}
|