Repository navigation
feat(gui): unify console controls and refine chat and plugin management - #255
Merged
Merged
Conversation
Rename chats inline in the history rail. Electron does not implement window.prompt, so double-click rename threw; the test stub hid it. Restore Markdown list markers removed by Tailwind preflight and stop preserving source newlines in assistant Markdown, which added blank lines between blocks. The assistant avatar falls back to the active role's initial instead of a fixed K. System messages and errors use theme tokens. Translate the remaining console text in Chat, Work activity, artifacts and the capability overview. Capability details become i18n templates with detailVars, and implementation labels are translated part by part, which retires five whole-string keys. Remove the unused ModelBar and SessionList. Tests cover conditional t() keys, every capability projection in a configuration grid, and visible text on host elements. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…esheet The Work window shell, CRT work surface, workboard and wallpaper projection keep their own art direction. Moving them unchanged into workSurface.css makes the console scope whole files instead of line ranges, so the type and radius scale and its ratchet can name the files they govern. No rule changes. No moved selector overlaps the console rules that now precede it, so the cascade is unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
tokens.css defines the console roles: type 11/12/13/14/17/20, weights
400/500/600, radii 4/6/10/999 and icons 14/16/20/24. Chat, history rail,
work activity, artifacts, sidebar, Settings, Backend, VN, extension, MCP,
ACP and character settings render from CSS classes on those roles
instead of inline styles and arbitrary Tailwind values; hover and focus
move from mouse handlers to CSS.
One control per job replaces the per-surface variants: Switch (with a
mixed state while a value is unknown) replaces SwitchCard,
.settings-form-switch, .vn-input-switch and boolean selects; one icon
button, one text button (SettingsButton, with a small size) and one
status chip; settings inputs and selects share one look. FluentIcon
honors its size (icon files no longer override it), and text glyphs
(x, ×, +, ›, ✓) and the CSS chevron become icons. Status colors use the
theme's success, warning, danger and neutral tokens; unverified is
neutral instead of purple. Configuration cards take their icon from the
group.
<small> renders as caption text and <strong>/<b> use the strong weight,
replacing preflight's 80% and bolder. The log viewer and the character
preview stage keep fixed palettes as local custom properties.
Small fixes on the way: sidebar items no longer shift 3px when active,
the rail's delete control shows on keyboard focus, and the mic and
vision buttons share one disabled state.
Without an I18nProvider (component fixtures), t() now fills variables in
the source text instead of returning the raw template, so labels such
as "View {title}" stay correct outside the app shell.
consoleStyle.test.mjs keeps console stylesheets on the role tokens and
theme palette, and console components free of inline visual styles,
arbitrary Tailwind values, color literals and scripted hover.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Navigation: the sidebar lists Chat, Wallpaper (a running mode, toggled in place), VN Player and Plugins, with Settings at the bottom. Render moves to a pressed-state button in the chat header; the Backend page becomes Settings > Diagnostics, with backend connection as its first status chip. Settings opens on General unless a section is remembered. Chat: a pending approval is pinned above the composer and counts any further waiting requests. An empty chat greets with the active character's name. The model menu keeps raw profile IDs, follows the config catalog and offers only profiles whose model connections are all configured, plus the current one; before connection facts arrive every profile stays listed. Profile-to-connection mapping has one owner (chatProfileConnections) for chat, Settings and capability projection. Settings: section tabs follow the width of the settings area rather than the window. Below 970px they sit above the content as tabs that wrap when needed, kept in view while scrolling; with the sidebar collapsed at the default window the side list returns. Field rows show their source only for .env or locked values, and a restart note only while a saved value waits for the next start. Links to other pages (Manage plugins, Open Characters, Open character knowledge, Manage community voices) sit beside their group title as buttons. Plugins: each package card has an enable switch that saves at once; disabling the package that holds the saved voice asks first. The configuration form opens inside its card and no longer edits enabled, so a form save never reverts the switch. The model-less Electron smoke (tools/smoke_electron_model_less.py, run by the Python CI on every platform) follows the new navigation: backend status under Settings > Diagnostics, Plugins in the sidebar whether it is expanded or collapsed, and General's Manage plugins link. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This was referenced Oct 22, 2026
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.
The desktop console now uses consistent controls and clearer navigation across Chat, Settings and Plugins. Chat gains a quieter composer and a compact history/artifact edge; plugin cards put identity, current state and common actions first, while retaining diagnostics in expandable details.
Linked design issue: Amadeus-Extensions #3. Companion protocol PR: Amadeus-Extensions #4.
User-visible changes
Versioned plugin icons
The Host accepts
amadeus.extension/v0andamadeus.extension/v1. The frozen v0 format has no icon field; existing v0 packages need no migration. Authors opting into icons select v1 and may declare a package-relativeicon.The Host accepts local PNG/JPEG files up to 1 MiB and 1024 x 1024 pixels, resolves them only through the installed-package registry, and returns them through read-only trusted-renderer IPC. The renderer uses the first name grapheme, uppercased where applicable, when no usable icon exists. Image checks are shared with the theme-image owner; the theme limits remain unchanged.
Protocol dependency: Amadeus-Extensions #4, pinned to
b444dd8b452a914f68cdba439cc3e79a9a1e53cf. Both versioned schemas and the validator match the canonical source. Review and merge that PR first; after merge, verify the pin is an ancestor of canonicalorigin/mainand rerun the source comparison. Update the pin if the accepted commit changes. Offline hash agreement alone does not establish merge ancestry.A v0-only Host rejects v1, even without an icon. Existing Hosts check schema before
enginesand may reportinvalid manifest; raising the Host API requirement cannot change that older behavior. Authors must identify a v1-capable minimum app version in distribution notes. Runtime contracts and the SDK/Host API version remain unchanged.Catalog admission remains separate: its checker is still pinned at
1840c8e; v1/icon packages must not enter the catalog until that checker is requalified.Scope and compatibility
This PR includes renderer presentation changes and the bounded plugin-icon protocol/main/preload support above; it is no longer presentation-only. No new dependency or public setting key is introduced.
A remembered Settings > Extensions section opens General, and the former
?page=backendroute opens Chat. Narrow Settings tabs wrap to keep every section reachable. The empty chat keeps the character greeting without a second hint line.Validation
Current host head:
530e77ec07ead97830916611e8289fbe64380df2. The capability-color update passed 17 existing style/scene tests andnpm run build; independent rendering checks confirmed all four original colors and 25 matching scene markers in both light and dark themes.Windows validation for the versioned manifest update at
a3b05dfb:python -m pytest tests/test_extension_icons.py tests/test_extensions.py tests/test_extension_resources.py tests/test_catalog_packaging.py tests/test_extension_protocol_provenance.py -q: 69 passed, 2 skipped. Two runner stderr-thread cleanup warnings occurred; no test failed. Runtime runner code was not changed.node --experimental-strip-types --test tests/extensionIcons.test.mjs tests/extensionTheme.test.mjs tests/extensions.test.mjs tests/extensionSettings.test.mjs: 94 passed.npm run build: passed, including config/SDK/Pi checks and TypeScript.extensionSettings.smoke.mjsandextensionThemeNative.smoke.mjs: passed. UI fixtures combine a v1 custom icon with legacy v0 fallback packages. Tests use separate profiles and random ports; the running user instance was not closed or restarted.python -m pytest -q: 126 passed, 2 skipped; Ruff passed.python tools/check_extension_protocol.py --source <canonical-checkout>: passed at the new pin. Both schema files also load from a built application wheel.Earlier verification: all 15 real model-less smoke checks passed at
0e761b9dafter correcting the install-button locator and removing the obsolete translation. That full application smoke was not rerun for the versioned-schema update while the user instance remains active. The earlier Electron run had 555/559 passes with a preview-port collision; all 16 development-server tests subsequently passed after the port was released. Original UI checks throughc637293dincluded 287 Python tests and the broader UI/model-less smoke coverage.Fresh full Python and cross-platform results remain for CI.
Screenshots
All screenshots use synthetic example packages. The before image is a cropped view of the previous cards; the after images show the full page at different widths.
After — dark theme, Chinese, narrow window
Remaining before merge