@@ -22,6 +22,7 @@ import (
2222 "encoding/json"
2323 "os"
2424 "path/filepath"
25+ "strings"
2526
2627 "gopkg.in/yaml.v3"
2728)
@@ -31,6 +32,18 @@ const (
3132 settingsLegacyFileName = "tui-settings.json"
3233)
3334
35+ const (
36+ // Accepted values for tui-settings.yaml "prompt:":
37+ // - host: show "[host]" prefix on sliver-client, "[server]" on server console
38+ // - operator-host: show "[operator@host]" prefix on sliver-client, "[server]" on server console
39+ // - basic: show "sliver >" (no prefix)
40+ // - custom: render full prompt from prompt_template
41+ PromptStyleHost = "host"
42+ PromptStyleOperatorHost = "operator-host"
43+ PromptStyleBasic = "basic"
44+ PromptStyleCustom = "custom"
45+ )
46+
3447// ClientSettings - Client JSON config
3548type ClientSettings struct {
3649 TableStyle string `json:"tables" yaml:"tables"`
@@ -41,6 +54,8 @@ type ClientSettings struct {
4154 VimMode bool `json:"vim_mode" yaml:"vim_mode"`
4255 UserConnect bool `json:"user_connect" yaml:"user_connect"`
4356 ConsoleLogs bool `json:"console_logs" yaml:"console_logs"`
57+ PromptStyle string `json:"prompt" yaml:"prompt"`
58+ PromptTemplate string `json:"prompt_template" yaml:"prompt_template"`
4459}
4560
4661// LoadSettings - Load the client settings from disk
@@ -67,6 +82,8 @@ func LoadSettings() (*ClientSettings, error) {
6782 return defaultSettings (), err
6883 }
6984
85+ // Ensure any missing/unknown values are coerced to a supported prompt style.
86+ settings .PromptStyle = NormalizePromptStyle (settings .PromptStyle )
7087 if err := SaveSettings (settings ); err != nil {
7188 return settings , err
7289 }
@@ -78,6 +95,38 @@ func LoadSettings() (*ClientSettings, error) {
7895 return settings , nil
7996}
8097
98+ // NormalizePromptStyle canonicalizes prompt style strings and returns a safe
99+ // default if the value is empty/unknown.
100+ func NormalizePromptStyle (v string ) string {
101+ switch strings .ToLower (strings .TrimSpace (v )) {
102+ case PromptStyleOperatorHost :
103+ return PromptStyleOperatorHost
104+ case PromptStyleHost :
105+ return PromptStyleHost
106+ case PromptStyleBasic :
107+ return PromptStyleBasic
108+ case PromptStyleCustom :
109+ return PromptStyleCustom
110+
111+ // Backward compatible aliases.
112+ case "show host" :
113+ return PromptStyleHost
114+ case "show user and host" :
115+ return PromptStyleOperatorHost
116+ case "show operator and host" :
117+ return PromptStyleOperatorHost
118+ case "operator@host" :
119+ return PromptStyleOperatorHost
120+ case "user@host" :
121+ return PromptStyleOperatorHost
122+
123+ case "" :
124+ return PromptStyleHost
125+ default :
126+ return PromptStyleHost
127+ }
128+ }
129+
81130func defaultSettings () * ClientSettings {
82131 return & ClientSettings {
83132 TableStyle : "SliverDefault" ,
@@ -87,9 +136,13 @@ func defaultSettings() *ClientSettings {
87136 AlwaysOverflow : false ,
88137 VimMode : false ,
89138 ConsoleLogs : true ,
139+ PromptStyle : PromptStyleHost ,
140+ PromptTemplate : DefaultPromptTemplate ,
90141 }
91142}
92143
144+ const DefaultPromptTemplate = `{{- if .IsServer -}}{{ .Styles.Bold.Render "[server]" }} {{ .Styles.Underline.Render "sliver" }}{{ .Target.Suffix }} > {{- else -}}{{- if .Host -}}{{ .Styles.BoldPrimary.Render (printf "[%s]" .Host) }} {{- end -}}{{ .Styles.Underline.Render "sliver" }}{{ .Target.Suffix }} > {{- end -}}`
145+
93146// SaveSettings - Save the current settings to disk
94147func SaveSettings (settings * ClientSettings ) error {
95148 rootDir , _ := filepath .Abs (GetRootAppDir ())
0 commit comments