defmodule ArcanaWeb.MaintenanceLive do @moduledoc """ LiveView for maintenance operations in Arcana. """ use Phoenix.LiveView import ArcanaWeb.DashboardComponents @impl true def mount(_params, session, socket) do repo = get_repo_from_session(session) {:ok, socket |> assign(repo: repo) |> assign( reembed_running: false, reembed_progress: nil, embedding_info: get_embedding_info() ) |> load_data()} end defp load_data(socket) do repo = socket.assigns.repo socket |> assign(stats: load_stats(repo)) end defp get_embedding_info do Arcana.Maintenance.embedding_info() rescue _ -> %{type: :unknown, dimensions: nil} end @impl true def handle_event("reembed", _params, socket) do repo = socket.assigns.repo parent = self() socket = assign(socket, reembed_running: true, reembed_progress: %{current: 0, total: 0}) Task.start(fn -> progress_fn = fn current, total -> send(parent, {:reembed_progress, current, total}) end result = Arcana.Maintenance.reembed(repo, batch_size: 50, progress: progress_fn) send(parent, {:reembed_complete, result}) end) {:noreply, socket} end @impl true def handle_info({:reembed_progress, current, total}, socket) do {:noreply, assign(socket, reembed_progress: %{current: current, total: total})} end def handle_info({:reembed_complete, result}, socket) do socket = case result do {:ok, %{reembedded: count}} -> socket |> assign(reembed_running: false, reembed_progress: nil) |> put_flash(:info, "Re-embedded #{count} chunks successfully!") {:error, reason} -> socket |> assign(reembed_running: false, reembed_progress: nil) |> put_flash(:error, "Re-embedding failed: #{inspect(reason)}") end {:noreply, socket} end @impl true def render(assigns) do ~H""" <.dashboard_layout stats={@stats} current_tab={:maintenance}>

Maintenance

View embedding configuration and re-embed documents if settings change.

Embedding Configuration

<%= @embedding_info.type %>
<%= if @embedding_info[:model] do %>
<%= @embedding_info.model %>
<% end %>
<%= @embedding_info.dimensions || "Unknown" %>

Re-embed All Chunks

Re-embed all chunks using the current embedding configuration. Use this after changing embedding models.

<%= if @reembed_running do %>
Re-embedding... <%= @reembed_progress.current %>/<%= @reembed_progress.total %>
<%= if @reembed_progress.total > 0 do %> <%= round(@reembed_progress.current / @reembed_progress.total * 100) %>% <% end %>
<% else %> <% end %>
""" end end