From 4b53b52507faef662a8f670b4b80cbe24290de95 Mon Sep 17 00:00:00 2001 From: Craig Jennings Date: Thu, 2 Jul 2026 09:43:55 -0400 Subject: feat(ai-term): paint the agent accent dupre blue Claude Code draws its accent (the bypass-permissions banner, borders, spinner) with xterm-256 palette codes, and the stock rose red is palette index 211. eat resolves those codes through a per-terminal face vector, so agent terminals now point index 211 at the new cj/ai-term-accent face (dupre blue #67809c) at creation. Every other eat terminal keeps the true palette. Per-project colors can later ride the same per-terminal mechanism. --- modules/ai-term-backend-eat.el | 20 ++++++++++++++++++++ modules/ai-term.el | 19 +++++++++++++++++++ 2 files changed, 39 insertions(+) (limited to 'modules') diff --git a/modules/ai-term-backend-eat.el b/modules/ai-term-backend-eat.el index 6d512831..82218ca7 100644 --- a/modules/ai-term-backend-eat.el +++ b/modules/ai-term-backend-eat.el @@ -25,9 +25,12 @@ (require 'ai-term-sessions) (declare-function eat "eat" (&optional program arg)) +(declare-function eat-term-set-parameter "eat" (terminal parameter value)) (declare-function cj/ai-term-next "ai-term" ()) (defvar eat-buffer-name) (defvar eat-semi-char-mode-map) +(defvar eat-terminal) +(defvar cj/ai-term-accent-color-indices) (defun cj/--ai-term-send-string (buffer string) "Send STRING to BUFFER's terminal process (the agent's shell). @@ -36,6 +39,22 @@ Sends to the pty directly so the launch command reaches the shell EAT runs." (when (process-live-p proc) (process-send-string proc string)))) +(defun cj/--ai-term-apply-accent (buffer) + "Point BUFFER's terminal accent palette entries at `cj/ai-term-accent'. +Repaints each index in `cj/ai-term-accent-color-indices' in this +terminal's own 256-color palette (eat keeps one per terminal), so the +agent's accent -- Claude Code's rose banner, borders, spinner -- renders +in the accent face's color while every other eat terminal keeps the true +palette. A no-op when BUFFER has no live eat terminal. Takes effect on +the terminal's next redraw; text already on screen keeps its old color +until the program repaints it (Claude Code's TUI repaints continuously)." + (with-current-buffer buffer + (when (bound-and-true-p eat-terminal) + (dolist (index cj/ai-term-accent-color-indices) + (eat-term-set-parameter eat-terminal + (intern (format "color-%d-face" index)) + 'cj/ai-term-accent))))) + (defun cj/--ai-term-show-or-create (dir name) "Show or create the AI-term buffer for project DIR with buffer NAME. @@ -76,6 +95,7 @@ buffer." (eat))) (let ((buf (get-buffer name))) (with-current-buffer buf + (cj/--ai-term-apply-accent buf) (cj/--ai-term-send-string buf (concat (cj/--ai-term-launch-command dir) "\n"))) (display-buffer buf) diff --git a/modules/ai-term.el b/modules/ai-term.el index 7973f7aa..0774758e 100644 --- a/modules/ai-term.el +++ b/modules/ai-term.el @@ -115,6 +115,25 @@ fallback when `cj/--ai-term-last-size' is nil." :type 'number :group 'ai-term) +(defface cj/ai-term-accent + '((t :foreground "#67809c")) + "Accent color for agent terminals, defaulting to dupre blue. +Claude Code draws its accent (the bypass-permissions banner, borders, +spinner) with xterm-256 palette colors; agent terminals point those +palette entries at this face (see `cj/ai-term-accent-color-indices'), +so the accent renders in this face's foreground instead of the stock +rose red. Per-project colors later land as per-buffer overrides of +the same palette entries." + :group 'ai-term) + +(defvar cj/ai-term-accent-color-indices '(211) + "The xterm-256 palette indices agent terminals repaint with the accent. +211 (#ff87af, a rose pink) is Claude Code's accent as rendered through +the 256-color palette -- confirmed empirically on the bypass-permissions +banner. Add indices here if other accent elements surface in a +different palette slot. Applied per terminal by +`cj/--ai-term-apply-accent'; other eat terminals keep the true palette.") + ;; Agent buffers ("agent []") are buried, not killed, by the ;; kill-all sweep (F1 / `cj/dashboard-only'). Register the family pattern so ;; every agent -- however and whenever created -- survives with its session. -- cgit v1.2.3