@treegress.com/treegress-browser-mcp 0.0.56-treegress.3

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.
Files changed (67) hide show
  1. package/README.md +68 -0
  2. package/cli.js +25 -0
  3. package/config.d.ts +223 -0
  4. package/index.d.ts +23 -0
  5. package/index.js +19 -0
  6. package/mcp/browser/browserContextFactory.js +332 -0
  7. package/mcp/browser/browserServerBackend.js +105 -0
  8. package/mcp/browser/config.js +489 -0
  9. package/mcp/browser/configIni.js +194 -0
  10. package/mcp/browser/context.js +302 -0
  11. package/mcp/browser/domSnapshot.js +307 -0
  12. package/mcp/browser/logFile.js +96 -0
  13. package/mcp/browser/response.js +299 -0
  14. package/mcp/browser/sessionLog.js +75 -0
  15. package/mcp/browser/tab.js +1193 -0
  16. package/mcp/browser/tools/common.js +63 -0
  17. package/mcp/browser/tools/config.js +41 -0
  18. package/mcp/browser/tools/console.js +65 -0
  19. package/mcp/browser/tools/cookies.js +152 -0
  20. package/mcp/browser/tools/devtools.js +42 -0
  21. package/mcp/browser/tools/dialogs.js +59 -0
  22. package/mcp/browser/tools/evaluate.js +61 -0
  23. package/mcp/browser/tools/files.js +58 -0
  24. package/mcp/browser/tools/form.js +63 -0
  25. package/mcp/browser/tools/install.js +73 -0
  26. package/mcp/browser/tools/keyboard.js +151 -0
  27. package/mcp/browser/tools/mouse.js +159 -0
  28. package/mcp/browser/tools/navigate.js +105 -0
  29. package/mcp/browser/tools/network.js +92 -0
  30. package/mcp/browser/tools/pdf.js +48 -0
  31. package/mcp/browser/tools/route.js +140 -0
  32. package/mcp/browser/tools/runCode.js +76 -0
  33. package/mcp/browser/tools/screenshot.js +86 -0
  34. package/mcp/browser/tools/snapshot.js +207 -0
  35. package/mcp/browser/tools/storage.js +67 -0
  36. package/mcp/browser/tools/tabs.js +67 -0
  37. package/mcp/browser/tools/tool.js +47 -0
  38. package/mcp/browser/tools/tracing.js +75 -0
  39. package/mcp/browser/tools/utils.js +88 -0
  40. package/mcp/browser/tools/verify.js +143 -0
  41. package/mcp/browser/tools/video.js +89 -0
  42. package/mcp/browser/tools/wait.js +63 -0
  43. package/mcp/browser/tools/webstorage.js +223 -0
  44. package/mcp/browser/tools.js +96 -0
  45. package/mcp/browser/watchdog.js +44 -0
  46. package/mcp/config.d.js +16 -0
  47. package/mcp/extension/cdpRelay.js +354 -0
  48. package/mcp/extension/extensionContextFactory.js +77 -0
  49. package/mcp/extension/protocol.js +28 -0
  50. package/mcp/index.js +61 -0
  51. package/mcp/log.js +35 -0
  52. package/mcp/program.js +126 -0
  53. package/mcp/sdk/exports.js +28 -0
  54. package/mcp/sdk/http.js +172 -0
  55. package/mcp/sdk/inProcessTransport.js +71 -0
  56. package/mcp/sdk/server.js +223 -0
  57. package/mcp/sdk/tool.js +54 -0
  58. package/mcp/test/browserBackend.js +98 -0
  59. package/mcp/test/generatorTools.js +122 -0
  60. package/mcp/test/plannerTools.js +145 -0
  61. package/mcp/test/seed.js +82 -0
  62. package/mcp/test/streams.js +44 -0
  63. package/mcp/test/testBackend.js +99 -0
  64. package/mcp/test/testContext.js +285 -0
  65. package/mcp/test/testTool.js +30 -0
  66. package/mcp/test/testTools.js +108 -0
  67. package/package.json +46 -0
