@deepseek-harness-tui/dsh-tui 0.10.1 → 0.10.2
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 +5 -146
- package/lib/types/adapter/ports/channel-session.d.ts +3 -1
- package/lib/types/adapter/ports/channel-session.d.ts.map +1 -1
- package/lib/types/components/Chat/JobCard.d.ts.map +1 -1
- package/lib/types/components/Chat/JobCard.js +8 -1
- package/lib/types/components/Markdown.d.ts +2 -2
- package/lib/types/components/Markdown.d.ts.map +1 -1
- package/lib/types/components/Markdown.js +28 -3
- package/lib/types/components/MessageList.d.ts.map +1 -1
- package/lib/types/components/MessageList.js +10 -9
- package/lib/types/components/StreamingMarkdown.d.ts.map +1 -1
- package/lib/types/components/StreamingMarkdown.js +61 -9
- package/lib/types/dsh-adapter/channel/binding-events.d.ts +5 -0
- package/lib/types/dsh-adapter/channel/binding-events.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/binding-events.js +12 -2
- package/lib/types/dsh-adapter/channel/input-delivery.d.ts +5 -2
- package/lib/types/dsh-adapter/channel/input-delivery.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/input-delivery.js +71 -7
- package/lib/types/dsh-adapter/channel/permissions.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/permissions.js +10 -7
- package/lib/types/dsh-adapter/channel/session-rewind.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/session-rewind.js +9 -2
- package/lib/types/dsh-adapter/channel/session-tree-actions.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/session-tree-actions.js +9 -3
- package/lib/types/dsh-adapter/channel/skill-catalog.d.ts +8 -2
- package/lib/types/dsh-adapter/channel/skill-catalog.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/skill-catalog.js +49 -17
- package/lib/types/dsh-adapter/channel.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel.js +5 -2
- package/lib/types/dsh-adapter/compat/liveSession.d.ts +5 -3
- package/lib/types/dsh-adapter/compat/liveSession.d.ts.map +1 -1
- package/lib/types/dsh-adapter/compat/liveSession.js +5 -3
- package/lib/types/dsh-adapter/sessions/digest.d.ts.map +1 -1
- package/lib/types/dsh-adapter/sessions/digest.js +40 -19
- package/lib/types/dsh-adapter/sessions/frames.js +2 -0
- package/lib/types/dsh-adapter/sessions/list.js +3 -3
- package/lib/types/dsh-adapter/sessions/store.d.ts +2 -2
- package/lib/types/dsh-adapter/sessions/store.d.ts.map +1 -1
- package/lib/types/dsh-adapter/sessions/store.js +12 -11
- package/lib/types/dsh-adapter/sessions/types.d.ts +2 -0
- package/lib/types/dsh-adapter/sessions/types.d.ts.map +1 -1
- package/lib/types/ink/components/ScrollBox.d.ts.map +1 -1
- package/lib/types/ink/components/ScrollBox.js +30 -33
- package/lib/types/ink/dom.d.ts.map +1 -1
- package/lib/types/ink/dom.js +32 -64
- package/lib/types/ink/get-max-width.d.ts +7 -15
- package/lib/types/ink/get-max-width.d.ts.map +1 -1
- package/lib/types/ink/get-max-width.js +7 -20
- package/lib/types/ink/ink.d.ts +1 -0
- package/lib/types/ink/ink.d.ts.map +1 -1
- package/lib/types/ink/ink.js +22 -3
- package/lib/types/ink/layout/node.d.ts +2 -0
- package/lib/types/ink/layout/node.d.ts.map +1 -1
- package/lib/types/ink/layout/yoga.d.ts +1 -0
- package/lib/types/ink/layout/yoga.d.ts.map +1 -1
- package/lib/types/ink/layout/yoga.js +3 -0
- package/lib/types/ink/node-cache.d.ts +11 -0
- package/lib/types/ink/node-cache.d.ts.map +1 -1
- package/lib/types/ink/node-cache.js +3 -0
- package/lib/types/ink/output.d.ts +6 -1
- package/lib/types/ink/output.d.ts.map +1 -1
- package/lib/types/ink/output.js +55 -65
- package/lib/types/ink/render-node-to-output.d.ts.map +1 -1
- package/lib/types/ink/render-node-to-output.js +92 -67
- package/lib/types/ink/tabstops.d.ts +3 -2
- package/lib/types/ink/tabstops.d.ts.map +1 -1
- package/lib/types/ink/tabstops.js +5 -4
- package/lib/types/ink/wrap-text.js +2 -2
- package/lib/types/native-ts/yoga-layout/index.d.ts +8 -3
- package/lib/types/native-ts/yoga-layout/index.d.ts.map +1 -1
- package/lib/types/native-ts/yoga-layout/index.js +23 -8
- package/lib/types/screens/Chat.d.ts.map +1 -1
- package/lib/types/screens/Chat.js +20 -8
- package/package.json +3 -2
|
@@ -3,7 +3,7 @@ import { applyTextStyles } from './colorize.js';
|
|
|
3
3
|
import { GEOMETRY_TRACE_ENABLED, noteScrollGeometry } from './geometry-trace.js';
|
|
4
4
|
import getMaxWidth from './get-max-width.js';
|
|
5
5
|
import { LayoutDisplay, LayoutEdge } from './layout/node.js';
|
|
6
|
-
import { nodeCache, pendingClears } from './node-cache.js';
|
|
6
|
+
import { nodeCache, pendingClears, textPaintCache } from './node-cache.js';
|
|
7
7
|
import renderBorder from './render-border.js';
|
|
8
8
|
import { squashTextNodesToSegments, } from './squash-text-nodes.js';
|
|
9
9
|
import { isXtermJs } from './terminal.js';
|
|
@@ -679,6 +679,13 @@ function renderNodeToOutput(node, output, options) {
|
|
|
679
679
|
node.dirty = false;
|
|
680
680
|
return;
|
|
681
681
|
}
|
|
682
|
+
// Text is a paint leaf: unlike boxes, it cannot own an escaping overlay.
|
|
683
|
+
// Keep the old-position cleanup above, but cull before squash/wrap/style.
|
|
684
|
+
if (node.nodeName === 'ink-text' && width > 0 && height > 0 && !output.isRectVisible(x, y, width, height)) {
|
|
685
|
+
nodeCache.delete(node);
|
|
686
|
+
node.dirty = false;
|
|
687
|
+
return;
|
|
688
|
+
}
|
|
682
689
|
if (node.nodeName === 'ink-raw-ansi') {
|
|
683
690
|
// Pre-rendered ANSI content. The producer already wrapped to width and
|
|
684
691
|
// emitted terminal-ready escape codes. Skip squash, measure, wrap, and
|
|
@@ -689,70 +696,87 @@ function renderNodeToOutput(node, output, options) {
|
|
|
689
696
|
}
|
|
690
697
|
}
|
|
691
698
|
else if (node.nodeName === 'ink-text') {
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
//
|
|
696
|
-
const
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
//
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
699
|
+
// A partially visible long block moves on every scroll/stream frame.
|
|
700
|
+
// Node blits cannot reuse it at a new y, but its prepared lines can.
|
|
701
|
+
// Keep one current preparation, independent of the shared wrap LRU
|
|
702
|
+
// (a single large tool/code block can overflow that cache by itself).
|
|
703
|
+
const maxWidth = Math.min(getMaxWidth(yogaNode), output.width - x);
|
|
704
|
+
const paddingNode = node.childNodes[0]?.yogaNode;
|
|
705
|
+
const paddingLeft = paddingNode?.getComputedLeft() ?? 0;
|
|
706
|
+
const paddingTop = paddingNode?.getComputedTop() ?? 0;
|
|
707
|
+
const prepared = textPaintCache.get(node);
|
|
708
|
+
if (prepared !== undefined &&
|
|
709
|
+
prepared.maxWidth === maxWidth &&
|
|
710
|
+
prepared.background === inheritedBackgroundColor &&
|
|
711
|
+
prepared.paddingLeft === paddingLeft &&
|
|
712
|
+
prepared.paddingTop === paddingTop) {
|
|
713
|
+
output.write(x, y, prepared.text, prepared.softWrap, prepared.lines);
|
|
714
|
+
}
|
|
715
|
+
else {
|
|
716
|
+
const segments = squashTextNodesToSegments(node, inheritedBackgroundColor
|
|
717
|
+
? { backgroundColor: inheritedBackgroundColor }
|
|
718
|
+
: undefined);
|
|
719
|
+
// First, get plain text to check if wrapping is needed
|
|
720
|
+
const plainText = segments.map(s => s.text).join('');
|
|
721
|
+
if (plainText.length > 0) {
|
|
722
|
+
// Use the same content constraint as measurement, not the rounded
|
|
723
|
+
// pixel-grid box. Offscreen overflow still clips at the terminal edge.
|
|
724
|
+
const textWrap = node.style.textWrap ?? 'wrap';
|
|
725
|
+
// Check if wrapping is needed
|
|
726
|
+
const needsWrapping = widestLine(plainText) > maxWidth;
|
|
727
|
+
let text;
|
|
728
|
+
let softWrap;
|
|
729
|
+
if (needsWrapping && segments.length === 1) {
|
|
730
|
+
// Single segment: wrap plain text first, then apply styles to each line
|
|
731
|
+
const segment = segments[0];
|
|
732
|
+
const w = wrapWithSoftWrap(plainText, maxWidth, textWrap);
|
|
733
|
+
softWrap = w.softWrap;
|
|
734
|
+
text = w.wrapped
|
|
735
|
+
.split('\n')
|
|
736
|
+
.map(line => {
|
|
737
|
+
let styled = applyTextStyles(line, segment.styles);
|
|
738
|
+
// Apply OSC 8 hyperlink per-line so each line is independently
|
|
739
|
+
// clickable. output.ts splits on newlines and tokenizes each
|
|
740
|
+
// line separately, so a single wrapper around the whole block
|
|
741
|
+
// would only apply the hyperlink to the first line.
|
|
742
|
+
if (segment.hyperlink) {
|
|
743
|
+
styled = wrapWithOsc8Link(styled, segment.hyperlink);
|
|
744
|
+
}
|
|
745
|
+
return styled;
|
|
746
|
+
})
|
|
747
|
+
.join('\n');
|
|
748
|
+
}
|
|
749
|
+
else if (needsWrapping) {
|
|
750
|
+
// Multiple segments with wrapping: wrap plain text first, then re-apply
|
|
751
|
+
// each segment's styles based on character positions. This preserves
|
|
752
|
+
// per-segment styles even when text wraps across lines.
|
|
753
|
+
const w = wrapWithSoftWrap(plainText, maxWidth, textWrap);
|
|
754
|
+
softWrap = w.softWrap;
|
|
755
|
+
const charToSegment = buildCharToSegmentMap(segments);
|
|
756
|
+
text = applyStylesToWrappedText(w.wrapped, segments, charToSegment, plainText, textWrap === 'wrap-trim');
|
|
757
|
+
// Hyperlinks are handled per-run in applyStylesToWrappedText via
|
|
758
|
+
// wrapWithOsc8Link, similar to how styles are applied per-run.
|
|
759
|
+
}
|
|
760
|
+
else {
|
|
761
|
+
// No wrapping needed: apply styles directly
|
|
762
|
+
text = segments
|
|
763
|
+
.map(segment => {
|
|
764
|
+
let styledText = applyTextStyles(segment.text, segment.styles);
|
|
765
|
+
if (segment.hyperlink) {
|
|
766
|
+
styledText = wrapWithOsc8Link(styledText, segment.hyperlink);
|
|
767
|
+
}
|
|
768
|
+
return styledText;
|
|
769
|
+
})
|
|
770
|
+
.join('');
|
|
771
|
+
}
|
|
772
|
+
text = applyPaddingToText(node, text, softWrap);
|
|
773
|
+
const lines = text.split('\n');
|
|
774
|
+
textPaintCache.set(node, {
|
|
775
|
+
maxWidth, background: inheritedBackgroundColor, paddingLeft, paddingTop,
|
|
776
|
+
text, lines, softWrap,
|
|
777
|
+
});
|
|
778
|
+
output.write(x, y, text, softWrap, lines);
|
|
753
779
|
}
|
|
754
|
-
text = applyPaddingToText(node, text, softWrap);
|
|
755
|
-
output.write(x, y, text, softWrap);
|
|
756
780
|
}
|
|
757
781
|
}
|
|
758
782
|
else if (node.nodeName === 'ink-image' &&
|
|
@@ -1315,11 +1339,12 @@ function renderNodeToOutput(node, output, options) {
|
|
|
1315
1339
|
// blitted content — output.clear() only expands damage and
|
|
1316
1340
|
// cannot zero cells that the blit already wrote.
|
|
1317
1341
|
const screenBottom = Math.min(Math.floor(contentY + childBottom), Math.floor((y1 ?? y) + padTop + innerHeight));
|
|
1318
|
-
|
|
1319
|
-
|
|
1342
|
+
const fillTop = Math.max(screenY, top);
|
|
1343
|
+
if (fillTop < screenBottom) {
|
|
1344
|
+
const fill = Array(screenBottom - fillTop)
|
|
1320
1345
|
.fill(spaces)
|
|
1321
1346
|
.join('\n');
|
|
1322
|
-
output.write(Math.floor(x),
|
|
1347
|
+
output.write(Math.floor(x), fillTop, fill);
|
|
1323
1348
|
output.clip({
|
|
1324
1349
|
x1: undefined,
|
|
1325
1350
|
x2: undefined,
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Expand tab characters to spaces at fixed column intervals, preserving
|
|
3
|
-
* escape sequences and resetting the column on newlines.
|
|
3
|
+
* escape sequences and resetting to the starting column on newlines.
|
|
4
4
|
* @param text - the text to expand.
|
|
5
5
|
* @param interval - the tab stop interval in columns; defaults to 8.
|
|
6
|
+
* @param startColumn - the original screen column of each line; defaults to 0.
|
|
6
7
|
* @returns `text` with every tab replaced by the spaces needed to reach the next stop.
|
|
7
8
|
*/
|
|
8
|
-
export declare function expandTabs(text: string, interval?: number): string;
|
|
9
|
+
export declare function expandTabs(text: string, interval?: number, startColumn?: number): string;
|
|
9
10
|
//# sourceMappingURL=tabstops.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tabstops.d.ts","sourceRoot":"","sources":["../../../src/ink/tabstops.ts"],"names":[],"mappings":"AAQA
|
|
1
|
+
{"version":3,"file":"tabstops.d.ts","sourceRoot":"","sources":["../../../src/ink/tabstops.ts"],"names":[],"mappings":"AAQA;;;;;;;GAOG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,MAAM,EACZ,QAAQ,SAAuB,EAC/B,WAAW,SAAI,GACd,MAAM,CAkCR"}
|
|
@@ -5,12 +5,13 @@ import { createTokenizer } from './termio/tokenize.js';
|
|
|
5
5
|
const DEFAULT_TAB_INTERVAL = 8;
|
|
6
6
|
/**
|
|
7
7
|
* Expand tab characters to spaces at fixed column intervals, preserving
|
|
8
|
-
* escape sequences and resetting the column on newlines.
|
|
8
|
+
* escape sequences and resetting to the starting column on newlines.
|
|
9
9
|
* @param text - the text to expand.
|
|
10
10
|
* @param interval - the tab stop interval in columns; defaults to 8.
|
|
11
|
+
* @param startColumn - the original screen column of each line; defaults to 0.
|
|
11
12
|
* @returns `text` with every tab replaced by the spaces needed to reach the next stop.
|
|
12
13
|
*/
|
|
13
|
-
export function expandTabs(text, interval = DEFAULT_TAB_INTERVAL) {
|
|
14
|
+
export function expandTabs(text, interval = DEFAULT_TAB_INTERVAL, startColumn = 0) {
|
|
14
15
|
if (!text.includes('\t')) {
|
|
15
16
|
return text;
|
|
16
17
|
}
|
|
@@ -18,7 +19,7 @@ export function expandTabs(text, interval = DEFAULT_TAB_INTERVAL) {
|
|
|
18
19
|
const tokens = tokenizer.feed(text);
|
|
19
20
|
tokens.push(...tokenizer.flush());
|
|
20
21
|
let result = '';
|
|
21
|
-
let column =
|
|
22
|
+
let column = startColumn;
|
|
22
23
|
for (const token of tokens) {
|
|
23
24
|
if (token.type === 'sequence') {
|
|
24
25
|
result += token.value;
|
|
@@ -33,7 +34,7 @@ export function expandTabs(text, interval = DEFAULT_TAB_INTERVAL) {
|
|
|
33
34
|
}
|
|
34
35
|
else if (part === '\n') {
|
|
35
36
|
result += part;
|
|
36
|
-
column =
|
|
37
|
+
column = startColumn;
|
|
37
38
|
}
|
|
38
39
|
else {
|
|
39
40
|
result += part;
|
|
@@ -7,8 +7,8 @@ const ELLIPSIS = '…';
|
|
|
7
7
|
// output string. Yet before this cache every consumer re-wrapped from
|
|
8
8
|
// scratch:
|
|
9
9
|
//
|
|
10
|
-
// - dom.ts measureTextNode
|
|
11
|
-
//
|
|
10
|
+
// - dom.ts measureTextNode caches dimensions per node; virtualization
|
|
11
|
+
// unmounts scrolled-away rows, so scrolling back
|
|
12
12
|
// re-mounts the row's Text nodes and re-runs the FULL wrap (wrap-ansi
|
|
13
13
|
// tokenizes + string-width-measures every word — 100-300ms single-frame
|
|
14
14
|
// yoga spikes when a row of large settled text scrolls in, the dominant
|
|
@@ -52,6 +52,7 @@ type Layout = {
|
|
|
52
52
|
top: number;
|
|
53
53
|
width: number;
|
|
54
54
|
height: number;
|
|
55
|
+
measuredWidth: number;
|
|
55
56
|
border: [number, number, number, number];
|
|
56
57
|
padding: [number, number, number, number];
|
|
57
58
|
margin: [number, number, number, number];
|
|
@@ -205,6 +206,7 @@ export declare class Node {
|
|
|
205
206
|
_lOutW: number;
|
|
206
207
|
/** Cached layout-pass output height restored on a cache hit. */
|
|
207
208
|
_lOutH: number;
|
|
209
|
+
_lOutMeasuredWidth: number;
|
|
208
210
|
/** Whether the single-slot layout cache holds a valid entry. */
|
|
209
211
|
_hasL: boolean;
|
|
210
212
|
/** Cached available width of the last measure call. */
|
|
@@ -223,6 +225,7 @@ export declare class Node {
|
|
|
223
225
|
_mOutW: number;
|
|
224
226
|
/** Cached measure-pass output height restored on a cache hit. */
|
|
225
227
|
_mOutH: number;
|
|
228
|
+
_mOutMeasuredWidth: number;
|
|
226
229
|
/** Whether the single-slot measure cache holds a valid entry. */
|
|
227
230
|
_hasM: boolean;
|
|
228
231
|
/**
|
|
@@ -260,11 +263,11 @@ export declare class Node {
|
|
|
260
263
|
* w,h) so hits with different inputs than _hasL can restore the right
|
|
261
264
|
* dimensions. Upstream yoga uses 16; 4 covers Ink's dirty-chain depth.
|
|
262
265
|
* Packed as flat arrays to avoid per-entry object allocs. Slot i uses
|
|
263
|
-
* indices [i*8, i*8+8) in _cIn (aW,aH,wM,hM,oW,oH,fW,fH) and [i*
|
|
264
|
-
* in _cOut (w,h).
|
|
266
|
+
* indices [i*8, i*8+8) in _cIn (aW,aH,wM,hM,oW,oH,fW,fH) and [i*3, i*3+3)
|
|
267
|
+
* in _cOut (w,h,measuredWidth).
|
|
265
268
|
*/
|
|
266
269
|
_cIn: Float64Array | null;
|
|
267
|
-
/** Cached
|
|
270
|
+
/** Cached dimensions and the leaf width used to measure them. */
|
|
268
271
|
_cOut: Float64Array | null;
|
|
269
272
|
/** Generation at which the multi-entry cache was last written. */
|
|
270
273
|
_cGen: number;
|
|
@@ -367,6 +370,8 @@ export declare class Node {
|
|
|
367
370
|
* @returns the width in pixels.
|
|
368
371
|
*/
|
|
369
372
|
getComputedWidth(): number;
|
|
373
|
+
/** Content width used by the leaf measure function, before pixel rounding. */
|
|
374
|
+
getComputedMeasureWidth(): number;
|
|
370
375
|
/**
|
|
371
376
|
* Get the computed height.
|
|
372
377
|
* @returns the height in pixels.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/native-ts/yoga-layout/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAEH,OAAO,EACL,KAAK,EACL,SAAS,EACT,SAAS,EACT,SAAS,EACT,OAAO,EACP,IAAI,EACJ,MAAM,EACN,mBAAmB,EACnB,aAAa,EACb,MAAM,EACN,OAAO,EACP,WAAW,EACX,QAAQ,EACR,YAAY,EACZ,IAAI,EACJ,IAAI,EACL,MAAM,YAAY,CAAA;AAEnB,OAAO,EACL,KAAK,EACL,SAAS,EACT,SAAS,EACT,SAAS,EACT,OAAO,EACP,IAAI,EACJ,MAAM,EACN,mBAAmB,EACnB,aAAa,EACb,MAAM,EACN,OAAO,EACP,WAAW,EACX,QAAQ,EACR,YAAY,EACZ,IAAI,EACJ,IAAI,GACL,CAAA;AAKD;;;GAGG;AACH,MAAM,MAAM,KAAK,GAAG;IAClB,IAAI,EAAE,IAAI,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAmCD,KAAK,MAAM,GAAG;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/native-ts/yoga-layout/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -365,6 +365,7 @@ export class Node {
|
|
|
365
365
|
_lOutW = NaN;
|
|
366
366
|
/** Cached layout-pass output height restored on a cache hit. */
|
|
367
367
|
_lOutH = NaN;
|
|
368
|
+
_lOutMeasuredWidth = NaN;
|
|
368
369
|
/** Whether the single-slot layout cache holds a valid entry. */
|
|
369
370
|
_hasL = false;
|
|
370
371
|
/** Cached available width of the last measure call. */
|
|
@@ -383,6 +384,7 @@ export class Node {
|
|
|
383
384
|
_mOutW = NaN;
|
|
384
385
|
/** Cached measure-pass output height restored on a cache hit. */
|
|
385
386
|
_mOutH = NaN;
|
|
387
|
+
_mOutMeasuredWidth = NaN;
|
|
386
388
|
/** Whether the single-slot measure cache holds a valid entry. */
|
|
387
389
|
_hasM = false;
|
|
388
390
|
/**
|
|
@@ -420,11 +422,11 @@ export class Node {
|
|
|
420
422
|
* w,h) so hits with different inputs than _hasL can restore the right
|
|
421
423
|
* dimensions. Upstream yoga uses 16; 4 covers Ink's dirty-chain depth.
|
|
422
424
|
* Packed as flat arrays to avoid per-entry object allocs. Slot i uses
|
|
423
|
-
* indices [i*8, i*8+8) in _cIn (aW,aH,wM,hM,oW,oH,fW,fH) and [i*
|
|
424
|
-
* in _cOut (w,h).
|
|
425
|
+
* indices [i*8, i*8+8) in _cIn (aW,aH,wM,hM,oW,oH,fW,fH) and [i*3, i*3+3)
|
|
426
|
+
* in _cOut (w,h,measuredWidth).
|
|
425
427
|
*/
|
|
426
428
|
_cIn = null;
|
|
427
|
-
/** Cached
|
|
429
|
+
/** Cached dimensions and the leaf width used to measure them. */
|
|
428
430
|
_cOut = null;
|
|
429
431
|
/** Generation at which the multi-entry cache was last written. */
|
|
430
432
|
_cGen = -1;
|
|
@@ -450,6 +452,7 @@ export class Node {
|
|
|
450
452
|
top: 0,
|
|
451
453
|
width: 0,
|
|
452
454
|
height: 0,
|
|
455
|
+
measuredWidth: NaN,
|
|
453
456
|
border: [0, 0, 0, 0],
|
|
454
457
|
padding: [0, 0, 0, 0],
|
|
455
458
|
margin: [0, 0, 0, 0],
|
|
@@ -534,6 +537,7 @@ export class Node {
|
|
|
534
537
|
*/
|
|
535
538
|
reset() {
|
|
536
539
|
this.style = defaultStyle();
|
|
540
|
+
this.layout.measuredWidth = NaN;
|
|
537
541
|
this.children = [];
|
|
538
542
|
this.parent = null;
|
|
539
543
|
this.measureFunc = null;
|
|
@@ -614,6 +618,10 @@ export class Node {
|
|
|
614
618
|
getComputedWidth() {
|
|
615
619
|
return this.layout.width;
|
|
616
620
|
}
|
|
621
|
+
/** Content width used by the leaf measure function, before pixel rounding. */
|
|
622
|
+
getComputedMeasureWidth() {
|
|
623
|
+
return this.layout.measuredWidth;
|
|
624
|
+
}
|
|
617
625
|
/**
|
|
618
626
|
* Get the computed height.
|
|
619
627
|
* @returns the height in pixels.
|
|
@@ -1249,7 +1257,7 @@ const CACHE_SLOTS = 4;
|
|
|
1249
1257
|
function cacheWrite(node, aW, aH, wM, hM, oW, oH, fW, fH, wasDirty) {
|
|
1250
1258
|
if (!node._cIn) {
|
|
1251
1259
|
node._cIn = new Float64Array(CACHE_SLOTS * 8);
|
|
1252
|
-
node._cOut = new Float64Array(CACHE_SLOTS *
|
|
1260
|
+
node._cOut = new Float64Array(CACHE_SLOTS * 3);
|
|
1253
1261
|
}
|
|
1254
1262
|
// First write after a dirty clears stale entries from before the dirty.
|
|
1255
1263
|
// _cGen < _generation means entries are from a previous calculateLayout;
|
|
@@ -1276,8 +1284,9 @@ function cacheWrite(node, aW, aH, wM, hM, oW, oH, fW, fH, wasDirty) {
|
|
|
1276
1284
|
cIn[o + 5] = oH;
|
|
1277
1285
|
cIn[o + 6] = fW ? 1 : 0;
|
|
1278
1286
|
cIn[o + 7] = fH ? 1 : 0;
|
|
1279
|
-
node._cOut[i *
|
|
1280
|
-
node._cOut[i *
|
|
1287
|
+
node._cOut[i * 3] = node.layout.width;
|
|
1288
|
+
node._cOut[i * 3 + 1] = node.layout.height;
|
|
1289
|
+
node._cOut[i * 3 + 2] = node.layout.measuredWidth;
|
|
1281
1290
|
node._cGen = _generation;
|
|
1282
1291
|
}
|
|
1283
1292
|
// Store computed layout.width/height into the single-slot cache output fields.
|
|
@@ -1292,6 +1301,7 @@ function commitCacheOutputs(node, performLayout) {
|
|
|
1292
1301
|
if (performLayout) {
|
|
1293
1302
|
node._lOutW = node.layout.width;
|
|
1294
1303
|
node._lOutH = node.layout.height;
|
|
1304
|
+
node._lOutMeasuredWidth = node.layout.measuredWidth;
|
|
1295
1305
|
// A completed layout pass re-laid the whole subtree at the final
|
|
1296
1306
|
// constraints — any measure-pass scratch below has been overwritten,
|
|
1297
1307
|
// so this node may serve layout-cache hits again.
|
|
@@ -1300,6 +1310,7 @@ function commitCacheOutputs(node, performLayout) {
|
|
|
1300
1310
|
else {
|
|
1301
1311
|
node._mOutW = node.layout.width;
|
|
1302
1312
|
node._mOutH = node.layout.height;
|
|
1313
|
+
node._mOutMeasuredWidth = node.layout.measuredWidth;
|
|
1303
1314
|
// This measure call actually computed: its recursion overwrote the
|
|
1304
1315
|
// subtree's layout.* as scratch for the probed size. Until a layout
|
|
1305
1316
|
// pass re-lays this subtree, layout-cache hits here must be refused
|
|
@@ -1368,6 +1379,7 @@ forceWidth = false, forceHeight = false) {
|
|
|
1368
1379
|
_yogaCacheHits++;
|
|
1369
1380
|
layout.width = node._lOutW;
|
|
1370
1381
|
layout.height = node._lOutH;
|
|
1382
|
+
layout.measuredWidth = node._lOutMeasuredWidth;
|
|
1371
1383
|
return;
|
|
1372
1384
|
}
|
|
1373
1385
|
// Multi-entry cache: scan for matching inputs, restore cached w/h on hit.
|
|
@@ -1395,8 +1407,9 @@ forceWidth = false, forceHeight = false) {
|
|
|
1395
1407
|
sameFloat(cIn[o + 1], availableHeight) &&
|
|
1396
1408
|
sameFloat(cIn[o + 4], ownerWidth) &&
|
|
1397
1409
|
sameFloat(cIn[o + 5], ownerHeight)) {
|
|
1398
|
-
layout.width = node._cOut[i *
|
|
1399
|
-
layout.height = node._cOut[i *
|
|
1410
|
+
layout.width = node._cOut[i * 3];
|
|
1411
|
+
layout.height = node._cOut[i * 3 + 1];
|
|
1412
|
+
layout.measuredWidth = node._cOut[i * 3 + 2];
|
|
1400
1413
|
_yogaCacheHits++;
|
|
1401
1414
|
return;
|
|
1402
1415
|
}
|
|
@@ -1413,6 +1426,7 @@ forceWidth = false, forceHeight = false) {
|
|
|
1413
1426
|
sameFloat(node._mOH, ownerHeight)) {
|
|
1414
1427
|
layout.width = node._mOutW;
|
|
1415
1428
|
layout.height = node._mOutH;
|
|
1429
|
+
layout.measuredWidth = node._mOutMeasuredWidth;
|
|
1416
1430
|
_yogaCacheHits++;
|
|
1417
1431
|
return;
|
|
1418
1432
|
}
|
|
@@ -1516,6 +1530,7 @@ forceWidth = false, forceHeight = false) {
|
|
|
1516
1530
|
: Math.max(0, height - paddingBorderHeight);
|
|
1517
1531
|
_yogaMeasureCalls++;
|
|
1518
1532
|
const measured = node.measureFunc(innerW, wMode, innerH, hMode);
|
|
1533
|
+
node.layout.measuredWidth = wMode === MeasureMode.Undefined ? measured.width : innerW;
|
|
1519
1534
|
node.layout.width =
|
|
1520
1535
|
wMode === MeasureMode.Exactly
|
|
1521
1536
|
? width
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Chat.d.ts","sourceRoot":"","sources":["../../../src/screens/Chat.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AA0BzB,OAAO,KAAK,EAAE,SAAS,IAAI,OAAO,EAAE,MAAM,iCAAiC,CAAA;AAE3E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAC1D,OAAO,EAAE,cAAc,EAAwB,MAAM,0BAA0B,CAAA;AAE/E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAA;AAClE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAG5D,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAmB3D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAA;AA+MxE,wBAAgB,IAAI,CAAC,EACnB,OAAO,EACP,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,kBAAkB,EAClB,SAAS,EACT,MAAM,EACN,QAAQ,EACR,SAAS,EACT,UAAkB,EAClB,cAAc,EAAE,kBAAkB,EAClC,mBAAmB,EACnB,WAAW,GACZ,EAAE;IACD,OAAO,EAAE,OAAO,CAAA;IAChB,WAAW,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,KAAK,CAAC,SAAS,CAAA;IAC/D,aAAa,EAAE,aAAa,CAAA;IAC5B;;;;OAIG;IACH,aAAa,CAAC,EAAE,aAAa,CAAA;IAC7B;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,cAAc,CAAA;IACjC,yDAAyD;IACzD,eAAe,CAAC,EAAE,cAAc,CAAA;IAChC,iDAAiD;IACjD,kBAAkB,CAAC,EAAE,eAAe,CAAA;IACpC,uEAAuE;IACvE,SAAS,CAAC,EAAE,YAAY,CAAA;IACxB,MAAM,EAAE,MAAM,IAAI,CAAA;IAClB,wEAAwE;IACxE,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;IACrB,2EAA2E;IAC3E,SAAS,CAAC,EAAE,MAAM,IAAI,CAAA;IACtB;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB;;;;;;;OAOG;IACH,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB;;;;;;OAMG;IACH,mBAAmB,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAA;CAC/D,
|
|
1
|
+
{"version":3,"file":"Chat.d.ts","sourceRoot":"","sources":["../../../src/screens/Chat.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AA0BzB,OAAO,KAAK,EAAE,SAAS,IAAI,OAAO,EAAE,MAAM,iCAAiC,CAAA;AAE3E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAC1D,OAAO,EAAE,cAAc,EAAwB,MAAM,0BAA0B,CAAA;AAE/E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAA;AAClE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAG5D,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAmB3D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAA;AA+MxE,wBAAgB,IAAI,CAAC,EACnB,OAAO,EACP,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,kBAAkB,EAClB,SAAS,EACT,MAAM,EACN,QAAQ,EACR,SAAS,EACT,UAAkB,EAClB,cAAc,EAAE,kBAAkB,EAClC,mBAAmB,EACnB,WAAW,GACZ,EAAE;IACD,OAAO,EAAE,OAAO,CAAA;IAChB,WAAW,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,KAAK,CAAC,SAAS,CAAA;IAC/D,aAAa,EAAE,aAAa,CAAA;IAC5B;;;;OAIG;IACH,aAAa,CAAC,EAAE,aAAa,CAAA;IAC7B;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,cAAc,CAAA;IACjC,yDAAyD;IACzD,eAAe,CAAC,EAAE,cAAc,CAAA;IAChC,iDAAiD;IACjD,kBAAkB,CAAC,EAAE,eAAe,CAAA;IACpC,uEAAuE;IACvE,SAAS,CAAC,EAAE,YAAY,CAAA;IACxB,MAAM,EAAE,MAAM,IAAI,CAAA;IAClB,wEAAwE;IACxE,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;IACrB,2EAA2E;IAC3E,SAAS,CAAC,EAAE,MAAM,IAAI,CAAA;IACtB;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB;;;;;;;OAOG;IACH,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB;;;;;;OAMG;IACH,mBAAmB,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAA;CAC/D,4BAy+HA"}
|
|
@@ -575,6 +575,9 @@ export function Chat({ channel, questionStore, approvalStore, extensionDialogs,
|
|
|
575
575
|
/** Subagent dashboard (Ctrl+A): displays active/completed subagents. */
|
|
576
576
|
const [subagentDashboardOpen, setSubagentDashboardOpen] = React.useState(false);
|
|
577
577
|
const [jobsPanelOpen, setJobsPanelOpen] = React.useState(false);
|
|
578
|
+
// MessageList forwards these open handlers to every memoized row. Their
|
|
579
|
+
// identities must survive token/metrics updates, including for tool rows.
|
|
580
|
+
const openJobsPanel = React.useCallback(() => setJobsPanelOpen(true), []);
|
|
578
581
|
/** Detail view for a specific subagent (opened from dashboard). */
|
|
579
582
|
const [subagentDetailId, setSubagentDetailId] = React.useState(null);
|
|
580
583
|
/**
|
|
@@ -616,18 +619,21 @@ export function Chat({ channel, questionStore, approvalStore, extensionDialogs,
|
|
|
616
619
|
const loadedContextVisible = channel.rows.length === 0 && channel.loadedContext !== undefined;
|
|
617
620
|
/** Startup context panel: collapsed by default, toggled with Ctrl+P. */
|
|
618
621
|
const [loadedContextOpen, setLoadedContextOpen] = React.useState(false);
|
|
619
|
-
/**
|
|
620
|
-
* The context panel changes the height of the main-screen transcript by a
|
|
621
|
-
* large amount. In inline mode that invalidates the renderer's previous
|
|
622
|
-
* scrollback/layout correspondence; asking it to repaint from the physical
|
|
623
|
-
* viewport prevents the collapsed frame from reusing stale blank cells.
|
|
624
|
-
*/
|
|
625
622
|
const toggleLoadedContext = React.useCallback(() => {
|
|
626
623
|
setLoadedContextOpen(previous => !previous);
|
|
624
|
+
}, []);
|
|
625
|
+
const renderedLoadedContextOpen = React.useRef(loadedContextOpen);
|
|
626
|
+
React.useLayoutEffect(() => {
|
|
627
|
+
if (renderedLoadedContextOpen.current === loadedContextOpen)
|
|
628
|
+
return;
|
|
629
|
+
renderedLoadedContextOpen.current = loadedContextOpen;
|
|
630
|
+
// Reanchor after the new panel geometry commits. Requesting it in the
|
|
631
|
+
// key handler lets a pending paint consume it on the old tall layout,
|
|
632
|
+
// leaving the collapsed summary stranded outside the physical viewport.
|
|
627
633
|
const ink = instances.get(process.stdout) ?? instances.values().next().value;
|
|
628
634
|
ink?.invalidatePrevFrame();
|
|
629
635
|
ink?.reanchorViewport();
|
|
630
|
-
}, []);
|
|
636
|
+
}, [loadedContextOpen]);
|
|
631
637
|
/**
|
|
632
638
|
* Click-to-act targets: the Ink instance's hyperlink-open callback (wired
|
|
633
639
|
* in the effect below) resolves every clickable target the transcript
|
|
@@ -2474,6 +2480,12 @@ export function Chat({ channel, questionStore, approvalStore, extensionDialogs,
|
|
|
2474
2480
|
// Subagent dashboard or detail scene: it owns the keyboard while open.
|
|
2475
2481
|
if (subagentDashboardOpen || subagentDetailId !== null)
|
|
2476
2482
|
return;
|
|
2483
|
+
// The `/jobs` panel replaces the conversation too, so it owns Esc (close)
|
|
2484
|
+
// and k (kill) while open. Unguarded, Esc meant to CLOSE the panel also
|
|
2485
|
+
// reached the chat:cancel branch below whenever a turn was in flight —
|
|
2486
|
+
// dismissing the panel and killing the turn with one key.
|
|
2487
|
+
if (jobsPanelOpen)
|
|
2488
|
+
return;
|
|
2477
2489
|
// A plugin scene (dsh-tui-scenes) or the trajectory scene owns the whole
|
|
2478
2490
|
// screen while open: every key belongs to it. Unguarded, an Esc meant to
|
|
2479
2491
|
// CLOSE the scene also reached the chat:cancel branch below whenever a
|
|
@@ -3556,7 +3568,7 @@ export function Chat({ channel, questionStore, approvalStore, extensionDialogs,
|
|
|
3556
3568
|
// sessions keep the full intro; restored ones settle instantly.
|
|
3557
3569
|
// A remount after a whole screen closed also settles instantly
|
|
3558
3570
|
// (see suppressLogoIntroRef).
|
|
3559
|
-
skipIntro: suppressLogoIntroRef.current || channel.rows.length > 30 }, logoNonce), loadedContextVisible && (_jsx(LoadedContextPanel, { context: channel.loadedContext, open: loadedContextOpen, onToggle: toggleLoadedContext })), _jsx(MessageList, { rows: channel.rows, failureHintRowId: failureHintRowId, failureHint: t('traj-hint-failure', { key: `${modLabel}t` }), expanded: expanded, expandedRows: expandedRows, selectedId: selectionActive ? selectedId : null, onToggleRow: toggleRowExpanded, streamViewToggledRows: streamViewToggledRows, onToggleStreamView: toggleStreamView, model: channel.model, diffLayout: channel.diffLayout, thinkingFold: channel.thinkingFold, toolBackground: channel.toolBackground, foldTerminalCommand: channel.foldTerminalCommand, smoothStreaming: channel.smoothStreaming, activityFrames: channel.activityFrames, showAll: showAllMessages, thinkingVisible: thinkingVisible, historyPaintEnabled: !fullscreen, onToggleAll: () => { setShowAllMessages(previous => !previous); }, onLoadOlder: () => channel.loadOlder(), registerRowRef: registerRowRef, scrollHandle: handle, forceMountRowId: forceMountRowId, newSinceRowId: isSticky ? null : lastSeenRowIdRef.current, onUnseenCount: setUnseenCount, onTimeline: setTimeline, onOpenSubagent:
|
|
3571
|
+
skipIntro: suppressLogoIntroRef.current || channel.rows.length > 30 }, logoNonce), loadedContextVisible && (_jsx(LoadedContextPanel, { context: channel.loadedContext, open: loadedContextOpen, onToggle: toggleLoadedContext })), _jsx(MessageList, { rows: channel.rows, failureHintRowId: failureHintRowId, failureHint: t('traj-hint-failure', { key: `${modLabel}t` }), expanded: expanded, expandedRows: expandedRows, selectedId: selectionActive ? selectedId : null, onToggleRow: toggleRowExpanded, streamViewToggledRows: streamViewToggledRows, onToggleStreamView: toggleStreamView, model: channel.model, diffLayout: channel.diffLayout, thinkingFold: channel.thinkingFold, toolBackground: channel.toolBackground, foldTerminalCommand: channel.foldTerminalCommand, smoothStreaming: channel.smoothStreaming, activityFrames: channel.activityFrames, showAll: showAllMessages, thinkingVisible: thinkingVisible, historyPaintEnabled: !fullscreen, onToggleAll: () => { setShowAllMessages(previous => !previous); }, onLoadOlder: () => channel.loadOlder(), registerRowRef: registerRowRef, scrollHandle: handle, forceMountRowId: forceMountRowId, newSinceRowId: isSticky ? null : lastSeenRowIdRef.current, onUnseenCount: setUnseenCount, onTimeline: setTimeline, onOpenSubagent: setSubagentDetailId, onOpenJobs: openJobsPanel, onOpenFile: openFileActions, onPreviewImage: openImagePreview, suppressImageGraphics: activePreview !== null })] }), (() => {
|
|
3560
3572
|
// Gutter mode (settings `dsh-tui.scrollGutter`): the timeline
|
|
3561
3573
|
// rail (default), the proportional scrollbar, or nothing. The
|
|
3562
3574
|
// slot keeps its 2 columns in both rendered modes (Qwen's
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@deepseek-harness-tui/dsh-tui",
|
|
3
|
-
"version": "0.10.
|
|
3
|
+
"version": "0.10.2",
|
|
4
4
|
"description": "Interactive terminal interface for DeepSeek Harness agents, sessions and tools.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"dsh",
|
|
@@ -124,7 +124,7 @@
|
|
|
124
124
|
"prompt:debug": "node scripts/read-prompt-debug.mjs",
|
|
125
125
|
"tui": "node --import tsx/esm scripts/run.ts",
|
|
126
126
|
"smoke": "node --import tsx/esm scripts/smoke.tsx",
|
|
127
|
-
"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:runtime-themes && npm run verify:packaged-presets && npm run verify:history-search && npm run verify:initial-prompt && npm run verify:minimal-preset-tools && npm run verify:liangshen-bootstrap && npm run verify:inject-channel && npm run verify:wheel-selection && npm run verify:win32-protocol && npm run verify:selection-resize && npm run verify:liangshen-instruction-hint && npm run verify:pointer-events && npm run verify:terminal-images && npm run verify:overlay-occlusion && npm run verify:transcript-images && npm run verify:image-preview && npm run verify:backdrop-dim && npm run verify:composer-image-tokens && npm run verify:chat-overlay && npm run verify:i18n && npm run verify:approval-visibility && npm run verify:adapter-skeleton && npm run verify:adapter-ports && npm run verify:adapter-effect-class && npm run verify:adapter-shadow && npm run verify:adapter-descriptor && npm run verify:adapter-upstream-driver && npm run verify:adapter-kernel-runtime && npm run verify:adapter-live-probes && npm run verify:adapter-slices && npm run verify:adapter-channel && npm run verify:binding-transaction && npm run verify:session-extraction && npm run verify:model-mode-workspace-extraction && npm run verify:model-lifecycle-fences && npm run verify:reports-metadata && npm run verify:background-extraction && npm run verify:plugin-catalog-extraction && npm run verify:session-reset && npm run verify:channel-ui && npm run verify:adapter-detection && npm run verify:adapter-replay-harness && npm run verify:adapter-channel-conformance && npm run verify:protocol-single-source && npm run verify:compat-removal && npm run verify:terminal-images-sixel && npm run verify:sixel-transcript && npm run verify:migrate-sessions && npm run verify:fixed-window && npm run verify:source-hygiene && npm run verify:renderer-primitives && npm run verify:product-migration && npm run verify:spinner-identity && npm run verify:table-layout && npm run verify:btw",
|
|
127
|
+
"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:runtime-themes && npm run verify:packaged-presets && npm run verify:history-search && npm run verify:initial-prompt && npm run verify:minimal-preset-tools && npm run verify:liangshen-bootstrap && npm run verify:inject-channel && npm run verify:wheel-selection && npm run verify:win32-protocol && npm run verify:selection-resize && npm run verify:liangshen-instruction-hint && npm run verify:pointer-events && npm run verify:terminal-images && npm run verify:overlay-occlusion && npm run verify:transcript-images && npm run verify:image-preview && npm run verify:backdrop-dim && npm run verify:composer-image-tokens && npm run verify:chat-overlay && npm run verify:i18n && npm run verify:approval-visibility && npm run verify:adapter-skeleton && npm run verify:adapter-ports && npm run verify:adapter-effect-class && npm run verify:adapter-shadow && npm run verify:adapter-descriptor && npm run verify:adapter-upstream-driver && npm run verify:adapter-kernel-runtime && npm run verify:adapter-live-probes && npm run verify:adapter-slices && npm run verify:adapter-channel && npm run verify:binding-transaction && npm run verify:session-extraction && npm run verify:rewind-edit && npm run verify:model-mode-workspace-extraction && npm run verify:model-lifecycle-fences && npm run verify:reports-metadata && npm run verify:background-extraction && npm run verify:plugin-catalog-extraction && npm run verify:session-reset && npm run verify:channel-ui && npm run verify:adapter-detection && npm run verify:adapter-replay-harness && npm run verify:adapter-channel-conformance && npm run verify:protocol-single-source && npm run verify:compat-removal && npm run verify:terminal-images-sixel && npm run verify:sixel-transcript && npm run verify:migrate-sessions && npm run verify:fixed-window && npm run verify:source-hygiene && npm run verify:renderer-primitives && npm run verify:product-migration && npm run verify:spinner-identity && npm run verify:table-layout && npm run verify:btw",
|
|
128
128
|
"verify:boundary": "node --import tsx/esm scripts/verify-adapter-boundary.ts",
|
|
129
129
|
"verify:i18n": "node --import tsx/esm scripts/verify-i18n.ts",
|
|
130
130
|
"verify:contract": "node --import tsx/esm scripts/verify-upstream-contract.ts",
|
|
@@ -205,6 +205,7 @@
|
|
|
205
205
|
"verify:adapter-channel": "node --import tsx/esm scripts/verify-adapter-channel.ts",
|
|
206
206
|
"verify:binding-transaction": "node --import tsx/esm scripts/verify-binding-transaction.ts",
|
|
207
207
|
"verify:session-extraction": "node --import tsx/esm scripts/verify-session-extraction.ts",
|
|
208
|
+
"verify:rewind-edit": "node --import tsx/esm scripts/verify-rewind-edit.tsx",
|
|
208
209
|
"verify:model-mode-workspace-extraction": "node --import tsx/esm scripts/verify-model-mode-workspace-extraction.ts",
|
|
209
210
|
"verify:model-lifecycle-fences": "node --import tsx/esm scripts/verify-model-lifecycle-fences.ts",
|
|
210
211
|
"verify:reports-metadata": "node --import tsx/esm scripts/verify-reports-metadata.ts",
|