250 Commits
Author SHA1 Message Date
Christian Rocha 55205401ad Merge branch 'main' into fast-ui 2026-05-14 15:34:53 -04:00
Ilgaz 8e7451fc1e fix(ui): show custom skills reliably on startup
Resolve race condition by implementing a package-level cache for skill discovery states. Add ~/.agents/skills/ and ~/.claude/skills/ as global skill scan paths.
2026-05-14 14:00:23 -04:00
Christian Rocha 30c16c2094 Merge branch 'main' into fast-ui 2026-05-13 16:28:56 -04:00
Christian RochaandCharm Crush 65f30a1343 perf(chat): skip re-parsing the rendered chat when nothing has changed
Each frame the chat list is turned into a string with ANSI color codes
that we then have to parse back into cells before drawing. When the
chat list output is the same as the previous frame, we now reuse the
cells we already produced and skip the parsing step.

Co-Authored-By: Charm Crush <crush@charm.land>
2026-05-12 16:41:14 -04:00
Christian RochaandCharm Crush 6b101f3860 perf(chat): skip re-rendering chat list items that have not changed
The chat list now remembers what each item rendered last frame and
reuses it when nothing about that item has changed. Once a message
turn is fully done, its rendered output is reused verbatim on every
subsequent frame for as long as it stays unchanged. Resizing the
window, focusing or selecting an item, dragging a selection over it,
toggling a thinking block, and any other state change still triggers
a fresh render. The visible output is identical to before; the work
to produce it is much less.

Co-Authored-By: Charm Crush <crush@charm.land>
2026-05-12 16:09:15 -04:00
Christian Rocha 295a62dc38 fix(ui): calculation bug that would cause modified files to wrap 2026-05-12 16:00:52 -04:00
Christian RochaandCharm Crush 43b986c8c0 perf(chat): show only the tail of long reasoning blocks when expanded
When a reasoning block is expanded, show only the most recent few hundred
lines by default with a hint that more lines are hidden, instead of
rendering the entire thing. Clicking again shows the full block.
This keeps the UI responsive when models produce very long reasoning.

