@@ -39,12 +39,18 @@ var keys = keyMap{
39 key.WithKeys("ctrl+_"),
39 key.WithKeys("ctrl+_"),
40 key.WithHelp("ctrl+?", "toggle help"),
40 key.WithHelp("ctrl+?", "toggle help"),
42 SwitchSession: key.NewBinding(
43 SwitchSession: key.NewBinding(
43 key.WithKeys("ctrl+a"),
44 key.WithKeys("ctrl+a"),
44 key.WithHelp("ctrl+a", "switch session"),
45 key.WithHelp("ctrl+a", "switch session"),
49+var helpEsc = key.NewBinding(
51+ key.WithHelp("?", "toggle help"),
48var returnKey = key.NewBinding(
54var returnKey = key.NewBinding(
49 key.WithKeys("esc"),
55 key.WithKeys("esc"),
50 key.WithHelp("esc", "close"),
56 key.WithHelp("esc", "close"),
@@ -61,7 +67,7 @@ type appModel struct {
61 previousPage page.PageID
67 previousPage page.PageID
62 pages map[page.PageID]tea.Model
68 pages map[page.PageID]tea.Model
63 loadedPages map[page.PageID]bool
69 loadedPages map[page.PageID]bool
64− status tea.Model
70+ status core.StatusCmp
65 app *app.App
71 app *app.App
67 showPermissions bool
73 showPermissions bool
@@ -75,6 +81,8 @@ type appModel struct {
76 showSessionDialog bool
82 showSessionDialog bool
77 sessionDialog dialog.SessionDialog
83 sessionDialog dialog.SessionDialog
80func (a appModel) Init() tea.Cmd {
88func (a appModel) Init() tea.Cmd {
@@ -101,7 +109,8 @@ func (a appModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
101 msg.Height -= 1 // Make space for the status bar
109 msg.Height -= 1 // Make space for the status bar
102 a.width, a.height = msg.Width, msg.Height
110 a.width, a.height = msg.Width, msg.Height
104− a.status, _ = a.status.Update(msg)
112+ s, _ := a.status.Update(msg)
113+ a.status = s.(core.StatusCmp)
105 a.pages[a.currentPage], cmd = a.pages[a.currentPage].Update(msg)
114 a.pages[a.currentPage], cmd = a.pages[a.currentPage].Update(msg)
106 cmds = append(cmds, cmd)
115 cmds = append(cmds, cmd)
@@ -118,45 +127,56 @@ func (a appModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
118 cmds = append(cmds, sessionCmd)
127 cmds = append(cmds, sessionCmd)
120 return a, tea.Batch(cmds...)
129 return a, tea.Batch(cmds...)
121−
130+ case chat.EditorFocusMsg:
131+ a.editingMode = bool(msg)
122 // Status
132 // Status
123 case util.InfoMsg:
133 case util.InfoMsg:
124− a.status, cmd = a.status.Update(msg)
134+ s, cmd := a.status.Update(msg)
135+ a.status = s.(core.StatusCmp)
125 cmds = append(cmds, cmd)
136 cmds = append(cmds, cmd)
126 return a, tea.Batch(cmds...)
137 return a, tea.Batch(cmds...)
127 case pubsub.Event[logging.LogMessage]:
138 case pubsub.Event[logging.LogMessage]:
128 if msg.Payload.Persist {
139 if msg.Payload.Persist {
129 switch msg.Payload.Level {
140 switch msg.Payload.Level {
130 case "error":
141 case "error":
131− a.status, cmd = a.status.Update(util.InfoMsg{
142+ s, cmd := a.status.Update(util.InfoMsg{
132 Type: util.InfoTypeError,
143 Type: util.InfoTypeError,
133 Msg: msg.Payload.Message,
144 Msg: msg.Payload.Message,
134 TTL: msg.Payload.PersistTime,
145 TTL: msg.Payload.PersistTime,
147+ a.status = s.(core.StatusCmp)
148+ cmds = append(cmds, cmd)
136 case "info":
149 case "info":
137− a.status, cmd = a.status.Update(util.InfoMsg{
150+ s, cmd := a.status.Update(util.InfoMsg{
138 Type: util.InfoTypeInfo,
151 Type: util.InfoTypeInfo,
139 Msg: msg.Payload.Message,
152 Msg: msg.Payload.Message,
140 TTL: msg.Payload.PersistTime,
153 TTL: msg.Payload.PersistTime,
155+ a.status = s.(core.StatusCmp)
156+ cmds = append(cmds, cmd)
142 case "warn":
158 case "warn":
143− a.status, cmd = a.status.Update(util.InfoMsg{
159+ s, cmd := a.status.Update(util.InfoMsg{
144 Type: util.InfoTypeWarn,
160 Type: util.InfoTypeWarn,
145 Msg: msg.Payload.Message,
161 Msg: msg.Payload.Message,
146 TTL: msg.Payload.PersistTime,
162 TTL: msg.Payload.PersistTime,
165+ a.status = s.(core.StatusCmp)
166+ cmds = append(cmds, cmd)
150− a.status, cmd = a.status.Update(util.InfoMsg{
168+ s, cmd := a.status.Update(util.InfoMsg{
151 Type: util.InfoTypeInfo,
169 Type: util.InfoTypeInfo,
152 Msg: msg.Payload.Message,
170 Msg: msg.Payload.Message,
153 TTL: msg.Payload.PersistTime,
171 TTL: msg.Payload.PersistTime,
173+ a.status = s.(core.StatusCmp)
174+ cmds = append(cmds, cmd)
156− cmds = append(cmds, cmd)
158 case util.ClearStatusMsg:
177 case util.ClearStatusMsg:
159− a.status, _ = a.status.Update(msg)
178+ s, _ := a.status.Update(msg)
179+ a.status = s.(core.StatusCmp)
161 // Permission
181 // Permission
162 case pubsub.Event[permission.PermissionRequest]:
182 case pubsub.Event[permission.PermissionRequest]:
@@ -243,7 +263,16 @@ func (a appModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
244 a.showHelp = !a.showHelp
264 a.showHelp = !a.showHelp
245 return a, nil
265 return a, nil
266+ case key.Matches(msg, helpEsc):
271+ a.showHelp = !a.showHelp
249 if a.showQuit {
278 if a.showQuit {
@@ -275,7 +304,8 @@ func (a appModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
278− a.status, _ = a.status.Update(msg)
307+ s, _ := a.status.Update(msg)
308+ a.status = s.(core.StatusCmp)
279 a.pages[a.currentPage], cmd = a.pages[a.currentPage].Update(msg)
309 a.pages[a.currentPage], cmd = a.pages[a.currentPage].Update(msg)
280 cmds = append(cmds, cmd)
310 cmds = append(cmds, cmd)
281 return a, tea.Batch(cmds...)
311 return a, tea.Batch(cmds...)
@@ -326,6 +356,12 @@ func (a appModel) View() string {
360+ a.status.SetHelpMsg("ctrl+? help")
362+ a.status.SetHelpMsg("? help")
329 if a.showHelp {
365 if a.showHelp {
330 bindings := layout.KeyMapToSlice(keys)
366 bindings := layout.KeyMapToSlice(keys)
331 if p, ok := a.pages[a.currentPage].(layout.Bindings); ok {
367 if p, ok := a.pages[a.currentPage].(layout.Bindings); ok {
@@ -337,7 +373,9 @@ func (a appModel) View() string {
337 if a.currentPage == page.LogsPage {
373 if a.currentPage == page.LogsPage {
338 bindings = append(bindings, logsKeyReturnKey)
374 bindings = append(bindings, logsKeyReturnKey)
340−
376+ if !a.editingMode {
377+ bindings = append(bindings, helpEsc)
341 a.help.SetBindings(bindings)
379 a.help.SetBindings(bindings)
343 overlay := a.help.View()
381 overlay := a.help.View()
@@ -398,6 +436,7 @@ func New(app *app.App) tea.Model {
398 sessionDialog: dialog.NewSessionDialogCmp(),
436 sessionDialog: dialog.NewSessionDialogCmp(),
399 permissions: dialog.NewPermissionDialogCmp(),
437 permissions: dialog.NewPermissionDialogCmp(),
400 app: app,
438 app: app,
401 pages: map[page.PageID]tea.Model{
440 pages: map[page.PageID]tea.Model{
402 page.ChatPage: page.NewChatPage(app),
441 page.ChatPage: page.NewChatPage(app),
403 page.LogsPage: page.NewLogsPage(),
442 page.LogsPage: page.NewLogsPage(),