From bfdc156bd696604b9156cb9c413ac5733d39f099 Mon Sep 17 00:00:00 2001 From: Sudhir Verma <9924513+sudhirverma@users.noreply.github.com> Date: Tue, 4 Aug 2026 23:40:56 +0530 Subject: [PATCH 1/4] fix(daemon): correct dashboard modal button placement and spacing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Address UX review findings (design review doc, AAP-80841/ANSTRAT-2262): - Separate Cancel from the primary action in all 3 modals so a mis-click can't fire Save/Apply. - Add an X close button to the Add/Edit Provider wizard modal. - Engine picker is single-select — clicking a tile now advances directly instead of requiring a redundant Next click. - Replace the dual-list's shared middle Add/Remove column with per-row Add/Remove/Configure actions. - Remove the duplicate 'Back to Models tab' button (dead code path) and fix the mislabeled footer button when Configure Model is opened from the Models tab. - Change input focus color from brand red to blue so a focused field is never mistaken for a validation error. - Mark the one required field (Provider Name) and label Base URL optional. PF6 migration and branding are explicitly out of scope per team decision (dashboard is intentionally RHDS + Alpine; native UI config will move to the Portal). --- packages/daemon/static/index.html | 154 ++++++++++++++---------------- 1 file changed, 72 insertions(+), 82 deletions(-) diff --git a/packages/daemon/static/index.html b/packages/daemon/static/index.html index 345ef67..b7074ae 100644 --- a/packages/daemon/static/index.html +++ b/packages/daemon/static/index.html @@ -128,7 +128,8 @@ font-family: 'Red Hat Text', sans-serif; border: 1px solid #d2d2d2; border-radius: 3px; background: #fff; } - input:focus, select:focus, textarea:focus { outline: none; border-color: #ee0000; box-shadow: 0 0 0 1px #ee0000; } + /* Focus uses blue, not the brand/error red, so a focused field is never mistaken for a validation error. */ + input:focus, select:focus, textarea:focus { outline: none; border-color: #06c; box-shadow: 0 0 0 1px #06c; } /* Modal */ .modal-backdrop { @@ -153,6 +154,8 @@ border-top: 1px solid #d2d2d2; display: flex; justify-content: flex-end; gap: var(--rh-space-sm); align-items: center; } + /* Keeps Cancel/dismiss clearly separated from the primary action so a mis-click can't fire it. */ + .footer-dismiss { margin-right: auto; } /* Step indicators */ .step-indicators { display: flex; gap: 8px; align-items: center; } @@ -177,8 +180,9 @@ .engine-tile .tile-name { font-weight: 600; font-size: 0.9rem; margin-bottom: 2px; } .engine-tile .tile-hint { font-size: 0.75rem; color: #6a6e73; } - /* Dual list model selector */ - .dual-list { display: grid; grid-template-columns: 1fr auto 1fr; gap: var(--rh-space-sm); min-height: 350px; } + /* Dual list model selector — each row carries its own Add/Remove/Configure action + (no shared middle column) so the action is right where the user is looking. */ + .dual-list { display: grid; grid-template-columns: 1fr 1fr; gap: var(--rh-space-sm); min-height: 350px; } .dual-list-panel { border: 1px solid #d2d2d2; border-radius: 3px; overflow-y: auto; max-height: 400px; } @@ -187,16 +191,12 @@ color: #6a6e73; position: sticky; top: 0; z-index: 1; border-bottom: 1px solid #d2d2d2; } - .dual-list-actions { - display: flex; flex-direction: column; justify-content: center; gap: var(--rh-space-sm); - } .model-item { display: flex; align-items: center; gap: 8px; - padding: 8px 12px; border-bottom: 1px solid #f0f0f0; cursor: pointer; + padding: 8px 12px; border-bottom: 1px solid #f0f0f0; font-size: 0.85rem; } .model-item:hover { background: #f8f8f8; } - .model-item.selected { background: #e7f1fa; } .model-item .model-name { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } /* Inline param editor */ @@ -896,14 +896,17 @@
Choose an engine (API implementation) for your new provider instance.
+Choose an engine (API implementation) for your new provider instance. Selecting one advances automatically — this is a single choice, not a multi-select.
* Required
@@ -979,37 +984,34 @@+ Everything below is optional — leave a field blank to fall back to the policy or engine default. + Nothing here is written to disk until you click Save. +
- MCP servers provide tools to the LLM. Configure them in ~/.config/abbenay/config.yaml under mcp_servers.
+ MCP servers provide tools to the LLM. They are unrelated to Providers/Models (which are LLM inference backends) —
+ MCP servers register tools the LLM can call, independent of which model answers.
Tools invoked via Abbenay's /mcp endpoint use the same approval policy as chat.
Dynamic stdio registration requires an allowlisted binary and your approval before any process is spawned.
No MCP servers configured.
-Add servers to your config under mcp_servers:
Click "Add MCP Server" above, or add an entry directly under mcp_servers: in ~/.config/abbenay/config.yaml.
+ Tools are functions the LLM can call during a chat — e.g. reading a file, running a search, or querying an API. + They are registered by MCP servers (see the MCP Servers tab) or by editors like VS Code that connect + to Abbenay. Each tool's approval policy below controls whether it runs automatically, asks you first, or is disabled. +
@@ -857,7 +862,19 @@
No tools registered. Connect VS Code or configure MCP servers to see tools.
No tools registered yet
++ Tools show up here once something registers them with Abbenay. You have two options: +
+