Skip to content

feat(protocol): introduce manifest v1 for package icons - #4

Merged
Lucas1479 merged 2 commits into
mainfrom
codex/plugin-icons-20261023
Oct 22, 2026
Merged

Lucas1479 merged 2 commits into
mainfrom
codex/plugin-icons-20261023

Conversation

@Lucas1479

@Lucas1479 Lucas1479 commented Oct 22, 2026 •

Copy link
Copy Markdown
Member

Plugins need package-owned visual identity without changing the accepted fields of existing v0 manifests. This introduces amadeus.extension/v1 for optional local icons and keeps amadeus.extension/v0 unchanged.

Closes #3. Host implementation: Amadeus #255.

Contract and compatibility

  • Publish a separate v1 JSON Schema. The v0 schema is identical to the pre-icon canonical source and continues to reject icon.
  • Select the exact schema from an explicit v0/v1 allowlist. New validators/Hosts accept existing v0 packages and v1 packages with or without icons; unknown versions and undeclared fields remain rejected.
  • In v1, optional icon reuses the package-relative path contract. Icons are bundled PNG/JPEG files with matching signatures, at most 1 MiB. The Host additionally enforces native decoding and a 1024 x 1024 maximum, and provides the name-initial fallback.
  • Keep image checks shared with theme resources. Missing icon and theme files report their owning P5/P4 checks; missing package commands retain P3. Package checklist rows now follow P1–P5 order.
  • No Runner contract, SDK or Host API version change.

A v0-only Host rejects a v1 manifest, even without an icon. Existing Hosts validate schema before engines and can report invalid manifest; increasing a Host API requirement cannot retroactively turn that into incompatible. Authors must state a v1-capable minimum application version in distribution notes.

Coordination

Amadeus #255 pins b444dd8b452a914f68cdba439cc3e79a9a1e53cf. Both PRs remain Draft; this update does not merge or release either one.

Review/merge the protocol first. After merge, verify git merge-base --is-ancestor <host-pinned-commit> origin/main, then run the Host source comparison. If the accepted commit changes, update the Host pin and hashes. Offline hash agreement alone does not establish that the source has reached canonical main.

The catalog checker remains independently pinned at 1840c8e. No v1/icon package enters the catalog until that checker is separately requalified. This PR does not modify the store/catalog PRs.

Validation

On Windows with CPython 3.12.10:

  • python -m pytest -q: 126 passed, 2 skipped. Covers both schema versions, all existing contribution examples, v0 icon rejection, unknown versions/fields, file/signature/size boundaries and package-check ownership.
  • python -m ruff check .: passed.
  • v0 schema comparison against canonical b30df73: no difference.
  • Host python tools/check_extension_protocol.py --source <canonical-checkout>: passed for both schemas and the reference validator at the new pin.
  • Host validation includes real v0/v1 wheel inspection/preparation, packaged-schema loading, TypeScript compatibility, independent UI and native-image smokes.

The SDK build passed earlier in this PR; SDK sources remain unchanged. Cross-platform CI and contract review remain required.

