@extension.dev/mcp 5.6.1 → 6.0.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,83 @@
1
+ /**
2
+ * The Extension.dev Live Preview carrier, bundled prebuilt in this package
3
+ * under extensions/live-preview/<engine>. extension_dev materializes it into
4
+ * the project's ./extensions folder (which Extension.js auto-scans and loads
5
+ * as a companion next to the user's extension), so the dev browser comes up
6
+ * carrier-equipped: web pages the carrier allowlists (inspect.extension.dev,
7
+ * localhost) can then watch the session's real-lane trace and pair with it.
8
+ */
9
+ export declare const CARRIER_DIR_NAME = "extension-dev-live-preview";
10
+ export declare const CARRIER_EXTENSION_ID = "ibppeifnekhjjjmpjfiobccjlicbmgcb";
11
+ /** Where the carrier lands inside a project. */
12
+ export declare function carrierPath(projectPath: string): string;
13
+ /** True only for a directory carrying our marker, i.e. ours to delete. */
14
+ export declare function isManagedCarrier(projectPath: string): boolean;
15
+ export type CarrierRemoval = {
16
+ removed: boolean;
17
+ path: string;
18
+ /** Present when something was there but was NOT ours to touch. */
19
+ note?: string;
20
+ };
21
+ /**
22
+ * Remove the carrier from a project, marker-guarded.
23
+ *
24
+ * The trace swarm's most release-dangerous finding was that a debugging flag
25
+ * leaves a permanent companion extension in the project: it survived
26
+ * extension_stop, Extension.js auto-scans ./extensions, and the first
27
+ * `git add -A` vendors it. Nothing removed it, ever. Stop and build both call
28
+ * this now, and `extension_dev carrier: true` puts it back on demand.
29
+ */
30
+ export declare function removeCarrier(projectPath: string): CarrierRemoval;
31
+ /**
32
+ * Keep the carrier out of the user's commits. The scaffolder runs `git init`
33
+ * with no initial commit, so the first `git add -A` in a project that ever ran
34
+ * with carrier: true vendors 460K of somebody else's extension.
35
+ * Returns the line added, or null when nothing needed doing.
36
+ */
37
+ export declare function ensureCarrierIgnored(projectPath: string): string | null;
38
+ export type CarrierMaterialization = {
39
+ loaded: boolean;
40
+ path?: string;
41
+ note: string;
42
+ /** The .gitignore entry this run added, when it added one. */
43
+ gitignored?: string;
44
+ /**
45
+ * What the carrier lane CANNOT do, stated at the moment it is handed over.
46
+ * The trace swarm's top finding was that the real lane's boundaries were
47
+ * discoverable only by experiment: 14 personas independently filed the
48
+ * carrier-identity scoping as a severe bug, and 10 more expected the trace
49
+ * to show their own extension's calls. Both are honest constraints; neither
50
+ * was written down anywhere the caller would look.
51
+ */
52
+ limitations?: string[];
53
+ /**
54
+ * The graduation path, stated next to the shared-identity limitation so the
55
+ * caller is not left at a dead end. The carrier lane is the SHARED real lane
56
+ * (calls run as the carrier); but the guest is ALREADY loaded as itself in
57
+ * this same session, so its OWN storage, identity and messaging are reached by
58
+ * driving the guest directly with the control verbs, not the carrier bridge.
59
+ * This is the agent-lane twin of the inspect Trace tab's "load as your own
60
+ * extension" affordance: here the extension is already loaded, so graduating
61
+ * means targeting it, not launching it.
62
+ */
63
+ graduation?: string;
64
+ /**
65
+ * How to actually DRIVE the real lane. Seven personas reached a
66
+ * permanently empty trace and concluded the feature was broken, because
67
+ * nothing in the 33 tool schemas, this note, or the rendered page named the
68
+ * carrier's extension id or its message envelopes. Every persona that did
69
+ * reach the real lane used out-of-band knowledge of the emulator source.
70
+ */
71
+ bridgeProtocol?: {
72
+ carrierExtensionId: string;
73
+ allowedOrigins: string;
74
+ howTo: string;
75
+ example: string;
76
+ };
77
+ };
78
+ /**
79
+ * Copy the bundled carrier into <projectPath>/extensions/<CARRIER_DIR_NAME>.
80
+ * Refuses to touch an existing directory that lacks our marker file (it is
81
+ * the user's, not ours); otherwise replaces it so version updates propagate.
82
+ */
83
+ export declare function materializeCarrier(projectPath: string, browser: string): CarrierMaterialization;
@@ -0,0 +1,27 @@
1
+ export type GuestTarget = {
2
+ id: string;
3
+ type: string;
4
+ url: string;
5
+ };
6
+ export type GuestLoadCheck = {
7
+ checked: boolean;
8
+ loaded: boolean;
9
+ guestTargets: GuestTarget[];
10
+ guestIds: string[];
11
+ cdpPort?: number;
12
+ reason: string;
13
+ };
14
+ /**
15
+ * The BUGS_TO_FIX §83 oracle: ask the BROWSER whether the guest actually loaded,
16
+ * instead of trusting the engine's ready.json. Chrome refusing --load-extension
17
+ * is invisible to every engine surface (ready.json stamps status:ready, empty
18
+ * logs), so the only trustworthy "did the guest load" signal is a
19
+ * chrome-extension:// target in the browser's own CDP /json list. The engine's
20
+ * devtools companion is always present and is not the guest; a NON-companion
21
+ * extension target is. Never throws: an unreachable endpoint returns
22
+ * checked:false so callers can degrade instead of failing.
23
+ */
24
+ export declare function verifyGuestLoaded(projectPath: string, browser: string, options?: {
25
+ waitMs?: number;
26
+ timeoutMs?: number;
27
+ }): Promise<GuestLoadCheck>;
@@ -1,5 +1,17 @@
1
- export declare const REGISTRY_BASE_DEFAULT = "https://registry.extension.land";
2
- export declare const CONSOLE_BASE = "https://console.extension.dev";
1
+ import { type Origins } from "./urls-origins";
2
+ export declare const REGISTRY_BASE_DEFAULT: string;
3
+ /**
4
+ * Resolve the fleet origins from the MCP's env vars, once per call. Console,
5
+ * registry, and media all DERIVE from the platform base (`EXTENSION_DEV_API_URL`
6
+ * or a per-tool `api`): point that at a local stack and every dashboard link the
7
+ * MCP hands back follows to the dev host (`console.extension.localhost`) instead
8
+ * of silently pointing at prod. Explicit per-host env vars still win. Falls back
9
+ * to production when nothing is set. The dev-derivation lives in
10
+ * `@extensiondev/urls` so it stays identical to what the apps resolve.
11
+ */
12
+ export declare function mcpOrigins(apiHint?: string): Origins;
13
+ /** Base origin of the console dashboard, dev-aware (no trailing slash). */
14
+ export declare function consoleBase(apiHint?: string): string;
3
15
  export declare function registryBase(): string;
