Repository navigation
Raven 0.2.7 is a patch release. Each conversation now keeps a Task Board of the matters it is pushing, with a Task Board page across conversations; the trajectory page is redrawn as an agent waterfall that shows an external agent's own steps and can replay a session from its first instant; a stuck DAG node can be handed to another sub-agent mid-run; Raven's own product agents share memory with their host, so five of them cost about half of what they did; and the trace store compresses what it writes. Also in this release: a conversation can ask for more or less reasoning than the configured default, DeepSeek joins the web search and fetch vendors, Skill Hub retrieval is on for onboarded installs with a switch, a self-signed model gateway can be reached with a per-section tls_verify opt-out, and an owner can name a registered machine by address, port or nickname.
Review the upgrade notes: product agents now run forked from a template and relay their model calls through the host, Skill Hub retrieval is on by default once onboarded and writes a key an older build refuses, new trace artifacts are written compressed and cannot be read by older code, the trajectory page drops several controls, a reply that is only a silence marker is not delivered, the research high tier closes a dry search earlier, and the tool_failure_count field leaves the tasks-list wire.
Highlights
Task Board
Raven keeps a Task Board for each conversation: the matters it is pushing (task groups), each turn's progress on them, the sub-agents and DAG runs a turn started for them, and where each matter stands -- needs you, running, idle or completed. The web UI draws it in the conversation's tasks tab and on a new Task Board page across conversations, and the model reads it back with a task_board tool (#1157).
-
One card per open group, in columns by category or as a list, with completed groups behind a switch. A card unfolds its progress steps in place; clicking one opens its conversation on that turn. A group that needs you frames each open question with Ignore and Answer; Move on puts a bar over the composer so the next message carries the group with it (#1157).
-
How it is kept: one extra model call after every turn that answered or dispatched work, run in the background on the turn's own cached prefix. The board lives in
task_board.jsonbeside the session, follows undo, branch, clear and delete, and only the Raven host keeps one.agents.defaults.taskBoard.enabled(on by default) turns it off, which also removes the tool (#1157).
Trajectory waterfall and replay
-
The trajectory page is an agent waterfall: every entry on one time axis, grouped by agent, then turn, then span, with idle stretches over 60 s folded, a header of six figures, an activity strip of calls per bucket of real time, and a clock ruler. Fit, 3h, 1h and 15m windows, drag on the strip to window, Ctrl/Cmd + wheel to zoom, Shift + wheel to pan. The rows are a keyboard tree, the details pane floats as a card, and a dispatching row's door arrow leads to the worker it started. Gone: the duration threshold, the hidden-entries switch, the toolbar and reset button, the now line, the dispatch rules and the scope tab strip (#1147).
-
An external agent's own steps are recorded: what an ACP agent said, thought and ran is written as model and tool spans under its run, at most 400 per run, live while the run lasts.
raven trajectory backfill-frameswrites those steps for runs recorded before, from the wire journal, which is now kept 90 days instead of 7. The details pane gains a Reasoning tab on a model call (#1147). -
Replay in the header draws the conversation again from its first instant: everything on the page at the press plays in its own time, or squeezed into 15 seconds, then what runs on past it plays at twice real time until the page is live again (#1156).
Mid-run DAG node handover
resolve_dag_nodetakesdecision: "reassign"with the targetagent(a roster agent, never a worker label) and amessage. The node keeps its id, task, dependencies and place in the graph; the next attempt runs on the new agent with a handover of the visible conversation so far, without the old agent's tool calls, tool output or private context; the continuation budget is shared, not reset. Admission fails closed: roster membership, local-file capability, a stateful target for a shared instance, an unoccupied destination handle, and a handover that fits. The exception report teaches the four recovery choices, and both the TUI's DAG panel and the web task pane show each node's attempt history (#1118).
Product-agent memory sharing
- Each product agent under
agents/ran as a whole Raven process of about 240 MiB. Three mechanisms, each switchable live undersubagents.runtime, bring five agents from 1414 MiB to about 735 MiB in total:idleCloseS(default 600) closes an agent's process after it has been silent that long, unless it holds an armed cron job or a running plugin service;llmRelay(default on) makes the agent's LiteLLM calls on the host so the agent never imports LiteLLM;forkTemplate(default on, Linux only) forks each agent from a template that has already imported what agents import. An agent whose ownenvsets an LLM endpoint, credential, proxy or CA bundle is launched without the relay. Setsubagents.runtimeto{"idleCloseS": 0, "llmRelay": false, "forkTemplate": false}for the previous behaviour (#1127).
Compressed trace store
- The trace store compresses. Every new artifact and content-addressed message is written as a zstd frame under its old path;
raven tracing compressmigrates an existing store in place (--logsadds rotated span and event logs,--dry-runreports the saving), andraven tracing pack-messagespacks message blobs into indexed packs. Measured on a 1.36 GB store: about 60 percent saved. Readers tell the encoding from the frame, so plain and half-migrated stores read; the bundled viewer needs Node 22.15 or newer. ACP frame journals stay plaintext on purpose (#1149).
Upgrade notes
-
Breaking - product agents share memory: with the defaults, Raven's own product agents launched on Linux run forked from a template and make their LiteLLM calls through the host, and an idle one is closed after 600 s and relaunched on its next turn, at the cost of a cold start of a few seconds. A relayed call uses the host's environment. Set
subagents.runtimeto{"idleCloseS": 0, "llmRelay": false, "forkTemplate": false}for the previous behaviour, without a restart (#1127). -
Breaking - Skill Hub retrieval: an onboarded config now queries skillhub.evermind.ai on qualifying turns; a config without the endpoint stays off until it onboards or flips the switch. A config written by the switch carries
skillForge.router.hub.enabled, which a binary from before this release refuses, so roll back by reverting the release rather than downgrading (#1141). -
Breaking - compressed trace store: every new artifact is written compressed, and code older than this release cannot read it, so the deployment is one-way once anything new is written; the two migrations (
raven tracing compress,raven tracing pack-messages) are manual and opt-in, and there is no decompress command. The bundled viewer needs Node 22.15 or newer, or 23.8 on the 23.x line (#1149). -
Breaking - trajectory page: the duration threshold, the hidden-entries switch, the toolbar and reset button, the now line, the dispatch rules and the scope tab strip are gone; the ACP wire journal is kept 90 days instead of 7 (roughly a gigabyte at steady state on an active install, in owner-only files); and
raven trajectory backfill-frameswrites nothing with tracing turned off unless--forceis passed (#1147). -
Breaking - silent turns: a reply that is only a silence marker is not delivered.
after_sendhooks now also run on a silent turn withoutbound_content=None, so an out-of-tree hook that assumes a string must accept None. New config keyagents.defaults.emptyRetryCostThresholdUsd(default 0.25) (#1092). -
Breaking - tasks-list wire:
TaskNode.tool_failure_countis removed fromtasks.listrows, and a sub-agent's spawn announcement no longer appends a system-voiced tally of failed tool calls; failures stay in the run'smeta.json. A client that required the field sees it absent (#1131). -
Breaking - research
hightier: a dry search streak now widens, pages and closes search after 5, 10 and 15 dry searches instead of 10, 20 and 30, matchingmediumandmax(#1164). -
Mirasim agents: the adapter advertises no session modes any more, so the Session Tier does not reach a Mirasim agent once its snapshot is measured again (a Test, a menu refresh or a launch-config change); such a turn runs on the row's effort, else on Mirasim's own default (#1134).
-
Task Board cost: one extra model call after every completed host turn that answered or dispatched, on the turn's cached prefix, and the
task_boardtool is always visible, about 240 tokens on every host call (#1157). -
Channels CLI:
channels set --allow-from '*'andchannels set --enablednow run the wildcard confirmation gatechannels enableruns, so a non-interactiveset --enabledon a channel whose stored allow list is'*'refuses unless--allow-from '*'is passed explicitly (#1109). -
No command, flag or config key is removed.
Other improvements and fixes
Agents and sub-agents
-
Pressing stop while an
ask_userquestion is on screen now ends the turn where it was stopped, instead of answering the question with its default and running the rest of the turn. A stint's first round that is stopped during its approval is closed as stopped rather than left running and resumed unasked (#1073). -
A third-party agent's empty turn now names what can be known: the turn's own token count (a turn that spent nothing is a model call that never ran), the agent's build against a floor its own service has (OpenCode's free models need 1.18.0 or newer), and the credential check the agent names, with the command that shows the provider's own answer run on the model the row is pinned to (#1097).
-
A GitHub Copilot run whose last message is its provider's refusal fails even when it narrated first; a cron or wake turn reports its own usage instead of the turn before's, so an ACP client's running cost no longer counts that turn twice; a reported
infornancost is read as unknown (#1133). -
Mirasim presets: adjacent text blocks in a prompt are joined with a blank line; a prompt carrying a NUL or an unpaired surrogate is refused with a protocol error; a model pick is cleared once the connect lands, and an add no longer sends a model the row's menu has dropped (#1153).
-
A picker-saved empty image quality in Settings no longer pins
image_generatecalls: the call's own quality applies, and a quality named in Settings still wins (#1137). A Raven-PPT deck regenerated after that fix keeps the file name its page names; only an exactgpt-image-2section with an empty quality moves once to themediumspelling (#1155).
Empty replies and silence
-
Empty and abnormal model replies are handled the way Hermes Agent handles them. A reply that is only the silence marker
[SILENT]ends the turn with nothing sent and one muted line, "Raven chose not to reply."; a scheduled run, a sub-agent's report or a Sentinel notice may also spell itSILENT,NO_REPLYorNO REPLY, while a reply to a person that is only "No reply." reaches them as written. A plain empty reply is resent up to three times after a backoff (once when the call cost at leastagents.defaults.emptyRetryCostThresholdUsd, default 0.25 USD); one that only thought is asked again and then at a lower effort; one cut at the output limit is continued with more room; a refusal goes to a fallback model or fails with the model's explanation. A streamed answer whose connection dies is continued where it stopped, then delivered marked as partial if it stays cut. Recovery no longer asks forminimal, which Codex refuses, so the HTTP 400 "Unsupported value: 'minimal'" is gone (#1092). -
The follow-up settles what the review left open: only a proactive turn taught the marker reads the loose rule, so a heartbeat task, a relayed sub-agent result or a sentinel notice that answers "No reply." now reaches the reader; a turn whose tools delivered files is never taken back as silent; a continuation that raises ends the turn on what streamed; and a transcript saved with a BOM or in a Windows code page is listed and opened (#1146).
Models and providers
-
A key the vendor refuses is no longer called connected. The settings page and the first-run wizard ask the vendor first (new RPC
model.check_key): a refused key is not stored and the form says why, and a stored key the vendor later refuses reads Key rejected on its row.raven onboardandraven provider testreport a public catalogue that cannot confirm a key as reached but unconfirmed, instead of "OK (468 models available)" for a bogus OpenRouter key. A 403 is deliberately not a refusal (#1045). -
The web composer's context ring now reads right after a turn that failed, was stopped or ended on an empty reply, live and after a reload: a failed or stopped turn's
errorevent carries what the turn measured, and a call that failed in transport no longer counts as a window reading (#1126). -
A model picked from the composer chip is also the default for new conversations: the pick writes the conversation's binding and
agents.defaults.model/.providerin oneconfig.setcall withscope: "both". The settings control still writes the default alone (#1154).
Reasoning effort per conversation
-
The web UI's model picker gains a Reasoning effort row and the TUI gains
/effort [word];/effortalone reports the pick, the default and the words the current model declares, anddefaultreturns to the global setting. The words come from the model's own declaration (minimal,low,medium,highon most models,xhighandmaxwhere published); a model that declares none has no row. The pick is kept on the conversation's record, survives a restart, lands on the next turn, and moves Raven's own calls only. New RPCsession.set_effort. A model the table does not carry loses the row; a provider-scopedmodel_overlay.reasoningEffortsdeclares its words (#1113). -
ACP agents get an effort of their own. An agent card shows an Effort field measured from the agent's
thought_leveloption on the row's model, sent after the model on every dispatch; a refresh control on the card, and every model picker that opens, re-read the agent's model menu from its handshake without spending a prompt (new RPCsubagents.refresh_models). The Connections, Agent Hub and machine rows are preloaded while the first screen is up. The Mirasim adapter now advertises effort as athought_leveloption instead of session modes (#1134).
Vendors and gateways
-
DeepSeek joins the
web_searchandweb_fetchvendors:tools.web.search.provider: deepseekandtools.web.fetch.provider: deepseek.tools.web.providers.deepseek.apiKeyis optional: an empty slot borrowsproviders.deepseek.apiKeywhile that section resolves to DeepSeek's own host. A query over DeepSeek's 128-character limit is refused before the request. The research product, the deck launcher, the sub-agent fetch lane and the onboarding wizard resolve the same borrowed key (#1125). -
Skill Hub retrieval is on for onboarded installs. Fresh installs never searched the Skill Hub from a conversation because the wizard rewrite dropped the endpoint seed; both wizards seed it again. A new
skillForge.router.hub.enabled(default true) and a Skills-page switch turn the source off without discarding a custom endpoint, and the switch applies live in both directions. The settings page now reads a snake_case top-level config block as the loader does, which also fixes the Skills blocklist and the gate and title model roles under such a block (#1141). -
A self-signed model gateway can be reached:
tls_verify: falseon one provider section (tlsVerifyis accepted too) skips certificate verification for that section's calls and its model-list checks only, across every client shape Raven builds (LiteLLM's two client families, Anthropic messages, OpenAI responses, Azure). The default staystrue, and importing the root remains the preferred path.openaiis now a declared dependency (#1108).
Registered machines
-
An owner can name a machine by what they know -- "on 113.27", "on 64106", "on my dev box" -- and
execwith such amachineanswers which machine the words name, or the candidates when several do. A localexec,list_dirorread_filethat misses an absolute path this computer does not have ends with the registered machines and how to look on them. Rows take an optionalaliaseslist, and the on-callops_connectionstool takes ahint. The model still never sees an address, user or key (#1166). -
A typed
sshthat reaches a registered machine through an ssh config alias, or through the local connection, is refused the way a literal address already was, so work there goes through the machine channel or the on-call job runner;ssh -Gresolves the destination off the event loop.scpandrsyncstay allowed (#1167). -
On Windows, a job the on-call agent hands off now outlives the host's exit: the host serves a hand-off channel over an authenticated named pipe, and the relay starts the launcher outside the agent's job object while nothing in the agent's tree can leave it (#1115).
Web UI and TUI
-
Important chat content stays unfolded by default: an agent message of about two lines (140 characters on the web, 100 in the TUI) opens its fold, a turn holding a
spawnorrun_subagent_dagcall opens, and a sub-agent's reasoning starts folded. The reader's own open or close still wins (#1129). -
The web live turn row shows the TUI's rotating waiting word beside its clock, long-running tools carry the TUI's phrases after 8 s and 18 s, and the thinking row prints its elapsed time (
Thinking... (5s),Thought for 12s). Every duration on the page is spelled the TUI's way:1m 5sand1h 2minstead of1m05sand61m01s(#1130). A checkout install now rebuilds the page when the shared word catalogue changes (#1142). -
The composer's height can be dragged, or moved with the arrow keys, up to half the window; the field still fits its content under that ceiling, and the ceiling is not persisted (#1150).
-
The chat header is an overlay over the chat column, so a message scrolled to the top travels under a frosted band instead of being clipped at the header's edge (#1151); the frost is tuned so text under the band is unreadable at its top and progressively clearer toward its lower edge (#1159).
-
Under 640px the shell folds to one column, with the rail as an overlay that folds when a row in it is pressed, instead of showing the 780px layout in a horizontal scroll; between 640 and 779px the width floor is gone (#1044).
-
The model picker stays open when its own list is scrolled (#1139). A direct chat with a sub-agent instance has a stop button on its own composer (#1140). A stopped turn's late delta no longer merges into the next turn's text or its session-row preview (#1107). The setup wizard's web step names each card's role in its keyless hint (#1102).
CLI and channels
-
cron add, thecrontool, the sentinel's routine confirmation and the web console say what happened when a request lands on an existing job -- updated, kept its schedule, or no new job created -- instead of "Created job" for every outcome (#1117). -
raven channels login whatsappgives up after 300 seconds with a hint every 30, so an unscanned QR code no longer holds the terminal and the bridge open indefinitely (#1163).raven onboardrejects a redirected stdin the way it already rejected a redirected stdout (#1109). -
On Windows,
raven upgradeon a source checkout prints a runnable three-step sequence (raven web --stop,git pull,powershell -NoProfile -ExecutionPolicy Bypass -File ".\install.ps1") instead of a&&line Windows PowerShell 5.1 rejects, and the page's checkout recovery runs the installer only after a successful pull (#1136).
Install
New install on Linux, macOS, or WSL2:
curl -fsSL https://raven.evermind.ai/install.sh | bashNew install on native Windows, in PowerShell:
irm https://raven.evermind.ai/install.ps1 | iexWindows PowerShell 5.1 (the version built into Windows) cannot follow that URL's
redirect and stops with (308) Permanent Redirect. If you see that error, use the
direct one instead:
irm https://raw.githubusercontent.com/EverMind-AI/Raven/refs/heads/main/install.ps1 | iexThe installer puts uv, Node.js 22, Raven and its plugins in place, downloads the
browser runtime and the word dictionary and PDF models the knowledge reader uses
(about 110 MB), installs or offers LibreOffice, and then finishes by opening
Raven in your browser. First-run setup happens on that page. When a download
host cannot be reached, the installer falls back to a mirror and says so, except
for Raven's own release files, which come from GitHub Releases and have no
mirror; RAVEN_NO_MIRROR=1 keeps every download on its default host. The
installer holds the terminal while the page is up; press Ctrl-C to stop it, then
start Raven again with:
raven webThat keeps Raven running in the background and opens the page; raven web --stop
stops it. Bare raven does the same, and opens the TUI only where no browser
can be opened. Prefer the terminal? raven tui runs the same first-run setup and
opens the TUI, and raven onboard stays the explicit way to reconfigure later.
Set RAVEN_MINIMAL=1 to skip the browser, model and LibreOffice downloads, or
RAVEN_NO_LAUNCH=1 to have the installer return without opening the page. The
Windows installer does not download the dictionary and models; there, and after
RAVEN_MINIMAL=1, raven resources fetches them.
Upgrade
Already running Raven? Upgrade in place -- configuration, sessions, and memory
are preserved. On a raven web install whose page is served by 0.2.3 or later,
the update row at the bottom of the sidebar does this for you, and the page
reloads itself, still signed in, once the new version is up. A page served by
0.2.2 or earlier refuses it; from the command line, stop the page first, then
upgrade:
raven web --stop
raven upgradeOn Linux and macOS raven upgrade runs the install in the foreground and
returns when it is done. On native Windows it hands the install to a separate
helper and returns at once; wait for the helper's completion message. Then
start Raven again:
raven webNeither raven upgrade nor the update row downloads the knowledge reader's
word dictionary and PDF models (about 110 MB). An install that has never
fetched them runs this once:
raven resourcesraven upgrade installs the latest stable release together with the plugin
wheels it ships. It never picks up a pre-release unless this install has joined
the beta channel (a ~/.raven/beta.json that only the beta installer writes).
raven upgrade --check reports whether a newer release exists without
installing it. Editable source checkouts are never overwritten, and a page
served by one refuses the update row as well: raven upgrade reports the
checkout path and how far it is ahead of or behind origin/main, and the remedy
is git pull && ./install.sh in the checkout on Linux and macOS, or, on
Windows, raven web --stop, git pull, then
powershell -NoProfile -ExecutionPolicy Bypass -File .\install.ps1 once the pull
succeeds. Rerunning the one-line installer
also upgrades, and ends on the running page.
Release Status
- Version:
0.2.7 - Tag:
v0.2.7 - Release type: patch
- Assets: the
ravenwheel and source distribution, four plugin wheels
(everos_memory,everos_cloud_memory,design_engine,ppt_engine), the
locked constraints fileraven-constraints.txt, and the plugin list
raven-plugins.txt, which installs every plugin wheel the release carries
Notes
- PyPI publishing is not enabled yet; the supported public install path uses the GitHub Release wheel asset.