Repository navigation
0.11.0 — 2026-10-26
Release Notes
Sessions now live in the daemon. Every client attached to a session can
type, /sessions lists live and past sessions and switches between them,
pinned sessions come back after the daemon restarts, and
synaps daemon reload-extension restarts one plugin without touching a
session. Reloads and parks no longer rewrite the prompt cache, and this
release adds several accounts per provider, Meta Muse, Kimi K3.1 Pro and
subagents you can watch and steer.
Read the Upgrade notes first: one change stops some plugins from loading,
and several defaults changed. Full notes:
docs/upgrading/0.11.md.
Upgrade notes
- A plugin whose manifest
secret_envrequests a newly denied name now
fails to load, with an error naming the variable (list under Security).
Fix: move the secret to a plugin-specific variable. (#256) - Reload the daemon after installing: install, run
synaps daemon reload, then restart attached TUIs. A 0.10.2 daemon left
running ignoresauth.account.*, refreshes tokens outside the new lock
and can't serve subagent watch/steer. The first reload is run by the
0.10.2 image, which doesn't carry running workers: let subagents finish
first. Daemon protocol (v3) and extension protocol (1) are unchanged. - Every client of a daemon session can now type (
client_input = shared,
the default);--observeclients stay read-only.client_input = exclusive
keeps the 0.10.2 rule (read when the daemon starts). (#300) - The daemon socket refuses connections from another user, root
included. (#298) - Turn budgets: interactive turns have no round, tool-call or
tool-result-byte limit by default (were 128 / 512 / 32 MiB); set
turn_budget.foreground.*to keep one. Watcher, event and subagent turns
stay bounded (see Changed).0still means "none allowed" but is
deprecated; writeunlimitedfor no limit. (#219, #251) - The
kimiprovider defaults tokimi-k3.1-pro, which Moonshot
unlocks after a top-up (minimum $1). Until then choose
kimi/kimi-k2.7-code. (#281) synaps send --session Xexits 1 when X isn't running or refuses the
event, instead of dropping it in the shared inbox (--inboxkeeps the old
drop). A headlesssynaps agentno longer reads the shared inbox; use
synaps send --session <agent>. (#265)- Loopback
synaps auth-brokeralways requires a machine token, written
to~/.synaps-cli/auth-broker.tokenand found by same-user clients. Other
users, older or SSH-forwarded clients needauth.machine_token./token
no longer vends Muse keys. Upgrade a remote broker host before its
clients. (#252) - Extensions: only
blockstops thebefore_tool_callchain;
tool.callparams always carrysession_id(nullfor workers); a
JSON-RPCerrorreply is returned as-is, no longer restarted and retried.
(#215, #227, #252) mcp.jsonenvvalues are expanded:${NAME}is the parent's value,
or empty when unset (with a warning);${NAME:-fallback}sets a default.
Daemon sessions use the daemon's environment. (#215, #256)- Profiles:
--profileexits with an error when it can't be applied;
SYNAPS_PROFILEnow picks the daemon like--profile; a client never
attaches to another profile's daemon. (#246) - Memory: a confirmed
memory.default_modenow applies to every new
session. A/memory offmade before upgrading isn't carried over the
first reload; run it again. (#225, #255) - Keys: Alt-↑/↓ and Ctrl-↑/↓ switch subagent views and can't be
rebound. In Confirm promptsano longer allows all: select "Allow all",
Enter, Enter. (#218, #252, #254) - Scripts:
synaps statushas a new layout; parse--json. (#215) - Packagers:
--no-default-featuresnow dropsbashandshell_*. It
is not a sandbox. (#215, #256) The minimum Rust is now 1.88 (declared as
1.80 before, which the locked dependencies no longer build with). - Rollback: sessions saved by 0.11.0 open in 0.10.2. (#253)
synaps-engine/synaps-corecrate users:TurnBudgetcount limits
areOptions, newTurnRole::EventandBudgetDimension::TotalTokens,
BrokerErroris#[non_exhaustive], and several structs gain fields.
synaps-tuitakes the engine withdefault-features = false; enable
synaps-engine/command-execto keepbash/shell_*. See the full notes.
Highlights
- Shared input. Every client can prompt, steer and abort; the last to
type is the active client. Name clients with--as NAME, list them with
/clients; underexclusive,/takeovertakes input in place.
(#296, #299, #300) /sessions. Live: every daemon session by state; pin (p), close
(x) or switch to it (Enter). Past: search, facets, preview, deep search
(Ctrl+F), rename, and Enter continues a session in its own folder. (#305)- Pins survive restarts.
/pinandsynaps daemon pin <ID|NAME>keep a
session loaded and hold the daemon's idle exit. Pins come back after
daemon stop, a crash or a reboot (deploy/synaps-daemon.service;
SYNAPS_DAEMON_RESTORE_PINS=0skips them), and a pinned session keeps its
cache warm with no TUI attached.--keep-warmand/keep-warmare the
same pin. (#269, #306) synaps daemon reload-extension <NAME>restarts one extension from
disk, also one installed after the daemon started: no checkpoint, no
cancelled turn; a bad manifest is refused first.
docs/daemon-mode.md. (#307)- The prompt cache survives reloads and parks. Activated tools, cache
totals and theon_session_startinjection carry across, and
cache_diagnostics = trueasks Anthropic why a request missed.
(#262, #276, #294, #295) - Several accounts per provider.
synaps login --provider <p> --account <label>adds Claude,
ChatGPT/Codex, Kimi or Grok seats; select with
auth.account.<provider> = <label|default|auto>. Newsynaps authand
synaps statussubcommands and flags.
Guide. (#215, #266) - Watch a subagent. Alt/Ctrl-↑/↓ or
/watchopens a worker in its own
view; type there to steer it. docs/subagent-watch.md.
(#218, #240, #254)
Added
/closesaves and ends a daemon session;
synaps daemon close <ID|NAME> [--force] [--attached]does it from
any shell. Both refuse a busy session (forcecancels its workers);
daemon closerefuses one with clients attached unless--attached.
(#263, #264)- Meta Muse (experimental): device-flow login, then
muse/*models.
docs/providers/muse.md. (#216) - Kimi
kimi-k3.1-proandkimi-k3.1-pro-highspeed(2-3x faster);
/effortofferslow/high/max. (#281) synaps auth stateshows and clears what the daemon's broker remembers
per account; an auth-failed turn says what failed. (#266)synaps quota-keeper(experimental, read-only by default). (#215)synaps daemon sessionsshows state age, park/evict deadlines, cost,
messages and title. (#305)- Codex
gpt-6.1-sol, and hosted web search withSYNAPS_CODEX_WEB_SEARCH.
(#215) - The light
papertheme;SYNAPS_THEME=<name>for one run. (#235) - Watcher agents: a
wake_ifgate, resource limits, targeted notifications.
(#239) --no-confirm-answers,/workers,/confirms status|reset.
(#221, #236, #252)- Extensions may return an advisory
context_phase. (#215) - axel-memory-service runs on macOS. (#224)
Changed
/settingsopens while a turn streams. Appearance applies at once,
session settings from the next turn. (#291)- Turn budgets per role: interactive turns unlimited; watcher turns 24
rounds / 96 tool calls / 8 MiB; subagent runs 64 rounds x 3; turns started
by inbox events or subagent completions use the neweventrole (24 / 96
/ 8 MiB) until the owner steers them. (#219, #251, #283) - The SynapsCLI header: folder and branch, a state block, the agent
clock, the version when idle. (#226, #228, #282) - Context rollover aims the successor at about 100k tokens
(context_management.target_tokens). (#241, #260) - A tool call waiting in its lane shows
○ queued, timed from its start.
(#292) - Tool cards start half a row higher; an unknown
/commandin an attached
TUI goes to the session. (#230, #233) subagent_resumerefuses an archive with no history; unknownauth.*
keys warn. (#253)
Fixed
- A reload or park dropped the session's activated tools, so the next
request rewrote the whole prompt cache. They are carried and re-validated.
(#294) - The first request after a reload could skip
on_session_start's
injection. Requests and keep-warm pings now wait for it. (#262) - Cache totals reset after reload or resume;
%↺and/statsread low.
(#295) cache_diagnostics = truewas never sent. (#276)- Subagent requests were missing from
api-log.jsonl. (#303) - Shared-inbox events woke 2-3 sessions, each starting a paid turn. Each
file now reaches one session with an attached client; addressed events
retry, then fail, never falling back to the inbox. (#265) /modelin one client now updates every attached client. (#300)- A session restored by a reload with no client never parked. (#304)
- Rollover deadlocked with workers running. Esc cancels only the
interrupted turn's workers. (#221, #222) - OAuth compaction failed with HTTP 429. (#220)
- OAuth tokens: reload on
auth.jsonchange and after a 401, refresh
under a cross-process lock, never lose a rotated token. (#237, #238, #249)
A cancelled turn or a timed-out subagent can't abort a refresh halfway,
forced refreshes are limited to one a minute per account (one account
never cools down another), and when Muse can't re-mint it returns the
provider's own 401. synaps statusno longer shows an emptyextra_usagerow for accounts
without paid extra usage.subagent_statuson an archived worker returns its error, like
subagent_collect.- Auth and providers: failed usage reads are held and shared; legible
Codex 4xx; hostedweb_searchrejection learned; usage over 100% is
exhausted; keep-warm backs off on timeouts; Muse streams can't hang.
(#249, #250, #272, #274) daemon reloadstops workers resumably and keepssa_Nids; a reload is
fenced;/memory offsurvives park and reload. (#229, #231, #232, #255)- The client says when it is older or newer than the daemon. (#233, #254)
- Subagent-view input never reaches the main thread. (#254)
- Tool cards: a running card keeps counting when something lands below
it; subagent-view cards tick and get footers. (#289, #290) - Bash and shell output keep multi-byte characters split across reads.
(#288) systemd-run(254+) expanded${VAR}in scoped commands, even in single
quotes. (#280)- Watcher limits bind inside a turn, cost includes cache tokens, the
handoff turn is metered and must save, and limit exits aren't counted as
crashes. (#251) - A turn stopped by its budget keeps its response;
max_cost_usdbinds on
every provider. (#251) - Esc keeps the partial reply when the cancel is slow. (#258)
- A refused
--continuedeleted the live session's registry card. (#271) - A lost
daemon.jsonis put back by the lock holder. (#259) - A daemon frame split across reads dropped the connection. (#285)
- Opaque mode painted the terminal's own background (see-through in kitty).
(#284) --profilewas lost in the thin-client TUI. (#246)- Subagent activity moved a scrolled-up main thread; an observe attach made
a session keep-warm eligible. (#217, #234) - Subagents inherit the retry policy and keep readable errors. (#215)
- Context archive locking, exclusive memory backends, repository discovery.
(#242, #243, #247)
Security
rustls0.23.45 (GHSA-2mjx-qc3c-rqvc / RUSTSEC-2026-0285): every
provider HTTPS call and the auth-broker TLS listener use it.secret_envcan't request host credentials or proxies. The denylist
covers every provider key (includingMETA_API_KEY,KIMI_API_KEY,
HF_TOKEN,NVIDIA_API_KEY,TOGETHER_API_KEY,LOCAL_API_KEY,
OPENAI_CODEX_ACCESS_TOKEN), the AWS key trio and
HTTPS_PROXY/HTTP_PROXY/ALL_PROXY/NO_PROXY. InsideSYNAPS_*a
plugin may name only its own override; a malformed name is ignored with a
warning. docs/extensions/secrets.md. (#256)- "Allow all" covers only the asking extension and only the input owner can
arm it. (#252) find/lsnever run a path as an option. (#256)- A failed OAuth login code exchange shows only the standard error fields.
It could echo request material, and it panicked on multi-byte text. - Events can't forge or hide an
<event>tag. (#261)
Credits
- Haseeb Khalid: shared input,
/sessions,/closeand pins,
reload-extension, event delivery, prompt-cache fixes, the header, turn
budgets, the release-review fixes, integration and merges. - JR Morton: multi-account broker and
auth state, quota keeper, Meta
Muse, subagent watch/steer, extension consent,command-exec, MCP env
expansion, Codex and Kimi K3.1 Pro, thepapertheme, the
on_session_startgate,daemon.jsonhealing, event sanitising,
rollover sizing, thesystemd-runfix. - adityapat958: long-horizon watcher agents,
auth.jsonreload, the
cross-process refresh lock. - telysia-com: axel-memory-service on macOS,
memory.default_modefor
every session.
Internal
- CI runs the suite under a seeded HOME with hardened clippy and the axel
sidecar; flaky tests fixed. (#244, #257, #293) - Specs for multi-client sessions and a daemon-session Petri-net model;
incident write-ups. (#223, #279, #297)
Install synaps 0.11.0
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/HaseebKhalid1507/SynapsCLI/releases/download/v0.11.0/synaps-installer.sh | shDownload synaps 0.11.0
| File | Platform | Checksum |
|---|---|---|
| synaps-aarch64-apple-darwin.tar.gz | Apple Silicon macOS | checksum |
| synaps-x86_64-apple-darwin.tar.gz | Intel macOS | checksum |
| synaps-aarch64-unknown-linux-gnu.tar.gz | ARM64 Linux | checksum |
| synaps-x86_64-unknown-linux-gnu.tar.gz | x64 Linux | checksum |
| synaps-x86_64-unknown-linux-musl.tar.gz | x64 MUSL Linux | checksum |