Repository navigation
Conversation
tnunamak
force-pushed
the
feat/console-connector-identity-icons
branch
from
November 5, 2026 21:34
63923e6 to
9d35610
Compare
tnunamak
force-pushed
the
fix/consent-icon-background
branch
from
November 5, 2026 21:34
9add160 to
681488b
Compare
tnunamak
force-pushed
the
feat/console-connector-identity-icons
branch
from
November 5, 2026 22:46
9d35610 to
d698bcc
Compare
tnunamak
force-pushed
the
fix/consent-icon-background
branch
2 times, most recently
from
November 5, 2026 23:10
50dd3ea to
86fd5e1
Compare
tnunamak
force-pushed
the
feat/console-connector-identity-icons
branch
from
November 6, 2026 06:13
e3633fe to
5f47de1
Compare
tnunamak
force-pushed
the
fix/consent-icon-background
branch
2 times, most recently
from
November 6, 2026 06:20
b0c6fb1 to
33eea12
Compare
tnunamak
force-pushed
the
feat/console-connector-identity-icons
branch
from
November 6, 2026 13:14
af740a0 to
f8ec588
Compare
tnunamak
force-pushed
the
fix/consent-icon-background
branch
from
November 6, 2026 13:15
4e9aea1 to
3c75171
Compare
tnunamak
force-pushed
the
feat/console-connector-identity-icons
branch
from
November 6, 2026 13:25
f8ec588 to
0de0510
Compare
tnunamak
force-pushed
the
fix/consent-icon-background
branch
from
November 6, 2026 13:25
3c75171 to
bfa3dfe
Compare
tnunamak
force-pushed
the
feat/console-connector-identity-icons
branch
from
November 6, 2026 14:12
0de0510 to
c5f7d87
Compare
…sent mark The consent projection copied only color, kind and svg from the manifest icon and dropped brand.background_color, so a white glyph rendered on the default tile and was invisible. Carry the declared background through the server model and the console model; the shared mark renderer already paints it. Assisted-by: AI Signed-off-by: Tim Nunamaker <tnunamak@gmail.com>
The white-glyph test only checked that some SVG existed, so a fallback mark would have passed the glyph check. It now reads the rendered path fill and requires the manifest's white. It also no longer passes connectorIndex, which ConsentScreen does not accept. Assisted-by: AI Signed-off-by: Tim Nunamaker <tnunamak@gmail.com>
buildHostedMcpConsentChallengeModel read `brand.background_color` and `icon` through a cast to a second manifest shape, while getConnectorManifest promised a ConsentPickerManifest that declared neither field. A producer with an incompatible brand value therefore still compiled. Declare the optional readonly `brand` and `icon` fields on ConsentPickerManifest and read them directly, so the compiler checks both at the capability boundary. Runtime behavior is unchanged. A manifest whose `brand.background_color` is a number now fails to compile; with the cast it compiled. Assisted-by: AI Signed-off-by: Tim Nunamaker <tnunamak@gmail.com>
brand.background_color reached the browser unchecked: validateManifestIcon covers icon, not brand. A value such as "transparent" painted no backdrop behind a white glyph, which hides the mark again. The consent model now passes the value through hexColorOrNull and falls back to the default tile for anything that is not #rgb or #rrggbb. Document that brand is an implementation extension and operator-trusted manifest data, and pin the fallback, short hex and no-glyph cases. Assisted-by: AI Signed-off-by: Tim Nunamaker <tnunamak@gmail.com>
hexColorOrNull and its regex lived in the manifest validator while the console kept its own 6-digit regex for the same job. The check now lives in @pdpp/brand-react (hex-color.ts) and both the server and the console import it, so a color accepted by one is accepted by the other. The manifest icon.color check uses it too; behavior is unchanged. Assisted-by: AI Signed-off-by: Tim Nunamaker <tnunamak@gmail.com>
tnunamak
force-pushed
the
fix/consent-icon-background
branch
from
November 6, 2026 14:12
bfa3dfe to
89240c1
Compare
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.
Stacked on #620: the base is
feat/console-connector-identity-icons, because thebackgroundColorfield on the shared mark renderer (ConnectorIcon) comes from that PR. Merge #620 first and GitHub retargets this PR tomain.What
The consent screen showed a connector's manifest glyph without its declared brand background.
buildHostedMcpConsentChallengeModel(reference-implementation/server/routes/as-consent-ui-helpers.ts) copied onlycolor,kindandsvgfrom the manifest icon and droppedbrand.background_color. A white glyph then rendered on the default tile and was invisible.How
iconnow carriesbackgroundColorfrommanifest.brand.background_color. The server checks it withhexColorOrNull(#rgbor#rrggbb), which lives in@pdpp/brand-react(hex-color.ts) and is the same check the console uses in feat(console): show one identity-based connector mark everywhere #620; anything else, or no declaration, gives null and the default tile.validateManifestIconcoversicononly, sobrandneeded its own check.brandis an implementation extension:spec-collection-profile.mdin this repo does not define it. It is operator-trusted manifest data, not connector-asserted identity, and the doc comment onConsentPickerManifestsays so.ConsentPickerManifestdeclares the optionalbrandandiconfields, so the compiler checks the capability boundary; the projection reads them without a cast.ConsentSourceIconinconsent-screen-model.tsmirrors the field. The shared mark validates it as a hex color and paints it as the tile background.Relation to #620
#620 resolves each manifest's display mark, backdrop included, once in the console (
resolve-manifest-display-mark.ts). The consent challenge is built by the authorization server from its own manifest reader, which the console cannot call, so this projection is that boundary for the consent screen and is still needed. It follows the same rule: the declaredbrand.background_colortravels with the supplied mark, and a source with no mark falls back to the bundled one.Tested
consent-screen-runtime.test.mjscase: a manifest with a white glyph andbrand.background_color: "#1DB954"goes through the real projection and the real screen, and the mark tile's computed background isrgb(29, 185, 84). Before the change it isrgba(0, 0, 0, 0); the test fails there.transparent,white,rgb(0 0 0 / 0), a declaration break-out string, a number, an empty string) failed beforehexColorOrNull(the model carried the raw value) and pass after. Also pinned: a short hex is accepted, and a brand background with no manifest glyph is not applied to the resolved identity mark.apps/console,npm run test:fileson theconsent-screendirectory: 56 pass, 0 fail.reference-implementation,node --import tsx --testonhosted-mcp-picker-scope-render,hosted-mcp-picker-render,hosted-mcp-selectionandconsent-challenge-csrf: 69 pass, 0 fail (re-run after the validation change).node --import tsx --test test/connector-manifest-validation.test.ts: 51 pass, 0 fail (the manifesticon.colorcheck now uses the shared function).tsc --noEmitinreference-implementationandnpm run types:checkinapps/console: clean.Assisted-by: AI