Changelog
Unreleased: per-node inbox allowlist (who may send to it) and anet node perm (2026-11-10)
- Nodes gain an inbox allowlist,
inbox_allowlist:PUT /api/nodes/:id/inbox-allowlist{"senders": [...] | null}, same shape and authorization aspeer-allowlist(node owner / network owner·admin / hub admin, auditnode_inbox_allowlist_changed). EveryGET /api/nodesrow carriesinbox_allowlist;/healthcapabilitynode_inbox_allowlist. - Entries:
<alias>/<node_id>match agents,user:<username>/user:<user_id>/user:*match people. The owner, network owners/admins and hub admins get through by default;!strictrequires them to be listed too. - For MCP
send_task/send_message/retry_task/reassign_task, RESTPOST /api/taskand scheduled-task runs, a sender not on the list getsnode_permission_denied/sender_not_allowed(explicit, independent ofCOMMHUB_NODE_PERMISSIONS). A broadcast skips those recipients and lists them ininbox_skipped. - New command
anet node perm <node>: show or change the mode, the peer allowlist and the inbox allowlist, with--json. Not published to npm.
Unreleased: standalone anet executable (build only, not published) (2026-10-11)
- New unified entry
agent-network/bin/anet-bin.ts.bun build --compileproduces one executable: the default path is the CLI,__hubis the embedded Hub, and__nodeis the embedded agent-node. The npmbinis stilldist/bin/anet.cjs. npm publishing inrelease.ymlis unchanged. - The compile stamps the agent-network, agent-node, and commhub-server versions.
anet --versionprints those three and a separate bundle version for that build. Under npm / node, versions still come from package.json on disk, and self-spawn arguments stay as they were. - Inside the compiled binary the Hub starts as
anet __hubinstead ofbunx, and agent-node starts asanet __node. claude-agent-sdk, the Codex SDK, and node-pty are not inside the file. - GitHub Actions workflow
cli-binary.ymlcan build linux-x64 and darwin-arm64 on demand.publishdefaults to off. A GitHub releasecli-bin-v<version>is uploaded only when publish is explicitly enabled. This change does not publish. The macOS artifact is unsigned and is not an installable download.
Unreleased: Hub can queue a catalog read for an owned OpenCode V2 node (2026-10-11)
- A network member can call
read_opencode_catalogso the host_supervisor daemon reads the OpenCode V2 loopback it is already running.okwithstatus: pendingmeans the Hub authorized the read and stored it in memory. The doorbell is best-effort: with no subscriber it is not delivered. Onlyget_opencode_catalogwithstatus: readyis a snapshot, and completeness stays unknown and invocationVerified stays false. - This path does not start OpenCode, prompt, or follow redirects. Identity and generation come only from the Hub's existing create record. The request cannot carry url, authorization, directory, settings, headers, or body.
- There is no client picker, and this is not an npm release. Adopted nodes are not in this slice. When the create record has no workdir, the daemon binds the read to the project directory it already owns. The Hub does not see that machine's filesystem.
- A snapshot directory is absolute in its own format. A POSIX Hub does not reject a daemon's
C:\projectas a relative path.C:/projectandC:\projectare the same directory. The daemon expands a stored~/…workdir before comparing it with the loopback directory. The Hub does not expand another machine's home. A symlink workdir is reported as the absolute path stored on the create record.
Unreleased: daemon-mediated delete also drops the node's session (2026-10-11)
- When a node was deleted through its daemon, the Hub finalize removed the
nodesrow but left thesessionsrow asoffline, so/api/statusand client lists built on it kept showing the deleted node (desktop: stuck under "删除请求已提交"). Finalize now deletes that node's session bynode_id, matching RESTDELETE /api/nodes/:id. Matching onnode_idrather than alias leaves a same-alias node rebuilt before the finalize untouched. Offline sessions already left behind are not cleaned up automatically.
Unreleased: daemon-created children keep USER and proxy variables (2026-10-11)
- When the daemon spawns a child, it now copies
USER,LOGNAME, andHTTPS_PROXY/HTTP_PROXY/ALL_PROXY/NO_PROXY(both spellings) from its own environment, in addition toPATH,HOME, andLANG. Unset or empty values are not copied. - Before, on macOS every daemon-created
claude-agent-sdknode answered each task with "Not logged in · Please run /login": Claude Code reads its Keychain login by$USER. On machines that need a proxy to reach the internet, the child connected directly and Anthropic refused it (403 Request not allowed), while runtime readiness, which runs with the daemon's environment, still reported reachable. - Still an allowlist: tokens, API keys,
NODE_OPTIONSand similar never reach the child.USER/LOGNAMEremain reserved, so Hub-supplied env cannot set them.
Unreleased: clone a child node on the same daemon (2026-10-11)
- New Hub tool
clone_node: turn a child that this daemon already created into a new node on that same daemon. New alias, newntok_. The source token,secrets.env, andauth.jsonare not copied. Non-commhub channels (they often carry bot credentials) are not copied. workdir_policydefaults tonew_empty: a new empty directory under the same parent as the source workdir. Source contents are not copied. If the source has no project workdir and lives in the daemon's cwd, the clone is placed at<daemon cwd>/clone-work/<folder>.share_sourceis explicit: both nodes use the source workdir, and the token is still new.copy_sessiondefaults to true. Claude, Codex, and Grok copy the session id only together with the on-disk transcript; if that file is missing, the id is not written. OpenCode sessions live in the OpenCode server, so only the id is copied and both nodes address the same server transcript. That is not a private copy. Localanet node clonestill does not copy sessions.- Naming a different daemon is refused (
cross_daemon_refused).ok: truemeans the request was queued and a doorbell was attempted. It does not mean the child has registered, and it does not mean a session file was copied. This is not an npm release. Hub request #938.
Unreleased: OpenCode V2 user guide (2026-10-11)
- anet.sh gains an OpenCode V2 guide in Chinese and English. The sidebar entry sits next to Grok. It covers V2 create on
opencode-cli, co-presence start, Hub dialogue, and the daemon constraints. - The create path is described as it exists on the published preview channel. The catalog reader (#2574) is documented as main-only: not wired to the daemon, Hub, or client, and not a user command. npm
lateststill has no--opencode-generation.
Unreleased: OpenCode V2 co-presence create matches the machine provider (2026-10-10)
- Creating an OpenCode V2 co-presence node takes the model and provider from OpenCode's own
opencode.jsonon this machine (modelandproviders). A requested model or--providerthat differs is refused, and the refusal names both sides. Create does not substitute a preset default model or the anthropic preset. - The matching
providersentry is copied into the node'sopencode.json. Aproviderentry OpenCode still reads is copied the same way.--base-urland--api-key-envdo not rewrite it on this path. Codex--providerpresets are unchanged. - This is not the Hub
create_nodeformat gate that requires one slash. A well-formed model that does not match this machine's OpenCode is still refused.
Unreleased: daemon can remotely start an adopted native Codex trio (2026-10-10)
- After preflight passes, the daemon starts an adopted native Codex co-presence node with the trusted
anet node start. It tells the Hub the node is started only after the new marker, all three stages, and the saved loopback port match. Remote start of anexternal-appserverlayout stays refused. This does not prove the Codex binary version or rollout, and one-click restart of an adopted node stays refused (stop, then start).
Unreleased: OpenCode V2 create must match an accepted install (2026-10-10)
- When
create_nodesetsflags.opencodeGenerationtov1orv2, the daemon checks thatopencode --versionon PATH is an accepted install of that generation before it writes the node (V2 is@opencode/cli@2.0.22). A mismatch is rejected withopencode_generation_mismatch. Omitting the generation still creates a V1 node. A--versiontimeout is not rejected at this step. - A V2
modelmust be OpenCode's ownprovider/model(exactly one slash). This API does not take a separate provider preset; keys stay in the OpenCode config already on the target node. A missing model isopencode_v2_requires_provider_model, andopencodeUnsafeTools: trueis still required first. opencode-clireadiness may includegenerationandaccepted. V2statestaysunknownand does not becomereadybecause a website answers. The node config snapshot echoes generation, mode, and the unsafe consent onflags;update_node_configcannot change those three.- This is not an npm package publish. See #2544.
Unreleased: Codex and OpenCode V2 providers (2026-10-10)
anet node createandanet node editaccept--provider,--base-url, and--api-key-env. This slice is Codex (codex-sdk,codex-app-server) and OpenCode V2 (opencode-cli --opencode-generation v2 --opencode-unsafe-tools) only. Presets aredeepseek,minimax, andcustom-openai-compat.- Codex writes
[model_providers.*]in the nodeconfig.tomlwithwire_api = "responses"and stores the credential as an environment-variable name. OpenCode V2 co-presence create no longer lets these presets replace the machine's OpenCode config; see “OpenCode V2 co-presence create matches the machine provider” above. The key never goes on the command line or intoconfig.json. - Claude, OpenCode V1, and the Hub vault /
create_nodepath are not in this slice.
Unreleased: adoption candidate discovery (2026-10-10)
- A Linux daemon with
adopt_rootsreports hand-started nodes it can adopt on its heartbeat. Hub lists them atGET /api/adoption-candidatesfor a user token;GET /api/host-supervisorsonly gains anadoption_discoveryboolean, with no workdir. A missing flag does not mean there is nothing to adopt. This step does not adopt, signal, start, or stop, and it does not list co-presence or three-stage nodes.
Unreleased: client download page (2026-10-10)
- anet.sh gains a download page. macOS, Windows, Linux, and Android installers come from the latest published desktop release (the same choice the in-app updater makes). A platform missing from that release is called out instead of linked to an older file. The home page, navigation, and install docs point here.
Unreleased: Codex fork request correlation (2026-10-09)
- A single co-presence node start optionally accepts
--fork-recovery-request-id, recording the ID on a confirmed fork mapping while preserving prior history. This does not mean startup completed; Hub/daemon forwarding and the client recovery button are not connected yet. See recovery notes.
User-facing changes, newest first. To see which version a channel points to right now: npm view @sleep2agi/agent-network dist-tags (same for agent-node and commhub-server). Full release notes for every npm version are in the repository's docs/tests/release-v<version>.md; desktop notes are at agent-network-app releases.
Node visibility: rules files, skills, project folder — preview (2026-09-23 to 09-25)
Coordinated release: commhub-server@0.9.0-preview.56–.60, agent-node@2.5.0-preview.85–.88, agent-network@2.3.0-preview.110–.115 (agent-node@.84 never became visible on npm and is superseded by .85).
- Read-only project folder browsing (#1999): new hub tools
list_node_files/read_node_filelet you walk a node's working directory level by level and view text files (≤256 KiB). Credential-like files (.env*, private keys,auth.json, …) are listed by name only; paths and symlinks cannot escape the working directory; node tokens cannot start a browse. Requires hub.59+ agent-node.88(or anet.115) + desktop 0.2.94 - Read-only node skills (#1984):
list_node_skills/read_node_skilllist skills from where each runtime (codex / grok / opencode / Claude Code) actually loads them, and read SKILL.md - Claude Code sessions can have CLAUDE.md read/written remotely (#1977):
read_node_rules_file/write_node_rules_filegain analiasparameter that can target a session without a node row; running sessions must be restarted on anet.111to report the capability - Staged content is cleaned up (#2001, hub
.60): rules files, SKILL.md and file-read results are cleared 60 s after the requester fetches them, unfetched content after 24 h, and rows are deleted after 30 days; the first run after deploy clears all content older than 24 h in one pass - Pickups resolve by the token's bound node (#1994, hub
.58): when an alias has several rows, rules-file / config-update requests no longer go to a stale row and wait 60 s for nothing - Steadier codex-app-server startup (#1988 / #1989 / #1991): new
ANET_QUEUE_TIMEOUT_MS(queue deadline) andANET_CODEX_RESUME_TIMEOUT_MS(startup session resume, default 120 s, one retry on timeout); a failed resume reports offline to the hub before exiting, so the hub no longer shows a dead node as idle; an unbound legacy token now only disables outbound reconciliation instead of stopping inbox compensation too - Daemons can still create nodes after a reboot (#1976, anet
.110): daemons started throughanet node start/restartor the boot sweep also pin the anet binary, ending the "online but cannot create nodes" state
Desktop 0.2.85–0.2.97 (2026-09-24 to 09-25)
Signed updates for macOS (Apple Silicon) and Windows (x64).
- Look: a quieter palette and hierarchy (surfaces separated by tone, text contrast ≥4.5:1); thin scrollbars that appear on hover; long code, hashes and URLs wrap inside chat bubbles
- Redesigned node page (0.2.87–0.2.88): header card plus section bar (Overview / Model & runtime / Rules file / Skills / Tasks / Danger zone); tasks grouped into In progress, Queued, Possibly stuck and Recently finished; centered layout on wide windows
- Rules-file editor (0.2.85–0.2.93): shown for Codex / OpenCode / Claude nodes; a rendered Read mode by default, full-screen view with a heading outline, double-click a passage to jump to its source in the editor; periodic refresh no longer wipes unsaved edits; an agent-node that is too old is reported with the required version instead of a 60 s wait
- Skills and project folder: read-only Skills section (0.2.87) and project-folder browsing (0.2.94), with a clear upgrade hint when versions are too old
- Unread and notifications: the macOS menu-bar unread count now clears and the panel is no longer capped at 20 conversations (0.2.92); a "New messages" group at the top of the node list (0.2.95)
- Find and replace in rules files (0.2.97):
Ctrl+F/⌘Fworks in Read, Edit and full screen with jumps between matches; Edit mode can replace, changing only the draft until you save; a read now always shows content or a reason within 90 s, and stale content is no longer shown as an editable empty file - New Grok nodes default to ACP mode (0.2.97): co-presence moves under Advanced and is marked experimental
- Other: Settings → About update checks always end in a visible result (0.2.88); in full-screen reading, macOS traffic lights and Windows caption buttons are no longer covered (0.2.96); the Grok TUI co-presence runtime is labelled Preview in the wizard
Queue correctness and runtime fixes — preview (2026-09-22 to 09-23)
agent-node@2.5.0-preview.76–.83, agent-network@2.3.0-preview.100–.109 (.102 is void on npm and superseded by .103).
- The codex queue no longer runs work twice or late (#1939 / #1945): every terminal path removes the local queue row; queued rows ask the hub before dequeue, so tasks already acknowledged or finished no longer start a turn
- grok-build-acp really uses the configured model (#1961): the model is passed at launch and read back via
session/set_model; a mismatch fails before any prompt, and the hub shows the model actually in effect - Explicit codex binary selection (#1971): order is
codexBinconfig →ANET_CODEX_BIN→ a PATHcodexno older than the bundled one → bundled; the startup log prints path and version. Fixes clean installs whose bundled codex was too old for newer models ("requires a newer version of Codex"). #1974 stops the false reasoning-tier warning on newer codex - opencode co-presence survives a remote model change (#1950 / #1964 / #1966): restart no longer refuses on its own previous generation's
ANET-COMMHUB.md; the old attach TUI is stopped precisely and the new session is re-attached in the same tmux pane anet node codex forkgains five fixes (#1954, anet.104): creates a missing--workdir, rewrites the project table header,--modeloverride with a mismatch warning, pre-probes a free port, carriesAGENTS.mdalong- grok co-presence marked Preview (#1968):
anet setup,anet node createand the docs labelgrok-build-clias Preview and point to the stablegrok-build-acp; the refusal for an unverified grok binary now includes a copy-pasteGROK_BINARY=… anet node startrecovery command
Shared codex login detection + long-turn observability — preview (2026-09-19 to 09-20)
agent-node@2.5.0-preview.73–.75, agent-network@2.3.0-preview.97–.99.
- Nodes sharing one codex login are named (#1920 / #1928 / #1931): at startup a refresh-token fingerprint check warns and lists the other nodes sharing the login (warn only, never refuses to start). The check runs inside agent-node, so directly launched nodes are covered, and comparison is host-wide (
~/.anet/codex-auth-fingerprints/). Use anet.99+ agent-node.75for the complete behavior - Named refresh-failure causes:
rotation-conflict(the token was already used by another node; log in once again) andtoken-endpoint-unreachable(egress cannot reach the token endpoint) are reported separately; the message explicitly says not to copy another node'sauth.json - Long-turn heartbeat (#1919): grok nodes write an
in-flight: … elapsed=… last=…line every 30–60 s during a turn, so "quiet" and "stuck" are distinguishable - Less stderr noise: known-benign grok stderr is folded into one INFO line per turn instead of flooding WARN
ANET_LOG_LEVEL: a newANET_-prefixed log-level variable; invalid values warn once (a mistypedLOG_LEVELused to fall back to info silently)
Attachments, cross-WAN node start, clearing unread — preview (2026-09-14 to 09-17)
commhub-server@0.9.0-preview.54–.55, agent-node@2.5.0-preview.69–.72, agent-network@2.3.0-preview.90–.96 (.94 never became visible on npm and is superseded by .95).
- Local file links in replies become attachments (#1869 / #1876): any runtime can write
[name](/absolute/path)in a reply and the desktop shows a downloadable attachment card; files that cannot be uploaded are annotated with the reason (outside the workdir/home, over 12 MB, …);attachmentspassed as a string on claude-code-cli nodes is no longer dropped - Cross-WAN hubs are no longer misjudged (#1882): the hub health probe in
anet node startdefaults to 10 s for non-loopback hubs, overridable withANET_HUB_HEALTH_TIMEOUT_MS(1000–60000) - Gzip hub responses (#1897, hub
.54): JSON/text responses ≥1 KB are compressed on request and/api/status?light=1truncates task text, making node lists and chat history much smaller on slow links - Mark an agent read in one call (#1909, hub
.55):POST /api/messages/ackaccepts{ "agent": "<alias>" }to clear all unread from that agent (used by desktop 0.2.73+) - Finished tasks are not re-run (#1902): serial queues check task state before dequeue; replied/closed tasks are only acked, never started
- claude-code nodes drain the inbox (#1901): each new-task event fetches the whole backlog, so the 6th message onward no longer waits for the next event
- opencode co-presence reply ownership (#1912): long turns that went through context compaction are no longer rejected as "not owned" with the answer dropped; when still rejected, the answer is attached to the error
- The co-presence identity reaper only targets its own process tree (#1872): unrelated processes that inherited a node marker are no longer killed as a previous generation; two common grok co-presence startup failures now include recovery commands (#1882 / #1888);
anet grok --helplists themodelsubcommand (#1886)
Desktop integration and the Codex lifecycle controller — preview (2026-09-06 to 09-10)
commhub-server@0.9.0-preview.50–.53, agent-node@2.5.0-preview.67–.68, agent-network@2.3.0-preview.86–.89.
anet node codexlifecycle commands (#1856, anet.89): read-onlypreflight/verify; deterministicstart/restart/resumewith rollback on failure;forka new node that inherits history;account register|list|installandrollbackfor logins; sequentialcanary. Plusanet node edit --workdir- Reply attachments land in the right bubble (#1824, hub
.50): an agent's reply attachments no longer render under the asker's bubble or overwrite the asker's own attachments - Authoritative per-agent unread counts (#1838, hub
.51):GET /api/messages?scope=userreturnsunread_by_agent/unread_total, and acks sync across devices - The wizard shows why node creation failed (#1843, hub
.52): newGET /api/node-create-requests?request_id=surfaces the daemon's error directly - OpenCode co-presence on macOS (#1847 / #1848 / #1849): package identity check, launch isolation and process identity now support darwin (Windows still unsupported)
provider/modelmodel names allowed (#1853): hub and daemon both accept a single slash, so the wizard can create nodes withopencode/…models
Co-presence and CLI reliability — preview (2026-09-03 to 09-04)
commhub-server@0.9.0-preview.46–.49, agent-node@2.5.0-preview.59–.66, agent-network@2.3.0-preview.77–.85.
- Standard MCP clients get the tool list again (#1763, hub
.46):tools/listno longer throwsschema._zod, so Claude Code MCP configs, Inspector and similar clients can list tools blockedhas a way out (#1793, hub.47): a node returns toidleafter sending a terminal reply or dispatching a task; internal hub errors now return the real error message to MCP callers (#1801)- grok co-presence stops timing out task after task (#1774 / #1775 / #1776): the verified grok binary is pinned; a missing
turn_endedis abandoned after a bounded wait; a half-typed TUI input left idle for 10 minutes yields to queued work. Stopping no longer leaves 5 placeholder files behind (#1784 / #1817) - No more duplicate replies from co-presence nodes (#1770): the model's own extra messages to the task sender are rewritten into non-push progress reports (requires anet
.77+ agent-node.62, and a node restart) - CLI:
anet node startrefuses a second session for a running node (#1804); prefers the agent-node installed beside anet (#1813);anet node editsupports--runtime/--model;--force/--yesno longer swallow the next argument; agents can send files viaattachments(#1186); grok co-presence can start on Mac / Windows (with a reduced-isolation notice) - Richer roster data: claude-code nodes report telemetry and model (#1787 / #1799); handover reports no longer wipe version and telemetry (#1810); codex co-presence readiness is probed by port and becomes ready in seconds (#1798)
- Delegation false positives fixed (#1805): "let/ask X …" patterns only count as delegation at the start of a sentence or line, so mentioning another node in prose no longer creates phantom tasks
agent-network 2.3.0-preview.76 promoted to latest (2026-09-02)
npm i -g @sleep2agi/agent-network now installs 2.3.0-preview.76 by default. It includes all CLI improvements through 2026-09-02, notably the error-message, help and layout fixes in the 08-29 to 09-02 entries below.
agent-node 2.5.0-preview.58 promoted to latest (2026-09-02)
The latest tag of @sleep2agi/agent-node points to 2.5.0-preview.58, which supports remote node rules-file read/write. commhub-server's latest did not move in this period (still 0.9.0-preview.30); install preview for the newer hub capabilities.
Remote node rules files + CLI wording overhaul — preview (2026-09-02)
Coordinated release: commhub-server@0.9.0-preview.45, agent-node@2.5.0-preview.58, agent-network@2.3.0-preview.76.
- Node rules files (#1755): the desktop can read and write a node's
CLAUDE.md/AGENTS.mdremotely; the hub addsread_node_rules_file/write_node_rules_fileand related tools; nodes only read/write inside their own working directory and the chain has no path parameter - Did-you-mean and subcommand help: mistyped commands such as
daemonget the right suggestion;anet goal/token/batch/opencode/network/channel/session --helpprint their own help - Unknown node names get close matches, with separate messages for "no nodes", "similar names exist" and "no similar names"
- Table layout: CJK aliases, long runtime names and multi-line task text no longer skew
node ls/status/tasks;anet demono longer prints literal color codes - Time and diagnostics: hub timestamps are labelled UTC with a relative age;
anet doctorsays what each check measures, lists actual runtime CLI versions, and no longer reports zero nodes as an error
Node-creation capability made visible + grok co-presence UX — preview (2026-08-30)
commhub-server@0.9.0-preview.43–.44, agent-node@2.5.0-preview.53–.57, agent-network@2.3.0-preview.68–.75.
- Whether a daemon can create nodes is now obvious (#1545):
anet daemon listreports create capability in five distinct messages with when it was measured; the hub checks the daemon's reported capability before dispatchingcreate_nodeand explains refusals (#1510 / #1511 / #1588) anet daemon restart <name>(#1601, anet.74): restart a daemon in one command; if it fails to come back, it says clearly that the daemon is now stopped and how to retry (#1616)- grok co-presence:
anet grok attachuses the alternate screen and restores your terminal on detach (#1514); the recovery TUI shows grok's real output when it exits (#1518); leaderless builds such as grok 1.0.5 are no longer permanently reportedblocked(#1609) - Errors point the right way: a 401 is no longer called "cannot reach hub" (#1581);
anet daemon startwarns when grok is installed but not on the daemon's PATH (#1586); grok not found distinguishes not-on-PATH / not executable / failed to start (#1582); theanet_bin_sourcefix command now actually runs (#1521) anet statusno longer shows stuck/errored nodes as working (#1577); Feishu channels are refused on non-claude-agent-sdk nodes (#1575)anet node stopno longer reports failure because of a leftover socket path with no listener (#1526)
grok co-presence fixes, Windows support, persistent desktop messages — preview (2026-08-29)
commhub-server@0.9.0-preview.39–.42, agent-node@2.5.0-preview.44–.52, agent-network@2.3.0-preview.60–.67.
- grok co-presence TUI: immediate notice when a slash command is blocked (#1404); a clean
/model <id>is executed on your behalf (#1408); no more black screen after attach (#1412); switching models no longer crashes the node (#1416) - Windows works (#1137 / #1489 / #1494 / #1504):
anetcan launch npm/npx and other external launchers, and the daemon can fork nodes on Windows without children crashing on a missingHOME. Upgrade both anet.66and agent-node.51or later - Desktop messages are no longer lost (#1481 / #1485 / #1488):
send_desktop_messagepersists before pushing; newGET /api/messages?scope=userandPOST /api/messages/ackwith unread counts and token-shaped strings masked on read - Nodes start on machines without a non-loopback IPv4 (#1498 / #1506): the hub accepts
host.ip = null, and nodes retry without optional telemetry on a schema mismatch - The daemon is a pure program again (#1418): free-text tasks no longer invoke an LLM; only structured lifecycle commands run. stop/start/delete doorbells are replayed after SSE reconnect (#1450)
- Security: node deletion cleans the real working directory and no longer leaves node credentials behind (#1478; on machines where cwd ≠ home, check
.anet/nodes/manually for nodes deleted before upgrading) - CLI:
anet node create --resumeinfersclaude-code-cli(#1420); the interactive wizard shares the named path's environment checks (#1473);--copresencestartup failures name the failing step and log paths (#1500)
Reliability sprint: stop/delete convergence + node logs + timeout guard — preview (2026-08-28 evening)
Coordinated release: commhub-server@0.9.0-preview.36–.38, agent-node@2.5.0-preview.40–.43, agent-network@2.3.0-preview.54–.59.
create_node doorbell compensation (#1362, absorbing #1364): doorbells missed during an SSE outage are no longer lost forever — on reconnect the daemon calls the new hub tool
list_my_pending_create_requestsand replays them (.38/.43pair)stop/delete convergence (#1286 trio): daemon-side ack tracing, hub-side six-exit instrumentation for
ack_stop_request, stuckdeletingrows re-dispatchable withforce(5-minute staleness criterion)claude-code-cli node logs (#1345): the stdio proxy now mirrors every log line into
.anet/nodes/<alias>/logs/(UTC-dated files) — per-alias node logs exist for this runtime for the first time; includes a stop-race guard (a torn-down node dir is never resurrected)callCommHub timeout (#1357): 30s
AbortSignal.timeout— a hung hub can no longer silently swallow doorbellsdaemon capability visibility:
runtimes_supportedwidened to 7 (#1376), four-class creation-failure codes (#1377), hublifecycle_controllableflag (#1374) pairing with desktop button disabling (app#197/#200 — the three TUI co-presence runtimes join the create wizard, zero-key, following the host login)agent-initiated push:
send_desktop_messagedocumented (guide/channels)
Exact BTW task boundary — Hub preview (2026-08-28)
commhub-server@0.9.0-preview.34 adds optional thread_id / turn_id fields to task records and returns them through REST and MCP task projections. The Hub accepts a boundary only when the consuming node reports it for an owned task without conflict. Older nodes and historical tasks remain compatible; absent boundaries stay explicitly absent and are never guessed or backfilled. The paired agent-node@2.5.0-preview.39 and agent-network@2.3.0-preview.53 will follow after the Hub is published, in dependency order.
Durable Codex co-presence and safe teardown — preview (2026-08-26)
This paired preview release is agent-network@2.3.0-preview.46 / agent-node@2.5.0-preview.34 / commhub-server@0.9.0-preview.30. The Hub adds immutable node cursors and a monotonic terminal journal for durable recovery after a missed SSE notification, while task delivery returns the network-authorized actual_to. Codex co-presence keeps one bridge and a shared CODEX_HOME plus thread/history; node stop now converges the managed app-server, bridge, and TUI resources. Linux and protected Windows Codex 0.148 gates cover upgrade recovery, active-turn steering, and history preservation.
Versioning note
This log runs reverse-chronologically. The version scheme was reshuffled once:
- From 2026-05 onward: gradual v0.6 → v0.7 → v0.8 → v0.9 → v0.10 → v0.11 releases; the
v0.X.Yformat mirrorscommhub-server's0.X.Ysemver style. - Before 2026-04: used
v1.0.0-preview.N/v2.1style version numbers that overpromised. Deprecated. - Current stable: whatever npm's
latesttag points to (see Versioning — npmlatestis authoritative); v0.8.1 was the first Apache 2.0 OSS release. - Current preview: follow npm's
previewdist-tag. Bothlatestandpreviewnow includegrok-build-cliandanet grok attach(experimental;grok-build-acpremains the default recommendation); see the Grok nodes. - Entries for v0.9.2 and earlier (including v1.0.0-preview / v2.1 / v0.x) are linked under Older releases at the end of this page.
Grok Co-presence TUI (grok-build-cli) — preview (2026-07-15) 🟡 preview
Correction — 2026-07-31
The section below records a candidate milestone. Its installation and usage commands are as written at the time; do not copy them. grok-build-cli / anet grok attach later shipped in the npm packages (experimental); for the current status and usage see the Grok nodes.
Version sync (npm @preview tag):
@sleep2agi/agent-network@2.3.0-preview.23@sleep2agi/agent-node@2.5.0-preview.21
Note:
preview.2–preview.22were incremental iterations (see git history); this entry records the co-presence milestone.
🌟 Highlights
Grok co-presence: attach to the real Grok TUI held by the agent-node
New grok-build-cli runtime + anet grok attach <alias>: you and CommHub network tasks share one Grok session — network tasks render live in the terminal, reply back to the originator, and you can watch and type alongside.
anet node create grok-shared --runtime grok-build-cli
anet node start grok-shared # wait for: attach with anet grok attach grok-shared
anet grok attach grok-shared # Terminal 2, real TTY, same machine/user/project dirConstraints: Linux only, exact grok 0.2.93 (f00f96316d), fixed text-only [todo_write] profile (no fs/shell/network/MCP tools), trusted Hubs only, preview (not latest/production). Full usage and caveats: Grok Co-presence TUI.
opencode-cli — the 5th Runtime (RFC-029) — preview (2026-07-09) 🟡 preview
New opencode-cli runtime: use the public sst/opencode CLI as a multi-vendor front-end (unified session / auth abstraction) — anet's 5th runtime. Preview channel only (RFC-029 in progress) — not yet in npm latest: after installing latest, the anet node create picker shows only the 4 formal runtimes (claude-code-cli / claude-agent-sdk / codex-sdk / grok-build-acp); it lands in latest once stabilized.
🌟 Highlights
anet node create --runtime opencode-cli(preview channel): the interactiveanet node createwizard is now a 5-way picker (opencode-cli added; npmlatestis still 4-way).- Vendor preset: after picking the runtime, choose an
anthropic(readsANTHROPIC_API_KEY) oropenai(readsOPENAI_API_KEY) preset — the key is read from env, not prompted. - Parent-mediated model: same as
codex-sdk— opencode runs as a pure LLM worker; the commhub SSE / inbox / reply roundtrip is handled by the agent-node parent process (no commhub MCP server on the opencode side). - Version pin: spawns the local
opencodeCLI at a fixedopencode-aiversion pin (the firstanet node createpromptsnpm i -g opencode-ai@<pin>); the free-model keyless path passed full e2e (2026-07-09).
Usage and comparison: Node Runtime — Five runtimes; design: RFC-029.
v0.11-preview2 — /loop works for every runtime + security batch + RFC-024 hub config-apply foundation (2026-06-28) 🟡 preview
Version alignment (npm @preview tag, three packages in sync):
@sleep2agi/agent-network@2.3.0-preview.1← bumped (CLI: newanet node loopsubcommand)@sleep2agi/agent-node@2.5.0-preview.1← bumped (runtime:/loopworks across all runtimes)@sleep2agi/commhub-server@0.9.0-preview.1← bumped (hub: security batch + RFC-024 PR A)
PINNED_SERVER_VERSION updated to 0.9.0-preview.1 — anet hub start lazy-fetches the matching hub binary automatically.
🌟 Highlights
/loop now works for every runtime
Before preview2, the /loop self-scheduler only ran for the claude-code-cli runtime; agent-node-driven runtimes (claude-agent-sdk / codex-sdk / grok-build-acp) silently skipped goal ticks. preview2 removes that runtime-bucket skip — every runtime can now drive a /loop goal end-to-end.
Plus: new anet node loop CLI to manage goals from outside the agent — set / list / cancel a node's running /loop jobs without entering an interactive session.
anet node loop my-codex "monitor PR #271" --every 5m
anet node loop researcher "scan twitter for grok updates" --every 30m
anet node loop daily-bot "post the morning summary" --every 2hFull usage + trigger mechanics: Agent Node — Loop scheduler (ZH + EN parity).
🔒 Security batch
Four cross-tenant / data-integrity gaps closed for public-hub multi-user / multi-network deployments:
- Cross-tenant write guards (#287, RFC-024 PR A): 4 new MCP tools (
update_node_config/get_config_update/ack_config_update/restart_node) gate every write bynode.network_id == caller.effectiveNetId, mirroring the #275 pattern.report_statusupsert no longer lets a node row cross networks. SQL-layer trust root protected by theupsertNodeWithSec1Guardhelper + 5 real-driver regression tests + 6 inline-mirror tests retention sweep+ incremental VACUUM (#282): hub sweeps old task / inbox rows on a background schedule; theagent_telemetryindex is split so the periodic READ doesn't write-amp. Multi-tenant deployments see steadier CPU- Read-path stale-marker fix (#283): sessions stale-mark moved off the read path to a single background sweeper —
/api/statusis no longer a write-amp call - Password KDF strengthening (#285): scrypt path gets a verified-modern parameter set, backwards-compatible (existing hashes still verify; new hashes use the stronger params)
Engineering hardening
superviseChild()shared helper (#284): theconnectFeishu+connectSSEsupervisor logic (while-loop respawn + jittered backoff + stable-uptime reset + shutdown gate + abandon-after-timeout) extracted into one helper. Two intentionalconnectSSEimprovements landed alongside (±25% jitter to defend against thundering-herd reconnects after a hub restart; backoff no longer resets on a raw HTTP 200 — only on the SSE"connected"event — fixes a hot ~1s reconnect loop)- RFC-024 hub config-apply foundation (#287): the 4 MCP tools + schema (
nodes.config_revision/nodes.config_snapshot/node_config_updatestable) land in preview2. Dashboard 改配置真生效 is the consumer side (PR B + PR C); those merge in a follow-up preview2.x / preview3
Not in preview2 yet
- RFC-024 PR B (agent-node config-apply runtime + W1 supervisor) — separate PR #290, depends on PR A (which IS in preview2). Queued for preview2.x / preview3
- Dashboard 改配置 end-to-end — PR C is a 1-line constant swap in
sleep2agi/agent-network-dashboard; fires after PR B merges
Install / Upgrade
Clean install (new user):
npm install -g @sleep2agi/agent-network@2.3.0-preview.1
npm install -g @sleep2agi/agent-node@2.5.0-preview.1
npm install -g @sleep2agi/commhub-server@0.9.0-preview.1Upgrade (existing user tracking the preview channel):
anet upgrade --channel previewRestart any running nodes so they pick up the new runtime:
anet node stop <alias>
anet node start <alias>Full upgrade workflow + cross-version migration → Upgrade Guide.
v0.10.15 — Wave 2 CLI UX polish (9 items) (2026-06-10) ✅ stable
Version sync (npm latest tag): CLI-only release — no agent-node / commhub-server change, no PINNED bump, no hub/runtime restart needed.
@sleep2agi/agent-network@2.2.12← bumped (from 2.2.11)@sleep2agi/agent-node@2.4.10← unchanged@sleep2agi/commhub-server@0.8.5← unchanged (PINNED)
🌟 Highlights
Trustworthy anet hub status (P1.1 / #214 F7-04)
In containers (node:24-slim, alpine…) without lsof, the old build falsely reported "Hub not running" even when /health returned 200, and busybox lsof streamed fd numbers as PIDs, rendering 60+ junk entries. Fix (commit d33bbfc): /health is now the ground truth (no more false negatives); the PID list is sanity-filtered and folds to "top-3 + count" when >5; three clear states (healthy / port-held-but-unhealthy / not-running), each with the right hint.
Did-you-mean command correction (P1.2 / #214 F7-02/10/11)
Typos within Levenshtein distance ≤2 get an auto-suggestion instead of a 50-line help dump. Wired into the top-level, anet node, and anet project default branches:
$ anet creat
Unknown command "creat". Did you mean: anet create?anet node restart <alias> (P1.3 / #173)
Symmetric with anet project restart / anet batch restart — restart a single node without typing stop + start.
-V and anet help aliases (P1.4 / #192)
-V (uppercase, cargo/git/docker convention) equals -v / --version; anet help (no dash) equals --help / -h.
🐛 Bugs Fixed
- #214 hub status PID list corruption (container lsof streamed-fd pollution)
- #214 hub status falsely "not running" (
/health200 but lsof unavailable) - #214 no hint on mistyped commands (F7-02/10/11)
📦 Install
npm i -g @sleep2agi/agent-network@latest
anet --version # agent-network v2.2.12 ⬆v0.10.14 — Reply reliability / dispatch dedup / idle timeout / --help safety (2026-06-10) ✅ stable
Version sync (npm latest tag):
@sleep2agi/agent-node@2.4.10← bumped (from 2.4.9)@sleep2agi/commhub-server@0.8.5← bumped (from 0.8.4, PINNED realigned)@sleep2agi/agent-network@2.2.11← bumped (from 2.2.10)
🌟 Highlights
#168 Reply reliability (codex / claude / grok — all runtimes)
Symptom: a node wrote its output to /tmp on time, but the completion reply never reached the dispatcher — operators only saw "idle / no output" and had to ls /tmp by hand. Root cause was in the shared agent-node callCommHub + sendReply + processInbox chain, not runtime-specific. Fix (commit 5b61d1c): new reply-reliability.ts (CommHubError typed class + classifyCommHubResponse classifier for success/retryable/appLevel + a disk-persisted idempotent PendingReplyQueue that survives restarts and keeps an attempts counter); processInbox reworked to drain-pending → inflight guard → process → persist + send + clear-on-success → ack. 20 new test cases (bun test 111 pass / 0 fail, zero schema change). Server side (#216): send_reply now has three-way semantics — not_found not stored / offline stored as explicit queued / structured error — fixing the earlier false-positive ok:true.
#212 Dispatch dedup (commhub-server guardrail)
Server-side dedup per (from, to, content-hash), 5-min default window, in-memory with zero schema change (commit 1f3ae1e). When an agent retries or a user double-fires the same prompt, only one passes within the window. Tunable via COMMHUB_SEND_DEDUP_WINDOW_MS.
idle timeout + --help safety
The remaining two of the four: node idle-timeout handling, and safer --help output.
📦 Install
npm i -g @sleep2agi/agent-network@latest @sleep2agi/agent-node@latest
anet --version # agent-network v2.2.11 ⬆
agent-node --version # agent-node v2.4.10 ⬆v0.10.13 — grok-build-acp session/prompt 300s timeout hang fix (P0 hotfix) (2026-06-08) ✅ stable
Version alignment (npm latest tag):
@sleep2agi/agent-node@2.4.9← bumped (#210 / #204 runtime — ACPhandleServerRequestnon-integer error-code coerce fix)@sleep2agi/agent-network@2.2.10← unchanged@sleep2agi/commhub-server@0.8.4← unchanged (PINNED)
🌟 Highlights
Root cause + fix for grok-build-acp nodes hanging at session/prompt timed out after 300000ms
Symptom: A grok-build-acp runtime node accepts a second task, hangs for ≈5 min, then agent-node reports grok ACP request 'session/prompt' timed out after 300000ms. an ai-insight user's Grok node (grok 0.2.29 alpha) captured the exact 2026-06-07 19:53:09 log:
ERROR failed to parse incoming message: invalid type: string 'ENOENT',
expected i32 at line 1 column 48.
Raw: {'jsonrpc':'2.0','id':5,
'error':{'code':'ENOENT',
'message':'ENOENT: no such file or directory, open ...'}}Root cause: ACP server-request responses (e.g. a failed read_file) carry a JS-native string error code like 'ENOENT', but the Grok agent's protocol requires code to be an i32 integer. The old agent-node passed the string straight through → Grok agent parse failure → undefined state → hang until the client-side 300 s timeout.
Fix (commit 4818776): client.ts:handleServerRequest adds a Number.isInteger(rawCode) guard. Non-integer codes are coerced to -32000 (the JSON-RPC standard reserved range); the original string is preserved on data.originalCode so no information is lost.
New regression tests: +2 cases, bun test 89/89 pass.
Live verification (in-house, 2026-06-07 19:50–19:55):
- Same-shape
read_filefailure retried: returns structuredcode: -32000+data.originalCode: "ENOENT"immediately - The grok turn continues without hanging; the task completes normally (47 s, well under the 300 s timeout)
- ai-insight's Grok node passed UAT after installing
2.4.9-preview.0globally
🐛 Bugs Fixed
- #210 / #204 runtime —
grok-build-acpACP server-request responses carrying non-integer error codes (e.g.ENOENT) caused the Grok agent to fail to parse and hang until the 300 s timeout
📦 Install (fresh install)
npm i -g @sleep2agi/agent-network@latest @sleep2agi/agent-node@latest
# Verify versions
anet --version # agent-network v2.2.10 (unchanged)
agent-node --version # agent-node v2.4.9 ⬆anet hub start auto-fetches commhub-server@0.8.4 (PINNED, unchanged).
🔄 Upgrade (existing users)
Narrow path (recommended — only this package needs the hotfix):
npm i -g @sleep2agi/agent-node@2.4.9
# Restart every grok-build-acp node
cd <your-anet-workdir>
anet node stop <grok-node-alias> && anet node start <grok-node-alias>Full sweep (also refreshes READMEs / metadata):
anet upgrade⚠️ Node version note: agent-node supports Node ≥ 18; this hotfix's Docker smoke ran clean on both Node 20.20 and 24.16.
For the full troubleshooting entry see troubleshooting → grok-build-acp node task hangs.
🙏 Credits
Bug repro + root cause + UAT: live 19:53:09 capture + a 47 s pilot on a user's Grok node; fix implementation: commit 4818776 + 2 regression tests; release ops: Method B two-phase + dual Install/Upgrade release notes sections.
Full Changelog: https://github.com/sleep2agi/agent-network/compare/v0.10.12...v0.10.13
v0.10.12 — Grok-build runtime scenario enablement + 0.2.8 alpha regression verify (2026-05-30) ✅ stable
Version alignment (npm latest tag):
@sleep2agi/agent-node@2.4.8← bumped (scenario docs + 0.2.8 alpha regression baseline tag)@sleep2agi/agent-network@2.2.10← unchanged@sleep2agi/commhub-server@0.8.4← unchanged
Highlights
- Video-generation scenario (0 LOC): Send a Grok node a task carrying an image URL; the backend auto-routes to the
grok-imagine-videomodel and returns mp4. Anet itself ships zero code changes — verified via ffmpeg first-frame visual check. See research/grok-video-gen-capability-probe.md (with Erratum) + scenarios/video-gen-marketing.en.md. - Basic X search (out-of-the-box): Find X URL + title + excerpt by keyword / handle — the LLM does it via
web_search+allowed_domains=["x.com"]. No pre-setup required. - Live X advanced search (workspace setup required): Live streaming + per-post faves / retweets / replies metadata +
since:/min_faves:operators — requires the user to pre-stage a twitterapi.io API key + fetcher script that the LLM drives viarun_terminal_command. See scenarios/x-search-informant.en.md. - 0.2.8 alpha regression verify: 87 / 87 bun unit tests pass; the #201 delegation detection + #204
.mcp.jsonisolation fixes hold on Grok 0.2.8 alpha. Detail: tests/p-grok-028-regression-verify/report.md. - RFC-021 §12 / §13: ACP capability dossier updated with Path D (workspace setup + terminal bypass) + XSearch ACP exposure test (XSearch's backend tool is structurally not exposed via ACP on 0.1.219 → 0.2.12 alpha; long-term resolution sits in the upstream xAI PR #1302).
Install / Upgrade
Non-breaking; 0.2.8 alpha regression verified, safe to upgrade:
anet upgradeOr single-package: npm i -g @sleep2agi/agent-node@2.4.8
Full Changelog: https://github.com/sleep2agi/agent-network/compare/v0.10.11...v0.10.12
v0.10.11 — #204 grok-build-acp per-node identity isolation + #194 commhub broadcast attribution hotfix (2026-05-28) ✅ stable
Version alignment (npm latest tag):
@sleep2agi/agent-network@2.2.10← bumped (anet hub stop/anet hub statussubcommands #200 +anet hub startstderr inherit #199 silent-hang fix + PINNED commhub-server0.8.3→0.8.4)@sleep2agi/agent-node@2.4.7← bumped (#204 grok-build-acp per-node.anet/nodes/<alias>/runtime-cwd/isolation + #201 Grok delegate parser 3-layer broaden)@sleep2agi/commhub-server@0.8.4← bumped (#194 broadcastchannel_meta_jsonsender attribution hotfix —from_sessioninjection no longer overrides the real LLM agent alias)@sleep2agi/agent-network-dashboard@0.5.6← unchanged
🌟 Highlights
#204 — grok-build-acp per-node isolated cwd
Problem: grok-build-acp runtime nodes shared the .mcp.json discovery path, causing stale .mcp.json identity pollution — if a node's working directory carried an old .mcp.json, a newly started Grok node would be misidentified as that prior node.
Fix: Every node forks an isolated cwd (.anet/nodes/<alias>/runtime-cwd/), decoupled from the discovery path. This eliminates stale .mcp.json interference.
E2E verification: cross-node dispatch on a live Grok node — channel sender attribution correctly attributed to the sending node's alias, proving the LLM-layer attribution path is uncontaminated.
#194 — commhub broadcast sender attribution hotfix
Problem: On cross-node broadcast, the channel_meta_json sender field went through the from_session injection path, which overrode the real LLM agent name.
Fix: commhub-server 0.8.4 corrects the from-name injection logic to preserve the real sender alias.
🐛 Bugs Fixed
- #199 —
anet hub startsilent-hang fix:spawnstdiochanged from"pipe"to"inherit"— commhub-server bunx fetch failures are now immediately visible. - #200 —
anet hub stop/anet hub statussubcommands: users no longer need manuallsof + kill. Nowanet hub stop [--port <p>](SIGTERM → 3s grace → SIGKILL) +anet hub status(PID + port +/healthversion). - #201 — Grok runtime refusing to delegate: explicit delegation parser 3-layer wrapper broaden + prompt softening covers all cases.
📦 Install (fresh install)
npm i -g @sleep2agi/agent-network@latest
# Verify version
anet -v # Should show v2.2.10anet hub start auto-fetches commhub-server@0.8.4 (PINNED) + the first node start auto-fetches agent-node@2.4.7.
🔄 Upgrade (existing users)
anet upgrade
# Or manually
npm i -g @sleep2agi/agent-network@latestanet upgrade syncs agent-network + agent-node + commhub-server to the latest latest versions.
🙏 Credits
Shipped by the Agent Network team — design + lead review / agent-node #204 fix / agent-network release ops + commhub-server promote / testing + docs delivered end-to-end. Individual contribution detail on the v0.10.11 GitHub release page. LLM E2E attribution was verified on a live node via cross-hub dispatch.
Full Changelog: https://github.com/sleep2agi/agent-network/compare/v0.10.10...v0.10.11
v0.10.10 — Xiaomi MiMo full 5-model support + envRef wizard-to-start auto-link (2026-05-27) ✅ stable
Version alignment (npm latest tag):
@sleep2agi/agent-network@2.2.9← bumped (envRef Option A auto-source +anet -vnow shows full prerelease suffix + Grok delegation parser broadened)@sleep2agi/agent-node@2.4.6← bumped (envRef Option A implementation + Grok runtime stabilization continued)@sleep2agi/commhub-server@0.8.3← unchanged@sleep2agi/agent-network-dashboard← unchanged
P0 — Xiaomi MiMo Vendor Preset complete
- Added
mimo-v2.5-tts-voicedesign— the full official 5-model lineup is now in the picker anet node create→ pickclaude-agent-sdkruntime → "小米 MiMo" vendor → choose from 5 models:mimo-v2.5-pro(default) /mimo-v2.5/mimo-v2-pro/mimo-v2-omni/mimo-v2.5-tts-voicedesign- Endpoint
https://token-plan-cn.xiaomimimo.com/anthropicspeaks the Anthropic Messages protocol - 📌 Note:
voicedesignis a TTS speech-design model — Anthropic Messages text requests are likely vendor-unsupported. For text dialogue, use the first 4 models.
P0 — envRef wizard-to-start auto-link (#193)
Pain point: After anet node create, running anet node start in the same shell reported FATAL env var not set — you had to manually export ANTHROPIC_AUTH_TOKEN_N_<id>=... first.
New behavior:
- During
wizard create, the API key is written to.anet/nodes/<alias>/.env(mode 0600, auto-added to.anet/.gitignore) anet node startsources that.envfile at launch — no manualexportneeded- Cross-machine deployment still supported (the wizard still prints the
exportcommand once so it can be copied to another box) - Debug logs emit only
loaded N key(s) from .anet/nodes/<alias>/.env— the key value is never echoed - Backward compatible: existing
ANTHROPIC_AUTH_TOKEN_N_*shell exports keep working; legacy plainconfig.jsonmode also still works
Applies to every claude-agent-sdk node (MiMo / MiniMax / InternLM / GLM / any Anthropic-Messages-compatible vendor).
Bug fixes
- #192
anet -vno longer truncates the prerelease suffix — it now shows the full version (e.g.v2.2.9, including any-preview.Nsuffix when applicable) - #189 Grok runtime
grok-build-acpfully stabilized: the explicit-delegation parser was broadened to cover cases like "你和 X 沟通一下…" / "send_task X 一下…" (no-punctuation trailing body), so cross-node delegation routing is reliable.
Known Issues
The internal npx fallback inside agent-network still pins @sleep2agi/agent-node@preview — a future preview push could expose @latest users to an unstable build. There's no regression in this release (preview 2.4.6-preview.2 is content-equivalent to latest 2.4.6), but follow-up handling is queued under a future RFC (tracking issue to be opened; distinct from the same-numbered RFC-021 ACP capability profile expansion which targets X-search unlock).
v0.10.9 — Dashboard image sending + CommHub attachment metadata + codex-sdk image input (2026-05-25) ✅ stable
Version alignment (npm latest tag):
@sleep2agi/agent-network@2.2.7← bumped (pinned server moved to@sleep2agi/commhub-server@0.8.3)@sleep2agi/agent-node@2.4.3← bumped (codex-sdk runtime consumes structured image attachments)@sleep2agi/commhub-server@0.8.3← bumped (meta_jsonpersistence + MCP/REST attachment metadata)@sleep2agi/agent-network-dashboard@0.5.4← bumped (TaskChatPanel image upload/paste send path)
P0 — Dashboard command flow can send images
Vincent catch: Dashboard could upload and preview images, but tasks sent to agents only carried text paths. The codex-sdk runtime never received actual image input, so screenshots, design drafts, and error images could not be dispatched from the web/mobile command surface.
Implementation:
- Dashboard sends structured
attachmentsfor uploaded/pasted images while keeping text fallback paths and preview URLs. - Hub
send_taskand REST/api/taskacceptmeta.attachments, persist it toinbox.meta_jsonandtasks.meta_json, and return parsedmetafromget_inbox. - agent-node extracts local image paths from
meta.attachmentsand passes them into codex-sdk/studio image input. - Telegram image dispatch now passes image arguments in the correct position.
Rollout + Smoke
- Local CommHub and Dashboard were upgraded and restarted.
- 27 host codex-sdk agent-node processes were rolled to the new code.
- P0 smoke sent
/tmp/anet-image-smoke.pngtotest-node; node logs showed+1 image(s)/→ processing [codex] +1 image(s), with reply图片通道OK.
Known Limits
- Dashboard uploads currently hand off local file paths, best suited for same-host hub/agent deployments. Cross-host object-storage delivery remains future work.
- Existing old containers need reinstall/restart to pick up this release.
- This release fixes delivery into the runtime; rich media history and mobile IM polish remain dashboard follow-up work.
See the v0.10.9 tag.
v0.10.8 — Dashboard Servers panel UI copy fix + TopoGraph density-tier polish (2026-05-17) ✅ stable
Version alignment (npm latest tag):
@sleep2agi/agent-network@2.2.6(unchanged, v0.10.7)@sleep2agi/agent-node@2.4.2(unchanged)@sleep2agi/commhub-server@0.8.2(unchanged)@sleep2agi/agent-network-dashboard@0.5.3← bumped (UI copy + Playwright attrs + polish fold-in)
Fix — #157 Dashboard Servers panel UI copy fix (Root cause #1)
Vincent caught this in real testing (with dashboard screenshot): the Servers panel was rendering agent rollup pending hub ≥ 0.8.2-preview / disk metric pending hub ≥ 0.8.2-preview for every hub, even though every production hub is already at ≥ 0.8.2. The copy was outdated and misleading — for a moment Vincent thought the version dashboard data was completely broken.
Root cause #1 (this patch): ServersDrawer UI carried placeholder text introduced during the 0.8.2 upgrade window. 0.8.2 has long since shipped, but the placeholder text was never removed, so it kept rendering "pending" for ≥ 0.8.2 hubs and led users to believe the hub data was missing.
Implementation (app/components/ServersDrawer.tsx):
- <div ...>agent rollup pending hub ≥ 0.8.2-preview</div>
- <div ...>disk metric pending hub ≥ 0.8.2-preview</div>
+ <div ... data-server-agents-missing="true">agent rollup not reported by hub</div>
+ <div ... data-server-disk-missing="true">disk metric not reported by hub</div>The new copy accurately says "this hub didn't report it right now" instead of implying the hub version is too old. The new data-server-agents-missing / data-server-disk-missing Playwright hooks enable the next e2e round to validate hub-side telemetry coverage.
Root causes #2 + #3 located, deferred
- #2 (v0.10.9 candidate): missing dedupe when one hostname appears multiple times can double-count servers — the dashboard team's fix is queued for v0.10.9 ship.
- #3 (v0.11.0 candidate):
status=offlinevs telemetry mismatch (telemetry still reports but SSElast_seenhas timed out) — needs system-level status reconciliation.
Polish fold-in — TopoGraph density-tier (purely additive)
Dashboard team commit 3f73810 (0.5.3-preview.16) — the canvas state attribute data-topo-fleet-density-tier ∈ {empty, sparse, normal, dense, very-dense} exposes a 12th observable testing surface. Tier boundaries (sparse 1-3 / normal 4-15 / dense 16-30 / very-dense 31+) line up with the dense-layout collapse gate. Purely additive, no UX change. Paired with the numeric counts, e2e selectors now have a complete canvas-state snapshot.
Quality gates + lessons
- Source-grep verify: the lead's
grep -rh "not reported by hub"hits + the legacy copy only survives in JSDoc comments ✅ - Docker preview smoke:
docker run --rm node:24-slim sh -c "npm install -g @sleep2agi/agent-network-dashboard@0.5.3-preview.15 && grep..."✅ - JSX copy verified at source level: at
app/components/ServersDrawer.tsx— no dependency on the.next/serverbundled output - v0.10.x patch density of 8 patches in one day validates that the audit-first cadence is sustainable
Release stats — v0.10.8
- 18 cumulative
@latestpublishes (v0.9.0 → v0.10.8): 0 split-brain / 0 rollback / 0 retry - 2026-05-17 v0.10.x same-day ships: v0.10.1-8 = 8 ships in ~11 hours (audit-first cadence)
- Vincent catch + Vincent #158 LOCKED directive closed out in the same cycle
See the v0.10.8 release notes.
v0.10.7 — codex-sdk batch path yolo flags parity (2026-05-17) ✅ stable
Version alignment (npm latest tag):
@sleep2agi/agent-network@2.2.6← bumped (codex-sdk batch path yolo parity)@sleep2agi/agent-node@2.4.2(unchanged)@sleep2agi/commhub-server@0.8.2(unchanged)@sleep2agi/agent-network-dashboard@0.5.2(unchanged)
Fix — #156 codex-sdk batch path yolo flags parity
Vincent catch: "fast 也要开新一下默认 / codex 默认 fast 啊" (codex needs fast mode by default in the batch path too).
Pre-fix vs Post-fix matrix:
| Path | Pre-fix | Post-fix |
|---|---|---|
anet node create --runtime codex-sdk | ✅ 4/4 yolo flags (#149 v0.10.3 ship) | ✅ 4/4 yolo flags (unchanged) |
anet create --batch --runtime codex-sdk | ❌ only 1/4 (dangerouslySkipPermissions baseline only) | ✅ 4/4 yolo flags (matches single-node) |
anet [...] --runtime codex-sdk --no-yolo | (flag did not exist) | ✅ 1/4 baseline only (opt-out for CI/scripted) |
Implementation — clean helper extraction at bin/cli.ts:125-131:
function codexSdkYoloFlags(noYolo?: boolean): Record<string, string | boolean> {
if (noYolo) return {};
return {
approvalPolicy: "never",
sandboxMode: "danger-full-access",
skipGitRepoCheck: true,
};
}Single source-of-truth helper: both the single-node path (cli.ts:1146) and the batch path (cli.ts:6223) call the same function — eliminates the v0.10.6 1/4-vs-4/4 drift. dangerouslySkipPermissions: true is the baseline, set at each call site, 1+3=4 yolo flags total.
User impact
- Batch + codex-sdk users: previously, batch-wizard-created codex agents would block on tool-approval popups / sandbox / git checks, losing the yolo autonomous posture → now all 4 flags are set, autonomous behavior matches single-node.
- Single-node users: unaffected (path unchanged).
- CI / scripted users: the new
--no-yoloflag provides an explicit safe-mode opt-out. - Non-codex-sdk runtimes (claude / sdk): completely unaffected (helper is gated on
runtime === "codex-sdk").
Quality gates + lessons
- Source-grep verify:
grep -nagainstbin/cli.tsHEAD across 5 sites all PASS (helper + 2 call sites + wiring + field). - Docker container smoke: Cell A
anet loginsetup failed (test infra blocker, not a fix bug) → Gate 2 source-grep evidence accepted as substitute, per v0.10.6 precedent. - Docker smoke gets its token via direct
curlAPI calls (new): Docker smoke entry scripts must usecurldirect API calls to/api/auth/register+/api/auth/loginto obtain a token; do not use interactiveanet login(it stalls in non-TTY containers — the hub login call blocks).
Release stats — v0.10.7
- 17 cumulative
@latestpublishes (v0.9.0 → v0.10.7): 0 split-brain / 0 rollback / 0 retry - 2026-05-17 v0.10.x same-day ships: v0.10.1-7 = 7 ships in ~10 hours (audit-first cadence)
- 10 user-feedback items all closed-loop: including v0.10.7 #156
See the v0.10.7 release notes.
v0.10.6 — anet upgrade Option B detached spawn + anet create --batch wizard silent-exit fix (2026-05-17) ✅ stable
Version alignment (npm latest tag):
@sleep2agi/agent-network@2.2.5← bumped (CLI upgrade + wizard fixes)@sleep2agi/agent-node@2.4.2(unchanged, v0.10.3)@sleep2agi/commhub-server@0.8.2(unchanged)@sleep2agi/agent-network-dashboard@0.5.2(unchanged, v0.10.4)
Chicken-and-egg upgrade note — one-time manual install required
v0.10.4's #151 Option A only updated the verbiage (anet upgrade now shows "⚠️ NEEDS MANUAL UPGRADE"), but the chicken-and-egg deadlock wasn't fixed — your current 2.2.2 / 2.2.3 / 2.2.4 binary still falls back to the old "skipped (would replace running CLI)" behavior (that logic is frozen on the npm tarball).
npm install -g @sleep2agi/agent-network@2.2.5 # one-time manual install
anet --version # expect v2.2.5From the next release onward (e.g. 2.2.6+), anet upgrade will auto detached-spawn the install for you — no more manual install.
Fixes
- #154
anet upgradeOption B detached spawn enabled by default (Vincent catch): users sawanet (self): skipped (would replace the running CLI).+[anet] Done.and assumed success, but the anet binary never actually upgraded (chicken-and-egg deadlock — a Node process can't in-place replace its own binary).bin/cli.ts:3873-3874now doesspawn(forkScript, [], { stdio: "inherit", detached: true })+child.unref()+ main processprocess.exit(0); the detached child runsnpm installin the background. The new version takes effect 1-2 min later — no--selfflag needed. - #155
anet create --batchwizard silent-exit fix (Vincent catch): after the workdir-modeselect(),process.stdinstate changes and the readline-basedask()helper returns at EOF immediately → the entire wizard silently exits at theNode prefixprompt (same root cause as #137 in v0.9.2 preview.5 anet create regression, recurring in a different code path). Fix: migrate all post-select prompts toinquirer.input()so stdin handling stays uniform with the preceding select; the catch fallback retains the legacyask()for non-TTY / no-inquirer environments.
Quality gates + lessons
- Docker smoke gate is never skipped (Vincent): the v0.10.4 emergency trust path is SUSPENDED — the Docker smoke gate is never bypassed again.
- All test nodes run in Docker (Vincent): red-line — all test nodes go in Docker, must never connect to a host hub.
- dist is an obfuscated bundle — verify against source (new):
dist/bin/cli.jsis esbuild bundled + obfuscated (rotating string table, mangled identifiers, encoded string literals) — static grep on dist is useless. Code-path verification must grepbin/cli.tssource (HEAD = the preview build source).
Release stats — v0.10.6
- 16 cumulative
@latestpublishes (v0.9.0 → v0.10.6): 0 split-brain / 0 rollback / 0 retry - 2026-05-17 v0.10.x same-day ships: v0.10.1 + v0.10.2 + v0.10.3 + v0.10.4 + v0.10.5 + v0.10.6 = 6 ships in ~9 hours (audit-first cadence)
- 9 user-feedback items all closed-loop: Install/Upgrade docs split + #149 / #150 / #151 / #152 / #153 / #154 / #155 + red-line SOPs
See the v0.10.6 release notes.
v0.10.5 — anet create --batch wizard double-fix (2026-05-17) ✅ stable
Version alignment (npm latest tag):
@sleep2agi/agent-network@2.2.4← bumped (CLI wizard fixes)@sleep2agi/agent-node@2.4.2(unchanged, shipped in v0.10.3)@sleep2agi/commhub-server@0.8.2(unchanged)@sleep2agi/agent-network-dashboard@0.5.2(unchanged, shipped in v0.10.4)
Fixes
- #152
anet create --batchwizard now prompts for workdir mode (Vincent push): the--workdir-mode <shared|separate>flag has shipped since #55, but the interactive wizard never prompted — users had to know the flag name to change the defaultseparate.createBatchWizardCommandnow adds an inquirer select (separatedefault /sharedco-cwd), TTY-aware (flag set / non-TTY both fall back toseparatewith an INFO hint). agent-node / server / dashboard untouched — purely CLI wizard UX. - #153 codex-sdk / claude-code-cli runtime selection no longer falsely prompts for
ANTHROPIC_AUTH_TOKEN(Vincent push): the runtime-first wizard (#133) calledselectVendorAndModel()even when codex-sdk / claude-code-cli was picked (only claude-agent-sdk needs an API key). The wizard now skips the API key prompt for those runtimes and prints a one-linecodex auth login/claude auth loginhint instead.
See the v0.10.5 release notes.
v0.10.4 — anet upgrade UX warning + Dashboard orphan-band layout (2026-05-17) ✅ stable
Version alignment (npm latest tag):
@sleep2agi/agent-network@2.2.3← bumped (#151 anet upgrade UX)@sleep2agi/agent-network-dashboard@0.5.2← bumped (#150 orphan-band layout)@sleep2agi/agent-node@2.4.2(unchanged, shipped in v0.10.3)@sleep2agi/commhub-server@0.8.2(unchanged)
Fixes
- #151
anet upgradeself-skip warning is now explicit (Vincent push): the prioranet (self) — self-skiprow didn't spell out why or how; users walked the plan and didn't realize their own version wasn't bumped. Now adds an explicit warning + guides toward the--selfflag. - #150 Dashboard topology orphan nodes now collected into an "Others" cluster box (Vincent push): previously, orphan nodes (no prefix group) were scattered across the canvas and hard to find; they now collect into an "Others" cluster box rendered alongside the other groups.
Vincent emergency trust path
v0.10.4 was shipped via Vincent's emergency trust path, skipping the test-lead Docker smoke gate (the no-testing-on-prod rule was not waived, but Vincent took the lead-scope trust path). Docker smoke is still the release-gate playbook standard checkpoint, unchanged.
See the v0.10.4 release notes.
v0.10.3 — codex-sdk default model now gpt-5.5 + yolo flags visible in config (2026-05-17) ✅ stable
Version alignment (npm latest tag):
@sleep2agi/agent-network@2.2.2← bumped (cli.ts vendor preset)@sleep2agi/agent-node@2.4.2← bumped (codex-sdk runtime + flags)@sleep2agi/commhub-server@0.8.2(unchanged)@sleep2agi/agent-network-dashboard@0.5.1(unchanged)
Fixes
- #149 codex-sdk default model fix + yolo flags written into config (Vincent catch):
- cli.ts codex vendor preset default model placeholder
gpt-5.4→ realgpt-5.5 - codex-sdk runtime gains
yolo: trueflags (same concept as the Claude Code preset'sdangerouslySkipPermissions+teammateMode) — skips the permission-prompt for multi-agent batch runs - Flags are persisted in
config.jsonrather than as an ephemeral runtime arg, so users can inspect / edit them
- cli.ts codex vendor preset default model placeholder
See the v0.10.3 release notes.
v0.10.2 — Hero A disk telemetry + Hero D topology label UX (2026-05-17) ✅ stable
Version alignment (npm latest tag):
@sleep2agi/agent-network@2.2.1(unchanged —PINNED_SERVER_VERSIONstays at0.8.2)@sleep2agi/agent-node@2.4.1←2.4.0(Hero A disk telemetry, additive; commit50d25b2)@sleep2agi/commhub-server@0.8.2(unchanged)@sleep2agi/agent-network-dashboard@0.5.1←0.5.0(Hero D topology prefix-label Option C + disk render + 100+ rounds of polish)
Hero A — agent-node disk telemetry (#99 per-server daemon Phase 2 host metrics, final 10%)
agent-node/src/host-telemetry.ts adds readDiskStats() via execFileSync('df', ['-k', '/']) (+33 lines):
- POSIX
-kstandardizes KB output, so Linux and macOS share a single parse path - No shell pipe (per the recent shell-audit safety review) —
execFileSyncdirect call - Windows / parse failure: graceful null (the dashboard renders
—rather than a misleading0) HostTelemetryinterface gainsdisk_total_gb/disk_used_gb/disk_avail_gb;getHostTelemetry()composes disk viatoGb()on the same path as mem/cpu- Backward compat: older servers silently drop unknown keys; agents and servers upgrade independently
Wires through RFC-014 — GET /api/server/:host/health now returns disk's three fields, the 24h bucketed history includes disk_avail_min / disk_used_max, and alert_level adds disk < 1GB critical / < 5GB warn triggers (server/src/index.ts:253-258, pinned to commit 22ed1886; the file has since been split up and is only 16 lines on main, which is why this does not link to main).
Test lead Docker Linux smoke 3/3 PASS (disk 299.8 GB total / 216 used / 71.5 avail, alert green, backward compat verified).
Hero D — Dashboard topology prefix-label UX, Option C (dashboard 0.5.1)
#147 (acked 5/16) + Option C landed:
- Topology node prefix labels (the node→group edge labels' distinguishability) ship with the Option C design (dashboard team design pass)
- Disk telemetry hover-card rendering (
disk_total_gb/disk_used_gb/disk_avail_gbwired to theGET /api/server/:host/healthresponse) - 100+ rounds of typography + corner-radius cascade polish
Dashboard team design pass + 4/4 verify (commit 7de97ee + screenshot evidence, local ship f9c83cd).
Closed issues
- #99 per-server daemon Phase 2 close gate met (host metrics fully wired, Hero A disk shipped)
- #147 Hero D (5/16 ack → Option C shipped)
RFC artifacts preserved (v0.12.0 scope)
v0.10.2 is a hotfix scope (no v0.11.0-series RFC ship); three RFC artifacts are preserved as v0.12.0 candidates:
- RFC-013 v5 rename hot-reload (third-pass review complete)
- RFC-014 v2 daemon Phase 2 host metrics (Hero A final 10% shipped in v0.10.2)
- RFC-015 v2 #114 token-usage UI (first-pass REVISION complete)
Upgrade
anet upgrade # bumps agent-node 2.4.0 → 2.4.1 + dashboard 0.5.0 → 0.5.1
anet project restart # restart the project (pulls the new agent-node + dashboard)Migration / Breaking
- No breaking changes — the disk fields are additive (the
HostTelemetryinterface gains three fields, the server schema silently drops unknown keys for backward compat). Agent and server upgrade independently; for agents that don't emit the field, SQL staysNULLand the dashboard renders—rather than a misleading0.
Release flow follows the v0.9.0 split-brain lessons #126 two-phase publish SOP.
v0.10.1 — Hotfix: PINNED_SERVER_VERSION chain-bump after the v0.10.0 ship (2026-05-17) ✅ stable
Version alignment (npm latest tag):
@sleep2agi/agent-network@2.2.1@sleep2agi/agent-node@2.4.0(unchanged)@sleep2agi/commhub-server@0.8.2(unchanged)@sleep2agi/agent-network-dashboard@0.5.0(unchanged)
Fix
PINNED_SERVER_VERSION in agent-network/bin/cli.ts (pinned to commit 3a387204, line 61 at the time) was never bumped across the v0.9.x + v0.10.0 promotes — it stayed hardcoded at 0.8.0. That meant anet hub start was actually running bunx --bun @sleep2agi/commhub-server@0.8.0 (the bunx --bun @sleep2agi/commhub-server@… call site in cli.ts, same commit, line 2589) — the old server, not the v0.10.0-shipped 0.8.2. Direct impact:
- The #99 per-server daemon endpoints
GET /api/server/:host/health+GET /api/server/:host/agentsdon't exist in 0.8.0 → 404 - #142 server schema alignment for
process_telemetryisn't wired in 0.8.0 → the older schema silently drops the field - Dashboard
0.5.0§3.F server-health ring tint had no data source / §3.E hover cardprocess_telemetryrendered all-null
A v0.10.0-announced functionality regression on the default anet hub start workflow (manually launching bunx --bun @sleep2agi/commhub-server@latest was not affected).
Fix (commit 4d24024):
- const PINNED_SERVER_VERSION = "0.8.0";
+ const PINNED_SERVER_VERSION = "0.8.2";Upgrade
anet upgrade # bumps agent-network 2.2.0 → 2.2.1
anet project restart # restart the project (pulls the new commhub-server)Or fresh install:
npm install -g @sleep2agi/agent-network@latestLessons
- release-gate playbook now covers PINNED chain-bump — every promote-to-latest must chain-bump
PINNED_*_VERSION(server pin / dashboard pin / agent-node pin), or the default path keeps running the previous ship. Consistent with #80 PINNED bump SOP, but the Hero 4 release-gate playbook hadn't covered it; the case is now added (see lesson memory in methodology).
Release flow follows the v0.9.0 split-brain lessons #126 two-phase publish SOP.
v0.10.0 — Direct Runtime + Observability Foundations (2026-05-16) ✅ stable (Phase 1, 3-package promote)
Version alignment (npm latest tag, Phase 1):
@sleep2agi/agent-network@2.2.0@sleep2agi/agent-node@2.4.0@sleep2agi/commhub-server@0.8.2@sleep2agi/agent-network-dashboard@0.5.0✅ Phase 2 shipped
Theme: fix the root
v0.7 → v0.9.2 accumulated 11 releases; the 5-P0 ripple chain (#135-#139) surfaced a runtime architecture debt. v0.10.0 fixes the root — runtime debt (codex-sdk wrapper bypass, opt-in) + observability foundations (per-server daemon endpoints + per-agent process telemetry) + release-gate playbook. This is the groundwork for v0.11.0's 24/7 multi-vendor AI Agent society live stream. See the v0.10.0 release tracker #140.
5 features
A. #141 codex app-server stdio direct (opt-in ANET_CODEX_STDIO_DIRECT=1) The codex runtime previously went through the @openai/codex-sdk npm wrapper; the wrapper's --mcp-config HTTP transport bug is the root-cause family for the #102 hang. v0.10.0 adds a direct spawn('codex', ['app-server']) + minimal stdio JSON-RPC client (~155 LOC) path that bypasses the wrapper entirely, sidesteps that family bug, and exposes the full 67-method v2 protocol surface (thread / turn / item / realtime). v0.10.0 still defaults to the wrapper path (collecting preview feedback first); set ANET_CODEX_STDIO_DIRECT=1 to opt in. Default flip is planned for v0.11.0.
B. #99 Per-server daemon Phase 1 scaffold (monitoring-only) New server-side endpoint family (commit e575cc6):
GET /api/server/:host/health— host CPU / mem / disk / process healthGET /api/server/:host/agents— per-host agent list + telemetry history
Dashboard integration lands in Phase 2 (#119 ServersDrawer integration). The control layer (kill / restart / redeploy) is deferred to v0.11.0.
C. #142 Per-agent process telemetry agent-node now embeds process_telemetry in every commhub_report_status heartbeat: rss / cpu_pct / uptime_seconds / in_flight_count. Zero sysmon dependency, zero privilege. commhub-server schema is aligned on the wire (commit 209cac7); the dashboard hover-card rendering ships in Phase 2 (#119 sibling). Sibling to #119 host fields (host step 1 ✅ earlier; agent step 2 ships in this release).
D. Dashboard network/node front-end surface upgrade (Hero 3 — 8/8 surfaces complete, dashboard 0.5.0)
- §3.A prefix-group fix (Vincent #1 catch)
- §3.B sweep retire (legacy sweep path merged into grid)
- §3.C recent-panel hide
- §3.D grid default view
- §3.E hover detail card
- §3.F server-health ring tint (wired to #99 endpoint)
- §3.G fullscreen mode
- §3.I canvas brand mark
- (§3.H dropped per RFC Q2 review)
Ships alongside 19+ rounds of typography + corner-radius cascade polish (four typography families + systematic corner-radius cascade rework). Dashboard 0.5.0 is now on the npm latest tag, landing with this v0.10.0 Phase 2 docs sync.
E. Lightweight pre-release-gate playbook (release-gate Phase 1+2)docs/tests/release-gate-playbook.md — maintained by the test lead. Covers hub / dashboard / login / node lifecycle / runtime smoke / vendor verify. v0.10.0 is the first release to fully exercise this playbook; future latest promotes gate on it.
Breaking changes / Migration
codexruntime default behavior unchanged: still goes through the@openai/codex-sdkwrapper; setANET_CODEX_STDIO_DIRECT=1to switch to the direct stdio path. The preview-chainANET_CODEX_LEGACY_SDK=1fallback flag is renamed to the more direct opt-inANET_CODEX_STDIO_DIRECT=1for latest — same semantics, clearer name.- agent-node
commhub_report_statuspayload addsprocess_telemetrysub-object: commhub-server0.8.2schema is aligned; older server versions (≤0.8.1) silently ignore the unknown field and won't fail. /api/server/:host/health+/api/server/:host/agentsare new endpoints: rate-limit / auth behavior matches the existing/api/servers(admin or self-network member); no existing client is broken.
Known follow-ups
Phase 2 dashboard✅ shipped (dashboard0.5.0promote0.5.0landed with this v0.10.0 Phase 2 docs sync — 8/8 Hero 3 surfaces complete + 19+ rounds of polish)- Close evidence for #102 / #103 hang — Phase 1.5 in the preview chain already plans the regression replay against the new stdio path; we'll close them once the latest opt-in path passes the regression.
- Sessions NETWORK column display bug (Vincent catch) — deferred to a v0.10.x patch or v0.11.0.
- #117
anet project updetached-tmux follow-up (macOS bunsetRawModealready fixed by #136, but detached-mode follow-up still pending) — to be done with the v0.11.0 control layer.
Release flow follows the v0.9.0 split-brain lessons #126 two-phase publish SOP: publish each tarball with --tag preview first, curl-verify HTTP 200, then npm dist-tag add @<v> latest. Phase 1 three-package (agent-network / agent-node / commhub-server) clean-semver promote is complete; dashboard Phase 2 is pending §3.D/F/G.
Older releases
Entries for v0.9.2 (2026-05-16) and earlier, and the roadmap of that time, moved to the repository's changelog archive.
Next steps
- Upgrade guide — v0.7 → v0.8 behavior changes + standard steps
- Architecture — how each release accumulated into the current system
- npm version list and desktop releases
- RFC-001 — v0.8 ~ v1.0 master-token deprecation roadmap