diff --git a/lib/bds/desktop/shell_live/tab_helpers.ex b/lib/bds/desktop/shell_live/tab_helpers.ex index 510304d..5b36ce4 100644 --- a/lib/bds/desktop/shell_live/tab_helpers.ex +++ b/lib/bds/desktop/shell_live/tab_helpers.ex @@ -2,7 +2,7 @@ defmodule BDS.Desktop.ShellLive.TabHelpers do @moduledoc false alias BDS.Desktop.ShellData - alias BDS.{BoundedAtoms, Media, Posts} + alias BDS.{AI, BoundedAtoms, Media, Posts} alias BDS.Media.Media, as: MediaRecord alias BDS.Posts.Post alias BDS.UI.Registry @@ -21,10 +21,12 @@ defmodule BDS.Desktop.ShellLive.TabHelpers do def tab_subtitle(tab, tab_meta) do case Map.get(tab_meta, {tab.type, tab.id}) do %{subtitle: subtitle} when is_binary(subtitle) and subtitle != "" -> subtitle - _other -> "Desktop workbench content routed through the Elixir shell." + _other -> default_tab_subtitle(tab) end end + def default_tab_title(%{type: :chat, id: conversation_id}), do: chat_title(conversation_id) + def default_tab_title(%{type: type, id: id}) do case Registry.editor_route(type) do %{singleton: true} -> ShellData.route_label(type) @@ -32,6 +34,9 @@ defmodule BDS.Desktop.ShellLive.TabHelpers do end end + defp default_tab_subtitle(%{type: :chat}), do: translated("AI conversations") + defp default_tab_subtitle(_tab), do: "Desktop workbench content routed through the Elixir shell." + def tab_route_label(nil), do: translated("Dashboard") def tab_route_label(%{type: type}), do: ShellData.route_label(type) @@ -88,6 +93,14 @@ defmodule BDS.Desktop.ShellLive.TabHelpers do end end + def chat_title(conversation_id) do + case AI.get_chat_conversation(conversation_id) do + %{title: title} when is_binary(title) and title != "" -> title + %{id: id} when is_binary(id) and id != "" -> id + _other -> "Chat" + end + end + def parse_integer(value) when is_integer(value), do: value def parse_integer(value) do diff --git a/test/bds/desktop/shell_live_test.exs b/test/bds/desktop/shell_live_test.exs index deb981e..4ca71c7 100644 --- a/test/bds/desktop/shell_live_test.exs +++ b/test/bds/desktop/shell_live_test.exs @@ -707,6 +707,27 @@ defmodule BDS.Desktop.ShellLiveTest do assert html =~ ~s(class="tab active transient") end + test "workbench session restore rehydrates chat tab titles from stored conversations" do + assert {:ok, conversation} = AI.start_chat(%{title: "Editorial Plan"}) + + {:ok, view, _html} = live_isolated(build_conn(), BDS.Desktop.ShellLive) + + session_payload = + Workbench.new() + |> Workbench.open_tab(:chat, conversation.id, :pin) + |> Session.serialize() + + _html = render_hook(view, "restore_workbench_session", %{"session" => session_payload}) + + assert has_element?( + view, + ".tab[data-tab-type='chat'][data-tab-id='#{conversation.id}'] .tab-title", + "Editorial Plan" + ) + + assert has_element?(view, ".chat-panel-title-main", "Editorial Plan") + end + test "metadata diff refresh reruns after workbench session restore", %{project: project} do :ok = BDS.Tasks.clear_finished()