@Lucas1479 Lucas1479 changed the title feat(protocol): support optional local package icons feat(protocol): introduce manifest v1 for package icons Oct 22, 2026
@Lucas1479
Lucas1479 marked this pull request as ready for review October 22, 2026 16:02
@Lucas1479
Lucas1479 merged commit 6f3fee2 into main Oct 22, 2026
3 checks passed
Lucas1479 added a commit to Code-Amadeus/Amadeus that referenced this pull request Oct 22, 2026
…nt (#255)

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](Code-Amadeus/Amadeus-Extensions#3).
Companion protocol PR: [Amadeus-Extensions
#4](Code-Amadeus/Amadeus-Extensions#4).

## User-visible changes

- Fix inline chat rename in Electron, Markdown list markers and block
spacing, character-initial avatar fallback, and remaining English labels
in the Chinese console.
- Share console type, weight, radius and icon scales; reuse Switch,
icon/text buttons and status chips. Keep Work and wallpaper surfaces on
their existing visual styles.
- Simplify sidebar navigation, move backend information to Settings >
Diagnostics, pin pending approvals above the composer, and show only
configured model profiles plus the current selection.
- Restore the scene-capability legend and item markers to their original
distinct green (ready), orange (needs attention), gray (off) and purple
(unverified) palette, with subtle outlines.
- Keep Settings sections responsive to the available settings width,
remember the selected section, and show restart notes only for pending
changes.
- Remove the extra background rectangle inside the chat composer while
retaining its outer focus indication and text caret.
- Collapse the history/artifact rail to an 8 px edge with a subtle
handle. Hover or keyboard focus opens the existing overlay; coarse
pointers retain a wider target.
- Reorganize Plugins using the shared Settings groups and card controls:
- installation action beside the group title and expandable installation
guidance;
- icon, name, author/version, one current-state indicator and enable
switch;
- concise contribution summaries and common configuration/settings
actions;
- package ID, saved/loaded revisions, permissions, runtime diagnostics
and removal inside Plugin details.
- Keep restart-pending state, compatibility warnings and
package/contribution failures visible without expanding details.
Preserve draft configuration, selected-voice disable/removal
confirmation and existing save behavior.

## Versioned plugin icons

The Host accepts `amadeus.extension/v0` and `amadeus.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-relative `icon`.

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](Code-Amadeus/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 canonical
`origin/main` and 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 `engines` and may report `invalid 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=backend` route 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 and `npm
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.
- Independent `extensionSettings.smoke.mjs` and
`extensionThemeNative.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.
- Canonical protocol `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
`0e761b9d` after 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 through `c637293d` included 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.

| Before | After — light, English |
| --- | --- |
| ![Previous plugin
cards](https://raw.githubusercontent.com/Code-Amadeus/Amadeus/44403f355971797ccea9fd6abf6bb91fba53fc2c/docs/screenshots/uiux-plugins/before.png)
| ![Updated plugin
manager](https://raw.githubusercontent.com/Code-Amadeus/Amadeus/44403f355971797ccea9fd6abf6bb91fba53fc2c/docs/screenshots/uiux-plugins/after-light-en.png)
|

<details>
<summary>After — dark theme, Chinese, narrow window</summary>

![Updated plugin manager in a narrow Chinese dark-theme
window](https://raw.githubusercontent.com/Code-Amadeus/Amadeus/44403f355971797ccea9fd6abf6bb91fba53fc2c/docs/screenshots/uiux-plugins/after-dark-zh-narrow.png)

</details>

## Remaining before merge

- Review the linked design issue and companion protocol PR, merge the
protocol first, and verify the final canonical pin is reachable from
canonical main.
- Run full Python and cross-platform CI; those were not rerun locally
for these additions.
Lucas1479 added a commit to Code-Amadeus/Amadeus that referenced this pull request Oct 22, 2026
## Behavior and ownership

Adds a functional plugin-store prototype to the existing installer:
official catalog browsing/details, progress/cancellation, manual
updates, HTTPS mirror downloads, withdrawal, durable blocking/unblocking
and damage recovery. The empty catalog remains visible as a preview.
Authors use a minimal hashed static-check environment and one submission
PR; maintainers use the official reproducible
generation/review/publication tools in the companion repository.

Electron main owns source resolution, artifact hashes, install
transactions and durable security facts. Renderer requests package
ID/version only. No new runtime capabilities, automatic updates or
rollback guarantee. Admission restrictions remain separate from the
runtime contract. Display-cache damage cannot erase known bans;
ambiguous settings/backup damage fails closed. Mirrors never replace the
official index.

## Integrated review fixes

- Merged the already-landed UI/icon and bundled-dictionary mainline
while preserving both store and installed-package journeys. Four status
colors remain unchanged by user decision; dictionary stays rc2.
- Package all `server/extensions/*.schema.json`. Test the actual
packaged helper with real v0 and v1 wheel contents, including a negative
missing-schema check in isolated staging.
- Adapt lifecycle probes to package-scoped card switches,
details/removal and sidebar navigation. Keep enable intent separate from
configuration drafts. Retain focus using the existing artifact drawer
keyboard contract.
- Use `catalog/v1/index.json`, locked wallpaper restore and streamed
downloads with backpressure/stall timeout. Keep source identity checks
strict.
- Protocol [Amadeus-Extensions PR
#4](Code-Amadeus/Amadeus-Extensions#4) and [PR
#5](Code-Amadeus/Amadeus-Extensions#5) are
merged. Trusted catalog admission is a separate isolated workflow and
now a strict required check on protocol main. A negative then positive
real PR qualification was run and closed without merge. Checker SHA
`1840c8e4` is retained by `extension-catalog-checker-d1`.
- Upgrade only transitive `opentelemetry-api` from 1.44.0 to 1.45.1
after fresh CI audit reported CVE-2026-114603; no new audit ignore.

## Validation

Local integration evidence: 603 Electron tests; 158 plugin Python tests
(7 existing conditional skips); 31 author/icon/package tests (1 existing
conditional skip); 42 packaging/release/dictionary tests (2 existing
conditional skips); actual code-only Windows build; actual bundled v0/v1
validation; 27 store UI checks and 12 installed-settings UI checks.
Dependency audit and environment consistency pass after the narrow lock
update. Complete local source qualification passed 15 desktop + 14
plugin + 18 fault/recovery checks; actual packaged qualification passed
15 + 15 + 18. The official-tool packaged Git/HTTPS roundtrip passed 15
desktop + 27 lifecycle checks across six publications, four app restarts
and five installed Notes MCP contract runs. Final merge remains gated on
new-head CI. The construction record distinguishes the source run's
pre-commit dirty identity from clean cd3f36f packaged/publication
starts.

Windows CI now executes the complete official-tool local Git/HTTPS
publication flow against the packaged desktop, including updates,
withdrawal, bans, unblock, restart and NUL damage recovery. Reports
distinguish simulated damage from physical power loss and native MCP/TTS
contracts from model turns.

[Integration
record](docs/verification/extensions/community-preview-batch12-2026-10-23.md)
· [Repeatable demo](docs/extension_store_demo.md) · [Companion
Extensions
#5](Code-Amadeus/Amadeus-Extensions#5)

No plugin packages or Releases are published by this PR. The fixed
historical catalog checker continues to exclude v1 icon packages until a
separate mainline checker/manifest-version compatibility qualification.
The public runtime itself supports v0 and v1. Historical dated plans and
Pi qualification changes are retained as reviewed development evidence.
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.

Design: optional local package icons for plugin identity

1 participant