Repository navigation
Releases
microagent v0.22.2
Fixed
- ACP now accepts
autoas the default session mode, so Paseo no longer
rejects its default mode for the microagent provider.coderemains a
valid explicit mode.
microagent v0.22.1
Fixed
- ACP sessions now advertise a
modelsession config option, so clients that
build their model list fromconfigOptionsdetect the configured model
instead of reporting no models.
microagent v0.22.0
Added
microagent acpserves the Agent Client Protocol v1 over stdin and stdout.
It implements initialization, session creation, prompts, streaming message
and tool-call updates, cancellation, session list/resume/load/delete/close,
and stdio and HTTP MCP servers supplied by the client.
microagent v0.20.0
Changed
- Update the linter setup action to setup-uv 10.3.0.
- Correct the security policy version and threat-model citations.
microagent v0.19.1
Fixed
- Send the updater HTTP GET request before reading its response, fixing
HttpConnectionClosingwhen checking for or downloading releases.
microagent v0.19.0
Fixed
- Create the default configuration atomically and leave an existing file untouched.
- Treat a repeated edit as already applied instead of changing the file again.
- Serialize concurrent stderr notes and MCP handshake arena writes.
- Record benchmark run timestamps in UTC regardless of the host timezone.
- Check repeated tool-call IDs and names by buffer identity, avoiding a
platform-dependent allocator-capacity assertion on macOS. - Build with Homebrew's Zig layout on macOS by discovering the compiler's
library directory instead of assuming it sits beside the executable.
v0.18.0
Added
microagent schemaprints a CLI Spec 0.3 document and exits 0. It reads no config, no credentials, and no network.microagent schema <command>keeps that command and any command whose path starts with it.schemais a subcommand only as the first argument; a task of that name goes after--or--print.-o/--outputselectsauto,text, orjson(defaultauto) and is accepted before the subcommand. The pipe contract stays the model's text, soautostays text on a pipe and an explicit-o jsonis what asks for JSON.--version,setup, andupdate(including--check) then print one JSON document.updateandsetupincludechanged. A JSON-mode error's last stderr line is an error envelope, and the exit status stays 2 for a bad command line or bad configuration, 1 for a failure, 3 for a run that stopped without an answer, and 130 for an interrupt. The model's own stdout is unchanged, and the session log's JSON keys are unchanged.
microagent v0.17.0
Changed
- Upgrade the toolchain to Zig 0.17.0. Migrated build configurations, module
definitions, and standard library APIs across the codebase to Zig 0.17
conventions (std.Io,std.process.Environ.Map,std.posix, and arena
allocator semantics).
Fixed
-
Support IPv6 loopback URI host literals (
[::1]) in network client host
validation (urlCarriesKey), extracting raw URI host strings rather than
strictly parsing RFC 1123 DNS hostnames. -
Maintain POSIX child process spawning pipe and child cleanup on
execvpe
failure under Zig 0.17, preventing file descriptor leaks during failed tool
and MCP server launches. -
Fix static storage for test suite repeated byte buffers, avoiding runtime
stack exhaustion during response ceiling boundary tests.
microagent v0.16.0
Changed
- The
bashtool tells the model which shell it runs. The name isbashand
the shell has always been/bin/sh -c, so a model writing[[ ]], arrays,
local,$'...'or process substitution saw a tool calledbashand wrote
bash into ash. The description sent on every run now says POSIX sh and
names the syntax that fails, and the tool table in docs/usage.md says it
too. Nothing about how a call is executed changed: a command that failed
before fails the same way, and the only thing that changes is what the model
is told before it writes one.
Fixed
-
A
write,edit,multi_editormicroagent setupthat reports success now
survives the machine stopping.writeFileAtomicrenamed the temporary file
over the destination without first flushing it, so a power loss between the
rename and the disk taking the bytes came back with the name in place and
nothing behind it: a source file the tool said it wrote, read back empty or
half-written. The flush is before the rename and costs one disk round trip per
file written, and a flush that fails leaves the destination exactly as it was.
microagent updateand the first-run config write already did this; this was
the one writer that did not. -
Read a compressed answer from a remote HTTP MCP server. The client sends
accept-encoding: gzip, deflateand now reads a body its ownContent-Encoding
header names, for a frame and for a refusal alike, rather than passing the
compressed bytes to the JSON parser. Atools/listcatalog is the answer that
benefits most; the 4 MB response ceiling and the 256-level nesting guard
already count decoded bytes, so neither is widened by this. -
microagent updatespends theRetry-Aftera refusal names, where the agent
run already did. The wait is capped at 30 s, this command's own backoff cap, so
a person watching the command is not left waiting on a run that has given up on
their side. A refusal that names no wait keeps the previous backoff, and so does
one naming a wait already spent (retry-after: 0, or a date this machine's
clock has passed), which took the backoff's place and sent every attempt
milliseconds apart. -
The benchmark venv is built for the interpreter its lock resolves for. The
README'suv venvnamed none, souvtook whichever interpreter it found
first on PATH: a host whose default is 3.11 installed a lock compiled with
--python-version 3.12into an interpreter a release below the floor the
manifest states, and the adapter's ownfrom datetime import UTCis a 3.11
name, so the run failed at the first summarize rather than at the install.
make lint-versionsnow holds that--pythonagainst the floor the linter
manifest, the Harbor manifest andruff.tomlare already held to, and its
self-test asks the same question of it as of the other four. -
The
gittool honorsrevoncmd = "log"to narrow commit history. The
tool schema declared the field for the commands taking one, butlogdropped
it silently and returned the entire log.cmd = "status"now explicitly
refusesrev, explaining that status reports the working tree against HEAD. -
Remote preset configuration keys (
url,api_key_env,api_key_header,
timeout) written under built-in tool tables like[tools.bash]report the
table name in the diagnostic message instead of an unspecific unknown-key
notice.
microagent v0.15.0
Added
- The top-level config key
reasoning_effortsets the same optional reasoning
level as--reasoning-effort. The flag overridesMICROAGENT_REASONING_EFFORT,
which overrides the file; omitted or empty keeps the provider's default.
OpenCode receives its nativereasoning_effortfield, orthinking.type
set todisabledfornone.
Fixed
-
Preserve streamed
reasoning_contenton assistant messages so OpenCode Zen
and Go thinking models can continue after tool calls and across REPL prompts.
Reasoning shares the response byte ceiling and is kept out of stdout and
session logs; a stream failure after reasoning is generated is not retried.
Document both gateway base URLs, bare model IDs and the Chat Completions API limit. -
Send a stable
x-opencode-sessionheader to OpenCode for each conversation;
Go otherwise rejects requests withMissingSessionID. Decode compressed
provider error bodies so their reason is readable instead of compressed bytes.