DescribeCall surfaces what is being looked up so the spinner reads "Searching knowledge base: \"gateway env vars\"" instead of the static (long) description or the raw JSON envelope — both of which overflow a terminal row and break the spinner's single-line repaint.
(args []string)
| 29 | // (long) description or the raw JSON envelope — both of which overflow a |
| 30 | // terminal row and break the spinner's single-line repaint. |
| 31 | func (p *BuiltinKnowledgePlugin) DescribeCall(args []string) string { |
| 32 | cmd, inner, err := parseKnowledgeInvocation(args) |
| 33 | if err != nil { |
| 34 | return i18n.T("plugins.knowledge.describe_generic") |
| 35 | } |
| 36 | switch cmd { |
| 37 | case "search": |
| 38 | var in struct { |
| 39 | Query string `json:"query"` |
| 40 | } |
| 41 | _ = json.Unmarshal([]byte(inner), &in) |
| 42 | if in.Query == "" { |
| 43 | return i18n.T("plugins.knowledge.describe_generic") |
| 44 | } |
| 45 | return i18n.T("plugins.knowledge.describe_search", describeTrim(in.Query)) |
| 46 | case "get": |
| 47 | var in struct { |
| 48 | Source string `json:"source"` |
| 49 | } |
| 50 | _ = json.Unmarshal([]byte(inner), &in) |
| 51 | if in.Source == "" { |
| 52 | return i18n.T("plugins.knowledge.describe_generic") |
| 53 | } |
| 54 | return i18n.T("plugins.knowledge.describe_get", describeTrim(in.Source)) |
| 55 | case "toc": |
| 56 | return i18n.T("plugins.knowledge.describe_toc") |
| 57 | case "list": |
| 58 | return i18n.T("plugins.knowledge.describe_list") |
| 59 | } |
| 60 | return i18n.T("plugins.knowledge.describe_generic") |
| 61 | } |
| 62 | |
| 63 | // describeTrim bounds one user-supplied value inside a spinner label; |
| 64 | // rune-aware so multibyte queries truncate cleanly. |