@extension.dev/mcp 6.3.0 → 6.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,270 @@
1
+ /**
2
+ * Ground truth for how CURRENT stable Chrome renders an installed extension
3
+ * theme, transcribed from the Chromium source tree (refs/heads/main, cached
4
+ * under parity/chromium-src-cache, fetched 2026-07-04).
5
+ *
6
+ * Three load-bearing facts anchor everything here:
7
+ *
8
+ * 1. browser_theme_pack.cc:237 kOverwritableColorTable is the complete list
9
+ * of manifest color keys modern Chrome parses. Anything else in
10
+ * theme.colors is silently dropped at parse time.
11
+ * 2. theme_service.cc:741 GetColorProviderKey sets custom_theme = nullptr
12
+ * for incognito profiles: incognito windows NEVER render an extension
13
+ * theme. Every *_incognito manifest key parses into the pack but is
14
+ * unreachable at render time.
15
+ * 3. chrome_color_provider_utils.cc ShouldApplyChromeMaterialOverrides
16
+ * returns !key.custom_theme: the GM3/material mixer layer is skipped
17
+ * entirely for themed clients, so the classic mixers + the
18
+ * theme_properties.cc defaults below are the exact render pipeline.
19
+ */
20
+ /** How a manifest theme.colors key behaves in current stable Chrome. */
21
+ export type ChromeThemeColorKeyStatus =
22
+ /** Parsed and rendered (possibly only on specific surfaces). */
23
+ "rendered"
24
+ /** Parsed but never rendered (incognito windows drop themes). */
25
+ | "incognito-dead"
26
+ /** Not in kOverwritableColorTable: silently dropped at parse. */
27
+ | "dropped"
28
+ /** Legacy alias parsed into another key. */
29
+ | "alias";
30
+ export interface ChromeThemeColorKeyInfo {
31
+ status: ChromeThemeColorKeyStatus;
32
+ /** For "alias": the key that actually receives the value. */
33
+ aliasFor?: string;
34
+ note?: string;
35
+ }
36
+ /**
37
+ * Per-key status table for manifest theme.colors, derived from
38
+ * kOverwritableColorTable (browser_theme_pack.cc:237-271) plus the
39
+ * incognito suppression (theme_service.cc:741) and the ntp_section legacy
40
+ * fallback (browser_theme_pack.cc:1451-1457).
41
+ *
42
+ * Keys of historical themes that do NOT appear in the table (tab_text_inactive,
43
+ * tab_text_incognito, ntp_link_underline, ntp_section_text,
44
+ * tab_background_separator, ...) are "dropped": ReadColorsFromJSON only
45
+ * accepts keys it can map (browser_theme_pack.cc:1459-1463).
46
+ */
47
+ export declare const CHROME_THEME_COLOR_KEYS: Record<string, ChromeThemeColorKeyInfo>;
48
+ /** kTintTable (browser_theme_pack.cc:222-232). */
49
+ export declare const CHROME_THEME_TINT_KEYS: readonly ["buttons", "frame", "frame_inactive", "background_tab", "frame_incognito", "frame_incognito_inactive"];
50
+ /** kPersistingImages manifest keys (browser_theme_pack.cc:141-168). */
51
+ export declare const CHROME_THEME_IMAGE_KEYS: readonly ["theme_frame", "theme_frame_inactive", "theme_frame_incognito", "theme_frame_incognito_inactive", "theme_toolbar", "theme_tab_background", "theme_tab_background_inactive", "theme_tab_background_incognito", "theme_tab_background_incognito_inactive", "theme_ntp_background", "theme_frame_overlay", "theme_frame_overlay_inactive", "theme_button_background", "theme_ntp_attribution", "theme_window_control_background"];
52
+ /** kDisplayProperties (browser_theme_pack.cc:297-306). */
53
+ export declare const CHROME_THEME_PROPERTY_KEYS: readonly ["ntp_background_alignment", "ntp_background_repeat", "ntp_logo_alternate"];
54
+ /**
55
+ * theme_properties.cc GetLightModeColor defaults: the base colors the pack
56
+ * derivations and the classic mixers fall back to for themed clients
57
+ * (material overrides are off with a custom theme, so these ARE the
58
+ * baseline).
59
+ */
60
+ export declare const CHROME_THEME_DEFAULTS: {
61
+ /** theme_properties.cc:39 COLOR_FRAME_ACTIVE. */
62
+ readonly frame: "#dee1e6";
63
+ /** chrome_color_mixer.cc:741 kColorToolbar (light). */
64
+ readonly toolbar: "#ffffff";
65
+ /** theme_properties.cc:54 / chrome_color_mixer.cc:799: kGoogleGrey800. */
66
+ readonly toolbarText: "#3c4043";
67
+ /** chrome_color_mixer.cc:762: HSLShift(kGoogleGrey700, TINT_BUTTONS). */
68
+ readonly toolbarButtonIconBase: "#5f6368";
69
+ /** theme_properties.cc:56 COLOR_NTP_BACKGROUND. */
70
+ readonly ntpBackground: "#ffffff";
71
+ /** theme_properties.cc:58 COLOR_NTP_TEXT. */
72
+ readonly ntpText: "#000000";
73
+ /** theme_properties.cc:60 COLOR_NTP_LINK. */
74
+ readonly ntpLink: "#063774";
75
+ /** theme_properties.cc:62 COLOR_NTP_HEADER. */
76
+ readonly ntpHeader: "#969696";
77
+ /** browser_theme_pack.cc:1680: omnibox text opaquify base, kGoogleGrey100. */
78
+ readonly omniboxTextOpaquifyBase: "#f1f3f4";
79
+ };
80
+ /**
81
+ * theme_properties.cc:218 GetDefaultTint (non-incognito, non-dark): the only
82
+ * default tint that is not a no-op is TINT_FRAME_INACTIVE, so an unspecified
83
+ * frame_inactive is a LIGHTENED frame, not a copy.
84
+ */
85
+ export declare const CHROME_THEME_DEFAULT_TINTS: {
86
+ readonly frame: {
87
+ readonly h: -1;
88
+ readonly s: -1;
89
+ readonly l: -1;
90
+ };
91
+ /** theme_properties.cc:250: #DEE1E6 -> #E7EAED. */
92
+ readonly frame_inactive: {
93
+ readonly h: -1;
94
+ readonly s: -1;
95
+ readonly l: 0.642;
96
+ };
97
+ readonly buttons: {
98
+ readonly h: -1;
99
+ readonly s: -1;
100
+ readonly l: -1;
101
+ };
102
+ readonly background_tab: {
103
+ readonly h: -1;
104
+ readonly s: -1;
105
+ readonly l: -1;
106
+ };
107
+ };
108
+ /**
109
+ * tab_strip_color_mixer.cc:79-84 kTabFgToContrastMap: contrast each tab
110
+ * foreground is blended to reach against its background when the theme does
111
+ * not set it explicitly.
112
+ */
113
+ export declare const CHROME_TAB_FOREGROUND_CONTRAST: {
114
+ readonly activeFrameActive: 10.46;
115
+ readonly activeFrameInactive: 5;
116
+ readonly inactiveFrameActive: 7.98;
117
+ readonly inactiveFrameInactive: 4.5;
118
+ };
119
+ /**
120
+ * tab_strip_color_mixer.cc:106-111: inactive-window foregrounds start from
121
+ * the active-window color blended 75% toward the background before the
122
+ * contrast pass.
123
+ */
124
+ export declare const CHROME_TAB_INACTIVE_WINDOW_FG_BLEND = 0.75;
125
+ /** tab_strip_color_mixer.cc:141-164 hover/selected surface blends. */
126
+ export declare const CHROME_TAB_SURFACE_BLENDS: {
127
+ readonly inactiveHover: 0.4;
128
+ readonly selected: 0.75;
129
+ readonly selectedHover: 0.85;
130
+ };
131
+ /** browser_theme_pack.cc:613 kMinOmniboxToolbarContrast. */
132
+ export declare const CHROME_OMNIBOX_TOOLBAR_MIN_CONTRAST = 1.3;
133
+ /**
134
+ * window_frame_util.cc:11: a fully opaque button_background is knocked down
135
+ * to 0xCC before blending over the frame.
136
+ */
137
+ export declare const CHROME_CAPTION_BUTTON_OPAQUE_ALPHA = 204;
138
+ /** theme_properties.h:206 kFrameHeightAboveTabs: tab background image offset. */
139
+ export declare const CHROME_FRAME_HEIGHT_ABOVE_TABS = 16;
140
+ /**
141
+ * browser_theme_pack.cc:332-348 GetImagesToCrop: max useful image heights.
142
+ * kTallestTabHeight = 41, kTallestFrameHeight = 41 + 19 = 60.
143
+ */
144
+ export declare const CHROME_THEME_IMAGE_CROP_HEIGHTS: {
145
+ readonly frame: 60;
146
+ readonly toolbar: 200;
147
+ readonly buttonBackground: 60;
148
+ readonly windowControlBackground: 50;
149
+ };
150
+ /**
151
+ * Image PAINT rules (THEME_REALISM_PLAN.md Phase 3), transcribed at
152
+ * refs/tags/143.0.7499.4.
153
+ *
154
+ * One anchor governs every frame/toolbar/tab image: theme image (0,0) sits
155
+ * at (browserViewLeft, browserViewTop - kFrameHeightAboveTabs) in window
156
+ * coordinates. browser_view.cc:1711 GetThemeOffsetFromBrowserView returns
157
+ * exactly that source offset, and every paint site routes through it:
158
+ * top_container_background.cc:49-75 PaintThemeAlignedImage (toolbar,
159
+ * bookmarks bar), tab_style_views.cc:989-998 (BOTH the active tab's toolbar
160
+ * image and inactive tabs' tab_background image), and
161
+ * browser_frame_view_mac.mm:633-647 PaintThemedFrame (frame). On macOS the
162
+ * BrowserView starts at the window top, so the anchor is 16 DIPs ABOVE the
163
+ * window: the top 16 rows of frame/toolbar images are never visible (they
164
+ * exist for the Windows/Linux frame band above the tabs).
165
+ *
166
+ * Tiling everywhere is SkTileMode::kRepeat horizontally and kMirror
167
+ * vertically (top_container_background.cc:72-74). CSS has no mirror tiling;
168
+ * the mock approximates y with plain repeat, which only diverges when an
169
+ * image is shorter than the painted band (the density guidance in the
170
+ * themes app warns before that happens).
171
+ */
172
+ export declare const CHROME_THEME_IMAGE_RULES: {
173
+ /**
174
+ * Vertical anchor shared by all frame/toolbar/tab images: image (0,0) is
175
+ * kFrameHeightAboveTabs DIPs above the BrowserView top
176
+ * (browser_view.cc:1711-1721).
177
+ */
178
+ readonly themeAnchorYAboveBrowserView: 16;
179
+ /**
180
+ * theme_frame: tiled horizontally across the window at natural height,
181
+ * frame color underneath (browser_frame_view_mac.mm:640-644). Painted for
182
+ * the whole frame band; rows 0-15 are cut on macOS (anchor above window).
183
+ */
184
+ readonly frame: {
185
+ readonly repeatX: true;
186
+ readonly repeatY: false;
187
+ readonly macTopCropPx: 16;
188
+ };
189
+ /**
190
+ * theme_frame_overlay: drawn ONCE at the window top-left corner, natural
191
+ * size, no tiling, over the frame image
192
+ * (browser_frame_view_mac.mm:645-646).
193
+ */
194
+ readonly frameOverlay: {
195
+ readonly repeatX: false;
196
+ readonly repeatY: false;
197
+ };
198
+ /**
199
+ * theme_toolbar: theme-aligned (shared anchor), so the toolbar band shows
200
+ * image rows starting at (16 + surface offset below BrowserView top). The
201
+ * ACTIVE TAB uses the same image and the same anchor
202
+ * (tab_style_views.cc:605-607, 989-998): the active tab looks "cut from"
203
+ * the toolbar, exactly like real Chrome.
204
+ */
205
+ readonly toolbar: {
206
+ readonly themeAligned: true;
207
+ };
208
+ /**
209
+ * theme_tab_background paints INACTIVE tabs, theme-aligned. When absent
210
+ * but theme_frame is present, the pack GENERATES it: frame color base +
211
+ * frame image shifted UP by kFrameHeightAboveTabs + background_tab tint,
212
+ * clamped to kTallestTabHeight = 41 (browser_theme_pack.cc:2036-2057).
213
+ * Net effect: inactive tabs show the (tinted) frame pixels behind them.
214
+ */
215
+ readonly tabBackground: {
216
+ readonly themeAligned: true;
217
+ readonly generatedFromFrameShiftPx: 16;
218
+ readonly generatedTint: "background_tab";
219
+ readonly generatedHeightClampPx: 41;
220
+ };
221
+ /**
222
+ * theme_ntp_background CSS matrix (new_tab_page_handler.cc:252-288):
223
+ * size "initial" (natural size, never cover), alignment bitmask maps to
224
+ * position with LEFT winning over RIGHT and TOP over BOTTOM, center
225
+ * default on each axis; tiling maps to per-axis repeat pairs. Alignment
226
+ * strings parse as whitespace-separated case-insensitive tokens
227
+ * (theme_properties.cc:148-164); tiling defaults to no-repeat
228
+ * (theme_properties.cc:167-178).
229
+ */
230
+ readonly ntpBackground: {
231
+ readonly cssSize: "auto";
232
+ readonly repeatCss: {
233
+ readonly "no-repeat": {
234
+ readonly x: "no-repeat";
235
+ readonly y: "no-repeat";
236
+ };
237
+ readonly "repeat-x": {
238
+ readonly x: "repeat";
239
+ readonly y: "no-repeat";
240
+ };
241
+ readonly "repeat-y": {
242
+ readonly x: "no-repeat";
243
+ readonly y: "repeat";
244
+ };
245
+ readonly repeat: {
246
+ readonly x: "repeat";
247
+ readonly y: "repeat";
248
+ };
249
+ };
250
+ };
251
+ /**
252
+ * theme_ntp_attribution: fixed to the BOTTOM-LEFT corner (inline-start in
253
+ * RTL), 16px bottom and inline margins, natural image size, under a
254
+ * localized "Theme created by" caption in the NTP secondary text color
255
+ * (app.html:155-160, app.css:210-216). NOT bottom-right, NOT dimmed.
256
+ */
257
+ readonly ntpAttribution: {
258
+ readonly corner: "bottom-left";
259
+ readonly offsetPx: 16;
260
+ };
261
+ /**
262
+ * theme_button_background / theme_window_control_background: the only
263
+ * paint site is the Windows/Linux opaque frame's caption buttons
264
+ * (opaque_browser_frame_view.cc:824). No macOS paint site; a mac-styled
265
+ * mock correctly renders nothing for them.
266
+ */
267
+ readonly buttonBackground: {
268
+ readonly macPaintSite: false;
269
+ };
270
+ };
@@ -0,0 +1,52 @@
1
+ export interface ChromeThemeManifestTheme {
2
+ colors?: Record<string, number[]>;
3
+ tints?: Record<string, number[]>;
4
+ properties?: Record<string, unknown>;
5
+ images?: Record<string, string>;
6
+ }
7
+ /** All hex unless noted. Slot names follow Chromium's color ids. */
8
+ export interface ResolvedChromeTheme {
9
+ frameActive: string;
10
+ frameInactive: string;
11
+ toolbar: string;
12
+ toolbarText: string;
13
+ toolbarButtonIcon: string;
14
+ toolbarTopSeparator: string;
15
+ tabBackgroundActiveFrameActive: string;
16
+ tabBackgroundActiveFrameInactive: string;
17
+ tabBackgroundInactiveFrameActive: string;
18
+ tabBackgroundInactiveFrameInactive: string;
19
+ tabForegroundActiveFrameActive: string;
20
+ tabForegroundActiveFrameInactive: string;
21
+ tabForegroundInactiveFrameActive: string;
22
+ tabForegroundInactiveFrameInactive: string;
23
+ tabBackgroundInactiveHoverFrameActive: string;
24
+ tabBackgroundSelectedFrameActive: string;
25
+ bookmarkText: string;
26
+ ntpBackground: string;
27
+ ntpText: string;
28
+ ntpLink: string;
29
+ ntpHeader: string;
30
+ /** rgba() string: header at 0x50 alpha (browser_theme_pack.cc:2010). */
31
+ ntpSectionBorder: string;
32
+ ntpLogoAlternate: 0 | 1;
33
+ omniboxFieldBackground: string;
34
+ omniboxFieldText: string;
35
+ omniboxResultsBackground: string;
36
+ windowControlButtonBackgroundActive: string;
37
+ windowControlButtonBackgroundInactive: string;
38
+ newTabButtonForeground: string;
39
+ newTabButtonBackground: string;
40
+ properties: {
41
+ ntpBackgroundAlignment: string;
42
+ ntpBackgroundRepeat: "no-repeat" | "repeat" | "repeat-x" | "repeat-y";
43
+ };
44
+ /** Honored manifest keys that were dropped/ignored, with reasons. */
45
+ ignoredKeys: {
46
+ key: string;
47
+ reason: string;
48
+ }[];
49
+ /** Fidelity caveats (e.g. image-derived colors not modeled). */
50
+ caveats: string[];
51
+ }
52
+ export declare function resolveChromeTheme(theme: ChromeThemeManifestTheme): ResolvedChromeTheme;
@@ -1,4 +1,5 @@
1
1
  import { type ActArgs } from "../lib/act";
