@simon_he/vue-tui 1.1.11 → 1.1.13

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/dist/agent.js CHANGED
@@ -1,21 +1,21 @@
1
1
  import "./create-terminal-Db_-UGVQ.js";
2
2
  import "./hyperlink-clbb_ha_.js";
3
- import { forEachTextCellSegment, recordTerminalGraphicTrace, sanitizeInlineText, sanitizeTextBlock, sliceByCells, spaces, textCellWidth$1 as textCellWidth, useTerminal, withTextWidthProvider } from "./rect-JzWMJxxc.js";
4
- import "./linkify-CklfA1vp.js";
3
+ import { forEachTextCellSegment, recordTerminalGraphicTrace, sanitizeInlineText, sanitizeTextBlock, sliceByCells, spaces, textCellWidth$1 as textCellWidth, useTerminal, withTextWidthProvider } from "./rect-Dfevd15m.js";
4
+ import "./linkify-DF96jKWy.js";
5
5
  import "./frame-perf-CHpWhbC4.js";
6
6
  import "./env-Cl8qmNFN.js";
7
7
  import "./terminal-selection-4W1SJj4c.js";
8
8
  import "./debug-logger-CmsGI4of.js";
9
- import { TBox, TCommandPalette, TDialog, TInput, TRenderPlane, TSelect, computeCommandPaletteMatchRanges } from "./TSelect-C-WzsLAD.js";
10
- import { TText, TView } from "./frame-mailbox-DaTrfyaF.js";
9
+ import { TBox, TCommandPalette, TDialog, TInput, TRenderPlane, TSelect, computeCommandPaletteMatchRanges } from "./TSelect-CnBJET_C.js";
10
+ import { TText, TView } from "./frame-mailbox-6XHw-P8Q.js";
11
11
  import "./path-BI9W15Zt.js";
12
12
  import "./wheel-scroll-CQ22Hcyj.js";
13
- import { TMermaid$1 as TMermaid, TMermaidText$1 as TMermaidText, isSimpleMermaidFlowchartSource, markMermaidRenderErrorFatal } from "./TMermaidText-C1akgJPU.js";
13
+ import { TMermaid$1 as TMermaid, TMermaidText$1 as TMermaidText, isSimpleMermaidFlowchartSource, markMermaidRenderErrorFatal } from "./TMermaidText-DJmYNqhh.js";
14
14
  import { createIterm2InlineImageSequence, createKittyDeleteGraphicsSequence, createKittyGraphicsSequence, createKittyPlacementSequence, createTerminalGraphicPngSequence, detectTerminalGraphicsCapabilities, getTerminalGraphicsOutput, getTerminalGraphicsOutputVersion, hashTerminalGraphicsString, isSafeTerminalGraphicsSequence, normalizeTerminalGraphicSize, sanitizeTerminalFallbackText, subscribeTerminalGraphicsOutput } from "./terminal-graphics-DpSL29OQ.js";
15
- import { TVirtualMarkdown, createMarkdownBlockSource } from "./block-source-BhvdZomx.js";
15
+ import { TVirtualMarkdown, createMarkdownBlockSource } from "./block-source-BGTRldY7.js";
16
16
  import "./math-image-CcUpBnW0.js";
17
- import { TLogLinksPanel, TLogMinimap, TLogScrollbar, TLogSearchBar, TLogSearchPager, TLogSearchResults, TLogView, TLogVirtualLinksPanel, TLogVirtualSearchResults, TTranscriptView, TVirtualList, createAppendOnlyLogStore, createTLogDensityBucketsFromMarkers, createTLogLevelPlugin, createTLogLineMatcherPlugin, createTLogLinkActionPlugin, createTLogOsc8LinkPlugin, createTLogUrlPlugin, detectTLogUrls, dispatchTLogPluginLinkAction, getTLogPluginMetadata, parseTLogAnnotatedText, resolveTLogLinksPanelTheme, resolveTLogMinimapTheme, resolveTLogScrollbarTheme, resolveTLogSearchBarTheme, resolveTLogSearchPagerTheme, resolveTLogSearchResultsTheme, resolveTLogViewTheme, stripTLogAnsiText, tlogDarkPreset, tlogDarkTheme, tlogDefaultPreset, tlogDefaultTheme, tlogHighContrastPreset, tlogHighContrastTheme, toTLogExternalLinkFromVisibleLink, useTLogLinkController, useTLogRetainedIndex, useTLogSearchController, useTLogSearchResultsPage, useTLogVirtualSearchResults } from "./tlog-theme-BnILsD3n.js";
18
- import { TAgentTerminalGraphic } from "./TAgentTerminalGraphic-B8-YZfuP.js";
17
+ import { TLogLinksPanel, TLogMinimap, TLogScrollbar, TLogSearchBar, TLogSearchPager, TLogSearchResults, TLogView, TLogVirtualLinksPanel, TLogVirtualSearchResults, TTranscriptView, TVirtualList, createAppendOnlyLogStore, createTLogDensityBucketsFromMarkers, createTLogLevelPlugin, createTLogLineMatcherPlugin, createTLogLinkActionPlugin, createTLogOsc8LinkPlugin, createTLogUrlPlugin, detectTLogUrls, dispatchTLogPluginLinkAction, getTLogPluginMetadata, parseTLogAnnotatedText, resolveTLogLinksPanelTheme, resolveTLogMinimapTheme, resolveTLogScrollbarTheme, resolveTLogSearchBarTheme, resolveTLogSearchPagerTheme, resolveTLogSearchResultsTheme, resolveTLogViewTheme, stripTLogAnsiText, tlogDarkPreset, tlogDarkTheme, tlogDefaultPreset, tlogDefaultTheme, tlogHighContrastPreset, tlogHighContrastTheme, toTLogExternalLinkFromVisibleLink, useTLogLinkController, useTLogRetainedIndex, useTLogSearchController, useTLogSearchResultsPage, useTLogVirtualSearchResults } from "./tlog-theme-DKq1YOQF.js";
18
+ import { TAgentTerminalGraphic } from "./TAgentTerminalGraphic-BKDAoGoE.js";
19
19
  import { computed, defineComponent, h } from "vue";
