vskill 1.2.4 → 1.2.7
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/README.md +51 -3
- package/agents.json +6 -1
- package/dist/agents/agents-registry.d.ts +43 -16
- package/dist/agents/agents-registry.js +119 -33
- package/dist/agents/agents-registry.js.map +1 -1
- package/dist/agents/global-dirs.d.ts +19 -0
- package/dist/agents/global-dirs.js +53 -0
- package/dist/agents/global-dirs.js.map +1 -0
- package/dist/audit/fix-suggestions.js +6 -0
- package/dist/audit/fix-suggestions.js.map +1 -1
- package/dist/commands/add-github-bundle.d.ts +29 -0
- package/dist/commands/add-github-bundle.js +135 -0
- package/dist/commands/add-github-bundle.js.map +1 -0
- package/dist/commands/add-lockfile.d.ts +2 -0
- package/dist/commands/add-lockfile.js +1 -1
- package/dist/commands/add-lockfile.js.map +1 -1
- package/dist/commands/add.d.ts +5 -7
- package/dist/commands/add.js +207 -111
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/audit-webmcp.d.ts +25 -0
- package/dist/commands/audit-webmcp.js +167 -0
- package/dist/commands/audit-webmcp.js.map +1 -0
- package/dist/commands/doctor.d.ts +69 -0
- package/dist/commands/doctor.js +760 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/remove.js +43 -8
- package/dist/commands/remove.js.map +1 -1
- package/dist/commands/scan.js +1 -1
- package/dist/commands/scan.js.map +1 -1
- package/dist/commands/update.js +12 -4
- package/dist/commands/update.js.map +1 -1
- package/dist/discovery/github-skill-bundle.d.ts +74 -0
- package/dist/discovery/github-skill-bundle.js +323 -0
- package/dist/discovery/github-skill-bundle.js.map +1 -0
- package/dist/eval/skill-scanner.js +7 -1
- package/dist/eval/skill-scanner.js.map +1 -1
- package/dist/eval-server/install-skill-routes.js +10 -3
- package/dist/eval-server/install-skill-routes.js.map +1 -1
- package/dist/eval-server/remove-skill-routes.js +262 -29
- package/dist/eval-server/remove-skill-routes.js.map +1 -1
- package/dist/eval-server/studio-privacy.js +2 -3
- package/dist/eval-server/studio-privacy.js.map +1 -1
- package/dist/eval-server/utils/scan-install-locations.js +22 -3
- package/dist/eval-server/utils/scan-install-locations.js.map +1 -1
- package/dist/eval-ui/assets/{CreateSkillPage-BUrgworx.js → CreateSkillPage-CXDd6gDN.js} +1 -1
- package/dist/eval-ui/assets/{FindSkillsPalette-BstJ22TI.js → FindSkillsPalette-DQ6uGhFP.js} +2 -2
- package/dist/eval-ui/assets/{SearchPaletteCore-Dagnc-E7.js → SearchPaletteCore-DpHCf0mf.js} +1 -1
- package/dist/eval-ui/assets/{SkillDetailPanel-DnujVk6g.js → SkillDetailPanel-BjHFjGxg.js} +1 -1
- package/dist/eval-ui/assets/{UpdateDropdown-B7D2vXrm.js → UpdateDropdown-Cn4Vsq5d.js} +1 -1
- package/dist/eval-ui/assets/main-BmB7Zj9I.js +86 -0
- package/dist/eval-ui/index.html +1 -1
- package/dist/index.js +34 -0
- package/dist/index.js.map +1 -1
- package/dist/installer/bundle-files.d.ts +39 -2
- package/dist/installer/bundle-files.js +80 -10
- package/dist/installer/bundle-files.js.map +1 -1
- package/dist/installer/canonical.d.ts +39 -4
- package/dist/installer/canonical.js +178 -24
- package/dist/installer/canonical.js.map +1 -1
- package/dist/installer/multi-install.d.ts +11 -2
- package/dist/installer/multi-install.js +41 -9
- package/dist/installer/multi-install.js.map +1 -1
- package/dist/installer/transformers/index.d.ts +8 -0
- package/dist/installer/yaml-safe-mutate.js +48 -2
- package/dist/installer/yaml-safe-mutate.js.map +1 -1
- package/dist/lib/github-fetch.js +2 -0
- package/dist/lib/github-fetch.js.map +1 -1
- package/dist/lib/private-source.d.ts +8 -0
- package/dist/lib/private-source.js +16 -2
- package/dist/lib/private-source.js.map +1 -1
- package/dist/scanner/hidden-content.d.ts +47 -0
- package/dist/scanner/hidden-content.js +904 -0
- package/dist/scanner/hidden-content.js.map +1 -0
- package/dist/scanner/installer-hosts.d.ts +26 -0
- package/dist/scanner/installer-hosts.js +92 -0
- package/dist/scanner/installer-hosts.js.map +1 -0
- package/dist/scanner/judge-guard.d.ts +119 -0
- package/dist/scanner/judge-guard.js +481 -0
- package/dist/scanner/judge-guard.js.map +1 -0
- package/dist/scanner/patterns.d.ts +12 -0
- package/dist/scanner/patterns.js +353 -113
- package/dist/scanner/patterns.js.map +1 -1
- package/dist/scanner/repo-scanner.d.ts +4 -0
- package/dist/scanner/repo-scanner.js +4 -1
- package/dist/scanner/repo-scanner.js.map +1 -1
- package/dist/scanner/tier1.js +37 -7
- package/dist/scanner/tier1.js.map +1 -1
- package/dist/scanner/tier2-llm.d.ts +22 -4
- package/dist/scanner/tier2-llm.js +163 -23
- package/dist/scanner/tier2-llm.js.map +1 -1
- package/dist/scanner/types.d.ts +8 -0
- package/dist/webmcp/args.d.ts +34 -0
- package/dist/webmcp/args.js +87 -0
- package/dist/webmcp/args.js.map +1 -0
- package/dist/webmcp/attribution.d.ts +38 -0
- package/dist/webmcp/attribution.js +141 -0
- package/dist/webmcp/attribution.js.map +1 -0
- package/dist/webmcp/enumerate.d.ts +81 -0
- package/dist/webmcp/enumerate.js +436 -0
- package/dist/webmcp/enumerate.js.map +1 -0
- package/dist/webmcp/format.d.ts +9 -0
- package/dist/webmcp/format.js +105 -0
- package/dist/webmcp/format.js.map +1 -0
- package/dist/webmcp/merge.d.ts +49 -0
- package/dist/webmcp/merge.js +167 -0
- package/dist/webmcp/merge.js.map +1 -0
- package/dist/webmcp/score.d.ts +70 -0
- package/dist/webmcp/score.js +586 -0
- package/dist/webmcp/score.js.map +1 -0
- package/dist/webmcp/types.d.ts +92 -0
- package/dist/webmcp/types.js +8 -0
- package/dist/webmcp/types.js.map +1 -0
- package/package.json +1 -1
- package/dist/eval-ui/assets/main-DjA5gpjV.js +0 -86
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// vskill audit-webmcp -- merge the three enumeration sources by tool name.
|
|
3
|
+
//
|
|
4
|
+
// capture our init script wraps document.modelContext.registerTool and
|
|
5
|
+
// records the raw descriptor plus the calling script URL
|
|
6
|
+
// cdp WebMCP.toolsAdded / toolsRemoved events (annotations arrive as
|
|
7
|
+
// readOnly / untrustedContent)
|
|
8
|
+
// getTools document.modelContext.getTools() after the page settles
|
|
9
|
+
// (inputSchema arrives as a JSON string)
|
|
10
|
+
//
|
|
11
|
+
// Chrome 153 drops consequentialHint from both getTools() and CDP, so the
|
|
12
|
+
// captured descriptor is the only place it survives. Pure module: no browser.
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
import { classifyRegistrar } from "./attribution.js";
|
|
15
|
+
import { originOf, parseSchema } from "./score.js";
|
|
16
|
+
function bool(v) {
|
|
17
|
+
return typeof v === "boolean" ? v : undefined;
|
|
18
|
+
}
|
|
19
|
+
/** Map readOnly/readOnlyHint, consequential/consequentialHint, untrustedContent/untrustedContentHint. */
|
|
20
|
+
export function normalizeAnnotations(raw) {
|
|
21
|
+
if (typeof raw !== "object" || raw === null)
|
|
22
|
+
return {};
|
|
23
|
+
const r = raw;
|
|
24
|
+
const out = {};
|
|
25
|
+
const readOnly = bool(r.readOnlyHint) ?? bool(r.readOnly);
|
|
26
|
+
const consequential = bool(r.consequentialHint) ?? bool(r.consequential);
|
|
27
|
+
const untrusted = bool(r.untrustedContentHint) ?? bool(r.untrustedContent);
|
|
28
|
+
if (readOnly !== undefined)
|
|
29
|
+
out.readOnlyHint = readOnly;
|
|
30
|
+
if (consequential !== undefined)
|
|
31
|
+
out.consequentialHint = consequential;
|
|
32
|
+
if (untrusted !== undefined)
|
|
33
|
+
out.untrustedContentHint = untrusted;
|
|
34
|
+
return out;
|
|
35
|
+
}
|
|
36
|
+
function nonEmpty(s) {
|
|
37
|
+
return typeof s === "string" && s.length > 0 ? s : undefined;
|
|
38
|
+
}
|
|
39
|
+
function stringList(v) {
|
|
40
|
+
if (typeof v === "string" && v)
|
|
41
|
+
return [v];
|
|
42
|
+
if (Array.isArray(v)) {
|
|
43
|
+
const xs = v.filter((x) => typeof x === "string" && x.length > 0);
|
|
44
|
+
return xs.length ? xs : undefined;
|
|
45
|
+
}
|
|
46
|
+
return undefined;
|
|
47
|
+
}
|
|
48
|
+
/** First http(s) frame in a CDP stack trace. */
|
|
49
|
+
export function cdpRegistrar(t) {
|
|
50
|
+
for (const f of t.stackTrace?.callFrames ?? []) {
|
|
51
|
+
if (f.url && originOf(f.url))
|
|
52
|
+
return f.url;
|
|
53
|
+
}
|
|
54
|
+
return undefined;
|
|
55
|
+
}
|
|
56
|
+
/** First http(s) URL in a V8 Error().stack that is not our probe script. */
|
|
57
|
+
export function scriptUrlFromStack(stack, probeName = "vskill-webmcp-probe") {
|
|
58
|
+
if (!stack)
|
|
59
|
+
return null;
|
|
60
|
+
for (const line of stack.split("\n")) {
|
|
61
|
+
if (line.includes(probeName))
|
|
62
|
+
continue;
|
|
63
|
+
const m = /(https?:\/\/[^\s)]+?):\d+(?::\d+)?\)?\s*$/.exec(line.trim());
|
|
64
|
+
if (m)
|
|
65
|
+
return m[1];
|
|
66
|
+
}
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
function normalizeSchema(raw) {
|
|
70
|
+
if (raw === undefined || raw === null || raw === "")
|
|
71
|
+
return undefined;
|
|
72
|
+
const p = parseSchema(raw);
|
|
73
|
+
return p.ok ? p.value : raw;
|
|
74
|
+
}
|
|
75
|
+
export function mergeTools(input) {
|
|
76
|
+
// Latest event per name wins (a tool can be removed and re-registered).
|
|
77
|
+
const cdpLive = new Map();
|
|
78
|
+
for (const t of input.cdp) {
|
|
79
|
+
if (t.removed)
|
|
80
|
+
cdpLive.delete(t.name);
|
|
81
|
+
else
|
|
82
|
+
cdpLive.set(t.name, t);
|
|
83
|
+
}
|
|
84
|
+
const captured = new Map();
|
|
85
|
+
for (const t of input.captured) {
|
|
86
|
+
if (t.unregistered)
|
|
87
|
+
captured.delete(t.name);
|
|
88
|
+
else
|
|
89
|
+
captured.set(t.name, t);
|
|
90
|
+
}
|
|
91
|
+
// Keep the registering script even if the descriptor was later replaced.
|
|
92
|
+
const firstScript = new Map();
|
|
93
|
+
for (const t of input.captured) {
|
|
94
|
+
if (t.scriptUrl && !firstScript.has(t.name))
|
|
95
|
+
firstScript.set(t.name, t.scriptUrl);
|
|
96
|
+
}
|
|
97
|
+
const listed = new Map();
|
|
98
|
+
for (const t of input.listed ?? [])
|
|
99
|
+
listed.set(t.name, t);
|
|
100
|
+
const names = [];
|
|
101
|
+
const add = (n) => {
|
|
102
|
+
if (n && !names.includes(n))
|
|
103
|
+
names.push(n);
|
|
104
|
+
};
|
|
105
|
+
if (input.listed !== null) {
|
|
106
|
+
for (const n of listed.keys())
|
|
107
|
+
add(n);
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
for (const n of captured.keys())
|
|
111
|
+
add(n);
|
|
112
|
+
}
|
|
113
|
+
for (const n of cdpLive.keys())
|
|
114
|
+
add(n);
|
|
115
|
+
return names.map((name) => {
|
|
116
|
+
const c = captured.get(name);
|
|
117
|
+
const d = cdpLive.get(name);
|
|
118
|
+
const l = listed.get(name);
|
|
119
|
+
const sources = [];
|
|
120
|
+
if (c)
|
|
121
|
+
sources.push("registerTool");
|
|
122
|
+
if (d)
|
|
123
|
+
sources.push("cdp");
|
|
124
|
+
if (l)
|
|
125
|
+
sources.push("getTools");
|
|
126
|
+
const ac = normalizeAnnotations(c?.annotations);
|
|
127
|
+
const al = normalizeAnnotations(l?.annotations);
|
|
128
|
+
const ad = normalizeAnnotations(d?.annotations);
|
|
129
|
+
const annotations = {};
|
|
130
|
+
for (const k of ["readOnlyHint", "consequentialHint", "untrustedContentHint"]) {
|
|
131
|
+
const v = ac[k] ?? al[k] ?? ad[k];
|
|
132
|
+
if (v !== undefined)
|
|
133
|
+
annotations[k] = v;
|
|
134
|
+
}
|
|
135
|
+
const registeredBy = firstScript.get(name) ?? c?.scriptUrl ?? (d ? cdpRegistrar(d) : undefined) ?? undefined;
|
|
136
|
+
const attribution = classifyRegistrar(registeredBy, input.pageUrl, input.platforms);
|
|
137
|
+
const tool = {
|
|
138
|
+
name,
|
|
139
|
+
annotations,
|
|
140
|
+
thirdParty: attribution?.kind === "third-party",
|
|
141
|
+
sources,
|
|
142
|
+
};
|
|
143
|
+
const title = nonEmpty(l?.title) ?? nonEmpty(c?.title) ?? nonEmpty(d?.title);
|
|
144
|
+
if (title)
|
|
145
|
+
tool.title = title;
|
|
146
|
+
const description = nonEmpty(l?.description) ?? nonEmpty(c?.description) ?? nonEmpty(d?.description);
|
|
147
|
+
if (description)
|
|
148
|
+
tool.description = description;
|
|
149
|
+
const schema = normalizeSchema(l?.inputSchema) ?? normalizeSchema(c?.inputSchema) ?? normalizeSchema(d?.inputSchema);
|
|
150
|
+
if (schema !== undefined)
|
|
151
|
+
tool.inputSchema = schema;
|
|
152
|
+
if (registeredBy)
|
|
153
|
+
tool.registeredBy = registeredBy;
|
|
154
|
+
if (attribution) {
|
|
155
|
+
tool.registeredByKind = attribution.kind;
|
|
156
|
+
if (attribution.platform)
|
|
157
|
+
tool.registeredByPlatform = attribution.platform;
|
|
158
|
+
if (attribution.package)
|
|
159
|
+
tool.registeredByPackage = attribution.package;
|
|
160
|
+
}
|
|
161
|
+
const exposedTo = stringList(c?.exposedTo) ?? stringList(l?.exposedTo);
|
|
162
|
+
if (exposedTo)
|
|
163
|
+
tool.exposedTo = exposedTo;
|
|
164
|
+
return tool;
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=merge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge.js","sourceRoot":"","sources":["../../src/webmcp/merge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { type ScanVerdict } from "../scanner/patterns.js";
|
|
2
|
+
import { type EnumerationResult, type Severity, type SiteReport, type SiteSummary, type WebmcpFinding, type WebmcpTool } from "./types.js";
|
|
3
|
+
export declare const MAX_DESCRIPTION_CHARS = 500;
|
|
4
|
+
export declare const MAX_TOOLS_PER_PAGE = 40;
|
|
5
|
+
/** Split a tool name into lowercase words: "proceedToCheckout" -> [proceed, to, checkout]. */
|
|
6
|
+
export declare function tokenizeName(name: string): string[];
|
|
7
|
+
export declare function severityRank(s: Severity): number;
|
|
8
|
+
/** True when `s` is at or above `threshold` (critical is highest). */
|
|
9
|
+
export declare function atOrAbove(s: Severity, threshold: Severity): boolean;
|
|
10
|
+
export declare function originOf(url: string | undefined | null): string | null;
|
|
11
|
+
/**
|
|
12
|
+
* Approximate registrable domain ("site") of a URL: www.shop.example and
|
|
13
|
+
* cdn.shop.example share one. A heuristic without the full Public Suffix
|
|
14
|
+
* List: two-letter ccTLD second levels and common shared hosts are handled.
|
|
15
|
+
*/
|
|
16
|
+
export declare function siteOf(url: string | undefined | null): string | null;
|
|
17
|
+
/** Parse a schema that may arrive as a JSON string (Chrome's getTools does this). */
|
|
18
|
+
export declare function parseSchema(raw: unknown): {
|
|
19
|
+
ok: boolean;
|
|
20
|
+
value: unknown;
|
|
21
|
+
};
|
|
22
|
+
interface SchemaParam {
|
|
23
|
+
path: string;
|
|
24
|
+
key: string;
|
|
25
|
+
description?: string;
|
|
26
|
+
}
|
|
27
|
+
/** Walk object properties (nested objects and array items) of a JSON Schema. */
|
|
28
|
+
export declare function schemaParams(schema: unknown, prefix?: string, depth?: number): SchemaParam[];
|
|
29
|
+
export type WriteTier = "high" | "medium" | "low";
|
|
30
|
+
export interface WriteShape {
|
|
31
|
+
tier: WriteTier;
|
|
32
|
+
reason: string;
|
|
33
|
+
}
|
|
34
|
+
/** Does the tool look like it changes state (buys, deletes, sends, books ...)? */
|
|
35
|
+
export declare function classifyWriteShape(tool: Pick<WebmcpTool, "name" | "description">): WriteShape | null;
|
|
36
|
+
interface PoisonPattern {
|
|
37
|
+
id: string;
|
|
38
|
+
name: string;
|
|
39
|
+
severity: Severity;
|
|
40
|
+
re: RegExp;
|
|
41
|
+
}
|
|
42
|
+
/** WebMCP-specific tool-poisoning shapes not covered by scanContent. */
|
|
43
|
+
export declare const POISON_PATTERNS: PoisonPattern[];
|
|
44
|
+
/**
|
|
45
|
+
* Remove invisible characters that real text needs before WP-05 runs:
|
|
46
|
+
* emoji ZWJ sequences, subdivision flags (tag characters), ZWJ/ZWNJ in
|
|
47
|
+
* scripts that use them for shaping, LRM/RLM in right-to-left text, and a
|
|
48
|
+
* leading BOM.
|
|
49
|
+
*/
|
|
50
|
+
export declare function stripBenignInvisibles(text: string): string;
|
|
51
|
+
export declare function scoreTool(tool: WebmcpTool): WebmcpFinding[];
|
|
52
|
+
export declare function scorePage(input: Pick<EnumerationResult, "tools" | "permissionsPolicy">): WebmcpFinding[];
|
|
53
|
+
/**
|
|
54
|
+
* Score starts at 100. Each rule deducts per finding, capped at twice the
|
|
55
|
+
* weight of its worst finding, so a site with 30 similar tools is not
|
|
56
|
+
* punished 30 times for one design choice. Thresholds match Tier 1
|
|
57
|
+
* (>= 80 PASS, 50-79 CONCERNS, < 50 FAIL), with two floors: any critical
|
|
58
|
+
* finding is FAIL, and any high finding is at least CONCERNS.
|
|
59
|
+
*/
|
|
60
|
+
export declare function computeVerdict(findings: WebmcpFinding[]): {
|
|
61
|
+
score: number;
|
|
62
|
+
verdict: ScanVerdict;
|
|
63
|
+
};
|
|
64
|
+
/** `failed` (the page never loaded and no tool was found) gives score null and verdict ERROR. */
|
|
65
|
+
export declare function summarize(tools: WebmcpTool[], findings: WebmcpFinding[], failed?: boolean): SiteSummary;
|
|
66
|
+
/** Turn an enumeration into the schemaVersion 1 report. */
|
|
67
|
+
export declare function buildReport(e: EnumerationResult, scannedAt?: Date): SiteReport;
|
|
68
|
+
/** Highest severity in a report, or null when there are no findings. */
|
|
69
|
+
export declare function worstSeverity(findings: WebmcpFinding[]): Severity | null;
|
|
70
|
+
export {};
|