feat: hitting ctrl+e opens API key model with existing key pre-filled

tauraamui created

Change summary

internal/tui/components/dialogs/models/keys.go   |  2 
internal/tui/components/dialogs/models/models.go | 46 ++++++++++-------
2 files changed, 29 insertions(+), 19 deletions(-)

Detailed changes

internal/tui/components/dialogs/models/keys.go 🔗

@@ -61,6 +61,7 @@ func (k KeyMap) KeyBindings() []key.Binding {
 		k.Select,
 		k.Next,
 		k.Previous,
+		k.Edit,
 		k.Tab,
 		k.Close,
 	}
@@ -150,6 +151,7 @@ func (k KeyMap) ShortHelp() []key.Binding {
 			key.WithHelp("↑↓", "choose"),
 		),
 		k.Tab,
+		k.Edit,
 		k.Select,
 		k.Close,
 	}

internal/tui/components/dialogs/models/models.go 🔗

@@ -274,27 +274,35 @@ func (m *modelDialogCmp) Update(msg tea.Msg) (util.Model, tea.Cmd) {
 				m.modelList.SetInputPlaceholder(largeModelInputPlaceholder)
 				return m, m.modelList.SetModelType(LargeModelType)
 			}
-		case key.Matches(msg, m.keyMap.Close):
-			if m.showClaudeAuthMethodChooser {
-				m.claudeAuthMethodChooser.SetDefaults()
-				m.showClaudeAuthMethodChooser = false
-				m.keyMap.isClaudeAuthChoiseHelp = false
-				m.keyMap.isClaudeOAuthHelp = false
-				return m, nil
-			}
-			if m.needsAPIKey {
-				if m.isAPIKeyValid {
-					return m, nil
+		case key.Matches(msg, m.keyMap.Edit):
+			// Only handle edit key in the main model selection view
+			if !m.showClaudeAuthMethodChooser && !m.showClaudeOAuth2 && !m.needsAPIKey {
+				selectedItem := m.modelList.SelectedModel()
+				if selectedItem != nil {
+					// Check if provider is configured
+					if m.isProviderConfigured(string(selectedItem.Provider.ID)) {
+						// Trigger API key editing flow
+						m.keyMap.isClaudeAuthChoiseHelp = false
+						m.keyMap.isClaudeOAuthHelp = false
+						m.keyMap.isAPIKeyHelp = true
+						m.showClaudeAuthMethodChooser = false
+						m.needsAPIKey = true
+						m.selectedModel = selectedItem
+						m.selectedModelType = config.SelectedModelTypeLarge
+						if m.modelList.GetModelType() == SmallModelType {
+							m.selectedModelType = config.SelectedModelTypeSmall
+						}
+						m.apiKeyInput.SetProviderName(selectedItem.Provider.Name)
+						// Pre-fill with existing API key if available
+						if providerConfig, ok := config.Get().Providers.Get(string(selectedItem.Provider.ID)); ok && providerConfig.APIKey != "" {
+							m.apiKeyInput.input.SetValue(providerConfig.APIKey)
+						}
+						return m, nil
+					}
 				}
-				// Go back to model selection
-				m.needsAPIKey = false
-				m.selectedModel = nil
-				m.isAPIKeyValid = false
-				m.apiKeyValue = ""
-				m.apiKeyInput.Reset()
-				return m, nil
 			}
-			return m, util.CmdHandler(dialogs.CloseDialogMsg{})
+			return m, nil
+		case key.Matches(msg, m.keyMap.Close):
 		default:
 			if m.showClaudeAuthMethodChooser {
 				u, cmd := m.claudeAuthMethodChooser.Update(msg)