@mcpmake/core 0.2.4 → 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/dist/analyzer/dom-parser.d.ts +35 -0
- package/dist/analyzer/dom-parser.d.ts.map +1 -1
- package/dist/analyzer/dom-parser.js +107 -6
- package/dist/analyzer/dom-parser.js.map +1 -1
- package/dist/analyzer/goal-crawler.d.ts +2 -1
- package/dist/analyzer/goal-crawler.d.ts.map +1 -1
- package/dist/analyzer/goal-crawler.js +66 -17
- package/dist/analyzer/goal-crawler.js.map +1 -1
- package/dist/analyzer/semantic-analyzer.d.ts +1 -1
- package/dist/analyzer/semantic-analyzer.d.ts.map +1 -1
- package/dist/analyzer/semantic-analyzer.js +15 -16
- package/dist/analyzer/semantic-analyzer.js.map +1 -1
- package/dist/analyzer/site-crawler.d.ts.map +1 -1
- package/dist/analyzer/site-crawler.js +122 -16
- package/dist/analyzer/site-crawler.js.map +1 -1
- package/dist/config/mcpmake-config.d.ts.map +1 -1
- package/dist/config/mcpmake-config.js +5 -0
- package/dist/config/mcpmake-config.js.map +1 -1
- package/dist/emitter/code-writer.d.ts +1 -0
- package/dist/emitter/code-writer.d.ts.map +1 -1
- package/dist/emitter/code-writer.js +79 -12
- package/dist/emitter/code-writer.js.map +1 -1
- package/dist/emitter/index.d.ts +8 -0
- package/dist/emitter/index.d.ts.map +1 -1
- package/dist/emitter/index.js +113 -6
- package/dist/emitter/index.js.map +1 -1
- package/dist/emitter/project-scaffolder.d.ts +13 -0
- package/dist/emitter/project-scaffolder.d.ts.map +1 -1
- package/dist/emitter/project-scaffolder.js +29 -0
- package/dist/emitter/project-scaffolder.js.map +1 -1
- package/dist/emitter/python-template-loader.d.ts.map +1 -1
- package/dist/emitter/python-template-loader.js +10 -0
- package/dist/emitter/python-template-loader.js.map +1 -1
- package/dist/emitter/python-templates/dockerfile.hbs +4 -1
- package/dist/emitter/python-templates/server.py.hbs +82 -8
- package/dist/emitter/site-scaffolder.d.ts.map +1 -1
- package/dist/emitter/site-scaffolder.js +28 -1
- package/dist/emitter/site-scaffolder.js.map +1 -1
- package/dist/emitter/site-templates/browser-manager.ts.hbs +104 -34
- package/dist/emitter/site-templates/dockerfile.hbs +13 -4
- package/dist/emitter/site-templates/env.example.hbs +8 -0
- package/dist/emitter/site-templates/server-main-http.ts.hbs +77 -6
- package/dist/emitter/site-templates/telemetry.ts.hbs +117 -0
- package/dist/emitter/site-templates/tool-handler-form.ts.hbs +10 -8
- package/dist/emitter/template-loader.d.ts.map +1 -1
- package/dist/emitter/template-loader.js +9 -0
- package/dist/emitter/template-loader.js.map +1 -1
- package/dist/emitter/templates/auth-provider.ts.hbs +86 -21
- package/dist/emitter/templates/config.ts.hbs +29 -0
- package/dist/emitter/templates/dockerfile.hbs +12 -4
- package/dist/emitter/templates/env.example.hbs +6 -0
- package/dist/emitter/templates/http-executor.ts.hbs +150 -7
- package/dist/emitter/templates/oauth.ts.hbs +19 -65
- package/dist/emitter/templates/server-main-http.ts.hbs +93 -12
- package/dist/emitter/templates/task-handlers.ts.hbs +40 -1
- package/dist/emitter/templates/tool-handler.ts.hbs +37 -2
- package/dist/emitter/templates/tool-test.ts.hbs +9 -1
- package/dist/emitter/worker-templates/config.ts.hbs +7 -0
- package/dist/emitter/worker-templates/tool-handler.ts.hbs +37 -2
- package/dist/emitter/worker-templates/worker.ts.hbs +119 -25
- package/dist/generator/spec-generator.d.ts.map +1 -1
- package/dist/generator/spec-generator.js +9 -54
- package/dist/generator/spec-generator.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/llm/anthropic-provider.d.ts +14 -0
- package/dist/llm/anthropic-provider.d.ts.map +1 -0
- package/dist/llm/anthropic-provider.js +50 -0
- package/dist/llm/anthropic-provider.js.map +1 -0
- package/dist/llm/index.d.ts +19 -0
- package/dist/llm/index.d.ts.map +1 -0
- package/dist/llm/index.js +73 -0
- package/dist/llm/index.js.map +1 -0
- package/dist/llm/openai-provider.d.ts +46 -0
- package/dist/llm/openai-provider.d.ts.map +1 -0
- package/dist/llm/openai-provider.js +221 -0
- package/dist/llm/openai-provider.js.map +1 -0
- package/dist/llm/types.d.ts +61 -0
- package/dist/llm/types.d.ts.map +1 -0
- package/dist/llm/types.js +16 -0
- package/dist/llm/types.js.map +1 -0
- package/dist/parser/har-filter.d.ts +7 -0
- package/dist/parser/har-filter.d.ts.map +1 -1
- package/dist/parser/har-filter.js +107 -1
- package/dist/parser/har-filter.js.map +1 -1
- package/dist/parser/index.d.ts +1 -1
- package/dist/parser/index.d.ts.map +1 -1
- package/dist/parser/index.js +1 -1
- package/dist/parser/index.js.map +1 -1
- package/dist/parser/openapi-loader.d.ts.map +1 -1
- package/dist/parser/openapi-loader.js +36 -2
- package/dist/parser/openapi-loader.js.map +1 -1
- package/dist/parser/operation-extractor.d.ts.map +1 -1
- package/dist/parser/operation-extractor.js +12 -1
- package/dist/parser/operation-extractor.js.map +1 -1
- package/dist/parser/overlay-loader.d.ts.map +1 -1
- package/dist/parser/overlay-loader.js +11 -2
- package/dist/parser/overlay-loader.js.map +1 -1
- package/dist/parser/postman-loader.d.ts.map +1 -1
- package/dist/parser/postman-loader.js +6 -1
- package/dist/parser/postman-loader.js.map +1 -1
- package/dist/parser/schema-converter.d.ts +13 -2
- package/dist/parser/schema-converter.d.ts.map +1 -1
- package/dist/parser/schema-converter.js +64 -42
- package/dist/parser/schema-converter.js.map +1 -1
- package/dist/plugins/loader.d.ts +5 -1
- package/dist/plugins/loader.d.ts.map +1 -1
- package/dist/plugins/loader.js +39 -10
- package/dist/plugins/loader.js.map +1 -1
- package/dist/pricing.d.ts +5 -1
- package/dist/pricing.d.ts.map +1 -1
- package/dist/pricing.js +7 -3
- package/dist/pricing.js.map +1 -1
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +6 -21
- package/dist/providers/index.js.map +1 -1
- package/dist/recorder/browser-recorder.d.ts.map +1 -1
- package/dist/recorder/browser-recorder.js +89 -12
- package/dist/recorder/browser-recorder.js.map +1 -1
- package/dist/rescan/rescan-scheduler.d.ts.map +1 -1
- package/dist/rescan/rescan-scheduler.js +22 -7
- package/dist/rescan/rescan-scheduler.js.map +1 -1
- package/dist/site-transformer/selector-healer.d.ts +1 -1
- package/dist/site-transformer/selector-healer.d.ts.map +1 -1
- package/dist/site-transformer/selector-healer.js +17 -18
- package/dist/site-transformer/selector-healer.js.map +1 -1
- package/dist/site-transformer/tool-generator.d.ts.map +1 -1
- package/dist/site-transformer/tool-generator.js +90 -22
- package/dist/site-transformer/tool-generator.js.map +1 -1
- package/dist/transformer/auth-detector.d.ts.map +1 -1
- package/dist/transformer/auth-detector.js +24 -5
- package/dist/transformer/auth-detector.js.map +1 -1
- package/dist/transformer/har-schema-inferrer.d.ts.map +1 -1
- package/dist/transformer/har-schema-inferrer.js +2 -0
- package/dist/transformer/har-schema-inferrer.js.map +1 -1
- package/dist/transformer/har-to-operations.d.ts +1 -0
- package/dist/transformer/har-to-operations.d.ts.map +1 -1
- package/dist/transformer/har-to-operations.js +42 -10
- package/dist/transformer/har-to-operations.js.map +1 -1
- package/dist/transformer/llm-namer.d.ts.map +1 -1
- package/dist/transformer/llm-namer.js +10 -13
- package/dist/transformer/llm-namer.js.map +1 -1
- package/dist/transformer/naming.d.ts.map +1 -1
- package/dist/transformer/naming.js +16 -8
- package/dist/transformer/naming.js.map +1 -1
- package/dist/transformer/resource-builder.d.ts.map +1 -1
- package/dist/transformer/resource-builder.js +13 -6
- package/dist/transformer/resource-builder.js.map +1 -1
- package/dist/transformer/stainless-translator.d.ts +6 -0
- package/dist/transformer/stainless-translator.d.ts.map +1 -1
- package/dist/transformer/stainless-translator.js +18 -1
- package/dist/transformer/stainless-translator.js.map +1 -1
- package/dist/transformer/tool-builder.d.ts.map +1 -1
- package/dist/transformer/tool-builder.js +141 -14
- package/dist/transformer/tool-builder.js.map +1 -1
- package/dist/types/index.d.ts +79 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/site.d.ts +19 -1
- package/dist/types/site.d.ts.map +1 -1
- package/dist/utils/fail.d.ts.map +1 -1
- package/dist/utils/fail.js +22 -4
- package/dist/utils/fail.js.map +1 -1
- package/dist/utils/json-extract.d.ts +21 -0
- package/dist/utils/json-extract.d.ts.map +1 -0
- package/dist/utils/json-extract.js +67 -0
- package/dist/utils/json-extract.js.map +1 -0
- package/dist/utils/model-resolver.d.ts.map +1 -1
- package/dist/utils/model-resolver.js +6 -0
- package/dist/utils/model-resolver.js.map +1 -1
- package/dist/utils/sanitize.d.ts +63 -1
- package/dist/utils/sanitize.d.ts.map +1 -1
- package/dist/utils/sanitize.js +147 -2
- package/dist/utils/sanitize.js.map +1 -1
- package/dist/utils/ssrf-guard.d.ts +10 -0
- package/dist/utils/ssrf-guard.d.ts.map +1 -0
- package/dist/utils/ssrf-guard.js +130 -0
- package/dist/utils/ssrf-guard.js.map +1 -0
- package/dist/utils/watcher.d.ts +17 -1
- package/dist/utils/watcher.d.ts.map +1 -1
- package/dist/utils/watcher.js +53 -21
- package/dist/utils/watcher.js.map +1 -1
- package/package.json +2 -1
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { jsonSchemaToZod } from 'json-schema-to-zod';
|
|
2
|
-
import { sanitizeIdentifier } from '../utils/sanitize.js';
|
|
3
2
|
import { logger } from '../utils/logger.js';
|
|
4
3
|
const MAX_SCHEMA_DEPTH = 15;
|
|
5
4
|
/**
|
|
@@ -9,38 +8,49 @@ const MAX_SCHEMA_DEPTH = 15;
|
|
|
9
8
|
function simplifySchema(schema, depth = 0, seen = new WeakSet()) {
|
|
10
9
|
if (!schema || typeof schema !== 'object')
|
|
11
10
|
return schema;
|
|
12
|
-
// Circular reference detection
|
|
11
|
+
// Circular reference detection: `seen` is the set of nodes on the current DFS
|
|
12
|
+
// path (ancestors only). A hit here is a true back-edge to an ancestor, i.e. an
|
|
13
|
+
// infinite cycle. A node reused across sibling branches (DAG/diamond) is NOT an
|
|
14
|
+
// ancestor when revisited, so it is fully expanded each time instead of being
|
|
15
|
+
// falsely truncated and silently dropping fields (M2).
|
|
13
16
|
if (seen.has(schema)) {
|
|
14
17
|
return { type: 'object', description: 'Truncated: circular reference' };
|
|
15
18
|
}
|
|
16
|
-
|
|
17
|
-
// Depth limit
|
|
19
|
+
// Depth limit (independent of cycle detection; bounds even acyclic deep nesting).
|
|
18
20
|
if (depth > MAX_SCHEMA_DEPTH) {
|
|
19
21
|
return { type: 'object', description: 'Truncated: max depth exceeded' };
|
|
20
22
|
}
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
simplified
|
|
23
|
+
seen.add(schema);
|
|
24
|
+
try {
|
|
25
|
+
// Unwrap single-item allOf (common in OpenAPI after $ref resolution)
|
|
26
|
+
if (schema.allOf && Array.isArray(schema.allOf) && schema.allOf.length === 1) {
|
|
27
|
+
const inner = schema.allOf[0];
|
|
28
|
+
const { allOf, ...rest } = schema;
|
|
29
|
+
return simplifySchema({ ...inner, ...rest }, depth + 1, seen);
|
|
30
|
+
}
|
|
31
|
+
// Handle nullable shorthand: { type: "string", nullable: true }
|
|
32
|
+
if (schema.nullable === true && schema.type) {
|
|
33
|
+
const { nullable, ...rest } = schema;
|
|
34
|
+
return { oneOf: [rest, { type: 'null' }] };
|
|
35
|
+
}
|
|
36
|
+
// Recursively simplify nested schemas
|
|
37
|
+
if (schema.properties && typeof schema.properties === 'object') {
|
|
38
|
+
const simplified = {};
|
|
39
|
+
for (const [key, value] of Object.entries(schema.properties)) {
|
|
40
|
+
simplified[key] = simplifySchema(value, depth + 1, seen);
|
|
41
|
+
}
|
|
42
|
+
return { ...schema, properties: simplified };
|
|
37
43
|
}
|
|
38
|
-
|
|
44
|
+
if (schema.items && typeof schema.items === 'object') {
|
|
45
|
+
return { ...schema, items: simplifySchema(schema.items, depth + 1, seen) };
|
|
46
|
+
}
|
|
47
|
+
return schema;
|
|
39
48
|
}
|
|
40
|
-
|
|
41
|
-
|
|
49
|
+
finally {
|
|
50
|
+
// Remove from the DFS path once this subtree is fully processed so sibling
|
|
51
|
+
// branches that share the same node are not mistaken for cycles.
|
|
52
|
+
seen.delete(schema);
|
|
42
53
|
}
|
|
43
|
-
return schema;
|
|
44
54
|
}
|
|
45
55
|
/**
|
|
46
56
|
* Wrap array root schemas in an object for MCP outputSchema compatibility.
|
|
@@ -73,17 +83,29 @@ export function jsonSchemaToOutputZodCode(schema) {
|
|
|
73
83
|
}
|
|
74
84
|
export function buildOperationInputSchema(op) {
|
|
75
85
|
const fields = [];
|
|
76
|
-
const
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
//
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
86
|
+
const mappings = [];
|
|
87
|
+
// Track the MCP input keys we have already emitted so colliding parameters
|
|
88
|
+
// (e.g. a query and a header both named `token`) get distinct keys.
|
|
89
|
+
const seenKeys = new Set();
|
|
90
|
+
const uniqueKey = (wireName, location) => {
|
|
91
|
+
// The wire name is emitted as a JSON.stringify'd object key, so any string
|
|
92
|
+
// is a legal property — we keep the original name as the input key for
|
|
93
|
+
// fidelity and only disambiguate true collisions.
|
|
94
|
+
let key = wireName;
|
|
95
|
+
if (seenKeys.has(key)) {
|
|
96
|
+
key = `${wireName}_${location}`;
|
|
97
|
+
logger.warn(`Parameter name collision: "${wireName}" exposed as "${key}"`);
|
|
85
98
|
}
|
|
86
|
-
|
|
99
|
+
let n = 1;
|
|
100
|
+
while (seenKeys.has(key)) {
|
|
101
|
+
key = `${wireName}_${location}_${n++}`;
|
|
102
|
+
}
|
|
103
|
+
seenKeys.add(key);
|
|
104
|
+
return key;
|
|
105
|
+
};
|
|
106
|
+
for (const param of op.parameters) {
|
|
107
|
+
const inputKey = uniqueKey(param.name, param.in);
|
|
108
|
+
mappings.push({ inputKey, wireName: param.name, in: param.in });
|
|
87
109
|
const zodType = jsonSchemaToZodCode(param.schema);
|
|
88
110
|
let field = zodType;
|
|
89
111
|
if (!param.required) {
|
|
@@ -92,14 +114,16 @@ export function buildOperationInputSchema(op) {
|
|
|
92
114
|
if (param.description) {
|
|
93
115
|
field = `${field}.describe(${JSON.stringify(param.description)})`;
|
|
94
116
|
}
|
|
95
|
-
|
|
117
|
+
// The key is JSON.stringify'd so names like `page-size` or `2fa` are legal
|
|
118
|
+
// TS object keys instead of producing invalid source (D-H1).
|
|
119
|
+
fields.push(` ${JSON.stringify(inputKey)}: ${field}`);
|
|
96
120
|
}
|
|
97
121
|
if (op.requestBody) {
|
|
98
122
|
let bodyName = 'body';
|
|
99
|
-
if (
|
|
123
|
+
if (seenKeys.has(bodyName)) {
|
|
100
124
|
bodyName = 'requestBody';
|
|
101
125
|
}
|
|
102
|
-
|
|
126
|
+
seenKeys.add(bodyName);
|
|
103
127
|
const bodyZod = jsonSchemaToZodCode(op.requestBody.schema);
|
|
104
128
|
let field = bodyZod;
|
|
105
129
|
if (!op.requestBody.required) {
|
|
@@ -108,11 +132,9 @@ export function buildOperationInputSchema(op) {
|
|
|
108
132
|
if (op.requestBody.description) {
|
|
109
133
|
field = `${field}.describe(${JSON.stringify(op.requestBody.description)})`;
|
|
110
134
|
}
|
|
111
|
-
fields.push(` ${bodyName}: ${field}`);
|
|
112
|
-
}
|
|
113
|
-
if (fields.length === 0) {
|
|
114
|
-
return 'z.object({})';
|
|
135
|
+
fields.push(` ${JSON.stringify(bodyName)}: ${field}`);
|
|
115
136
|
}
|
|
116
|
-
|
|
137
|
+
const code = fields.length === 0 ? 'z.object({})' : `z.object({\n${fields.join(',\n')},\n})`;
|
|
138
|
+
return { code, mappings };
|
|
117
139
|
}
|
|
118
140
|
//# sourceMappingURL=schema-converter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema-converter.js","sourceRoot":"","sources":["../../src/parser/schema-converter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"schema-converter.js","sourceRoot":"","sources":["../../src/parser/schema-converter.ts"],"names":[],"mappings":"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"}
|
package/dist/plugins/loader.d.ts
CHANGED
|
@@ -21,6 +21,10 @@ export declare function getAdapter(name: string): McpmakeAdapter | undefined;
|
|
|
21
21
|
export declare function listAdapters(): McpmakeAdapter[];
|
|
22
22
|
/**
|
|
23
23
|
* Load an adapter from a file path or npm package name.
|
|
24
|
+
*
|
|
25
|
+
* `pluginsDir` is the operator-configured directory that local-path adapters
|
|
26
|
+
* must live under; bare npm package names load regardless. See
|
|
27
|
+
* `resolveSpecifier` for the trust boundary.
|
|
24
28
|
*/
|
|
25
|
-
export declare function loadAdapterFromPath(pathOrPackage: string): Promise<McpmakeAdapter>;
|
|
29
|
+
export declare function loadAdapterFromPath(pathOrPackage: string, pluginsDir?: string): Promise<McpmakeAdapter>;
|
|
26
30
|
//# sourceMappingURL=loader.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/plugins/loader.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/plugins/loader.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAKnD;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,CAK7D;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAEnE;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,cAAc,EAAE,CAE/C;AA2CD;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CACvC,aAAa,EAAE,MAAM,EACrB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,cAAc,CAAC,CAqBzB"}
|
package/dist/plugins/loader.js
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
* 2. npm packages named `mcpmake-adapter-*`
|
|
7
7
|
* 3. Local files specified via --adapter flag
|
|
8
8
|
*/
|
|
9
|
+
import { isAbsolute, relative, resolve } from 'node:path';
|
|
9
10
|
import { pathToFileURL } from 'node:url';
|
|
10
11
|
import { logger } from '../utils/logger.js';
|
|
11
12
|
const registry = new Map();
|
|
@@ -30,21 +31,49 @@ export function getAdapter(name) {
|
|
|
30
31
|
export function listAdapters() {
|
|
31
32
|
return [...registry.values()];
|
|
32
33
|
}
|
|
34
|
+
/** Bare npm package: `pkg`, `@scope/pkg`, optional subpath (`pkg/sub`). */
|
|
35
|
+
const BARE_PACKAGE = /^(?:@[a-z0-9-~][a-z0-9-._~]*\/)?[a-z0-9-~][a-z0-9-._~]*(?:\/[^\s]+)?$/i;
|
|
36
|
+
/**
|
|
37
|
+
* Resolve + validate a plugin specifier into something safe to `import()`.
|
|
38
|
+
*
|
|
39
|
+
* Trust boundary: the specifier is operator-configured (a `--adapter` flag or a
|
|
40
|
+
* trusted config), NOT end-user input — so this is hardening, not a full
|
|
41
|
+
* sandbox. We accept only (a) bare npm package names (optionally scoped) and
|
|
42
|
+
* (b) local paths that resolve *inside* `pluginsDir` when one is supplied.
|
|
43
|
+
* Path-traversal and absolute paths that escape the allowed dir are rejected so
|
|
44
|
+
* a stray/typo'd config cannot turn into an arbitrary-file `import()`.
|
|
45
|
+
*/
|
|
46
|
+
function resolveSpecifier(pathOrPackage, pluginsDir) {
|
|
47
|
+
const isPathLike = pathOrPackage.startsWith('.') || pathOrPackage.startsWith('/') || isAbsolute(pathOrPackage);
|
|
48
|
+
if (!isPathLike) {
|
|
49
|
+
if (!BARE_PACKAGE.test(pathOrPackage)) {
|
|
50
|
+
throw new Error(`Invalid adapter specifier "${pathOrPackage}": not a valid npm package name`);
|
|
51
|
+
}
|
|
52
|
+
return pathOrPackage; // resolved by the Node module resolver
|
|
53
|
+
}
|
|
54
|
+
if (!pluginsDir) {
|
|
55
|
+
throw new Error(`Refusing to load adapter from path "${pathOrPackage}": no plugins directory is configured`);
|
|
56
|
+
}
|
|
57
|
+
const base = resolve(pluginsDir);
|
|
58
|
+
const target = resolve(base, pathOrPackage);
|
|
59
|
+
const rel = relative(base, target);
|
|
60
|
+
if (rel === '' || rel.startsWith('..') || isAbsolute(rel)) {
|
|
61
|
+
throw new Error(`Refusing to load adapter "${pathOrPackage}": resolves outside the plugins directory`);
|
|
62
|
+
}
|
|
63
|
+
return pathToFileURL(target).href;
|
|
64
|
+
}
|
|
33
65
|
/**
|
|
34
66
|
* Load an adapter from a file path or npm package name.
|
|
67
|
+
*
|
|
68
|
+
* `pluginsDir` is the operator-configured directory that local-path adapters
|
|
69
|
+
* must live under; bare npm package names load regardless. See
|
|
70
|
+
* `resolveSpecifier` for the trust boundary.
|
|
35
71
|
*/
|
|
36
|
-
export async function loadAdapterFromPath(pathOrPackage) {
|
|
72
|
+
export async function loadAdapterFromPath(pathOrPackage, pluginsDir) {
|
|
37
73
|
let module;
|
|
74
|
+
const specifier = resolveSpecifier(pathOrPackage, pluginsDir);
|
|
38
75
|
try {
|
|
39
|
-
|
|
40
|
-
// Local file
|
|
41
|
-
const url = pathToFileURL(pathOrPackage).href;
|
|
42
|
-
module = await import(url);
|
|
43
|
-
}
|
|
44
|
-
else {
|
|
45
|
-
// npm package
|
|
46
|
-
module = await import(pathOrPackage);
|
|
47
|
-
}
|
|
76
|
+
module = await import(specifier);
|
|
48
77
|
}
|
|
49
78
|
catch (err) {
|
|
50
79
|
throw new Error(`Failed to load adapter from "${pathOrPackage}": ${err instanceof Error ? err.message : err}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/plugins/loader.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA0B,CAAC;AAEnD;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,OAAuB;IACrD,IAAI,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,MAAM,CAAC,IAAI,CAAC,YAAY,OAAO,CAAC,IAAI,mCAAmC,CAAC,CAAC;IAC3E,CAAC;IACD,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACtC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,OAAO,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY;IAC1B,OAAO,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;AAChC,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/plugins/loader.ts"],"names":[],"mappings":"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"}
|
package/dist/pricing.d.ts
CHANGED
|
@@ -41,7 +41,11 @@ export declare const DEFAULT_PRICING_SERVER = "https://mcpmake.dev";
|
|
|
41
41
|
* when the backend is unreachable, slow, or returns anything unexpected — the
|
|
42
42
|
* CLI must still work offline.
|
|
43
43
|
*
|
|
44
|
-
*
|
|
44
|
+
* Server precedence: an explicit `serverUrl` wins; otherwise the `MCPMAKE_SERVER`
|
|
45
|
+
* env var (so the CLI can be pointed at a staging backend, matching the telemetry
|
|
46
|
+
* reporter in `utils/fail.ts`); otherwise {@link DEFAULT_PRICING_SERVER}.
|
|
47
|
+
*
|
|
48
|
+
* @param serverUrl Backend base URL. Defaults to `$MCPMAKE_SERVER`, then {@link DEFAULT_PRICING_SERVER}.
|
|
45
49
|
* @param timeoutMs Abort the request after this long (default 4000 ms).
|
|
46
50
|
*/
|
|
47
51
|
export declare function fetchPricing(serverUrl?: string, timeoutMs?: number): Promise<{
|
package/dist/pricing.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pricing.d.ts","sourceRoot":"","sources":["../src/pricing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;AAE7D,MAAM,WAAW,UAAU;IACzB,0BAA0B;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,0CAA0C;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,aAAa,CAAC;IACtB,sDAAsD;IACtD,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,4EAA4E;AAC5E,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CA0CvD,CAAC;AAEF,6DAA6D;AAC7D,eAAO,MAAM,sBAAsB,wBAAwB,CAAC;AAe5D
|
|
1
|
+
{"version":3,"file":"pricing.d.ts","sourceRoot":"","sources":["../src/pricing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;AAE7D,MAAM,WAAW,UAAU;IACzB,0BAA0B;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,0CAA0C;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,aAAa,CAAC;IACtB,sDAAsD;IACtD,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,4EAA4E;AAC5E,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CA0CvD,CAAC;AAEF,6DAA6D;AAC7D,eAAO,MAAM,sBAAsB,wBAAwB,CAAC;AAe5D;;;;;;;;;;;;GAYG;AACH,wBAAsB,YAAY,CAChC,SAAS,CAAC,EAAE,MAAM,EAClB,SAAS,SAAQ,GAChB,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAAC,MAAM,EAAE,SAAS,GAAG,SAAS,CAAA;CAAE,CAAC,CAgCjF;AAQD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM,CAUjD"}
|
package/dist/pricing.js
CHANGED
|
@@ -76,14 +76,18 @@ function isPricePoint(v) {
|
|
|
76
76
|
* when the backend is unreachable, slow, or returns anything unexpected — the
|
|
77
77
|
* CLI must still work offline.
|
|
78
78
|
*
|
|
79
|
-
*
|
|
79
|
+
* Server precedence: an explicit `serverUrl` wins; otherwise the `MCPMAKE_SERVER`
|
|
80
|
+
* env var (so the CLI can be pointed at a staging backend, matching the telemetry
|
|
81
|
+
* reporter in `utils/fail.ts`); otherwise {@link DEFAULT_PRICING_SERVER}.
|
|
82
|
+
*
|
|
83
|
+
* @param serverUrl Backend base URL. Defaults to `$MCPMAKE_SERVER`, then {@link DEFAULT_PRICING_SERVER}.
|
|
80
84
|
* @param timeoutMs Abort the request after this long (default 4000 ms).
|
|
81
85
|
*/
|
|
82
|
-
export async function fetchPricing(serverUrl
|
|
86
|
+
export async function fetchPricing(serverUrl, timeoutMs = 4_000) {
|
|
83
87
|
const controller = new AbortController();
|
|
84
88
|
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
85
89
|
try {
|
|
86
|
-
const base = serverUrl.replace(/\/+$/, '');
|
|
90
|
+
const base = (serverUrl ?? process.env.MCPMAKE_SERVER ?? DEFAULT_PRICING_SERVER).replace(/\/+$/, '');
|
|
87
91
|
const res = await fetch(`${base}/api/pricing`, {
|
|
88
92
|
headers: { accept: 'application/json' },
|
|
89
93
|
signal: controller.signal,
|
package/dist/pricing.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pricing.js","sourceRoot":"","sources":["../src/pricing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAqBH,4EAA4E;AAC5E,MAAM,CAAC,MAAM,gBAAgB,GAA+B;IAC1D,GAAG,EAAE;QACH,EAAE,EAAE,KAAK;QACT,IAAI,EAAE,sBAAsB;QAC5B,QAAQ,EAAE,CAAC;QACX,WAAW,EAAE,IAAI;QACjB,MAAM,EAAE,SAAS;QACjB,OAAO,EACL,+FAA+F;KAClG;IACD,QAAQ,EAAE;QACR,EAAE,EAAE,WAAW;QACf,IAAI,EAAE,aAAa;QACnB,QAAQ,EAAE,EAAE;QACZ,WAAW,EAAE,IAAI;QACjB,MAAM,EAAE,SAAS;QACjB,OAAO,EAAE,kDAAkD;KAC5D;IACD,QAAQ,EAAE;QACR,EAAE,EAAE,WAAW;QACf,IAAI,EAAE,aAAa;QACnB,QAAQ,EAAE,GAAG;QACb,WAAW,EAAE,IAAI;QACjB,MAAM,EAAE,SAAS;QACjB,OAAO,EAAE,6CAA6C;KACvD;IACD,eAAe,EAAE;QACf,EAAE,EAAE,mBAAmB;QACvB,IAAI,EAAE,qBAAqB;QAC3B,QAAQ,EAAE,KAAK;QACf,WAAW,EAAE,MAAM;QACnB,MAAM,EAAE,QAAQ;QAChB,OAAO,EAAE,uEAAuE;KACjF;IACD,SAAS,EAAE;QACT,EAAE,EAAE,WAAW;QACf,IAAI,EAAE,sBAAsB;QAC5B,QAAQ,EAAE,KAAK;QACf,WAAW,EAAE,MAAM;QACnB,MAAM,EAAE,SAAS;QACjB,OAAO,EAAE,mDAAmD;KAC7D;CACF,CAAC;AAEF,6DAA6D;AAC7D,MAAM,CAAC,MAAM,sBAAsB,GAAG,qBAAqB,CAAC;AAE5D,SAAS,YAAY,CAAC,CAAU;IAC9B,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IACtD,MAAM,CAAC,GAAG,CAA4B,CAAC;IACvC,OAAO,CACL,OAAO,CAAC,CAAC,EAAE,KAAK,QAAQ;QACxB,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ;QAC1B,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ;QAC9B,CAAC,CAAC,CAAC,WAAW,KAAK,IAAI,IAAI,OAAO,CAAC,CAAC,WAAW,KAAK,QAAQ,CAAC;QAC7D,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC;QAC3E,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,CAC9B,CAAC;AACJ,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"pricing.js","sourceRoot":"","sources":["../src/pricing.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE;QACJ,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;QAC/C,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC9B;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE;QACJ,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;QAC/C,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC9B;AAqCD,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAEpE;AAED,wBAAgB,aAAa,IAAI,cAAc,EAAE,CAEhD;AAED,wBAAgB,gBAAgB,IAAI,MAAM,EAAE,CAE3C"}
|
package/dist/providers/index.js
CHANGED
|
@@ -23,27 +23,12 @@ const providers = {
|
|
|
23
23
|
auth: { type: 'bearer', envVar: 'SLACK_TOKEN' },
|
|
24
24
|
suggestedIncludes: ['chat', 'channels', 'users', 'files'],
|
|
25
25
|
},
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
},
|
|
33
|
-
linear: {
|
|
34
|
-
name: 'linear',
|
|
35
|
-
description: 'Linear project management',
|
|
36
|
-
specUrl: 'https://studio.apollographql.com/public/Linear-API/variant/current/home',
|
|
37
|
-
baseUrl: 'https://api.linear.app',
|
|
38
|
-
auth: { type: 'bearer', envVar: 'LINEAR_API_KEY' },
|
|
39
|
-
},
|
|
40
|
-
shopify: {
|
|
41
|
-
name: 'shopify',
|
|
42
|
-
description: 'Shopify Admin API',
|
|
43
|
-
specUrl: 'https://shopify.dev/docs/admin-api/rest/reference',
|
|
44
|
-
baseUrl: 'https://{store}.myshopify.com/admin/api/2024-01',
|
|
45
|
-
auth: { type: 'bearer', envVar: 'SHOPIFY_ACCESS_TOKEN' },
|
|
46
|
-
},
|
|
26
|
+
// NOTE: notion / linear / shopify shortcuts were removed — their `specUrl`s
|
|
27
|
+
// pointed at HTML documentation or a GraphQL (Apollo) console, not a
|
|
28
|
+
// machine-readable OpenAPI spec, so `mcpmake from <name>` always failed.
|
|
29
|
+
// Linear is GraphQL-only (no OpenAPI surface); Notion publishes no official
|
|
30
|
+
// OpenAPI spec; Shopify's REST reference is HTML. Re-add only with a verified
|
|
31
|
+
// spec URL that `loadOpenApiSpec` can actually parse.
|
|
47
32
|
};
|
|
48
33
|
export function getProvider(name) {
|
|
49
34
|
return providers[name.toLowerCase()];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAaA,MAAM,SAAS,GAAmC;IAChD,MAAM,EAAE;QACN,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,2BAA2B;QACxC,OAAO,EAAE,4EAA4E;QACrF,OAAO,EAAE,wBAAwB;QACjC,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,gBAAgB,EAAE;QAClD,iBAAiB,EAAE,CAAC,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,eAAe,CAAC;KACrF;IACD,MAAM,EAAE;QACN,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,iBAAiB;QAC9B,OAAO,EACL,oHAAoH;QACtH,OAAO,EAAE,wBAAwB;QACjC,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE;QAChD,iBAAiB,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,CAAC;KAC3D;IACD,KAAK,EAAE;QACL,IAAI,EAAE,OAAO;QACb,WAAW,EAAE,eAAe;QAC5B,OAAO,EACL,qGAAqG;QACvG,OAAO,EAAE,uBAAuB;QAChC,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE;QAC/C,iBAAiB,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC;KAC1D;IACD,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAaA,MAAM,SAAS,GAAmC;IAChD,MAAM,EAAE;QACN,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,2BAA2B;QACxC,OAAO,EAAE,4EAA4E;QACrF,OAAO,EAAE,wBAAwB;QACjC,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,gBAAgB,EAAE;QAClD,iBAAiB,EAAE,CAAC,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,eAAe,CAAC;KACrF;IACD,MAAM,EAAE;QACN,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,iBAAiB;QAC9B,OAAO,EACL,oHAAoH;QACtH,OAAO,EAAE,wBAAwB;QACjC,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE;QAChD,iBAAiB,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,CAAC;KAC3D;IACD,KAAK,EAAE;QACL,IAAI,EAAE,OAAO;QACb,WAAW,EAAE,eAAe;QAC5B,OAAO,EACL,qGAAqG;QACvG,OAAO,EAAE,uBAAuB;QAChC,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE;QAC/C,iBAAiB,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC;KAC1D;IACD,4EAA4E;IAC5E,qEAAqE;IACrE,yEAAyE;IACzE,4EAA4E;IAC5E,8EAA8E;IAC9E,sDAAsD;CACvD,CAAC;AAEF,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,OAAO,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAChC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-recorder.d.ts","sourceRoot":"","sources":["../../src/recorder/browser-recorder.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAU,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"browser-recorder.d.ts","sourceRoot":"","sources":["../../src/recorder/browser-recorder.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAU,MAAM,YAAY,CAAC;AAKhD,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,KAAK,EAAE,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAqBD,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,CA6I7F"}
|
|
@@ -1,8 +1,25 @@
|
|
|
1
1
|
import { chromium } from 'playwright';
|
|
2
|
+
import { redactEntrySecrets } from '../parser/har-filter.js';
|
|
2
3
|
import { logger } from '../utils/logger.js';
|
|
4
|
+
import { assertPublicUrl } from '../utils/ssrf-guard.js';
|
|
3
5
|
const MAX_ENTRIES = 10_000;
|
|
6
|
+
// Defense-in-depth bound on the in-flight request map so a flood of requests
|
|
7
|
+
// that never resolve can't grow it without limit between cleanups.
|
|
8
|
+
const MAX_PENDING = 10_000;
|
|
4
9
|
const MAX_RESPONSE_BODY_BYTES = 5 * 1024 * 1024; // 5 MB
|
|
5
10
|
const SKIP_BODY_MIME_TYPES = ['image/', 'video/', 'audio/', 'font/', 'application/octet-stream'];
|
|
11
|
+
// Playwright resource types that are large-by-nature; skip body capture for
|
|
12
|
+
// them at the header level rather than buffering and discarding afterwards.
|
|
13
|
+
const SKIP_BODY_RESOURCE_TYPES = new Set([
|
|
14
|
+
'image',
|
|
15
|
+
'media',
|
|
16
|
+
'font',
|
|
17
|
+
'stylesheet',
|
|
18
|
+
'websocket',
|
|
19
|
+
'eventsource',
|
|
20
|
+
'manifest',
|
|
21
|
+
'texttrack',
|
|
22
|
+
]);
|
|
6
23
|
export async function recordBrowserSession(options) {
|
|
7
24
|
const idleTimeout = options.timeout ?? 5 * 60 * 1000;
|
|
8
25
|
const entries = [];
|
|
@@ -12,6 +29,9 @@ export async function recordBrowserSession(options) {
|
|
|
12
29
|
if (!['http:', 'https:'].includes(parsedUrl.protocol)) {
|
|
13
30
|
throw new Error('Only http/https URLs are supported');
|
|
14
31
|
}
|
|
32
|
+
// SSRF guard: refuse private/loopback/link-local/metadata start hosts before
|
|
33
|
+
// we launch a browser at them. Resolves DNS and enforces protocol + host.
|
|
34
|
+
await assertPublicUrl(options.url);
|
|
15
35
|
const baseUrl = `${parsedUrl.protocol}//${parsedUrl.host}`;
|
|
16
36
|
const headless = options.headless ?? false;
|
|
17
37
|
let browser;
|
|
@@ -20,21 +40,30 @@ export async function recordBrowserSession(options) {
|
|
|
20
40
|
const context = await browser.newContext();
|
|
21
41
|
const page = await context.newPage();
|
|
22
42
|
// Capture requests
|
|
23
|
-
|
|
43
|
+
const onRequest = (request) => {
|
|
24
44
|
lastActivityTime = Date.now();
|
|
45
|
+
// Drop the oldest pending entry if we ever hit the bound so a storm of
|
|
46
|
+
// never-resolving requests can't grow the map without limit.
|
|
47
|
+
if (pendingRequests.size >= MAX_PENDING) {
|
|
48
|
+
const oldest = pendingRequests.keys().next().value;
|
|
49
|
+
if (oldest)
|
|
50
|
+
pendingRequests.delete(oldest);
|
|
51
|
+
}
|
|
25
52
|
pendingRequests.set(request, { startTime: Date.now() });
|
|
26
|
-
}
|
|
53
|
+
};
|
|
27
54
|
// Capture responses
|
|
28
|
-
|
|
55
|
+
const onResponse = async (response) => {
|
|
29
56
|
lastActivityTime = Date.now();
|
|
30
|
-
if (entries.length >= MAX_ENTRIES)
|
|
31
|
-
return;
|
|
32
57
|
const request = response.request();
|
|
33
58
|
const pending = pendingRequests.get(request);
|
|
34
59
|
if (!pending)
|
|
35
60
|
return;
|
|
36
|
-
|
|
61
|
+
// Always free the pending entry, even when we drop this response below.
|
|
62
|
+
// Returning before the delete (e.g. at the MAX_ENTRIES cap) leaks the
|
|
63
|
+
// pendingRequests map across a long interactive session.
|
|
37
64
|
try {
|
|
65
|
+
if (entries.length >= MAX_ENTRIES)
|
|
66
|
+
return;
|
|
38
67
|
const entry = await buildHarEntry(request, response, pending.startTime);
|
|
39
68
|
entries.push(entry);
|
|
40
69
|
if (entries.length === MAX_ENTRIES) {
|
|
@@ -44,6 +73,28 @@ export async function recordBrowserSession(options) {
|
|
|
44
73
|
catch {
|
|
45
74
|
// Some responses can't be read (e.g., redirects, aborted)
|
|
46
75
|
}
|
|
76
|
+
finally {
|
|
77
|
+
pendingRequests.delete(request);
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
// A request can end WITHOUT ever firing 'response' (aborted, blocked,
|
|
81
|
+
// failed DNS/TLS, or finished as a redirect). Free its pending entry on
|
|
82
|
+
// both terminal events so the map can't leak across a long session.
|
|
83
|
+
const onSettled = (request) => {
|
|
84
|
+
pendingRequests.delete(request);
|
|
85
|
+
};
|
|
86
|
+
page.on('request', onRequest);
|
|
87
|
+
page.on('response', onResponse);
|
|
88
|
+
page.on('requestfailed', onSettled);
|
|
89
|
+
page.on('requestfinished', onSettled);
|
|
90
|
+
// Remove our listeners when the browser goes away so nothing is retained
|
|
91
|
+
// past the session (the listeners close over entries/pendingRequests).
|
|
92
|
+
browser.on('disconnected', () => {
|
|
93
|
+
page.off('request', onRequest);
|
|
94
|
+
page.off('response', onResponse);
|
|
95
|
+
page.off('requestfailed', onSettled);
|
|
96
|
+
page.off('requestfinished', onSettled);
|
|
97
|
+
pendingRequests.clear();
|
|
47
98
|
});
|
|
48
99
|
if (headless) {
|
|
49
100
|
// Non-interactive capture: load the page, then auto-visit any extra
|
|
@@ -52,6 +103,15 @@ export async function recordBrowserSession(options) {
|
|
|
52
103
|
await page.goto(options.url, { waitUntil: 'networkidle', timeout: 30_000 }).catch(() => { });
|
|
53
104
|
const navTargets = resolveNavTargets(options.navigate ?? [], baseUrl);
|
|
54
105
|
for (const navUrl of navTargets) {
|
|
106
|
+
// SSRF guard: a same-origin navigate target can still resolve to a
|
|
107
|
+
// private/internal address. Resolve and refuse before navigating.
|
|
108
|
+
try {
|
|
109
|
+
await assertPublicUrl(navUrl);
|
|
110
|
+
}
|
|
111
|
+
catch (err) {
|
|
112
|
+
logger.warn(`Skipping navigate target (SSRF guard): ${navUrl} — ${err instanceof Error ? err.message : err}`);
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
55
115
|
logger.info(` visiting: ${navUrl}`);
|
|
56
116
|
try {
|
|
57
117
|
await page.goto(navUrl, { waitUntil: 'networkidle', timeout: 30_000 });
|
|
@@ -143,14 +203,29 @@ async function buildHarEntry(request, response, startTime) {
|
|
|
143
203
|
name,
|
|
144
204
|
value,
|
|
145
205
|
}));
|
|
146
|
-
// Response body — skip large or binary responses
|
|
206
|
+
// Response body — skip large or binary responses BEFORE buffering. The cap
|
|
207
|
+
// must be enforced at the header/resource-type level: once `response.body()`
|
|
208
|
+
// resolves, Playwright has already buffered the whole response into memory,
|
|
209
|
+
// so a post-hoc `body.length` check does nothing to protect us against a
|
|
210
|
+
// missing/dishonest Content-Length. We therefore skip body capture for
|
|
211
|
+
// large-by-type resources and for responses whose declared length exceeds
|
|
212
|
+
// the cap, and only fall back to reading when the size is known and bounded.
|
|
147
213
|
let responseText;
|
|
148
214
|
const responseMimeType = response.headers()['content-type'] ?? '';
|
|
149
|
-
const skipBody = SKIP_BODY_MIME_TYPES.some((m) => responseMimeType.startsWith(m))
|
|
150
|
-
|
|
151
|
-
|
|
215
|
+
const skipBody = SKIP_BODY_MIME_TYPES.some((m) => responseMimeType.startsWith(m)) ||
|
|
216
|
+
SKIP_BODY_RESOURCE_TYPES.has(request.resourceType());
|
|
217
|
+
const rawContentLength = response.headers()['content-length'];
|
|
218
|
+
const parsedLength = rawContentLength === undefined ? NaN : parseInt(rawContentLength, 10);
|
|
219
|
+
const lengthKnown = Number.isFinite(parsedLength) && parsedLength >= 0;
|
|
220
|
+
const tooLargeByHeader = lengthKnown && parsedLength > MAX_RESPONSE_BODY_BYTES;
|
|
221
|
+
// Only buffer when we won't blow the cap: either the declared length is known
|
|
222
|
+
// and within the cap, or the length is unknown but the resource type is one
|
|
223
|
+
// we expect to be small (text/json/xhr/fetch/document).
|
|
224
|
+
if (!skipBody && !tooLargeByHeader) {
|
|
152
225
|
try {
|
|
153
226
|
const body = await response.body();
|
|
227
|
+
// Backstop: a dishonest/absent Content-Length can still under-report, so
|
|
228
|
+
// discard anything that turns out to exceed the cap after the fact.
|
|
154
229
|
if (body.length <= MAX_RESPONSE_BODY_BYTES) {
|
|
155
230
|
responseText = body.toString('utf-8');
|
|
156
231
|
}
|
|
@@ -159,7 +234,9 @@ async function buildHarEntry(request, response, startTime) {
|
|
|
159
234
|
// Body may not be available for some response types
|
|
160
235
|
}
|
|
161
236
|
}
|
|
162
|
-
|
|
237
|
+
// Scrub credentials at the recorder boundary too, so the entry never holds
|
|
238
|
+
// a live secret even if it is persisted without going through filterHarEntries.
|
|
239
|
+
return redactEntrySecrets({
|
|
163
240
|
startedDateTime: new Date(startTime).toISOString(),
|
|
164
241
|
time: elapsed,
|
|
165
242
|
request: {
|
|
@@ -201,6 +278,6 @@ async function buildHarEntry(request, response, startTime) {
|
|
|
201
278
|
wait: Math.max(1, elapsed - 2),
|
|
202
279
|
receive: 1,
|
|
203
280
|
},
|
|
204
|
-
};
|
|
281
|
+
});
|
|
205
282
|
}
|
|
206
283
|
//# sourceMappingURL=browser-recorder.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-recorder.js","sourceRoot":"","sources":["../../src/recorder/browser-recorder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGtC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"browser-recorder.js","sourceRoot":"","sources":["../../src/recorder/browser-recorder.ts"],"names":[],"mappings":"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"}
|