615c4e9
chore(deps): bump the all group with 2 updates (#2860)
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
44ece2c
fix(tools): truncate long running background commands to 30k chars
Kieran Klukas created
abeaff0
fix(pubsub): respect channelBufferSize parameter in Subsribe
`NewBrokerWithOptions` accepted `channelBufferSize` parameter, but never stored or used it, so `Subsribe`` always used the hardcoded `bufferSize` constant (64).
Yeonuk Hwang created
f970188
chore(legal): @yeonuk-hwang has signed the CLA
Charm created
89181a6
fix(tools): don't return a go error on glob tool failure
Kieran Klukas created
b90bcc3
fix(ui): allow oauth modals to consume enter
Kieran Klukas created
d5b4765
docs(readme): fixed typo in hooks (#2801)
ardevd created
a924ca1
fix(tui): show initialization mark errors in status footer (#2825)
huaiyuWangh created
5816fad
fix(agent): support flat_rate cost handling (#2116)
huaiyuWangh created
95e93e9
fix(ui): add exit alias to the quit command
Kieran Klukas created
11eabdf
fix(errors): surface errors in subagents
Kieran Klukas created
ae1c95a
fix(posthog): do not discard custom properties of an error (#2829)
Andrey Nering created
5aad790
fix(tools): fix a potential nill crash in cached glob results
Kieran Klukas created
8bc4a75
fix(config): atomically update multiple fields during oauth
Kieran Klukas created
3b9b361
docs(readme): document `HYPER_API_KEY`
Andrey Nering created
279b501
v0.66.0
Andrey Nering created
8cd4786
refactor(coordinator): extract token refresh helpers to reduce duplication
Extract `refreshTokenIfExpired` and `retryAfterUnauthorized` functions to eliminate duplicated OAuth/API key refresh logic in both `Run` and `Summarize`. 💘 Generated with Crush Assisted-by: Kimi K2.6 via Crush <crush@charm.land>
Andrey Nering created
6bdd233
fix(ui): display error on summarization instead of leaving spinning
Kieran Klukas created
a4020df
fix(summarize): reauthenticate oauth tokens when used to summarize
Kieran Klukas created
6d95ecc
fix: skip image attachments in history when model doesn't support them (#2818)
When switching from a vision-capable model to one without image support mid-conversation, historical user messages containing image attachments would cause API errors. Now those attachments are filtered out from the prompt history based on the current model's SupportsImages capability. 💘 Generated with Crush Assisted-by: Kimi K2.6 via Crush <crush@charm.land>
Andrey Nering created
61f49b2
fix(agent): drain queued messages after manual session summarize
Kieran Klukas created
0e039d0
fix(ui): prevent duplicate custom skills from rendering
Ilgaz created
9af81e3
merge: resolve conflicts with main
Kieran Klukas created
3d95ca9
bug: yollo mode via flag doesn't activate prompt
Kieran Klukas created
c9fd6be
fix(shell): convert path to posix path in tests
Kieran Klukas created
452cd75
feat: add Nix flake for development environment (#2512)
Kieran Klukas created
b64cb02
chore(legal): @ardevd has signed the CLA
Charm created
3aa26d9
v0.65.3
Andrey Nering created
ecebe91
chore: auto-update files
Charm created
812d78b
chore(deps): update catwalk
Andrey Nering created
99bc5ce
fix(config): check config file for newer token before OAuth refresh
When refreshing an OAuth token (e.g. for Hyper), check the config file on disk first to see if another Crush session already refreshed it. If the disk token differs from the in-memory one, use the disk token and skip the external refresh request. Prevents unnecessary token churn and 401s when multiple Crush sessions are running. 💘 Generated with Crush Assisted-by: Kimi K2.6 via Crush <crush@charm.land>
Andrey Nering created
1ed6f52
refactor(ui): pair markdown cache invalidation with the styles mutation
This is an additional guard to invalidate the cache in the off-chance styles are mutated (rather than updated via applyTheme(), as they should be).
Christian Rocha created
19197e3
fix(ui): cache glamour renderers
The theme prep overhaul in 755f6fa made the main markdown renderer and thinking block markdown renderer heavier, which exasperated a gap in perf. Basically every token chunk would clear would clear the per-item render cache and force a re-render. This update memoizes renderers with markdown and should generally give us a nice increase in perf compared to what we had before the theme rendering.
Christian Rocha created
4010841
fix(db): prevent SQLITE_NOTADB corruption under concurrent sub-agents (#2690)
Crush could fail to start with "file is not a database (26)" after a session ran many sub-agents in parallel. The shared *sql.DB was opened with Go's default unlimited connection pool, so each concurrent sub-agent (session/message/cost writes via coordinator.runSubAgent) could open its own SQLite handle. Under load, WAL frames from different handles interleaved and auto-checkpoints could race; if the process was cancelled or killed mid-checkpoint, the main DB header and WAL desynced, producing SQLITE_NOTADB (26) on the next open. Two changes address this: - Set db.SetMaxOpenConns(1). SQLite serializes writes at the file level anyway, so extra pool connections add no throughput, only race surface. Forcing a single pooled connection makes database/sql queue all callers through one SQLite handle, eliminating cross-handle WAL/checkpoint races. Sub-agents still function; their writes just serialize (which SQLite was going to do regardless). - Add _txlock=immediate to both driver DSNs (modernc.org/sqlite and ncruces/go-sqlite3). BEGIN IMMEDIATE acquires the reserved-writer lock up front so concurrent writers queue cleanly on busy_timeout instead of racing the deferred-to-writer upgrade (the pattern behind prior SQLITE_BUSY reports, e.g. #2129, #2576). Defense in depth alongside the pool limit. For the ncruces driver the DSN must use the file: URI prefix for query params to be parsed; the plain path form silently ignores _txlock.
Greg Slepak created