2
+ export declare function navigateToUrl(projectPath: string, browser: string, url: string, timeout?: number): Promise<string>;
2
3
  export declare function clampPopupBounds(width: number, height: number): {
3
4
  width: number;
4
5
  height: number;
@@ -0,0 +1,76 @@
1
+ export declare const schema: {
2
+ name: string;
3
+ description: string;
4
+ inputSchema: {
5
+ type: "object";
6
+ properties: {
7
+ projectPath: {
8
+ type: string;
9
+ description: string;
10
+ };
11
+ browser: {
12
+ type: string;
13
+ enum: string[];
14
+ default: string;
15
+ description: string;
16
+ };
17
+ build: {
18
+ type: string;
19
+ default: boolean;
20
+ description: string;
21
+ };
22
+ distPath: {
23
+ type: string;
24
+ description: string;
25
+ };
26
+ surface: {
27
+ type: string;
28
+ enum: string[];
29
+ default: string;
30
+ description: string;
31
+ };
32
+ hostUrl: {
33
+ type: string;
34
+ description: string;
35
+ };
36
+ inspectUrl: {
37
+ type: string;
38
+ description: string;
39
+ };
40
+ probe: {
41
+ type: string;
42
+ default: boolean;
43
+ description: string;
44
+ };
45
+ open: {
46
+ type: string;
47
+ default: boolean;
48
+ description: string;
49
+ };
50
+ openIn: {
51
+ type: string;
52
+ enum: string[];
53
+ description: string;
54
+ };
55
+ share: {
56
+ type: string;
57
+ default: boolean;
58
+ description: string;
59
+ };
60
+ };
61
+ required: string[];
62
+ };
63
+ };
64
+ export declare function handler(args: {
65
+ projectPath: string;
66
+ browser?: string;
67
+ build?: boolean;
68
+ distPath?: string;
69
+ surface?: string;
70
+ hostUrl?: string;
71
+ inspectUrl?: string;
72
+ probe?: boolean;
73
+ open?: boolean;
74
+ openIn?: string;
75
+ share?: boolean;
76
+ }): Promise<string>;
@@ -28,7 +28,6 @@ interface StopOutcome {
28
28
  stopped: boolean;
29
29
  reaped: number[];
30
30
  detail: string;
31
- /** Set when this stop took the live-preview carrier back out of the project. */
32
31
  carrierRemoved?: string;
33
32
  }
34
33
  export declare function stopOne(projectPath: string, browser: string): Promise<StopOutcome>;
@@ -36,7 +36,6 @@ interface ReviewView {
36
36
  buildId?: string;
37
37
  checkedAt?: string;
38
38
  }
39
- /** Latest submissions.json record per store, newest submittedAt first. */
40
39
  export declare function latestSubmissionsByStore(json: unknown): Record<string, SubmissionView>;
41
40
  export interface NormalizedStoresStatus {
42
41
  lastSubmission?: Record<string, unknown>;
@@ -44,14 +43,6 @@ export interface NormalizedStoresStatus {
44
43
  reviews: Record<string, ReviewView>;
45
44
  lastPollAt?: string;
46
45
  }
47
- /**
48
- * Accept any historical shape of stores/status.json. SchemaVersion 3 carries
49
- * lastSubmission / lastOverride / lastPoll / reviews as sections. Legacy v2
50
- * came in two flavors that used to clobber each other: the submit-path shape
51
- * (kind "stores_status", lastSubmission only) and the poller shape (kind
52
- * "store_status" with perStore/updates at the top level) whose updates seed
53
- * the reviews map here, mirroring the registry template's normalizer.
54
- */
55
46
  export declare function normalizeStoresStatus(json: unknown): NormalizedStoresStatus;
56
47
  export declare function handler(args: {
57
48
  workspace?: string;
@@ -0,0 +1,22 @@
1
+ export declare const schema: {
2
+ name: string;
3
+ description: string;
4
+ inputSchema: {
5
+ type: "object";
6
+ properties: {
7
+ manifest: {
8
+ type: string;
9
+ description: string;
10
+ };
11
+ manifestPath: {
12
+ type: string;
13
+ description: string;
14
+ };
15
+ };
16
+ required: never[];
17
+ };
18
+ };
19
+ export declare function handler(args: {
20
+ manifest?: Record<string, unknown>;
21
+ manifestPath?: string;
22
+ }): Promise<string>;