@paretools/http 0.8.5 → 0.10.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/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/curl-runner.js +1 -1
- package/dist/lib/formatters.d.ts +5 -1
- package/dist/lib/formatters.d.ts.map +1 -1
- package/dist/lib/formatters.js +96 -7
- package/dist/lib/formatters.js.map +1 -1
- package/dist/lib/parsers.d.ts +3 -1
- package/dist/lib/parsers.d.ts.map +1 -1
- package/dist/lib/parsers.js +111 -10
- package/dist/lib/parsers.js.map +1 -1
- package/dist/schemas/index.d.ts +80 -1
- package/dist/schemas/index.d.ts.map +1 -1
- package/dist/schemas/index.js +52 -1
- package/dist/schemas/index.js.map +1 -1
- package/dist/tools/get.d.ts.map +1 -1
- package/dist/tools/get.js +70 -10
- package/dist/tools/get.js.map +1 -1
- package/dist/tools/head.d.ts.map +1 -1
- package/dist/tools/head.js +50 -8
- package/dist/tools/head.js.map +1 -1
- package/dist/tools/post.d.ts.map +1 -1
- package/dist/tools/post.js +88 -16
- package/dist/tools/post.js.map +1 -1
- package/dist/tools/request.d.ts +26 -4
- package/dist/tools/request.d.ts.map +1 -1
- package/dist/tools/request.js +166 -16
- package/dist/tools/request.js.map +1 -1
- package/package.json +2 -2
package/dist/schemas/index.js
CHANGED
|
@@ -1,41 +1,92 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
/** Zod schema for a single HTTP header key-value pair as a record. */
|
|
3
3
|
export const HttpHeadersSchema = z.record(z.string(), z.string());
|
|
4
|
+
/** Zod schema for expanded timing details from curl's -w format variables. */
|
|
5
|
+
export const TimingDetailsSchema = z.object({
|
|
6
|
+
namelookup: z.number().describe("Time from start until DNS resolution completed (seconds)"),
|
|
7
|
+
connect: z.number().describe("Time from start until TCP connection established (seconds)"),
|
|
8
|
+
appconnect: z
|
|
9
|
+
.number()
|
|
10
|
+
.optional()
|
|
11
|
+
.describe("Time from start until TLS handshake completed (seconds)"),
|
|
12
|
+
pretransfer: z
|
|
13
|
+
.number()
|
|
14
|
+
.optional()
|
|
15
|
+
.describe("Time from start until just before transfer begins (seconds)"),
|
|
16
|
+
starttransfer: z
|
|
17
|
+
.number()
|
|
18
|
+
.optional()
|
|
19
|
+
.describe("Time from start until first response byte received (seconds)"),
|
|
20
|
+
});
|
|
4
21
|
/** Zod schema for HTTP timing information. */
|
|
5
22
|
export const HttpTimingSchema = z.object({
|
|
6
23
|
total: z.number(),
|
|
24
|
+
details: TimingDetailsSchema.optional(),
|
|
25
|
+
});
|
|
26
|
+
/** A single redirect hop captured from intermediate HTTP response headers. */
|
|
27
|
+
export const RedirectHopSchema = z.object({
|
|
28
|
+
status: z.number(),
|
|
29
|
+
location: z.string(),
|
|
7
30
|
});
|
|
8
31
|
/** Zod schema for the full HTTP response result (used by request, get, post). */
|
|
9
32
|
export const HttpResponseSchema = z.object({
|
|
10
33
|
status: z.number(),
|
|
11
34
|
statusText: z.string(),
|
|
35
|
+
httpVersion: z.string().optional(),
|
|
12
36
|
headers: HttpHeadersSchema.optional(),
|
|
13
37
|
body: z.string().optional(),
|
|
14
38
|
timing: HttpTimingSchema,
|
|
15
39
|
size: z.number(),
|
|
40
|
+
uploadSize: z.number().optional(),
|
|
16
41
|
contentType: z.string().optional(),
|
|
42
|
+
redirectChain: z.array(RedirectHopSchema).optional(),
|
|
43
|
+
finalUrl: z.string().optional(),
|
|
44
|
+
scheme: z.string().optional(),
|
|
45
|
+
tlsVerifyResult: z.number().optional(),
|
|
17
46
|
});
|
|
18
47
|
/** Zod schema for the HEAD-only HTTP response result (no body). */
|
|
19
48
|
export const HttpHeadResponseSchema = z.object({
|
|
20
49
|
status: z.number(),
|
|
21
50
|
statusText: z.string(),
|
|
51
|
+
httpVersion: z.string().optional(),
|
|
22
52
|
headers: HttpHeadersSchema.optional(),
|
|
23
53
|
timing: HttpTimingSchema,
|
|
24
54
|
contentType: z.string().optional(),
|
|
55
|
+
contentLength: z.number().optional(),
|
|
56
|
+
redirectChain: z.array(RedirectHopSchema).optional(),
|
|
57
|
+
finalUrl: z.string().optional(),
|
|
58
|
+
scheme: z.string().optional(),
|
|
59
|
+
tlsVerifyResult: z.number().optional(),
|
|
25
60
|
});
|
|
26
61
|
/** Compact response: status, timing, size. Drop headers and body. */
|
|
27
62
|
export const HttpResponseCompactSchema = z.object({
|
|
28
63
|
status: z.number(),
|
|
29
64
|
statusText: z.string(),
|
|
65
|
+
httpVersion: z.string().optional(),
|
|
30
66
|
contentType: z.string().optional(),
|
|
31
67
|
size: z.number(),
|
|
32
68
|
timing: HttpTimingSchema,
|
|
33
69
|
});
|
|
34
|
-
/**
|
|
70
|
+
/**
|
|
71
|
+
* Compact HEAD response: status, timing, and key headers.
|
|
72
|
+
* Retains essential headers even in compact mode: content-length, cache-control,
|
|
73
|
+
* etag, last-modified, content-type.
|
|
74
|
+
*/
|
|
35
75
|
export const HttpHeadResponseCompactSchema = z.object({
|
|
36
76
|
status: z.number(),
|
|
37
77
|
statusText: z.string(),
|
|
78
|
+
httpVersion: z.string().optional(),
|
|
38
79
|
contentType: z.string().optional(),
|
|
80
|
+
contentLength: z.number().optional(),
|
|
39
81
|
timing: HttpTimingSchema,
|
|
82
|
+
essentialHeaders: HttpHeadersSchema.optional(),
|
|
40
83
|
});
|
|
84
|
+
/** Headers that should be preserved in HEAD compact mode. */
|
|
85
|
+
export const HEAD_ESSENTIAL_HEADERS = [
|
|
86
|
+
"content-length",
|
|
87
|
+
"cache-control",
|
|
88
|
+
"etag",
|
|
89
|
+
"last-modified",
|
|
90
|
+
"content-type",
|
|
91
|
+
];
|
|
41
92
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/schemas/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,sEAAsE;AACtE,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;AAElE,8CAA8C;AAC9C,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/schemas/index.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/get.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get.d.ts","sourceRoot":"","sources":["../../src/tools/get.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"get.d.ts","sourceRoot":"","sources":["../../src/tools/get.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAezE,wDAAwD;AACxD,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,QAwJhD"}
|
package/dist/tools/get.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import { compactDualOutput, INPUT_LIMITS } from "@paretools/shared";
|
|
2
|
+
import { compactDualOutput, assertNoFlagInjection, INPUT_LIMITS } from "@paretools/shared";
|
|
3
3
|
import { curlCmd } from "../lib/curl-runner.js";
|
|
4
4
|
import { parseCurlOutput } from "../lib/parsers.js";
|
|
5
5
|
import { formatHttpResponse, compactResponseMap, formatResponseCompact, } from "../lib/formatters.js";
|
|
6
6
|
import { HttpResponseSchema } from "../schemas/index.js";
|
|
7
7
|
import { assertSafeUrl } from "../lib/url-validation.js";
|
|
8
8
|
import { buildCurlArgs } from "./request.js";
|
|
9
|
+
const HTTP_VERSIONS = ["1.0", "1.1", "2"];
|
|
9
10
|
/** Registers the `get` tool on the given MCP server. */
|
|
10
11
|
export function registerGetTool(server) {
|
|
11
12
|
server.registerTool("get", {
|
|
@@ -27,31 +28,90 @@ export function registerGetTool(server) {
|
|
|
27
28
|
.optional()
|
|
28
29
|
.default(30)
|
|
29
30
|
.describe("Request timeout in seconds (default: 30)"),
|
|
31
|
+
connectTimeout: z
|
|
32
|
+
.number()
|
|
33
|
+
.min(1)
|
|
34
|
+
.max(300)
|
|
35
|
+
.optional()
|
|
36
|
+
.describe("Maximum time in seconds for connection phase only (--connect-timeout). Detects connection failures fast."),
|
|
30
37
|
followRedirects: z
|
|
31
38
|
.boolean()
|
|
32
39
|
.optional()
|
|
33
40
|
.default(true)
|
|
34
41
|
.describe("Follow HTTP redirects (default: true)"),
|
|
35
|
-
|
|
42
|
+
insecure: z
|
|
36
43
|
.boolean()
|
|
37
44
|
.optional()
|
|
38
|
-
.
|
|
39
|
-
|
|
40
|
-
|
|
45
|
+
.describe("Allow insecure TLS connections, e.g. self-signed certificates (-k)"),
|
|
46
|
+
retry: z
|
|
47
|
+
.number()
|
|
48
|
+
.min(0)
|
|
49
|
+
.max(10)
|
|
50
|
+
.optional()
|
|
51
|
+
.describe("Number of retries on transient failures (--retry)"),
|
|
52
|
+
compressed: z
|
|
53
|
+
.boolean()
|
|
54
|
+
.optional()
|
|
55
|
+
.describe("Request compressed response and decompress automatically (--compressed)"),
|
|
56
|
+
basicAuth: z
|
|
41
57
|
.string()
|
|
42
|
-
.max(INPUT_LIMITS.
|
|
58
|
+
.max(INPUT_LIMITS.STRING_MAX)
|
|
59
|
+
.optional()
|
|
60
|
+
.describe("Basic auth credentials as 'user:password' (-u)"),
|
|
61
|
+
proxy: z
|
|
62
|
+
.string()
|
|
63
|
+
.max(INPUT_LIMITS.STRING_MAX)
|
|
64
|
+
.optional()
|
|
65
|
+
.describe("Proxy URL (e.g., http://proxy:8080) (-x)"),
|
|
66
|
+
queryParams: z
|
|
67
|
+
.record(z.string().max(INPUT_LIMITS.SHORT_STRING_MAX), z.string().max(INPUT_LIMITS.STRING_MAX))
|
|
68
|
+
.optional()
|
|
69
|
+
.describe("Query parameters as key-value pairs. URL-encoded and appended to the URL automatically."),
|
|
70
|
+
httpVersion: z
|
|
71
|
+
.enum(HTTP_VERSIONS)
|
|
72
|
+
.optional()
|
|
73
|
+
.describe("HTTP version to use: '1.0', '1.1', or '2' (--http1.0/--http1.1/--http2)"),
|
|
74
|
+
resolve: z
|
|
75
|
+
.string()
|
|
76
|
+
.max(INPUT_LIMITS.STRING_MAX)
|
|
43
77
|
.optional()
|
|
44
|
-
.describe("
|
|
78
|
+
.describe("Custom DNS resolution (--resolve). Format: 'host:port:addr' (e.g., 'example.com:443:127.0.0.1')"),
|
|
79
|
+
compact: z.boolean().optional().default(true).describe("Prefer compact output"),
|
|
80
|
+
path: z.string().max(INPUT_LIMITS.PATH_MAX).optional().describe("Working directory"),
|
|
45
81
|
},
|
|
46
82
|
outputSchema: HttpResponseSchema,
|
|
47
|
-
}, async ({ url, headers, timeout, followRedirects, compact, path }) => {
|
|
48
|
-
|
|
83
|
+
}, async ({ url, headers, timeout, connectTimeout, followRedirects, insecure, retry, compressed, basicAuth, proxy, queryParams, httpVersion, resolve, compact, path, }) => {
|
|
84
|
+
// Build URL with query params if provided
|
|
85
|
+
let finalUrl = url;
|
|
86
|
+
if (queryParams && Object.keys(queryParams).length > 0) {
|
|
87
|
+
const params = new URLSearchParams();
|
|
88
|
+
for (const [key, value] of Object.entries(queryParams)) {
|
|
89
|
+
params.append(key, value);
|
|
90
|
+
}
|
|
91
|
+
const separator = url.includes("?") ? "&" : "?";
|
|
92
|
+
finalUrl = `${url}${separator}${params.toString()}`;
|
|
93
|
+
}
|
|
94
|
+
assertSafeUrl(finalUrl);
|
|
95
|
+
if (basicAuth)
|
|
96
|
+
assertNoFlagInjection(basicAuth, "basicAuth");
|
|
97
|
+
if (proxy)
|
|
98
|
+
assertNoFlagInjection(proxy, "proxy");
|
|
99
|
+
if (resolve)
|
|
100
|
+
assertNoFlagInjection(resolve, "resolve");
|
|
49
101
|
const args = buildCurlArgs({
|
|
50
|
-
url,
|
|
102
|
+
url: finalUrl,
|
|
51
103
|
method: "GET",
|
|
52
104
|
headers,
|
|
53
105
|
timeout: timeout ?? 30,
|
|
106
|
+
connectTimeout,
|
|
54
107
|
followRedirects: followRedirects ?? true,
|
|
108
|
+
insecure,
|
|
109
|
+
retry,
|
|
110
|
+
compressed,
|
|
111
|
+
basicAuth,
|
|
112
|
+
proxy,
|
|
113
|
+
httpVersion,
|
|
114
|
+
resolve,
|
|
55
115
|
});
|
|
56
116
|
const cwd = path || process.cwd();
|
|
57
117
|
const result = await curlCmd(args, cwd);
|
package/dist/tools/get.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get.js","sourceRoot":"","sources":["../../src/tools/get.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"get.js","sourceRoot":"","sources":["../../src/tools/get.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/head.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"head.d.ts","sourceRoot":"","sources":["../../src/tools/head.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"head.d.ts","sourceRoot":"","sources":["../../src/tools/head.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAezE,yDAAyD;AACzD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,QA8HjD"}
|
package/dist/tools/head.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import { compactDualOutput, INPUT_LIMITS } from "@paretools/shared";
|
|
2
|
+
import { compactDualOutput, assertNoFlagInjection, INPUT_LIMITS } from "@paretools/shared";
|
|
3
3
|
import { curlCmd } from "../lib/curl-runner.js";
|
|
4
4
|
import { parseCurlHeadOutput } from "../lib/parsers.js";
|
|
5
5
|
import { formatHttpHeadResponse, compactHeadResponseMap, formatHeadResponseCompact, } from "../lib/formatters.js";
|
|
6
6
|
import { HttpHeadResponseSchema } from "../schemas/index.js";
|
|
7
7
|
import { assertSafeUrl } from "../lib/url-validation.js";
|
|
8
8
|
import { buildCurlArgs } from "./request.js";
|
|
9
|
+
const HTTP_VERSIONS = ["1.0", "1.1", "2"];
|
|
9
10
|
/** Registers the `head` tool on the given MCP server. */
|
|
10
11
|
export function registerHeadTool(server) {
|
|
11
12
|
server.registerTool("head", {
|
|
@@ -27,31 +28,72 @@ export function registerHeadTool(server) {
|
|
|
27
28
|
.optional()
|
|
28
29
|
.default(30)
|
|
29
30
|
.describe("Request timeout in seconds (default: 30)"),
|
|
31
|
+
connectTimeout: z
|
|
32
|
+
.number()
|
|
33
|
+
.min(1)
|
|
34
|
+
.max(300)
|
|
35
|
+
.optional()
|
|
36
|
+
.describe("Maximum time in seconds for connection phase only (--connect-timeout). Fast failure for availability probing."),
|
|
30
37
|
followRedirects: z
|
|
31
38
|
.boolean()
|
|
32
39
|
.optional()
|
|
33
40
|
.default(true)
|
|
34
41
|
.describe("Follow HTTP redirects (default: true)"),
|
|
35
|
-
|
|
42
|
+
insecure: z
|
|
36
43
|
.boolean()
|
|
37
44
|
.optional()
|
|
38
|
-
.
|
|
39
|
-
|
|
40
|
-
|
|
45
|
+
.describe("Allow insecure TLS connections, e.g. self-signed certificates (-k)"),
|
|
46
|
+
retry: z
|
|
47
|
+
.number()
|
|
48
|
+
.min(0)
|
|
49
|
+
.max(10)
|
|
50
|
+
.optional()
|
|
51
|
+
.describe("Number of retries on transient failures (--retry)"),
|
|
52
|
+
basicAuth: z
|
|
41
53
|
.string()
|
|
42
|
-
.max(INPUT_LIMITS.
|
|
54
|
+
.max(INPUT_LIMITS.STRING_MAX)
|
|
55
|
+
.optional()
|
|
56
|
+
.describe("Basic auth credentials as 'user:password' (-u)"),
|
|
57
|
+
proxy: z
|
|
58
|
+
.string()
|
|
59
|
+
.max(INPUT_LIMITS.STRING_MAX)
|
|
60
|
+
.optional()
|
|
61
|
+
.describe("Proxy URL (e.g., http://proxy:8080) (-x)"),
|
|
62
|
+
httpVersion: z
|
|
63
|
+
.enum(HTTP_VERSIONS)
|
|
64
|
+
.optional()
|
|
65
|
+
.describe("HTTP version to use: '1.0', '1.1', or '2' (--http1.0/--http1.1/--http2)"),
|
|
66
|
+
resolve: z
|
|
67
|
+
.string()
|
|
68
|
+
.max(INPUT_LIMITS.STRING_MAX)
|
|
43
69
|
.optional()
|
|
44
|
-
.describe("
|
|
70
|
+
.describe("Custom DNS resolution (--resolve). Format: 'host:port:addr' (e.g., 'example.com:443:127.0.0.1')"),
|
|
71
|
+
compact: z.boolean().optional().default(true).describe("Prefer compact output"),
|
|
72
|
+
path: z.string().max(INPUT_LIMITS.PATH_MAX).optional().describe("Working directory"),
|
|
45
73
|
},
|
|
46
74
|
outputSchema: HttpHeadResponseSchema,
|
|
47
|
-
}, async ({ url, headers, timeout, followRedirects, compact, path }) => {
|
|
75
|
+
}, async ({ url, headers, timeout, connectTimeout, followRedirects, insecure, retry, basicAuth, proxy, httpVersion, resolve, compact, path, }) => {
|
|
48
76
|
assertSafeUrl(url);
|
|
77
|
+
if (basicAuth)
|
|
78
|
+
assertNoFlagInjection(basicAuth, "basicAuth");
|
|
79
|
+
if (proxy)
|
|
80
|
+
assertNoFlagInjection(proxy, "proxy");
|
|
81
|
+
if (resolve)
|
|
82
|
+
assertNoFlagInjection(resolve, "resolve");
|
|
49
83
|
const args = buildCurlArgs({
|
|
50
84
|
url,
|
|
51
85
|
method: "HEAD",
|
|
52
86
|
headers,
|
|
53
87
|
timeout: timeout ?? 30,
|
|
88
|
+
connectTimeout,
|
|
54
89
|
followRedirects: followRedirects ?? true,
|
|
90
|
+
insecure,
|
|
91
|
+
retry,
|
|
92
|
+
basicAuth,
|
|
93
|
+
proxy,
|
|
94
|
+
httpVersion,
|
|
95
|
+
resolve,
|
|
96
|
+
useHeadFlag: true, // Use -I instead of -X HEAD to avoid potential hangs
|
|
55
97
|
});
|
|
56
98
|
const cwd = path || process.cwd();
|
|
57
99
|
const result = await curlCmd(args, cwd);
|
package/dist/tools/head.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"head.js","sourceRoot":"","sources":["../../src/tools/head.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"head.js","sourceRoot":"","sources":["../../src/tools/head.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/post.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"post.d.ts","sourceRoot":"","sources":["../../src/tools/post.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"post.d.ts","sourceRoot":"","sources":["../../src/tools/post.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAezE,yDAAyD;AACzD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,QAyLjD"}
|
package/dist/tools/post.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import { compactDualOutput, INPUT_LIMITS } from "@paretools/shared";
|
|
2
|
+
import { compactDualOutput, assertNoFlagInjection, INPUT_LIMITS } from "@paretools/shared";
|
|
3
3
|
import { curlCmd } from "../lib/curl-runner.js";
|
|
4
4
|
import { parseCurlOutput } from "../lib/parsers.js";
|
|
5
5
|
import { formatHttpResponse, compactResponseMap, formatResponseCompact, } from "../lib/formatters.js";
|
|
6
6
|
import { HttpResponseSchema } from "../schemas/index.js";
|
|
7
7
|
import { assertSafeUrl } from "../lib/url-validation.js";
|
|
8
8
|
import { buildCurlArgs } from "./request.js";
|
|
9
|
+
const HTTP_VERSIONS = ["1.0", "1.1", "2"];
|
|
9
10
|
/** Registers the `post` tool on the given MCP server. */
|
|
10
11
|
export function registerPostTool(server) {
|
|
11
12
|
server.registerTool("post", {
|
|
@@ -16,7 +17,11 @@ export function registerPostTool(server) {
|
|
|
16
17
|
.string()
|
|
17
18
|
.max(INPUT_LIMITS.STRING_MAX)
|
|
18
19
|
.describe("The URL to request (http:// or https:// only)"),
|
|
19
|
-
body: z
|
|
20
|
+
body: z
|
|
21
|
+
.string()
|
|
22
|
+
.max(INPUT_LIMITS.STRING_MAX)
|
|
23
|
+
.optional()
|
|
24
|
+
.describe("Request body. Ignored when `form` is provided."),
|
|
20
25
|
headers: z
|
|
21
26
|
.record(z.string().max(INPUT_LIMITS.SHORT_STRING_MAX), z.string().max(INPUT_LIMITS.STRING_MAX))
|
|
22
27
|
.optional()
|
|
@@ -26,7 +31,7 @@ export function registerPostTool(server) {
|
|
|
26
31
|
.max(INPUT_LIMITS.SHORT_STRING_MAX)
|
|
27
32
|
.optional()
|
|
28
33
|
.default("application/json")
|
|
29
|
-
.describe("Content-Type header (default: application/json)"),
|
|
34
|
+
.describe("Content-Type header (default: application/json). Ignored when `form` is provided."),
|
|
30
35
|
timeout: z
|
|
31
36
|
.number()
|
|
32
37
|
.min(1)
|
|
@@ -34,37 +39,104 @@ export function registerPostTool(server) {
|
|
|
34
39
|
.optional()
|
|
35
40
|
.default(30)
|
|
36
41
|
.describe("Request timeout in seconds (default: 30)"),
|
|
42
|
+
connectTimeout: z
|
|
43
|
+
.number()
|
|
44
|
+
.min(1)
|
|
45
|
+
.max(300)
|
|
46
|
+
.optional()
|
|
47
|
+
.describe("Maximum time in seconds for connection phase only (--connect-timeout). Detects connection failures fast."),
|
|
37
48
|
followRedirects: z
|
|
38
49
|
.boolean()
|
|
39
50
|
.optional()
|
|
40
51
|
.default(true)
|
|
41
52
|
.describe("Follow HTTP redirects (default: true)"),
|
|
42
|
-
|
|
53
|
+
preserveMethodOnRedirect: z
|
|
43
54
|
.boolean()
|
|
44
55
|
.optional()
|
|
45
|
-
.
|
|
46
|
-
|
|
47
|
-
|
|
56
|
+
.describe("Preserve POST method on 301/302/303 redirects instead of converting to GET (--post301/--post302/--post303)"),
|
|
57
|
+
insecure: z
|
|
58
|
+
.boolean()
|
|
59
|
+
.optional()
|
|
60
|
+
.describe("Allow insecure TLS connections, e.g. self-signed certificates (-k)"),
|
|
61
|
+
accept: z
|
|
48
62
|
.string()
|
|
49
|
-
.max(INPUT_LIMITS.
|
|
63
|
+
.max(INPUT_LIMITS.SHORT_STRING_MAX)
|
|
64
|
+
.optional()
|
|
65
|
+
.describe("Expected response format via Accept header (e.g., 'application/json')"),
|
|
66
|
+
compressed: z
|
|
67
|
+
.boolean()
|
|
68
|
+
.optional()
|
|
69
|
+
.describe("Request compressed response and decompress automatically (--compressed)"),
|
|
70
|
+
basicAuth: z
|
|
71
|
+
.string()
|
|
72
|
+
.max(INPUT_LIMITS.STRING_MAX)
|
|
73
|
+
.optional()
|
|
74
|
+
.describe("Basic auth credentials as 'user:password' (-u)"),
|
|
75
|
+
proxy: z
|
|
76
|
+
.string()
|
|
77
|
+
.max(INPUT_LIMITS.STRING_MAX)
|
|
78
|
+
.optional()
|
|
79
|
+
.describe("Proxy URL (e.g., http://proxy:8080) (-x)"),
|
|
80
|
+
dataUrlencode: z
|
|
81
|
+
.array(z.string().max(INPUT_LIMITS.STRING_MAX))
|
|
82
|
+
.optional()
|
|
83
|
+
.describe("URL-encoded form data items (--data-urlencode). Each item is 'key=value'. Use instead of manual URL encoding."),
|
|
84
|
+
form: z
|
|
85
|
+
.record(z.string().max(INPUT_LIMITS.SHORT_STRING_MAX), z.string().max(INPUT_LIMITS.STRING_MAX))
|
|
86
|
+
.optional()
|
|
87
|
+
.describe("Multipart form data as key-value pairs (-F). Each pair maps to `-F key=value`. For file uploads use `@filepath` as the value. When provided, `body` and `contentType` are ignored."),
|
|
88
|
+
httpVersion: z
|
|
89
|
+
.enum(HTTP_VERSIONS)
|
|
50
90
|
.optional()
|
|
51
|
-
.describe("
|
|
91
|
+
.describe("HTTP version to use: '1.0', '1.1', or '2' (--http1.0/--http1.1/--http2)"),
|
|
92
|
+
compact: z.boolean().optional().default(true).describe("Prefer compact output"),
|
|
93
|
+
path: z.string().max(INPUT_LIMITS.PATH_MAX).optional().describe("Working directory"),
|
|
52
94
|
},
|
|
53
95
|
outputSchema: HttpResponseSchema,
|
|
54
|
-
}, async ({ url, body, headers, contentType, timeout, followRedirects, compact, path }) => {
|
|
96
|
+
}, async ({ url, body, headers, contentType, timeout, connectTimeout, followRedirects, preserveMethodOnRedirect, insecure, accept, compressed, basicAuth, proxy, dataUrlencode, form, httpVersion, compact, path, }) => {
|
|
55
97
|
assertSafeUrl(url);
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
98
|
+
if (accept)
|
|
99
|
+
assertNoFlagInjection(accept, "accept");
|
|
100
|
+
if (basicAuth)
|
|
101
|
+
assertNoFlagInjection(basicAuth, "basicAuth");
|
|
102
|
+
if (proxy)
|
|
103
|
+
assertNoFlagInjection(proxy, "proxy");
|
|
104
|
+
if (dataUrlencode) {
|
|
105
|
+
for (const item of dataUrlencode) {
|
|
106
|
+
assertNoFlagInjection(item, "dataUrlencode");
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
if (form) {
|
|
110
|
+
for (const value of Object.values(form)) {
|
|
111
|
+
assertNoFlagInjection(value, "form value");
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
// When form is provided, don't set Content-Type (curl sets multipart/form-data automatically)
|
|
115
|
+
const mergedHeaders = form
|
|
116
|
+
? { ...headers }
|
|
117
|
+
: {
|
|
118
|
+
"Content-Type": contentType ?? "application/json",
|
|
119
|
+
...headers,
|
|
120
|
+
};
|
|
121
|
+
if (accept) {
|
|
122
|
+
mergedHeaders["Accept"] = accept;
|
|
123
|
+
}
|
|
61
124
|
const args = buildCurlArgs({
|
|
62
125
|
url,
|
|
63
126
|
method: "POST",
|
|
64
127
|
headers: mergedHeaders,
|
|
65
|
-
body,
|
|
128
|
+
body: form ? undefined : body,
|
|
66
129
|
timeout: timeout ?? 30,
|
|
130
|
+
connectTimeout,
|
|
67
131
|
followRedirects: followRedirects ?? true,
|
|
132
|
+
insecure,
|
|
133
|
+
compressed,
|
|
134
|
+
basicAuth,
|
|
135
|
+
proxy,
|
|
136
|
+
httpVersion,
|
|
137
|
+
preserveMethodOnRedirect,
|
|
138
|
+
dataUrlencode: form ? undefined : dataUrlencode,
|
|
139
|
+
form,
|
|
68
140
|
});
|
|
69
141
|
const cwd = path || process.cwd();
|
|
70
142
|
const result = await curlCmd(args, cwd);
|
package/dist/tools/post.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"post.js","sourceRoot":"","sources":["../../src/tools/post.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"post.js","sourceRoot":"","sources":["../../src/tools/post.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC3F,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,qBAAqB,GACtB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,CAAU,CAAC;AAEnD,yDAAyD;AACzD,MAAM,UAAU,gBAAgB,CAAC,MAAiB;IAChD,MAAM,CAAC,YAAY,CACjB,MAAM,EACN;QACE,KAAK,EAAE,WAAW;QAClB,WAAW,EACT,wIAAwI;QAC1I,WAAW,EAAE;YACX,GAAG,EAAE,CAAC;iBACH,MAAM,EAAE;iBACR,GAAG,CAAC,YAAY,CAAC,UAAU,CAAC;iBAC5B,QAAQ,CAAC,+CAA+C,CAAC;YAC5D,IAAI,EAAE,CAAC;iBACJ,MAAM,EAAE;iBACR,GAAG,CAAC,YAAY,CAAC,UAAU,CAAC;iBAC5B,QAAQ,EAAE;iBACV,QAAQ,CAAC,gDAAgD,CAAC;YAC7D,OAAO,EAAE,CAAC;iBACP,MAAM,CACL,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,gBAAgB,CAAC,EAC7C,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,UAAU,CAAC,CACxC;iBACA,QAAQ,EAAE;iBACV,QAAQ,CAAC,oCAAoC,CAAC;YACjD,WAAW,EAAE,CAAC;iBACX,MAAM,EAAE;iBACR,GAAG,CAAC,YAAY,CAAC,gBAAgB,CAAC;iBAClC,QAAQ,EAAE;iBACV,OAAO,CAAC,kBAAkB,CAAC;iBAC3B,QAAQ,CACP,mFAAmF,CACpF;YACH,OAAO,EAAE,CAAC;iBACP,MAAM,EAAE;iBACR,GAAG,CAAC,CAAC,CAAC;iBACN,GAAG,CAAC,GAAG,CAAC;iBACR,QAAQ,EAAE;iBACV,OAAO,CAAC,EAAE,CAAC;iBACX,QAAQ,CAAC,0CAA0C,CAAC;YACvD,cAAc,EAAE,CAAC;iBACd,MAAM,EAAE;iBACR,GAAG,CAAC,CAAC,CAAC;iBACN,GAAG,CAAC,GAAG,CAAC;iBACR,QAAQ,EAAE;iBACV,QAAQ,CACP,0GAA0G,CAC3G;YACH,eAAe,EAAE,CAAC;iBACf,OAAO,EAAE;iBACT,QAAQ,EAAE;iBACV,OAAO,CAAC,IAAI,CAAC;iBACb,QAAQ,CAAC,uCAAuC,CAAC;YACpD,wBAAwB,EAAE,CAAC;iBACxB,OAAO,EAAE;iBACT,QAAQ,EAAE;iBACV,QAAQ,CACP,4GAA4G,CAC7G;YACH,QAAQ,EAAE,CAAC;iBACR,OAAO,EAAE;iBACT,QAAQ,EAAE;iBACV,QAAQ,CAAC,oEAAoE,CAAC;YACjF,MAAM,EAAE,CAAC;iBACN,MAAM,EAAE;iBACR,GAAG,CAAC,YAAY,CAAC,gBAAgB,CAAC;iBAClC,QAAQ,EAAE;iBACV,QAAQ,CAAC,uEAAuE,CAAC;YACpF,UAAU,EAAE,CAAC;iBACV,OAAO,EAAE;iBACT,QAAQ,EAAE;iBACV,QAAQ,CAAC,yEAAyE,CAAC;YACtF,SAAS,EAAE,CAAC;iBACT,MAAM,EAAE;iBACR,GAAG,CAAC,YAAY,CAAC,UAAU,CAAC;iBAC5B,QAAQ,EAAE;iBACV,QAAQ,CAAC,gDAAgD,CAAC;YAC7D,KAAK,EAAE,CAAC;iBACL,MAAM,EAAE;iBACR,GAAG,CAAC,YAAY,CAAC,UAAU,CAAC;iBAC5B,QAAQ,EAAE;iBACV,QAAQ,CAAC,0CAA0C,CAAC;YACvD,aAAa,EAAE,CAAC;iBACb,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;iBAC9C,QAAQ,EAAE;iBACV,QAAQ,CACP,+GAA+G,CAChH;YACH,IAAI,EAAE,CAAC;iBACJ,MAAM,CACL,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,gBAAgB,CAAC,EAC7C,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,UAAU,CAAC,CACxC;iBACA,QAAQ,EAAE;iBACV,QAAQ,CACP,oLAAoL,CACrL;YACH,WAAW,EAAE,CAAC;iBACX,IAAI,CAAC,aAAa,CAAC;iBACnB,QAAQ,EAAE;iBACV,QAAQ,CAAC,yEAAyE,CAAC;YACtF,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,uBAAuB,CAAC;YAC/E,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;SACrF;QACD,YAAY,EAAE,kBAAkB;KACjC,EACD,KAAK,EAAE,EACL,GAAG,EACH,IAAI,EACJ,OAAO,EACP,WAAW,EACX,OAAO,EACP,cAAc,EACd,eAAe,EACf,wBAAwB,EACxB,QAAQ,EACR,MAAM,EACN,UAAU,EACV,SAAS,EACT,KAAK,EACL,aAAa,EACb,IAAI,EACJ,WAAW,EACX,OAAO,EACP,IAAI,GACL,EAAE,EAAE;QACH,aAAa,CAAC,GAAG,CAAC,CAAC;QACnB,IAAI,MAAM;YAAE,qBAAqB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QACpD,IAAI,SAAS;YAAE,qBAAqB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAC7D,IAAI,KAAK;YAAE,qBAAqB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACjD,IAAI,aAAa,EAAE,CAAC;YAClB,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;gBACjC,qBAAqB,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;QACD,IAAI,IAAI,EAAE,CAAC;YACT,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;gBACxC,qBAAqB,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;QAED,8FAA8F;QAC9F,MAAM,aAAa,GAA2B,IAAI;YAChD,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE;YAChB,CAAC,CAAC;gBACE,cAAc,EAAE,WAAW,IAAI,kBAAkB;gBACjD,GAAG,OAAO;aACX,CAAC;QAEN,IAAI,MAAM,EAAE,CAAC;YACX,aAAa,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC;QACnC,CAAC;QAED,MAAM,IAAI,GAAG,aAAa,CAAC;YACzB,GAAG;YACH,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,aAAa;YACtB,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI;YAC7B,OAAO,EAAE,OAAO,IAAI,EAAE;YACtB,cAAc;YACd,eAAe,EAAE,eAAe,IAAI,IAAI;YACxC,QAAQ;YACR,UAAU;YACV,SAAS;YACT,KAAK;YACL,WAAW;YACX,wBAAwB;YACxB,aAAa,EAAE,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa;YAC/C,IAAI;SACL,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACxC,MAAM,IAAI,GAAG,eAAe,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC5E,MAAM,SAAS,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QAEhE,OAAO,iBAAiB,CACtB,IAAI,EACJ,SAAS,EACT,kBAAkB,EAClB,kBAAkB,EAClB,qBAAqB,EACrB,OAAO,KAAK,KAAK,CAClB,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|
package/dist/tools/request.d.ts
CHANGED
|
@@ -2,15 +2,37 @@ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
|
2
2
|
/** Registers the `request` tool on the given MCP server. */
|
|
3
3
|
export declare function registerRequestTool(server: McpServer): void;
|
|
4
4
|
/**
|
|
5
|
-
*
|
|
6
|
-
*
|
|
5
|
+
* Options for building curl arguments.
|
|
6
|
+
* Shared by all HTTP tools (get, post, head, request).
|
|
7
7
|
*/
|
|
8
|
-
export
|
|
8
|
+
export interface BuildCurlArgsOptions {
|
|
9
9
|
url: string;
|
|
10
10
|
method: string;
|
|
11
11
|
headers?: Record<string, string>;
|
|
12
12
|
body?: string;
|
|
13
13
|
timeout: number;
|
|
14
|
+
connectTimeout?: number;
|
|
14
15
|
followRedirects: boolean;
|
|
15
|
-
|
|
16
|
+
insecure?: boolean;
|
|
17
|
+
retry?: number;
|
|
18
|
+
compressed?: boolean;
|
|
19
|
+
basicAuth?: string;
|
|
20
|
+
proxy?: string;
|
|
21
|
+
httpVersion?: string;
|
|
22
|
+
cookie?: string;
|
|
23
|
+
resolve?: string;
|
|
24
|
+
/** When true, use -I (--head) instead of -X HEAD for proper HEAD behavior. */
|
|
25
|
+
useHeadFlag?: boolean;
|
|
26
|
+
/** When true, add --post301 --post302 --post303 to preserve POST method on redirects. */
|
|
27
|
+
preserveMethodOnRedirect?: boolean;
|
|
28
|
+
/** URL-encoded form data items passed via --data-urlencode. */
|
|
29
|
+
dataUrlencode?: string[];
|
|
30
|
+
/** Multipart form data items passed via -F. Each key-value becomes -F key=value. */
|
|
31
|
+
form?: Record<string, string>;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Builds the curl argument array from the request parameters.
|
|
35
|
+
* Exported for reuse in get/post/head tools.
|
|
36
|
+
*/
|
|
37
|
+
export declare function buildCurlArgs(opts: BuildCurlArgsOptions): string[];
|
|
16
38
|
//# sourceMappingURL=request.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../../src/tools/request.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../../src/tools/request.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAezE,4DAA4D;AAC5D,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,QAsKpD;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8EAA8E;IAC9E,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,yFAAyF;IACzF,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,+DAA+D;IAC/D,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,oFAAoF;IACpF,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/B;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,oBAAoB,GAAG,MAAM,EAAE,CA0IlE"}
|