Co-Authored-By: Charm Crush <crush@charm.land>
2026-05-12 12:22:44 -04:00
Kieran Klukas bf5dd26e59 fix(paste): normalize windows newlines 2026-05-11 17:04:13 -04:00
Christian RochaandCrush d7d25cf89f 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>
2026-05-09 20:15:44 -04:00
Kieran Klukas b90bcc3f2f fix(ui): allow oauth modals to consume enter 2026-05-08 10:58:06 -04:00
huaiyuWangh a924ca1cb6 fix(tui): show initialization mark errors in status footer (#2825) 2026-05-08 10:56:50 -03:00
Ilgaz 0e039d0051 fix(ui): prevent duplicate custom skills from rendering 2026-05-05 20:33:08 -04:00
Kieran Klukas 3d95ca948e bug: yollo mode via flag doesn't activate prompt 2026-05-05 13:18:25 -04:00
Christian Rocha 1ed6f5248c 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).
2026-05-04 16:57:06 -04:00
Christian Rocha 19197e3086 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.
2026-05-04 16:57:06 -04:00
Christian Rocha ce314b8e0d feat(ui): add hypercredit readout to small top header 2026-05-01 12:18:40 -04:00
Christian Rocha d5b5a9e1cc chore(ui): hypercrush small type treatment 2026-05-01 12:18:40 -04:00
Andrey Nering 6ce4fbceec feat(hyper): show remaining hypercredits in the sidebar (#2766) 2026-04-30 18:52:16 -03:00
Christian Rocha 09a112040f fix(ui): notification width and text truncation
Prior to this fix, notifications in the footer would not span the width
of the window, and text truncation would often happen prematurely.
2026-04-28 10:07:00 -04:00
Christian Rocha 64c47cbbb3 fix(ui): restore 'update available' notification 2026-04-27 23:52:35 -04:00
Christian Rocha 2be2024840 fix(hyper): re-auth at selection time to ensure provider availability 2026-04-27 17:00:43 -04:00
Christian Rocha a4488ca06a feat(ui): switch to hyper theme when provider hyper is chosen 2026-04-27 17:00:43 -04:00
Christian Rocha 9d4653e8c9 chore(styles): use hypercrush theme when hyper is selected 2026-04-27 17:00:43 -04:00
Christian Rocha 755f6fae6f chore(ui): theme prep 2026-04-26 11:19:19 -04:00
Christian Rocha dc003bf728 feat: PreToolUse hook (#2598) 2026-04-26 09:24:36 -04:00
Christian Rocha a7546adcdc chore(tests): regression test for (lack of) disabled skills in the ui 2026-04-25 15:56:25 -04:00
Bruno Krugel 7a6149df39 fix(ui): don't show disabled skills 2026-04-25 15:56:25 -04:00
Christian Rocha 81daa26681 fix(styles): use semantic names in styles + drop deadcode 2026-04-24 09:15:35 -04:00
Christian Rocha 511916ab37 fix(ui): logo and grad arguments from earlier refactor 2026-04-24 09:14:52 -04:00
Andrey Nering 2f32c9bc5e feat: enable progress bar on iterm2 (#2641) 2026-04-17 18:52:14 +00:00
huaiyuWangh b37649e452 feat(ui): add skills discovery status to sidebar and landing page (#2384)
- Display loaded/errored skills in sidebar and landing page
- Use pubsub event to carry skill states directly to UI, avoiding
  global mutable state
- Subscribe to skills discovery events via broker, consistent with
  MCP/LSP patterns
- Rename State to DiscoveryState for clarity
2026-04-16 17:40:02 -03:00
Andrey Nering e8f5e2025d feat: show progress bar on rio terminal (#2624) 2026-04-16 17:29:28 -03:00
Ayman Bagabas 40b7cdd466 fix(ui): format code in ui.go 2026-04-13 12:59:18 -04:00
Ayman Bagabas 4a1298ecd1 chore: bump bubbletea and ultraviolet to v2.03 and 73592393e1ad and fix
related layout issues
2026-04-13 11:14:30 -04:00
Chris Chen 85445d7f50 fix(ui): subscribe to app.LSPEvent instead of workspace.LSPEvent (#2565)
Fix LSP UI display broken in v0.55.0. The UI was still subscribing
to workspace.LSPEvent after the event type was moved to the app
package, causing LSP status to never update in the UI.

Changes:
- internal/ui/model/ui.go: Subscribe to app.LSPEvent; use app.GetLSPStates()
- internal/ui/model/lsp.go: Use app.LSPClientInfo type for LSPInfo embedding
  and sorting (fields are identical to workspace.LSPClientInfo)

Fixes charmbracelet/crush#2560
2026-04-08 17:17:42 +00:00
Andrey Nering 59943a82e2 feat: open Hyper auth dialog automatically on unauthorized error
When Hyper returns a 401, publish a TypeReAuthenticate notification so the
UI opens the OAuth dialog. Also fix coordinator.isUnauthorized to recognize
hyper.ErrUnauthorized for auto-refresh.

💘 Generated with Crush

Assisted-by: Z.ai: GLM 5.1 via Crush <crush@charm.land>
2026-04-07 17:21:29 -03:00
Andrey Nering 1b7a457f27 chore: add custom error and message for hyper unauthorized (#2577) 2026-04-07 17:00:32 -03:00
Ayman Bagabas 2182fc469c fix: update UI tests to use test workspace 2026-04-01 14:04:21 -04:00
Ayman Bagabas f3fe760043 Merge branch 'main' into server-client-2 2026-04-01 13:53:57 -04:00
huaiyuWangh f416931307 fix: conditionally show image keybindings based on model support (#2522) 2026-03-31 16:24:33 -03:00
iceymoss 4501438f81 fix(ui): always clean up external editor temp file (#2503) 2026-03-27 18:16:29 +00:00
Christian Rocha a81a652178 feat(ui): variable height prompt input field (#2468) 2026-03-26 19:24:04 +00:00
huaiyuWangh 697fad9548 fix: complete file picker dialog action (#2483)
- Add DialogID field to file picker command in commands.go
- Add FilePickerID case handler in openDialog function
- Remove TODO comment and complete implementation
2026-03-25 11:09:23 -03:00
faelis 96f51ca5cf fix(tui): remove duplicate ctrl+g help binding in FullHelp (#2465) 2026-03-23 20:41:11 +00:00
Andrey Nering 0c6fb42a03 fix: improve long text detection to account for long text in a single line (#2442) 2026-03-23 17:19:36 -03:00
Ayman Bagabas 7bb3a7ba97 refactor: simplify LSP diagnostic counts retrieval 2026-03-22 11:58:59 +03:00
Ayman Bagabas a35a2bdc2c Merge branch 'main' into server-client-2 2026-03-22 11:17:12 +03:00
Christian Rocha 600310508e fix(ui/docker): don't block ui when checking for docker desktop 2026-03-19 17:41:16 -03:00
Christian Rocha 351e5620f7 fix(mcp/docker): only write config after docker startup succeeds 2026-03-19 17:41:16 -03:00
e0dcaba820 feat: docker mcp integration (#2026)
Co-authored-by: Andrey Nering <andreynering@users.noreply.github.com>
Co-authored-by: Christian Rocha <christian@rocha.is>
2026-03-19 14:59:19 +00:00