@deepseek-harness-tui/dsh-tui 0.8.7 → 0.8.8
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 +2 -2
- package/bin/dsh-tui.js +1 -1
- package/lib/types/components/FileSuggestions.d.ts +8 -4
- package/lib/types/components/FileSuggestions.d.ts.map +1 -1
- package/lib/types/components/FileSuggestions.js +22 -12
- package/lib/types/components/LogoV2.d.ts +5 -1
- package/lib/types/components/LogoV2.d.ts.map +1 -1
- package/lib/types/components/LogoV2.js +12 -3
- package/lib/types/components/PromptInput.d.ts.map +1 -1
- package/lib/types/components/PromptInput.js +25 -21
- package/lib/types/dsh-adapter/channel.d.ts +11 -1
- package/lib/types/dsh-adapter/channel.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel.js +100 -37
- package/lib/types/dsh-adapter/contract.d.ts +58 -18
- package/lib/types/dsh-adapter/contract.d.ts.map +1 -1
- package/lib/types/dsh-adapter/contract.js +124 -36
- package/lib/types/dsh-adapter/index.d.ts.map +1 -1
- package/lib/types/dsh-adapter/index.js +6 -12
- package/lib/types/i18n.d.ts +18 -1
- package/lib/types/i18n.d.ts.map +1 -1
- package/lib/types/i18n.js +22 -2
- package/lib/types/ink/ink.d.ts.map +1 -1
- package/lib/types/ink/ink.js +38 -23
- package/lib/types/ink/render-node-to-output.d.ts +6 -3
- package/lib/types/ink/render-node-to-output.d.ts.map +1 -1
- package/lib/types/ink/render-node-to-output.js +33 -7
- package/lib/types/ink/selection.d.ts +29 -4
- package/lib/types/ink/selection.d.ts.map +1 -1
- package/lib/types/ink/selection.js +41 -5
- package/lib/types/tips.d.ts.map +1 -1
- package/lib/types/tips.js +22 -4
- package/lib/types/utils/fileSuggestions.d.ts +19 -0
- package/lib/types/utils/fileSuggestions.d.ts.map +1 -0
- package/lib/types/utils/fileSuggestions.js +40 -0
- package/lib/types/utils/mentions.d.ts.map +1 -1
- package/lib/types/utils/mentions.js +3 -1
- package/package.json +67 -66
|
@@ -71,14 +71,17 @@ export function resetScrollDrainNode() {
|
|
|
71
71
|
export function getScrollDrainNode() {
|
|
72
72
|
return scrollDrainNode;
|
|
73
73
|
}
|
|
74
|
-
let
|
|
74
|
+
let followScrolls = [];
|
|
75
75
|
/**
|
|
76
|
-
* Read and clear the follow-scroll
|
|
77
|
-
*
|
|
76
|
+
* Read and clear the follow-scroll events recorded this frame. At most one
|
|
77
|
+
* per ScrollBox (a box that follows AND drains reports only the follow —
|
|
78
|
+
* the follow branch clears pendingScrollDelta before the drain runs);
|
|
79
|
+
* several boxes may each report when they scroll in the same frame.
|
|
80
|
+
* @returns this frame's follow-scroll events; empty when none.
|
|
78
81
|
*/
|
|
79
82
|
export function consumeFollowScroll() {
|
|
80
|
-
const f =
|
|
81
|
-
|
|
83
|
+
const f = followScrolls;
|
|
84
|
+
followScrolls = [];
|
|
82
85
|
return f;
|
|
83
86
|
}
|
|
84
87
|
// ── Native terminal drain (iTerm2/Ghostty/etc. — proportional events) ──
|
|
@@ -684,11 +687,11 @@ function renderNodeToOutput(node, output, options) {
|
|
|
684
687
|
const followDelta = (node.scrollTop ?? 0) - scrollTopBeforeFollow;
|
|
685
688
|
if (followDelta > 0) {
|
|
686
689
|
const vpTop = node.scrollViewportTop ?? 0;
|
|
687
|
-
|
|
690
|
+
followScrolls.push({
|
|
688
691
|
delta: followDelta,
|
|
689
692
|
viewportTop: vpTop,
|
|
690
693
|
viewportBottom: vpTop + innerHeight - 1,
|
|
691
|
-
};
|
|
694
|
+
});
|
|
692
695
|
}
|
|
693
696
|
// Drain pendingScrollDelta. Native terminals (proportional burst
|
|
694
697
|
// events) use proportional drain; xterm.js (VS Code, sparse events +
|
|
@@ -749,6 +752,29 @@ function renderNodeToOutput(node, output, options) {
|
|
|
749
752
|
node.pendingScrollDelta = undefined;
|
|
750
753
|
if (node.pendingScrollDelta !== undefined)
|
|
751
754
|
scrollDrainNode = node;
|
|
755
|
+
// Wheel-drain selection translate (#438): the drain moved content
|
|
756
|
+
// by (scrollTop - scrollTopBeforeFollow) rows this frame, minus
|
|
757
|
+
// what at-bottom follow already reported above (followDelta is 0
|
|
758
|
+
// unless the follow branch fired — and when it did, it cleared
|
|
759
|
+
// pendingScrollDelta, so the drain contributed nothing). Record
|
|
760
|
+
// the remainder as a follow-scroll event with a SIGNED delta so
|
|
761
|
+
// ink.tsx re-anchors any active selection to the text. Without
|
|
762
|
+
// this, wheel scrolling leaves the highlight pinned to screen
|
|
763
|
+
// rows and copy-on-select grabs whatever scrolled under it.
|
|
764
|
+
// scrollTo/scrollToElement jumps never contribute: they write
|
|
765
|
+
// scrollTop before scrollTopBeforeFollow is captured. Multi-frame
|
|
766
|
+
// drains record per-frame portions; the selection's virtual-row
|
|
767
|
+
// tracking accumulates the clamp overshoot across frames. Multiple
|
|
768
|
+
// boxes may each record; ink.tsx attributes by viewport containment.
|
|
769
|
+
const wheelDelta = scrollTop - scrollTopBeforeFollow - followDelta;
|
|
770
|
+
if (wheelDelta !== 0) {
|
|
771
|
+
const wheelVpTop = node.scrollViewportTop ?? 0;
|
|
772
|
+
followScrolls.push({
|
|
773
|
+
delta: wheelDelta,
|
|
774
|
+
viewportTop: wheelVpTop,
|
|
775
|
+
viewportBottom: wheelVpTop + innerHeight - 1
|
|
776
|
+
});
|
|
777
|
+
}
|
|
752
778
|
// A manual scroll that lands exactly on the bottom re-pins sticky
|
|
753
779
|
// IMMEDIATELY on this frame — the follow-block restore above only
|
|
754
780
|
// fires when a later frame happens, but an idle stream (turn done,
|
|
@@ -213,10 +213,12 @@ export declare function shiftAnchor(s: SelectionState, dRow: number, minRow: num
|
|
|
213
213
|
* the selection is text-anchored at both ends — both must move. The
|
|
214
214
|
* isDragging check in ink.tsx picks which shift to apply.
|
|
215
215
|
*
|
|
216
|
-
* If both ends would shift strictly BELOW minRow
|
|
217
|
-
* text has scrolled entirely off the
|
|
218
|
-
*
|
|
219
|
-
*
|
|
216
|
+
* If both ends would shift strictly BELOW minRow or strictly ABOVE maxRow
|
|
217
|
+
* (unclamped), the selected text has scrolled entirely off the viewport —
|
|
218
|
+
* off the top via streaming follow / wheel-down, off the bottom via
|
|
219
|
+
* wheel-up. Clear it — otherwise a single inverted cell lingers at the
|
|
220
|
+
* edge as a ghost (native terminals drop the selection when it leaves
|
|
221
|
+
* scrollback). Landing AT the edge row is
|
|
220
222
|
* still valid: that cell holds the correct text. Returns true if the
|
|
221
223
|
* selection was cleared so the caller can notify React-land subscribers
|
|
222
224
|
* (useHasSelection) — the caller is inside onRender so it can't use
|
|
@@ -229,6 +231,29 @@ export declare function shiftAnchor(s: SelectionState, dRow: number, minRow: num
|
|
|
229
231
|
* entirely off the top, false otherwise.
|
|
230
232
|
*/
|
|
231
233
|
export declare function shiftSelectionForFollow(s: SelectionState, dRow: number, minRow: number, maxRow: number): boolean;
|
|
234
|
+
/** A scroll event reported by a ScrollBox this frame (follow or wheel
|
|
235
|
+
* drain): signed delta plus the box's viewport bounds. Structurally
|
|
236
|
+
* identical to FollowScroll in render-node-to-output. */
|
|
237
|
+
export type ScrollEvent = {
|
|
238
|
+
delta: number;
|
|
239
|
+
viewportTop: number;
|
|
240
|
+
viewportBottom: number;
|
|
241
|
+
};
|
|
242
|
+
/**
|
|
243
|
+
* Pick which scroll event a selection belongs to when several ScrollBoxes
|
|
244
|
+
* scrolled in the same frame (e.g., the transcript still draining a wheel
|
|
245
|
+
* burst while an overlay panel's box scrolls). The selection follows the
|
|
246
|
+
* INNERMOST viewport containing the anchor: overlay panels render on top
|
|
247
|
+
* of the transcript, so a selection inside the overlap rows belongs to
|
|
248
|
+
* the panel, not the covered transcript beneath it. A selection outside
|
|
249
|
+
* every viewport (footer/prompt, static text) follows nothing — scrolling
|
|
250
|
+
* doesn't move the content under it.
|
|
251
|
+
* @param events - this frame's scroll events (signed deltas).
|
|
252
|
+
* @param anchorRow - the selection anchor's screen row, or null when no
|
|
253
|
+
* selection is active.
|
|
254
|
+
* @returns the event the selection should be translated by, or null.
|
|
255
|
+
*/
|
|
256
|
+
export declare function pickFollowForSelection(events: ScrollEvent[], anchorRow: number | null): ScrollEvent | null;
|
|
232
257
|
/**
|
|
233
258
|
* True when a selection is active, meaning both anchor and focus are set.
|
|
234
259
|
* @param s - the selection state to inspect.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"selection.d.ts","sourceRoot":"","sources":["../../../src/ink/selection.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"selection.d.ts","sourceRoot":"","sources":["../../../src/ink/selection.ts"],"names":[],"mappings":"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"}
|
|
@@ -579,10 +579,12 @@ export function shiftAnchor(s, dRow, minRow, maxRow) {
|
|
|
579
579
|
* the selection is text-anchored at both ends — both must move. The
|
|
580
580
|
* isDragging check in ink.tsx picks which shift to apply.
|
|
581
581
|
*
|
|
582
|
-
* If both ends would shift strictly BELOW minRow
|
|
583
|
-
* text has scrolled entirely off the
|
|
584
|
-
*
|
|
585
|
-
*
|
|
582
|
+
* If both ends would shift strictly BELOW minRow or strictly ABOVE maxRow
|
|
583
|
+
* (unclamped), the selected text has scrolled entirely off the viewport —
|
|
584
|
+
* off the top via streaming follow / wheel-down, off the bottom via
|
|
585
|
+
* wheel-up. Clear it — otherwise a single inverted cell lingers at the
|
|
586
|
+
* edge as a ghost (native terminals drop the selection when it leaves
|
|
587
|
+
* scrollback). Landing AT the edge row is
|
|
586
588
|
* still valid: that cell holds the correct text. Returns true if the
|
|
587
589
|
* selection was cleared so the caller can notify React-land subscribers
|
|
588
590
|
* (useHasSelection) — the caller is inside onRender so it can't use
|
|
@@ -609,7 +611,11 @@ export function shiftSelectionForFollow(s, dRow, minRow, maxRow) {
|
|
|
609
611
|
const rawFocus = s.focus
|
|
610
612
|
? (s.virtualFocusRow ?? s.focus.row) + dRow
|
|
611
613
|
: undefined;
|
|
612
|
-
|
|
614
|
+
// Both ends strictly past the same edge = selection fully scrolled off
|
|
615
|
+
// (top: follow/wheel-down; bottom: wheel-up). Symmetric clear — a
|
|
616
|
+
// clamped-to-edge pair would render as a 1-row ghost highlight.
|
|
617
|
+
if ((rawAnchor < minRow && rawFocus !== undefined && rawFocus < minRow) ||
|
|
618
|
+
(rawAnchor > maxRow && rawFocus !== undefined && rawFocus > maxRow)) {
|
|
613
619
|
clearSelection(s);
|
|
614
620
|
return true;
|
|
615
621
|
}
|
|
@@ -640,6 +646,36 @@ export function shiftSelectionForFollow(s, dRow, minRow, maxRow) {
|
|
|
640
646
|
}
|
|
641
647
|
return false;
|
|
642
648
|
}
|
|
649
|
+
/**
|
|
650
|
+
* Pick which scroll event a selection belongs to when several ScrollBoxes
|
|
651
|
+
* scrolled in the same frame (e.g., the transcript still draining a wheel
|
|
652
|
+
* burst while an overlay panel's box scrolls). The selection follows the
|
|
653
|
+
* INNERMOST viewport containing the anchor: overlay panels render on top
|
|
654
|
+
* of the transcript, so a selection inside the overlap rows belongs to
|
|
655
|
+
* the panel, not the covered transcript beneath it. A selection outside
|
|
656
|
+
* every viewport (footer/prompt, static text) follows nothing — scrolling
|
|
657
|
+
* doesn't move the content under it.
|
|
658
|
+
* @param events - this frame's scroll events (signed deltas).
|
|
659
|
+
* @param anchorRow - the selection anchor's screen row, or null when no
|
|
660
|
+
* selection is active.
|
|
661
|
+
* @returns the event the selection should be translated by, or null.
|
|
662
|
+
*/
|
|
663
|
+
export function pickFollowForSelection(events, anchorRow) {
|
|
664
|
+
if (anchorRow === null)
|
|
665
|
+
return null;
|
|
666
|
+
let best = null;
|
|
667
|
+
let bestHeight = Infinity;
|
|
668
|
+
for (const e of events) {
|
|
669
|
+
if (anchorRow < e.viewportTop || anchorRow > e.viewportBottom)
|
|
670
|
+
continue;
|
|
671
|
+
const height = e.viewportBottom - e.viewportTop;
|
|
672
|
+
if (best === null || height < bestHeight) {
|
|
673
|
+
best = e;
|
|
674
|
+
bestHeight = height;
|
|
675
|
+
}
|
|
676
|
+
}
|
|
677
|
+
return best;
|
|
678
|
+
}
|
|
643
679
|
/**
|
|
644
680
|
* True when a selection is active, meaning both anchor and focus are set.
|
|
645
681
|
* @param s - the selection state to inspect.
|
package/lib/types/tips.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tips.d.ts","sourceRoot":"","sources":["../../src/tips.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,UAAU,GAAG,UAAU,GAAG,SAAS,GAAG,UAAU,CAAA;AAEhF,MAAM,WAAW,GAAG;IAClB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,QAAQ,CAAA;IACf,EAAE,EAAE,MAAM,CAAA;IACV,EAAE,EAAE,MAAM,CAAA;CACX;AAED,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,QAAQ,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAMzE,CAAA;AAED,eAAO,MAAM,IAAI,EAAE,SAAS,GAAG,
|
|
1
|
+
{"version":3,"file":"tips.d.ts","sourceRoot":"","sources":["../../src/tips.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,UAAU,GAAG,UAAU,GAAG,SAAS,GAAG,UAAU,CAAA;AAEhF,MAAM,WAAW,GAAG;IAClB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,QAAQ,CAAA;IACf,EAAE,EAAE,MAAM,CAAA;IACV,EAAE,EAAE,MAAM,CAAA;CACX;AAED,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,QAAQ,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAMzE,CAAA;AAED,eAAO,MAAM,IAAI,EAAE,SAAS,GAAG,EAwjB9B,CAAA;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,MAAM,GAAE,MAAM,MAAoB,GAAG,GAAG,CAErE;AAED,0CAA0C;AAC1C,wBAAgB,WAAW,CAAC,KAAK,EAAE,QAAQ,GAAG,GAAG,EAAE,CAElD"}
|
package/lib/types/tips.js
CHANGED
|
@@ -98,8 +98,14 @@ export const TIPS = [
|
|
|
98
98
|
{
|
|
99
99
|
id: 'keys-home-end',
|
|
100
100
|
group: 'keys',
|
|
101
|
-
zh: 'Home/End
|
|
102
|
-
en: 'Home/End
|
|
101
|
+
zh: 'Home/End 到行首/行尾,Ctrl+E 到行尾',
|
|
102
|
+
en: 'Home/End jump to line start/end; Ctrl+E to line end',
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
id: 'keys-ctrl-a',
|
|
106
|
+
group: 'keys',
|
|
107
|
+
zh: 'Ctrl+A 子代理面板:Enter 看详情 · X 中断 · Esc 关',
|
|
108
|
+
en: 'Ctrl+A opens the subagent dashboard; Enter details, X interrupt, Esc close',
|
|
103
109
|
},
|
|
104
110
|
{
|
|
105
111
|
id: 'keys-edit-keys',
|
|
@@ -364,8 +370,8 @@ export const TIPS = [
|
|
|
364
370
|
{
|
|
365
371
|
id: 'flow-at',
|
|
366
372
|
group: 'workflow',
|
|
367
|
-
zh: '
|
|
368
|
-
en: '@ completes files
|
|
373
|
+
zh: '@ 补全支持模糊匹配;@src/ 直达该目录',
|
|
374
|
+
en: '@ completes files with fuzzy matching; @dir/ lists that directory',
|
|
369
375
|
},
|
|
370
376
|
{
|
|
371
377
|
id: 'flow-question-type',
|
|
@@ -470,6 +476,12 @@ export const TIPS = [
|
|
|
470
476
|
zh: '全屏模式鼠标拖选即复制;Esc 取消选区',
|
|
471
477
|
en: 'Drag-select copies instantly in fullscreen; Esc cancels',
|
|
472
478
|
},
|
|
479
|
+
{
|
|
480
|
+
id: 'disp-wheel-sel',
|
|
481
|
+
group: 'display',
|
|
482
|
+
zh: '有文本选区时,滚轮平移选区而非滚动列表',
|
|
483
|
+
en: 'With a text selection, the wheel translates the selection, not the list',
|
|
484
|
+
},
|
|
473
485
|
{
|
|
474
486
|
id: 'disp-whale',
|
|
475
487
|
group: 'display',
|
|
@@ -519,6 +531,12 @@ export const TIPS = [
|
|
|
519
531
|
zh: '提示版本错位时,按提示 npm install -g 对齐启动器',
|
|
520
532
|
en: 'On version skew, follow the npm install -g hint to align the launcher',
|
|
521
533
|
},
|
|
534
|
+
{
|
|
535
|
+
id: 'pit-drift',
|
|
536
|
+
group: 'pitfalls',
|
|
537
|
+
zh: 'logo ⚠ 提示 dsh 版本不符时,按提示 npm i -g @deepseek-ai/dsh 对齐',
|
|
538
|
+
en: 'When the logo warns about dsh versions, follow the npm i -g @deepseek-ai/dsh hint',
|
|
539
|
+
},
|
|
522
540
|
{
|
|
523
541
|
id: 'pit-mac',
|
|
524
542
|
group: 'pitfalls',
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export type FileCandidateKind = 'file' | 'directory';
|
|
2
|
+
export interface FileCandidate {
|
|
3
|
+
id: string;
|
|
4
|
+
path: string;
|
|
5
|
+
displayPath: string;
|
|
6
|
+
name: string;
|
|
7
|
+
kind: FileCandidateKind;
|
|
8
|
+
score: number;
|
|
9
|
+
}
|
|
10
|
+
export interface FileSuggestionOptions {
|
|
11
|
+
topK?: number;
|
|
12
|
+
maxFiles?: number;
|
|
13
|
+
maxDirectories?: number;
|
|
14
|
+
}
|
|
15
|
+
export declare function isPathLikeQuery(query: string): boolean;
|
|
16
|
+
export declare function fuzzySubsequenceScore(query: string, candidate: string): number | undefined;
|
|
17
|
+
export declare function rankFileCandidates(candidates: readonly FileCandidate[], query: string, topK?: number): FileCandidate[];
|
|
18
|
+
export declare function preserveSelection(previous: FileCandidate | undefined, next: readonly FileCandidate[], fallback?: number): number;
|
|
19
|
+
//# sourceMappingURL=fileSuggestions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fileSuggestions.d.ts","sourceRoot":"","sources":["../../../src/utils/fileSuggestions.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,WAAW,CAAA;AAEpD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,iBAAiB,CAAA;IACvB,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAID,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAiB1F;AAED,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,SAAS,aAAa,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,SAAK,GAAG,aAAa,EAAE,CAMlH;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,aAAa,GAAG,SAAS,EAAE,IAAI,EAAE,SAAS,aAAa,EAAE,EAAE,QAAQ,SAAI,GAAG,MAAM,CAM3H"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
const pathSeparators = /[\\/]/;
|
|
2
|
+
export function isPathLikeQuery(query) {
|
|
3
|
+
return query.startsWith('.') || query.startsWith('~') || query.startsWith('/') || /^[A-Za-z]:[\\/]/.test(query) || pathSeparators.test(query);
|
|
4
|
+
}
|
|
5
|
+
export function fuzzySubsequenceScore(query, candidate) {
|
|
6
|
+
const needle = query.toLocaleLowerCase();
|
|
7
|
+
const haystack = candidate.toLocaleLowerCase();
|
|
8
|
+
if (!needle)
|
|
9
|
+
return 0;
|
|
10
|
+
let cursor = 0;
|
|
11
|
+
let first = -1;
|
|
12
|
+
let gaps = 0;
|
|
13
|
+
for (const char of needle) {
|
|
14
|
+
const found = haystack.indexOf(char, cursor);
|
|
15
|
+
if (found === -1)
|
|
16
|
+
return undefined;
|
|
17
|
+
if (first === -1)
|
|
18
|
+
first = found;
|
|
19
|
+
gaps += found - cursor;
|
|
20
|
+
cursor = found + 1;
|
|
21
|
+
}
|
|
22
|
+
const prefixBonus = first === 0 ? 20 : 0;
|
|
23
|
+
const boundaryBonus = first > 0 && /[\\/_. -]/.test(haystack[first - 1] ?? '') ? 8 : 0;
|
|
24
|
+
return needle.length * 10 + prefixBonus + boundaryBonus - gaps - haystack.length / 100;
|
|
25
|
+
}
|
|
26
|
+
export function rankFileCandidates(candidates, query, topK = 50) {
|
|
27
|
+
const ranked = candidates
|
|
28
|
+
.map(candidate => ({ ...candidate, score: fuzzySubsequenceScore(query, `${candidate.path} ${candidate.name}`) ?? -Infinity }))
|
|
29
|
+
.filter(candidate => Number.isFinite(candidate.score))
|
|
30
|
+
.sort((a, b) => b.score - a.score || a.kind.localeCompare(b.kind) || a.path.localeCompare(b.path));
|
|
31
|
+
return ranked.slice(0, Math.max(0, topK));
|
|
32
|
+
}
|
|
33
|
+
export function preserveSelection(previous, next, fallback = 0) {
|
|
34
|
+
if (previous) {
|
|
35
|
+
const index = next.findIndex(candidate => candidate.id === previous.id);
|
|
36
|
+
if (index >= 0)
|
|
37
|
+
return index;
|
|
38
|
+
}
|
|
39
|
+
return next.length === 0 ? 0 : Math.min(Math.max(0, fallback), next.length - 1);
|
|
40
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mentions.d.ts","sourceRoot":"","sources":["../../../src/utils/mentions.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,WAAW,YAAY;IAC3B,iDAAiD;IACjD,KAAK,EAAE,MAAM,CAAA;IACb,gEAAgE;IAChE,GAAG,EAAE,MAAM,CAAA;IACX,+DAA+D;IAC/D,IAAI,EAAE,MAAM,CAAA;CACb;
|
|
1
|
+
{"version":3,"file":"mentions.d.ts","sourceRoot":"","sources":["../../../src/utils/mentions.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,WAAW,YAAY;IAC3B,iDAAiD;IACjD,KAAK,EAAE,MAAM,CAAA;IACb,gEAAgE;IAChE,GAAG,EAAE,MAAM,CAAA;IACX,+DAA+D;IAC/D,IAAI,EAAE,MAAM,CAAA;CACb;AAQD,8EAA8E;AAC9E,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,EAAE,CA8B5D;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAe3D"}
|
|
@@ -6,7 +6,9 @@
|
|
|
6
6
|
* either a run of non-whitespace characters (`@src/a.ts`) or a double-quoted
|
|
7
7
|
* path (`@"my dir/a.ts"`, for paths containing spaces).
|
|
8
8
|
*/
|
|
9
|
-
/** True when `ch` delimits a token (whitespace).
|
|
9
|
+
/** True when `ch` delimits a token (whitespace). Path separators and the
|
|
10
|
+
* quote char are ordinary token characters on every platform — Windows
|
|
11
|
+
* backslash paths must survive both caret tracking and submission. */
|
|
10
12
|
const isBoundary = (ch) => ch === undefined || /\s/.test(ch);
|
|
11
13
|
/** Extract every `@` mention in `text` (typed order, duplicates kept out). */
|
|
12
14
|
export function extractMentions(text) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@deepseek-harness-tui/dsh-tui",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.8",
|
|
4
4
|
"description": "Claude Code style interactive TUI front door for DeepSeek Harness agents, built on the ported Ink core.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -93,7 +93,7 @@
|
|
|
93
93
|
"prompt:debug": "node scripts/read-prompt-debug.mjs",
|
|
94
94
|
"tui": "node --import tsx/esm scripts/run.ts",
|
|
95
95
|
"smoke": "node --import tsx/esm scripts/smoke.tsx",
|
|
96
|
-
"verify:build": "npm run verify:boundary && npm run verify:contract && npm run verify:herdr && npm run verify:manifest-deps && npm run verify:patch-surface && npm run verify:web-coexistence && npm run verify:plugin-spec && npm run verify:plugin-grants && npm run verify:plugin-storage && npm run verify:plugin-messages && npm run verify:plugin-ledger && npm run verify:plugin-commands && npm run verify:plugin-negotiation && npm run verify:plugin-lifecycle && npm run verify:packaged-presets && npm run verify:minimal-preset-tools && npm run verify:liangshen-bootstrap",
|
|
96
|
+
"verify:build": "npm run verify:boundary && npm run verify:contract && npm run verify:herdr && npm run verify:manifest-deps && npm run verify:patch-surface && npm run verify:web-coexistence && npm run verify:plugin-spec && npm run verify:plugin-grants && npm run verify:plugin-storage && npm run verify:plugin-messages && npm run verify:plugin-ledger && npm run verify:plugin-commands && npm run verify:plugin-negotiation && npm run verify:plugin-lifecycle && npm run verify:packaged-presets && npm run verify:minimal-preset-tools && npm run verify:liangshen-bootstrap && npm run verify:wheel-selection",
|
|
97
97
|
"verify:boundary": "node --import tsx/esm scripts/verify-adapter-boundary.ts",
|
|
98
98
|
"verify:contract": "node --import tsx/esm scripts/verify-upstream-contract.ts",
|
|
99
99
|
"verify:herdr": "node --import tsx/esm scripts/verify-herdr-integration.ts",
|
|
@@ -118,35 +118,36 @@
|
|
|
118
118
|
"verify:plugin-lifecycle": "node --import tsx/esm scripts/verify-plugin-lifecycle.ts",
|
|
119
119
|
"verify:tips": "node --import tsx/esm scripts/verify-tips.tsx",
|
|
120
120
|
"verify:thinking-preview": "node --import tsx/esm scripts/verify-thinking-preview.tsx",
|
|
121
|
+
"verify:wheel-selection": "node --import tsx/esm scripts/verify-wheel-selection.ts",
|
|
121
122
|
"sync:profile": "node scripts/sync-profile.mjs",
|
|
122
123
|
"sync:profile:check": "node scripts/sync-profile.mjs --check"
|
|
123
124
|
},
|
|
124
125
|
"peerDependencies": {
|
|
125
126
|
"@deepseek-ai/cordis": "^4.0.1",
|
|
126
|
-
"@deepseek-ai/dsh-agent": "^0.1.0-rc.6",
|
|
127
|
-
"@deepseek-ai/dsh-agent-instructions": "^0.1.0-rc.6",
|
|
128
|
-
"@deepseek-ai/dsh-agent-presets": "^0.1.0-rc.6",
|
|
129
|
-
"@deepseek-ai/dsh-atomic-write": "^0.1.0-rc.6",
|
|
130
|
-
"@deepseek-ai/dsh-commands": "^0.1.0-rc.6",
|
|
131
|
-
"@deepseek-ai/dsh-cordis-host-runner": "^0.1.0-rc.6",
|
|
132
|
-
"@deepseek-ai/dsh-invariants": "^0.1.0-rc.6",
|
|
133
|
-
"@deepseek-ai/dsh-llm": "^0.1.0-rc.6",
|
|
134
|
-
"@deepseek-ai/dsh-persona": "^0.1.0-rc.6",
|
|
135
|
-
"@deepseek-ai/dsh-session": "^0.1.0-rc.6",
|
|
136
|
-
"@deepseek-ai/dsh-settings": "^0.1.0-rc.6",
|
|
137
|
-
"@deepseek-ai/dsh-skill": "^0.1.0-rc.6",
|
|
138
|
-
"@deepseek-ai/dsh-storage": "^0.1.0-rc.6",
|
|
139
|
-
"@deepseek-ai/dsh-storage-domain": "^0.1.0-rc.6",
|
|
140
|
-
"@deepseek-ai/dsh-storage-json": "^0.1.0-rc.6",
|
|
141
|
-
"@deepseek-ai/dsh-system-prompt": "^0.1.0-rc.6",
|
|
142
|
-
"@deepseek-ai/dsh-terminal": "^0.1.0-rc.6",
|
|
143
|
-
"@deepseek-ai/dsh-terminal-bash": "^0.1.0-rc.6",
|
|
144
|
-
"@deepseek-ai/dsh-tool-ask-user": "^0.1.0-rc.6",
|
|
145
|
-
"@deepseek-ai/dsh-tool-bash-persistent": "^0.1.0-rc.6",
|
|
146
|
-
"@deepseek-ai/dsh-tool-cordis": "^0.1.0-rc.6",
|
|
147
|
-
"@deepseek-ai/dsh-user-approval": "^0.1.0-rc.6",
|
|
148
|
-
"@deepseek-ai/dsh-user-questions": "^0.1.0-rc.6",
|
|
149
|
-
"@deepseek-ai/dsh-workspace": "^0.1.0-rc.6",
|
|
127
|
+
"@deepseek-ai/dsh-agent": "^0.1.0-rc.6 || ^0.1.1-rc.1",
|
|
128
|
+
"@deepseek-ai/dsh-agent-instructions": "^0.1.0-rc.6 || ^0.1.1-rc.1",
|
|
129
|
+
"@deepseek-ai/dsh-agent-presets": "^0.1.0-rc.6 || ^0.1.1-rc.1",
|
|
130
|
+
"@deepseek-ai/dsh-atomic-write": "^0.1.0-rc.6 || ^0.1.1-rc.1",
|
|
131
|
+
"@deepseek-ai/dsh-commands": "^0.1.0-rc.6 || ^0.1.1-rc.1",
|
|
132
|
+
"@deepseek-ai/dsh-cordis-host-runner": "^0.1.0-rc.6 || ^0.1.1-rc.1",
|
|
133
|
+
"@deepseek-ai/dsh-invariants": "^0.1.0-rc.6 || ^0.1.1-rc.1",
|
|
134
|
+
"@deepseek-ai/dsh-llm": "^0.1.0-rc.6 || ^0.1.1-rc.1",
|
|
135
|
+
"@deepseek-ai/dsh-persona": "^0.1.0-rc.6 || ^0.1.1-rc.1",
|
|
136
|
+
"@deepseek-ai/dsh-session": "^0.1.0-rc.6 || ^0.1.1-rc.1",
|
|
137
|
+
"@deepseek-ai/dsh-settings": "^0.1.0-rc.6 || ^0.1.1-rc.1",
|
|
138
|
+
"@deepseek-ai/dsh-skill": "^0.1.0-rc.6 || ^0.1.1-rc.1",
|
|
139
|
+
"@deepseek-ai/dsh-storage": "^0.1.0-rc.6 || ^0.1.1-rc.1",
|
|
140
|
+
"@deepseek-ai/dsh-storage-domain": "^0.1.0-rc.6 || ^0.1.1-rc.1",
|
|
141
|
+
"@deepseek-ai/dsh-storage-json": "^0.1.0-rc.6 || ^0.1.1-rc.1",
|
|
142
|
+
"@deepseek-ai/dsh-system-prompt": "^0.1.0-rc.6 || ^0.1.1-rc.1",
|
|
143
|
+
"@deepseek-ai/dsh-terminal": "^0.1.0-rc.6 || ^0.1.1-rc.1",
|
|
144
|
+
"@deepseek-ai/dsh-terminal-bash": "^0.1.0-rc.6 || ^0.1.1-rc.1",
|
|
145
|
+
"@deepseek-ai/dsh-tool-ask-user": "^0.1.0-rc.6 || ^0.1.1-rc.1",
|
|
146
|
+
"@deepseek-ai/dsh-tool-bash-persistent": "^0.1.0-rc.6 || ^0.1.1-rc.1",
|
|
147
|
+
"@deepseek-ai/dsh-tool-cordis": "^0.1.0-rc.6 || ^0.1.1-rc.1",
|
|
148
|
+
"@deepseek-ai/dsh-user-approval": "^0.1.0-rc.6 || ^0.1.1-rc.1",
|
|
149
|
+
"@deepseek-ai/dsh-user-questions": "^0.1.0-rc.6 || ^0.1.1-rc.1",
|
|
150
|
+
"@deepseek-ai/dsh-workspace": "^0.1.0-rc.6 || ^0.1.1-rc.1",
|
|
150
151
|
"@deepseek-ai/schemastery": "^3.18.1"
|
|
151
152
|
},
|
|
152
153
|
"dependencies": {
|
|
@@ -190,46 +191,46 @@
|
|
|
190
191
|
"@deepseek-ai/cordis": "^4.0.1",
|
|
191
192
|
"@deepseek-ai/cordis-plugin-include": "^1.0.6",
|
|
192
193
|
"@deepseek-ai/cordis-plugin-loader": "^1.0.2",
|
|
193
|
-
"@deepseek-ai/dsh-agent": "^0.1.0-rc.6",
|
|
194
|
-
"@deepseek-ai/dsh-agent-instructions": "^0.1.0-rc.6",
|
|
195
|
-
"@deepseek-ai/dsh-agent-presets": "^0.1.0-rc.6",
|
|
196
|
-
"@deepseek-ai/dsh-atomic-write": "^0.1.0-rc.6",
|
|
197
|
-
"@deepseek-ai/dsh-attachment": "^0.1.0-rc.6",
|
|
198
|
-
"@deepseek-ai/dsh-brand": "^0.1.0-rc.6",
|
|
199
|
-
"@deepseek-ai/dsh-code-runtime": "^0.1.0-rc.6",
|
|
200
|
-
"@deepseek-ai/dsh-commands": "^0.1.0-rc.6",
|
|
201
|
-
"@deepseek-ai/dsh-cordis-host-runner": "^0.1.0-rc.6",
|
|
202
|
-
"@deepseek-ai/dsh-fs": "^0.1.0-rc.6",
|
|
203
|
-
"@deepseek-ai/dsh-home-paths": "^0.1.0-rc.6",
|
|
204
|
-
"@deepseek-ai/dsh-invariants": "^0.1.0-rc.6",
|
|
205
|
-
"@deepseek-ai/dsh-llm": "^0.1.0-rc.6",
|
|
206
|
-
"@deepseek-ai/dsh-persona": "^0.1.0-rc.6",
|
|
207
|
-
"@deepseek-ai/dsh-sandbox": "^0.1.0-rc.6",
|
|
208
|
-
"@deepseek-ai/dsh-sandbox-policy": "^0.1.0-rc.6",
|
|
209
|
-
"@deepseek-ai/dsh-scope": "^0.1.0-rc.6",
|
|
210
|
-
"@deepseek-ai/dsh-session": "^0.1.0-rc.6",
|
|
211
|
-
"@deepseek-ai/dsh-session-persistence": "^0.1.0-rc.6",
|
|
212
|
-
"@deepseek-ai/dsh-session-persistence-jsonl": "^0.1.0-rc.6",
|
|
213
|
-
"@deepseek-ai/dsh-session-persistence-sqlite": "^0.1.0-rc.6",
|
|
214
|
-
"@deepseek-ai/dsh-settings": "^0.1.0-rc.6",
|
|
215
|
-
"@deepseek-ai/dsh-skill": "^0.1.0-rc.6",
|
|
216
|
-
"@deepseek-ai/dsh-storage": "^0.1.0-rc.6",
|
|
217
|
-
"@deepseek-ai/dsh-storage-domain": "^0.1.0-rc.6",
|
|
218
|
-
"@deepseek-ai/dsh-storage-json": "^0.1.0-rc.6",
|
|
219
|
-
"@deepseek-ai/dsh-subprocess": "^0.1.0-rc.6",
|
|
220
|
-
"@deepseek-ai/dsh-system-prompt": "^0.1.0-rc.6",
|
|
221
|
-
"@deepseek-ai/dsh-terminal": "^0.1.0-rc.6",
|
|
222
|
-
"@deepseek-ai/dsh-terminal-bash": "^0.1.0-rc.6",
|
|
223
|
-
"@deepseek-ai/dsh-timeout": "^0.1.0-rc.6",
|
|
224
|
-
"@deepseek-ai/dsh-tool-ask-user": "^0.1.0-rc.6",
|
|
225
|
-
"@deepseek-ai/dsh-tool-bash-persistent": "^0.1.0-rc.6",
|
|
226
|
-
"@deepseek-ai/dsh-tool-cordis": "^0.1.0-rc.6",
|
|
227
|
-
"@deepseek-ai/dsh-tools": "^0.1.0-rc.6",
|
|
228
|
-
"@deepseek-ai/dsh-typert-protocol": "^0.1.0-rc.6",
|
|
229
|
-
"@deepseek-ai/dsh-user-approval": "^0.1.0-rc.6",
|
|
230
|
-
"@deepseek-ai/dsh-user-questions": "^0.1.0-rc.6",
|
|
231
|
-
"@deepseek-ai/dsh-web-app": "0.1.
|
|
232
|
-
"@deepseek-ai/dsh-workspace": "^0.1.0-rc.6",
|
|
194
|
+
"@deepseek-ai/dsh-agent": "^0.1.0-rc.6 || ^0.1.1-rc.1",
|
|
195
|
+
"@deepseek-ai/dsh-agent-instructions": "^0.1.0-rc.6 || ^0.1.1-rc.1",
|
|
196
|
+
"@deepseek-ai/dsh-agent-presets": "^0.1.0-rc.6 || ^0.1.1-rc.1",
|
|
197
|
+
"@deepseek-ai/dsh-atomic-write": "^0.1.0-rc.6 || ^0.1.1-rc.1",
|
|
198
|
+
"@deepseek-ai/dsh-attachment": "^0.1.0-rc.6 || ^0.1.1-rc.1",
|
|
199
|
+
"@deepseek-ai/dsh-brand": "^0.1.0-rc.6 || ^0.1.1-rc.1",
|
|
200
|
+
"@deepseek-ai/dsh-code-runtime": "^0.1.0-rc.6 || ^0.1.1-rc.1",
|
|
201
|
+
"@deepseek-ai/dsh-commands": "^0.1.0-rc.6 || ^0.1.1-rc.1",
|
|
202
|
+
"@deepseek-ai/dsh-cordis-host-runner": "^0.1.0-rc.6 || ^0.1.1-rc.1",
|
|
203
|
+
"@deepseek-ai/dsh-fs": "^0.1.0-rc.6 || ^0.1.1-rc.1",
|
|
204
|
+
"@deepseek-ai/dsh-home-paths": "^0.1.0-rc.6 || ^0.1.1-rc.1",
|
|
205
|
+
"@deepseek-ai/dsh-invariants": "^0.1.0-rc.6 || ^0.1.1-rc.1",
|
|
206
|
+
"@deepseek-ai/dsh-llm": "^0.1.0-rc.6 || ^0.1.1-rc.1",
|
|
207
|
+
"@deepseek-ai/dsh-persona": "^0.1.0-rc.6 || ^0.1.1-rc.1",
|
|
208
|
+
"@deepseek-ai/dsh-sandbox": "^0.1.0-rc.6 || ^0.1.1-rc.1",
|
|
209
|
+
"@deepseek-ai/dsh-sandbox-policy": "^0.1.0-rc.6 || ^0.1.1-rc.1",
|
|
210
|
+
"@deepseek-ai/dsh-scope": "^0.1.0-rc.6 || ^0.1.1-rc.1",
|
|
211
|
+
"@deepseek-ai/dsh-session": "^0.1.0-rc.6 || ^0.1.1-rc.1",
|
|
212
|
+
"@deepseek-ai/dsh-session-persistence": "^0.1.0-rc.6 || ^0.1.1-rc.1",
|
|
213
|
+
"@deepseek-ai/dsh-session-persistence-jsonl": "^0.1.0-rc.6 || ^0.1.1-rc.1",
|
|
214
|
+
"@deepseek-ai/dsh-session-persistence-sqlite": "^0.1.0-rc.6 || ^0.1.1-rc.1",
|
|
215
|
+
"@deepseek-ai/dsh-settings": "^0.1.0-rc.6 || ^0.1.1-rc.1",
|
|
216
|
+
"@deepseek-ai/dsh-skill": "^0.1.0-rc.6 || ^0.1.1-rc.1",
|
|
217
|
+
"@deepseek-ai/dsh-storage": "^0.1.0-rc.6 || ^0.1.1-rc.1",
|
|
218
|
+
"@deepseek-ai/dsh-storage-domain": "^0.1.0-rc.6 || ^0.1.1-rc.1",
|
|
219
|
+
"@deepseek-ai/dsh-storage-json": "^0.1.0-rc.6 || ^0.1.1-rc.1",
|
|
220
|
+
"@deepseek-ai/dsh-subprocess": "^0.1.0-rc.6 || ^0.1.1-rc.1",
|
|
221
|
+
"@deepseek-ai/dsh-system-prompt": "^0.1.0-rc.6 || ^0.1.1-rc.1",
|
|
222
|
+
"@deepseek-ai/dsh-terminal": "^0.1.0-rc.6 || ^0.1.1-rc.1",
|
|
223
|
+
"@deepseek-ai/dsh-terminal-bash": "^0.1.0-rc.6 || ^0.1.1-rc.1",
|
|
224
|
+
"@deepseek-ai/dsh-timeout": "^0.1.0-rc.6 || ^0.1.1-rc.1",
|
|
225
|
+
"@deepseek-ai/dsh-tool-ask-user": "^0.1.0-rc.6 || ^0.1.1-rc.1",
|
|
226
|
+
"@deepseek-ai/dsh-tool-bash-persistent": "^0.1.0-rc.6 || ^0.1.1-rc.1",
|
|
227
|
+
"@deepseek-ai/dsh-tool-cordis": "^0.1.0-rc.6 || ^0.1.1-rc.1",
|
|
228
|
+
"@deepseek-ai/dsh-tools": "^0.1.0-rc.6 || ^0.1.1-rc.1",
|
|
229
|
+
"@deepseek-ai/dsh-typert-protocol": "^0.1.0-rc.6 || ^0.1.1-rc.1",
|
|
230
|
+
"@deepseek-ai/dsh-user-approval": "^0.1.0-rc.6 || ^0.1.1-rc.1",
|
|
231
|
+
"@deepseek-ai/dsh-user-questions": "^0.1.0-rc.6 || ^0.1.1-rc.1",
|
|
232
|
+
"@deepseek-ai/dsh-web-app": "0.1.1-rc.2",
|
|
233
|
+
"@deepseek-ai/dsh-workspace": "^0.1.0-rc.6 || ^0.1.1-rc.1",
|
|
233
234
|
"@deepseek-ai/schemastery": "^3.18.1",
|
|
234
235
|
"@types/lodash-es": "^4.17.0",
|
|
235
236
|
"@types/node": "^22.0.0",
|