@simon_he/vue-tui 1.0.1 → 1.1.1

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 (107) hide show
  1. package/README.md +99 -46
  2. package/dist/TMermaidText-CXm_L969.js +885 -0
  3. package/dist/{TSelect-HzILuti9.js → TSelect-CiyMvwl-.js} +60 -81
  4. package/dist/{TTree-ChOot2Bh.js → TTree-DKGiuIcM.js} +140 -103
  5. package/dist/agent/mermaid.cjs +2 -0
  6. package/dist/agent/mermaid.d.cts +2 -0
  7. package/dist/agent/mermaid.d.ts +2 -0
  8. package/dist/agent/mermaid.js +1 -0
  9. package/dist/agent.cjs +31184 -24907
  10. package/dist/agent.d.cts +11 -1
  11. package/dist/agent.d.ts +11 -1
  12. package/dist/agent.js +1700 -13
  13. package/dist/block-source-5CQp4tF8.js +3230 -0
  14. package/dist/cli/stdin-buffer.d.ts +1 -1
  15. package/dist/cli.cjs +5363 -6178
  16. package/dist/cli.d.cts +5 -1
  17. package/dist/cli.d.ts +5 -1
  18. package/dist/cli.js +3569 -302
  19. package/dist/core/buffer/buffer.d.ts +2 -2
  20. package/dist/core/buffer/eaw-ranges-unicode-17.d.ts +14 -0
  21. package/dist/core/perf/instrumentation-noop.d.ts +48 -0
  22. package/dist/core/perf/instrumentation.d.ts +136 -0
  23. package/dist/core/terminal/create-terminal.d.ts +1 -0
  24. package/dist/core/types.d.ts +0 -4
  25. package/dist/core.cjs +851 -1462
  26. package/dist/core.js +6 -6
  27. package/dist/{create-terminal-C2oiWFJU.js → create-terminal-DXuZ2fci.js} +54 -19
  28. package/dist/debug-logger-ChY_PXVk.js +74 -0
  29. package/dist/{dom-renderer-BqGijQID.js → dom-renderer-DNzmg2As.js} +2 -2
  30. package/dist/experimental.cjs +4115 -5928
  31. package/dist/experimental.d.cts +2 -0
  32. package/dist/experimental.d.ts +2 -0
  33. package/dist/experimental.js +1490 -9
  34. package/dist/frame-perf-BBhE-iuS.js +111 -0
  35. package/dist/{sgr-BmzxEjAO.js → hyperlink-B35-O-cW.js} +100 -1
  36. package/dist/index.cjs +5025 -10332
  37. package/dist/index.js +16 -14
  38. package/dist/{linkify-D_gzn9Xq.js → linkify-CuuquMQT.js} +32 -3
  39. package/dist/markdown.cjs +21295 -12691
  40. package/dist/markdown.d.cts +1 -1
  41. package/dist/markdown.d.ts +1 -1
  42. package/dist/markdown.js +211 -51
  43. package/dist/mermaid-CWto52Wk.js +123 -0
  44. package/dist/mermaid.cjs +1707 -0
  45. package/dist/mermaid.d.cts +3 -0
  46. package/dist/mermaid.d.ts +3 -0
  47. package/dist/mermaid.js +6 -0
  48. package/dist/observability/frame-perf-store.d.ts +2 -1
  49. package/dist/observability/frame-perf.d.ts +33 -0
  50. package/dist/observability.cjs +106 -107
  51. package/dist/observability.d.cts +2 -2
  52. package/dist/observability.d.ts +2 -2
  53. package/dist/observability.js +3 -3
  54. package/dist/{path-suggest-BNqcuE3-.js → path-suggest-fPzRsgPv.js} +1 -1
  55. package/dist/{wheel-scroll-vBRaQ7p-.js → rect-Ng-3eKzF.js} +253 -117
  56. package/dist/renderer/cli/index.d.ts +1 -1
  57. package/dist/renderer/cli/stdout-metrics.d.ts +10 -0
  58. package/dist/renderer/cli/stdout-renderer.d.ts +53 -7
  59. package/dist/renderer/terminal-graphic-render-queue.d.ts +50 -0
  60. package/dist/renderer/terminal-graphics-trace.d.ts +53 -0
  61. package/dist/renderer/terminal-graphics.d.ts +146 -0
  62. package/dist/renderer-dom.cjs +364 -903
  63. package/dist/renderer-dom.js +4 -4
  64. package/dist/runtime/index.d.ts +2 -0
  65. package/dist/{runtime-rfcZCyJq.js → runtime-D77C03RM.js} +28 -15
  66. package/dist/runtime.cjs +427 -889
  67. package/dist/runtime.js +2 -2
  68. package/dist/{terminal-selection-DBinO6p5.js → terminal-selection-CQYr--26.js} +4 -1
  69. package/dist/{tlog-theme-CvLFNMwk.js → tlog-theme-CopRt9SC.js} +37 -6
  70. package/dist/{trace-CjzYeIxN.js → trace-CYHDKM1m.js} +5 -0
  71. package/dist/vue/agent/create-png-terminal-graphic-renderer.d.ts +19 -0
  72. package/dist/vue/components/TAgentTerminalGraphic.d.ts +481 -0
  73. package/dist/vue/components/TCharts.d.ts +1121 -0
  74. package/dist/vue/components/TFeedback.d.ts +1 -1
  75. package/dist/vue/components/TFlex.d.ts +389 -0
  76. package/dist/vue/components/TForm.d.ts +4 -4
  77. package/dist/vue/components/TLogSearchBar.d.ts +3 -3
  78. package/dist/vue/components/TLogSearchPager.d.ts +2 -2
  79. package/dist/vue/components/TMarkdownText.d.ts +162 -4
  80. package/dist/vue/components/TMermaidText.d.ts +900 -0
  81. package/dist/vue/components/TVirtualList.d.ts +9 -0
  82. package/dist/vue/components/TVirtualMarkdown.d.ts +170 -9
  83. package/dist/vue/components/TVirtualRows.d.ts +9 -0
  84. package/dist/vue/components/TerminalProvider.d.ts +2 -0
  85. package/dist/vue/context.d.ts +24 -0
  86. package/dist/vue/index.d.ts +5 -0
  87. package/dist/vue/layout/flex.d.ts +67 -0
  88. package/dist/vue/markdown/ast.d.ts +5 -2
  89. package/dist/vue/markdown/document.d.ts +5 -0
  90. package/dist/vue/markdown/image-actions.d.ts +14 -0
  91. package/dist/vue/markdown/image.d.ts +11 -0
  92. package/dist/vue/markdown/link-actions.d.ts +14 -0
  93. package/dist/vue/markdown/math-actions.d.ts +14 -0
  94. package/dist/vue/markdown/math.d.ts +6 -0
  95. package/dist/vue/markdown/render.d.ts +28 -0
  96. package/dist/vue/markdown/types.d.ts +78 -0
  97. package/dist/vue/mermaid/beautiful-mermaid.d.ts +1436 -0
  98. package/dist/vue/render/render-manager.d.ts +7 -0
  99. package/dist/vue.cjs +7215 -12430
  100. package/dist/vue.js +706 -39
  101. package/dist/wheel-scroll-CQ22Hcyj.js +106 -0
  102. package/dist/{hyperlink-Bn02UXJb.js → width-GqllnV8C.js} +166 -111
  103. package/package.json +107 -18
  104. package/dist/block-source-CKUOnkgT.js +0 -1663
  105. package/dist/frame-perf-C6Xfg85O.js +0 -24
  106. /package/dist/{env-Cl8qmNFN.js → env-DNCzvX8b.js} +0 -0
  107. /package/dist/{path-mnSgEpCm.js → path-BI9W15Zt.js} +0 -0
