@cascadetui/core 0.1.10 → 0.1.11

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/3d.js CHANGED
@@ -6,7 +6,7 @@ import {
6
6
  __export,
7
7
  __require,
8
8
  __toESM
9
- } from "./index-2pvbxs43.js";
9
+ } from "./index-gv8mtakv.js";
10
10
 
11
11
  // ../../node_modules/.bun/omggif@1.0.10/node_modules/omggif/omggif.js
12
12
  var require_omggif = __commonJS((exports) => {
@@ -10533,6 +10533,24 @@ registerEnvVar({
10533
10533
  type: "boolean",
10534
10534
  default: false
10535
10535
  });
10536
+ registerEnvVar({
10537
+ name: "CASCADE_TRACE_FFI_SLOW_MS",
10538
+ description: "Log slow FFI calls (>= threshold, in ms).",
10539
+ type: "number",
10540
+ default: 0
10541
+ });
10542
+ registerEnvVar({
10543
+ name: "CASCADE_TRACE_FFI_MAX_SAMPLES",
10544
+ description: "Max timing samples to keep per FFI symbol when CASCADE_TRACE_FFI is enabled.",
10545
+ type: "number",
10546
+ default: 5000
10547
+ });
10548
+ registerEnvVar({
10549
+ name: "CASCADE_TRACE_FRAME_BREAKDOWN",
10550
+ description: "Enable detailed frame timing breakdown (yoga, render tree, native, stdout write)",
10551
+ type: "boolean",
10552
+ default: false
10553
+ });
10536
10554
  registerEnvVar({
10537
10555
  name: "CASCADE_FORCE_WCWIDTH",
10538
10556
  description: "Use wcwidth for character width calculations",
@@ -11553,9 +11571,56 @@ function convertToDebugSymbols(symbols) {
11553
11571
  if (env.CASCADE_DEBUG_FFI && !globalFFILogWriter) {
11554
11572
  const now = new Date;
11555
11573
  const timestamp = now.toISOString().replace(/[:.]/g, "-").replace(/T/, "_").split("Z")[0];
11556
- const logFilePath = `ffi_otui_debug_${timestamp}.log`;
11574
+ const logFilePath = `ffi_cascade_debug_${timestamp}.log`;
11557
11575
  globalFFILogWriter = Bun.file(logFilePath).writer();
11558
11576
  }
11577
+ const slowThresholdMs = typeof env.CASCADE_TRACE_FFI_SLOW_MS === "number" ? env.CASCADE_TRACE_FFI_SLOW_MS : 0;
11578
+ const maxSamples = typeof env.CASCADE_TRACE_FFI_MAX_SAMPLES === "number" && env.CASCADE_TRACE_FFI_MAX_SAMPLES > 0 ? env.CASCADE_TRACE_FFI_MAX_SAMPLES : 5000;
11579
+ const formatArg = (arg) => {
11580
+ if (arg === null)
11581
+ return "null";
11582
+ if (arg === undefined)
11583
+ return "undefined";
11584
+ const t2 = typeof arg;
11585
+ if (t2 === "string")
11586
+ return JSON.stringify(arg.length > 200 ? arg.slice(0, 200) + "\u2026" : arg);
11587
+ if (t2 === "number" || t2 === "boolean" || t2 === "bigint")
11588
+ return String(arg);
11589
+ if (arg instanceof Uint8Array)
11590
+ return `Uint8Array(${arg.byteLength})`;
11591
+ if (arg instanceof ArrayBuffer)
11592
+ return `ArrayBuffer(${arg.byteLength})`;
11593
+ if (Array.isArray(arg))
11594
+ return `Array(${arg.length})`;
11595
+ if (t2 === "object") {
11596
+ const ctor = arg?.constructor?.name;
11597
+ if (ctor && ctor !== "Object")
11598
+ return ctor;
11599
+ try {
11600
+ const json = JSON.stringify(arg);
11601
+ if (typeof json === "string")
11602
+ return json.length > 200 ? json.slice(0, 200) + "\u2026" : json;
11603
+ } catch {
11604
+ return "Object";
11605
+ }
11606
+ return "Object";
11607
+ }
11608
+ return String(arg);
11609
+ };
11610
+ let slowWriter = null;
11611
+ const writeSlow = (line) => {
11612
+ if (slowThresholdMs <= 0)
11613
+ return;
11614
+ if (!slowWriter) {
11615
+ const now = new Date;
11616
+ const timestamp = now.toISOString().replace(/[:.]/g, "-").replace(/T/, "_").split("Z")[0];
11617
+ const slowFilePath = `ffi_cascade_slow_${timestamp}.log`;
11618
+ slowWriter = Bun.file(slowFilePath).writer();
11619
+ }
11620
+ const buffer = new TextEncoder().encode(line + `
11621
+ `);
11622
+ slowWriter.write(buffer);
11623
+ };
11559
11624
  const debugSymbols = {};
11560
11625
  let hasTracing = false;
11561
11626
  Object.entries(symbols).forEach(([key, value]) => {
@@ -11592,7 +11657,16 @@ function convertToDebugSymbols(symbols) {
11592
11657
  const start = performance.now();
11593
11658
  const result = originalFunc(...args);
11594
11659
  const end = performance.now();
11595
- globalTraceSymbols[key].push(end - start);
11660
+ const dt = end - start;
11661
+ const timings = globalTraceSymbols[key];
11662
+ timings.push(dt);
11663
+ if (timings.length > maxSamples) {
11664
+ timings.splice(0, timings.length - maxSamples);
11665
+ }
11666
+ if (slowThresholdMs > 0 && dt >= slowThresholdMs) {
11667
+ const argStr = args.map(formatArg).join(", ");
11668
+ writeSlow(`${new Date().toISOString()} ${key} ${dt.toFixed(2)}ms (${argStr})`);
11669
+ }
11596
11670
  return result;
11597
11671
  };
11598
11672
  }
@@ -11605,6 +11679,9 @@ function convertToDebugSymbols(symbols) {
11605
11679
  if (globalFFILogWriter) {
11606
11680
  globalFFILogWriter.end();
11607
11681
  }
11682
+ if (slowWriter) {
11683
+ slowWriter.end();
11684
+ }
11608
11685
  } catch (e) {}
11609
11686
  if (globalTraceSymbols) {
11610
11687
  const allStats = [];
@@ -11676,7 +11753,7 @@ function convertToDebugSymbols(symbols) {
11676
11753
  try {
11677
11754
  const now = new Date;
11678
11755
  const timestamp = now.toISOString().replace(/[:.]/g, "-").replace(/T/, "_").split("Z")[0];
11679
- const traceFilePath = `ffi_otui_trace_${timestamp}.log`;
11756
+ const traceFilePath = `ffi_cascade_trace_${timestamp}.log`;
11680
11757
  Bun.write(traceFilePath, output);
11681
11758
  } catch (e) {
11682
11759
  console.error("Failed to write FFI trace file:", e);
@@ -16593,6 +16670,9 @@ class CliRenderer extends EventEmitter9 {
16593
16670
  renderTime: 0,
16594
16671
  frameCallbackTime: 0
16595
16672
  };
16673
+ frameBreakdownBuffer = [];
16674
+ frameBreakdownMaxSize = 100;
16675
+ traceFrameBreakdown = env.CASCADE_TRACE_FRAME_BREAKDOWN;
16596
16676
  debugOverlay = {
16597
16677
  enabled: env.CASCADE_SHOW_STATS,
16598
16678
  corner: 3 /* bottomRight */
@@ -17666,6 +17746,16 @@ Captured output:
17666
17746
  if (this._logCrashReportsToConsole) {
17667
17747
  console.error(this.formatCrashReportForConsole(report));
17668
17748
  }
17749
+ if (this.traceFrameBreakdown && this.frameBreakdownBuffer.length > 0) {
17750
+ const breakdownDump = this.dumpFrameBreakdown();
17751
+ console.error(`
17752
+ ` + breakdownDump);
17753
+ report.recentEvents.push({
17754
+ timestamp: report.timestamp,
17755
+ type: "crash:frame_breakdown",
17756
+ payload: { breakdown: breakdownDump }
17757
+ });
17758
+ }
17669
17759
  this.emit("crash" /* CRASH */, report);
17670
17760
  return report;
17671
17761
  }
@@ -18013,6 +18103,26 @@ Captured output:
18013
18103
  }
18014
18104
  this.resolveIdleIfNeeded();
18015
18105
  }
18106
+ dumpFrameBreakdown() {
18107
+ if (this.frameBreakdownBuffer.length === 0) {
18108
+ return "No frame breakdown data recorded";
18109
+ }
18110
+ const lines = this.frameBreakdownBuffer.map((f, i) => {
18111
+ const time = new Date(f.timestamp).toISOString();
18112
+ return `[${i}] ${time} total=${f.totalMs.toFixed(2)}ms tree=${f.renderTreeMs.toFixed(2)}ms native=${f.nativeMs.toFixed(2)}ms callback=${f.frameCallbackMs.toFixed(2)}ms`;
18113
+ });
18114
+ const totals = this.frameBreakdownBuffer.map((f) => f.totalMs);
18115
+ const avgTotal = totals.reduce((a, b) => a + b, 0) / totals.length;
18116
+ const maxTotal = Math.max(...totals);
18117
+ const minTotal = Math.min(...totals);
18118
+ return [
18119
+ `=== Frame Breakdown (${this.frameBreakdownBuffer.length} frames) ===`,
18120
+ `Avg: ${avgTotal.toFixed(2)}ms, Max: ${maxTotal.toFixed(2)}ms, Min: ${minTotal.toFixed(2)}ms`,
18121
+ "",
18122
+ ...lines
18123
+ ].join(`
18124
+ `);
18125
+ }
18016
18126
  startRenderLoop() {
18017
18127
  if (!this._isRunning)
18018
18128
  return;
@@ -18086,6 +18196,21 @@ Captured output:
18086
18196
  }
18087
18197
  }
18088
18198
  const overallFrameTime = performance.now() - overallStart;
18199
+ if (this.traceFrameBreakdown) {
18200
+ const breakdown = {
18201
+ timestamp: Date.now(),
18202
+ yogaMs: 0,
18203
+ renderTreeMs,
18204
+ nativeMs,
18205
+ stdoutMs: 0,
18206
+ frameCallbackMs: this.renderStats.frameCallbackTime,
18207
+ totalMs: overallFrameTime
18208
+ };
18209
+ if (this.frameBreakdownBuffer.length >= this.frameBreakdownMaxSize) {
18210
+ this.frameBreakdownBuffer.shift();
18211
+ }
18212
+ this.frameBreakdownBuffer.push(breakdown);
18213
+ }
18089
18214
  if (traceEnabled) {
18090
18215
  trace.write(`trace.render.native ms=${nativeMs.toFixed(3)}`);
18091
18216
  trace.write(`trace.render.pipeline treeMs=${renderTreeMs.toFixed(3)} postMs=${postProcessMs.toFixed(3)} nativeMs=${nativeMs.toFixed(3)} frameMs=${overallFrameTime.toFixed(3)} animMs=${animationRequestTime.toFixed(3)}`);
@@ -18396,5 +18521,5 @@ Captured output:
18396
18521
 
18397
18522
  export { __toESM, __commonJS, __export, __require, Edge, Gutter, MeasureMode, exports_src, isValidBorderStyle, parseBorderStyle, BorderChars, getBorderFromSides, getBorderSides, borderCharsToArray, BorderCharArrays, nonAlphanumericKeys, parseKeypress, KeyEvent, PasteEvent, KeyHandler, InternalKeyHandler, RGBA, hexToRgb, rgbToHex, hsvToRgb, parseColor, fonts, measureText, getCharacterPositions, coordinateToCharacterIndex, renderFontToFrameBuffer, TextAttributes, ATTRIBUTE_BASE_BITS, ATTRIBUTE_BASE_MASK, getBaseAttributes, DebugOverlayCorner, createTextAttributes, attributesWithLink, getLinkId, visualizeRenderableTree, isStyledText, StyledText, stringToStyledText, black, red, green, yellow, blue, magenta, cyan, white, brightBlack, brightRed, brightGreen, brightYellow, brightBlue, brightMagenta, brightCyan, brightWhite, bgBlack, bgRed, bgGreen, bgYellow, bgBlue, bgMagenta, bgCyan, bgWhite, bold, italic, underline, strikethrough, dim, reverse, blink, fg, bg, link, t, hastToStyledText, LinearScrollAccel, MacOSScrollAccel, StdinBuffer, parseAlign, parseAlignItems, parseBoxSizing, parseDimension, parseDirection, parseDisplay, parseEdge, parseFlexDirection, parseGutter, parseJustify, parseLogLevel, parseMeasureMode, parseOverflow, parsePositionType, parseUnit, parseWrap, MouseParser, Selection, convertGlobalToLocalSelection, ASCIIFontSelectionHelper, envRegistry, registerEnvVar, clearEnvCache, generateEnvMarkdown, generateEnvColored, env, treeSitterToTextChunks, treeSitterToStyledText, addDefaultParsers, TreeSitterClient, DataPathsManager, getDataPaths, extToFiletype, pathToFiletype, main, getTreeSitterClient, ExtmarksController, createExtmarksController, TerminalPalette, createTerminalPalette, TextBuffer, SpanInfoStruct, LogLevel2 as LogLevel, setRenderLibPath, resolveRenderLib, OptimizedBuffer, h, isVNode, maybeMakeRenderable, wrapWithDelegates, instantiate, delegate, isValidPercentage, LayoutEvents, RenderableEvents, isRenderable, BaseRenderable, Renderable, RootRenderable, ANSI, defaultKeyAliases, mergeKeyAliases, mergeKeyBindings, getKeyBindingKey, buildKeyBindingsMap, capture, ConsolePosition, TerminalConsole, getObjectsInViewport, buildKittyKeyboardFlags, MouseEvent, MouseButton, createCliRenderer, CliRenderEvents, RendererControlState, CliRenderer };
18398
18523
 
18399
- //# debugId=5A054962FAF3B29C64756E2164756E21
18400
- //# sourceMappingURL=index-2pvbxs43.js.map
18524
+ //# debugId=D41C1FFE474972FF64756E2164756E21
18525
+ //# sourceMappingURL=index-gv8mtakv.js.map