Skip to content

RTerm v3.9.2

Choose a tag to compare

@DrOlu DrOlu released this 24 Sep 10:42
· 10 commits to main since this release

RTerm v3.9.2 — AI-Native Terminal App by Hyperspace Technologies

v3.9.2 (2026-09-24)

Fix: the bundled neuralOS engine shipped without its exec bit — every
neuralos_ask/neuralos_graph call in the desktop app died with
engine exited EACCES: (empty stderr).

Root cause chain: curl -o in the release workflow writes files with mode
0644 and the workflow never chmod'd them; electron-builder's extraResources
preserves that mode into the packaged app; and resolveEngine checked only
existence (F_OK), so the un-runnable bundled engine permanently shadowed
perfectly good alternatives (the shared cache, <instancesDir>/engine/needle).

Fixes, layered so this class of bug cannot recur:

  • resolveEngine now checks executability (X_OK), not existence. A
    present-but-unexecutable candidate is skipped (never a hard stop), so a
    broken bundle falls through to the next runnable engine.
  • One-shot chmod recovery: a 0644 engine we own is fixed in place
    (chmod 0755 + re-probe) instead of skipped — covers curl -o, zip/tar
    extraction, and copy flows that drop the exec bit.
  • EACCES at spawn time is named, with the fix in the message
    (engine not executable (path) — restore the exec bit (chmod +x) or set neuralos.engineBin/engineWeights) instead of the cryptic
    engine exited EACCES: with a trailing colon and no stderr.
  • Exhausted-path errors now explain every failure: when no candidate is
    usable, the error lists the found-but-not-executable paths alongside the
    auto-download failure, so operators see why every route was exhausted.
  • Release workflow chmods the downloaded engines on all 4 platforms and
    the verify steps now assert test -x (mac + Linux) so an un-runnable
    engine can never ship again.

Also fixed in the same review (all error-as-data, no thrown exceptions):

  • defaultExec preserved a real EACCES code but reported timeout kills
    (SIGTERM from our own timeout) as a generic exit 1 — now reported as
    killed (SIGTERM) so timeouts are distinguishable from crashes.
  • truncate(undefined) crashed (JSON.stringify(undefined) is
    undefined, not a string) — now renders 'null' honestly.
  • graphProbe threw on a corrupt/non-array needle_menu.json instead of
    answering with an error — every other read path in the plugin already
    reports errors as data; this one now does too.

Spec: 9 new tests (section 12) — 0644-bundle skip, chmod recovery, EACCES
naming, non-EACCES crash shape, real-EACCES code preservation, timeout-kill
honesty, truncate(undefined), corrupt menu, non-array menu. 51 total.

Downloads

Platform File
macOS ARM64 RTerm-3.9.2-arm64.dmg
Windows x64 (Portable) RTerm.Portable.3.9.2-x64.exe
Windows x64 (Setup) RTerm.Setup.3.9.2-x64.exe
Linux x64 (AppImage) RTerm-3.9.2-x64.AppImage
Linux x64 (deb) RTerm-3.9.2-x64.deb
Linux x64 (pacman) RTerm-3.9.2-x64.pacman
Linux x64 (rpm) RTerm-3.9.2-x64.rpm
Linux ARM64 (AppImage) RTerm-3.9.2-arm64.AppImage
Linux ARM64 (deb) RTerm-3.9.2-arm64.deb
Linux ARM64 (rpm) RTerm-3.9.2-arm64.rpm

Install

macOS: After installing, run xattr -cr /Applications/RTerm.app to remove quarantine.

Linux AppImage: chmod +x RTerm-*.AppImage && ./RTerm-*.AppImage

Linux deb: sudo dpkg -i RTerm-*.deb

Linux rpm: sudo rpm -i RTerm-*.rpm


Contact: rterm@hyperspace.ng