Commit log

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

44ece2c fix(tools): truncate long running background commands to 30k chars

Kieran Klukas created

abeaff0 fix(pubsub): respect channelBufferSize parameter in Subsribe

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

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

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

3d95ca9 bug: yollo mode via flag doesn't activate prompt

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

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

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

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

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

481202e chore(deps): bump the all group with 4 updates (#2795)

dependabot[bot] created

81e4d5a chore(deps): bump github/codeql-action in the all group (#2794)

dependabot[bot] created

b5c8a6d chore(legal): @ilgax has signed the CLA

Charm created

4be35b8 chore(legal): @somjik-api has signed the CLA

Charm created

56b192e v0.65.2

Andrey Nering created

63e03ff v0.65.1

Andrey Nering created

0f3a6cd ci: remove snapcraft token

Click to expand commit body
See: https://github.com/charmbracelet/meta/commit/86917ec06aa42153f5e48cb2570dfc5efd1e389d

Andrey Nering created

77d86b8 v0.65.0

Andrey Nering created

ce314b8 feat(ui): add hypercredit readout to small top header

Christian Rocha created

d5b5a9e chore(ui): hypercrush small type treatment

Christian Rocha created

a93277f chore(legal): @pragneshbagary has signed the CLA

Charm created

0a9d0b0 chore(legal): @mkaaad has signed the CLA

Charm created

bae9299 chore(legal): @SAY-5 has signed the CLA

Charm created

98f9a17 chore: auto-update files

Charm created

a14feb3 feat: launch hyper beta (#2768)

Click to expand commit body
No need to set `HYPERCRUSH=1` anymore.

Andrey Nering created

6ce4fbc feat(hyper): show remaining hypercredits in the sidebar (#2766)

Andrey Nering created

5d8f924 test: re-record test fixtures

Andrey Nering created