Repository navigation
Releases: shift-labs-ai/pi-rlm
Release list
v0.5.0
What's new
Compile errors teach instead of stonewalling
Bun.Transpiler failures used to surface as a bare Expected "}" but found ":" — no line, no column, no source. Every compile error now shows a compiler-style display:
Cell did not compile: Expected "}" but found ":" (line 1, column 22)
await $`echo "v=${VAR:+yes}"`
^
And the known trap — bash-style ${VAR:+x} inside a Bun.$ template literal, which Bun parses as JS interpolation — appends a one-line hint naming the \${ escape. (#5)
Child processes see EOF instead of hanging
Host commands used to travel over the guest's stdin, a pipe that never closes — so any subprocess reading stdin (cat, read, an interactive prompt) hung until the tool timeout. Commands now travel over the duplex fd-3 protocol pipe and the guest's stdin is /dev/null: children read immediate EOF. Bun.$ semantics (escaping, cwd/env, pipes, streaming) are untouched. (#6)
Credits
Both bugs were found, reproduced live, and reported by Alex Myers (@armchairfuturist-code) in #3 and #4 — co-author on both landed commits. Thank you!
Full Changelog: v0.4.0...v0.5.0
v0.4.0
What's new
Subagents as a call stack
A cell that calls rlm.run renders its children as stack frames beneath it: glyph, name, status, age, spawn site, nested by depth.
◐ rlm · agent · essay: write… · 2 subagents · 2 running
◑ essay running 5s · rlm.run("write a 250 word essay about mountains…")
◑ haiku running 5s · rlm.run("write 12 haikus about mountains…")
While anything runs the stack stays visible on the collapsed cell; once every frame settles it folds into a header chip. Frame records live on disk beside each child's output, so stacks survive session resume, link lineage across recursion depths, and read truthfully post-mortem: a record whose writer died reads as lost, never as running.
Bridge correctness
A host reply or request the protocol cannot encode (BigInt, circular) now fails the call with a real error instead of parking the cell forever. This closes the "bridged tool call never settles" incident, on both sides of the pipe.
Orchestration by default
The subagent doctrine teaches appetite, not just mechanics: decomposable work fans out by default, children are blank slates whose prompts must carry full context, and fan-in checks each branch before synthesizing.
Model awareness
The prompt seeds the model landscape once per session, cache-stable: what the agent runs, what children default to, and every auth-configured model grouped by provider. The child default resolves against real availability, preferring the parent provider's volume tier, matched by name across all providers (haiku, luna, flash, mini, nano, lite), newest first.
Full Changelog: v0.3.0...v0.4.0
v0.3.0
What's new
npm imports in cells
import { z } from "npm:zod@4";
import { format } from "npm:date-fns@4/format";Packages install lazily into an isolated cache and never touch the project's node_modules. Version pins and subpaths work, and resolution is Bun's own.
Long sessions stay cheap
- Snapshots re-serialise only the names touched since the last one.
- Large, long-untouched values revive lazily: they load the first time they are read.
rlm.forget("name")is the only true deletion. The engine never discards agent state on its own.- After a resume, the reset notice distinguishes revived names from not-yet-loaded ones, so the agent doesn't rebuild state it already has.
Fixes and doctrine
- A bridged call belongs to the cell that made it: cancelled cells reject their in-flight host requests instead of leaking them (#2).
- The reads-are-full doctrine is now unconditional: slicing a code file is named as bad practice.
New Contributors
@Tiberriver256 seeded the npm imports feature in #1, reworked and landed with co-author credit. Thanks, Micah!
Full Changelog: v0.2.0...v0.3.0