OpenTUI 0.5.10

npmGitHub release

Added

  • core: NativeImage.fromPixels(pixels, width, height, options?) creates an image from raw pixels. PixelImportOptions sets format, stride, alpha, and colorSpace. See NativeImage. (#1467)
  • core: NativeImagePool reuses native image buffers for frames of a fixed size. Use publishPixels() or publishRgba() to publish a frame and dispose() to release the pool. See NativeImage. (#1467)
  • core: CliRendererConfig.kittyImageTransport and renderer.kittyImageTransport select the Kitty image transport: "raw", "zlib", or "file". Raw is the default. File transport is opt-in and is used only on terminals that acknowledge image uploads. See Image. (#1467)
  • core: renderer.kittyImageTransportStatus reports the requested and effective transport, the file transport state, the fallback reason, and the pending bytes and files. renderer.cancelKittyImageTransport() cancels pending file transport. See Image. (#1467)
  • native: Release builds now publish .debug, .dSYM, and .pdb symbol files as separate GitHub Release assets. See Native crash debugging. (#1437)

Changed

  • core: Image streaming uses less CPU for frame preparation and transport. Pending frames are bounded when terminal output stalls. See Image. (#1467)
  • core: The renderer shows Kitty and Sixel images in scrollback before the footer is pinned, if the images fit above the pinned footer. They no longer fall back to blocks during startup and after a resize. See Renderer. (#1470)
  • core: ImageErrorCode includes "busy". See NativeImage. (#1467)
  • native: The npm packages ship stripped native libraries. The Linux library shrinks from about 26 MB to about 6 MB. Debug builds are unchanged. See Native crash debugging. (#1437)

Fixed

  • core: MarkdownRenderable keeps its response visible when streaming changes from true to false. Compatible top-level blocks are refreshed in place, not destroyed and recreated. See Markdown. (#1469)
  • core: The renderer retries the final automatic animation frame when threaded output rejects it under backpressure. Before, the previous frame stayed on screen. See Renderer. (#1457)
  • core: Image rendering no longer grows GPU resources on every frame or retains native handles during sustained rendering. See Image. (#1467)

API changes#

@opentui/core#

Added

  • class NativeImagePool
  • constructor NativeImagePool(options: NativeImagePoolOptions)
  • interface KittyImageTransportStatus
  • interface NativeImagePoolOptions
  • interface PixelImportOptions
  • method CliRenderer.cancelKittyImageTransport(): void
  • static method NativeImage.fromPixels(pixels: Uint8Array, width: number, height: number, options?: PixelImportOptions): NativeImage
  • property CliRenderer.kittyImageTransport: KittyImageTransport
  • readonly property CliRenderer.kittyImageTransportStatus: KittyImageTransportStatus
  • property CliRendererConfig.kittyImageTransport?: KittyImageTransport
  • property RenderLib.cancelKittyImageTransport: (renderer: RendererHandle, failed: boolean) => void
  • property RenderLib.getKittyImageTransport: (renderer: RendererHandle) => Uint32Array
  • property RenderLib.imageCreateFromPixels: (pixels: Uint8Array, width: number, height: number, stride: number, format: number, alpha: number) => { status: number; handle: ImageHandle | null; }
  • property RenderLib.imageUpdatePixels: (image: ImageHandle, pixels: Uint8Array, stride: number, format: number, alpha: number) => number
  • property RenderLib.pollKittyImageTransport: (renderer: RendererHandle) => boolean
  • property RenderLib.processKittyImageReply: (renderer: RendererHandle, response: string) => number
  • property RenderLib.setKittyImageTransport: (renderer: RendererHandle, mode: number) => boolean
  • type KittyImageTransport = "raw" | "zlib" | "file"

Changed

  • property RenderLib.commitSplitFooterSnapshot: (renderer: RendererHandle, snapshot: OptimizedBuffer, rowColumns: number, startOnNewLine: boolean, trailingNewline: boolean, pinnedRenderOffset: number, force: boolean, beginFrame?: boolean, finalizeFrame?: boolean) => NativeRenderOperationResultproperty RenderLib.commitSplitFooterSnapshot: (renderer: RendererHandle, snapshot: OptimizedBuffer, rowColumns: number, startOnNewLine: boolean, trailingNewline: boolean, pinnedRenderOffset: number, force: boolean, beginFrame?: boolean, finalizeFrame?: boolean, controlOutput?: boolean) => NativeRenderOperationResult
  • type ImageErrorCode = "invalid-handle" | "unsupported-format" | "unsupported-color-space" | "malformed-data" | "dimension-limit" | "memory-limit" | "invalid-argument" | "out-of-memory" | "output-too-small" | "internal-error" | "unsupported-feature"type ImageErrorCode = "invalid-handle" | "unsupported-format" | "unsupported-color-space" | "malformed-data" | "dimension-limit" | "memory-limit" | "invalid-argument" | "out-of-memory" | "output-too-small" | "internal-error" | "unsupported-feature" | "busy"