on main help sign in
chore: change the layout package location
commit168fb7d1d86e1ab4210e28a3ab8929c414eedc29 authorKujtim Hoxha <kujtimii.h@gmail.com> dateMon 16 Jun 2025, 10:32 (1 year ago) parent4770d19
34 files changed+70−103
internal/tui/components/chat/chat.go+1−1 internal/tui/components/chat/editor/editor.go−8 internal/tui/components/chat/editor/keys.go+1−1 internal/tui/components/chat/messages/messages.go+1−1 internal/tui/components/chat/messages/tool.go+1−1 internal/tui/components/chat/sidebar/sidebar.go+1−1 internal/tui/components/completions/item.go+1−1 internal/tui/components/completions/keys.go+1−1 internal/tui/layout/container.go → internal/tui/components/core/layout/container.go+6−6 internal/tui/layout/layout.go → internal/tui/components/core/layout/layout.go+2−6 internal/tui/layout/split.go → internal/tui/components/core/layout/split.go+10−11 internal/tui/components/core/list/keys.go+1−1 internal/tui/components/core/list/list.go+1−1 internal/tui/components/core/status/keys.go+1−1 internal/tui/components/dialogs/commands/item.go+1−1 internal/tui/components/dialogs/commands/keys.go+1−1 internal/tui/components/dialogs/compact/keys.go+1−1 internal/tui/components/dialogs/filepicker/keys.go+1−1 internal/tui/components/dialogs/init/keys.go+1−1 internal/tui/components/dialogs/keys.go+1−1 internal/tui/components/dialogs/models/keys.go+1−1 internal/tui/components/dialogs/permissions/keys.go+1−1 internal/tui/components/dialogs/quit/keys.go+1−1 internal/tui/components/dialogs/quit/quit.go−6 internal/tui/components/dialogs/sessions/keys.go+1−1 internal/tui/components/logs/details.go+1−7 internal/tui/components/logs/table.go+1−7 internal/tui/keys.go+1−1 internal/tui/page/chat/chat.go+1−1 internal/tui/page/chat/keys.go+1−1 internal/tui/page/logs/keys.go+1−1 internal/tui/page/logs/logs.go+1−1 internal/tui/tui.go+1−1 todos.md+24−26
internal/tui/components/chat/chat.go+1−1
@@ -12,7 +12,7 @@ import (
1212 "github.com/charmbracelet/crush/internal/session"
1313 "github.com/charmbracelet/crush/internal/tui/components/chat/messages"
1414 "github.com/charmbracelet/crush/internal/tui/components/core/list"
15− "github.com/charmbracelet/crush/internal/tui/layout"
15+ "github.com/charmbracelet/crush/internal/tui/components/core/layout"
1616 "github.com/charmbracelet/crush/internal/tui/util"
1717 "github.com/charmbracelet/lipgloss/v2"
1818)
internal/tui/components/chat/editor/editor.go−8
@@ -21,7 +21,6 @@ import (
2121 "github.com/charmbracelet/crush/internal/tui/components/dialogs"
2222 "github.com/charmbracelet/crush/internal/tui/components/dialogs/filepicker"
2323 "github.com/charmbracelet/crush/internal/tui/components/dialogs/quit"
24− "github.com/charmbracelet/crush/internal/tui/layout"
2524 "github.com/charmbracelet/crush/internal/tui/styles"
2625 "github.com/charmbracelet/crush/internal/tui/util"
2726 "github.com/charmbracelet/lipgloss/v2"
@@ -327,13 +326,6 @@ func (m *editorCmp) attachmentsContent() string {
327326 return content
328327}
329328
330−func (m *editorCmp) BindingKeys() []key.Binding {
331− bindings := []key.Binding{}
332− bindings = append(bindings, layout.KeyMapToSlice(m.keyMap)...)
333− bindings = append(bindings, layout.KeyMapToSlice(DeleteKeyMaps)...)
334− return bindings
335−}
336−
337329func (m *editorCmp) SetPosition(x, y int) tea.Cmd {
338330 m.x = x
339331 m.y = y
internal/tui/components/chat/editor/keys.go+1−1
@@ -2,7 +2,7 @@ package editor
22
33import (
44 "github.com/charmbracelet/bubbles/v2/key"
5− "github.com/charmbracelet/crush/internal/tui/layout"
5+ "github.com/charmbracelet/crush/internal/tui/components/core/layout"
66)
77
88type EditorKeyMap struct {
internal/tui/components/chat/messages/messages.go+1−1
@@ -14,7 +14,7 @@ import (
1414 "github.com/charmbracelet/crush/internal/message"
1515 "github.com/charmbracelet/crush/internal/tui/components/anim"
1616 "github.com/charmbracelet/crush/internal/tui/components/core"
17− "github.com/charmbracelet/crush/internal/tui/layout"
17+ "github.com/charmbracelet/crush/internal/tui/components/core/layout"
1818 "github.com/charmbracelet/crush/internal/tui/styles"
1919 "github.com/charmbracelet/crush/internal/tui/util"
2020)
internal/tui/components/chat/messages/tool.go+1−1
@@ -7,7 +7,7 @@ import (
77 tea "github.com/charmbracelet/bubbletea/v2"
88 "github.com/charmbracelet/crush/internal/message"
99 "github.com/charmbracelet/crush/internal/tui/components/anim"
10− "github.com/charmbracelet/crush/internal/tui/layout"
10+ "github.com/charmbracelet/crush/internal/tui/components/core/layout"
1111 "github.com/charmbracelet/crush/internal/tui/styles"
1212 "github.com/charmbracelet/crush/internal/tui/util"
1313 "github.com/charmbracelet/lipgloss/v2"
internal/tui/components/chat/sidebar/sidebar.go+1−1
@@ -11,7 +11,7 @@ import (
1111 "github.com/charmbracelet/crush/internal/tui/components/chat"
1212 "github.com/charmbracelet/crush/internal/tui/components/core"
1313 "github.com/charmbracelet/crush/internal/tui/components/logo"
14− "github.com/charmbracelet/crush/internal/tui/layout"
14+ "github.com/charmbracelet/crush/internal/tui/components/core/layout"
1515 "github.com/charmbracelet/crush/internal/tui/styles"
1616 "github.com/charmbracelet/crush/internal/tui/util"
1717 "github.com/charmbracelet/crush/internal/version"
internal/tui/components/completions/item.go+1−1
@@ -5,7 +5,7 @@ import (
55
66 tea "github.com/charmbracelet/bubbletea/v2"
77 "github.com/charmbracelet/crush/internal/tui/components/core/list"
8− "github.com/charmbracelet/crush/internal/tui/layout"
8+ "github.com/charmbracelet/crush/internal/tui/components/core/layout"
99 "github.com/charmbracelet/crush/internal/tui/styles"
1010 "github.com/charmbracelet/crush/internal/tui/util"
1111 "github.com/charmbracelet/lipgloss/v2"
internal/tui/components/completions/keys.go+1−1
@@ -2,7 +2,7 @@ package completions
22
33import (
44 "github.com/charmbracelet/bubbles/v2/key"
5− "github.com/charmbracelet/crush/internal/tui/layout"
5+ "github.com/charmbracelet/crush/internal/tui/components/core/layout"
66)
77
88type KeyMap struct {
internal/tui/layout/container.go → internal/tui/components/core/layout/container.gorenamed+6−6
@@ -1,7 +1,7 @@
11package layout
22
33import (
4− "github.com/charmbracelet/bubbles/v2/key"
4+ "github.com/charmbracelet/bubbles/v2/help"
55 tea "github.com/charmbracelet/bubbletea/v2"
66 "github.com/charmbracelet/crush/internal/tui/styles"
77 "github.com/charmbracelet/crush/internal/tui/util"
@@ -11,7 +11,7 @@ import (
1111type Container interface {
1212 util.Model
1313 Sizeable
14− Bindings
14+ Help
1515 Positionable
1616 Focusable
1717}
@@ -157,11 +157,11 @@ func (c *container) SetPosition(x, y int) tea.Cmd {
157157 return nil
158158}
159159
160−func (c *container) BindingKeys() []key.Binding {
161− if b, ok := c.content.(Bindings); ok {
162− return b.BindingKeys()
160+func (c *container) Help() help.KeyMap {
161+ if b, ok := c.content.(Help); ok {
162+ return b.Help()
163163 }
164− return []key.Binding{}
164+ return nil
165165}
166166
167167// Blur implements Container.
internal/tui/layout/layout.go → internal/tui/components/core/layout/layout.gorenamed+2−6
@@ -19,18 +19,14 @@ type Sizeable interface {
1919 GetSize() (int, int)
2020}
2121
22−type Bindings interface {
23− BindingKeys() []key.Binding
22+type Help interface {
23+ Help() help.KeyMap
2424}
2525
2626type Positionable interface {
2727 SetPosition(x, y int) tea.Cmd
2828}
2929
30−type Help interface {
31− Help() help.KeyMap
32−}
33−
3430func KeyMapToSlice(t any) (bindings []key.Binding) {
3531 typ := reflect.TypeOf(t)
3632 if typ.Kind() != reflect.Struct {
internal/tui/layout/split.go → internal/tui/components/core/layout/split.gorenamed+10−11
@@ -1,7 +1,7 @@
11package layout
22
33import (
4− "github.com/charmbracelet/bubbles/v2/key"
4+ "github.com/charmbracelet/bubbles/v2/help"
55 tea "github.com/charmbracelet/bubbletea/v2"
66 "github.com/charmbracelet/crush/internal/tui/styles"
77 "github.com/charmbracelet/crush/internal/tui/util"
@@ -19,7 +19,7 @@ const (
1919type SplitPaneLayout interface {
2020 util.Model
2121 Sizeable
22− Bindings
22+ Help
2323 SetLeftPanel(panel Container) tea.Cmd
2424 SetRightPanel(panel Container) tea.Cmd
2525 SetBottomPanel(panel Container) tea.Cmd
@@ -269,24 +269,23 @@ func (s *splitPaneLayout) ClearBottomPanel() tea.Cmd {
269269 return nil
270270}
271271
272−func (s *splitPaneLayout) BindingKeys() []key.Binding {
273− keys := []key.Binding{}
272+func (s *splitPaneLayout) Help() help.KeyMap {
274273 if s.leftPanel != nil {
275− if b, ok := s.leftPanel.(Bindings); ok {
276− keys = append(keys, b.BindingKeys()...)
274+ if b, ok := s.leftPanel.(Help); ok && s.leftPanel.IsFocused() {
275+ return b.Help()
277276 }
278277 }
279278 if s.rightPanel != nil {
280− if b, ok := s.rightPanel.(Bindings); ok {
281− keys = append(keys, b.BindingKeys()...)
279+ if b, ok := s.rightPanel.(Help); ok && s.rightPanel.IsFocused() {
280+ return b.Help()
282281 }
283282 }
284283 if s.bottomPanel != nil {
285− if b, ok := s.bottomPanel.(Bindings); ok {
286− keys = append(keys, b.BindingKeys()...)
284+ if b, ok := s.bottomPanel.(Help); ok && s.bottomPanel.IsFocused() {
285+ return b.Help()
287286 }
288287 }
289− return keys
288+ return nil
290289}
291290
292291func (s *splitPaneLayout) FocusPanel(panel LayoutPanel) tea.Cmd {
internal/tui/components/core/list/keys.go+1−1
@@ -2,7 +2,7 @@ package list
22
33import (
44 "github.com/charmbracelet/bubbles/v2/key"
5− "github.com/charmbracelet/crush/internal/tui/layout"
5+ "github.com/charmbracelet/crush/internal/tui/components/core/layout"
66)
77
88type KeyMap struct {
internal/tui/components/core/list/list.go+1−1
@@ -11,7 +11,7 @@ import (
1111 "github.com/charmbracelet/bubbles/v2/textinput"
1212 tea "github.com/charmbracelet/bubbletea/v2"
1313 "github.com/charmbracelet/crush/internal/tui/components/anim"
14− "github.com/charmbracelet/crush/internal/tui/layout"
14+ "github.com/charmbracelet/crush/internal/tui/components/core/layout"
1515 "github.com/charmbracelet/crush/internal/tui/styles"
1616 "github.com/charmbracelet/crush/internal/tui/util"
1717 "github.com/charmbracelet/lipgloss/v2"
internal/tui/components/core/status/keys.go+1−1
@@ -2,7 +2,7 @@ package status
22
33import (
44 "github.com/charmbracelet/bubbles/v2/key"
5− "github.com/charmbracelet/crush/internal/tui/layout"
5+ "github.com/charmbracelet/crush/internal/tui/components/core/layout"
66)
77
88type KeyMap struct {
internal/tui/components/dialogs/commands/item.go+1−1
@@ -4,7 +4,7 @@ import (
44 tea "github.com/charmbracelet/bubbletea/v2"
55 "github.com/charmbracelet/crush/internal/tui/components/core"
66 "github.com/charmbracelet/crush/internal/tui/components/core/list"
7− "github.com/charmbracelet/crush/internal/tui/layout"
7+ "github.com/charmbracelet/crush/internal/tui/components/core/layout"
88 "github.com/charmbracelet/crush/internal/tui/styles"
99 "github.com/charmbracelet/crush/internal/tui/util"
1010 "github.com/charmbracelet/x/ansi"
internal/tui/components/dialogs/commands/keys.go+1−1
@@ -2,7 +2,7 @@ package commands
22
33import (
44 "github.com/charmbracelet/bubbles/v2/key"
5− "github.com/charmbracelet/crush/internal/tui/layout"
5+ "github.com/charmbracelet/crush/internal/tui/components/core/layout"
66)
77
88type CommandsDialogKeyMap struct {
internal/tui/components/dialogs/compact/keys.go+1−1
@@ -2,7 +2,7 @@ package compact
22
33import (
44 "github.com/charmbracelet/bubbles/v2/key"
5− "github.com/charmbracelet/crush/internal/tui/layout"
5+ "github.com/charmbracelet/crush/internal/tui/components/core/layout"
66)
77
88// KeyMap defines the key bindings for the compact dialog.
internal/tui/components/dialogs/filepicker/keys.go+1−1
@@ -2,7 +2,7 @@ package filepicker
22
33import (
44 "github.com/charmbracelet/bubbles/v2/key"
5− "github.com/charmbracelet/crush/internal/tui/layout"
5+ "github.com/charmbracelet/crush/internal/tui/components/core/layout"
66)
77
88// KeyMap defines keyboard bindings for dialog management.
internal/tui/components/dialogs/init/keys.go+1−1
@@ -2,7 +2,7 @@ package init
22
33import (
44 "github.com/charmbracelet/bubbles/v2/key"
5− "github.com/charmbracelet/crush/internal/tui/layout"
5+ "github.com/charmbracelet/crush/internal/tui/components/core/layout"
66)
77
88type KeyMap struct {
internal/tui/components/dialogs/keys.go+1−1
@@ -2,7 +2,7 @@ package dialogs
22
33import (
44 "github.com/charmbracelet/bubbles/v2/key"
5− "github.com/charmbracelet/crush/internal/tui/layout"
5+ "github.com/charmbracelet/crush/internal/tui/components/core/layout"
66)
77
88// KeyMap defines keyboard bindings for dialog management.
internal/tui/components/dialogs/models/keys.go+1−1
@@ -2,7 +2,7 @@ package models
22
33import (
44 "github.com/charmbracelet/bubbles/v2/key"
5− "github.com/charmbracelet/crush/internal/tui/layout"
5+ "github.com/charmbracelet/crush/internal/tui/components/core/layout"
66)
77
88type KeyMap struct {
internal/tui/components/dialogs/permissions/keys.go+1−1
@@ -2,7 +2,7 @@ package permissions
22
33import (
44 "github.com/charmbracelet/bubbles/v2/key"
5− "github.com/charmbracelet/crush/internal/tui/layout"
5+ "github.com/charmbracelet/crush/internal/tui/components/core/layout"
66)
77
88type KeyMap struct {
internal/tui/components/dialogs/quit/keys.go+1−1
@@ -2,7 +2,7 @@ package quit
22
33import (
44 "github.com/charmbracelet/bubbles/v2/key"
5− "github.com/charmbracelet/crush/internal/tui/layout"
5+ "github.com/charmbracelet/crush/internal/tui/components/core/layout"
66)
77
88// KeyMap defines the keyboard bindings for the quit dialog.
internal/tui/components/dialogs/quit/quit.go−6
@@ -4,7 +4,6 @@ import (
44 "github.com/charmbracelet/bubbles/v2/key"
55 tea "github.com/charmbracelet/bubbletea/v2"
66 "github.com/charmbracelet/crush/internal/tui/components/dialogs"
7− "github.com/charmbracelet/crush/internal/tui/layout"
87 "github.com/charmbracelet/crush/internal/tui/styles"
98 "github.com/charmbracelet/crush/internal/tui/util"
109 "github.com/charmbracelet/lipgloss/v2"
@@ -18,7 +17,6 @@ const (
1817// QuitDialog represents a confirmation dialog for quitting the application.
1918type QuitDialog interface {
2019 dialogs.DialogModel
21− layout.Bindings
2220}
2321
2422type quitDialogCmp struct {
@@ -107,10 +105,6 @@ func (q *quitDialogCmp) View() tea.View {
107105 )
108106}
109107
110−func (q *quitDialogCmp) BindingKeys() []key.Binding {
111− return layout.KeyMapToSlice(q.keymap)
112−}
113−
114108func (q *quitDialogCmp) Position() (int, int) {
115109 row := q.wHeight / 2
116110 row -= 7 / 2
internal/tui/components/dialogs/sessions/keys.go+1−1
@@ -2,7 +2,7 @@ package sessions
22
33import (
44 "github.com/charmbracelet/bubbles/v2/key"
5− "github.com/charmbracelet/crush/internal/tui/layout"
5+ "github.com/charmbracelet/crush/internal/tui/components/core/layout"
66)
77
88type KeyMap struct {
internal/tui/components/logs/details.go+1−7
@@ -5,11 +5,10 @@ import (
55 "strings"
66 "time"
77
8− "github.com/charmbracelet/bubbles/v2/key"
98 "github.com/charmbracelet/bubbles/v2/viewport"
109 tea "github.com/charmbracelet/bubbletea/v2"
1110 "github.com/charmbracelet/crush/internal/logging"
12− "github.com/charmbracelet/crush/internal/tui/layout"
11+ "github.com/charmbracelet/crush/internal/tui/components/core/layout"
1312 "github.com/charmbracelet/crush/internal/tui/styles"
1413 "github.com/charmbracelet/crush/internal/tui/util"
1514 "github.com/charmbracelet/lipgloss/v2"
@@ -18,7 +17,6 @@ import (
1817type DetailComponent interface {
1918 util.Model
2019 layout.Sizeable
21− layout.Bindings
2220}
2321
2422type detailCmp struct {
@@ -172,10 +170,6 @@ func (i *detailCmp) SetSize(width int, height int) tea.Cmd {
172170 return nil
173171}
174172
175−func (i *detailCmp) BindingKeys() []key.Binding {
176− return layout.KeyMapToSlice(i.viewport.KeyMap)
177−}
178−
179173func NewLogsDetails() DetailComponent {
180174 return &detailCmp{
181175 viewport: viewport.New(),
internal/tui/components/logs/table.go+1−7
@@ -5,12 +5,11 @@ import (
55 "slices"
66 "strings"
77
8− "github.com/charmbracelet/bubbles/v2/key"
98 "github.com/charmbracelet/bubbles/v2/table"
109 tea "github.com/charmbracelet/bubbletea/v2"
1110 "github.com/charmbracelet/crush/internal/logging"
1211 "github.com/charmbracelet/crush/internal/pubsub"
13− "github.com/charmbracelet/crush/internal/tui/layout"
12+ "github.com/charmbracelet/crush/internal/tui/components/core/layout"
1413 "github.com/charmbracelet/crush/internal/tui/styles"
1514 "github.com/charmbracelet/crush/internal/tui/util"
1615 "github.com/charmbracelet/lipgloss/v2"
@@ -19,7 +18,6 @@ import (
1918type TableComponent interface {
2019 util.Model
2120 layout.Sizeable
22− layout.Bindings
2321}
2422
2523type tableCmp struct {
@@ -136,10 +134,6 @@ func (i *tableCmp) SetSize(width int, height int) tea.Cmd {
136134 return nil
137135}
138136
139−func (i *tableCmp) BindingKeys() []key.Binding {
140− return layout.KeyMapToSlice(i.table.KeyMap)
141−}
142−
143137func (i *tableCmp) setRows() {
144138 rows := []table.Row{}
145139
internal/tui/keys.go+1−1
@@ -2,7 +2,7 @@ package tui
22
33import (
44 "github.com/charmbracelet/bubbles/v2/key"
5− "github.com/charmbracelet/crush/internal/tui/layout"
5+ "github.com/charmbracelet/crush/internal/tui/components/core/layout"
66)
77
88type KeyMap struct {
internal/tui/page/chat/chat.go+1−1
@@ -14,7 +14,7 @@ import (
1414 "github.com/charmbracelet/crush/internal/tui/components/chat/editor"
1515 "github.com/charmbracelet/crush/internal/tui/components/chat/sidebar"
1616 "github.com/charmbracelet/crush/internal/tui/components/dialogs/commands"
17− "github.com/charmbracelet/crush/internal/tui/layout"
17+ "github.com/charmbracelet/crush/internal/tui/components/core/layout"
1818 "github.com/charmbracelet/crush/internal/tui/page"
1919 "github.com/charmbracelet/crush/internal/tui/util"
2020)
internal/tui/page/chat/keys.go+1−1
@@ -2,7 +2,7 @@ package chat
22
33import (
44 "github.com/charmbracelet/bubbles/v2/key"
5− "github.com/charmbracelet/crush/internal/tui/layout"
5+ "github.com/charmbracelet/crush/internal/tui/components/core/layout"
66)
77
88type KeyMap struct {
internal/tui/page/logs/keys.go+1−1
@@ -2,7 +2,7 @@ package logs
22
33import (
44 "github.com/charmbracelet/bubbles/v2/key"
5− "github.com/charmbracelet/crush/internal/tui/layout"
5+ "github.com/charmbracelet/crush/internal/tui/components/core/layout"
66)
77
88type KeyMap struct {
internal/tui/page/logs/logs.go+1−1
@@ -5,7 +5,7 @@ import (
55 tea "github.com/charmbracelet/bubbletea/v2"
66 "github.com/charmbracelet/crush/internal/tui/components/core"
77 logsComponents "github.com/charmbracelet/crush/internal/tui/components/logs"
8− "github.com/charmbracelet/crush/internal/tui/layout"
8+ "github.com/charmbracelet/crush/internal/tui/components/core/layout"
99 "github.com/charmbracelet/crush/internal/tui/page"
1010 "github.com/charmbracelet/crush/internal/tui/page/chat"
1111 "github.com/charmbracelet/crush/internal/tui/styles"
internal/tui/tui.go+1−1
@@ -24,7 +24,7 @@ import (
2424 "github.com/charmbracelet/crush/internal/tui/components/dialogs/permissions"
2525 "github.com/charmbracelet/crush/internal/tui/components/dialogs/quit"
2626 "github.com/charmbracelet/crush/internal/tui/components/dialogs/sessions"
27− "github.com/charmbracelet/crush/internal/tui/layout"
27+ "github.com/charmbracelet/crush/internal/tui/components/core/layout"
2828 "github.com/charmbracelet/crush/internal/tui/page"
2929 "github.com/charmbracelet/crush/internal/tui/page/chat"
3030 "github.com/charmbracelet/crush/internal/tui/page/logs"
todos.md+24−26
@@ -1,29 +1,27 @@
1−# Chat Page
2−
3−## Landing page
4−
5−- [x] Implement the logo landing page
6−- [x] Add cwd improved
7−- [x] Implement Active LSPs
8−- [x] Implement Active MCPs
9−
10−## Dialogs
11−
12−- [x] Cleanup Commands
13−- [x] Sessions dialog
14−- [x] Models
15−- [x] Move sessions and model dialog to the commands
16−- [x] Add sessions shortuct
17−- [ ] Add all posible actions to the commands
18−
19−## Investigate
1+## TODOs before release
202
3+- [~] Implement help
4+ - [ ] Show full help
5+ - [ ] Make help dependent on the focused pane and page
216- [ ] Events when tool error
22−- [ ] Fancy Spinner
23−
24−## Messages
25−
267- [ ] Fix issue with numbers (padding)
27−- [ ] Run tools in parallel and add the responses in parallel
28−- [ ] Handle parallel permission calls
29−- [ ] Weird behavior sometimes the message does not update
8+- [ ] Fancy Spinner
9+- [ ] Add all possible actions to the commands
10+- [ ] Parallel tool calls and permissions
11+ - [ ] Run the tools in parallel and add results in parallel
12+ - [ ] Show multiple permissions dialogs
13+- [ ] Investigate messages issues
14+ - [ ] Weird behavior sometimes the message does not update
15+ - [ ] Message length (I saw the message go beyond the correct length when there are errors)
16+ - [ ] Address UX issues
17+- [ ] Implement current model in the sidebar
18+- [ ] Implement changed files
19+- [ ] Implement responsive mode
20+- [ ] Revisit the core list component
21+ - [ ] This component has become super complex we might need to fix this.
22+- [ ] General cleanup and documentation
23+- [ ] Update the readme
24+
25+## Maybe
26+
27+- [ ] Revisit the provider/model/configs