Commit log

303b153 feat(oauth): add logout command (#2838)

Kieran Klukas created

cc7d651 fix(config): use large model for small if not configured (#2873)

Kieran Klukas created

959bf7e feat(tools): create an allow list for MCP tools (#2800)

Bruno Krugel created

b223e24 feat(logs): add a log line for dropped events

Kieran Klukas created

0585f49 fix(pubsub): raise default per-subscriber buffer (64 -> 4096)

Click to expand commit body
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>

Sven Olsen created

a19dd58 fix(dns): fix tmux dns resolver

Kieran Klukas created

61ee2d2 fix(db): use connection pool to avoid corrupted writes

Kieran Klukas created

02b783a fix(permission): fix publish-before-lock race and use O(1) session permission lookups

Click to expand commit body
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>

Kieran Klukas created

0485adc chore(tests): update golden files

Kieran Klukas created

9b8b888 fix(prompts): don't include ripgrep and gh prompts in testing

Kieran Klukas created

0c1014e feat(prompts): extend templating system to more prompts

Kieran Klukas created

5ad8bee feat(prompts): template prompts and add github and ripgrep info

Click to expand commit body
Co-authored-by: Tai Groot <tai@taigrr.com>

Kieran Klukas and Tai Groot created

609cc10 chore(legal): @jan-xyz has signed the CLA

Charm created

3497b74 Merge pull request #2885 from charmbracelet/harden-directory-bounds

Click to expand commit body
chore: harden directory bounds

Christian Rocha created

a7932c5 test(config): tests for the data directory paths

Click to expand commit body
Co-Authored-By: Charm Crush <crush@charm.land>

Christian Rocha and Charm Crush created

651abb4 chore(golden): rerecord vhs

Kieran Klukas created

efb3b03 feat(prompts): remove long prompt option

Kieran Klukas created

e112368 fix(config): scope crush.json discovery to the current repo

Click to expand commit body
The upward search for crush.json had no boundary and would walk
all the way to the filesystem root, which meant a stray crush.json
placed high in the tree could be picked up by every project beneath
it. This applies the same project boundary used for .crush discovery.

Co-Authored-By: Charm Crush <crush@charm.land>

Christian Rocha and Charm Crush created

e2e0bc0 fix(config): scope .crush discovery to the current repo

Click to expand commit body
When Crush starts up it looks for an existing .crush directory by
walking from the working directory toward the filesystem root. In
layouts with several worktrees of the same project under a common
parent, that walk could end up putting crush.db files in the project
root in worktrees.

This stops the walk at the git working tree root, when one can be
detected, and otherwise at the working directory itself. Each project
should now get its own .crush as expected.

Co-Authored-By: Charm Crush <crush@charm.land>

Christian Rocha and Charm Crush created

79b2d61 feat(fsext): stop upward lookup at a boundary directory

Click to expand commit body
Add variants of the upward filesystem search that stop at a
caller-supplied boundary directory instead of walking all the way up
to the filesystem root or to $HOME. Callers that want to avoid adopting
matches from outside their project can now express that boundary
explicitly. Existing callers and behavior are unchanged.

Co-Authored-By: Charm Crush <crush@charm.land>

Christian Rocha and Charm Crush created

7b34700 chore: auto-update files

Charm created

c853a93 fix(config): always resolve the data directory to an absolute path (#2883)

Click to expand commit body
Co-authored-by: Charm Crush <crush@charm.land>

Christian Rocha and Charm Crush created

bf5dd26 fix(paste): normalize windows newlines

Kieran Klukas created

a1a4806 v0.67.0

Andrey Nering created

2235a49 fix: limit view size checks to returned content (#2785)

Greg Slepak created

24da509 fix: properly follow the `Assisted-by` header spec (#2871)

Click to expand commit body
We were not using the correct format. According to the SPEC it should be:

    Assisted-by: AGENT_NAME:MODEL_VERSION

So now it'll look like this:

    Assisted-by: Crush:kimi-k2.6

See:

https://docs.kernel.org/process/coding-assistants.html#attribution

Andrey Nering created

1d42341 docs(hooks): clarify relative paths

Kieran Klukas created

61a9fce fix(config): individual errors on json parse

Kieran Klukas created

3b0d5de chore: auto-update files

Charm created

da262be fix(schema): fix schema descriptions being cut off

Kieran Klukas created

9d34668 fix(agent): release activeRequests before publishing TypeAgentFinished

Click to expand commit body
I keep hitting a bug where a turn finishes -- desktop notification
fires, agent is clearly done -- but the terminal stays stuck on
the spinner with input blocked until something unrelated wakes
the TUI up.

The TUI polls IsSessionBusy() inside its TypeAgentFinished
handler and only re-evaluates on incoming tea.Msgs.  Run() right
now publishes the notification while activeRequests still holds
the session's cancel func, so the poll on receipt sees true and
the busy gates stay stuck.  Reorder so cleanup runs first.

💘 Generated with Crush

Assisted-by: Claude Opus 4.7 via Crush <crush@charm.land>

Sven Olsen created

78088cd fix(lsp): update powernap with fix for lsps windows (#2862)

Click to expand commit body
* Ref https://github.com/charmbracelet/x/pull/853 by @sven2718

Andrey Nering created

445d1a0 chore(deps): bump the all group with 9 updates (#2861)

dependabot[bot] created

615c4e9 chore(deps): bump the all group with 2 updates (#2860)

dependabot[bot] created

7da38da refactor(tools): remove touch tool; allow empty write content

vorticalbox created

0da13d7 fix(tools/touch): gate outside-workingDir paths via permission prompt

Click to expand commit body
Mirrors the view.go sanitizer pattern (filepath.Abs + filepath.Rel +
".." check) so CodeQL no longer flags os.Stat/MkdirAll/OpenFile in the
touch tool as uncontrolled path expressions.

vorticalbox created

010ca2f feat: add touch tool for empty files

vorticalbox created

302f4ec chore: modernize errors.As to errors.AsType

Christian Rocha created

32410e2 fix(shell): fix build error post-refactor

Christian Rocha created

09c83e8 Merge pull request #2730 from charmbracelet/hookshell

Click to expand commit body
feat(hooks): use embedded shell by default

Christian Rocha created

ac79e5b fix(tools/view): detect image mime type; don't rely on extension (#2757)

Christian Rocha created

8f2fd3d Merge pull request #2788 from charmbracelet/revolve-env-vars-round-two

Click to expand commit body
config: lenient shell expansion default, uniform coverage across MCP, LSP, and providers

Christian Rocha created

b7607a0 chore: auto-update files

Charm created

2814e40 Merge pull request #2782 from charmbracelet/resolve-env-vars

Click to expand commit body
fix(config): restore full shell expansion in MCP config values

Christian Rocha created

d7d25cf fix(ui/chat): make keyboard expand work for assistant thinking blocks (#2791)

Click to expand commit body
The assistant message type's toggle-expand method returned no value,
so it silently failed to satisfy the expandable interface and the
keyboard expand path skipped assistant thinking blocks. Expansion
only worked via the mouse, which called the concrete method directly.

Fixing the signature exposed a second bug: the mouse path then
toggled twice per click (once inside the item, once via the generic
interface path), netting no change. The item now just reports
whether the click hit the thinking box; the generic path does the
toggle, gated on that flag so clicks elsewhere do nothing.

Adds a runtime regression test plus a compile-time interface
assertion so this can't silently come back.

Co-authored-by: Crush <crush@charm.land>

Christian Rocha and Crush created

ff0e709 chore(legal): @smeinecke has signed the CLA

Charm created

7a8dd00 chore(legal): @acheong08 has signed the CLA

Charm created

2e9fa66 chore(legal): @sven2718 has signed the CLA

Charm created

b51b1e2 v0.66.1

Andrey Nering created

086cfda fix: update fantasy with tool call fixes (#2839)

Click to expand commit body
When a tool call is made with invalid arguments, Crush will now report
the error back so the model will continue working and can do another
attempt.

Fix on Fantasy done by @mkaaad.

* Ref https://github.com/charmbracelet/crush/issues/2776
* Ref https://github.com/charmbracelet/fantasy/pull/223

Andrey Nering created