Releases: borg-ml/agent
Release list
v0.13.0
Borg Agent 0.13.0
Tools
- The goal, plan, subagent and cross-agent messaging capabilities are their own
tools, and onecapabilitytool reaches everything else by name or by search.
Both are on the default surface, not only on the opt-in one. A promoted name is
refused through the generic tool and points at its own, and an unknown name is
answered with the closest real capabilities rather than a bare error. query_historyis a tool, so which of its retrieval modes answers a question
arrives with the guidance instead of after a wrong guess.search_filesis a tool backed by ripgrep's own engine, so it needs no
external executable and is the thing to reach for rather than grep. A file with
undecodable bytes no longer costs you every match inside it.- Extension capabilities are advertised with descriptions read from the live
catalog, so a newly loaded extension is visible without restarting anything. - Computer use is a tool of its own. It was always a full capability - native
desktop and private-display access, and the approval gate that refuses
consequential controls until you confirm that exact action - but a model had to
already know the name and invent a JSON body for it before it could take a
screenshot. A subagent still gets the private headless display rather than
yours: the spec is surface-aware, so promotion cannot widen a child's reach.
Performance
- A fast reasoning model no longer makes the interface lag. Every frame was
re-rendering the whole expanded block, beginning with a fresh copy of every
byte of reasoning received so far, so a frame cost the length of the block and
a stream cost the square of it. At 800 lines that was 17.22ms a frame and
about seven seconds of CPU for one answer; it is now 0.27ms and 113ms, and a
frame through a real terminal measures 2.02ms with thousands of deltas
coalesced into it. The lines that have finished are reused, and the line still
being written is redone, because that is the only one that can still change. BORG_TUI_FPSandBORG_TUI_STREAMING_FPSare documented. They existed and
were clamped, but appeared nowhere, so the one knob that changes how streamed
text feels could not be found.
Reliability
- A compaction that loses its connection is retried instead of failing your turn.
One empty upstream response on one fold used to abort the whole sequence and
fail the turn, costing you the context it was there to save. Retries are
bounded, and a refusal no repeat can fix -- auth, billing, quota, an
oversized request -- still fails on the first attempt with its real cause. - A provider error now names the field it rejected. Only the code and the
parameter were reported, which say that something is wrong and never what;
a malformed request was undiagnosable from outside. The provider's own
wording comes through with the rejected value stripped.
Reliability
-
A history search on a resumed or forked session can no longer report "no
matches" while having looked at almost none of the history. Those sessions were
scanned oldest-first under a hard budget, so on a long thread only the oldest
events were ever reachable and recent work was invisible however the query was
phrased. The scan now covers the newest window, which is what a resumed thread
is asking about. -
Search results say whether they are complete.
truncatedalready conflated
"your hit list hit the limit" with "the scan never reached the rest of the
history", and the two were indistinguishable to a caller. A result now carries
search_incompleteplus thescanned_from_sequence..scanned_to_sequence
window it covered, so an empty result reads as "not found in what I looked at"
rather than "does not exist", and the rest can be paged withstart_sequence.
Thequery_historydescription says so too. -
An upstream that answers with an empty response is retried instead of ending
the turn. Only a refusal is treated as fatal now; everything else is
retryable, as it was before mid-stream errors were recognised at all. -
A tool call carrying the presentation field its own schema advertises is
accepted. The same idea appears asactionand asdescription, and a call
formed exactly as documented was being refused as malformed - the cause of most
of that tool's flakiness.
Terminal UI
- An action group that live work was holding open now folds when that work
finishes. A group held open by a running process never collapsed, because
being the newest group kept it open on its own. - Pending input reads as an action group rather than a bordered panel: the
same disclosure, the same summary, the same grey, no frame. - A retry no longer re-announces the goal. Every retry re-emits it, and the
card was taken out and pushed back, so resuming dropped it to the bottom of
the transcript and reprinted a goal already on screen.
Terminal UI
- A status line that overflows now ends in a mark. Losing its last column to
truncation used to drop the tail with nothing to show the text had been cut. - The effort and billing segments share one colour instead of being graded per
value, so the same colour no longer means xhigh in one place and a pro/max
subscription in another. - Dragging the scrollbar moves the transcript one line per row. A scrollbar maps
proportionally, so on a long thread one row of drag moved hundreds of lines and
the closer to the middle of the thumb you grabbed, the less each row was
worth. Clicking the track still jumps - that gesture means "go there" - and
only the drag changed. - The composer's text-entry ground is darker and neutral, so the three rows you
type in read as a well rather than another band of transcript. - The splash says what it is. It now reads "BORG" over "agent" over the version
with the channel beside it, and all three lines keep one width and one centre
whatever the version turns out to be - thevprefix yields to the width
rather than the layout bending around it.
Providers
- A tool result carrying an image no longer puts the image inside the tool
result field, which the API reads as text. A valid screenshot came back as
invalid_valueoninput-- "the image data you provided does not
represent a valid image" -- and broke every later turn in the session. - An image attachment is typed by what its bytes are, not by what the file is
called, on every path. - A pay-per-use OpenAI key is no longer sent the request shape a ChatGPT
subscription uses, which the public API rejects outright.
Providers
- Qwen models that take an effort ladder are sent one.
enable_thinkingis a
boolean and is right for Qwen3.5/3.6/3.7, but the Qwen3.8 family takes
reasoning_effortinstead and converts a level into a thinking budget itself- so a laddered model was being offered low/medium/high in the picker and then
havingenable_thinkingput in the body, and the effort had no effect on the
request. The choice is now made per model from the catalog entry that already
exists for it.
- so a laddered model was being offered low/medium/high in the picker and then
Setup
- The Python library's documented usage is corrected:
borgis already in the
namespace, soimport borgis not part of it. HOMEcan be set for the runtime worker as a user setting, defaulting to off.
v0.12.9
Borg Agent 0.12.9
Updates
- Automatic updates accept larger release archives; release packaging stays within
the old updater's download limit so existing installations can still upgrade.
Terminal UI
- Ctrl/Cmd numbered hints no longer recolour the subscription label in the footer.
- Persistent Python workers no longer let child-process terminal prompts overwrite
the TUI or stall on terminal job control.
v0.12.8
Borg Agent 0.12.8
Terminal UI
- The splash swaps orange and white between the logo and alpha caption, including glitches.
- Collapsed plan previews show open items before completed items; keyboard hint badges
no longer overlap popups or repaint the footer background. - Running command follow-ups use the shorter “Read output” action label.
- Enhanced terminal input requests shifted key characters so uppercase and punctuation
reach the composer on terminals that report alternate key codes. - Stopping a background command watcher also stops job-control child processes
instead of leaving builds running after the watcher exits.
v0.12.7
Borg Agent 0.12.7
Context
- Native automatic compaction preserves the request prefix needed to restore
subsequent provider-measured usage after restart. Local context estimates no
longer count duplicated provider output or opaque reasoning signatures as text.
v0.12.6
Borg Agent 0.12.6
Terminal UI
- Numbered keyboard hints label the status controls above and below the composer
instead of transcript rows. Badges sit above their controls; hold Ctrl on
Linux/Windows or Cmd on macOS, or press F12 in terminals without modifier events. - Escape sends queued user input into an active turn instead of interrupting it;
with no queued input, Escape still interrupts. - Plan updates highlight replaced and removed rows in red and their replacements
in green. Fresh chats no longer show an empty0/0 completedplan card.
Configuration
[prompt] appendinagent.tomladds user-scoped instructions to local agent
turns without replacing Borg's core prompt. It applies when a session or host
executor starts with the new settings.
v0.12.5
Borg Agent 0.12.5
Context
- Resumed native sessions restore provider-measured context usage when the
saved checkpoint matches the replayed conversation and request prefix.
Compaction explains when it is using a local estimate instead. - Codex compaction uses low reasoning effort instead of inheriting the working
turn's high or extra-high effort, while preserving the cached request prefix.
Work coordination
- Agent plans and shared work use one durable todo model. Assigned work appears
in ordered per-agent plans; omitting an assignee creates unassigned backlog.
Migration preserves existing work, dependencies, subtasks and review metadata. - Plans retain blocked and awaiting-review states, and selected-agent views can
show and edit stopped agents' work. Removing an item from a plan unassigns it
rather than deleting it. Concurrent claims and edits use revision checks.
Providers and tools
- Claude subscription cache warming uses the same pinned account and connector,
with capped output and no API-billing fallback. Adaptive thinking settings are
preserved; budget-based thinking remains ineligible. Subscription cost
comparisons are labelled as API-equivalent estimates. Automatic Codex warming
remains disabled without established cache-retention semantics. - MCP discovery follows paginated tool lists within a bounded discovery timeout.
MCP tool errors propagate as failures, including through code mode, rather
than appearing as successful raw responses.
Terminal UI
- Fast streamed replies avoid rescanning earlier styled spans when wrapping,
and code blocks reuse highlighting for completed lines instead of restarting
from the top on every repaint. - Modifier-held numbered hints activate visible clickable targets with 1–9 and
0, with an F12 fallback for terminals that cannot report modifier holds. - Received agent messages use an incoming arrow.
- The status row's scroll-back and return buttons no longer cover the status
line. The line gives up their columns and ends in an ellipsis in front of
them, and a click on a button no longer reaches the control it used to hide.
v0.12.4
Borg Agent 0.12.4
Providers
- Vercel AI Gateway is a provider.
borg login vercelstores a gateway key, or
setVERCEL_AI_GATEWAY_API_KEY, and/modellists every language model the
gateway serves — 264 today, includingstealth/pixel-canary— from a session
on any provider. Embedding, reranking, image, video, realtime, speech and
transcription models are left out: they cannot answer a chat completion.
Terminal UI
- A completed reasoning row is marked
◦instead of✦.
Sessions
- Sending a message no longer resumes a goal that a stop or a block left
parked. The message is still answered and an Escape stop is still released,
but the goal waits for an explicit/goal resume. Set
[capabilities] resume_paused_goal_on_message = truefor the previous
behavior.
v0.11.6
Borg Agent 0.11.6
Models
- Ordered model fallback chains: set
[models].fallback(for example
["claude-opus-5-5@max", "gpt-6-sol@xhigh", "opencode-go/deepseek-v4.1"])
and a usage limit moves the same turn to the next model with quota, then back
once the limit resets. Named chains compose withchain:<name>, and a route
never spends API credit unless it opts in. See docs/model-fallback.md. - A new session started without
--provideror--modelbegins on the first
route of the chain when that subscription is signed in.
Terminal
- Footer hover hints say click and right-click, and they and the Pending Input
controls use the footer's style: keys in white, the rest in dark grey. - Stopped and failed subagents stay on the team roster, after the working ones,
marked "click to resume"; the status line shows "N stopped" when none are
working so the roster stays reachable. - "Jump to bottom" sits on the status row instead of covering the newest
transcript line.
History
- Filtering history by actor works without search text.
v0.11.3
Borg Agent 0.11.3
Terminal
- Image previews render once, at native size. Resumed and child
transcripts forgot the terminal's graphics support, so a preview drew a
blocky text fallback under a stretched copy of the image and was captioned
"text unreadable here". Every transcript now uses the graphics protocol. - Message backgrounds and diff highlight bars reach both edges of the screen;
the scrollbar is drawn over them. - The footer's
↓Nbehind-count shows a "git pull" tooltip on hover, like the
↑Npush count, so it is clear that clicking it pulls.
Agents and teams
- Messages sent while a steer is in flight are delivered together. A
second message was held until the next model call, which could be a long
tool call away. Held messages now go to the model, each separately, as soon
as the earlier one is accepted.
v0.11.1
Borg Agent 0.11.1
Agents and teams
- Messages you send during a usage-limit wait run immediately. Borg no
longer holds them until the automatic retry, which could be hours away after
you had already topped up or switched account. If the limit still applies,
the turn returns to the same wait. - Team reports stay out of Pending Input during a usage-limit wait. A
subagent report that arrived while the session waited on a usage limit was
queued as if you had typed it; it is now kept as a team update.