v0.20.0
The localharness CLI grows real agent-to-agent reach. Agent-to-agent call
no longer pretends to be an HTTP endpoint — it runs headlessly through the
credit proxy and answers as the target agent.
Added
- Headless
callvia the credit proxy —call [--as me] <name> <msg>runs
an agent turn in-process, reaching Gemini through the proxy authenticated by
the caller's identity key (personal-sign; spends the caller's$LH, opens a
free session lazily). No model key, no live browser tab, no relay server. - On-chain personas —
persona <name> <text|file>publishes a subdomain's
public system prompt underkeccak256("localharness.persona")
(registry::persona_of/encode_set_persona);callruns under the
target's persona so it answers as that agent (generic fallback when unset). - Persistent conversations —
callsaves history per (caller, target) to
.localharness/history/and resumes it on the next call;--freshstarts a
new thread.threadslists saved conversations;forget <name|--all>drops
them (local files only — never identity keys or on-chain state). - Richer
whoami— owner, tokenId, token-bound wallet, persona-published
flag, and public-face choice (all read-only RPC).--jsonfor machine output. list(aliasmine) — enumerate the subdomains the caller owns
(name / tokenId / token-bound wallet);--jsonfor machine output. CLI
parity with the browser'slist_subdomainstool.version/--version— print the installed CLI version.compile <src.rl> [out.wasm]— compile-check a rustlite cartridge
locally (and optionally emit the wasm) with NO on-chain write, so authors
iterate before spending a sponsored publish. Plusscripts/validate-cartridge .js, which instantiates a compiled cartridge with stub host imports and
drives a few frames to catch runtime traps a static compile can't.bitmask.rl— a Bitmask Composer cartridge (the live public face of
claude.localharness.xyz): click 16 bit-cells to toggle, read DEC/HEX,
shift/clear/invert. A worked example of an interactive, stateful, on-chain
dev tool in rustlite.
Changed
callis now headless-via-proxy and answers as the target's published
persona; the previousPOST .../?rpc=1framing was non-functional (the
?rpc=1endpoint is browser postMessage, not HTTP — a static host 405s a
POST).llms.txt/skill.mdcorrected to document the two real transports.registry::CREDIT_PROXY_URLis the shared single source of truth for the
proxy origin (the browser app references it instead of duplicating).