@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.
Files changed (37) hide show
  1. package/README.md +2 -2
  2. package/bin/dsh-tui.js +1 -1
  3. package/lib/types/components/FileSuggestions.d.ts +8 -4
  4. package/lib/types/components/FileSuggestions.d.ts.map +1 -1
  5. package/lib/types/components/FileSuggestions.js +22 -12
  6. package/lib/types/components/LogoV2.d.ts +5 -1
  7. package/lib/types/components/LogoV2.d.ts.map +1 -1
  8. package/lib/types/components/LogoV2.js +12 -3
  9. package/lib/types/components/PromptInput.d.ts.map +1 -1
  10. package/lib/types/components/PromptInput.js +25 -21
  11. package/lib/types/dsh-adapter/channel.d.ts +11 -1
  12. package/lib/types/dsh-adapter/channel.d.ts.map +1 -1
  13. package/lib/types/dsh-adapter/channel.js +100 -37
  14. package/lib/types/dsh-adapter/contract.d.ts +58 -18
  15. package/lib/types/dsh-adapter/contract.d.ts.map +1 -1
  16. package/lib/types/dsh-adapter/contract.js +124 -36
  17. package/lib/types/dsh-adapter/index.d.ts.map +1 -1
  18. package/lib/types/dsh-adapter/index.js +6 -12
  19. package/lib/types/i18n.d.ts +18 -1
  20. package/lib/types/i18n.d.ts.map +1 -1
  21. package/lib/types/i18n.js +22 -2
  22. package/lib/types/ink/ink.d.ts.map +1 -1
  23. package/lib/types/ink/ink.js +38 -23
  24. package/lib/types/ink/render-node-to-output.d.ts +6 -3
  25. package/lib/types/ink/render-node-to-output.d.ts.map +1 -1
  26. package/lib/types/ink/render-node-to-output.js +33 -7
  27. package/lib/types/ink/selection.d.ts +29 -4
  28. package/lib/types/ink/selection.d.ts.map +1 -1
  29. package/lib/types/ink/selection.js +41 -5
  30. package/lib/types/tips.d.ts.map +1 -1
  31. package/lib/types/tips.js +22 -4
  32. package/lib/types/utils/fileSuggestions.d.ts +19 -0
  33. package/lib/types/utils/fileSuggestions.d.ts.map +1 -0
  34. package/lib/types/utils/fileSuggestions.js +40 -0
  35. package/lib/types/utils/mentions.d.ts.map +1 -1
  36. package/lib/types/utils/mentions.js +3 -1
  37. 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 followScroll = null;
74
+ let followScrolls = [];
75
75
  /**
76
- * Read and clear the follow-scroll event recorded this frame.
77
- * @returns the follow-scroll delta and viewport bounds, or null.
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 = followScroll;
81
- followScroll = null;
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
- followScroll = {
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 (unclamped), the selected
217
- * text has scrolled entirely off the top. Clear it — otherwise a single
218
- * inverted cell lingers at the viewport top as a ghost (native terminals
219
- * drop the selection when it leaves scrollback). Landing AT minRow is
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 (unclamped), the selected
583
- * text has scrolled entirely off the top. Clear it — otherwise a single
584
- * inverted cell lingers at the viewport top as a ghost (native terminals
585
- * drop the selection when it leaves scrollback). Landing AT minRow is
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
- if (rawAnchor < minRow && rawFocus !== undefined && rawFocus < minRow) {
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.
@@ -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,EAsiB9B,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"}
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 与 Ctrl+A 快速到行首/行尾',
102
- en: 'Home/End and Ctrl+A jump to line start/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: '任意位置 @ 补全文件,@ink 也能命中 src/ink',
368
- en: '@ completes files anywhere; @ink matches src/ink',
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;AAMD,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"}
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.7",
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.0-rc.8",
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",