2306 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
Andrey NeringandGitHub f34f890edf fix(deepseek): fix 400 bad request for deepseek provider (#2923)
Closes #2919
2026-05-15 10:06:16 -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
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
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
Christian Rocha 30c16c2094 Merge branch 'main' into fast-ui 2026-05-13 16:28:56 -04:00
Andrey Nering 4373f63e2e chore: fetch updated info from hyper
Closes #2900
2026-05-13 10:21:00 -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
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
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
Kieran KlukasandKieran Klukas 61ee2d2e0e fix(db): use connection pool to avoid corrupted writes 2026-05-12 12:40:59 -04:00
Kieran KlukasandKieran Klukas 02b783a380 fix(permission): fix publish-before-lock race and use O(1) session permission lookups
Move notification publish inside requestMu lock to prevent inconsistent
UI state, and replace the sessionPermissions slice with csync.Map
for constant-time persistent permission lookups.

💘 Generated with Crush

Assisted-by: DeepSeek V4 Pro via Crush <crush@charm.land>
2026-05-12 12:40:42 -04:00
Christian RochaandCharm Crush 43b986c8c0 perf(chat): show only the tail of long reasoning blocks when expanded
When a reasoning block is expanded, show only the most recent few hundred
lines by default with a hint that more lines are hidden, instead of
rendering the entire thing. Clicking again shows the full block.
This keeps the UI responsive when models produce very long reasoning.

Co-Authored-By: Charm Crush <crush@charm.land>
2026-05-12 12:22:44 -04:00
Kieran KlukasandKieran Klukas 0485adc477 chore(tests): update golden files 2026-05-12 12:16:03 -04:00
Kieran KlukasandKieran Klukas 9b8b888efe fix(prompts): don't include ripgrep and gh prompts in testing 2026-05-12 12:16:03 -04:00
Kieran KlukasandKieran Klukas 0c1014e5f7 feat(prompts): extend templating system to more prompts 2026-05-12 12:16:03 -04:00
5ad8beee37 feat(prompts): template prompts and add github and ripgrep info
Co-authored-by: Tai Groot <tai@taigrr.com>
2026-05-12 12:16:03 -04:00
Christian RochaandCharm Crush 8370edb691 perf(chat): cache the parts of an assistant message separately
Each assistant message has up to three sections — thinking, response, and
errors — and previously a new streamed token re-rendered all of them. Now
each section is cached on its own, so streaming a response no longer
re-renders the (often long) thinking block above it.

Co-Authored-By: Charm Crush <crush@charm.land>
2026-05-12 11:52:43 -04:00
Christian RochaandGitHub 3497b741b7 Merge pull request #2885 from charmbracelet/harden-directory-bounds
chore: harden directory bounds
2026-05-12 11:47:50 -04:00
Christian RochaandCharm Crush a7932c5669 test(config): tests for the data directory paths
Co-Authored-By: Charm Crush <crush@charm.land>
2026-05-12 11:34:16 -04:00
Kieran KlukasandKieran Klukas 651abb48ae chore(golden): rerecord vhs 2026-05-12 10:54:58 -04:00