mcp-use-compat 0.3.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.
- package/CHANGELOG.md +23 -0
- package/LICENSE +21 -0
- package/README.md +375 -0
- package/dist/checks/auth.d.ts +2 -0
- package/dist/checks/auth.d.ts.map +1 -0
- package/dist/checks/auth.js +229 -0
- package/dist/checks/auth.js.map +1 -0
- package/dist/checks/calls.d.ts +4 -0
- package/dist/checks/calls.d.ts.map +1 -0
- package/dist/checks/calls.js +192 -0
- package/dist/checks/calls.js.map +1 -0
- package/dist/checks/discovery.d.ts +3 -0
- package/dist/checks/discovery.d.ts.map +1 -0
- package/dist/checks/discovery.js +47 -0
- package/dist/checks/discovery.js.map +1 -0
- package/dist/checks/explanations.d.ts +15 -0
- package/dist/checks/explanations.d.ts.map +1 -0
- package/dist/checks/explanations.js +346 -0
- package/dist/checks/explanations.js.map +1 -0
- package/dist/checks/index.d.ts +3 -0
- package/dist/checks/index.d.ts.map +1 -0
- package/dist/checks/index.js +23 -0
- package/dist/checks/index.js.map +1 -0
- package/dist/checks/protocol.d.ts +5 -0
- package/dist/checks/protocol.d.ts.map +1 -0
- package/dist/checks/protocol.js +380 -0
- package/dist/checks/protocol.js.map +1 -0
- package/dist/checks/resources.d.ts +10 -0
- package/dist/checks/resources.d.ts.map +1 -0
- package/dist/checks/resources.js +144 -0
- package/dist/checks/resources.js.map +1 -0
- package/dist/checks/schema.d.ts +21 -0
- package/dist/checks/schema.d.ts.map +1 -0
- package/dist/checks/schema.js +412 -0
- package/dist/checks/schema.js.map +1 -0
- package/dist/checks/sdk.d.ts +10 -0
- package/dist/checks/sdk.d.ts.map +1 -0
- package/dist/checks/sdk.js +68 -0
- package/dist/checks/sdk.js.map +1 -0
- package/dist/checks/tools.d.ts +18 -0
- package/dist/checks/tools.d.ts.map +1 -0
- package/dist/checks/tools.js +422 -0
- package/dist/checks/tools.js.map +1 -0
- package/dist/checks/transport.d.ts +2 -0
- package/dist/checks/transport.d.ts.map +1 -0
- package/dist/checks/transport.js +123 -0
- package/dist/checks/transport.js.map +1 -0
- package/dist/checks/types.d.ts +37 -0
- package/dist/checks/types.d.ts.map +1 -0
- package/dist/checks/types.js +5 -0
- package/dist/checks/types.js.map +1 -0
- package/dist/checks/ui.d.ts +2 -0
- package/dist/checks/ui.d.ts.map +1 -0
- package/dist/checks/ui.js +207 -0
- package/dist/checks/ui.js.map +1 -0
- package/dist/checks/util.d.ts +20 -0
- package/dist/checks/util.d.ts.map +1 -0
- package/dist/checks/util.js +42 -0
- package/dist/checks/util.js.map +1 -0
- package/dist/cli.d.ts +110 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +317 -0
- package/dist/cli.js.map +1 -0
- package/dist/connect/calls.d.ts +13 -0
- package/dist/connect/calls.d.ts.map +1 -0
- package/dist/connect/calls.js +130 -0
- package/dist/connect/calls.js.map +1 -0
- package/dist/connect/http.d.ts +14 -0
- package/dist/connect/http.d.ts.map +1 -0
- package/dist/connect/http.js +122 -0
- package/dist/connect/http.js.map +1 -0
- package/dist/connect/index.d.ts +41 -0
- package/dist/connect/index.d.ts.map +1 -0
- package/dist/connect/index.js +168 -0
- package/dist/connect/index.js.map +1 -0
- package/dist/connect/lists.d.ts +12 -0
- package/dist/connect/lists.d.ts.map +1 -0
- package/dist/connect/lists.js +70 -0
- package/dist/connect/lists.js.map +1 -0
- package/dist/connect/modern.d.ts +13 -0
- package/dist/connect/modern.d.ts.map +1 -0
- package/dist/connect/modern.js +169 -0
- package/dist/connect/modern.js.map +1 -0
- package/dist/connect/session.d.ts +29 -0
- package/dist/connect/session.d.ts.map +1 -0
- package/dist/connect/session.js +96 -0
- package/dist/connect/session.js.map +1 -0
- package/dist/connect/stdio.d.ts +36 -0
- package/dist/connect/stdio.d.ts.map +1 -0
- package/dist/connect/stdio.js +127 -0
- package/dist/connect/stdio.js.map +1 -0
- package/dist/diff.d.ts +23 -0
- package/dist/diff.d.ts.map +1 -0
- package/dist/diff.js +255 -0
- package/dist/diff.js.map +1 -0
- package/dist/evaluate.d.ts +70 -0
- package/dist/evaluate.d.ts.map +1 -0
- package/dist/evaluate.js +104 -0
- package/dist/evaluate.js.map +1 -0
- package/dist/explain.d.ts +4 -0
- package/dist/explain.d.ts.map +1 -0
- package/dist/explain.js +46 -0
- package/dist/explain.js.map +1 -0
- package/dist/fix.d.ts +19 -0
- package/dist/fix.d.ts.map +1 -0
- package/dist/fix.js +116 -0
- package/dist/fix.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +54 -0
- package/dist/index.js.map +1 -0
- package/dist/oauth.d.ts +85 -0
- package/dist/oauth.d.ts.map +1 -0
- package/dist/oauth.js +287 -0
- package/dist/oauth.js.map +1 -0
- package/dist/policy.d.ts +29 -0
- package/dist/policy.d.ts.map +1 -0
- package/dist/policy.js +63 -0
- package/dist/policy.js.map +1 -0
- package/dist/profiles/chatgpt.d.ts +3 -0
- package/dist/profiles/chatgpt.d.ts.map +1 -0
- package/dist/profiles/chatgpt.js +29 -0
- package/dist/profiles/chatgpt.js.map +1 -0
- package/dist/profiles/claude-code.d.ts +3 -0
- package/dist/profiles/claude-code.d.ts.map +1 -0
- package/dist/profiles/claude-code.js +62 -0
- package/dist/profiles/claude-code.js.map +1 -0
- package/dist/profiles/claude-desktop.d.ts +3 -0
- package/dist/profiles/claude-desktop.d.ts.map +1 -0
- package/dist/profiles/claude-desktop.js +51 -0
- package/dist/profiles/claude-desktop.js.map +1 -0
- package/dist/profiles/cline.d.ts +4 -0
- package/dist/profiles/cline.d.ts.map +1 -0
- package/dist/profiles/cline.js +118 -0
- package/dist/profiles/cline.js.map +1 -0
- package/dist/profiles/codex.d.ts +4 -0
- package/dist/profiles/codex.d.ts.map +1 -0
- package/dist/profiles/codex.js +168 -0
- package/dist/profiles/codex.js.map +1 -0
- package/dist/profiles/continue.d.ts +4 -0
- package/dist/profiles/continue.d.ts.map +1 -0
- package/dist/profiles/continue.js +93 -0
- package/dist/profiles/continue.js.map +1 -0
- package/dist/profiles/cursor.d.ts +3 -0
- package/dist/profiles/cursor.d.ts.map +1 -0
- package/dist/profiles/cursor.js +52 -0
- package/dist/profiles/cursor.js.map +1 -0
- package/dist/profiles/gemini-cli.d.ts +4 -0
- package/dist/profiles/gemini-cli.d.ts.map +1 -0
- package/dist/profiles/gemini-cli.js +137 -0
- package/dist/profiles/gemini-cli.js.map +1 -0
- package/dist/profiles/goose.d.ts +4 -0
- package/dist/profiles/goose.d.ts.map +1 -0
- package/dist/profiles/goose.js +114 -0
- package/dist/profiles/goose.js.map +1 -0
- package/dist/profiles/index.d.ts +7 -0
- package/dist/profiles/index.d.ts.map +1 -0
- package/dist/profiles/index.js +43 -0
- package/dist/profiles/index.js.map +1 -0
- package/dist/profiles/opencode.d.ts +3 -0
- package/dist/profiles/opencode.d.ts.map +1 -0
- package/dist/profiles/opencode.js +47 -0
- package/dist/profiles/opencode.js.map +1 -0
- package/dist/profiles/types.d.ts +86 -0
- package/dist/profiles/types.d.ts.map +1 -0
- package/dist/profiles/types.js +2 -0
- package/dist/profiles/types.js.map +1 -0
- package/dist/profiles/vscode-copilot.d.ts +3 -0
- package/dist/profiles/vscode-copilot.d.ts.map +1 -0
- package/dist/profiles/vscode-copilot.js +71 -0
- package/dist/profiles/vscode-copilot.js.map +1 -0
- package/dist/profiles/windsurf.d.ts +4 -0
- package/dist/profiles/windsurf.d.ts.map +1 -0
- package/dist/profiles/windsurf.js +49 -0
- package/dist/profiles/windsurf.js.map +1 -0
- package/dist/project.d.ts +52 -0
- package/dist/project.d.ts.map +1 -0
- package/dist/project.js +291 -0
- package/dist/project.js.map +1 -0
- package/dist/reporters/escape.d.ts +7 -0
- package/dist/reporters/escape.d.ts.map +1 -0
- package/dist/reporters/escape.js +15 -0
- package/dist/reporters/escape.js.map +1 -0
- package/dist/reporters/github.d.ts +7 -0
- package/dist/reporters/github.d.ts.map +1 -0
- package/dist/reporters/github.js +19 -0
- package/dist/reporters/github.js.map +1 -0
- package/dist/reporters/index.d.ts +6 -0
- package/dist/reporters/index.d.ts.map +1 -0
- package/dist/reporters/index.js +10 -0
- package/dist/reporters/index.js.map +1 -0
- package/dist/reporters/json.d.ts +3 -0
- package/dist/reporters/json.d.ts.map +1 -0
- package/dist/reporters/json.js +4 -0
- package/dist/reporters/json.js.map +1 -0
- package/dist/reporters/markdown.d.ts +3 -0
- package/dist/reporters/markdown.d.ts.map +1 -0
- package/dist/reporters/markdown.js +98 -0
- package/dist/reporters/markdown.js.map +1 -0
- package/dist/run.d.ts +14 -0
- package/dist/run.d.ts.map +1 -0
- package/dist/run.js +163 -0
- package/dist/run.js.map +1 -0
- package/dist/sdk-facts.d.ts +27 -0
- package/dist/sdk-facts.d.ts.map +1 -0
- package/dist/sdk-facts.js +63 -0
- package/dist/sdk-facts.js.map +1 -0
- package/dist/snapshot.d.ts +189 -0
- package/dist/snapshot.d.ts.map +1 -0
- package/dist/snapshot.js +22 -0
- package/dist/snapshot.js.map +1 -0
- package/dist/ui.d.ts +18 -0
- package/dist/ui.d.ts.map +1 -0
- package/dist/ui.js +22 -0
- package/dist/ui.js.map +1 -0
- package/dist/upgrade.d.ts +12 -0
- package/dist/upgrade.d.ts.map +1 -0
- package/dist/upgrade.js +115 -0
- package/dist/upgrade.js.map +1 -0
- package/dist/version.d.ts +3 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +5 -0
- package/dist/version.js.map +1 -0
- package/package.json +65 -0
- package/schema/report.schema.json +327 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../src/checks/ui.ts"],"names":[],"mappings":"AAmDA,eAAO,MAAM,QAAQ,8BAyKpB,CAAC"}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import { linkedUiUris, MCP_APP_MIME, normalizeMime, SKYBRIDGE_MIME, uiLinks } from "../ui.js";
|
|
2
|
+
import { connected, featureGap, itemLabel, items, str } from "./util.js";
|
|
3
|
+
import { defineCheck } from "./types.js";
|
|
4
|
+
const SPEC = "https://github.com/modelcontextprotocol/ext-apps/blob/main/specification/2026-01-26/apps.mdx";
|
|
5
|
+
const uiTools = (s) => items(s, "tools").filter((t) => linkedUiUris(t).length > 0);
|
|
6
|
+
const uiResources = (s) => items(s, "resources").filter((r) => str(r.uri)?.startsWith("ui://") || isUiMime(str(r.mimeType)));
|
|
7
|
+
const isUiMime = (mime) => !!mime && [MCP_APP_MIME, SKYBRIDGE_MIME].includes(normalizeMime(mime));
|
|
8
|
+
const usesUi = (s) => connected(s) && (uiTools(s).length > 0 || uiResources(s).length > 0);
|
|
9
|
+
function mimeFinding(subject, mime, where) {
|
|
10
|
+
if (mime && normalizeMime(mime) === MCP_APP_MIME)
|
|
11
|
+
return undefined;
|
|
12
|
+
const legacy = mime && normalizeMime(mime) === SKYBRIDGE_MIME;
|
|
13
|
+
return {
|
|
14
|
+
checkId: "UI_RESOURCE_MIME",
|
|
15
|
+
severity: legacy ? "warn" : "error",
|
|
16
|
+
subject,
|
|
17
|
+
message: legacy
|
|
18
|
+
? `${where} uses the legacy ChatGPT type ${SKYBRIDGE_MIME}; MCP Apps hosts expect ${MCP_APP_MIME}.`
|
|
19
|
+
: `${where} has mimeType ${JSON.stringify(mime ?? null)}; MCP Apps require ${MCP_APP_MIME}, so hosts won't render it.`,
|
|
20
|
+
source: SPEC,
|
|
21
|
+
fix: `Serve UI resources with mimeType "${MCP_APP_MIME}" (the ext-apps SDK's RESOURCE_MIME_TYPE).`,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
const CSP_KEYS = ["connectDomains", "resourceDomains", "frameDomains", "baseUriDomains"];
|
|
25
|
+
const LOOPBACK = /^(https?:\/\/)?(localhost|127\.\d+\.\d+\.\d+|\[::1\]|0\.0\.0\.0)(:\d+)?(\/|$)/i;
|
|
26
|
+
function uiMeta(item) {
|
|
27
|
+
const meta = item._meta;
|
|
28
|
+
if (typeof meta !== "object" || meta === null)
|
|
29
|
+
return {};
|
|
30
|
+
const ui = meta.ui;
|
|
31
|
+
return typeof ui === "object" && ui !== null ? ui : {};
|
|
32
|
+
}
|
|
33
|
+
/** All CSP origins a UI resource declares, as [key, origin]. */
|
|
34
|
+
function cspOrigins(resource) {
|
|
35
|
+
const csp = uiMeta(resource).csp;
|
|
36
|
+
if (typeof csp !== "object" || csp === null)
|
|
37
|
+
return [];
|
|
38
|
+
return CSP_KEYS.flatMap((key) => {
|
|
39
|
+
const list = csp[key];
|
|
40
|
+
return Array.isArray(list) ? list.filter((o) => typeof o === "string").map((o) => [key, o]) : [];
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
const remoteTarget = (s) => s.target.kind === "http" && !LOOPBACK.test(s.target.url);
|
|
44
|
+
export const uiChecks = [
|
|
45
|
+
defineCheck({
|
|
46
|
+
id: "UI_RESOURCE_MIME",
|
|
47
|
+
area: "ui",
|
|
48
|
+
description: `UI resources use ${MCP_APP_MIME}`,
|
|
49
|
+
appliesTo: usesUi,
|
|
50
|
+
run: (s) => {
|
|
51
|
+
const findings = [];
|
|
52
|
+
const seen = new Set();
|
|
53
|
+
for (const r of uiResources(s)) {
|
|
54
|
+
const uri = itemLabel(r, "uri");
|
|
55
|
+
seen.add(uri);
|
|
56
|
+
const f = mimeFinding(uri, str(r.mimeType), "Listed UI resource");
|
|
57
|
+
if (f)
|
|
58
|
+
findings.push(f);
|
|
59
|
+
}
|
|
60
|
+
for (const [uri, read] of Object.entries(s.uiReads ?? {})) {
|
|
61
|
+
if (!read.ok || seen.has(uri))
|
|
62
|
+
continue;
|
|
63
|
+
const f = mimeFinding(uri, read.mimeType, "UI resource content");
|
|
64
|
+
if (f)
|
|
65
|
+
findings.push(f);
|
|
66
|
+
}
|
|
67
|
+
return findings;
|
|
68
|
+
},
|
|
69
|
+
}),
|
|
70
|
+
defineCheck({
|
|
71
|
+
id: "UI_RESOURCE_SCHEME",
|
|
72
|
+
area: "ui",
|
|
73
|
+
description: "UI resources use the ui:// scheme",
|
|
74
|
+
appliesTo: usesUi,
|
|
75
|
+
run: (s) => {
|
|
76
|
+
const uris = [
|
|
77
|
+
...uiResources(s).map((r) => str(r.uri)),
|
|
78
|
+
...uiTools(s).flatMap((t) => linkedUiUris(t)),
|
|
79
|
+
].filter((u) => !!u && !u.startsWith("ui://"));
|
|
80
|
+
return [...new Set(uris)].map((uri) => ({
|
|
81
|
+
checkId: "UI_RESOURCE_SCHEME",
|
|
82
|
+
severity: "error",
|
|
83
|
+
subject: uri,
|
|
84
|
+
message: "MCP Apps require UI resource URIs to use the ui:// scheme.",
|
|
85
|
+
source: SPEC,
|
|
86
|
+
fix: "Register the UI resource as ui://<app>/<view>.",
|
|
87
|
+
}));
|
|
88
|
+
},
|
|
89
|
+
}),
|
|
90
|
+
defineCheck({
|
|
91
|
+
id: "UI_TOOL_LINK_BROKEN",
|
|
92
|
+
area: "ui",
|
|
93
|
+
description: "UI resources that tools link to can be read",
|
|
94
|
+
appliesTo: (s) => connected(s) && !!s.uiReads,
|
|
95
|
+
run: (s) => uiTools(s).flatMap((t) => linkedUiUris(t)
|
|
96
|
+
.filter((uri) => s.uiReads?.[uri] && !s.uiReads[uri].ok)
|
|
97
|
+
.map((uri) => ({
|
|
98
|
+
checkId: "UI_TOOL_LINK_BROKEN",
|
|
99
|
+
severity: "error",
|
|
100
|
+
subject: itemLabel(t),
|
|
101
|
+
message: `Tool links to ${uri}, but resources/read failed: ${s.uiReads[uri].error}. Hosts show no UI.`,
|
|
102
|
+
fix: "Register the resource under exactly the URI the tool's _meta points to.",
|
|
103
|
+
}))),
|
|
104
|
+
}),
|
|
105
|
+
defineCheck({
|
|
106
|
+
id: "UI_TOOL_LINK_KEY",
|
|
107
|
+
area: "ui",
|
|
108
|
+
description: "Tools link UI with _meta.ui.resourceUri",
|
|
109
|
+
appliesTo: (s) => connected(s) && uiTools(s).length > 0,
|
|
110
|
+
run: (s) => uiTools(s).flatMap((t) => {
|
|
111
|
+
const links = uiLinks(t);
|
|
112
|
+
if (links.current)
|
|
113
|
+
return [];
|
|
114
|
+
const used = links.flat ? '_meta["ui/resourceUri"] (deprecated)' : '_meta["openai/outputTemplate"] (ChatGPT only)';
|
|
115
|
+
return [
|
|
116
|
+
{
|
|
117
|
+
checkId: "UI_TOOL_LINK_KEY",
|
|
118
|
+
severity: "warn",
|
|
119
|
+
subject: itemLabel(t),
|
|
120
|
+
message: `Tool links its UI only via ${used}. Hosts following MCP Apps (e.g. VS Code) read _meta.ui.resourceUri and show no UI.`,
|
|
121
|
+
source: SPEC,
|
|
122
|
+
fix: "Set _meta.ui.resourceUri (you can keep the old key too for older hosts).",
|
|
123
|
+
},
|
|
124
|
+
];
|
|
125
|
+
}),
|
|
126
|
+
}),
|
|
127
|
+
defineCheck({
|
|
128
|
+
id: "UI_CSP_LOCAL_ORIGIN",
|
|
129
|
+
area: "ui",
|
|
130
|
+
description: "A remote server's UI resources don't point their CSP at localhost",
|
|
131
|
+
appliesTo: (s) => usesUi(s) && remoteTarget(s),
|
|
132
|
+
run: (s) => uiResources(s).flatMap((r) => {
|
|
133
|
+
const local = cspOrigins(r).filter(([, origin]) => LOOPBACK.test(origin));
|
|
134
|
+
if (local.length === 0)
|
|
135
|
+
return [];
|
|
136
|
+
return [
|
|
137
|
+
{
|
|
138
|
+
checkId: "UI_CSP_LOCAL_ORIGIN",
|
|
139
|
+
severity: "warn",
|
|
140
|
+
subject: itemLabel(r, "uri"),
|
|
141
|
+
message: `CSP allows ${local.map(([k, o]) => `${o} (${k})`).join(", ")}, but the server is remote; in users' hosts the view would try to reach their own machine.`,
|
|
142
|
+
source: SPEC,
|
|
143
|
+
fix: "Derive CSP origins from the public server URL (or configure the production base URL) instead of the dev address.",
|
|
144
|
+
},
|
|
145
|
+
];
|
|
146
|
+
}),
|
|
147
|
+
}),
|
|
148
|
+
defineCheck({
|
|
149
|
+
id: "UI_CSP_INSECURE",
|
|
150
|
+
area: "ui",
|
|
151
|
+
description: "UI resource CSP origins use HTTPS",
|
|
152
|
+
appliesTo: usesUi,
|
|
153
|
+
run: (s) => uiResources(s).flatMap((r) => {
|
|
154
|
+
const insecure = cspOrigins(r).filter(([, o]) => /^http:\/\//i.test(o) && !LOOPBACK.test(o));
|
|
155
|
+
if (insecure.length === 0)
|
|
156
|
+
return [];
|
|
157
|
+
return [
|
|
158
|
+
{
|
|
159
|
+
checkId: "UI_CSP_INSECURE",
|
|
160
|
+
severity: "warn",
|
|
161
|
+
subject: itemLabel(r, "uri"),
|
|
162
|
+
message: `CSP allows plain-HTTP origins ${insecure.map(([, o]) => o).join(", ")}; hosts serve views over HTTPS and browsers block mixed content.`,
|
|
163
|
+
fix: "Use https:// origins.",
|
|
164
|
+
},
|
|
165
|
+
];
|
|
166
|
+
}),
|
|
167
|
+
}),
|
|
168
|
+
defineCheck({
|
|
169
|
+
id: "UI_VISIBILITY_INVALID",
|
|
170
|
+
area: "ui",
|
|
171
|
+
description: 'Tool _meta.ui.visibility only uses "model" and "app"',
|
|
172
|
+
appliesTo: (s) => connected(s) && uiTools(s).length > 0,
|
|
173
|
+
run: (s) => items(s, "tools").flatMap((t) => {
|
|
174
|
+
const visibility = uiMeta(t).visibility;
|
|
175
|
+
if (visibility === undefined)
|
|
176
|
+
return [];
|
|
177
|
+
const valid = Array.isArray(visibility) && visibility.length > 0 && visibility.every((v) => v === "model" || v === "app");
|
|
178
|
+
if (valid)
|
|
179
|
+
return [];
|
|
180
|
+
return [
|
|
181
|
+
{
|
|
182
|
+
checkId: "UI_VISIBILITY_INVALID",
|
|
183
|
+
severity: "error",
|
|
184
|
+
subject: itemLabel(t),
|
|
185
|
+
message: `_meta.ui.visibility is ${JSON.stringify(visibility)}; it must be a non-empty list of "model" and/or "app".`,
|
|
186
|
+
source: SPEC,
|
|
187
|
+
fix: 'Use ["model", "app"] (default), ["app"] for app-only tools, or omit it.',
|
|
188
|
+
},
|
|
189
|
+
];
|
|
190
|
+
}),
|
|
191
|
+
}),
|
|
192
|
+
defineCheck({
|
|
193
|
+
id: "UI_UNSUPPORTED",
|
|
194
|
+
area: "ui",
|
|
195
|
+
description: "Clients that don't render MCP Apps are flagged when tools rely on UI",
|
|
196
|
+
appliesTo: (s) => connected(s) && uiTools(s).length > 0,
|
|
197
|
+
run: (s, { profiles }) => featureGap(profiles, "uiResources", (p, partial) => ({
|
|
198
|
+
checkId: "UI_UNSUPPORTED",
|
|
199
|
+
severity: "warn",
|
|
200
|
+
message: partial
|
|
201
|
+
? `${uiTools(s).length} tool(s) return UI, but ${p.displayName} only partly renders MCP Apps; some users only get the text content.`
|
|
202
|
+
: `${uiTools(s).length} tool(s) return UI, but ${p.displayName} doesn't render MCP Apps; users only get the text content.`,
|
|
203
|
+
fix: "Make each UI tool's text content useful on its own.",
|
|
204
|
+
})),
|
|
205
|
+
}),
|
|
206
|
+
];
|
|
207
|
+
//# sourceMappingURL=ui.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/checks/ui.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { ClientFeature, ClientProfile } from "../profiles/types.js";
|
|
2
|
+
import type { ListKind, RawItem, ServerSnapshot } from "../snapshot.js";
|
|
3
|
+
import type { Finding } from "./types.js";
|
|
4
|
+
export declare const connected: (s: ServerSnapshot) => boolean;
|
|
5
|
+
export declare const isStdio: (s: ServerSnapshot) => boolean;
|
|
6
|
+
export declare const isHttp: (s: ServerSnapshot) => boolean;
|
|
7
|
+
export declare function items(s: ServerSnapshot, kind: ListKind): RawItem[];
|
|
8
|
+
export declare function declared(s: ServerSnapshot, capability: string): boolean;
|
|
9
|
+
/** Appends a sourced note as its own sentence: "Message. Note." */
|
|
10
|
+
export declare function withNote(message: string, note: string | undefined): string;
|
|
11
|
+
export declare function str(value: unknown): string | undefined;
|
|
12
|
+
export declare function isObject(value: unknown): value is Record<string, unknown>;
|
|
13
|
+
export declare function itemLabel(item: RawItem, fallbackKey?: string): string;
|
|
14
|
+
/**
|
|
15
|
+
* One finding per selected client known not to support `feature`, or to
|
|
16
|
+
* support it only partially. Used when the server uses a feature some
|
|
17
|
+
* clients ignore. The client's note is appended to the message.
|
|
18
|
+
*/
|
|
19
|
+
export declare function featureGap(profiles: ClientProfile[], feature: ClientFeature, make: (profile: ClientProfile, partial: boolean) => Omit<Finding, "client" | "source">): Finding[];
|
|
20
|
+
//# sourceMappingURL=util.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../src/checks/util.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACzE,OAAO,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACxE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C,eAAO,MAAM,SAAS,GAAI,GAAG,cAAc,KAAG,OAAuB,CAAC;AACtE,eAAO,MAAM,OAAO,GAAI,GAAG,cAAc,KAAG,OAAoC,CAAC;AACjF,eAAO,MAAM,MAAM,GAAI,GAAG,cAAc,KAAG,OAAmC,CAAC;AAE/E,wBAAgB,KAAK,CAAC,CAAC,EAAE,cAAc,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,EAAE,CAGlE;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAGvE;AAED,mEAAmE;AACnE,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAI1E;AAED,wBAAgB,GAAG,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAEtD;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzE;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,SAAS,GAAG,MAAM,CAErE;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CACxB,QAAQ,EAAE,aAAa,EAAE,EACzB,OAAO,EAAE,aAAa,EACtB,IAAI,EAAE,CAAC,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC,OAAO,EAAE,QAAQ,GAAG,QAAQ,CAAC,GACrF,OAAO,EAAE,CAOX"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export const connected = (s) => s.connect.ok;
|
|
2
|
+
export const isStdio = (s) => s.target.kind === "stdio";
|
|
3
|
+
export const isHttp = (s) => s.target.kind === "http";
|
|
4
|
+
export function items(s, kind) {
|
|
5
|
+
const list = s.lists[kind];
|
|
6
|
+
return list?.ok ? list.items : [];
|
|
7
|
+
}
|
|
8
|
+
export function declared(s, capability) {
|
|
9
|
+
const caps = s.initialize?.capabilities ?? {};
|
|
10
|
+
return caps[capability] !== undefined && caps[capability] !== null;
|
|
11
|
+
}
|
|
12
|
+
/** Appends a sourced note as its own sentence: "Message. Note." */
|
|
13
|
+
export function withNote(message, note) {
|
|
14
|
+
if (!note)
|
|
15
|
+
return message;
|
|
16
|
+
const end = (t) => (/[.!?)]$/.test(t) ? t : `${t}.`);
|
|
17
|
+
return `${end(message)} ${end(note.charAt(0).toUpperCase() + note.slice(1))}`;
|
|
18
|
+
}
|
|
19
|
+
export function str(value) {
|
|
20
|
+
return typeof value === "string" ? value : undefined;
|
|
21
|
+
}
|
|
22
|
+
export function isObject(value) {
|
|
23
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
24
|
+
}
|
|
25
|
+
export function itemLabel(item, fallbackKey = "name") {
|
|
26
|
+
return str(item[fallbackKey]) ?? str(item.uri) ?? str(item.uriTemplate) ?? "(unnamed)";
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* One finding per selected client known not to support `feature`, or to
|
|
30
|
+
* support it only partially. Used when the server uses a feature some
|
|
31
|
+
* clients ignore. The client's note is appended to the message.
|
|
32
|
+
*/
|
|
33
|
+
export function featureGap(profiles, feature, make) {
|
|
34
|
+
return profiles.flatMap((p) => {
|
|
35
|
+
const support = p.supports[feature];
|
|
36
|
+
if (!support || support.value === true)
|
|
37
|
+
return [];
|
|
38
|
+
const finding = make(p, support.value === "partial");
|
|
39
|
+
return [{ ...finding, message: withNote(finding.message, support.note), client: p.id, source: support.source }];
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=util.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/checks/util.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAiB,EAAW,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;AACtE,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,CAAiB,EAAW,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC;AACjF,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,CAAiB,EAAW,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC;AAE/E,MAAM,UAAU,KAAK,CAAC,CAAiB,EAAE,IAAc;IACrD,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3B,OAAO,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,CAAiB,EAAE,UAAkB;IAC5D,MAAM,IAAI,GAAG,CAAC,CAAC,UAAU,EAAE,YAAY,IAAI,EAAE,CAAC;IAC9C,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,SAAS,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC;AACrE,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,QAAQ,CAAC,OAAe,EAAE,IAAwB;IAChE,IAAI,CAAC,IAAI;QAAE,OAAO,OAAO,CAAC;IAC1B,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7D,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAChF,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,KAAc;IAChC,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAa,EAAE,WAAW,GAAG,MAAM;IAC3D,OAAO,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,WAAW,CAAC;AACzF,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CACxB,QAAyB,EACzB,OAAsB,EACtB,IAAsF;IAEtF,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;QAC5B,MAAM,OAAO,GAAG,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACpC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,KAAK,KAAK,IAAI;YAAE,OAAO,EAAE,CAAC;QAClD,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC;QACrD,OAAO,CAAC,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAClH,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { Command, CommanderError } from "commander";
|
|
2
|
+
import type { ConnectTarget } from "./connect/index.js";
|
|
3
|
+
export type OutputFormat = "md" | "json" | "github";
|
|
4
|
+
/** Options shared by every command that talks to a server. */
|
|
5
|
+
export interface TargetOptions {
|
|
6
|
+
target?: ConnectTarget;
|
|
7
|
+
fromSnapshot?: string;
|
|
8
|
+
timeoutMs: number;
|
|
9
|
+
authProbe: boolean;
|
|
10
|
+
/** Use stored OAuth credentials (from `oauth login`) for --url. */
|
|
11
|
+
oauth?: boolean;
|
|
12
|
+
/** Skip registry lookups for the server's SDK versions. */
|
|
13
|
+
offline?: boolean;
|
|
14
|
+
}
|
|
15
|
+
export interface OAuthLoginOptions {
|
|
16
|
+
url: string;
|
|
17
|
+
callbackPort: number;
|
|
18
|
+
clientId?: string;
|
|
19
|
+
clientSecret?: string;
|
|
20
|
+
clientMetadataUrl?: string;
|
|
21
|
+
scope?: string;
|
|
22
|
+
openBrowser: boolean;
|
|
23
|
+
timeoutMs: number;
|
|
24
|
+
}
|
|
25
|
+
export interface RunOptions extends TargetOptions {
|
|
26
|
+
saveSnapshot?: string;
|
|
27
|
+
versionMatrix: boolean;
|
|
28
|
+
probeCalls: boolean;
|
|
29
|
+
clients?: string[];
|
|
30
|
+
format: OutputFormat;
|
|
31
|
+
out?: string;
|
|
32
|
+
failOn: string;
|
|
33
|
+
listChecks: boolean;
|
|
34
|
+
listClients: boolean;
|
|
35
|
+
}
|
|
36
|
+
export interface DiffOptions {
|
|
37
|
+
before: string;
|
|
38
|
+
after: string;
|
|
39
|
+
format: Exclude<OutputFormat, "github"> | "github";
|
|
40
|
+
out?: string;
|
|
41
|
+
failOn: "breaking" | "any" | "none";
|
|
42
|
+
}
|
|
43
|
+
export interface CallOptions extends TargetOptions {
|
|
44
|
+
tool: string;
|
|
45
|
+
args: Record<string, unknown>;
|
|
46
|
+
format: "md" | "json";
|
|
47
|
+
}
|
|
48
|
+
export interface UpgradeOptions {
|
|
49
|
+
/** Server command after --; enables before/after checks with --apply. */
|
|
50
|
+
target?: ConnectTarget;
|
|
51
|
+
/** Project directory when no server command is given. */
|
|
52
|
+
dir: string;
|
|
53
|
+
apply: boolean;
|
|
54
|
+
major: boolean;
|
|
55
|
+
offline: boolean;
|
|
56
|
+
timeoutMs: number;
|
|
57
|
+
/** Runs a shell command; tests replace it. */
|
|
58
|
+
run?: (command: string, cwd: string) => Promise<number>;
|
|
59
|
+
}
|
|
60
|
+
export interface FixOptions {
|
|
61
|
+
input: string;
|
|
62
|
+
out?: string;
|
|
63
|
+
format: "json" | "summary";
|
|
64
|
+
rename: boolean;
|
|
65
|
+
}
|
|
66
|
+
export type Invocation = {
|
|
67
|
+
command: "check";
|
|
68
|
+
options: RunOptions;
|
|
69
|
+
} | {
|
|
70
|
+
command: "call";
|
|
71
|
+
options: CallOptions;
|
|
72
|
+
} | {
|
|
73
|
+
command: "diff";
|
|
74
|
+
options: DiffOptions;
|
|
75
|
+
} | {
|
|
76
|
+
command: "explain";
|
|
77
|
+
checkId: string;
|
|
78
|
+
} | {
|
|
79
|
+
command: "fix";
|
|
80
|
+
options: FixOptions;
|
|
81
|
+
} | {
|
|
82
|
+
command: "upgrade";
|
|
83
|
+
options: UpgradeOptions;
|
|
84
|
+
} | {
|
|
85
|
+
command: "oauth-login";
|
|
86
|
+
options: OAuthLoginOptions;
|
|
87
|
+
} | {
|
|
88
|
+
command: "oauth-status";
|
|
89
|
+
} | {
|
|
90
|
+
command: "oauth-logout";
|
|
91
|
+
url: string;
|
|
92
|
+
} | {
|
|
93
|
+
command: "list-checks";
|
|
94
|
+
} | {
|
|
95
|
+
command: "list-clients";
|
|
96
|
+
};
|
|
97
|
+
export declare class UsageError extends Error {
|
|
98
|
+
}
|
|
99
|
+
type Warn = (msg: string) => void;
|
|
100
|
+
/** Parses the full command line into one invocation. `check` is the default command. */
|
|
101
|
+
export declare function parseCommandLine(argv: string[], warn?: Warn): Invocation;
|
|
102
|
+
/** Back-compat entry point for the default command; throws if argv selects another command. */
|
|
103
|
+
export declare function parseArgs(argv: string[], warn?: Warn): RunOptions;
|
|
104
|
+
/** Adds --url/--from-snapshot/--env/--header/--cwd/--timeout/--no-auth-probe. */
|
|
105
|
+
export declare function addTargetOptions(cmd: Command): Command;
|
|
106
|
+
/** Turns the shared target options plus the positional command into a TargetOptions. */
|
|
107
|
+
export declare function resolveTarget(command: string[], opts: Record<string, unknown>, warn: Warn): TargetOptions;
|
|
108
|
+
export declare function isCommanderExit(err: unknown): err is CommanderError;
|
|
109
|
+
export {};
|
|
110
|
+
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,cAAc,EAAwB,MAAM,WAAW,CAAC;AAC1E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGxD,MAAM,MAAM,YAAY,GAAG,IAAI,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEpD,8DAA8D;AAC9D,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,mEAAmE;IACnE,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,2DAA2D;IAC3D,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAW,SAAQ,aAAa;IAC/C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,OAAO,CAAC;IACvB,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,YAAY,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,CAAC,YAAY,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC;IACnD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,UAAU,GAAG,KAAK,GAAG,MAAM,CAAC;CACrC;AAED,MAAM,WAAW,WAAY,SAAQ,aAAa;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,MAAM,EAAE,IAAI,GAAG,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,yEAAyE;IACzE,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,yDAAyD;IACzD,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,8CAA8C;IAC9C,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CACzD;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,MAAM,UAAU,GAClB;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,UAAU,CAAA;CAAE,GACzC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,WAAW,CAAA;CAAE,GACzC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,WAAW,CAAA;CAAE,GACzC;IAAE,OAAO,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACvC;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,UAAU,CAAA;CAAE,GACvC;IAAE,OAAO,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,cAAc,CAAA;CAAE,GAC/C;IAAE,OAAO,EAAE,aAAa,CAAC;IAAC,OAAO,EAAE,iBAAiB,CAAA;CAAE,GACtD;IAAE,OAAO,EAAE,cAAc,CAAA;CAAE,GAC3B;IAAE,OAAO,EAAE,cAAc,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GACxC;IAAE,OAAO,EAAE,aAAa,CAAA;CAAE,GAC1B;IAAE,OAAO,EAAE,cAAc,CAAA;CAAE,CAAC;AAEhC,qBAAa,UAAW,SAAQ,KAAK;CAAG;AAExC,KAAK,IAAI,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;AAElC,wFAAwF;AACxF,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,GAAE,IAAoB,GAAG,UAAU,CA8LvF;AAED,+FAA+F;AAC/F,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,GAAE,IAAoB,GAAG,UAAU,CAgBhF;AAED,iFAAiF;AACjF,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAWtD;AAED,wFAAwF;AACxF,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,GAAG,aAAa,CAiCzG;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,cAAc,CAEnE"}
|