Detailed changes
@@ -12,7 +12,7 @@ import (
"github.com/charmbracelet/crush/internal/session"
"github.com/charmbracelet/crush/internal/tui/components/chat/messages"
"github.com/charmbracelet/crush/internal/tui/components/core/list"
- "github.com/charmbracelet/crush/internal/tui/layout"
+ "github.com/charmbracelet/crush/internal/tui/components/core/layout"
"github.com/charmbracelet/crush/internal/tui/util"
"github.com/charmbracelet/lipgloss/v2"
)
@@ -21,7 +21,6 @@ import (
"github.com/charmbracelet/crush/internal/tui/components/dialogs"
"github.com/charmbracelet/crush/internal/tui/components/dialogs/filepicker"
"github.com/charmbracelet/crush/internal/tui/components/dialogs/quit"
- "github.com/charmbracelet/crush/internal/tui/layout"
"github.com/charmbracelet/crush/internal/tui/styles"
"github.com/charmbracelet/crush/internal/tui/util"
"github.com/charmbracelet/lipgloss/v2"
@@ -327,13 +326,6 @@ func (m *editorCmp) attachmentsContent() string {
return content
}
-func (m *editorCmp) BindingKeys() []key.Binding {
- bindings := []key.Binding{}
- bindings = append(bindings, layout.KeyMapToSlice(m.keyMap)...)
- bindings = append(bindings, layout.KeyMapToSlice(DeleteKeyMaps)...)
- return bindings
-}
-
func (m *editorCmp) SetPosition(x, y int) tea.Cmd {
m.x = x
m.y = y
@@ -2,7 +2,7 @@ package editor
import (
"github.com/charmbracelet/bubbles/v2/key"
- "github.com/charmbracelet/crush/internal/tui/layout"
+ "github.com/charmbracelet/crush/internal/tui/components/core/layout"
)
type EditorKeyMap struct {
@@ -14,7 +14,7 @@ import (
"github.com/charmbracelet/crush/internal/message"
"github.com/charmbracelet/crush/internal/tui/components/anim"
"github.com/charmbracelet/crush/internal/tui/components/core"
- "github.com/charmbracelet/crush/internal/tui/layout"
+ "github.com/charmbracelet/crush/internal/tui/components/core/layout"
"github.com/charmbracelet/crush/internal/tui/styles"
"github.com/charmbracelet/crush/internal/tui/util"
)
@@ -7,7 +7,7 @@ import (
tea "github.com/charmbracelet/bubbletea/v2"
"github.com/charmbracelet/crush/internal/message"
"github.com/charmbracelet/crush/internal/tui/components/anim"
- "github.com/charmbracelet/crush/internal/tui/layout"
+ "github.com/charmbracelet/crush/internal/tui/components/core/layout"
"github.com/charmbracelet/crush/internal/tui/styles"
"github.com/charmbracelet/crush/internal/tui/util"
"github.com/charmbracelet/lipgloss/v2"
@@ -11,7 +11,7 @@ import (
"github.com/charmbracelet/crush/internal/tui/components/chat"
"github.com/charmbracelet/crush/internal/tui/components/core"
"github.com/charmbracelet/crush/internal/tui/components/logo"
- "github.com/charmbracelet/crush/internal/tui/layout"
+ "github.com/charmbracelet/crush/internal/tui/components/core/layout"
"github.com/charmbracelet/crush/internal/tui/styles"
"github.com/charmbracelet/crush/internal/tui/util"
"github.com/charmbracelet/crush/internal/version"
@@ -5,7 +5,7 @@ import (
tea "github.com/charmbracelet/bubbletea/v2"
"github.com/charmbracelet/crush/internal/tui/components/core/list"
- "github.com/charmbracelet/crush/internal/tui/layout"
+ "github.com/charmbracelet/crush/internal/tui/components/core/layout"
"github.com/charmbracelet/crush/internal/tui/styles"
"github.com/charmbracelet/crush/internal/tui/util"
"github.com/charmbracelet/lipgloss/v2"
@@ -2,7 +2,7 @@ package completions
import (
"github.com/charmbracelet/bubbles/v2/key"
- "github.com/charmbracelet/crush/internal/tui/layout"
+ "github.com/charmbracelet/crush/internal/tui/components/core/layout"
)
type KeyMap struct {
@@ -1,7 +1,7 @@
package layout
import (
- "github.com/charmbracelet/bubbles/v2/key"
+ "github.com/charmbracelet/bubbles/v2/help"
tea "github.com/charmbracelet/bubbletea/v2"
"github.com/charmbracelet/crush/internal/tui/styles"
"github.com/charmbracelet/crush/internal/tui/util"
@@ -11,7 +11,7 @@ import (
type Container interface {
util.Model
Sizeable
- Bindings
+ Help
Positionable
Focusable
}
@@ -157,11 +157,11 @@ func (c *container) SetPosition(x, y int) tea.Cmd {
return nil
}
-func (c *container) BindingKeys() []key.Binding {
- if b, ok := c.content.(Bindings); ok {
- return b.BindingKeys()
+func (c *container) Help() help.KeyMap {
+ if b, ok := c.content.(Help); ok {
+ return b.Help()
}
- return []key.Binding{}
+ return nil
}
// Blur implements Container.
@@ -19,18 +19,14 @@ type Sizeable interface {
GetSize() (int, int)
}
-type Bindings interface {
- BindingKeys() []key.Binding
+type Help interface {
+ Help() help.KeyMap
}
type Positionable interface {
SetPosition(x, y int) tea.Cmd
}
-type Help interface {
- Help() help.KeyMap
-}
-
func KeyMapToSlice(t any) (bindings []key.Binding) {
typ := reflect.TypeOf(t)
if typ.Kind() != reflect.Struct {
@@ -1,7 +1,7 @@
package layout
import (
- "github.com/charmbracelet/bubbles/v2/key"
+ "github.com/charmbracelet/bubbles/v2/help"
tea "github.com/charmbracelet/bubbletea/v2"
"github.com/charmbracelet/crush/internal/tui/styles"
"github.com/charmbracelet/crush/internal/tui/util"
@@ -19,7 +19,7 @@ const (
type SplitPaneLayout interface {
util.Model
Sizeable
- Bindings
+ Help
SetLeftPanel(panel Container) tea.Cmd
SetRightPanel(panel Container) tea.Cmd
SetBottomPanel(panel Container) tea.Cmd
@@ -269,24 +269,23 @@ func (s *splitPaneLayout) ClearBottomPanel() tea.Cmd {
return nil
}
-func (s *splitPaneLayout) BindingKeys() []key.Binding {
- keys := []key.Binding{}
+func (s *splitPaneLayout) Help() help.KeyMap {
if s.leftPanel != nil {
- if b, ok := s.leftPanel.(Bindings); ok {
- keys = append(keys, b.BindingKeys()...)
+ if b, ok := s.leftPanel.(Help); ok && s.leftPanel.IsFocused() {
+ return b.Help()
}
}
if s.rightPanel != nil {
- if b, ok := s.rightPanel.(Bindings); ok {
- keys = append(keys, b.BindingKeys()...)
+ if b, ok := s.rightPanel.(Help); ok && s.rightPanel.IsFocused() {
+ return b.Help()
}
}
if s.bottomPanel != nil {
- if b, ok := s.bottomPanel.(Bindings); ok {
- keys = append(keys, b.BindingKeys()...)
+ if b, ok := s.bottomPanel.(Help); ok && s.bottomPanel.IsFocused() {
+ return b.Help()
}
}
- return keys
+ return nil
}
func (s *splitPaneLayout) FocusPanel(panel LayoutPanel) tea.Cmd {
@@ -2,7 +2,7 @@ package list
import (
"github.com/charmbracelet/bubbles/v2/key"
- "github.com/charmbracelet/crush/internal/tui/layout"
+ "github.com/charmbracelet/crush/internal/tui/components/core/layout"
)
type KeyMap struct {
@@ -11,7 +11,7 @@ import (
"github.com/charmbracelet/bubbles/v2/textinput"
tea "github.com/charmbracelet/bubbletea/v2"
"github.com/charmbracelet/crush/internal/tui/components/anim"
- "github.com/charmbracelet/crush/internal/tui/layout"
+ "github.com/charmbracelet/crush/internal/tui/components/core/layout"
"github.com/charmbracelet/crush/internal/tui/styles"
"github.com/charmbracelet/crush/internal/tui/util"
"github.com/charmbracelet/lipgloss/v2"
@@ -2,7 +2,7 @@ package status
import (
"github.com/charmbracelet/bubbles/v2/key"
- "github.com/charmbracelet/crush/internal/tui/layout"
+ "github.com/charmbracelet/crush/internal/tui/components/core/layout"
)
type KeyMap struct {
@@ -4,7 +4,7 @@ import (
tea "github.com/charmbracelet/bubbletea/v2"
"github.com/charmbracelet/crush/internal/tui/components/core"
"github.com/charmbracelet/crush/internal/tui/components/core/list"
- "github.com/charmbracelet/crush/internal/tui/layout"
+ "github.com/charmbracelet/crush/internal/tui/components/core/layout"
"github.com/charmbracelet/crush/internal/tui/styles"
"github.com/charmbracelet/crush/internal/tui/util"
"github.com/charmbracelet/x/ansi"
@@ -2,7 +2,7 @@ package commands
import (
"github.com/charmbracelet/bubbles/v2/key"
- "github.com/charmbracelet/crush/internal/tui/layout"
+ "github.com/charmbracelet/crush/internal/tui/components/core/layout"
)
type CommandsDialogKeyMap struct {
@@ -2,7 +2,7 @@ package compact
import (
"github.com/charmbracelet/bubbles/v2/key"
- "github.com/charmbracelet/crush/internal/tui/layout"
+ "github.com/charmbracelet/crush/internal/tui/components/core/layout"
)
// KeyMap defines the key bindings for the compact dialog.
@@ -2,7 +2,7 @@ package filepicker
import (
"github.com/charmbracelet/bubbles/v2/key"
- "github.com/charmbracelet/crush/internal/tui/layout"
+ "github.com/charmbracelet/crush/internal/tui/components/core/layout"
)
// KeyMap defines keyboard bindings for dialog management.
@@ -2,7 +2,7 @@ package init
import (
"github.com/charmbracelet/bubbles/v2/key"
- "github.com/charmbracelet/crush/internal/tui/layout"
+ "github.com/charmbracelet/crush/internal/tui/components/core/layout"
)
type KeyMap struct {
@@ -2,7 +2,7 @@ package dialogs
import (
"github.com/charmbracelet/bubbles/v2/key"
- "github.com/charmbracelet/crush/internal/tui/layout"
+ "github.com/charmbracelet/crush/internal/tui/components/core/layout"
)
// KeyMap defines keyboard bindings for dialog management.
@@ -2,7 +2,7 @@ package models
import (
"github.com/charmbracelet/bubbles/v2/key"
- "github.com/charmbracelet/crush/internal/tui/layout"
+ "github.com/charmbracelet/crush/internal/tui/components/core/layout"
)
type KeyMap struct {
@@ -2,7 +2,7 @@ package permissions
import (
"github.com/charmbracelet/bubbles/v2/key"
- "github.com/charmbracelet/crush/internal/tui/layout"
+ "github.com/charmbracelet/crush/internal/tui/components/core/layout"
)
type KeyMap struct {
@@ -2,7 +2,7 @@ package quit
import (
"github.com/charmbracelet/bubbles/v2/key"
- "github.com/charmbracelet/crush/internal/tui/layout"
+ "github.com/charmbracelet/crush/internal/tui/components/core/layout"
)
// KeyMap defines the keyboard bindings for the quit dialog.
@@ -4,7 +4,6 @@ import (
"github.com/charmbracelet/bubbles/v2/key"
tea "github.com/charmbracelet/bubbletea/v2"
"github.com/charmbracelet/crush/internal/tui/components/dialogs"
- "github.com/charmbracelet/crush/internal/tui/layout"
"github.com/charmbracelet/crush/internal/tui/styles"
"github.com/charmbracelet/crush/internal/tui/util"
"github.com/charmbracelet/lipgloss/v2"
@@ -18,7 +17,6 @@ const (
// QuitDialog represents a confirmation dialog for quitting the application.
type QuitDialog interface {
dialogs.DialogModel
- layout.Bindings
}
type quitDialogCmp struct {
@@ -107,10 +105,6 @@ func (q *quitDialogCmp) View() tea.View {
)
}
-func (q *quitDialogCmp) BindingKeys() []key.Binding {
- return layout.KeyMapToSlice(q.keymap)
-}
-
func (q *quitDialogCmp) Position() (int, int) {
row := q.wHeight / 2
row -= 7 / 2
@@ -2,7 +2,7 @@ package sessions
import (
"github.com/charmbracelet/bubbles/v2/key"
- "github.com/charmbracelet/crush/internal/tui/layout"
+ "github.com/charmbracelet/crush/internal/tui/components/core/layout"
)
type KeyMap struct {
@@ -5,11 +5,10 @@ import (
"strings"
"time"
- "github.com/charmbracelet/bubbles/v2/key"
"github.com/charmbracelet/bubbles/v2/viewport"
tea "github.com/charmbracelet/bubbletea/v2"
"github.com/charmbracelet/crush/internal/logging"
- "github.com/charmbracelet/crush/internal/tui/layout"
+ "github.com/charmbracelet/crush/internal/tui/components/core/layout"
"github.com/charmbracelet/crush/internal/tui/styles"
"github.com/charmbracelet/crush/internal/tui/util"
"github.com/charmbracelet/lipgloss/v2"
@@ -18,7 +17,6 @@ import (
type DetailComponent interface {
util.Model
layout.Sizeable
- layout.Bindings
}
type detailCmp struct {
@@ -172,10 +170,6 @@ func (i *detailCmp) SetSize(width int, height int) tea.Cmd {
return nil
}
-func (i *detailCmp) BindingKeys() []key.Binding {
- return layout.KeyMapToSlice(i.viewport.KeyMap)
-}
-
func NewLogsDetails() DetailComponent {
return &detailCmp{
viewport: viewport.New(),
@@ -5,12 +5,11 @@ import (
"slices"
"strings"
- "github.com/charmbracelet/bubbles/v2/key"
"github.com/charmbracelet/bubbles/v2/table"
tea "github.com/charmbracelet/bubbletea/v2"
"github.com/charmbracelet/crush/internal/logging"
"github.com/charmbracelet/crush/internal/pubsub"
- "github.com/charmbracelet/crush/internal/tui/layout"
+ "github.com/charmbracelet/crush/internal/tui/components/core/layout"
"github.com/charmbracelet/crush/internal/tui/styles"
"github.com/charmbracelet/crush/internal/tui/util"
"github.com/charmbracelet/lipgloss/v2"
@@ -19,7 +18,6 @@ import (
type TableComponent interface {
util.Model
layout.Sizeable
- layout.Bindings
}
type tableCmp struct {
@@ -136,10 +134,6 @@ func (i *tableCmp) SetSize(width int, height int) tea.Cmd {
return nil
}
-func (i *tableCmp) BindingKeys() []key.Binding {
- return layout.KeyMapToSlice(i.table.KeyMap)
-}
-
func (i *tableCmp) setRows() {
rows := []table.Row{}
@@ -2,7 +2,7 @@ package tui
import (
"github.com/charmbracelet/bubbles/v2/key"
- "github.com/charmbracelet/crush/internal/tui/layout"
+ "github.com/charmbracelet/crush/internal/tui/components/core/layout"
)
type KeyMap struct {
@@ -14,7 +14,7 @@ import (
"github.com/charmbracelet/crush/internal/tui/components/chat/editor"
"github.com/charmbracelet/crush/internal/tui/components/chat/sidebar"
"github.com/charmbracelet/crush/internal/tui/components/dialogs/commands"
- "github.com/charmbracelet/crush/internal/tui/layout"
+ "github.com/charmbracelet/crush/internal/tui/components/core/layout"
"github.com/charmbracelet/crush/internal/tui/page"
"github.com/charmbracelet/crush/internal/tui/util"
)
@@ -2,7 +2,7 @@ package chat
import (
"github.com/charmbracelet/bubbles/v2/key"
- "github.com/charmbracelet/crush/internal/tui/layout"
+ "github.com/charmbracelet/crush/internal/tui/components/core/layout"
)
type KeyMap struct {
@@ -2,7 +2,7 @@ package logs
import (
"github.com/charmbracelet/bubbles/v2/key"
- "github.com/charmbracelet/crush/internal/tui/layout"
+ "github.com/charmbracelet/crush/internal/tui/components/core/layout"
)
type KeyMap struct {
@@ -5,7 +5,7 @@ import (
tea "github.com/charmbracelet/bubbletea/v2"
"github.com/charmbracelet/crush/internal/tui/components/core"
logsComponents "github.com/charmbracelet/crush/internal/tui/components/logs"
- "github.com/charmbracelet/crush/internal/tui/layout"
+ "github.com/charmbracelet/crush/internal/tui/components/core/layout"
"github.com/charmbracelet/crush/internal/tui/page"
"github.com/charmbracelet/crush/internal/tui/page/chat"
"github.com/charmbracelet/crush/internal/tui/styles"
@@ -24,7 +24,7 @@ import (
"github.com/charmbracelet/crush/internal/tui/components/dialogs/permissions"
"github.com/charmbracelet/crush/internal/tui/components/dialogs/quit"
"github.com/charmbracelet/crush/internal/tui/components/dialogs/sessions"
- "github.com/charmbracelet/crush/internal/tui/layout"
+ "github.com/charmbracelet/crush/internal/tui/components/core/layout"
"github.com/charmbracelet/crush/internal/tui/page"
"github.com/charmbracelet/crush/internal/tui/page/chat"
"github.com/charmbracelet/crush/internal/tui/page/logs"
@@ -1,29 +1,27 @@
-# Chat Page
-
-## Landing page
-
-- [x] Implement the logo landing page
-- [x] Add cwd improved
-- [x] Implement Active LSPs
-- [x] Implement Active MCPs
-
-## Dialogs
-
-- [x] Cleanup Commands
-- [x] Sessions dialog
-- [x] Models
-- [x] Move sessions and model dialog to the commands
-- [x] Add sessions shortuct
-- [ ] Add all posible actions to the commands
-
-## Investigate
+## TODOs before release
+- [~] Implement help
+ - [ ] Show full help
+ - [ ] Make help dependent on the focused pane and page
- [ ] Events when tool error
-- [ ] Fancy Spinner
-
-## Messages
-
- [ ] Fix issue with numbers (padding)
-- [ ] Run tools in parallel and add the responses in parallel
-- [ ] Handle parallel permission calls
-- [ ] Weird behavior sometimes the message does not update
+- [ ] Fancy Spinner
+- [ ] Add all possible actions to the commands
+- [ ] Parallel tool calls and permissions
+ - [ ] Run the tools in parallel and add results in parallel
+ - [ ] Show multiple permissions dialogs
+- [ ] Investigate messages issues
+ - [ ] Weird behavior sometimes the message does not update
+ - [ ] Message length (I saw the message go beyond the correct length when there are errors)
+ - [ ] Address UX issues
+- [ ] Implement current model in the sidebar
+- [ ] Implement changed files
+- [ ] Implement responsive mode
+- [ ] Revisit the core list component
+ - [ ] This component has become super complex we might need to fix this.
+- [ ] General cleanup and documentation
+- [ ] Update the readme
+
+## Maybe
+
+- [ ] Revisit the provider/model/configs