20
20
 
21
21
  //#region src/vue/agent/view-models.ts
@@ -1,5 +1,5 @@
1
1
  import { hasEncodedControl, sanitizeDomHref } from "./hyperlink-clbb_ha_.js";
2
- import { EventZIndexContextKey, RenderPlaneContextKey, currentTextWidthProvider, forEachTextCellSegment, intersectRect, normalizeCellRect, repeatChar, sanitizeInlineText, sanitizeTextBlock, sliceByCellsRange, spaces, textCellWidth$1 as textCellWidth, translateRect, useLayout, useRenderNode, useTerminal, useTerminalNode, useVisibility, withTextWidthProvider } from "./rect-JzWMJxxc.js";
2
+ import { EventZIndexContextKey, RenderPlaneContextKey, currentTextWidthProvider, forEachTextCellSegment, intersectRect, normalizeCellRect, repeatChar, sanitizeInlineText, sanitizeTextBlock, sliceByCellsRange, sliceByCellsRangeForSelection, spaces, textCellWidth$1 as textCellWidth, translateRect, useLayout, useRenderNode, useTerminal, useTerminalNode, useVisibility, withTextWidthProvider } from "./rect-Dfevd15m.js";
3
3
  import { terminalSelectionRowSpans, terminalSelectionVisibleRowSpans } from "./terminal-selection-4W1SJj4c.js";
4
4
  import { createDebugLogger, isDebugEnabled } from "./debug-logger-CmsGI4of.js";
5
5
  import { applyWheelScroll, createWheelScrollState, resetWheelScrollState } from "./wheel-scroll-CQ22Hcyj.js";