@@ -0,0 +1,194 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var configIni_exports = {};
30
+ __export(configIni_exports, {
31
+ configFromIniFile: () => configFromIniFile,
32
+ configsFromIniFile: () => configsFromIniFile
33
+ });
34
+ module.exports = __toCommonJS(configIni_exports);
35
+ var import_fs = __toESM(require("fs"));
36
+ var import_utilsBundle = require("playwright-core/lib/utilsBundle");
37
+ function configFromIniFile(filePath) {
38
+ const content = import_fs.default.readFileSync(filePath, "utf8");
39
+ const parsed = import_utilsBundle.ini.parse(content);
40
+ return iniEntriesToConfig(parsed);
41
+ }
42
+ function configsFromIniFile(filePath) {
43
+ const content = import_fs.default.readFileSync(filePath, "utf8");
44
+ const parsed = import_utilsBundle.ini.parse(content);
45
+ const result = /* @__PURE__ */ new Map();
46
+ for (const [sectionName, sectionData] of Object.entries(parsed)) {
47
+ if (typeof sectionData !== "object" || sectionData === null)
48
+ continue;
49
+ result.set(sectionName, iniEntriesToConfig(sectionData));
50
+ }
51
+ return result;
52
+ }
53
+ function iniEntriesToConfig(entries) {
54
+ const config = {};
55
+ for (const [targetPath, rawValue] of Object.entries(entries)) {
56
+ const type = longhandTypes[targetPath];
57
+ const value = type ? coerceToType(rawValue, type) : coerceIniValue(rawValue);
58
+ setNestedValue(config, targetPath, value);
59
+ }
60
+ return config;
61
+ }
62
+ function coerceToType(value, type) {
63
+ switch (type) {
64
+ case "string":
65
+ return String(value);
66
+ case "number":
67
+ return Number(value);
68
+ case "boolean":
69
+ if (typeof value === "boolean")
70
+ return value;
71
+ return value === "true" || value === "1";
72
+ case "string[]":
73
+ if (Array.isArray(value))
74
+ return value.map(String);
75
+ return [String(value)];
76
+ case "size": {
77
+ if (typeof value === "string" && value.includes("x")) {
78
+ const [w, h] = value.split("x").map(Number);
79
+ if (!isNaN(w) && !isNaN(h) && w > 0 && h > 0)
80
+ return { width: w, height: h };
81
+ }
82
+ return void 0;
83
+ }
84
+ }
85
+ }
86
+ function coerceIniValue(value) {
87
+ if (typeof value !== "string")
88
+ return value;
89
+ const trimmed = value.trim();
90
+ if (trimmed === "")
91
+ return trimmed;
92
+ const num = Number(trimmed);
93
+ if (!isNaN(num))
94
+ return num;
95
+ return value;
96
+ }
97
+ function setNestedValue(obj, dotPath, value) {
98
+ const parts = dotPath.split(".");
99
+ let current = obj;
100
+ for (let i = 0; i < parts.length - 1; i++) {
101
+ const part = parts[i];
102
+ if (!(part in current) || typeof current[part] !== "object" || current[part] === null)
103
+ current[part] = {};
104
+ current = current[part];
105
+ }
106
+ current[parts[parts.length - 1]] = value;
107
+ }
108
+ const longhandTypes = {
109
+ // browser direct
110
+ "browser.browserName": "string",
111
+ "browser.isolated": "boolean",
112
+ "browser.userDataDir": "string",
113
+ "browser.cdpEndpoint": "string",
114
+ "browser.cdpTimeout": "number",
115
+ "browser.remoteEndpoint": "string",
116
+ "browser.initPage": "string[]",
117
+ "browser.initScript": "string[]",
118
+ // browser.launchOptions
119
+ "browser.launchOptions.channel": "string",
120
+ "browser.launchOptions.headless": "boolean",
121
+ "browser.launchOptions.executablePath": "string",
122
+ "browser.launchOptions.chromiumSandbox": "boolean",
123
+ "browser.launchOptions.args": "string[]",
124
+ "browser.launchOptions.downloadsPath": "string",
125
+ "browser.launchOptions.handleSIGHUP": "boolean",
126
+ "browser.launchOptions.handleSIGINT": "boolean",
127
+ "browser.launchOptions.handleSIGTERM": "boolean",
128
+ "browser.launchOptions.slowMo": "number",
129
+ "browser.launchOptions.timeout": "number",
130
+ "browser.launchOptions.tracesDir": "string",
131
+ "browser.launchOptions.proxy.server": "string",
132
+ "browser.launchOptions.proxy.bypass": "string",
133
+ "browser.launchOptions.proxy.username": "string",
134
+ "browser.launchOptions.proxy.password": "string",
135
+ // browser.contextOptions
136
+ "browser.contextOptions.acceptDownloads": "boolean",
137
+ "browser.contextOptions.baseURL": "string",
138
+ "browser.contextOptions.bypassCSP": "boolean",
139
+ "browser.contextOptions.colorScheme": "string",
140
+ "browser.contextOptions.contrast": "string",
141
+ "browser.contextOptions.deviceScaleFactor": "number",
142
+ "browser.contextOptions.forcedColors": "string",
143
+ "browser.contextOptions.hasTouch": "boolean",
144
+ "browser.contextOptions.ignoreHTTPSErrors": "boolean",
145
+ "browser.contextOptions.isMobile": "boolean",
146
+ "browser.contextOptions.javaScriptEnabled": "boolean",
147
+ "browser.contextOptions.locale": "string",
148
+ "browser.contextOptions.offline": "boolean",
149
+ "browser.contextOptions.permissions": "string[]",
150
+ "browser.contextOptions.reducedMotion": "string",
151
+ "browser.contextOptions.screen": "size",
152
+ "browser.contextOptions.serviceWorkers": "string",
153
+ "browser.contextOptions.storageState": "string",
154
+ "browser.contextOptions.strictSelectors": "boolean",
155
+ "browser.contextOptions.timezoneId": "string",
156
+ "browser.contextOptions.userAgent": "string",
157
+ "browser.contextOptions.viewport": "size",
158
+ // top-level
159
+ "extension": "boolean",
160
+ "capabilities": "string[]",
161
+ "saveSession": "boolean",
162
+ "saveTrace": "boolean",
163
+ "saveVideo": "size",
164
+ "sharedBrowserContext": "boolean",
165
+ "outputDir": "string",
166
+ "outputMode": "string",
167
+ "imageResponses": "string",
168
+ "allowUnrestrictedFileAccess": "boolean",
169
+ "codegen": "string",
170
+ "testIdAttribute": "string",
171
+ // server
172
+ "server.port": "number",
173
+ "server.host": "string",
174
+ "server.allowedHosts": "string[]",
175
+ // console
176
+ "console.level": "string",
177
+ // network
178
+ "network.allowedOrigins": "string[]",
179
+ "network.blockedOrigins": "string[]",
180
+ // timeouts
181
+ "timeouts.action": "number",
182
+ "timeouts.navigation": "number",
183
+ // snapshot
184
+ "snapshot.mode": "string",
185
+ "snapshot.engine": "string",
186
+ "snapshot.domSerializerPath": "string",
187
+ "snapshot.domFallbackToAria": "boolean",
188
+ "snapshot.domNonstrict": "boolean"
189
+ };
190
+ // Annotate the CommonJS export names for ESM import in node:
191
+ 0 && (module.exports = {
192
+ configFromIniFile,
193
+ configsFromIniFile
194
+ });
@@ -0,0 +1,302 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var context_exports = {};
30
+ __export(context_exports, {
31
+ Context: () => Context
32
+ });
33
+ module.exports = __toCommonJS(context_exports);
34
+ var import_os = __toESM(require("os"));
35
+ var import_utilsBundle = require("playwright-core/lib/utilsBundle");
36
+ var import_utils = require("playwright-core/lib/utils");
37
+ var import_playwright_core = require("playwright-core");
38
+ var import_url = require("url");
39
+ var import_log = require("../log");
40
+ var import_tab = require("./tab");
41
+ var import_config = require("./config");
42
+ const testDebug = (0, import_utilsBundle.debug)("pw:mcp:test");
43
+ class Context {
44
+ constructor(options) {
45
+ this._tabs = [];
46
+ this._routes = [];
47
+ this._abortController = new AbortController();
48
+ this.config = options.config;
49
+ this.sessionLog = options.sessionLog;
50
+ this.options = options;
51
+ this._browserContextFactory = options.browserContextFactory;
52
+ this._clientInfo = options.clientInfo;
53
+ testDebug("create context");
54
+ Context._allContexts.add(this);
55
+ }
56
+ static {
57
+ this._allContexts = /* @__PURE__ */ new Set();
58
+ }
59
+ static async disposeAll() {
60
+ await Promise.all([...Context._allContexts].map((context) => context.dispose()));
61
+ }
62
+ tabs() {
63
+ return this._tabs;
64
+ }
65
+ currentTab() {
66
+ return this._currentTab;
67
+ }
68
+ currentTabOrDie() {
69
+ if (!this._currentTab)
70
+ throw new Error("No open pages available.");
71
+ return this._currentTab;
72
+ }
73
+ async newTab() {
74
+ const { browserContext } = await this._ensureBrowserContext();
75
+ const page = await browserContext.newPage();
76
+ this._currentTab = this._tabs.find((t) => t.page === page);
77
+ return this._currentTab;
78
+ }
79
+ async selectTab(index) {
80
+ const tab = this._tabs[index];
81
+ if (!tab)
82
+ throw new Error(`Tab ${index} not found`);
83
+ await tab.page.bringToFront();
84
+ this._currentTab = tab;
85
+ return tab;
86
+ }
87
+ async ensureTab() {
88
+ const { browserContext } = await this._ensureBrowserContext();
89
+ if (!this._currentTab)
90
+ await browserContext.newPage();
91
+ return this._currentTab;
92
+ }
93
+ async closeTab(index) {
94
+ const tab = index === void 0 ? this._currentTab : this._tabs[index];
95
+ if (!tab)
96
+ throw new Error(`Tab ${index} not found`);
97
+ const url = tab.page.url();
98
+ await tab.page.close();
99
+ return url;
100
+ }
101
+ async workspaceFile(fileName, perCallWorkspaceDir) {
102
+ return await (0, import_config.workspaceFile)(this.config, this._clientInfo, fileName, perCallWorkspaceDir);
103
+ }
104
+ async outputFile(template, options) {
105
+ const baseName = template.suggestedFilename || `${template.prefix}-${(template.date ?? /* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-")}${template.ext ? "." + template.ext : ""}`;
106
+ return await (0, import_config.outputFile)(this.config, this._clientInfo, baseName, options);
107
+ }
108
+ async startVideoRecording(params) {
109
+ if (this._video)
110
+ throw new Error("Video recording has already been started.");
111
+ const listener = (page) => {
112
+ this._video?.allVideos.add(page.video());
113
+ page.video().start(params).catch(() => {
114
+ });
115
+ };
116
+ this._video = { allVideos: /* @__PURE__ */ new Set(), listener };
117
+ const browserContext = await this.ensureBrowserContext();
118
+ browserContext.pages().forEach(listener);
119
+ browserContext.on("page", listener);
120
+ }
121
+ async stopVideoRecording() {
122
+ if (!this._video)
123
+ throw new Error("Video recording has not been started.");
124
+ const video = this._video;
125
+ if (this._browserContextPromise) {
126
+ const { browserContext } = await this._browserContextPromise;
127
+ browserContext.off("page", video.listener);
128
+ for (const page of browserContext.pages())
129
+ await page.video().stop().catch(() => {
130
+ });
131
+ }
132
+ this._video = void 0;
133
+ return video.allVideos;
134
+ }
135
+ _onPageCreated(page) {
136
+ const tab = new import_tab.Tab(this, page, (tab2) => this._onPageClosed(tab2));
137
+ this._tabs.push(tab);
138
+ if (!this._currentTab)
139
+ this._currentTab = tab;
140
+ }
141
+ _onPageClosed(tab) {
142
+ const index = this._tabs.indexOf(tab);
143
+ if (index === -1)
144
+ return;
145
+ this._tabs.splice(index, 1);
146
+ if (this._currentTab === tab)
147
+ this._currentTab = this._tabs[Math.min(index, this._tabs.length - 1)];
148
+ if (!this._tabs.length)
149
+ void this.closeBrowserContext();
150
+ }
151
+ async closeBrowserContext() {
152
+ if (!this._closeBrowserContextPromise)
153
+ this._closeBrowserContextPromise = this._closeBrowserContextImpl().catch(import_log.logUnhandledError);
154
+ await this._closeBrowserContextPromise;
155
+ this._closeBrowserContextPromise = void 0;
156
+ }
157
+ routes() {
158
+ return this._routes;
159
+ }
160
+ async addRoute(entry) {
161
+ const { browserContext } = await this._ensureBrowserContext();
162
+ await browserContext.route(entry.pattern, entry.handler);
163
+ this._routes.push(entry);
164
+ }
165
+ async removeRoute(pattern) {
166
+ if (!this._browserContextPromise)
167
+ return 0;
168
+ const { browserContext } = await this._browserContextPromise;
169
+ let removed = 0;
170
+ if (pattern) {
171
+ const toRemove = this._routes.filter((r) => r.pattern === pattern);
172
+ for (const route of toRemove)
173
+ await browserContext.unroute(route.pattern, route.handler);
174
+ this._routes = this._routes.filter((r) => r.pattern !== pattern);
175
+ removed = toRemove.length;
176
+ } else {
177
+ for (const route of this._routes)
178
+ await browserContext.unroute(route.pattern, route.handler);
179
+ removed = this._routes.length;
180
+ this._routes = [];
181
+ }
182
+ return removed;
183
+ }
184
+ isRunningTool() {
185
+ return this._runningToolName !== void 0;
186
+ }
187
+ setRunningTool(name) {
188
+ this._runningToolName = name;
189
+ }
190
+ async _closeBrowserContextImpl() {
191
+ if (!this._browserContextPromise)
192
+ return;
193
+ testDebug("close context");
194
+ const promise = this._browserContextPromise;
195
+ this._browserContextPromise = void 0;
196
+ await promise.then(async ({ browserContext, close }) => {
197
+ if (this.config.saveTrace)
198
+ await browserContext.tracing.stop();
199
+ await close();
200
+ });
201
+ }
202
+ async dispose() {
203
+ this._abortController.abort("MCP context disposed");
204
+ await this.closeBrowserContext();
205
+ Context._allContexts.delete(this);
206
+ }
207
+ async _setupRequestInterception(context) {
208
+ if (this.config.network?.allowedOrigins?.length) {
209
+ await context.route("**", (route) => route.abort("blockedbyclient"));
210
+ for (const origin of this.config.network.allowedOrigins)
211
+ await context.route(originOrHostGlob(origin), (route) => route.continue());
212
+ }
213
+ if (this.config.network?.blockedOrigins?.length) {
214
+ for (const origin of this.config.network.blockedOrigins)
215
+ await context.route(originOrHostGlob(origin), (route) => route.abort("blockedbyclient"));
216
+ }
217
+ }
218
+ async ensureBrowserContext() {
219
+ const { browserContext } = await this._ensureBrowserContext();
220
+ return browserContext;
221
+ }
222
+ _ensureBrowserContext() {
223
+ if (this._browserContextPromise)
224
+ return this._browserContextPromise;
225
+ this._browserContextPromise = this._setupBrowserContext();
226
+ this._browserContextPromise.catch(() => {
227
+ this._browserContextPromise = void 0;
228
+ });
229
+ return this._browserContextPromise;
230
+ }
231
+ async _setupBrowserContext() {
232
+ if (this._closeBrowserContextPromise)
233
+ throw new Error("Another browser context is being closed.");
234
+ if (this.config.testIdAttribute)
235
+ import_playwright_core.selectors.setTestIdAttribute(this.config.testIdAttribute);
236
+ const result = await this._browserContextFactory.createContext(this._clientInfo, this._abortController.signal, { toolName: this._runningToolName });
237
+ const { browserContext } = result;
238
+ if (!this.config.allowUnrestrictedFileAccess) {
239
+ browserContext._setAllowedProtocols(["http:", "https:", "about:", "data:"]);
240
+ browserContext._setAllowedDirectories(allRootPaths(this._clientInfo));
241
+ }
242
+ await this._setupRequestInterception(browserContext);
243
+ for (const page of browserContext.pages())
244
+ this._onPageCreated(page);
245
+ browserContext.on("page", (page) => this._onPageCreated(page));
246
+ if (this.config.saveTrace) {
247
+ await browserContext.tracing.start({
248
+ name: "trace-" + Date.now(),
249
+ screenshots: true,
250
+ snapshots: true,
251
+ _live: true
252
+ });
253
+ }
254
+ return result;
255
+ }
256
+ lookupSecret(secretName) {
257
+ if (!this.config.secrets?.[secretName])
258
+ return { value: secretName, code: (0, import_utils.escapeWithQuotes)(secretName, "'") };
259
+ return {
260
+ value: this.config.secrets[secretName],
261
+ code: `process.env['${secretName}']`
262
+ };
263
+ }
264
+ firstRootPath() {
265
+ return allRootPaths(this._clientInfo)[0];
266
+ }
267
+ }
268
+ function allRootPaths(clientInfo) {
269
+ const paths = [];
270
+ for (const root of clientInfo.roots) {
271
+ const url = new URL(root.uri);
272
+ let rootPath;
273
+ try {
274
+ rootPath = (0, import_url.fileURLToPath)(url);
275
+ } catch (e) {
276
+ if (e.code === "ERR_INVALID_FILE_URL_PATH" && import_os.default.platform() === "win32")
277
+ rootPath = decodeURIComponent(url.pathname);
278
+ }
279
+ if (!rootPath)
280
+ continue;
281
+ paths.push(rootPath);
282
+ }
283
+ if (paths.length === 0)
284
+ paths.push(process.cwd());
285
+ return paths;
286
+ }
287
+ function originOrHostGlob(originOrHost) {
288
+ const wildcardPortMatch = originOrHost.match(/^(https?:\/\/[^/:]+):\*$/);
289
+ if (wildcardPortMatch)
290
+ return `${wildcardPortMatch[1]}:*/**`;
291
+ try {
292
+ const url = new URL(originOrHost);
293
+ if (url.origin !== "null")
294
+ return `${url.origin}/**`;
295
+ } catch {
296
+ }
297
+ return `*://${originOrHost}/**`;
298
+ }
299
+ // Annotate the CommonJS export names for ESM import in node:
300
+ 0 && (module.exports = {
301
+ Context
302
+ });