@@ -195,12 +195,73 @@ local function set_winbar(winid, text)
195195 vim .api .nvim_set_option_value (" winbar" , winbar_text , { win = winid })
196196end
197197
198+ --- Resolves the buffer name from config, supporting string or function values
199+ --- @param window_name string Window name for Config.windows[name].buffer_name lookup
200+ --- @param header_parts agentic.ui.ChatWidget.HeaderParts Header parts passed to function-type buffer_name
201+ --- @param fallback string | nil Fallback name (resolved header text ) when buffer_name is not set
202+ --- @return string | nil name
203+ local function resolve_buffer_name (window_name , header_parts , fallback )
204+ local win_cfg = Config .windows [window_name ]
205+ local buffer_name = win_cfg and win_cfg .buffer_name
206+
207+ if buffer_name == nil then
208+ return fallback
209+ end
210+
211+ if type (buffer_name ) == " string" then
212+ return buffer_name
213+ end
214+
215+ if type (buffer_name ) == " function" then
216+ local ok , result = pcall (buffer_name , header_parts )
217+ if not ok then
218+ Logger .notify (
219+ string.format (
220+ " Error in buffer_name function for '%s': %s" ,
221+ window_name ,
222+ result
223+ )
224+ )
225+ return fallback
226+ end
227+ if result ~= nil and type (result ) ~= " string" then
228+ Logger .notify (
229+ string.format (
230+ " buffer_name function for '%s' must return string|nil, got %s" ,
231+ window_name ,
232+ type (result )
233+ )
234+ )
235+ return fallback
236+ end
237+ return result
238+ end
239+
240+ Logger .notify (
241+ string.format (
242+ " buffer_name for '%s' must be string|function|nil, got %s" ,
243+ window_name ,
244+ type (buffer_name )
245+ )
246+ )
247+ return fallback
248+ end
249+
198250--- Sets the buffer name based on header text and tab count
199251--- @param bufnr integer Buffer number
200252--- @param header_text string | nil Resolved header text
201253--- @param tab_page_id integer Tab page ID for suffix
202- local function set_buffer_name (bufnr , header_text , tab_page_id )
203- if not header_text or header_text == " " then
254+ --- @param window_name string Window name for Config.windows[name].buffer_name lookup
255+ --- @param header_parts agentic.ui.ChatWidget.HeaderParts Header parts for function-type buffer_name
256+ local function set_buffer_name (
257+ bufnr ,
258+ header_text ,
259+ tab_page_id ,
260+ window_name ,
261+ header_parts
262+ )
263+ local name = resolve_buffer_name (window_name , header_parts , header_text )
264+ if not name or name == " " then
204265 return
205266 end
206267
@@ -210,9 +271,9 @@ local function set_buffer_name(bufnr, header_text, tab_page_id)
210271 --- @type string | nil
211272 local buf_name
212273 if total_tabs > 1 then
213- buf_name = string.format (" %s (Tab %d)" , header_text , tab_page_id )
274+ buf_name = string.format (" %s (Tab %d)" , name , tab_page_id )
214275 else
215- buf_name = header_text
276+ buf_name = name
216277 end
217278
218279 vim .api .nvim_buf_set_name (bufnr , buf_name )
@@ -263,7 +324,13 @@ function WindowDecoration.render_header(bufnr, window_name, context)
263324 local text = (header_text and header_text ~= " " ) and header_text or " "
264325
265326 set_winbar (winid , text )
266- set_buffer_name (bufnr , header_text , tab_page_id )
327+ set_buffer_name (
328+ bufnr ,
329+ header_text ,
330+ tab_page_id ,
331+ window_name ,
332+ dynamic_header
333+ )
267334 end )
268335end
269336
0 commit comments