Skip to content

feat: add avatar support, fix thinking animation auth, restore GatewayTabs#288

Closed
356252190-star wants to merge 2 commits into
EKKOLearnAI:mainfrom
356252190-star:feat/avatar-custom-animation-gatewaytabs
Closed

feat: add avatar support, fix thinking animation auth, restore GatewayTabs#288
356252190-star wants to merge 2 commits into
EKKOLearnAI:mainfrom
356252190-star:feat/avatar-custom-animation-gatewaytabs

Conversation

@356252190-star
Copy link
Copy Markdown
Contributor

Summary

Add custom avatar support for user and AI assistant, fix thinking animation upload auth, and restore GatewayTabs profile selector.

Changes

New files

  • ImageCropDialog.vue — Square crop dialog with zoom/pan slider
  • GatewayTabs.vue — Tab-style profile selector (2 per row grid)
  • controllers/avatar.ts — Avatar upload/serve/delete/status API
  • routes/avatar.ts — Public GET + protected POST/DELETE routes

Modified files

  • ChatInput.vue — User avatar upload via click on user icon
  • MessageItem.vue — AI avatar upload via click on assistant icon, round avatar CSS
  • MessageList.vue — Load custom thinking animation on mount, replace default video
  • ThinkingAnimationPicker.vue — Add auth headers to upload/reset (fix 401)
  • AppSidebar.vue — Replace ProfileSelector with GatewayTabs
  • chat.ts store — Avatar state management + upload helpers
  • ChatView.vue — Load avatars on mount
  • routes/index.ts — Mount avatar routes
  • gateway-manager.ts — Move remote host check before resolvePort
  • i18n: avatar + gatewayTabs keys in all 8 languages

Features

  • Animated avatars (GIF/APNG) skip crop dialog, upload directly
  • 5MB max file size, PNG/JPG/GIF/WebP
  • Profile-namespaced storage
  • Avatars persist across sessions and page reloads
  • Path traversal protection

Security

  • GET routes are public (needed for <img src>)
  • POST (upload) and DELETE routes require authentication

* feat: add thinking-animation controller

* feat: add thinking-animation routes

* feat: mount thinking-animation routes

* feat: add ThinkingAnimationPicker component

* feat: integrate ThinkingAnimationPicker into DisplaySettings

* feat: add thinking animation i18n keys (en)

* feat: add thinking animation i18n keys (zh)

* feat: add thinking animation i18n keys (ja)

* feat: add thinking animation i18n keys (ko)

* feat: add thinking animation i18n keys (de)

* feat: add thinking animation i18n keys (fr)

* feat: add thinking animation i18n keys (es)

* feat: add thinking animation i18n keys (pt)
xinke666 pushed a commit to xinke666/hermes-web-ui that referenced this pull request May 23, 2026
…r & ignore noise

Combines two community contributions and one local correction:

* PR EKKOLearnAI#289 (Sanjays2402): probe /api/sessions on the dashboard URL
  (default :9119) instead of the agent URL (:8642). The agent does not
  serve /api/sessions, which produced a 404 every 15s. Adds a small
  cache so success/failure responses don't refetch every poll. Closes EKKOLearnAI#276.

* PR EKKOLearnAI#288 (Interstellar-code): send Authorization: Bearer
  $HERMES_API_TOKEN on the connection-status probes so a gateway
  secured with API_SERVER_KEY is detected correctly. Adds watch.ignored
  for .runtime/.tanstack/.omc/.omx/coverage/dist/etc. so these noisy
  internal paths don't fire spurious dev reloads.

* Local correction: did NOT add '**/routeTree.gen.ts' to watch.ignored.
  An existing regression test (src/router-route-resolution.test.ts)
  forbids that — ignoring the generated route tree breaks route HMR.
  The real cause of routeTree.gen.ts thrash is multiple concurrent
  vite dev servers writing to the same file (fixed earlier today).

Co-authored-by: Sanjays2402 <Sanjays2402@users.noreply.github.com>
Co-authored-by: Interstellar-code <Interstellar-code@users.noreply.github.com>
xinke666 pushed a commit to xinke666/hermes-web-ui that referenced this pull request May 23, 2026
…LearnAI#285)

The vite dev server intercepted /api/connection-status with a slim
inline shortcut handler that returned only {ok, mode, backend} \u2014
silently overriding the real route at src/routes/api/connection-status.ts
which returns the full ConnectionStatus payload.

Downstream feature gates (useFeatureCapability, useFeatureAvailable)
read .capabilities from the response. With the slim body, every
capability evaluated to undefined, so dev users got UI states that
looked like 'feature not available' even when the gateway was healthy
and exposing the API.

Fix: drop the inline shortcut entirely. The real route file already
caches via ensureGatewayProbed() (PROBE_TTL_MS), so the cost in dev
is negligible and the payload is correct everywhere.

Closes EKKOLearnAI#285. Also drops the now-unused dashboard URL / token / cache
locals in vite.config.ts that were only used by the deleted handler;
the per-PR work that introduced them (EKKOLearnAI#288, EKKOLearnAI#289) was the
right diagnosis but the wrong fix \u2014 the real route was already
doing it correctly.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants