feat: server-side ui_meta on profiles.list/configure - #85440
Merged
Conversation
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.
Contributor
૮ >ﻌ< ა ci reviewran on 198a45f — test: stop primary-runtime-restore tests probing live endpoi
|
_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.
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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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.configureacceptsui_meta: dict— merged key-wise into aui_metablock in the profile's existingprofile.yaml(same file asdescription, sameatomic_yaml_write). A top-level key set tonulldeletes it. Consumers are expected to namespace under their own key (ui_meta["hermes-bots"] = {...}).profiles.listreturns the block asui_metaper row (omitted when empty), so a roster paints in one call.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.listreturned 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_autosurvived all writes (profile.yamlkeys: description, description_auto, ui_meta).Consumer: Hermes-Bot-Mode stores avatar/pet selections server-side so every client machine sees the same bots.