Skip to content

feat: server-side ui_meta on profiles.list/configure - #85440

Merged
teknium1 merged 2 commits into
mainfrom
feat/profile-ui-meta
Aug 13, 2026
Merged

feat: server-side ui_meta on profiles.list/configure#85440
teknium1 merged 2 commits into
mainfrom
feat/profile-ui-meta

Conversation

@teknium1

Copy link
Copy Markdown
Contributor

What

Adds server-side, client-agnostic UI metadata to the profiles ws surface (follow-up to #85216).

Problem: roster/team UIs built on profiles.* (e.g. the Hermes-Bot-Mode plugin) have per-profile presentation state — avatar geometry, accent color, display title, attached pet — with nowhere server-side to keep it. Client-side plugin storage means a second machine connecting to the same gateway paints a different roster.

  • profiles.configure accepts ui_meta: dict — merged key-wise into a ui_meta block in the profile's existing profile.yaml (same file as description, same atomic_yaml_write). A top-level key set to null deletes it. Consumers are expected to namespace under their own key (ui_meta["hermes-bots"] = {...}).
  • profiles.list returns the block as ui_meta per row (omitted when empty), so a roster paints in one call.
  • Size cap 64KB on the incoming dict: this rides every roster paint, so raw base64 image blobs are rejected — store big assets elsewhere and reference them.

No new files, no new config keys, no schema migration: profiles without the block behave exactly as before, and read_profile_meta's description contract is untouched.

Verification

Against the real registry on a live named profile: configure wrote ui_meta (applied: {ui_meta: true}); profiles.list returned it verbatim; a second configure merged (namespace replaced, other keys preserved); a 70KB payload was rejected (applied: {ui_meta: false}) leaving the file untouched; description/description_auto survived all writes (profile.yaml keys: description, description_auto, ui_meta).

Consumer: Hermes-Bot-Mode stores avatar/pet selections server-side so every client machine sees the same bots.

Roster UIs built on profiles.* have per-profile presentation state
(avatar, accent color, display title, pet) with nowhere server-side to
live — client plugin storage paints a different roster on every
machine. profiles.configure now accepts ui_meta (merged key-wise into
profile.yaml's ui_meta block via the existing atomic_yaml_write path,
null deletes a key, 64KB cap since it rides every roster paint) and
profiles.list returns the block per row. Consumers namespace under
their own key. No new files or config; profiles without the block are
unchanged.
@github-actions

github-actions Bot commented Aug 13, 2026

Copy link
Copy Markdown
Contributor

૮ >ﻌ< ა ci review

ran on 198a45f — test: stop primary-runtime-restore tests probing live endpoi

⚠️ Warnings

OSV vulnerability scan · View job

5 known vulnerabilities found in pinned dependencies.

How to fix:

Review the findings in the Security tab. Update the affected dependencies if a patched version is available.


debug info

CI timings

CI timings · View report · View job

Wall time 3m10s vs 7m20s (-56.8%). 13 job(s) slower, 10 faster, 1 unchanged.

  • Python tests / Run tests slice 3/12: -23.0s
  • Python tests / Generate slices: -22.0s
  • Python tests / Run tests slice 7/12: -19.0s
  • Python tests / Run tests slice 11/12: -19.0s
  • Python tests / Run tests slice 6/12: +14.0s

_make_agent left the compressor's lazy context-length resolution
unmocked; for reachable base_urls (the nous portal test) the endpoint's
32K answer for the empty test model trips agent_init's 64K floor and
fails the suite on network behavior. Pin get_model_context_length in
the fixture.
@alt-glitch alt-glitch added type/feature New feature or request P4 Best-effort: we will get to it when we get to it (no commitment) comp/tui Terminal UI (ui-tui/ + tui_gateway/) area/config Config system, migrations, profiles area/profiles Multi-profile isolation, HERMES_HOME scoping sweeper:risk-compatibility Sweeper risk: may break existing users, config, migrations, defaults, or upgrades labels Aug 13, 2026
@teknium1
teknium1 merged commit 2ffed55 into main Aug 13, 2026
47 checks passed
@teknium1
teknium1 deleted the feat/profile-ui-meta branch August 13, 2026 17:07
kshitijk4poor added a commit to kshitijk4poor/hermes-agent that referenced this pull request Aug 13, 2026
…t from NousResearch#83525 branch)

The NousResearch#83525 branch predates two recent main commits. Cherry-picking
brought the old versions, reverting:
- tui_gateway/methods_profiles.py: server-side ui_meta on profiles.list/configure (NousResearch#85440)
- tests/run_agent/test_primary_runtime_restore.py: context-length mock that prevents
  live network calls during unit tests

Restored to origin/main versions.
teknium1 added a commit that referenced this pull request Aug 13, 2026
…85530)

ui_meta (#85440) syncs compact roster metadata but is 64KB-capped
because it rides every profiles.list — image avatars stayed per-client.
set_asset writes a validated image (data URL or base64; PNG/JPEG/WebP
by magic bytes, 2MB cap, atomic write) to assets/avatar.<ext> in the
profile dir; get_asset returns it as a data URL on demand; profiles.list
gains a cheap has_avatar flag so rosters know to fetch without probing.
Server-side, so every client machine paints the same profile picture.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area/config Config system, migrations, profiles area/profiles Multi-profile isolation, HERMES_HOME scoping comp/tui Terminal UI (ui-tui/ + tui_gateway/) P4 Best-effort: we will get to it when we get to it (no commitment) sweeper:risk-compatibility Sweeper risk: may break existing users, config, migrations, defaults, or upgrades type/feature New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants