@@ -372,6 +372,15 @@ func (a App) updateInputPanel(msg tea.Msg, typed tea.KeyMsg, cmds []tea.Cmd) (te
372372 a .resetPasteHeuristics ()
373373
374374 switch strings .ToLower (input ) {
375+ case slashCommandHelp :
376+ if err := a .refreshHelpPicker (); err != nil {
377+ a .state .ExecutionError = err .Error ()
378+ a .state .StatusText = err .Error ()
379+ a .appendActivity ("system" , "Failed to refresh slash help" , err .Error (), true )
380+ return a , tea .Batch (cmds ... )
381+ }
382+ a .openHelpPicker ()
383+ return a , tea .Batch (cmds ... )
375384 case slashCommandProvider :
376385 if err := a .refreshProviderPicker (); err != nil {
377386 a .state .ExecutionError = err .Error ()
@@ -572,6 +581,13 @@ func (a App) updatePicker(msg tea.KeyMsg) (tea.Model, tea.Cmd) {
572581 return a , nil
573582 }
574583 return a , runModelSelection (a .providerSvc , item .id )
584+ case pickerHelp :
585+ item , ok := a .helpPicker .SelectedItem ().(selectionItem )
586+ a .closePicker ()
587+ if ! ok {
588+ return a , nil
589+ }
590+ return a , a .runSlashCommandSelection (item .id )
575591 }
576592 }
577593
@@ -581,6 +597,8 @@ func (a App) updatePicker(msg tea.KeyMsg) (tea.Model, tea.Cmd) {
581597 a .providerPicker , cmd = a .providerPicker .Update (msg )
582598 case pickerModel :
583599 a .modelPicker , cmd = a .modelPicker .Update (msg )
600+ case pickerHelp :
601+ a .helpPicker , cmd = a .helpPicker .Update (msg )
584602 case pickerFile :
585603 a .fileBrowser , cmd = a .fileBrowser .Update (msg )
586604 if didSelect , path := a .fileBrowser .DidSelectFile (msg ); didSelect {
@@ -1455,6 +1473,12 @@ func (a *App) applyComponentLayout(rebuildTranscript bool) {
14551473
14561474 a .providerPicker .SetSize (max (24 , tuiutils .Clamp (lay .rightWidth - 14 , 28 , 52 )), max (4 , tuiutils .Clamp (lay .rightHeight - 10 , 6 , 10 )))
14571475 a .modelPicker .SetSize (max (24 , tuiutils .Clamp (lay .rightWidth - 14 , 28 , 52 )), max (4 , tuiutils .Clamp (lay .rightHeight - 10 , 6 , 10 )))
1476+ helpPickerMaxHeight := max (8 , lay .rightHeight - 6 )
1477+ helpPickerDesiredHeight := (len (a .helpPicker .Items ()) * 3 ) + 1
1478+ a .helpPicker .SetSize (
1479+ max (24 , tuiutils .Clamp (lay .rightWidth - 14 , 28 , 52 )),
1480+ max (6 , tuiutils .Clamp (helpPickerDesiredHeight , 6 , helpPickerMaxHeight )),
1481+ )
14581482 a .fileBrowser .SetHeight (max (6 , tuiutils .Clamp (lay .rightHeight - 8 , 8 , 16 )))
14591483 if rebuildTranscript || prevTranscriptWidth != a .transcript .Width {
14601484 a .rebuildTranscript ()
@@ -1602,6 +1626,55 @@ func (a *App) handleImmediateSlashCommand(input string) (bool, tea.Cmd) {
16021626 }
16031627}
16041628
1629+ // runSlashCommandSelection 根据 /help 弹层选中的命令执行对应 slash 行为。
1630+ func (a * App ) runSlashCommandSelection (command string ) tea.Cmd {
1631+ command = strings .ToLower (strings .TrimSpace (command ))
1632+ if command == "" {
1633+ return nil
1634+ }
1635+
1636+ if handled , cmd := a .handleImmediateSlashCommand (command ); handled {
1637+ return cmd
1638+ }
1639+
1640+ switch command {
1641+ case slashCommandHelp :
1642+ if err := a .refreshHelpPicker (); err != nil {
1643+ a .state .ExecutionError = err .Error ()
1644+ a .state .StatusText = err .Error ()
1645+ a .appendActivity ("system" , "Failed to refresh slash help" , err .Error (), true )
1646+ return nil
1647+ }
1648+ a .openHelpPicker ()
1649+ return nil
1650+ case slashCommandProvider :
1651+ if err := a .refreshProviderPicker (); err != nil {
1652+ a .state .ExecutionError = err .Error ()
1653+ a .state .StatusText = err .Error ()
1654+ a .appendActivity ("system" , "Failed to refresh providers" , err .Error (), true )
1655+ return nil
1656+ }
1657+ a .openProviderPicker ()
1658+ return nil
1659+ case slashCommandModelPick :
1660+ if err := a .refreshModelPicker (); err != nil {
1661+ a .state .ExecutionError = err .Error ()
1662+ a .state .StatusText = err .Error ()
1663+ a .appendActivity ("system" , "Failed to refresh models" , err .Error (), true )
1664+ return nil
1665+ }
1666+ a .openModelPicker ()
1667+ return a .requestModelCatalogRefresh (a .state .CurrentProvider )
1668+ default :
1669+ a .state .StatusText = statusApplyingCommand
1670+ a .state .ExecutionError = ""
1671+ if isWorkspaceSlashCommand (command ) {
1672+ return runSessionWorkdirCommand (a .runtime , a .state .ActiveSessionID , a .state .CurrentWorkdir , command )
1673+ }
1674+ return runLocalCommand (a .configManager , a .providerSvc , a .currentStatusSnapshot (), command )
1675+ }
1676+ }
1677+
16051678func (a App ) currentStatusSnapshot () tuistatus.Snapshot {
16061679 return tuistatus .BuildFromUIState (
16071680 a .state ,
0 commit comments