Commit log

abf15f5 chore(legal): @maxbrunet has signed the CLA

Charm created

af86738 fix: detect and stop tool call infinite loops (#2130) (#2214)

Click to expand commit body
Add smart loop detection as a stop condition for agent execution. When
the same tool call signature (name + input + output) appears more than
5 times within a 10-step window, the agent stops instead of running
until context window exhaustion.

huaiyuWangh created

ddf2fad chore: update fantasy with fix for json schema in openai (#2221)

Click to expand commit body
https://github.com/charmbracelet/fantasy/pull/138

Andrey Nering created

992a7b2 v0.43.0

Andrey Nering created

889d2ce chore(deps): update catwalk

Andrey Nering created

4f5d31d chore(deps): update catwalk

Andrey Nering created

b68521f chore(deps): update fantasy (#2220)

Andrey Nering created

db46f5e chore: auto-update files

Charm created

45663b7 chore: update catwalk to v0.19.0

Andrey Nering created

aa1ea49 fix: add io.net api key validation fallback

Andrey Nering created

27548b6 docs(readme): mention io.net provider

Andrey Nering created

d34c56b Merge pull request #2204 from charmbracelet/charm-1151-toggling-open-a-block-while-streaming-causes-jitter

Click to expand commit body
fix(ui): chat: use follow indicator to determine auto-scrolling behavior

Ayman Bagabas created

1f9f190 chore(legal): @PHPCraftdream has signed the CLA

Charm created

8ccb3c7 feat(pills): add toggle todos/pills menu item (#2202)

Christian Rocha created

eae61e1 fix(ui): completions offset for attachments row (#2208)

Click to expand commit body
refs #2129

Signed-off-by: Carlos Alexandro Becker <caarlos0@users.noreply.github.com>

Carlos Alexandro Becker created

d7e2252 perf: replace regex-based gitignore with glob-based matching (#2199)

Click to expand commit body
Replace github.com/sabhiram/go-gitignore (regex-based) with
github.com/go-git/go-git/v5/plumbing/format/gitignore (glob-based).

Key optimizations:
- Two-level caching: per-directory pattern cache + combined matcher cache
- O(1) fast-path for common directories (node_modules, .git, __pycache__, etc.)
- Pre-build combined matchers to avoid O(depth) pattern walking per file
- Proper isDir parameter for directory-specific patterns (e.g., "backup/")

Profiling showed 80% CPU in regexp.tryBacktrack from the old library when
walking large monorepos (771k files). After this change, gitignore matching
drops to ~2% of CPU time.

💘 Generated with Crush

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

Austin Cherry created

faec9a2 chore(legal): @wallacegibbon has signed the CLA

Charm created

976cca1 chore: upgrade lipgloss and colorprofile to fix windows terminal bash

Click to expand commit body
detection

Ayman Bagabas created

0c74e47 v0.42.0

Andrey Nering created

f791e5c fix: change binding to open/close todo list from `ctrl+space` to `ctrl+t` (#2201)

Click to expand commit body
`ctrl+space` is used by some terminal emulators and operating system,
so some users were enable to use it. `ctrl+t` should work everywhere.

Fixes #1618

Andrey Nering created

5179b28 feat(lsp): show user-configured LSPs in the UI (#2192)

Click to expand commit body
* feat(lsp): show user-configured LSPs in the UI

This will show the user-configured LSPs as stopped in the UI.

Maybe we should have a different state for "waiting"?

Signed-off-by: Carlos Alexandro Becker <caarlos0@users.noreply.github.com>

* chore(lsp): mark "unstarted" LSPs as such, use named styles

* fix: add unstarted state

Signed-off-by: Carlos Alexandro Becker <caarlos0@users.noreply.github.com>

---------

Signed-off-by: Carlos Alexandro Becker <caarlos0@users.noreply.github.com>
Co-authored-by: Christian Rocha <christian@rocha.is>

Carlos Alexandro Becker and Christian Rocha created

baedc28 fix: address potential panic on shell command execution (#2200)

Click to expand commit body
This panic happen once in a while on CI on Windows specifically.
I personally never saw it happening myself, but I think it's possible
to happen for the end user on Windows as well.

Looks like a potential bug on the interpreter, but in the meantime let's
at least recover from the panic and gracefully handle it.

    panic: ended up with a non-nil exitStatus.err but a zero exitStatus.code

    goroutine 61 [running]:
    mvdan.cc/sh/v3/interp.(*Runner).Run(0xc000220848, {0x1415220e0, 0xc00021a1e0}, {0x14151e088, 0xc00025a600})
    	C:/Users/runneradmin/go/pkg/mod/mvdan.cc/sh/v3@v3.12.1-0.20250902163504-3cf4fd5717a5/interp/api.go:929 +0x6b2
    github.com/charmbracelet/crush/internal/shell.(*Shell).execCommon(0xc000256360, {0x1415220e0, 0xc00021a1e0}, {0x14135a250, 0x9}, {0x14151baa0, 0xc00025a540}, {0x14151baa0, 0xc00025a580})
    	D:/a/crush/crush/internal/shell/shell.go:273 +0x285
    github.com/charmbracelet/crush/internal/shell.(*Shell).execStream(...)
    	D:/a/crush/crush/internal/shell/shell.go:288
    github.com/charmbracelet/crush/internal/shell.(*Shell).ExecStream(0xc000256360, {0x1415220e0, 0xc00021a1e0}, {0x14135a250, 0x9}, {0x14151baa0, 0xc00025a540}, {0x14151baa0, 0xc00025a580})
    	D:/a/crush/crush/internal/shell/shell.go:111 +0x139
    github.com/charmbracelet/crush/internal/shell.(*BackgroundShellManager).Start.func1()
    	D:/a/crush/crush/internal/shell/background.go:122 +0x15f
    created by github.com/charmbracelet/crush/internal/shell.(*BackgroundShellManager).Start in goroutine 28
    	D:/a/crush/crush/internal/shell/background.go:119 +0x72a

Andrey Nering created

0b618f4 fix: ensure all providers are shown unless `disable_default_providers` is set (#2197)

Andrey Nering created

f22ec5f chore: auto-update files

Charm created

5b2a0bf fix(grep): do not go outside cwd, add timeout (#2188)

Click to expand commit body
* fix(grep): do not go outside cwd, add timeout

Signed-off-by: Carlos Alexandro Becker <caarlos0@users.noreply.github.com>

* fix: timeout config

Signed-off-by: Carlos Alexandro Becker <caarlos0@users.noreply.github.com>

---------

Signed-off-by: Carlos Alexandro Becker <caarlos0@users.noreply.github.com>

Carlos Alexandro Becker created

9940e83 chore(deps): update catwalk to v0.18.0 (#2198)

Andrey Nering created

d320f12 Merge pull request #2191 from charmbracelet/charm-1152-sessions-dialog-is-too-big

Click to expand commit body
fix(ui): adjust sessions dialog size

Ayman Bagabas created

8a6f25f chore(taskfile): run binary with extension on windows

Andrey Nering created

f87d95b fix(ui): correctly position cursor when attachments are present (#2190)

Click to expand commit body
This change fixes a UI issue where the cursor is off by one line when
attachments are present in the editor.

Ayman Bagabas created

361a318 fix(ui): ensure the min size accounts for the dialog border

Ayman Bagabas created

8eb4dc0 chore(taskfile): add `-v` to `go build`

Andrey Nering created

7f3d7c7 refactor: use csync.Map for regex caches (#2187)

Click to expand commit body
* refactor: use csync.Map for regex caches

Signed-off-by: Carlos Alexandro Becker <caarlos0@users.noreply.github.com>

* fix: lint

Signed-off-by: Carlos Alexandro Becker <caarlos0@users.noreply.github.com>

* ci: golangci-lint 2.9

Signed-off-by: Carlos Alexandro Becker <caarlos0@users.noreply.github.com>

---------

Signed-off-by: Carlos Alexandro Becker <caarlos0@users.noreply.github.com>

Carlos Alexandro Becker created

0ed5806 ci: golangci-lint 2.9 (#2193)

Click to expand commit body
Signed-off-by: Carlos Alexandro Becker <caarlos0@users.noreply.github.com>

Carlos Alexandro Becker created

155fc61 fix(ui): dialogs: loop around and scroll list when navigating with up/down keys

Ayman Bagabas created

4f3b056 fix(ui): truncate dialog titles with ellipsis

Ayman Bagabas created

5c29ad2 docs(ui): comment typo

Ayman Bagabas created

9917b22 fix(ui): adjust sessions dialog size

Click to expand commit body
Use a more reasonable size for the sessions dialog.

Ayman Bagabas created

d1032ba fix: respect disable_default_providers (#2177)

Click to expand commit body
* fix: respect disable_default_providers

closes #1949

Signed-off-by: Carlos Alexandro Becker <caarlos0@users.noreply.github.com>

* fix: use x/slice

Signed-off-by: Carlos Alexandro Becker <caarlos0@users.noreply.github.com>

* fix: fail if no providers

Signed-off-by: Carlos Alexandro Becker <caarlos0@users.noreply.github.com>

* test: fix

Signed-off-by: Carlos Alexandro Becker <caarlos0@users.noreply.github.com>

---------

Signed-off-by: Carlos Alexandro Becker <caarlos0@users.noreply.github.com>

Carlos Alexandro Becker created

47ca98d fix(config): correct Task agent ID in SetupAgents (#2101)

M1xA created

22ed1e5 fix: clear regex cache on new session to prevent unbounded growth (#2161)

M1xA created

d6643a6 fix(lsp): files outside cwd (#2180)

Click to expand commit body
closes #1401

Signed-off-by: Carlos Alexandro Becker <caarlos0@users.noreply.github.com>

Carlos Alexandro Becker created

48157c6 fix(sqlite): increase busy timeout (#2181)

Click to expand commit body
Also refactor so we have the same pragmas on both drivers.

I couldn't reproduce OP's issue, but they're likely trying to use many
Crush instances at the same time, which may cause this.

The timeout was 5s only, so it was kind of easy to hit under load, I
presume. Upping it to 30s should improve that. AFAIK there's no much
else we can do.

See https://www.sqlite.org/rescode.html#busy

Closes #2129

Signed-off-by: Carlos Alexandro Becker <caarlos0@users.noreply.github.com>

Carlos Alexandro Becker created

09cea77 chore: auto-update files

Charm created

82b7aec chore: add `omitempty` back as `omitzero`

Andrey Nering created

7a83144 chore: update `AGENTS.md`, mention `x/ansi` package

Andrey Nering created

d329ad5 chore(taskfile): add `run:onboarding` to test onboarding flow

Andrey Nering created

5e23ecd chore: run `modernize`

Andrey Nering created

29800c4 chore(taskfile): add `modernize` task

Andrey Nering created

9e4f8e0 chore(taskfile): add `run:catwalk` task to run with local catwalk

Andrey Nering created

f962087 chore(taskfile): avoid compiling when not needed

Andrey Nering created