v0.2.0
Changelog
Features
- 4dbec77: feat(client): add route ledger protocol plumbing (@bnema)
- 2f86aba: feat(client): cut over global recent navigation (@bnema)
- 4e32793: feat(client): scope attachment render state (@bnema)
- 7560131: feat(copy): carry stable row identities (@bnema)
- d318448: feat(daemon): add multi-attachment session views (@bnema)
- 2a4b043: feat(daemon): compose remote view content locally (@bnema)
- d3ad7ec: feat(daemon): construct remote view links (@bnema)
- 4c3ccc7: feat(daemon): fence per-attachment output epochs (@bnema)
- 52f10a1: feat(daemon): resume remote attachment owners (@bnema)
- 28680b3: feat(daemon): retain detached remote views briefly (@bnema)
- f1b7847: feat(daemon): retain unified remote picker ownership (@bnema)
- ac571a7: feat(daemon): route remote attachment frames locally (@bnema)
- 7d74423: feat(daemon): transition attachments to remote views (@bnema)
- 9683889: feat(picker): grouped sort mode toggled with s (@bnema)
- ae3ded7: feat(picker): keep selection on the row replacing a killed session (@bnema)
- d415bc0: feat(picker): order sessions by most recently used (@bnema)
- 4fcfd05: feat(picker): render stopped sessions dim italic (@bnema)
- d9b9a0a: feat(picker): show sort mode in modal title (@bnema)
- 0929f70: feat(ports): finalize attachment wire codecs (@bnema)
- efdd7d6: feat(protocol): add proxied content and metadata contract (@bnema)
- e147aea: feat(protocol): add structured proxy screen wire (@bnema)
- c6e0a78: feat(proxy): stream structured screen updates (@bnema)
- 3644a55: feat(remote): add SSH session catalog client (@bnema)
- f0e21e9: feat(remote): add durable catalog cache and identity (@bnema)
- 26c89eb: feat(remote): add host management and remote listing (@bnema)
- ac27f72: feat(remote): add proxy session link and rendering (@bnema)
- 0356602: feat(remote): add remote configuration and host persistence (@bnema)
- d94ca5a: feat(remote): add unified host state store (@bnema)
- 0f7a788: feat(remote): enforce proxy command and lifecycle ownership (@bnema)
- e9e6c54: feat(remote): establish proxied content ownership (@bnema)
- 097f96e: feat(remote): expose versioned session catalog (@bnema)
- 2d2ac84: feat(remote): implement picker session parity (@bnema)
- 6a6edad: feat(remote): move proxy lifecycle into the session core layer (@bnema)
- f019e0f: feat(remote): recover direct session ownership (@bnema)
- a851fc9: feat(remote): unify remote sessions in the picker (@bnema)
- 50c5c14: feat(ui): render snatched-modal key hints as keycap badges (@bnema)
- 6f5dceb: feat(vt): add stable row identities (@bnema)
- 8a3d00a: feat(vt): persist stable row identities (@bnema)
Bug Fixes
- 7739dc9: fix(app): handle local picker handoffs (@bnema)
- 5884320: fix(client): address route review findings (@bnema)
- 121c2e1: fix(client): close route ledger review gaps (@bnema)
- 15781f2: fix(client): serialize route ledger transitions (@bnema)
- a806195: fix(config): apply remote parser review fixes (@bnema)
- db35bc9: fix(config): keep remote settings scalar-only (@bnema)
- 3f6dcc6: fix(config): remove remote configuration (@bnema)
- 38bcf15: fix(daemon): address PR 156 review findings (@bnema)
- 530da1f: fix(daemon): apply follow-up review fixes (@bnema)
- 15846e6: fix(daemon): apply proxy screen review fixes (@bnema)
- e7cd195: fix(daemon): avoid duplicate terminal title prefixes (@bnema)
- 2c2f623: fix(daemon): bound remote proxy handshakes (@bnema)
- 717ece4: fix(daemon): cancel blocked proxy handshake sends (@bnema)
- fdbb41b: fix(daemon): close phase 3 output races (@bnema)
- 5e4aa1c: fix(daemon): close review gaps for unified attachments (@bnema)
- 9d942b6: fix(daemon): complete kill-all shutdown handoff (@bnema)
- 74d1510: fix(daemon): fan out shared output to attachments (@bnema)
- 932410a: fix(daemon): fence attachment lifecycle races (@bnema)
- afa0cb5: fix(daemon): fence remote link reconnection (@bnema)
- c668837: fix(daemon): fence remote resume parking races (@bnema)
- 800c63b: fix(daemon): integrate attachment review fixes (@bnema)
- 8d7a354: fix(daemon): join only started remote link workers (@bnema)
- ae173e8: fix(daemon): make latest attachment resize authoritative (@bnema)
- af38802: fix(daemon): publish proxied metadata on empty frames (@bnema)
- ac05024: fix(daemon): reconcile moved geometry asynchronously (@bnema)
- fe43a19: fix(daemon): recover remote resume before parking (@bnema)
- 2a319c8: fix(daemon): remove unused session view field (@bnema)
- c48b08e: fix(daemon): repaint remote metadata updates (@bnema)
- 604afe4: fix(daemon): restore terminal color capabilities (@bnema)
- b902d96: fix(daemon): retire expired remote resume credentials (@bnema)
- 308292f: fix(daemon): retire lease on attachment rebind (@bnema)
- 8062ab3: fix(daemon): retire terminal remote views (@bnema)
- 8f34248: fix(daemon): serialize detached output state (@bnema)
- e4a8173: fix(daemon): synchronize pane focus after splits (@bnema)
- 6b7d2c3: fix(daemon): use session geometry for new tabs (@bnema)
- c4be05e: fix(handshake): bound unified session handshakes (@bnema)
- eed2010: fix(harness): scope observer gap span suppression (@bnema)
- 9dc0afe: fix(layout): give moved pane its fair share on consume/expel (@bnema)
- 1f2c802: fix(perf): preserve proxy benchmark geometry (@bnema)
- a57483f: fix(perf): validate proxy measurements (@bnema)
- 68ba351: fix(phase4): bound cancellation and remove dead command APIs (@bnema)
- dea913c: fix(phase4): integrate handshake validation and command deadlines (@bnema)
- 64916bf: fix(phase5): apply PR 176 review follow-ups (@bnema)
- ee9b61d: fix(phase5): bound final cancellation and readiness races (@bnema)
- 448248d: fix(phase5): integrate final quality fixes (@bnema)
- 18c1193: fix(picker): keep a stopped session selected across the sort toggle (@bnema)
- de8bb89: fix(picker): refresh remote-owned picker views (@bnema)
- 3dbe137: fix(picker): show dim remote host (@bnema)
- 1521b5b: fix(picker): snapshot session fields under the session lock before sorting (@bnema)
- 4634437: fix(protocol): address screen wire review findings (@bnema)
- 4b7cd9e: fix(protocol): apply follow-up review fixes (@bnema)
- 5ee2a06: fix(protocol): bound attach handoffs (@bnema)
- 0b11e7b: fix(proxy): align byte-stream handshake (@bnema)
- b9f0565: fix(remote): address direct ownership review findings (@bnema)
- fe22594: fix(remote): address follow-up picker review findings (@bnema)
- 92a7932: fix(remote): address ownership recovery review findings (@bnema)
- 9aa4936: fix(remote): address picker parity review findings (@bnema)
- 56985fd: fix(remote): address picker review findings (@bnema)
- bd9d2c0: fix(remote): address picker review findings (@bnema)
- 98aa679: fix(remote): address proxy link, output, and render review findings (@bnema)
- 59f9ff5: fix(remote): arm proxy expiry after detach (@bnema)
- b71ae30: fix(remote): bound and sanitize catalog diagnostics (@bnema)
- a13c2fe: fix(remote): bound catalog command lifetime (@bnema)
- 55169b2: fix(remote): bound connection handoff retries (@bnema)
- ab88dd5: fix(remote): close failed handshakes cleanly (@bnema)
- 76c6a00: fix(remote): close remote transition races (@bnema)
- d63c59a: fix(remote): close stale attachment handshakes safely (@bnema)
- 845794a: fix(remote): commit proxy lifecycle state before publishing it (@bnema)
- 7dbc84a: fix(remote): complete proxy navigation fallbacks (@bnema)
- eba0907: fix(remote): correct the cache-to-proxy row selectability expectation (@bnema)
- 67576a2: fix(remote): fence proxy picker lifecycle (@bnema)
- 17667bd: fix(remote): fence remote picker transitions (@bnema)
- 655f64a: fix(remote): finish navigation recovery review (@bnema)
- 1fe4915: fix(remote): gate remote rows until activation (@bnema)
- 310aed6: fix(remote): harden navigation and attachment concurrency (@bnema)
- e7d0da2: fix(remote): harden ownership recovery (@bnema)
- 8b76008: fix(remote): harden picker acceptance (@bnema)
- 517c29e: fix(remote): harden picker recovery routes (@bnema)
- d8baccc: fix(remote): harden proxy handoff routing (@bnema)
- 1626715: fix(remote): harden remote view lifecycle (@bnema)
- a068955: fix(remote): harden unified attachment review paths (@bnema)
- 8ecb88d: fix(remote): harden unified picker handoff (@bnema)
- 0ae031a: fix(remote): preserve picker proxy handoffs (@bnema)
- d2f9957: fix(remote): preserve picker tab identity (@bnema)
- 87c2338: fix(remote): preserve route validation and picker effects (@bnema)
- 59b57b4: fix(remote): remove obsolete config marker (@bnema)
- 543bf31: fix(remote): restore unified remote navigation (@bnema)
- 16ea2ba: fix(remote): support remote view handoffs (@bnema)
- 610e63d: fix(remote): unify target validation errors (@bnema)
- 417c304: fix(remote): validate attachment effects defensively (@bnema)
- 7b0921e: fix(renderer): address review findings (@bnema)
- f91f9d4: fix(renderer): harden prepared draw commits (@bnema)
- df21af7: fix(review): enforce strict wire semantics (@bnema)
- d91224b: fix(routes): close invalid transitions and sync identity metadata (@bnema)
- 17d2014: fix(routes): guard navigation commits and welcome framing (@bnema)
- eac59c2: fix(routes): preserve navigation across session switches (@bnema)
- fe8474f: fix(routes): preserve remote route identity (@bnema)
- 217c05a: fix(routes): stabilize remote navigation state (@bnema)
- 14c1427: fix(rowid): keep history allocation monotonic (@bnema)
- 7d1e3b2: fix(rowid): reject malformed explicit history IDs (@bnema)
- 3fedffb: fix(sshstdio): keep carriage alive after handshake (@bnema)
- 509f5fa: fix(test): bind manual attachment output stream (@bnema)
- bb0d730: fix(transport): apply session-neutral connection review fixes (@bnema)
- 3c2478b: fix(vt): align row ID exhaustion boundary (@bnema)
- b1ef94e: fix(vt): finalize stable row identity fixes (@bnema)
- 42eecf1: fix(vt): handle erase character sequences (@bnema)
- cc001e4: fix(vt): preserve row identities through restore (@bnema)
- 6820eef: fix(vt): reconcile extraction after rebase (@bnema)
- 60a6a56: fix: apply current review findings (@bnema)
Performance
- 9a4b27f: perf(harness): drive proxy workload shapes (@bnema)
- b54b862: perf(proxy): benchmark ANSI relay workloads (@bnema)
Refactoring
- 004db2e: refactor(client): unify session connections (@bnema)
- f5a831c: refactor(daemon): ListSessions reads snapshotView (@bnema)
- d75f483: refactor(daemon): add sessionCapabilities seam for cross-session moves (@bnema)
- 6710d10: refactor(daemon): add sessionView value snapshot (@bnema)
- 129ef59: refactor(daemon): clarify attachment session accessors (@bnema)
- 951a71d: refactor(daemon): generalize attachment session core (@bnema)
- 8f5598a: refactor(daemon): park independent attachments (@bnema)
- 5090cbb: refactor(daemon): pickerViews reads sessions through snapshotView (@bnema)
- aa7c5e4: refactor(daemon): recentSessions and paletteResults read snapshotView (@bnema)
- 30c3dce: refactor(daemon): remove global active tab state (@bnema)
- 5376d8b: refactor(daemon): remove move attachment handoffs (@bnema)
- 409ae78: refactor(daemon): remove obsolete session membership fields (@bnema)
- a65e2c7: refactor(daemon): remove obsolete transition state (@bnema)
- 481ac41: refactor(daemon): replace attachment roles with connection fences (@bnema)
- db24042: refactor(daemon): route callers through attachments (@bnema)
- a27f761: refactor(daemon): separate recent route presentation (@bnema)
- fd94b61: refactor(daemon): track attached commands per connection (@bnema)
- 5d58f8a: refactor(picker): shorten remote session status (@bnema)
- 5720a2c: refactor(picker): tighten sort toggle, drop dead wrapper, sharpen tests (@bnema)
- 0cbba84: refactor(proxy): remove structured output bridge (@bnema)
- fa63924: refactor(remote): centralize catalog cache path and unwrap load error (@bnema)
- b0018c5: refactor(remote): centralize recovery routes (@bnema)
- da262ae: refactor(remote): remove semantic proxy sessions (@bnema)
- 38765b3: refactor(renderer): add transactional delta planning (@bnema)
- 01fd03b: refactor(session): rename lifecycle states (@bnema)
- 46cc729: refactor(vt): consume standalone v0.2.1 module (@bnema)
- 3fd4a02: refactor(vt): cut over vev to released module (@bnema)
- 1e4fbe6: refactor(vt): isolate core model and ANSI package (@bnema)
Other Changes
Install
Script (Linux x86_64/arm64, macOS arm64)
curl -fsSL https://raw.githubusercontent.com/bnema/vev/v0.2.0/install.sh | VEV_VERSION=v0.2.0 shArch Linux
yay -S vev-binmacOS note
The darwin binary is ad-hoc signed by the Go toolchain, not notarized.
Installing via the script or curl avoids the quarantine attribute;
if you downloaded the archive with a browser, Gatekeeper will block it.
Removing the attribute bypasses a Gatekeeper security control — only do
it for the vev binary itself, after verifying its checksum:
xattr -d com.apple.quarantine ~/.local/bin/vevFull Changelog: v0.1.0...v0.2.0