3365 Commits
Author SHA1 Message Date
Christian Rocha f32dcffc21 fix(shell): ensure canceling a command stops all child processes 2026-05-15 17:37:04 -04:00
Christian RochaandGitHub 4686002d64 Merge pull request #2908 from charmbracelet/fast-ui
perf(ui): tui performance improvements
2026-05-15 14:30:47 -04:00
Christian Rocha 30f9c6ed55 chore(ui): make spinner deterministic for testing 2026-05-15 14:18:53 -04:00
Charm 4f67a15951 chore(legal): @CatMe0w has signed the CLA 2026-05-15 13:58:18 -03:00
Andrey Nering fe478134f5 v0.69.0 v0.69.0 2026-05-15 10:15:01 -03:00
Andrey NeringandGitHub f34f890edf fix(deepseek): fix 400 bad request for deepseek provider (#2923)
Closes #2919
2026-05-15 10:06:16 -03:00
Charm 4956c671b5 chore(legal): @yookibooki has signed the CLA 2026-05-15 09:16:45 -03:00
Kieran KlukasandKieran Klukas ce08b22045 feat(dirs): add some styling to the dirs command 2026-05-14 22:17:49 -04:00
bbrodrigesandKieran Klukas 5331fe25e1 add -p flag to dirs command 2026-05-14 22:17:49 -04:00
Christian Rocha f012b46976 Merge remote-tracking branch 'origin/main' into fast-ui 2026-05-14 21:21:44 -04:00
Andrey Nering 0fc5cfec2d v0.68.0 v0.68.0 2026-05-14 17:26:02 -03:00
Kieran KlukasandKieran Klukas f6dc495d97 feat(responses): opt in specific copilot models to responses 2026-05-14 15:38:46 -04:00
Christian Rocha 55205401ad Merge branch 'main' into fast-ui 2026-05-14 15:34:53 -04:00
Tai GrootandChristian Rocha 9e126c27da fix: detect stale server during development with BuildID
The version check compared Version strings, but during development both
client and server report "devel" — so stale servers were never restarted.

BuildID is now derived from the executable's modification time, which
changes on every recompilation (including go run). The server exposes it
via /v1/version and the client checks both Version and BuildID match.

Assisted-by: Crush:AWS Claude Opus 4.6
2026-05-14 15:32:41 -04:00
Kieran KlukasandKieran Klukas 08c5c7d8af fix(reasoning): enforce can reason from catwalk before sending reasoning_effor 2026-05-14 15:23:05 -04:00
Andrey NeringandGitHub 0a2de47f0e fix: address thinking on/off toggle for provider (#2916) 2026-05-14 16:00:46 -03:00
Kieran KlukasandKieran Klukas c8379c306f fix(auth): add better atomic refresh for hyper 2026-05-14 14:48:40 -04:00
Charm 3413970fee chore: auto-update files 2026-05-14 18:02:01 +00:00
Kieran KlukasandKieran Klukas b8989b964a refactor(skills): make coordinator the sole skill discovery publisher
Remove the auto-publish from DiscoverWithStates so that
discoverSkills in the coordinator is the only code path that
emits skill discovery events. This eliminates the double-publish
where DiscoverWithStates would emit user-only states, followed
by the coordinator emitting the merged builtin+user states.

Update the Discover tests to call DiscoverWithStates directly
and assert on the returned states slice, rather than subscribing
to the pubsub broker. This also lets those tests run in parallel.
2026-05-14 14:00:23 -04:00
IlgazandKieran Klukas 8e7451fc1e fix(ui): show custom skills reliably on startup
Resolve race condition by implementing a package-level cache for skill discovery states. Add ~/.agents/skills/ and ~/.claude/skills/ as global skill scan paths.
2026-05-14 14:00:23 -04:00
Charm 62ee620962 chore(legal): @taciturnaxolotl has signed the CLA 2026-05-14 13:56:37 -03:00
Christian Rocha 646a5053bd fix(ui): keep tool spinners animating during long-running tasks 2026-05-14 12:50:55 -04:00
Christian Rocha e986e5db8f Merge remote-tracking branch 'origin/main' into fast-ui 2026-05-14 09:59:31 -04:00
Christian RochaandGitHub 61fa910250 Merge pull request #2876 from charmbracelet/client-server-race
fix: client-server startup race
2026-05-14 09:56:46 -04:00
3625ade171 fix: render permission dialog content in client/server mode (#2877)
Co-authored-by: Charm Crush <crush@charm.land>
2026-05-14 09:45:50 -04:00
Christian RochaandGitHub ed91948fe4 fix(ui): regression in tool output in client/server mode (#2878) 2026-05-14 09:45:18 -04:00
Christian RochaandCharm Crush eb03b3bb93 fix(test,race): probe server health during the run, not after
Co-Authored-By: Charm Crush <crush@charm.land>
2026-05-14 09:42:02 -04:00
Christian Rocha 5569be61a7 fix(lint): require exec.CommanadContext over exec.Command 2026-05-14 09:42:02 -04:00
Charm 61926dd0f5 chore(legal): @akhenakh has signed the CLA 2026-05-13 23:28:25 -03:00
Christian Rocha 30c16c2094 Merge branch 'main' into fast-ui 2026-05-13 16:28:56 -04:00
Andrey Nering d00493824d ci: fix indentation 2026-05-13 10:24:46 -03:00
Andrey Nering 4373f63e2e chore: fetch updated info from hyper
Closes #2900
2026-05-13 10:21:00 -03:00
Andrey Nering d42d89911d ci: allow manual trigger of schema update 2026-05-13 10:19:30 -03:00
Andrey Nering ea847f2890 fix: make thinking on/off toggle work for deepseek provider
* Ref: https://github.com/charmbracelet/catwalk/pull/271
* Docs: https://api-docs.deepseek.com/guides/thinking_mode
2026-05-13 10:15:31 -03:00
Andrey Nering b0c3eb9cf0 chore(deps): update fantasy and catwalk 2026-05-13 10:15:31 -03:00
Charm 9114254669 chore(legal): @pablodz has signed the CLA 2026-05-12 19:25:21 -03:00
Kieran KlukasandGitHub 6f91b0ca22 fix(tools): switch bufio scanner for reader (#2884)
* fix(tools): switch bufio scanner for reader

* chore(tests): update golden files
2026-05-12 17:00:19 -04:00
Christian RochaandCharm Crush 65f30a1343 perf(chat): skip re-parsing the rendered chat when nothing has changed
Each frame the chat list is turned into a string with ANSI color codes
that we then have to parse back into cells before drawing. When the
chat list output is the same as the previous frame, we now reuse the
cells we already produced and skip the parsing step.

Co-Authored-By: Charm Crush <crush@charm.land>
2026-05-12 16:41:14 -04:00
0490a8a6b4 fix(bedrock): honor reasoning_effort for Anthropic-on-Bedrock models (#2887)
Bedrock routes through Fantasy's Anthropic implementation with a
different display name, so provider options must still be filed under
anthropic.Name for the language model to pick them up. Previously the
bedrock provider type was missing from getProviderOptions entirely, so
reasoning_effort and think were silently dropped.

Co-authored-by: JJ Bot <john.jansen+bot@me.com>
2026-05-12 17:31:49 -03:00
Christian RochaandCharm Crush 1c7ccfd7f7 perf(chat): reuse the rendered prefix of a streaming reply
While a model is streaming a reply, we used to re-render the entire
message text every time a new chunk arrived. Now we keep the rendered
output of the parts that are clearly finished and only render the
trailing piece on each update. The check for what counts as a finished
part is conservative on purpose, so anything risky (open code blocks,
lists, tables, html blocks, link references) still falls back to a
full render. The visible output is the same.

Co-Authored-By: Charm Crush <crush@charm.land>
2026-05-12 16:09:22 -04:00
Christian RochaandCharm Crush 77b6c38b0f perf(chat): only render the chat lines that fit on screen
Previously the chat list pulled the entire rendered output of every
on-screen item into a buffer and then trimmed it down to the viewport
height at the end. For very tall items, like a long reasoning block,
that meant building a buffer with thousands of lines just to throw
most of them away every frame. The list now stops collecting lines
as soon as the viewport is full, so per-frame work is bounded by the
visible window. Output is unchanged.

Co-Authored-By: Charm Crush <crush@charm.land>
2026-05-12 16:09:22 -04:00
Christian RochaandCharm Crush 6b101f3860 perf(chat): skip re-rendering chat list items that have not changed
The chat list now remembers what each item rendered last frame and
reuses it when nothing about that item has changed. Once a message
turn is fully done, its rendered output is reused verbatim on every
subsequent frame for as long as it stays unchanged. Resizing the
window, focusing or selecting an item, dragging a selection over it,
toggling a thinking block, and any other state change still triggers
a fresh render. The visible output is identical to before; the work
to produce it is much less.

Co-Authored-By: Charm Crush <crush@charm.land>
2026-05-12 16:09:15 -04:00
Christian Rocha 295a62dc38 fix(ui): calculation bug that would cause modified files to wrap 2026-05-12 16:00:52 -04:00
Charm e0a8e39bfe chore(legal): @johnjansen has signed the CLA 2026-05-12 16:28:17 -03:00
Kieran KlukasandGitHub 303b153b97 feat(oauth): add logout command (#2838) 2026-05-12 13:59:08 -04:00
Kieran KlukasandGitHub cc7d651a9e fix(config): use large model for small if not configured (#2873) 2026-05-12 13:58:42 -04:00
Bruno KrugelandGitHub 959bf7e289 feat(tools): create an allow list for MCP tools (#2800) 2026-05-12 13:49:35 -04:00
Kieran KlukasandKieran Klukas b223e24ed8 feat(logs): add a log line for dropped events 2026-05-12 12:41:50 -04:00
Sven OlsenandKieran Klukas 0585f498ba fix(pubsub): raise default per-subscriber buffer (64 -> 4096)
There still seems to be a TUI-sync issue on upstream/main where
the assistant cuts off mid-sentence on screen even though the
DB has the full response.  Two recent PRs probably get most of
the way to fixing it: #2840 reordered the agent's
TypeAgentFinished notification past the activeRequests cleanup,
and #2836 made channelBufferSize actually honored.  In
power-user cases the default (64) is still too small, though.

A streaming turn calls messages.Update on every OnTextDelta /
OnReasoningDelta callback, and the TUI's glamour re-render
periodically stalls the Update loop for tens to hundreds of
milliseconds at a time.  64 slots fill before drain catches up
and the non-blocking publish in broker.go silently drops the
rest.

This diff adopts a pretty aggressive fix -- 64 -> 4096 covers a
long turn at typical SSE rates even under pathological View()
stalls.  Cost is a few MB of ring-buffer allocation across all
brokers, comfortably inside any modern dev machine's budget;
users on tighter memory targets can still tune via
NewBrokerWithOptions.

Drive-by cleanup: maxEvents (struct field + NewBrokerWithOptions
param) is set to 1000 by default but never read anywhere in
tree -- it's bufferSize, not maxEvents, that actually bounds the
queue.  Drop maxEvents on the theory that misleading dead code
is worse than no code.

💘 Generated with Crush

Assisted-by: Claude Opus 4.7 via Crush <crush@charm.land>
2026-05-12 12:41:50 -04:00
Kieran KlukasandKieran Klukas a19dd58171 fix(dns): fix tmux dns resolver 2026-05-12 12:41:14 -04:00