303b153
feat(oauth): add logout command (#2838)
Kieran Klukas created
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)
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
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
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
chore: harden directory bounds
Christian Rocha created
a7932c5
test(config): tests for the data directory paths
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
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
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
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)
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)
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
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)
* 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
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
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
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
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)
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)
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