package/dist/core.js CHANGED
@@ -1,10 +1,10 @@
1
- import { TERMINAL_RENDER_PLANES, createTerminal } from "./create-terminal-C2oiWFJU.js";
2
- import { charCellWidth, isSafeRelativeHref, sanitizeDomHref, sanitizeTerminalHref } from "./hyperlink-Bn02UXJb.js";
3
- import { parseAnsiSgr } from "./sgr-BmzxEjAO.js";
1
+ import { TERMINAL_RENDER_PLANES, createTerminal } from "./create-terminal-DXuZ2fci.js";
2
+ import { charCellWidth } from "./width-GqllnV8C.js";
3
+ import { isSafeRelativeHref, parseAnsiSgr, sanitizeDomHref, sanitizeTerminalHref } from "./hyperlink-B35-O-cW.js";
4
4
  import { ansiColorRgb } from "./ansi-palette-CNXqFciC.js";
5
- import { firstNonEmptyEnv } from "./env-Cl8qmNFN.js";
6
- import { normalizeNewlines } from "./path-mnSgEpCm.js";
7
- import { parsePathQuery, resolveUserPath, suggestParentHint, suggestPaths } from "./path-suggest-BNqcuE3-.js";
5
+ import { firstNonEmptyEnv } from "./env-DNCzvX8b.js";
6
+ import { normalizeNewlines } from "./path-BI9W15Zt.js";
7
+ import { parsePathQuery, resolveUserPath, suggestParentHint, suggestPaths } from "./path-suggest-fPzRsgPv.js";
8
8
 
