wrapguard-mcp 0.1.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 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { WrapGuardConfig } from "./types.js";
2
+ export declare function loadConfig(explicitPath?: string): Promise<WrapGuardConfig>;
3
+ export declare function publicConfig(config: WrapGuardConfig): Omit<WrapGuardConfig, "allowedFileRoots"> & {
4
+ allowedFileRoots: string[];
5
+ };
6
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAmClD,wBAAsB,UAAU,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CA4BhF;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG;IACjG,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B,CAEA"}
package/dist/config.js ADDED
@@ -0,0 +1,66 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { z } from "zod";
4
+ const configSchema = z.object({
5
+ serverName: z.string().trim().min(1).max(80).default("WrapGuard MCP"),
6
+ defaultLocale: z.enum(["auto", "ko", "en"]).default("auto"),
7
+ viewports: z.array(z.number().int().min(240).max(7680)).min(1).max(12).default([320, 375, 768, 1024]),
8
+ allowedHosts: z.array(z.string().trim().min(1)).default(["localhost", "127.0.0.1"]),
9
+ allowedFileRoots: z.array(z.string().trim().min(1)).default(["."]),
10
+ ignoreSelectors: z
11
+ .array(z.string().trim().min(1))
12
+ .default(["code", "pre", "kbd", "samp", "[data-wrapguard-ignore]"]),
13
+ ignorePatterns: z
14
+ .array(z.string())
15
+ .default(["https?://\\S+", "^SHA-?\\d+", "\\b[0-9a-fA-F]{32,}\\b"]),
16
+ timeoutMs: z.number().int().min(1000).max(180000).default(30000),
17
+ browserHeadless: z.boolean().default(true),
18
+ browserChannel: z.enum(["auto", "chromium", "chrome", "msedge"]).default("auto"),
19
+ allowRemoteUrls: z.boolean().default(false),
20
+ allowWrites: z.boolean().default(false)
21
+ });
22
+ function resolveConfigPath(explicitPath) {
23
+ const candidate = explicitPath ?? process.env.WRAPGUARD_CONFIG;
24
+ if (candidate)
25
+ return path.resolve(candidate);
26
+ const conventional = path.resolve("wrapguard.config.json");
27
+ return conventional;
28
+ }
29
+ function safeServerName(name) {
30
+ if (/\p{C}/u.test(name)) {
31
+ throw new Error("serverName must not contain control characters");
32
+ }
33
+ return name;
34
+ }
35
+ export async function loadConfig(explicitPath) {
36
+ const configPath = resolveConfigPath(explicitPath);
37
+ let parsed = {};
38
+ let baseDir = process.cwd();
39
+ if (configPath) {
40
+ try {
41
+ parsed = JSON.parse(await readFile(configPath, "utf8"));
42
+ baseDir = path.dirname(configPath);
43
+ }
44
+ catch (error) {
45
+ const code = error.code;
46
+ if (code !== "ENOENT")
47
+ throw error;
48
+ }
49
+ }
50
+ const candidate = typeof parsed === "object" && parsed !== null ? { ...parsed } : {};
51
+ if (process.env.WRAPGUARD_SERVER_NAME?.trim()) {
52
+ Object.assign(candidate, { serverName: process.env.WRAPGUARD_SERVER_NAME.trim() });
53
+ }
54
+ const config = configSchema.parse(candidate);
55
+ return {
56
+ ...config,
57
+ serverName: safeServerName(config.serverName),
58
+ viewports: [...new Set(config.viewports)].sort((a, b) => a - b),
59
+ allowedHosts: config.allowedHosts.map(host => host.toLowerCase()),
60
+ allowedFileRoots: config.allowedFileRoots.map(root => path.resolve(baseDir, root))
61
+ };
62
+ }
63
+ export function publicConfig(config) {
64
+ return { ...config, allowedFileRoots: [...config.allowedFileRoots] };
65
+ }
66
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { LocaleSetting, WrapGuardConfig } from "./types.js";
2
+ export type FixProfile = "prose-ko" | "prose-en" | "prose-mixed" | "raw-evidence" | "code-url";
3
+ export declare function profileFor(locale: LocaleSetting | "mixed", contentKind?: string): FixProfile;
4
+ export declare function cssForProfile(profile: FixProfile): string;
5
+ export declare function buildCssRule(selector: string, profile: FixProfile): string;
6
+ export declare function applyCssFix(options: {
7
+ cssFile: string;
8
+ selector: string;
9
+ profile: FixProfile;
10
+ dryRun: boolean;
11
+ config: WrapGuardConfig;
12
+ }): Promise<{
13
+ changed: boolean;
14
+ dryRun: boolean;
15
+ cssFile: string;
16
+ rule: string;
17
+ }>;
18
+ //# sourceMappingURL=fixes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fixes.d.ts","sourceRoot":"","sources":["../src/fixes.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAGjE,MAAM,MAAM,UAAU,GAAG,UAAU,GAAG,UAAU,GAAG,aAAa,GAAG,cAAc,GAAG,UAAU,CAAC;AAE/F,wBAAgB,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,EAAE,WAAW,SAAU,GAAG,UAAU,CAM7F;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,UAAU,GAAG,MAAM,CAiCzD;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,MAAM,CAS1E;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,UAAU,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,eAAe,CAAC;CACzB,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAShF"}
package/dist/fixes.js ADDED
@@ -0,0 +1,68 @@
1
+ import { readFile, writeFile } from "node:fs/promises";
2
+ import { assertWritableFile } from "./security.js";
3
+ export function profileFor(locale, contentKind = "prose") {
4
+ if (contentKind === "raw-evidence")
5
+ return "raw-evidence";
6
+ if (contentKind === "code-url")
7
+ return "code-url";
8
+ if (locale === "ko")
9
+ return "prose-ko";
10
+ if (locale === "en")
11
+ return "prose-en";
12
+ return "prose-mixed";
13
+ }
14
+ export function cssForProfile(profile) {
15
+ switch (profile) {
16
+ case "prose-ko":
17
+ return [
18
+ "word-break: keep-all;",
19
+ "overflow-wrap: break-word;",
20
+ "line-break: strict;",
21
+ "text-wrap: pretty;"
22
+ ].join("\n");
23
+ case "prose-en":
24
+ return [
25
+ "word-break: normal;",
26
+ "overflow-wrap: break-word;",
27
+ "hyphens: manual;",
28
+ "text-wrap: pretty;"
29
+ ].join("\n");
30
+ case "prose-mixed":
31
+ return [
32
+ "word-break: keep-all;",
33
+ "overflow-wrap: break-word;",
34
+ "line-break: strict;",
35
+ "hyphens: manual;",
36
+ "text-wrap: pretty;"
37
+ ].join("\n");
38
+ case "raw-evidence":
39
+ return [
40
+ "/* Preserve the immutable raw text separately. */",
41
+ "white-space: pre-wrap;",
42
+ "overflow-wrap: anywhere;"
43
+ ].join("\n");
44
+ case "code-url":
45
+ return ["word-break: normal;", "overflow-wrap: anywhere;"].join("\n");
46
+ }
47
+ }
48
+ export function buildCssRule(selector, profile) {
49
+ if (!selector.trim() || /[{}]/.test(selector)) {
50
+ throw new Error("selector must be non-empty and must not contain braces");
51
+ }
52
+ const declarations = cssForProfile(profile)
53
+ .split("\n")
54
+ .map(line => ` ${line}`)
55
+ .join("\n");
56
+ return `${selector.trim()} {\n${declarations}\n}`;
57
+ }
58
+ export async function applyCssFix(options) {
59
+ const rule = buildCssRule(options.selector, options.profile);
60
+ const current = await readFile(options.cssFile, "utf8");
61
+ const changed = !current.includes(rule);
62
+ if (!options.dryRun && changed) {
63
+ const file = await assertWritableFile(options.cssFile, options.config);
64
+ await writeFile(file, `${current.trimEnd()}\n\n/* Added by WrapGuard MCP */\n${rule}\n`, "utf8");
65
+ }
66
+ return { changed, dryRun: options.dryRun, cssFile: options.cssFile, rule };
67
+ }
68
+ //# sourceMappingURL=fixes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fixes.js","sourceRoot":"","sources":["../src/fixes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAInD,MAAM,UAAU,UAAU,CAAC,MAA+B,EAAE,WAAW,GAAG,OAAO;IAC/E,IAAI,WAAW,KAAK,cAAc;QAAE,OAAO,cAAc,CAAC;IAC1D,IAAI,WAAW,KAAK,UAAU;QAAE,OAAO,UAAU,CAAC;IAClD,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,UAAU,CAAC;IACvC,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,UAAU,CAAC;IACvC,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAmB;IAC/C,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,UAAU;YACb,OAAO;gBACL,uBAAuB;gBACvB,4BAA4B;gBAC5B,qBAAqB;gBACrB,oBAAoB;aACrB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACf,KAAK,UAAU;YACb,OAAO;gBACL,qBAAqB;gBACrB,4BAA4B;gBAC5B,kBAAkB;gBAClB,oBAAoB;aACrB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACf,KAAK,aAAa;YAChB,OAAO;gBACL,uBAAuB;gBACvB,4BAA4B;gBAC5B,qBAAqB;gBACrB,kBAAkB;gBAClB,oBAAoB;aACrB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACf,KAAK,cAAc;YACjB,OAAO;gBACL,mDAAmD;gBACnD,wBAAwB;gBACxB,0BAA0B;aAC3B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACf,KAAK,UAAU;YACb,OAAO,CAAC,qBAAqB,EAAE,0BAA0B,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1E,CAAC;AACH,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,QAAgB,EAAE,OAAmB;IAChE,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9C,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;IAC5E,CAAC;IACD,MAAM,YAAY,GAAG,aAAa,CAAC,OAAO,CAAC;SACxC,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC;SACxB,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,OAAO,YAAY,KAAK,CAAC;AACpD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAMjC;IACC,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7D,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACxD,MAAM,OAAO,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACxC,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,OAAO,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QACvE,MAAM,SAAS,CAAC,IAAI,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,qCAAqC,IAAI,IAAI,EAAE,MAAM,CAAC,CAAC;IACnG,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;AAC7E,CAAC"}
package/dist/http.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":""}
package/dist/http.js ADDED
@@ -0,0 +1,78 @@
1
+ #!/usr/bin/env node
2
+ import { createServer } from "node:http";
3
+ import { timingSafeEqual } from "node:crypto";
4
+ import { hostHeaderValidation, originValidation, toNodeHandler } from "@modelcontextprotocol/node";
5
+ import { createMcpHandler } from "@modelcontextprotocol/server";
6
+ import { loadConfig } from "./config.js";
7
+ import { buildMcpServer } from "./server.js";
8
+ const config = await loadConfig();
9
+ const port = Number.parseInt(process.env.PORT ?? "8787", 10);
10
+ const token = process.env.WRAPGUARD_HTTP_TOKEN?.trim();
11
+ const bindHost = process.env.HOST?.trim() || (token ? "0.0.0.0" : "127.0.0.1");
12
+ const allowedHttpHosts = (process.env.WRAPGUARD_HTTP_HOSTS ?? "localhost,127.0.0.1,[::1]")
13
+ .split(",")
14
+ .map(item => item.trim())
15
+ .filter(Boolean);
16
+ if (!Number.isInteger(port) || port < 1 || port > 65535)
17
+ throw new Error("PORT must be between 1 and 65535");
18
+ if (bindHost !== "127.0.0.1" && bindHost !== "localhost" && bindHost !== "::1" && !token) {
19
+ throw new Error("WRAPGUARD_HTTP_TOKEN is required when binding beyond loopback");
20
+ }
21
+ const handler = createMcpHandler(() => buildMcpServer(config), {
22
+ legacy: "stateless",
23
+ onerror(error) {
24
+ process.stderr.write(`[wrapguard-http] ${error.message}\n`);
25
+ }
26
+ });
27
+ const mcpHandler = toNodeHandler(handler);
28
+ const validateHost = hostHeaderValidation(allowedHttpHosts);
29
+ const validateOrigin = originValidation(allowedHttpHosts);
30
+ function validBearer(value) {
31
+ if (!token)
32
+ return true;
33
+ const prefix = "Bearer ";
34
+ if (!value?.startsWith(prefix))
35
+ return false;
36
+ const presented = Buffer.from(value.slice(prefix.length));
37
+ const expected = Buffer.from(token);
38
+ return presented.length === expected.length && timingSafeEqual(presented, expected);
39
+ }
40
+ const httpServer = createServer(async (req, res) => {
41
+ const pathname = new URL(req.url ?? "/", `http://${req.headers.host ?? "localhost"}`).pathname;
42
+ if (pathname === "/health") {
43
+ res.writeHead(200, { "content-type": "application/json; charset=utf-8" });
44
+ res.end(JSON.stringify({ ok: true, name: config.serverName }));
45
+ return;
46
+ }
47
+ if (pathname !== "/mcp") {
48
+ res.writeHead(404, { "content-type": "application/json; charset=utf-8" });
49
+ res.end(JSON.stringify({ error: "not_found" }));
50
+ return;
51
+ }
52
+ if (!validateHost(req, res) || !validateOrigin(req, res))
53
+ return;
54
+ if (!validBearer(req.headers.authorization)) {
55
+ res.writeHead(401, {
56
+ "content-type": "application/json; charset=utf-8",
57
+ "www-authenticate": "Bearer"
58
+ });
59
+ res.end(JSON.stringify({ error: "unauthorized" }));
60
+ return;
61
+ }
62
+ if (!req.method) {
63
+ res.writeHead(400, { "content-type": "application/json; charset=utf-8" });
64
+ res.end(JSON.stringify({ error: "missing_method" }));
65
+ return;
66
+ }
67
+ await mcpHandler(req, res);
68
+ });
69
+ httpServer.listen(port, bindHost, () => {
70
+ process.stderr.write(`[wrapguard-http] ${config.serverName} listening on http://${bindHost}:${port}/mcp\n`);
71
+ });
72
+ for (const signal of ["SIGINT", "SIGTERM"]) {
73
+ process.on(signal, async () => {
74
+ await handler.close();
75
+ httpServer.close(() => process.exit(0));
76
+ });
77
+ }
78
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export { auditPage, formatAuditMarkdown, inspectWrapCss, WRAPGUARD_VERSION } from "./audit.js";
2
+ export { loadConfig } from "./config.js";
3
+ export { applyCssFix, buildCssRule, cssForProfile, profileFor } from "./fixes.js";
4
+ export { buildMcpServer } from "./server.js";
5
+ export type * from "./types.js";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/F,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAClF,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,mBAAmB,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,5 @@
1
+ export { auditPage, formatAuditMarkdown, inspectWrapCss, WRAPGUARD_VERSION } from "./audit.js";
2
+ export { loadConfig } from "./config.js";
3
+ export { applyCssFix, buildCssRule, cssForProfile, profileFor } from "./fixes.js";
4
+ export { buildMcpServer } from "./server.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/F,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAClF,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { WrapGuardConfig } from "./types.js";
2
+ export declare function resolveAuditTarget(target: string, config: WrapGuardConfig): Promise<string>;
3
+ export declare function assertWritableFile(filePath: string, config: WrapGuardConfig): Promise<string>;
4
+ //# sourceMappingURL=security.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../src/security.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAWlD,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CA0CjG;AAED,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAQnG"}
@@ -0,0 +1,61 @@
1
+ import { realpath } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { pathToFileURL } from "node:url";
4
+ function isWithin(candidate, root) {
5
+ const relative = path.relative(root, candidate);
6
+ return relative === "" || (!relative.startsWith(`..${path.sep}`) && relative !== ".." && !path.isAbsolute(relative));
7
+ }
8
+ async function canonicalPath(candidate) {
9
+ return realpath(path.resolve(candidate));
10
+ }
11
+ export async function resolveAuditTarget(target, config) {
12
+ let url;
13
+ const windowsAbsolutePath = /^[A-Za-z]:[\\/]/.test(target) || target.startsWith("\\\\");
14
+ if (!windowsAbsolutePath) {
15
+ try {
16
+ url = new URL(target);
17
+ }
18
+ catch {
19
+ url = undefined;
20
+ }
21
+ }
22
+ if (!url) {
23
+ const file = await canonicalPath(target);
24
+ const roots = await Promise.all(config.allowedFileRoots.map(root => canonicalPath(root).catch(() => path.resolve(root))));
25
+ if (!roots.some(root => isWithin(file, root))) {
26
+ throw new Error(`Local file is outside allowedFileRoots: ${file}`);
27
+ }
28
+ return pathToFileURL(file).href;
29
+ }
30
+ if (url.protocol === "file:") {
31
+ const file = await canonicalPath(decodeURIComponent(url.pathname.replace(/^\/(?:([A-Za-z]:))/, "$1")));
32
+ const roots = await Promise.all(config.allowedFileRoots.map(root => canonicalPath(root).catch(() => path.resolve(root))));
33
+ if (!roots.some(root => isWithin(file, root))) {
34
+ throw new Error(`Local file is outside allowedFileRoots: ${file}`);
35
+ }
36
+ return pathToFileURL(file).href;
37
+ }
38
+ if (url.protocol !== "http:" && url.protocol !== "https:") {
39
+ throw new Error(`Unsupported protocol: ${url.protocol}`);
40
+ }
41
+ const hostname = url.hostname.toLowerCase();
42
+ const local = hostname === "localhost" || hostname === "127.0.0.1" || hostname === "::1";
43
+ if (!local && !config.allowRemoteUrls) {
44
+ throw new Error("Remote URL auditing is disabled. Set allowRemoteUrls and an explicit allowedHosts entry.");
45
+ }
46
+ if (!config.allowedHosts.includes(hostname)) {
47
+ throw new Error(`Host is not allowlisted: ${hostname}`);
48
+ }
49
+ return url.href;
50
+ }
51
+ export async function assertWritableFile(filePath, config) {
52
+ if (!config.allowWrites)
53
+ throw new Error("File writes are disabled by configuration");
54
+ const file = path.resolve(filePath);
55
+ const roots = config.allowedFileRoots.map(root => path.resolve(root));
56
+ if (!roots.some(root => isWithin(file, root))) {
57
+ throw new Error(`Write target is outside allowedFileRoots: ${file}`);
58
+ }
59
+ return file;
60
+ }
61
+ //# sourceMappingURL=security.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.js","sourceRoot":"","sources":["../src/security.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { McpServer } from "@modelcontextprotocol/server";
2
+ import type { WrapGuardConfig } from "./types.js";
3
+ export declare function buildMcpServer(config: WrapGuardConfig): McpServer;
4
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAIzD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAqBlD,wBAAgB,cAAc,CAAC,MAAM,EAAE,eAAe,GAAG,SAAS,CAiIjE"}
package/dist/server.js ADDED
@@ -0,0 +1,114 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { McpServer } from "@modelcontextprotocol/server";
4
+ import { z } from "zod";
5
+ import { auditPage, formatAuditMarkdown, inspectWrapCss, WRAPGUARD_VERSION } from "./audit.js";
6
+ import { applyCssFix, buildCssRule, cssForProfile, profileFor } from "./fixes.js";
7
+ const localeSchema = z.enum(["auto", "ko", "en"]);
8
+ const profileSchema = z.enum(["prose-ko", "prose-en", "prose-mixed", "raw-evidence", "code-url"]);
9
+ const jsonResult = (value) => ({
10
+ content: [{ type: "text", text: JSON.stringify(value, null, 2) }],
11
+ structuredContent: value
12
+ });
13
+ async function guarded(operation) {
14
+ try {
15
+ return jsonResult(await operation());
16
+ }
17
+ catch (error) {
18
+ return {
19
+ content: [{ type: "text", text: error instanceof Error ? error.message : String(error) }],
20
+ isError: true
21
+ };
22
+ }
23
+ }
24
+ export function buildMcpServer(config) {
25
+ const server = new McpServer({ name: config.serverName, version: WRAPGUARD_VERSION }, { capabilities: { tools: {} } });
26
+ server.registerTool("server_info", {
27
+ title: "WrapGuard server information",
28
+ description: "Show the configured display name, safety policy, and supported languages.",
29
+ inputSchema: z.object({}),
30
+ annotations: { readOnlyHint: true, openWorldHint: false }
31
+ }, async () => jsonResult({
32
+ name: config.serverName,
33
+ version: WRAPGUARD_VERSION,
34
+ languages: ["ko", "en"],
35
+ viewports: config.viewports,
36
+ allowRemoteUrls: config.allowRemoteUrls,
37
+ allowWrites: config.allowWrites
38
+ }));
39
+ const auditInput = z.object({
40
+ target: z.string().min(1).describe("Allowed local HTML path, file URL, or allowlisted HTTP(S) URL"),
41
+ viewports: z.array(z.number().int().min(240).max(7680)).min(1).max(12).optional(),
42
+ locale: localeSchema.optional(),
43
+ ignoreSelectors: z.array(z.string().min(1)).max(40).optional(),
44
+ screenshotDir: z.string().optional()
45
+ });
46
+ server.registerTool("audit_page", {
47
+ title: "Audit responsive word wrapping",
48
+ description: "Render a page at multiple widths and report Korean/English mid-word wraps and forced source newlines.",
49
+ inputSchema: auditInput,
50
+ annotations: { readOnlyHint: true, openWorldHint: false }
51
+ }, async (input) => guarded(() => auditPage(input, config)));
52
+ server.registerTool("detect_midword_breaks", {
53
+ title: "Detect mid-word breaks",
54
+ description: "Return only concrete Korean/English wrap issues measured from grapheme geometry in the browser.",
55
+ inputSchema: auditInput,
56
+ annotations: { readOnlyHint: true, openWorldHint: false }
57
+ }, async (input) => guarded(async () => {
58
+ const report = await auditPage(input, config);
59
+ return { passed: report.passed, counts: report.counts, issues: report.issues };
60
+ }));
61
+ server.registerTool("inspect_wrap_css", {
62
+ title: "Inspect wrapping CSS",
63
+ description: "Inspect computed wrapping properties and same-origin matching CSS rules for one element.",
64
+ inputSchema: z.object({
65
+ target: z.string().min(1),
66
+ selector: z.string().min(1),
67
+ viewport: z.number().int().min(240).max(7680).default(375)
68
+ }),
69
+ annotations: { readOnlyHint: true, openWorldHint: false }
70
+ }, async ({ target, selector, viewport }) => guarded(() => inspectWrapCss(target, selector, viewport, config)));
71
+ server.registerTool("suggest_wrap_fix", {
72
+ title: "Suggest a safe wrapping fix",
73
+ description: "Generate a minimal CSS rule for Korean, English, mixed prose, raw evidence, or code/URL content.",
74
+ inputSchema: z.object({
75
+ selector: z.string().min(1),
76
+ locale: z.enum(["auto", "ko", "en", "mixed"]).default("auto"),
77
+ contentKind: z.enum(["prose", "raw-evidence", "code-url"]).default("prose")
78
+ }),
79
+ annotations: { readOnlyHint: true, openWorldHint: false }
80
+ }, async ({ selector, locale, contentKind }) => guarded(async () => {
81
+ const profile = profileFor(locale, contentKind);
82
+ return { profile, rule: buildCssRule(selector, profile), declarations: cssForProfile(profile) };
83
+ }));
84
+ server.registerTool("verify_wrap_regression", {
85
+ title: "Verify wrap regression threshold",
86
+ description: "Audit a page and evaluate it against explicit error/warning thresholds for CI or release gates.",
87
+ inputSchema: auditInput.extend({
88
+ maxErrors: z.number().int().min(0).default(0),
89
+ maxWarnings: z.number().int().min(0).default(999999)
90
+ }),
91
+ annotations: { readOnlyHint: true, openWorldHint: false }
92
+ }, async ({ maxErrors, maxWarnings, ...input }) => guarded(async () => {
93
+ const report = await auditPage(input, config);
94
+ const thresholdPassed = report.counts.errors <= maxErrors && report.counts.warnings <= maxWarnings;
95
+ return { thresholdPassed, thresholds: { maxErrors, maxWarnings }, report, markdown: formatAuditMarkdown(report) };
96
+ }));
97
+ server.registerTool("apply_wrap_fix", {
98
+ title: "Apply an explicit CSS wrap fix",
99
+ description: "Append an idempotent CSS rule. Dry-run is the default; real writes require allowWrites and an allowed root.",
100
+ inputSchema: z.object({
101
+ cssFile: z.string().min(1),
102
+ selector: z.string().min(1),
103
+ profile: profileSchema,
104
+ dryRun: z.boolean().default(true)
105
+ }),
106
+ annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: false }
107
+ }, async ({ cssFile, selector, profile, dryRun }) => guarded(async () => {
108
+ const resolved = path.resolve(cssFile);
109
+ await readFile(resolved, "utf8");
110
+ return applyCssFix({ cssFile: resolved, selector, profile, dryRun, config });
111
+ }));
112
+ return server;
113
+ }
114
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AACzD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/F,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAGlF,MAAM,YAAY,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;AAClD,MAAM,aAAa,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,cAAc,EAAE,UAAU,CAAC,CAAC,CAAC;AAElG,MAAM,UAAU,GAAG,CAAC,KAAc,EAAE,EAAE,CAAC,CAAC;IACtC,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;IAC1E,iBAAiB,EAAE,KAAgC;CACpD,CAAC,CAAC;AAEH,KAAK,UAAU,OAAO,CAAI,SAA2B;IACnD,IAAI,CAAC;QACH,OAAO,UAAU,CAAC,MAAM,SAAS,EAAE,CAAC,CAAC;IACvC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAClG,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAuB;IACpD,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B,EAAE,IAAI,EAAE,MAAM,CAAC,UAAU,EAAE,OAAO,EAAE,iBAAiB,EAAE,EACvD,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAChC,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,aAAa,EACb;QACE,KAAK,EAAE,8BAA8B;QACrC,WAAW,EAAE,2EAA2E;QACxF,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;QACzB,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE;KAC1D,EACD,KAAK,IAAI,EAAE,CAAC,UAAU,CAAC;QACrB,IAAI,EAAE,MAAM,CAAC,UAAU;QACvB,OAAO,EAAE,iBAAiB;QAC1B,SAAS,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;QACvB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,eAAe,EAAE,MAAM,CAAC,eAAe;QACvC,WAAW,EAAE,MAAM,CAAC,WAAW;KAChC,CAAC,CACH,CAAC;IAEF,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC;QAC1B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,+DAA+D,CAAC;QACnG,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE;QACjF,MAAM,EAAE,YAAY,CAAC,QAAQ,EAAE;QAC/B,eAAe,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE;QAC9D,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KACrC,CAAC,CAAC;IAEH,MAAM,CAAC,YAAY,CACjB,YAAY,EACZ;QACE,KAAK,EAAE,gCAAgC;QACvC,WAAW,EAAE,uGAAuG;QACpH,WAAW,EAAE,UAAU;QACvB,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE;KAC1D,EACD,KAAK,EAAC,KAAK,EAAC,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CACvD,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,uBAAuB,EACvB;QACE,KAAK,EAAE,wBAAwB;QAC/B,WAAW,EAAE,iGAAiG;QAC9G,WAAW,EAAE,UAAU;QACvB,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE;KAC1D,EACD,KAAK,EAAC,KAAK,EAAC,EAAE,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE;QAChC,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;IACjF,CAAC,CAAC,CACH,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,kBAAkB,EAClB;QACE,KAAK,EAAE,sBAAsB;QAC7B,WAAW,EAAE,0FAA0F;QACvG,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACpB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YACzB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;SAC3D,CAAC;QACF,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE;KAC1D,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAC5G,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,kBAAkB,EAClB;QACE,KAAK,EAAE,6BAA6B;QACpC,WAAW,EAAE,kGAAkG;QAC/G,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACpB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3B,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;YAC7D,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,cAAc,EAAE,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;SAC5E,CAAC;QACF,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE;KAC1D,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE;QAC9D,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QAChD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,YAAY,EAAE,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;IAClG,CAAC,CAAC,CACH,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,wBAAwB,EACxB;QACE,KAAK,EAAE,kCAAkC;QACzC,WAAW,EAAE,iGAAiG;QAC9G,WAAW,EAAE,UAAU,CAAC,MAAM,CAAC;YAC7B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;YAC7C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;SACrD,CAAC;QACF,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE;KAC1D,EACD,KAAK,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,KAAK,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE;QACjE,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC9C,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,IAAI,SAAS,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,IAAI,WAAW,CAAC;QACnG,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,mBAAmB,CAAC,MAAM,CAAC,EAAE,CAAC;IACpH,CAAC,CAAC,CACH,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,gBAAgB,EAChB;QACE,KAAK,EAAE,gCAAgC;QACvC,WAAW,EAAE,6GAA6G;QAC1H,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACpB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3B,OAAO,EAAE,aAAa;YACtB,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;SAClC,CAAC;QACF,WAAW,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE;KACzG,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE;QACnE,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACvC,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACjC,OAAO,WAAW,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC/E,CAAC,CAAC,CACH,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=stdio.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdio.d.ts","sourceRoot":"","sources":["../src/stdio.ts"],"names":[],"mappings":""}
package/dist/stdio.js ADDED
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env node
2
+ import { serveStdio } from "@modelcontextprotocol/server/stdio";
3
+ import { loadConfig } from "./config.js";
4
+ import { buildMcpServer } from "./server.js";
5
+ try {
6
+ const config = await loadConfig();
7
+ serveStdio(() => buildMcpServer(config), {
8
+ onerror(error) {
9
+ process.stderr.write(`[wrapguard] ${error.message}\n`);
10
+ }
11
+ });
12
+ }
13
+ catch (error) {
14
+ process.stderr.write(`[wrapguard] ${error instanceof Error ? error.message : String(error)}\n`);
15
+ process.exitCode = 1;
16
+ }
17
+ //# sourceMappingURL=stdio.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdio.js","sourceRoot":"","sources":["../src/stdio.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,IAAI,CAAC;IACH,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,UAAU,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE;QACvC,OAAO,CAAC,KAAK;YACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;QACzD,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAAC,OAAO,KAAK,EAAE,CAAC;IACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAChG,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC"}