Show provider list with keys and default models in /provider

ober

fde5e0aa7655bec0c5723bafc27926fb318d3355

diff --git a/src/jcode/ui/tui.ss b/src/jcode/ui/tui.ss
index 22dccd4..2f4ca88 100644
--- a/src/jcode/ui/tui.ss
+++ b/src/jcode/ui/tui.ss
@@ -421,11 +421,28 @@
          (add-message! state
            (msg-block-system (format "Provider: ~a (model: ~a)" p (current-model-override))))))
       ((equal? cmd "provider")
-       (add-message! state
-         (msg-block-system
-           (format "Provider: ~a\nModel: ~a"
-             (or (current-provider-override) (config-provider))
-             (or (current-model-override) (config-model))))))
+       (let* ((cur-p (or (current-provider-override) (config-provider)))
+              (cur-m (or (current-model-override) (config-model)))
+              (all '(("anthropic"  . "claude-sonnet-4-20250514")
+                     ("openrouter" . "anthropic/claude-sonnet-4")
+                     ("openai"     . "gpt-4o")
+                     ("deepseek"   . "deepseek-chat")
+                     ("google"     . "gemini-2.0-flash")
+                     ("ollama"     . "llama3.2")))
+              (lines (map (lambda (p)
+                            (let ((name (car p))
+                                  (model (cdr p)))
+                              (format "  ~a ~a  ~a  [~a]"
+                                (if (equal? name cur-p) "●" " ")
+                                name model
+                                (if (config-get-provider-key name) "key" "no key"))))
+                          all)))
+         (add-message! state
+           (msg-block-system
+             (string-append
+               (format "Current: ~a / ~a\n\nAvailable providers:\n" cur-p cur-m)
+               (string-join lines "\n")
+               "\n\nUse: /provider <name>")))))
       ((equal? cmd "theme")
        (cycle-theme!)
        (add-message! state (msg-block-system "Theme cycled.")))