v0.3.1
A bug-fix release. Agents in sessions whose name contains a non-ASCII character
were invisible to panels in other sessions; they now appear. No new features,
and nothing to change in an existing install beyond upgrading.
Fixed
Sessions with non-ASCII names were invisible cross-session.
The hook writes a status record to <session>.<pane> and the plugin reads that
filename back after folding the session name Zellij hands it. Both sides fold
unusual characters to _, and the two folds disagreed.
The hook used tr -c '[:alnum:]._-', which is locale-dependent: it works on
characters under a UTF-8 locale and on bytes under C. The plugin folded
characters and only accepted ASCII. So a session named café produced three
different answers:
| filename | |
|---|---|
hook, under LC_ALL=C |
caf__.3 |
| hook, under a UTF-8 locale | café.3 |
| plugin looked for | caf_.3 |
The plugin found the record under neither locale, so those agents never
showed up in another session's panel, and which way it broke depended on the
user's environment rather than on anything in the repo.
The hook now pins LC_ALL=C and spells the class as a-zA-Z0-9._-, so the fold
cannot move with the locale, and the plugin folds bytes to match what tr
actually does (one _ per byte, so café → caf__). Three differential tests
run both implementations against each other and read the hook's own SESSION=
line out of the shipping script, so a restated copy cannot drift.
Upgrading: ASCII session names — mob, my-session, my session — fold
identically before and after, so this is a no-op for most installs. Only names
that were already broken change behaviour.
Internal
The hook end-to-end suite is now Rust. tests/e2e-hook.sh (708 lines of
shell) is replaced by tests/hook_e2e.rs, which runs under cargo test. It
parses the hook's --args into a map instead of substring-matching, which
closed a live false pass: the old suite asserted detail=rate limited against
an emitted rate limited retry in 30s, so a regression anywhere past the prefix
went unnoticed. All 113 shell assertions were audited by name and carried over,
plus two cases the shell suite never had.
The plugin bin is cfg-gated to wasm32. register_plugin! pulls in
host_run_plugin_command, a Zellij wasm import with no native definition, so
cargo build --bin had never linked natively — nothing forced it while there
were no integration tests. Off-wasm the target is now an empty main. The
shipped wasm is unchanged and still exports _start, load, update,
render, pipe and plugin_version.
serde_json is a dev-dependency only and never reaches the wasm binary.
Install
curl -fsSL https://github.com/mohseenrm/zj-agent-mob/releases/download/v0.3.1/init.sh | shRequires jq. See the README
for the manual path and configuration.