4
16
  export interface ProjectRef {
5
17
  workspace: string;
@@ -17,8 +29,14 @@ export declare function resolveProjectRef(overrides?: {
17
29
  }): ProjectRef | null;
18
30
  /** URL of a file under the project's `_extension-dev/` registry directory. */
19
31
  export declare function registryFileUrl(ref: ProjectRef, file: string): string;
20
- /** Console page URL for the project (builds, releases/new, stores, ...). */
21
- export declare function consoleProjectUrl(ref: ProjectRef | null, page: string): string;
32
+ /**
33
+ * Console page URL for the project (builds, releases/new, stores, ...). The
34
+ * origin is dev-aware; the path comes from the shared route contract so a
35
+ * console route rename is caught in one place. Pass `apiHint` (a tool's `api`
36
+ * arg) so the link matches that call's environment; otherwise it follows
37
+ * `EXTENSION_DEV_API_URL`/`EXTENSION_DEV_CONSOLE_URL`.
38
+ */
39
+ export declare function consoleProjectUrl(ref: ProjectRef | null, page: string, apiHint?: string): string;
22
40
  export type RegistryFetchResult<T> = {
23
41
  ok: true;
24
42
  json: T;
@@ -0,0 +1,2 @@
1
+ export declare function templateMetaUrls(): Promise<string[]>;
2
+ export declare function templateFileUrls(slug: string, relativePath: string): Promise<string[]>;
@@ -0,0 +1,34 @@
1
+ /** The set of app/service origins the fleet links between. */
2
+ export interface Origins {
3
+ www: string;
4
+ console: string;
5
+ inspect: string;
6
+ templates: string;
7
+ intelligence: string;
8
+ /** Public release-state JSON host (registry.extension.land). */
9
+ registry: string;
10
+ /** Content-addressed template corpus host (media.extension.land). */
11
+ media: string;
12
+ }
13
+ /** Production origins. The prod fallback for every resolver in the fleet. */
14
+ export declare const PROD_ORIGINS: Origins;
15
+ export declare const DEV_LOCALHOST_ORIGINS: Origins;
16
+ /**
17
+ * True for `localhost`, `127.0.0.1`, `[::1]`, or any `*.extension.localhost`
18
+ * host -- the shapes the dev proxy serves. Anything unparseable is treated as
19
+ * not-local so an odd value falls back to prod rather than leaking a dev host.
20
+ */
21
+ export declare function isLocalOrigin(url: string | undefined | null): boolean;
22
+ /**
23
+ * Resolve the full origin set from a caller's overrides.
24
+ *
25
+ * Precedence per origin: explicit override -> derived base (dev vs prod) ->
26
+ * prod. The base is chosen by whether the environment looks local: if any of
27
+ * `www`/`console`/`hint` points at a local host, unset origins derive from the
28
+ * Caddy dev map instead of prod. This is what lets an operator set only
29
+ * `EXTENSION_DEV_API_URL=http://localhost:3100` and still get a console link at
30
+ * `console.extension.localhost` rather than one that silently points at prod.
31
+ */
32
+ export declare function resolveOrigins(overrides?: Partial<Origins>, opts?: {
33
+ hint?: string;
34
+ }): Origins;
@@ -0,0 +1,56 @@
1
+ /** A project is addressed by its workspace slug + project slug across the fleet. */
2
+ export interface ProjectRef {
3
+ workspace: string;
4
+ project: string;
5
+ }
6
+ /** `/:workspace` (or a sub-page like `settings` / `settings/:section`). */
7
+ export declare function consoleWorkspacePath(workspace: string, page?: string): string;
8
+ /**
9
+ * `/:workspace/:project/<page>`. Pass a page tail from `ConsoleProjectPage`
10
+ * (e.g. `ConsoleProjectPage.builds`) rather than hand-typing it, so a route
11
+ * rename is a one-line change here instead of a scattered string edit.
12
+ */
13
+ export declare function consoleProjectPath(ref: ProjectRef, page?: string): string;
14
+ /**
15
+ * Named project-page tails. Values are the exact segments under
16
+ * `/:username/:reponame/` in console's route table; deep pages take ids.
17
+ */
18
+ export declare const ConsoleProjectPage: {
19
+ readonly overview: "";
20
+ readonly onboard: "onboard";
21
+ readonly activity: "activity";
22
+ readonly builds: "builds";
23
+ readonly build: (buildId: string, browser?: string) => string;
24
+ readonly releases: "releases";
25
+ readonly releasesNew: "releases/new";
26
+ readonly release: (releaseId: string) => string;
27
+ readonly stores: "stores";
28
+ readonly storesNew: "stores/new";
29
+ readonly store: (store: string) => string;
30
+ readonly storeSubmissions: (store: string) => string;
31
+ readonly storeSubmissionNew: (store: string) => string;
32
+ readonly storeSubmission: (store: string, submissionId: string) => string;
33
+ readonly projectSettings: "project-settings";
34
+ readonly projectSettingsSection: (section: string) => string;
35
+ /** Where CLI/MCP tokens are minted and revoked. */
36
+ readonly accessTokens: "settings/access-tokens";
37
+ };
38
+ export type QueryValue = string | number | boolean | null | undefined;
39
+ /**
40
+ * `/new?...` -- project creation. The public deep-link contract: external
41
+ * READMEs use `extension.dev/new?template=<slug>`, which www normalizes to
42
+ * `/import` preserving every param. Do not change the `template` key.
43
+ */
44
+ export declare function wwwNewPath(query?: Record<string, QueryValue>): string;
45
+ /** `/import?...` -- the ported import/deploy flow templates' Deploy buttons target. */
46
+ export declare function wwwImportPath(query?: Record<string, QueryValue>): string;
47
+ /** `/device` -- CLI/MCP device-code consent. Lives on www, never console. */
48
+ export declare function wwwDevicePath(): string;
49
+ /** `/templates` and `/templates/:slug` -- externally linkable gallery entry on www. */
50
+ export declare function wwwTemplatesPath(slug?: string): string;
51
+ export type TemplateTab = "preview" | "instructions" | "source";
52
+ /** `/:slug` for the default `preview` tab, else `/:slug/<tab>`. */
53
+ export declare function templateTabPath(slug: string, tab?: TemplateTab): string;
54
+ export type InspectTab = "preview" | "details" | "source" | "trace";
55
+ /** `/` for the default `preview` tab, else `/details` / `/source` / `/trace`. */
56
+ export declare function inspectTabPath(tab?: InspectTab): string;
@@ -20,6 +20,11 @@ export declare const schema: {
20
20
  default: boolean;
21
21
  description: string;
22
22
  };
23
+ carrier: {
24
+ type: string;
25
+ default: boolean;
26
+ description: string;
27
+ };
23
28
  profile: {
24
29
  readonly type: "string";
25
30
  readonly description: "Browser profile path, or \"false\" to reuse the default user profile. Omit for a fresh throwaway profile.";
@@ -87,4 +92,5 @@ export declare function handler(args: {
87
92
  replace?: boolean;
88
93
  allowControl?: boolean;
89
94
  allowEval?: boolean;
95
+ carrier?: boolean;
90
96
  } & LaunchFlagArgs): Promise<string>;
@@ -44,6 +44,7 @@ export declare const schema: {
44
44
  required: string[];
45
45
  };
46
46
  };
47
+ export declare function sessionIsHeadless(): boolean;
47
48
  export declare function handler(args: ActArgs & {
48
49
  surface?: string;
49
50
  name?: string;
@@ -28,6 +28,8 @@ 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
+ carrierRemoved?: string;
31
33
  }
32
34
  export declare function stopOne(projectPath: string, browser: string): Promise<StopOutcome>;
33
35
  export declare function handler(args: {
@@ -0,0 +1,2 @@
1
+ /*! tailwindcss v4.1.17 | MIT License | https://tailwindcss.com */
2
+ @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after{--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-shadow:0 0 transparent;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 transparent;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 transparent;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 transparent;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 transparent;--tw-outline-style:solid;--tw-animation-delay:0s;--tw-animation-direction:normal;--tw-animation-duration:initial;--tw-animation-fill-mode:none;--tw-animation-iteration-count:1;--tw-enter-opacity:1;--tw-enter-rotate:0;--tw-enter-scale:1;--tw-enter-translate-x:0;--tw-enter-translate-y:0;--tw-exit-opacity:1;--tw-exit-rotate:0;--tw-exit-scale:1;--tw-exit-translate-x:0;--tw-exit-translate-y:0}::-ms-backdrop{--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-shadow:0 0 transparent;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 transparent;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 transparent;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 transparent;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 transparent;--tw-outline-style:solid;--tw-animation-delay:0s;--tw-animation-direction:normal;--tw-animation-duration:initial;--tw-animation-fill-mode:none;--tw-animation-iteration-count:1;--tw-enter-opacity:1;--tw-enter-rotate:0;--tw-enter-scale:1;--tw-enter-translate-x:0;--tw-enter-translate-y:0;--tw-exit-opacity:1;--tw-exit-rotate:0;--tw-exit-scale:1;--tw-exit-translate-x:0;--tw-exit-translate-y:0}::backdrop{--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-shadow:0 0 transparent;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 transparent;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 transparent;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 transparent;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 transparent;--tw-outline-style:solid;--tw-animation-delay:0s;--tw-animation-direction:normal;--tw-animation-duration:initial;--tw-animation-fill-mode:none;--tw-animation-iteration-count:1;--tw-enter-opacity:1;--tw-enter-rotate:0;--tw-enter-scale:1;--tw-enter-translate-x:0;--tw-enter-translate-y:0;--tw-exit-opacity:1;--tw-exit-rotate:0;--tw-exit-scale:1;--tw-exit-translate-x:0;--tw-exit-translate-y:0}}}@layer theme{:root{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-white:#fff;--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--font-weight-medium:500;--font-weight-semibold:600;--leading-relaxed:1.625;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-white:#fff;--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--font-weight-medium:500;--font-weight-semibold:600;--leading-relaxed:1.625;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before{box-sizing:border-box;border:0 solid;margin:0;padding:0}::-ms-backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::-webkit-file-upload-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}::-ms-browse{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:transparent;border-radius:0}::-webkit-file-upload-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:transparent;border-radius:0}::-ms-browse{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:transparent;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:transparent;border-radius:0}:where(select:-webkit-any([multiple],[size])) optgroup{font-weight:bolder}:where(select:-moz-any([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:-webkit-any([multiple],[size])) optgroup option:not(:-webkit-any(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))){padding-left:20px}:where(select:-moz-any([multiple],[size])) optgroup option:not(:-moz-any(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))){padding-left:20px}:where(select:is([multiple],[size])) optgroup option:not(:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))){padding-left:20px}:where(select:-webkit-any([multiple],[size])) optgroup option:-webkit-any(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){padding-right:20px}:where(select:-moz-any([multiple],[size])) optgroup option:-moz-any(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){padding-right:20px}:where(select:is([multiple],[size])) optgroup option:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){padding-right:20px}:not(:-webkit-any(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)))::-webkit-file-upload-button{margin-right:4px}:not(:-moz-any(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)))::file-selector-button{margin-right:4px}:not(:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)))::-ms-browse{margin-right:4px}:not(:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)))::file-selector-button{margin-right:4px}:-webkit-any(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))::-webkit-file-upload-button{margin-left:4px}:-moz-any(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))::file-selector-button{margin-left:4px}:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))::-ms-browse{margin-left:4px}:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))::file-selector-button{margin-left:4px}::-webkit-input-placeholder{opacity:1}::-ms-input-placeholder{opacity:1}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::-webkit-input-placeholder{color:currentColor}::-ms-input-placeholder{color:currentColor}::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::-webkit-input-placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}::-ms-input-placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-year-field{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-month-field{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-day-field{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-hour-field{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-minute-field{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-second-field{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-millisecond-field{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-meridiem-field{padding-top:0;padding-bottom:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button{-webkit-appearance:button;-moz-appearance:button;-ms-appearance:button;appearance:button}input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;-ms-appearance:button;appearance:button}::-webkit-file-upload-button{-webkit-appearance:button;-moz-appearance:button;-ms-appearance:button;appearance:button}::-ms-browse{-webkit-appearance:button;-moz-appearance:button;-ms-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;-ms-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}*{border-color:var(--border);outline-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){*{outline-color:color-mix(in oklab,var(--ring)50%,transparent)}}body{background-color:var(--background);color:var(--foreground)}}@layer components;@layer utilities{.\@container\/card-header{container:card-header/inline-size}.col-start-2{grid-column-start:2}.row-span-2{grid-row:span 2/span 2}.row-start-1{grid-row-start:1}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.ml-auto{margin-left:auto}.flex{display:flex}.grid{display:grid}.inline{display:inline}.inline-flex{display:inline-flex}.size-5{width:calc(var(--spacing)*5);height:calc(var(--spacing)*5)}.w-70{width:calc(var(--spacing)*70)}.w-fit{width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.shrink-0{flex-shrink:0}.auto-rows-min{grid-auto-rows:min-content}.grid-rows-\[auto_auto\]{grid-template-rows:auto auto}.flex-col{flex-direction:column}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-center{justify-content:center}.gap-1{gap:calc(var(--spacing)*1)}.gap-1\.5{gap:calc(var(--spacing)*1.5)}.gap-2{gap:calc(var(--spacing)*2)}.gap-3{gap:calc(var(--spacing)*3)}.gap-6{gap:calc(var(--spacing)*6)}.self-start{align-self:flex-start}.justify-self-end{justify-self:flex-end}.overflow-hidden{overflow:hidden}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-none{border-radius:0}.rounded-xl{border-radius:calc(var(--radius) + 4px)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-border{border-color:var(--border)}.border-transparent{border-color:transparent}.bg-card{background-color:var(--card)}.bg-destructive{background-color:var(--destructive)}.bg-primary{background-color:var(--primary)}.bg-secondary{background-color:var(--secondary)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-6{padding-inline:calc(var(--spacing)*6)}.py-0\.5{padding-block:calc(var(--spacing)*.5)}.py-4{padding-block:calc(var(--spacing)*4)}.py-6{padding-block:calc(var(--spacing)*6)}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[11px\]{font-size:11px}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.whitespace-nowrap{white-space:nowrap}.text-card-foreground{color:var(--card-foreground)}.text-foreground{color:var(--foreground)}.text-muted-foreground{color:var(--muted-foreground)}.text-primary-foreground{color:var(--primary-foreground)}.text-secondary-foreground{color:var(--secondary-foreground)}.text-white{color:var(--color-white)}.shadow-none{--tw-shadow:0 0 transparent;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,rgba(0,0,0,.1)),0 1px 2px -1px var(--tw-shadow-color,rgba(0,0,0,.1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.transition-\[color\,box-shadow\]{transition-property:color,box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.running{animation-play-state:running}.has-data-\[slot\=card-action\]\:grid-cols-\[1fr_auto\]:has([data-slot=card-action]){grid-template-columns:1fr auto}.\[\.border-b\]\:pb-6.border-b{padding-bottom:calc(var(--spacing)*6)}.\[\.border-t\]\:pt-6.border-t{padding-top:calc(var(--spacing)*6)}.\[\&\>svg\]\:pointer-events-none>svg{pointer-events:none}.\[\&\>svg\]\:size-3>svg{width:calc(var(--spacing)*3);height:calc(var(--spacing)*3)}}@property --tw-animation-delay{syntax:"*";inherits:false;initial-value:0s}@property --tw-animation-direction{syntax:"*";inherits:false;initial-value:normal}@property --tw-animation-duration{syntax:"*";inherits:false}@property --tw-animation-fill-mode{syntax:"*";inherits:false;initial-value:none}@property --tw-animation-iteration-count{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-translate-y{syntax:"*";inherits:false;initial-value:0}:root{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;--radius:.625rem;--background:#1c1c1e;--foreground:#f2f2f7;--card:#1c1c1e;--card-foreground:#f2f2f7;--popover:#1c1c1e;--popover-foreground:#f2f2f7;--primary:#26ffb8;--primary-foreground:#000;--secondary:rgba(120,120,128,.16);--secondary-foreground:#f2f2f7;--muted:#2c2c2e;--muted-foreground:#98989f;--accent:rgba(118,118,128,.18);--accent-foreground:var(--foreground);--destructive:#ff453a;--border:rgba(84,84,88,.36);--input:rgba(84,84,88,.32);--ring:#26ffb8}.dark{--background:#1c1c1e;--foreground:#f2f2f7;--card:#1c1c1e;--card-foreground:#f2f2f7;--popover:#1c1c1e;--popover-foreground:#f2f2f7;--primary:#26ffb8;--primary-foreground:#000;--secondary:rgba(120,120,128,.16);--secondary-foreground:#f2f2f7;--muted:#2c2c2e;--muted-foreground:#98989f;--accent:rgba(118,118,128,.18);--accent-foreground:var(--foreground);--destructive:#ff453a;--border:rgba(84,84,88,.36);--input:rgba(84,84,88,.32);--ring:#26ffb8}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 transparent}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 transparent}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 transparent}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 transparent}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 transparent}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}
@@ -0,0 +1,16 @@
1
+ <!DOCTYPE html><html lang="en"><head>
2
+ <meta charset="utf-8">
3
+ <meta name="viewport" content="width=device-width, initial-scale=1">
4
+ <!-- Dark-only surface: signals the popup chrome up front so there is no
5
+ white flash before styles.css loads. The brand tokens live in
6
+ ./styles.css (synced with @extensiondev/ui), not inline here. -->
7
+ <meta name="color-scheme" content="dark">
8
+ <title>Extension.dev Live Preview</title>
9
+ <link rel="stylesheet" href="/action/index.css"></head>
10
+ <body>
11
+ <noscript>You need to enable JavaScript to run this extension.</noscript>
12
+ <div id="root"></div>
13
+
14
+ <script src="/action/index.js"></script>
15
+
16
+ </body></html>