@@ -2597,7 +2597,7 @@ const TVirtualMarkdown = defineComponent({
2597
2597
  function textForSelectionRange(range) {
2598
2598
  const cols = Math.max(1, Math.floor(props.w));
2599
2599
  return withTextWidthProvider(widthProvider, () => terminalSelectionRowSpans(range, cols, rows.value.length).map((span) => {
2600
- const text = sliceByCellsRange(rows.value[span.y]?.plainText ?? "", span.x0, span.x1);
2600
+ const text = sliceByCellsRangeForSelection(rows.value[span.y]?.plainText ?? "", span.x0, span.x1);
2601
2601
  return span.x1 >= cols ? text.trimEnd() : text;
2602
2602
  }).join("\n"));
2603
2603
  }
package/dist/cli.cjs CHANGED
@@ -2150,7 +2150,7 @@ function createElement(type) {
2150
2150
  }, el;
2151
2151
  }
2152
2152
  function insert(child, parent, anchor) {
2153
- child.parent = parent;
2153
+ child.parent && remove(child), child.parent = parent;
2154
2154
  let list = parent.children;
2155
2155
  if (!anchor) {
2156
2156
  list.push(child);
@@ -5673,7 +5673,7 @@ function createRenderManager(terminal, options = {}) {
5673
5673
  for (let node of nodes.values())
5674
5674
  addToRowBuckets(node);
5675
5675
  }
5676
- function shouldPromoteToFullPlaneDirty(dirtyRows, planeNodes) {
5676
+ function shouldScanFullPlane(dirtyRows, planeNodes) {
5677
5677
  return planeNodes > 1 && dirtyRows >= ROW_BUCKET_DIRTY_RATIO_MIN_ROWS && terminalRows > 0 && dirtyRows / terminalRows >= ROW_BUCKET_DIRTY_RATIO_FALLBACK && dirtyRows >= planeNodes * ROW_BUCKET_DIRTY_RATIO_FALLBACK;
5678
5678
  }
5679
5679
  function ensureRenderedRowsScratch() {
@@ -5927,12 +5927,7 @@ function createRenderManager(terminal, options = {}) {
5927
5927
  if (!state || !state.allRowsDirty && state.dirtyRowCount === 0)
5928
5928
  continue;
5929
5929
  let planeNodes = sortedNodesByPlane.get(plane) ?? [], isFullPlaneRepaint = state.allRowsDirty, rows = allRows;
5930
- if (!isFullPlaneRepaint && shouldPromoteToFullPlaneDirty(state.dirtyRowCount, planeNodes.length) && (isFullPlaneRepaint = !0, state.allRowsDirty = !0, rowBucketFallbacks.push({
5931
- plane,
5932
- reason: "dirty-ratio",
5933
- dirtyRows: state.dirtyRowCount,
5934
- planeNodes: planeNodes.length
5935
- })), !isFullPlaneRepaint) {
5930
+ if (!isFullPlaneRepaint) {
5936
5931
  dirtyRowsScratch.length = 0, rows = dirtyRowsScratch;
5937
5932
  let startY = Number.isFinite(state.dirtyMinY) ? state.dirtyMinY : 0, endY = state.dirtyMaxY;
5938
5933
  for (let y = startY; y <= endY; y++)
@@ -5944,6 +5939,13 @@ function createRenderManager(terminal, options = {}) {
5944
5939
  }
5945
5940
  resetPlaneRowsForRender(terminal, plane, isFullPlaneRepaint ? null : rows);
5946
5941
  let paintRows = isFullPlaneRepaint ? void 0 : rows, needsIntersectFilter = !1, candidateNodes = isFullPlaneRepaint ? planeNodes : (() => {
5942
+ if (shouldScanFullPlane(rows.length, planeNodes.length))
5943
+ return needsIntersectFilter = !0, rowBucketFallbacks.push({
5944
+ plane,
5945
+ reason: "dirty-ratio",
5946
+ dirtyRows: rows.length,
5947
+ planeNodes: planeNodes.length
5948
+ }), planeNodes;
5947
5949
  let marks = beginCandidateCollection(planeNodes), buckets = rowBuckets.get(plane);
5948
5950
  for (let y of rows) {
5949
5951
  let rowIds = buckets == null ? void 0 : buckets.get(y);
@@ -7917,7 +7919,7 @@ function createStdoutRenderer(terminal, options) {
7917
7919
  }
7918
7920
  return 0;
7919
7921
  }
7920
- let useSyncOutput = resolveUseSyncOutput(), isGhostty = "GHOSTTY_RESOURCES_DIR" in (((_b = import_node_process6.default) == null ? void 0 : _b.env) ?? {}), chunkSize = 8 * 1024, chunkThresholdBytes = 64 * 1024, syncMaxBytes = 128 * 1024, dirtyFullThreshold = 0.6, DIRTY_SPAN_MERGE_GAP_CELLS = 2, DIRTY_SPAN_MAX_PER_ROW = 12, DIRTY_SPAN_FULL_ROW_THRESHOLD = 0.7, EST_STYLE_SWITCH_BYTES = 8, EST_CLEAR_TO_EOL_BYTES = 3, disableCursorPos = !1, termProgram = String(env.TERM_PROGRAM ?? "").trim().toLowerCase(), term = String(env.TERM ?? "").trim().toLowerCase(), isKitty = "KITTY_WINDOW_ID" in env || termProgram.includes("kitty") || term.includes("kitty"), isAlacritty = "ALACRITTY_WINDOW_ID" in env || "ALACRITTY_LOG" in env || termProgram.includes("alacritty") || term.includes("alacritty"), isWezTerm = "WEZTERM_PANE" in env || "WEZTERM_EXECUTABLE" in env || termProgram.includes("wezterm"), isVscodeTerminal = termProgram === "vscode" || "VSCODE_PID" in env || "VSCODE_IPC_HOOK_CLI" in env, useConservativeDirtyRows = !!(outputIsTTY && (isGhostty || isKitty || isAlacritty || isWezTerm)), normalizeDirtyRowPatchMode = (value) => {
7922
+ let useSyncOutput = resolveUseSyncOutput(), isGhostty = "GHOSTTY_RESOURCES_DIR" in (((_b = import_node_process6.default) == null ? void 0 : _b.env) ?? {}), chunkSize = 8 * 1024, chunkThresholdBytes = 64 * 1024, syncMaxBytes = 128 * 1024, DIRTY_SPAN_MERGE_GAP_CELLS = 2, DIRTY_SPAN_MAX_PER_ROW = 12, DIRTY_SPAN_FULL_ROW_THRESHOLD = 0.7, EST_STYLE_SWITCH_BYTES = 8, EST_CLEAR_TO_EOL_BYTES = 3, disableCursorPos = !1, termProgram = String(env.TERM_PROGRAM ?? "").trim().toLowerCase(), term = String(env.TERM ?? "").trim().toLowerCase(), isKitty = "KITTY_WINDOW_ID" in env || termProgram.includes("kitty") || term.includes("kitty"), isAlacritty = "ALACRITTY_WINDOW_ID" in env || "ALACRITTY_LOG" in env || termProgram.includes("alacritty") || term.includes("alacritty"), isWezTerm = "WEZTERM_PANE" in env || "WEZTERM_EXECUTABLE" in env || termProgram.includes("wezterm"), isVscodeTerminal = termProgram === "vscode" || "VSCODE_PID" in env || "VSCODE_IPC_HOOK_CLI" in env, useConservativeDirtyRows = !!(outputIsTTY && (isGhostty || isKitty || isAlacritty || isWezTerm)), normalizeDirtyRowPatchMode = (value) => {
7921
7923
  let normalized = typeof value == "string" ? value.trim().toLowerCase() : value;
7922
7924
  return normalized === "auto" || normalized === "row" || normalized === "span" ? normalized : null;
7923
7925
  }, normalizeColumnDiffMode = (value) => value === !0 ? "span" : value === !1 ? "row" : typeof value == "string" && value.trim().toLowerCase() === "auto" ? "auto" : null, firstValidDirtyRowPatchMode = (...values) => {
@@ -9309,8 +9311,10 @@ function createStdoutRenderer(terminal, options) {
9309
9311
  }, overlayCoverage = overlayPlaneCoverageRows(size.rows), overlayVisibleSpans = overlayVisibleSpansForRows(overlayCoverage.blockedRows), rowsToRender = (() => {
9310
9312
  if (allowGraphicsOnlyWithoutBaseline)
9311
9313
  return [];
9312
- if (forceFullRender || !fpPrevValid || !dirtyRows)
9314
+ if (forceFullRender || !fpPrevValid)
9313
9315
  return null;
9316
+ if (!dirtyRows)
9317
+ return anchorMode === "bottom" ? null : Array.from({ length: size.rows }, (_, y) => y);
9314
9318
  if (dirtyRows.length === 0)
9315
9319
  return [];
9316
9320
  let outRows = [];
@@ -9539,8 +9543,6 @@ function createStdoutRenderer(terminal, options) {
9539
9543
  )), explicitScrollOperations && rowsToRender && (!enableScrollRegions || !fpPrevValid) && (includeRowsForPendingScrollOperations(explicitScrollOperations), rowsToRender = Array.from(expandedRows).sort((a, b) => a - b), dirtySorted = !0, forceDirtyRowsRepaintForFrame = !0, explicitScrollOperations = null, hiddenExplicitDirtyRows = null, isDebugEnabled() && getDebugLog().render(
9540
9544
  enableScrollRegions ? " Explicit scroll ops fell back to region repaint because previous fingerprints are unavailable" : " Explicit scroll ops fell back to region repaint because scroll regions are disabled"
9541
9545
  ));
9542
- let denseDirtyRows = !!(rowsToRender && size.rows > 1 && rowsToRender.length >= size.rows * dirtyFullThreshold);
9543
- denseDirtyRows && (rowsToRender = null);
9544
9546
  let profiledRowCount = rowsToRender ? rowsToRender.length : size.rows, useScrollRegions = !terminalGraphicsBlockScrollRegions && enableScrollRegions && fpPrevValid && scrollRowsCandidate && scrollRowsCandidate.length >= 3 && !forceDirtyRowsRepaint && allowInferredScrollRegions, scrollHandled = !1;
9545
9547
  if (enableScrollRegions && explicitScrollOperations && scrollRowsCandidate && fpPrevValid) {
9546
9548
  currentFP.length === prevFP.length && (currentFP.set(prevFP), currentHrefIds.set(prevHrefIds), currentTextIds.set(prevTextIds));
@@ -9690,9 +9692,7 @@ function createStdoutRenderer(terminal, options) {
9690
9692
  profiledRowCount = renderedRows.size, scrollHandled = !0;
9691
9693
  }
9692
9694
  }
9693
- if (!scrollHandled && denseDirtyRows && scrollRowsCandidate && useScrollRegions && (rowsToRender = scrollRowsCandidate, profiledRowCount = rowsToRender.length, isDebugEnabled() && getDebugLog().render(
9694
- ` Dense dirty rows fell back to partial render: ${rowsToRender.length} rows`
9695
- )), !scrollHandled)
9695
+ if (!scrollHandled)
9696
9696
  if (rowsToRender) {
9697
9697
  let overlayDirtyRows = overlayTouchedRowSet ? rowsToRender.filter((y) => overlayTouchedRowSet.has(y)) : [];
9698
9698
  isDebugEnabled() && getDebugLog().render(
@@ -10346,7 +10346,9 @@ function createStdoutRenderer(terminal, options) {
10346
10346
  capabilities: STDOUT_RENDERER_CAPABILITIES,
10347
10347
  graphicsCapabilities,
10348
10348
  render,
10349
- forceRender: () => render(void 0, !0),
10349
+ forceRender: () => {
10350
+ fpPrevValid = !1, render(void 0, !0);
10351
+ },
10350
10352
  dispose,
10351
10353
  setCursor,
10352
10354
  showCursor,
package/dist/cli.js CHANGED
@@ -2523,6 +2523,7 @@ function createElement(type) {
2523
2523
  return el;
2524
2524
  }
2525
2525
  function insert(child, parent, anchor) {
2526
+ if (child.parent) remove(child);
2526
2527
  child.parent = parent;
2527
2528
  const list = parent.children;
2528
2529
  if (!anchor) {
@@ -6901,7 +6902,7 @@ function createRenderManager(terminal, options = {}) {
6901
6902
  largeNodeIdsByPlane.clear();
6902
6903
  for (const node of nodes.values()) addToRowBuckets(node);
6903
6904
  }
6904
- function shouldPromoteToFullPlaneDirty(dirtyRows, planeNodes) {
6905
+ function shouldScanFullPlane(dirtyRows, planeNodes) {
6905
6906
  return planeNodes > 1 && dirtyRows >= ROW_BUCKET_DIRTY_RATIO_MIN_ROWS && terminalRows > 0 && dirtyRows / terminalRows >= ROW_BUCKET_DIRTY_RATIO_FALLBACK && dirtyRows >= planeNodes * ROW_BUCKET_DIRTY_RATIO_FALLBACK;
6906
6907
  }
6907
6908
  function ensureRenderedRowsScratch() {
@@ -7269,18 +7270,8 @@ function createRenderManager(terminal, options = {}) {
7269
7270
  const state = planeDirtyStates.get(plane);
7270
7271
  if (!state || !state.allRowsDirty && state.dirtyRowCount === 0) continue;
7271
7272
  const planeNodes = sortedNodesByPlane.get(plane) ?? [];
7272
- let isFullPlaneRepaint = state.allRowsDirty;
7273
+ const isFullPlaneRepaint = state.allRowsDirty;
7273
7274
  let rows = allRows;
7274
- if (!isFullPlaneRepaint && shouldPromoteToFullPlaneDirty(state.dirtyRowCount, planeNodes.length)) {
7275
- isFullPlaneRepaint = true;
7276
- state.allRowsDirty = true;
7277
- rowBucketFallbacks.push({
7278
- plane,
7279
- reason: "dirty-ratio",
7280
- dirtyRows: state.dirtyRowCount,
7281
- planeNodes: planeNodes.length
7282
- });
7283
- }
7284
7275
  if (!isFullPlaneRepaint) {
7285
7276
  dirtyRowsScratch.length = 0;
7286
7277
  rows = dirtyRowsScratch;
@@ -7296,6 +7287,16 @@ function createRenderManager(terminal, options = {}) {
7296
7287
  const paintRows = isFullPlaneRepaint ? void 0 : rows;
7297
7288
  let needsIntersectFilter = false;
7298
7289
  const candidateNodes = isFullPlaneRepaint ? planeNodes : (() => {
7290
+ if (shouldScanFullPlane(rows.length, planeNodes.length)) {
7291
+ needsIntersectFilter = true;
7292
+ rowBucketFallbacks.push({
7293
+ plane,
7294
+ reason: "dirty-ratio",
7295
+ dirtyRows: rows.length,
7296
+ planeNodes: planeNodes.length
7297
+ });
7298
+ return planeNodes;
7299
+ }
7299
7300
  const marks = beginCandidateCollection(planeNodes);
7300
7301
  const buckets = rowBuckets.get(plane);
7301
7302
  for (const y of rows) {
@@ -9995,7 +9996,6 @@ function createStdoutRenderer(terminal, options) {
9995
9996
  const chunkSize = 8 * 1024;
9996
9997
  const chunkThresholdBytes = 64 * 1024;
9997
9998
  const syncMaxBytes = 128 * 1024;
9998
- const dirtyFullThreshold = .6;
9999
9999
  const DIRTY_SPAN_MERGE_GAP_CELLS = 2;
10000
10000
  const DIRTY_SPAN_MAX_PER_ROW = 12;
10001
10001
  const DIRTY_SPAN_FULL_ROW_THRESHOLD = .7;
@@ -11857,7 +11857,7 @@ function createStdoutRenderer(terminal, options) {
11857
11857
  let rowsToRender = (() => {
11858
11858
  if (allowGraphicsOnlyWithoutBaseline) return [];
11859
11859
  if (forceFullRender || !fpPrevValid) return null;
11860
- if (!dirtyRows) return null;
11860
+ if (!dirtyRows) return anchorMode === "bottom" ? null : Array.from({ length: size.rows }, (_, y) => y);
11861
11861
  if (dirtyRows.length === 0) return [];
11862
11862
  const outRows = [];
11863
11863
  outRows.length = dirtyRows.length;
@@ -12197,8 +12197,6 @@ function createStdoutRenderer(terminal, options) {
12197
12197
  hiddenExplicitDirtyRows = null;
12198
12198
  if (isDebugEnabled()) getDebugLog().render(enableScrollRegions ? " Explicit scroll ops fell back to region repaint because previous fingerprints are unavailable" : " Explicit scroll ops fell back to region repaint because scroll regions are disabled");
12199
12199
  }
12200
- const denseDirtyRows = Boolean(rowsToRender && size.rows > 1 && rowsToRender.length >= size.rows * dirtyFullThreshold);
12201
- if (denseDirtyRows) rowsToRender = null;
12202
12200
  let profiledRowCount = rowsToRender ? rowsToRender.length : size.rows;
12203
12201
  const useScrollRegions = !terminalGraphicsBlockScrollRegions && enableScrollRegions && fpPrevValid && scrollRowsCandidate && scrollRowsCandidate.length >= 3 && !forceDirtyRowsRepaint && allowInferredScrollRegions;
12204
12202
  let scrollHandled = false;
@@ -12381,11 +12379,6 @@ function createStdoutRenderer(terminal, options) {
12381
12379
  scrollHandled = true;
12382
12380
  }
12383
12381
  }
12384
- if (!scrollHandled && denseDirtyRows && scrollRowsCandidate && useScrollRegions) {
12385
- rowsToRender = scrollRowsCandidate;
12386
- profiledRowCount = rowsToRender.length;
12387
- if (isDebugEnabled()) getDebugLog().render(` Dense dirty rows fell back to partial render: ${rowsToRender.length} rows`);
12388
- }
12389
12382
  if (scrollHandled) {} else if (!rowsToRender) {
12390
12383
  if (isDebugEnabled()) getDebugLog().render(` Full render: ${size.rows} rows`);
12391
12384
  for (let y = 0; y < size.rows; y++) {
@@ -13346,7 +13339,10 @@ function createStdoutRenderer(terminal, options) {
13346
13339
  capabilities: STDOUT_RENDERER_CAPABILITIES,
13347
13340
  graphicsCapabilities,
13348
13341
  render,
13349
- forceRender: () => render(void 0, true),
13342
+ forceRender: () => {
13343
+ fpPrevValid = false;
13344
+ render(void 0, true);
13345
+ },
13350
13346
  dispose,
13351
13347
  setCursor,
13352
13348
  showCursor,
@@ -1,9 +1,9 @@
1
1
  import "../create-terminal-Db_-UGVQ.js";
2
- import { intersectRect, translateRect, useLayout, useTerminal, useTerminalNode, useVisibility } from "../rect-JzWMJxxc.js";
3
- import "../frame-mailbox-DaTrfyaF.js";
2
+ import { intersectRect, translateRect, useLayout, useTerminal, useTerminalNode, useVisibility } from "../rect-Dfevd15m.js";
3
+ import "../frame-mailbox-6XHw-P8Q.js";
4
4
  import "../terminal-graphics-DpSL29OQ.js";
5
- import "../TAgentTerminalGraphic-B8-YZfuP.js";
6
- import { TVideo } from "../TVideo-D9AOiyq2.js";
5
+ import "../TAgentTerminalGraphic-BKDAoGoE.js";
6
+ import { TVideo } from "../TVideo-C3gnTlFD.js";
7
7
  import { computed, defineComponent, h, onBeforeUnmount, watch, watchEffect } from "vue";
8
8
 
9
9
  //#region src/vue/components/TBrowser.ts
@@ -938,6 +938,19 @@ function sliceByCellsRange(text, startCells, endCells, provider = currentTextWid
938
938
  out.push(g), cells = next;
939
939
  }), out.length ? out.join("") : "";
940
940
  }
941
+ function sliceByCellsRangeForSelection(text, startCells, endCells, provider = currentTextWidthProvider()) {
942
+ if (startCells = Math.max(0, Math.floor(startCells)), endCells = Math.max(0, Math.floor(endCells)), endCells <= startCells || !text)
943
+ return "";
944
+ if (hasAsciiFastPath(provider) && isAscii(text))
945
+ return text.slice(startCells, endCells);
946
+ let out = [], cells = 0;
947
+ return forEachGrapheme(text, (g) => {
948
+ let leadingCell = cells;
949
+ if (cells += charCellWidth(g, provider), leadingCell >= endCells)
950
+ return !1;
951
+ leadingCell >= startCells && out.push(g);
952
+ }), out.join("");
953
+ }
941
954
  function padEndByCells(text, width, provider = currentTextWidthProvider()) {
942
955
  width = Math.max(0, Math.floor(width));
943
956
  let cells = text && hasAsciiFastPath(provider) && isAscii(text) ? text.length : textCellWidth(text, provider);
@@ -1780,7 +1793,7 @@ var virtualListInstanceSeq = 0, TVirtualList = (0, import_vue9.defineComponent)(
1780
1793
  function textForSelectionRange(range) {
1781
1794
  let cols = Math.max(1, Math.floor(props.w));
1782
1795
  return terminalSelectionRowSpans(range, cols, itemCount.value).map((span) => {
1783
- let text = sliceByCellsRange(itemText(span.y), span.x0, span.x1);
1796
+ let text = sliceByCellsRangeForSelection(itemText(span.y), span.x0, span.x1);
1784
1797
  return span.x1 >= cols ? text.trimEnd() : text;
1785
1798
  }).join(`
1786
1799
  `);
@@ -6301,7 +6314,7 @@ var virtualRowsInstanceSeq = 0, EMPTY_RECT2 = Object.freeze({ x: 0, y: 0, w: 0,
6301
6314
  x1: span.x1,
6302
6315
  cols
6303
6316
  }) ?? ""
6304
- ) : sliceByCellsRange(itemText(span.y), span.x0, span.x1);
6317
+ ) : sliceByCellsRangeForSelection(itemText(span.y), span.x0, span.x1);
6305
6318
  return span.x1 >= cols ? text.trimEnd() : text;
6306
6319
  }).join(`
6307
6320
  `);
@@ -7039,7 +7052,7 @@ var TTranscriptView = (0, import_vue17.defineComponent)({
7039
7052
  let text = "";
7040
7053
  for (let segment of segments) {
7041
7054
  let start = Math.max(x0, segment.x0), end = Math.min(x1, segment.x1);
7042
- end <= start || !segment.selectable || (text += sliceByCellsRange(segment.text, start - segment.x0, end - segment.x0));
7055
+ end <= start || !segment.selectable || (text += sliceByCellsRangeForSelection(segment.text, start - segment.x0, end - segment.x0));
7043
7056
  }
7044
7057
  return text;
7045
7058
  }
@@ -7068,7 +7081,7 @@ var TTranscriptView = (0, import_vue17.defineComponent)({
7068
7081
  }
7069
7082
  function selectionTextForVisualRowSpan(ctx) {
7070
7083
  let visualRow = ctx.item;
7071
- return visualRow ? visualRow.selectionSegments.length ? textForSelectionSegments(visualRow.selectionSegments, ctx.x0, ctx.x1) : sliceByCellsRange(selectionTextForVisualRow(visualRow), ctx.x0, ctx.x1) : "";
7084
+ return visualRow ? visualRow.selectionSegments.length ? textForSelectionSegments(visualRow.selectionSegments, ctx.x0, ctx.x1) : sliceByCellsRangeForSelection(selectionTextForVisualRow(visualRow), ctx.x0, ctx.x1) : "";
7072
7085
  }
7073
7086
  return () => (0, import_vue17.h)(TVirtualRows, {
7074
7087
  ref: rowsRef,
@@ -9357,7 +9370,7 @@ var TLogView = (0, import_vue18.defineComponent)({
9357
9370
  function textForSelectionRange(range) {
9358
9371
  let cols = currentWrapWidth(), rows = estimatedVisualRowCount();
9359
9372
  return terminalSelectionRowSpans(range, cols, rows).map((span) => {
9360
- let text = sliceByCellsRange(textForVisualRow(span.y), span.x0, span.x1);
9373
+ let text = sliceByCellsRangeForSelection(textForVisualRow(span.y), span.x0, span.x1);
9361
9374
  return span.x1 >= cols ? text.trimEnd() : text;
9362
9375
  }).join(`
9363
9376
  `);
@@ -1,15 +1,15 @@
1
1
  import "./create-terminal-Db_-UGVQ.js";
2
2
  import { sanitizeTerminalHref } from "./hyperlink-clbb_ha_.js";
3
- import { EventZIndexContextKey, forEachTextCellSegment, intersectRect, sanitizeInlineText, sliceByCells, spaces, textCellWidth$1 as textCellWidth, translateRect, useLayout, useRenderNode, useTerminal, useTerminalNode, useVisibility } from "./rect-JzWMJxxc.js";
4
- import { mergeStyle } from "./linkify-CklfA1vp.js";
3
+ import { EventZIndexContextKey, forEachTextCellSegment, intersectRect, sanitizeInlineText, sliceByCells, spaces, textCellWidth$1 as textCellWidth, translateRect, useLayout, useRenderNode, useTerminal, useTerminalNode, useVisibility } from "./rect-Dfevd15m.js";
4
+ import { mergeStyle } from "./linkify-DF96jKWy.js";
5
5
  import "./frame-perf-CHpWhbC4.js";
6
6
  import "./terminal-selection-4W1SJj4c.js";
7
- import { TView } from "./frame-mailbox-DaTrfyaF.js";
7
+ import { TView } from "./frame-mailbox-6XHw-P8Q.js";
8
8
  import "./wheel-scroll-CQ22Hcyj.js";
9
9
  import "./terminal-graphics-DpSL29OQ.js";
10
- import { TLogLinksPanel, TLogMinimap, TLogScrollbar, TLogSearchBar, TLogSearchPager, TLogSearchResults, TLogView, TLogVirtualLinksPanel, TLogVirtualSearchResults, TTranscriptView, TVirtualList, createAppendOnlyLogStore, createTLogDensityBucketsFromMarkers, createTLogLevelPlugin, createTLogLineMatcherPlugin, createTLogLinkActionPlugin, createTLogOsc8LinkPlugin, createTLogUrlPlugin, detectTLogUrls, dispatchTLogPluginLinkAction, getTLogPluginMetadata, handleTLogKeymapEvent, matchesTLogKeyBinding, parseTLogAnnotatedText, resolveTLogLinksPanelTheme, resolveTLogMinimapTheme, resolveTLogScrollbarTheme, resolveTLogSearchBarTheme, resolveTLogSearchPagerTheme, resolveTLogSearchResultsTheme, resolveTLogViewTheme, stripTLogAnsiText, tlogDarkPreset, tlogDarkTheme, tlogDefaultKeymap, tlogDefaultPreset, tlogDefaultTheme, tlogHighContrastKeymap, tlogHighContrastPreset, tlogHighContrastTheme, toTLogExternalLinkFromVisibleLink, useTLogLinkController, useTLogRetainedIndex, useTLogSearchController, useTLogSearchResultsPage, useTLogVirtualSearchResults } from "./tlog-theme-BnILsD3n.js";
11
- import "./TAgentTerminalGraphic-B8-YZfuP.js";
12
- import { TVideo } from "./TVideo-D9AOiyq2.js";
10
+ import { TLogLinksPanel, TLogMinimap, TLogScrollbar, TLogSearchBar, TLogSearchPager, TLogSearchResults, TLogView, TLogVirtualLinksPanel, TLogVirtualSearchResults, TTranscriptView, TVirtualList, createAppendOnlyLogStore, createTLogDensityBucketsFromMarkers, createTLogLevelPlugin, createTLogLineMatcherPlugin, createTLogLinkActionPlugin, createTLogOsc8LinkPlugin, createTLogUrlPlugin, detectTLogUrls, dispatchTLogPluginLinkAction, getTLogPluginMetadata, handleTLogKeymapEvent, matchesTLogKeyBinding, parseTLogAnnotatedText, resolveTLogLinksPanelTheme, resolveTLogMinimapTheme, resolveTLogScrollbarTheme, resolveTLogSearchBarTheme, resolveTLogSearchPagerTheme, resolveTLogSearchResultsTheme, resolveTLogViewTheme, stripTLogAnsiText, tlogDarkPreset, tlogDarkTheme, tlogDefaultKeymap, tlogDefaultPreset, tlogDefaultTheme, tlogHighContrastKeymap, tlogHighContrastPreset, tlogHighContrastTheme, toTLogExternalLinkFromVisibleLink, useTLogLinkController, useTLogRetainedIndex, useTLogSearchController, useTLogSearchResultsPage, useTLogVirtualSearchResults } from "./tlog-theme-DKq1YOQF.js";
11
+ import "./TAgentTerminalGraphic-BKDAoGoE.js";
12
+ import { TVideo } from "./TVideo-C3gnTlFD.js";
13
13
  import { computed, defineComponent, h, inject, onBeforeUnmount, onUnmounted, ref, watch } from "vue";
14
14
 
15
15
  //#region src/vue/components/T3DViewport.ts
@@ -1,4 +1,4 @@
1
- import { EventZIndexContextKey, LayoutContextKey, RenderStackKey, intersectRect, padEndByCells$1 as padEndByCells, sanitizeInlineText, sanitizeTextBlock, sliceByCells, sliceByCellsRange, spaces, textCellWidth$1 as textCellWidth, translateRect, useLayout, useRenderNode, useRenderStack, useTerminal, useTerminalNode, useVisibility, wrapByCells } from "./rect-JzWMJxxc.js";
1
+ import { EventZIndexContextKey, LayoutContextKey, RenderStackKey, intersectRect, padEndByCells$1 as padEndByCells, sanitizeInlineText, sanitizeTextBlock, sliceByCells, sliceByCellsRange, spaces, textCellWidth$1 as textCellWidth, translateRect, useLayout, useRenderNode, useRenderStack, useTerminal, useTerminalNode, useVisibility, wrapByCells } from "./rect-Dfevd15m.js";
2
2
  import { computed, defineComponent, h, inject, provide, shallowReactive, watchEffect } from "vue";
3
3
 
4
4
  //#region src/vue/components/TText.ts
package/dist/index.cjs CHANGED
@@ -4942,7 +4942,7 @@ function createRenderManager(terminal, options = {}) {
4942
4942
  for (let node of nodes.values())
4943
4943
  addToRowBuckets(node);
4944
4944
  }
4945
- function shouldPromoteToFullPlaneDirty(dirtyRows, planeNodes) {
4945
+ function shouldScanFullPlane(dirtyRows, planeNodes) {
4946
4946
  return planeNodes > 1 && dirtyRows >= ROW_BUCKET_DIRTY_RATIO_MIN_ROWS && terminalRows > 0 && dirtyRows / terminalRows >= ROW_BUCKET_DIRTY_RATIO_FALLBACK && dirtyRows >= planeNodes * ROW_BUCKET_DIRTY_RATIO_FALLBACK;
4947
4947
  }
4948
4948
  function ensureRenderedRowsScratch() {
@@ -5194,12 +5194,7 @@ function createRenderManager(terminal, options = {}) {
5194
5194
  if (!state || !state.allRowsDirty && state.dirtyRowCount === 0)
5195
5195
  continue;
5196
5196
  let planeNodes = sortedNodesByPlane.get(plane) ?? [], isFullPlaneRepaint = state.allRowsDirty, rows = allRows;
5197
- if (!isFullPlaneRepaint && shouldPromoteToFullPlaneDirty(state.dirtyRowCount, planeNodes.length) && (isFullPlaneRepaint = !0, state.allRowsDirty = !0, rowBucketFallbacks.push({
5198
- plane,
5199
- reason: "dirty-ratio",
5200
- dirtyRows: state.dirtyRowCount,
5201
- planeNodes: planeNodes.length
5202
- })), !isFullPlaneRepaint) {
5197
+ if (!isFullPlaneRepaint) {
5203
5198
  dirtyRowsScratch.length = 0, rows = dirtyRowsScratch;
5204
5199
  let startY = Number.isFinite(state.dirtyMinY) ? state.dirtyMinY : 0, endY = state.dirtyMaxY;
5205
5200
  for (let y = startY; y <= endY; y++)
@@ -5211,6 +5206,13 @@ function createRenderManager(terminal, options = {}) {
5211
5206
  }
5212
5207
  resetPlaneRowsForRender(terminal, plane, isFullPlaneRepaint ? null : rows);
5213
5208
  let paintRows = isFullPlaneRepaint ? void 0 : rows, needsIntersectFilter = !1, candidateNodes = isFullPlaneRepaint ? planeNodes : (() => {
5209
+ if (shouldScanFullPlane(rows.length, planeNodes.length))
5210
+ return needsIntersectFilter = !0, rowBucketFallbacks.push({
5211
+ plane,
5212
+ reason: "dirty-ratio",
5213
+ dirtyRows: rows.length,
5214
+ planeNodes: planeNodes.length
5215
+ }), planeNodes;
5214
5216
  let marks = beginCandidateCollection(planeNodes), buckets = rowBuckets.get(plane);
5215
5217
  for (let y of rows) {
5216
5218
  let rowIds = buckets?.get(y);
package/dist/index.js CHANGED
@@ -2,17 +2,17 @@ import { createTerminal } from "./create-terminal-Db_-UGVQ.js";
2
2
  import "./ansi-palette-BHF1rN7R.js";
3
3
  import "./hyperlink-clbb_ha_.js";
4
4
  import { createDomRenderer } from "./dom-renderer-BfwAEQMf.js";
5
- import "./rect-JzWMJxxc.js";
6
- import { createTheme, linkifyTextSegments, tuiDefaultTheme } from "./linkify-CklfA1vp.js";
5
+ import "./rect-Dfevd15m.js";
6
+ import { createTheme, linkifyTextSegments, tuiDefaultTheme } from "./linkify-DF96jKWy.js";
7
7
  import "./runtime-Byf8XXOT.js";
8
8
  import "./frame-perf-CHpWhbC4.js";
9
9
  import "./trace-Bh8WnoMo.js";
10
10
  import "./env-Cl8qmNFN.js";
11
- import { TAutocompleteInput, TBadge, TCheckbox, TCode, TDataTable, TDivider, TFormField, TLink, TLinkifyText, TList, TPasswordInput, TRadioGroup, TSlider, TSwitch, TTable, TTag, TTree, TerminalProvider, createTInputHostPlugin } from "./TTree-1JP-PZ2T.js";
11
+ import { TAutocompleteInput, TBadge, TCheckbox, TCode, TDataTable, TDivider, TFormField, TLink, TLinkifyText, TList, TPasswordInput, TRadioGroup, TSlider, TSwitch, TTable, TTag, TTree, TerminalProvider, createTInputHostPlugin } from "./TTree-DqyzDB0h.js";
12
12
  import "./terminal-selection-4W1SJj4c.js";
13
13
  import "./debug-logger-CmsGI4of.js";
14
- import { TBox, TCommandPalette, TDialog, TInput, TSelect, computeCommandPaletteMatchRanges } from "./TSelect-C-WzsLAD.js";
15
- import { TText, TView } from "./frame-mailbox-DaTrfyaF.js";
14
+ import { TBox, TCommandPalette, TDialog, TInput, TSelect, computeCommandPaletteMatchRanges } from "./TSelect-CnBJET_C.js";
15
+ import { TText, TView } from "./frame-mailbox-6XHw-P8Q.js";
16
16
  import "./path-BI9W15Zt.js";
17
17
  import "./wheel-scroll-CQ22Hcyj.js";
18
18
 
@@ -1,5 +1,5 @@
1
1
  import { sanitizeDomHref } from "./hyperlink-clbb_ha_.js";
2
- import { injectionKey, padEndByCells$1 as padEndByCells, sanitizeInlineText, sliceByCells, textCellWidth$1 as textCellWidth } from "./rect-JzWMJxxc.js";
2
+ import { injectionKey, padEndByCells$1 as padEndByCells, sanitizeInlineText, sliceByCells, textCellWidth$1 as textCellWidth } from "./rect-Dfevd15m.js";
3
3
 
4
4
  //#region src/vue/theme.ts
5
5
  const tuiDefaultTheme = Object.freeze({