9
9
  //#region src/core/ansi/colors.ts
10
10
  const ANSI8_COLOR_NAMES = Object.freeze([
@@ -1,5 +1,5 @@
1
- import { charCellWidth, segmentedGraphemes } from "./hyperlink-Bn02UXJb.js";
2
- import { parseAnsiSgr } from "./sgr-BmzxEjAO.js";
1
+ import { charCellWidth, segmentedGraphemes } from "./width-GqllnV8C.js";
2
+ import { parseAnsiSgr } from "./hyperlink-B35-O-cW.js";
3
3
 
4
4
  //#region src/core/render-plane.ts
5
5
  const TERMINAL_RENDER_PLANES = [
@@ -106,14 +106,14 @@ function clamp(n, min, max) {
106
106
  return Math.max(min, Math.min(max, n));
107
107
  }
108
108
  /**
109
- * Register a fingerprint function on the buffer. This enables SoA fingerprint
109
+ * Register or clear a fingerprint function on the buffer. This enables SoA fingerprint
110
110
  * pre-computation: cell writes will update fingerprints inline, and the renderer
111
111
  * can read them via getRowFingerprints() instead of per-cell hash computation.
112
112
  */
113
113
  function setFingerprintFn(buffer, fn) {
114
114
  buffer.fingerprintFn = fn;
115
115
  const len = buffer.rows * buffer.cols;
116
- if (!len) {
116
+ if (!fn || !len) {
117
117
  buffer.soaFingerprints = null;
118
118
  return;
119
119
  }
@@ -134,7 +134,10 @@ function setFingerprintFn(buffer, fn) {
134
134
  */
135
135
  function getRowFingerprints(buffer, y) {
136
136
  if (!buffer.soaFingerprints) return null;
137
- const physY = physicalRowIndex(buffer, y);
137
+ if (buffer.rows <= 0 || buffer.cols <= 0) return null;
138
+ const yy = Math.floor(y);
139
+ if (!Number.isFinite(yy) || yy < 0 || yy >= buffer.rows) return null;
140
+ const physY = physicalRowIndex(buffer, yy);
138
141
  const base = physY * buffer.cols;
139
142
  return buffer.soaFingerprints.subarray(base, base + buffer.cols);
140
143
  }
@@ -424,9 +427,12 @@ function resizeBuffer(buffer, cols, rows) {
424
427
  const nextCols = Math.max(0, Math.floor(cols));
425
428
  const nextRows = Math.max(0, Math.floor(rows));
426
429
  if (nextCols === buffer.cols && nextRows === buffer.rows) return;
430
+ const prevRows = buffer.rows;
431
+ const prevDirtyAll = buffer.dirtyAll;
432
+ const prevDirtyBits = buffer.dirtyBits;
427
433
  const blank = createBlankCell();
428
434
  const nextGrid = Array.from({ length: nextRows }, () => Array.from({ length: nextCols }, () => blank));
429
- const copyRows = Math.min(buffer.rows, nextRows);
435
+ const copyRows = Math.min(prevRows, nextRows);
430
436
  const copyCols = Math.min(buffer.cols, nextCols);
431
437
  for (let y = 0; y < copyRows; y++) {
432
438
  const src = getBufferRow(buffer, y);
@@ -450,10 +456,21 @@ function resizeBuffer(buffer, cols, rows) {
450
456
  buffer.cols = nextCols;
451
457
  buffer.rows = nextRows;
452
458
  buffer.dirtyBits = new Uint8Array(nextRows);
453
- buffer.dirtyCount = nextRows || 0;
454
- buffer.dirtyMin = nextRows ? 0 : Number.POSITIVE_INFINITY;
455
- buffer.dirtyMax = nextRows ? nextRows - 1 : -1;
456
- buffer.dirtyAll = nextRows > 0;
459
+ buffer.dirtyCount = 0;
460
+ buffer.dirtyMin = Number.POSITIVE_INFINITY;
461
+ buffer.dirtyMax = -1;
462
+ buffer.dirtyAll = prevDirtyAll && nextRows > 0;
463
+ if (buffer.dirtyAll) {
464
+ buffer.dirtyCount = nextRows;
465
+ buffer.dirtyMin = 0;
466
+ buffer.dirtyMax = nextRows - 1;
467
+ } else for (let y = 0; y < copyRows; y++) {
468
+ if (prevDirtyBits[y] !== 1) continue;
469
+ buffer.dirtyBits[y] = 1;
470
+ buffer.dirtyCount++;
471
+ if (y < buffer.dirtyMin) buffer.dirtyMin = y;
472
+ if (y > buffer.dirtyMax) buffer.dirtyMax = y;
473
+ }
457
474
  buffer.cursorX = clamp(buffer.cursorX, 0, Math.max(0, nextCols));
458
475
  buffer.cursorY = clamp(buffer.cursorY, 0, Math.max(0, nextRows - 1));
459
476
  if (buffer.fingerprintFn) {
@@ -526,6 +543,10 @@ function mergePlanes(prev, next) {
526
543
  return Array.from(merged);
527
544
  }
528
545
  const TERMINAL_PLANE_INTERNALS = Symbol.for("@simon_he/vue-tui:v1:terminal-plane-internals");
546
+ const TERMINAL_ROOT = Symbol.for("@simon_he/vue-tui:v1:terminal-root");
547
+ function getRootTerminal(terminal) {
548
+ return terminal[TERMINAL_ROOT] ?? terminal;
549
+ }
529
550
  function createCoverage(cols, rows) {
530
551
  return Array.from({ length: rows }, () => new Uint8Array(cols));
531
552
  }
@@ -609,6 +630,8 @@ function markPlaneCoverageRange(state, x0, y0, x1, y1, value) {
609
630
  }
610
631
  }
611
632
  function markPlaneCoverageForPut(state, x, y, ch, prevCell) {
633
+ if (!Number.isSafeInteger(x) || !Number.isSafeInteger(y)) return;
634
+ if (x < 0 || x >= state.buffer.cols || y < 0 || y >= state.buffer.rows) return;
612
635
  const row = state.coverage[y];
613
636
  if (!row) return;
614
637
  if (prevCell?.continuation && x > 0) row[x - 1] = 1;
@@ -724,10 +747,14 @@ function createTerminal(opts) {
724
747
  }
725
748
  function putForPlane(plane, x, y, ch, style) {
726
749
  const state = getPlaneState(plane);
727
- if (y < 0 || y >= state.buffer.rows || x < 0 || x >= state.buffer.cols) return;
728
- const prevCell = getBufferCell(state.buffer, x, y);
729
- putCell(state.buffer, x, y, ch, style);
730
- markPlaneCoverageForPut(state, x, y, ch, prevCell);
750
+ if (typeof x !== "number" || typeof y !== "number") return;
751
+ const cellX = Math.floor(x);
752
+ const cellY = Math.floor(y);
753
+ if (!Number.isFinite(cellX) || !Number.isFinite(cellY)) return;
754
+ if (cellY < 0 || cellY >= state.buffer.rows || cellX < 0 || cellX >= state.buffer.cols) return;
755
+ const prevCell = getBufferCell(state.buffer, cellX, cellY);
756
+ putCell(state.buffer, cellX, cellY, ch, style);
757
+ markPlaneCoverageForPut(state, cellX, cellY, ch, prevCell);
731
758
  }
732
759
  function writeAtForPlane(plane, text, x, y, style) {
733
760
  const state = getPlaneState(plane);
@@ -1219,13 +1246,18 @@ function createTerminal(opts) {
1219
1246
  },
1220
1247
  setFingerprintFn(fn) {
1221
1248
  assertNotDisposed();
1222
- base.setFingerprintFn(fn);
1249
+ const state = getPlaneState(plane);
1250
+ setFingerprintFn(state.buffer, fn);
1223
1251
  },
1224
1252
  getRowFingerprints(y) {
1225
1253
  assertNotDisposed();
1226
- return base.getRowFingerprints(y);
1254
+ const yy = Math.floor(y);
1255
+ const state = getPlaneState(plane);
1256
+ if (!Number.isFinite(yy) || yy < 0 || yy >= state.buffer.rows) throw new RangeError("Row out of bounds");
1257
+ return getRowFingerprints(state.buffer, yy);
1227
1258
  }
1228
1259
  };
1260
+ api[TERMINAL_ROOT] = base;
1229
1261
  planeTerminals.set(plane, api);
1230
1262
  return api;
1231
1263
  }
@@ -1307,7 +1339,7 @@ function createTerminal(opts) {
1307
1339
  const rows = collectAndClearDirtyRows(state.buffer);
1308
1340
  if (rows === null) {
1309
1341
  composeAllRows = true;
1310
- break;
1342
+ continue;
1311
1343
  }
1312
1344
  for (const y of rows) dirtyRows.add(y);
1313
1345
  }
@@ -1397,7 +1429,9 @@ function createTerminal(opts) {
1397
1429
  },
1398
1430
  getRowFingerprints(y) {
1399
1431
  assertNotDisposed();
1400
- return getRowFingerprints(compositeBuffer, y);
1432
+ const yy = Math.floor(y);
1433
+ if (!Number.isFinite(yy) || yy < 0 || yy >= compositeBuffer.rows) throw new RangeError("Row out of bounds");
1434
+ return getRowFingerprints(compositeBuffer, yy);
1401
1435
  }
1402
1436
  };
1403
1437
  base[TERMINAL_PLANE_INTERNALS] = {
@@ -1427,8 +1461,9 @@ function createTerminal(opts) {
1427
1461
  scrollRowsForPlane(plane, startY, endY, lines);
1428
1462
  }
1429
1463
  };
1464
+ base[TERMINAL_ROOT] = base;
1430
1465
  return base;
1431
1466
  }
1432
1467
 
1433
1468
  //#endregion
1434
- export { TERMINAL_RENDER_PLANES, createTerminal, getPlaneTerminal, resetPlaneRowsForRender, scrollPlaneRows };
1469
+ export { TERMINAL_RENDER_PLANES, createTerminal, getPlaneTerminal, getRootTerminal, resetPlaneRowsForRender, scrollPlaneRows };
@@ -0,0 +1,74 @@
1
+ import { envFlag, envString } from "./env-DNCzvX8b.js";
2
+
3
+ //#region src/core/debug-logger.ts
4
+ const DEFAULT_LOG_FILE = "vue-tui-debug.log";
5
+ let debugFileWriter = null;
6
+ let debugLogDefaultPath = DEFAULT_LOG_FILE;
7
+ const initializedDebugLogPaths = new Set();
8
+ function getFileWriter() {
9
+ const writer = globalThis.__VT_DEBUG_FILE_WRITER__;
10
+ if (writer && typeof writer === "object") return writer;
11
+ return debugFileWriter;
12
+ }
13
+ function resolveDebugLogPath(env, fallback = DEFAULT_LOG_FILE) {
14
+ return envString(env, "VUE_TUI_DEBUG_LOG_PATH", "DIMCODE_DEBUG_LOG_PATH", fallback);
15
+ }
16
+ function debugLogPath() {
17
+ const env = globalThis.process?.env;
18
+ return resolveDebugLogPath(env, debugLogDefaultPath);
19
+ }
20
+ function safeJson(value) {
21
+ try {
22
+ return JSON.stringify(value);
23
+ } catch {
24
+ return "[unserializable]";
25
+ }
26
+ }
27
+ function createDebugLogger(enable = false) {
28
+ const enabled = enable;
29
+ const ensureHeader = () => {
30
+ if (!enabled) return;
31
+ const writer = getFileWriter();
32
+ if (!writer?.writeFileSync) return;
33
+ const path = debugLogPath();
34
+ if (initializedDebugLogPaths.has(path)) return;
35
+ try {
36
+ const data = `=== Vue TUI Debug Log Started at ${new Date().toISOString()} ===\n\n`;
37
+ writer.writeFileSync(path, data);
38
+ initializedDebugLogPaths.add(path);
39
+ } catch {}
40
+ };
41
+ const write = (data) => {
42
+ if (!enabled) return;
43
+ ensureHeader();
44
+ try {
45
+ getFileWriter()?.appendFileSync?.(debugLogPath(), data);
46
+ } catch {}
47
+ };
48
+ const log = (category, message) => {
49
+ if (!enabled) return;
50
+ const timestamp = new Date().toISOString().split("T")[1].slice(0, -1);
51
+ write(`[${timestamp}] ${category} ${message}\n`);
52
+ };
53
+ ensureHeader();
54
+ return {
55
+ render: (message) => log("[RENDER]", message),
56
+ stream: (message) => log("[STREAM]", message),
57
+ error: (message, ...args) => {
58
+ if (!enabled) return;
59
+ const timestamp = new Date().toISOString().split("T")[1].slice(0, -1);
60
+ const fullMessage = `[${timestamp}] [ERROR] ${message}${args.length ? ` ${safeJson(args)}` : ""}`;
61
+ write(`${fullMessage}\n`);
62
+ }
63
+ };
64
+ }
65
+ /**
66
+ * Check if debug logging is enabled via environment variable
67
+ */
68
+ function isDebugEnabled() {
69
+ const env = globalThis.process?.env;
70
+ return envFlag(env, "VUE_TUI_DEBUG", "DIMCODE_DEBUG") || env?.DEBUG === "1";
71
+ }
72
+
73
+ //#endregion
74
+ export { createDebugLogger, isDebugEnabled };
@@ -1,5 +1,5 @@
1
- import { TERMINAL_RENDER_PLANES, getPlaneTerminal } from "./create-terminal-C2oiWFJU.js";
2
- import { sanitizeDomHref } from "./hyperlink-Bn02UXJb.js";
1
+ import { TERMINAL_RENDER_PLANES, getPlaneTerminal } from "./create-terminal-DXuZ2fci.js";
2
+ import { sanitizeDomHref } from "./hyperlink-B35-O-cW.js";
3
3
  import { ansiColorHex, ansiCssVar, installAnsiPaletteCssVars, isAnsiColorName } from "./ansi-palette-CNXqFciC.js";
4
4
 
5
5
  //#region src/renderer/capabilities.ts