build(deps): bump @opentui/core from 0.8.1 to 0.8.3
Bumps @opentui/core from 0.8.1 to 0.8.3.
Release notes
Sourced from @​opentui/core's releases.
Release v0.8.3
Over ssh, sshd drops
COLORTERM. A terminal that draws 24-bit color but sendsTERM=xterm-256colorwithoutCOLORTERMtherefore got every color mapped to the 256-color palette. In WezTerm and xterm over ssh, a navy#23344bturned into a gray#3a3a3a. In 0.8.2, only a kitty XTVERSION reply turned on 24-bit color. In 0.8.3, whenCOLORTERMdoes not settle the question, the startup queries also ask XTGETTCAPRGBandTc. A positive reply turns on 24-bit color. So does an XTVERSION reply from Ghostty, WezTerm, foot, XTerm, iTerm2, or tmux, because tmux converts 24-bit colors for its client itself. The replies come back through ssh, so this works withoutCOLORTERM. Inside GNU Screen, OpenTUI sends neither query, because Screen drops 24-bit colors and prints the query bodies as text. When nothing answers, the oldTERMrule still applies. Alacritty and mosh answer none of these queries, so they still needCOLORTERM=truecolor.The width method decides how many cells an emoji sequence takes. When OpenTUI picks a different method than the terminal uses, the line overflows or leaves gaps. Before, OpenTUI kept the unicode method in terminals that do not report mode 2027, even though many of them draw a sequence one code point at a time. tmux 3.6 and later draws a sequence as one cluster but got wcwidth. An inherited
TERM_PROGRAM=ghosttyalso forced unicode-wide in other terminals. Now the method comes from one place, with the strongest evidence first:
OPENTUI_FORCE_*, also over SSH.- The multiplexer.
- The DECRPM 2027 reply. An unrecognized or permanently reset mode means wcwidth, except in kitty and iTerm2.
- XTVERSION.
- The environment, where
TERMwins over an inheritedTERM_PROGRAM.
Terminal Before After Alacritty, xterm, urxvt, GNOME Terminal, VS Code, Zellij, foot (wcswidth) unicode wcwidth tmux 3.6+ wcwidth unicode kitty started from Ghostty unicode-wide unicode Ghostty over SSH, libghostty unicode unicode-wide No method matches tmux when
variation-selector-always-wideis off. Unicode is the closest. If the new choice is wrong for your terminal, setOPENTUI_FORCE_UNICODEorOPENTUI_FORCE_WCWIDTH. These settings still win.Before this release, a host that started an unmodified OpenTUI app could not easily make it load a different native build.
setRenderLibPath()needs code, andOTUI_ASSET_ROOTneeds the whole asset tree under one root.OPENTUI_LIB_PATHnames one library file, under both Bun and Node:OPENTUI_LIB_PATH=../opentui/packages/native/lib/x86_64-linux/libopentui.so bun run src/index.tsA relative path resolves against the working directory.
setRenderLibPath()takes precedence over the variable, and the variable takes precedence overOTUI_ASSET_ROOTand the platform package. If the file is missing or does not load, the error names the variable. Core now also checks the context ABI version when it loads a library, so a library built for another context ABI fails at load and not at a later call.A host that embeds a terminal often has to know where the terminal's view is. For example, it can pass an unused wheel step to an outer scroll view or draw a scrollbar. Counting scroll steps does not give the answer. Output and resizes keep the view on its history rows, a scrollback clear jumps to the live screen, and the alternate screen has no history.
EmbeddedTerminalRenderable.getScroll()reads the current view from the emulator, including the moves that the emulator makes on its own:function scrollStatus(terminal: EmbeddedTerminalRenderable): string { const { offset, total, visible } = terminal.getScroll() if (offset === 0) return "live" return `${offset} of ${total - visible} rows back` }C and Rust hosts get two changes. First, the
@opentui/core-<platform>packages now ship theopentui.hthat their library was built from. Before, a binding that took the library from npm had no matching header. Second,opentui.hnow declares the audio engine. Before, a host could bind it only by copying Zig signatures. WithOT_AUDIO_START_NO_DEVICE, the engine mixes only when the host callsot_audio_mix, so tests can play sounds without a device. Voice IDs now carry a generation. An old ID no longer stops a new sound that reused its slot.Added
- core:
EmbeddedTerminalRenderable.getScroll()returns the view'soffsetfrom the live screen, thetotalrows, and thevisiblerows. See Embedded terminal. (#1934)- core:
OPENTUI_LIB_PATHnames a native library file. Under Bun and Node, Core loads it instead of theOTUI_ASSET_ROOTcopy or the platform package.setRenderLibPath()takes precedence over the variable. See Environment variables. (#1933)- native:
ot_embedded_terminal_scrollbar_getfills anot_embedded_terminal_scrollbarrecord with the offset from the live screen, the total rows, and the visible rows. See Embedded terminal. (#1934)- native:
opentui.hdeclares nineot_audio_*functions that address an audio engine byot_handleand returnot_status. With theOT_AUDIO_START_NO_DEVICEflag,ot_audio_startopens no device, and the engine mixes only inot_audio_mix. See C. (#1935)- native: The
@opentui/core-<platform>packages include theopentui.hthat the library was built from. On Windows, they also includeopentui.lib. See C. (#1932)- native: The
OT_INPUT_KEY_TYPEDkey flag marks a key whose code is a printable character that the terminal sent as text or as a CSI 27 code. See Keyboard input. (#1919)Changed
... (truncated)
Commits
b9e9d46Release v0.8.36adfa20native: ask the terminal for 24-bit color before falling back (#1941)e4ad586native: export the audio engine in opentui.h (#1935)cd23e75native: report the embedded terminal viewport (#1934)d8e5461core: load the native library from OPENTUI_LIB_PATH (#1933)2c01742core: ship opentui.h in the platform packages (#1932)6f14d3anative: measure a width within Yoga's tolerance of a cell as that cell (#1926)308cd00native: choose the width method from DECRPM 2027 and XTVERSION (#1920)5453279native: tell typed private-use characters from functional keys (#1919)82b3710native: keep the first resize across hook republishes (#1918)- Additional commits viewable in compare view
Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR:
@dependabot rebasewill rebase this PR@dependabot recreatewill recreate this PR, overwriting any edits that have been made to it@dependabot show <dependency name> ignore conditionswill show all of the ignore conditions of the specified dependency@dependabot ignore this major versionwill close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)@dependabot ignore this minor versionwill close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)@dependabot ignore this dependencywill close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Summary by cubic
Updates @opentui/core from 0.8.1 to 0.8.3 in packages/opencode. This patch release fixes 24-bit color detection over SSH, where terminals without COLORTERM previously fell back to the 256-color palette, and improves wide-character width measurement so emoji layout matches what terminals actually render. It also adds a getScroll() API for embedded terminals and an OPENTUI_LIB_PATH env var for loading a specific native library, which are only relevant if the app starts using them.