Commit log

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

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

9af81e3 merge: resolve conflicts with main

Kieran Klukas created