Skip to content

Releases: ooyeku/stem

v0.14.0

Choose a tag to compare

@github-actions github-actions released this 25 Jul 06:35

Deterministic Editing — repeatable operations, a plugin host that can't hang the editor, and a crash-recovery format that survives its own filenames.

Macros: transactional record and replay

Macros record the command stream off the message bus, not raw keystrokes, so replay is immune to mode and timing skew.

  • q + a register starts recording, q stops; [N] @ + a register replays with a count.
  • Replay is all-or-nothing. The whole macro applies as one undo group, and a replay that errors mid-way rolls the buffer back to its pre-replay state instead of leaving a half-applied edit.
  • A recording indicator sits in the status bar; a failed replay surfaces the rolled-back step as a toast.

Macros live in per-session az registers. Durable, cross-restart storage arrives with the named-register work in #3.

The plugin host is now a library, and every call is metered

The pure-Zig wasm interpreter has been extracted into its own project, wick — stem's second general-purpose spin-off after vigil. stem now depends on it as a pinned package.

  • Fuel-metered calls. Every plugin call runs under an instruction budget. A runaway plugin fails that one call with OutOfFuel — logged, counted, contained — instead of hanging the editor. Host calls cost one instruction, so a plugin waiting on a slow git subprocess is never penalized.
  • Containment you can see. Per-plugin call, trap, last-error, and fuel-usage stats appear in the plugin-manager dashboard and the control center, and plugin traps feed the check-engine light alongside dead letters and open circuits.

Session files that survive their own filenames

The session and crash-recovery parser scanned for field markers instead of parsing JSON, so a path containing ", \, or } truncated or dropped the buffer it belonged to. On a real session written for a workspace holding quote"file.zig and brace}file.zig, the old parser recovered one usable buffer out of three.

Parsing and serialization now both go through std.json:

  • Paths round-trip exactly — quotes, braces, newlines, control bytes, emoji. Control characters were previously written raw, producing a file that wasn't valid JSON at all.
  • Out-of-range numbers saturate instead of wrapping; a long enough digit run used to panic a safe build.
  • A path that isn't valid UTF-8 costs that one buffer rather than making the whole file unparseable, and a malformed split layout is dropped the same way — losing your layout beats losing your buffers.

Install

Prebuilt archives for macOS (arm64/x86_64), Linux (x86_64/arm64), and Windows (x86_64) are attached below. The Unix tarballs now ship their own installer, which places the binaries and bundled plugins exactly where a from-source install does and tells you what to add to your PATH if it isn't already there:

tar xzf stem-v0.14.0-<target>.tar.gz
cd stem-v0.14.0-<target>
./install.sh                  # or: ./install.sh --prefix ~/.local

The binaries aren't notarized yet, so a browser download is quarantined by Gatekeeper. install.sh clears that for you; if you run the binary straight from the archive instead, fetch it with curl -LO or clear the attribute yourself with xattr -d com.apple.quarantine ./stem.

Verify a download against the attached SHA256SUMS.txt:

shasum -a 256 -c SHA256SUMS.txt

Also in this release

  • Test coverage went from 656 to 723 passing tests — not by writing 67 new ones, but by discovering that nine modules' test suites were never wired into the build and had quietly rotted, split_manager (window splits) among them. Fixing them turned up tests asserting the opposite of real behavior, and a leak-checking helper that could only pass for code that allocated nothing.
  • Dead code removed: an orphaned help_view.zig, a leftover loader helper, an unused import.
  • Docs refreshed across the README, architecture, plugin, and roadmap pages.

Closes #2 and #7.

Full Changelog: v0.13.1...v0.14.0

v0.13.1

Choose a tag to compare

@github-actions github-actions released this 19 Jul 22:53

Full Changelog: v0.13.0...v0.13.1

v0.13.0 — the reliability release

Choose a tag to compare

@ooyeku ooyeku released this 18 Jul 17:57

stem v0.13.0 — the reliability release

First tagged release. Stem is a modal terminal editor built on
vigil, an Erlang/OTP-style
supervised runtime for Zig: it supervises itself, heals itself, and
can show you exactly what its runtime is doing.

Highlights

Self-healing language servers. Crashed LSP servers restart with
jittered exponential backoff behind per-language circuit breakers —
a crash-looping server stops burning CPU, and a half-open probe
recovers it automatically once the cause clears. The restart path that
could previously fire once per rendered frame is fixed and gated.

Self-healing workers. The syntax parse worker and workspace
indexer now run under a worker supervisor: if one dies, the watchdog
respawns it within ~2s and says so in the status bar.

Nothing fails silently. Undeliverable messages land in
inspectable dead-letter queues with reasons; poison messages trip a
hook; dead letters, open circuits, and crashes light a check-engine
indicator pointing at the live runtime cockpit
(stem.control_center).

Crash-safe sessions, cheaper. Recovery snapshots write through
vigil's checkpoint pipeline: background thread, atomic rename,
version-stamped, skipped entirely when nothing changed.

Vigil 3.0 under the hood. One injected telemetry pipeline (no
global state), graceful drain on shutdown (in-flight messages get
500ms to land, and stem records when they don't), and honest
supervision counters.

Faster editing plumbing (from the 2.3 line): condition-parked
receives (microsecond wake latency), ring-buffer mailboxes, batched
receive in the core loop, single-allocation messages, precise LSP
debounce via the runtime timer service, and flow control so a slow
plugin can't stall the cursor.

Plus: opt-in multi-instance presence (STEM_CLUSTER), a fuller
runtime health view (timers, alerts, dead letters, vigil debug dump),
and a public roadmap
through 0.15.0.

Install

Prebuilt binaries below (macOS arm64/x86_64, Linux x86_64/arm64):

tar xzf stem-<target>.tar.gz && sudo mv stem /usr/local/bin/

Or from source (Zig 0.16+): zig build -Doptimize=ReleaseFast

The ten-second demo

Open stem, run stem.control_center from the command palette
(Space f), then kill -9 your language server from another
terminal. Watch the editor notice, back off, recover, and log every
step.