fastbrowser_cli 1.0.13 → 1.0.16
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/.playwright-mcp/.gitignore +3 -0
- package/README.md +40 -1
- package/dist/fastbrowser_cli/fastbrowser_cli.js +52 -35
- package/dist/fastbrowser_cli/fastbrowser_cli.js.map +1 -1
- package/dist/fastbrowser_cli/libs/http-client.js +3 -7
- package/dist/fastbrowser_cli/libs/http-client.js.map +1 -1
- package/dist/fastbrowser_cli/libs/server-manager.d.ts.map +1 -1
- package/dist/fastbrowser_cli/libs/server-manager.js +30 -28
- package/dist/fastbrowser_cli/libs/server-manager.js.map +1 -1
- package/dist/fastbrowser_httpd/fastbrowser_httpd.js +22 -18
- package/dist/fastbrowser_httpd/fastbrowser_httpd.js.map +1 -1
- package/dist/fastbrowser_httpd/libs/routes.d.ts +2 -2
- package/dist/fastbrowser_httpd/libs/routes.d.ts.map +1 -1
- package/dist/fastbrowser_httpd/libs/routes.js +4 -8
- package/dist/fastbrowser_httpd/libs/routes.js.map +1 -1
- package/dist/fastbrowser_httpd/libs/tool-schemas.js +39 -42
- package/dist/fastbrowser_httpd/libs/tool-schemas.js.map +1 -1
- package/dist/fastbrowser_mcp/fastbrowser_mcp.d.ts.map +1 -1
- package/dist/fastbrowser_mcp/fastbrowser_mcp.js +270 -187
- package/dist/fastbrowser_mcp/fastbrowser_mcp.js.map +1 -1
- package/dist/fastbrowser_mcp/fastbrowser_types.d.ts +5 -0
- package/dist/fastbrowser_mcp/fastbrowser_types.d.ts.map +1 -0
- package/dist/fastbrowser_mcp/fastbrowser_types.js +2 -0
- package/dist/fastbrowser_mcp/fastbrowser_types.js.map +1 -0
- package/dist/{fastweb_mcp/libs/mcp_client.d.ts → fastbrowser_mcp/libs/mcp_client_TOREMOVE.d.ts} +6 -2
- package/dist/fastbrowser_mcp/libs/mcp_client_TOREMOVE.d.ts.map +1 -0
- package/dist/{src/libs/mcp_client.js → fastbrowser_mcp/libs/mcp_client_TOREMOVE.js} +15 -12
- package/dist/fastbrowser_mcp/libs/mcp_client_TOREMOVE.js.map +1 -0
- package/dist/{src/libs/mcp_client.d.ts → fastbrowser_mcp/libs/mcp_my_client.d.ts} +6 -2
- package/dist/fastbrowser_mcp/libs/mcp_my_client.d.ts.map +1 -0
- package/dist/{fastweb_mcp/libs/mcp_client.js → fastbrowser_mcp/libs/mcp_my_client.js} +15 -12
- package/dist/fastbrowser_mcp/libs/mcp_my_client.js.map +1 -0
- package/dist/fastbrowser_mcp/libs/mcp_proxy.d.ts +2 -2
- package/dist/fastbrowser_mcp/libs/mcp_proxy.d.ts.map +1 -1
- package/dist/fastbrowser_mcp/libs/mcp_proxy.js +9 -16
- package/dist/fastbrowser_mcp/libs/mcp_proxy.js.map +1 -1
- package/dist/fastbrowser_mcp/libs/mcp_target_helper.d.ts +35 -0
- package/dist/fastbrowser_mcp/libs/mcp_target_helper.d.ts.map +1 -0
- package/dist/fastbrowser_mcp/libs/mcp_target_helper.js +161 -0
- package/dist/fastbrowser_mcp/libs/mcp_target_helper.js.map +1 -0
- package/dist/fastbrowser_mcp/libs/playwright_a11y_helper.d.ts +28 -0
- package/dist/fastbrowser_mcp/libs/playwright_a11y_helper.d.ts.map +1 -0
- package/dist/fastbrowser_mcp/libs/playwright_a11y_helper.js +210 -0
- package/dist/fastbrowser_mcp/libs/playwright_a11y_helper.js.map +1 -0
- package/dist/fastbrowser_mcp/libs/response_formatter.d.ts +10 -0
- package/dist/fastbrowser_mcp/libs/response_formatter.d.ts.map +1 -0
- package/dist/fastbrowser_mcp/libs/response_formatter.js +155 -0
- package/dist/fastbrowser_mcp/libs/response_formatter.js.map +1 -0
- package/dist/fastbrowser_mcp/libs/schemas.js +14 -17
- package/dist/fastbrowser_mcp/libs/schemas.js.map +1 -1
- package/examples/mcp_client_playwright.ts +34 -0
- package/examples/welcometothejungle/wttj-job.ts +180 -0
- package/examples/welcometothejungle/wttj-search.ts +105 -0
- package/outputs/.gitignore +3 -0
- package/package.json +14 -9
- package/skills/fastbrowser/SKILL.md +2 -2
- package/src/fastbrowser_cli/fastbrowser_cli.ts +34 -11
- package/src/fastbrowser_cli/libs/server-manager.ts +12 -3
- package/src/fastbrowser_httpd/fastbrowser_httpd.ts +16 -5
- package/src/fastbrowser_httpd/libs/routes.ts +2 -2
- package/src/fastbrowser_mcp/fastbrowser_mcp.ts +324 -150
- package/src/fastbrowser_mcp/fastbrowser_types.ts +4 -0
- package/src/fastbrowser_mcp/libs/{mcp_client.ts → mcp_client_TOREMOVE.ts} +13 -1
- package/src/fastbrowser_mcp/libs/mcp_my_client.ts +128 -0
- package/src/fastbrowser_mcp/libs/mcp_proxy.ts +2 -2
- package/src/fastbrowser_mcp/libs/mcp_target_helper.ts +164 -0
- package/src/fastbrowser_mcp/libs/playwright_a11y_helper.ts +249 -0
- package/src/fastbrowser_mcp/libs/response_formatter.ts +162 -0
- package/src/fastbrowser_mcp/libs/schemas.ts +2 -2
- package/tsconfig.build.json +13 -0
- package/tsconfig.json +10 -22
- package/dist/contrib/fastweb-cli/fastweb-cli.d.ts +0 -3
- package/dist/contrib/fastweb-cli/fastweb-cli.d.ts.map +0 -1
- package/dist/contrib/fastweb-cli/fastweb-cli.js +0 -151
- package/dist/contrib/fastweb-cli/fastweb-cli.js.map +0 -1
- package/dist/contrib/fastweb-cli/http-client.d.ts +0 -7
- package/dist/contrib/fastweb-cli/http-client.d.ts.map +0 -1
- package/dist/contrib/fastweb-cli/http-client.js +0 -51
- package/dist/contrib/fastweb-cli/http-client.js.map +0 -1
- package/dist/contrib/fastweb-http-server/fastweb-http-server.d.ts +0 -3
- package/dist/contrib/fastweb-http-server/fastweb-http-server.d.ts.map +0 -1
- package/dist/contrib/fastweb-http-server/fastweb-http-server.js +0 -82
- package/dist/contrib/fastweb-http-server/fastweb-http-server.js.map +0 -1
- package/dist/contrib/fastweb-http-server/routes.d.ts +0 -6
- package/dist/contrib/fastweb-http-server/routes.d.ts.map +0 -1
- package/dist/contrib/fastweb-http-server/routes.js +0 -41
- package/dist/contrib/fastweb-http-server/routes.js.map +0 -1
- package/dist/contrib/fastweb-http-server/tool-schemas.d.ts +0 -63
- package/dist/contrib/fastweb-http-server/tool-schemas.d.ts.map +0 -1
- package/dist/contrib/fastweb-http-server/tool-schemas.js +0 -61
- package/dist/contrib/fastweb-http-server/tool-schemas.js.map +0 -1
- package/dist/fastbrowser_mcp/libs/mcp_client.d.ts +0 -120
- package/dist/fastbrowser_mcp/libs/mcp_client.d.ts.map +0 -1
- package/dist/fastbrowser_mcp/libs/mcp_client.js +0 -83
- package/dist/fastbrowser_mcp/libs/mcp_client.js.map +0 -1
- package/dist/fastweb_cli/fastweb_cli.d.ts +0 -3
- package/dist/fastweb_cli/fastweb_cli.d.ts.map +0 -1
- package/dist/fastweb_cli/fastweb_cli.js +0 -254
- package/dist/fastweb_cli/fastweb_cli.js.map +0 -1
- package/dist/fastweb_cli/http-client.d.ts +0 -7
- package/dist/fastweb_cli/http-client.d.ts.map +0 -1
- package/dist/fastweb_cli/http-client.js +0 -51
- package/dist/fastweb_cli/http-client.js.map +0 -1
- package/dist/fastweb_cli/libs/http-client.d.ts +0 -7
- package/dist/fastweb_cli/libs/http-client.d.ts.map +0 -1
- package/dist/fastweb_cli/libs/http-client.js +0 -51
- package/dist/fastweb_cli/libs/http-client.js.map +0 -1
- package/dist/fastweb_cli/libs/server-manager.d.ts +0 -12
- package/dist/fastweb_cli/libs/server-manager.d.ts.map +0 -1
- package/dist/fastweb_cli/libs/server-manager.js +0 -194
- package/dist/fastweb_cli/libs/server-manager.js.map +0 -1
- package/dist/fastweb_http_server/fastweb_http_server.d.ts +0 -3
- package/dist/fastweb_http_server/fastweb_http_server.d.ts.map +0 -1
- package/dist/fastweb_http_server/fastweb_http_server.js +0 -82
- package/dist/fastweb_http_server/fastweb_http_server.js.map +0 -1
- package/dist/fastweb_http_server/libs/routes.d.ts +0 -6
- package/dist/fastweb_http_server/libs/routes.d.ts.map +0 -1
- package/dist/fastweb_http_server/libs/routes.js +0 -41
- package/dist/fastweb_http_server/libs/routes.js.map +0 -1
- package/dist/fastweb_http_server/libs/tool-schemas.d.ts +0 -72
- package/dist/fastweb_http_server/libs/tool-schemas.d.ts.map +0 -1
- package/dist/fastweb_http_server/libs/tool-schemas.js +0 -65
- package/dist/fastweb_http_server/libs/tool-schemas.js.map +0 -1
- package/dist/fastweb_http_server/routes.d.ts +0 -6
- package/dist/fastweb_http_server/routes.d.ts.map +0 -1
- package/dist/fastweb_http_server/routes.js +0 -41
- package/dist/fastweb_http_server/routes.js.map +0 -1
- package/dist/fastweb_http_server/tool-schemas.d.ts +0 -63
- package/dist/fastweb_http_server/tool-schemas.d.ts.map +0 -1
- package/dist/fastweb_http_server/tool-schemas.js +0 -61
- package/dist/fastweb_http_server/tool-schemas.js.map +0 -1
- package/dist/fastweb_mcp/fastweb_mcp.d.ts +0 -4
- package/dist/fastweb_mcp/fastweb_mcp.d.ts.map +0 -1
- package/dist/fastweb_mcp/fastweb_mcp.js +0 -417
- package/dist/fastweb_mcp/fastweb_mcp.js.map +0 -1
- package/dist/fastweb_mcp/libs/mcp_client.d.ts.map +0 -1
- package/dist/fastweb_mcp/libs/mcp_client.js.map +0 -1
- package/dist/fastweb_mcp/libs/mcp_proxy.d.ts +0 -10
- package/dist/fastweb_mcp/libs/mcp_proxy.d.ts.map +0 -1
- package/dist/fastweb_mcp/libs/mcp_proxy.js +0 -45
- package/dist/fastweb_mcp/libs/mcp_proxy.js.map +0 -1
- package/dist/fastweb_mcp/libs/schemas.d.ts +0 -28
- package/dist/fastweb_mcp/libs/schemas.d.ts.map +0 -1
- package/dist/fastweb_mcp/libs/schemas.js +0 -38
- package/dist/fastweb_mcp/libs/schemas.js.map +0 -1
- package/dist/src/fastweb_mcp.d.ts +0 -17
- package/dist/src/fastweb_mcp.d.ts.map +0 -1
- package/dist/src/fastweb_mcp.js +0 -342
- package/dist/src/fastweb_mcp.js.map +0 -1
- package/dist/src/libs/mcp_client.d.ts.map +0 -1
- package/dist/src/libs/mcp_client.js.map +0 -1
- package/dist/src/libs/mcp_proxy.d.ts +0 -10
- package/dist/src/libs/mcp_proxy.d.ts.map +0 -1
- package/dist/src/libs/mcp_proxy.js +0 -45
- package/dist/src/libs/mcp_proxy.js.map +0 -1
- package/tmp/dotclaude/skills/fastbrowser/SKILL.md +0 -214
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
// node imports
|
|
2
|
+
import * as Assert from "assert";
|
|
3
|
+
|
|
4
|
+
// npm imports
|
|
5
|
+
import { CallToolResult } from "@modelcontextprotocol/sdk/types";
|
|
6
|
+
|
|
7
|
+
// local imports
|
|
8
|
+
import { FastBrowserMcpTarget } from "../fastbrowser_types.js";
|
|
9
|
+
import { PlaywrightA11yConverter } from "./playwright_a11y_helper.js";
|
|
10
|
+
|
|
11
|
+
export class ResponseFormatter {
|
|
12
|
+
static async formatListPages(mcpTarget: FastBrowserMcpTarget, callToolResult: CallToolResult): Promise<string> {
|
|
13
|
+
const resultContent = callToolResult.content[0]
|
|
14
|
+
if (resultContent.type !== "text") throw new Error("Unexpected content type");
|
|
15
|
+
const resultText: string = resultContent.text
|
|
16
|
+
|
|
17
|
+
if (mcpTarget === 'chrome_devtools') {
|
|
18
|
+
// EXAMPLE:
|
|
19
|
+
// ## Pages
|
|
20
|
+
// 1: about:blank
|
|
21
|
+
// 2: https://example.com/ [selected]
|
|
22
|
+
return resultText
|
|
23
|
+
} else if (mcpTarget === 'playwright') {
|
|
24
|
+
// EXAMPLE:
|
|
25
|
+
// ### Result
|
|
26
|
+
// - 0: (current) [Offres d'emploi (CDI, CDD), apprentissages et stages | Welcome to the Jungle](https://www.welcometothejungle.com/fr/jobs?refinementList%5Boffices.country_code%5D%5B%5D=FR&query=machine%20learning&page=1)
|
|
27
|
+
// ### Events
|
|
28
|
+
// - New console entries: .playwright-mcp/console-2026-04-25T10-43-58-002Z.log#L1-L62
|
|
29
|
+
|
|
30
|
+
// Convert 'playwright' format to 'chrome_devtools' format for consistency in the CLI output
|
|
31
|
+
const lines = resultText.split('\n');
|
|
32
|
+
// remove the 'Events' section and its lines, if it exists
|
|
33
|
+
const eventsIndex = lines.findIndex(line => line.startsWith('### Events'));
|
|
34
|
+
const linesWithoutEvents = eventsIndex !== -1 ? lines.slice(0, eventsIndex) : lines;
|
|
35
|
+
const pageLines = linesWithoutEvents.filter(line => line.trim().startsWith('- '));
|
|
36
|
+
const formattedLines = pageLines.map(line => {
|
|
37
|
+
// Extract the page index and title/url from the line
|
|
38
|
+
const match = line.trim().match(/- (\d+): (.+)/);
|
|
39
|
+
if (match) {
|
|
40
|
+
const index = match[1];
|
|
41
|
+
const titleAndUrl = match[2];
|
|
42
|
+
// Check if this is the current page (marked with "(current)")
|
|
43
|
+
const isCurrent = titleAndUrl.includes('(current)');
|
|
44
|
+
const titleAndUrlClean = titleAndUrl.replace('(current)', '').trim();
|
|
45
|
+
const urlMatch = titleAndUrlClean.match(/\((https?:\/\/.+)\)/);
|
|
46
|
+
const url = urlMatch ? urlMatch[1] : '';
|
|
47
|
+
return `${index}: ${url}${isCurrent ? ' [selected]' : ''}`;
|
|
48
|
+
} else {
|
|
49
|
+
return line; // If the line doesn't match the expected format, return it unchanged
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
const outputStr = `## Pages\n${formattedLines.join('\n')}`;
|
|
53
|
+
return outputStr
|
|
54
|
+
} else {
|
|
55
|
+
throw new Error(`Unsupported MCP target: ${mcpTarget}`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
static async formatNavigatePage(mcpTarget: FastBrowserMcpTarget, callToolResult: CallToolResult): Promise<string> {
|
|
60
|
+
const resultContent = callToolResult.content[0]
|
|
61
|
+
if (resultContent.type !== "text") throw new Error("Unexpected content type");
|
|
62
|
+
const resultText: string = resultContent.text
|
|
63
|
+
|
|
64
|
+
// Target format example:
|
|
65
|
+
// Successfully navigated to https://example.com
|
|
66
|
+
|
|
67
|
+
if (mcpTarget === 'chrome_devtools') {
|
|
68
|
+
// EXAMPLE:
|
|
69
|
+
// Successfully navigated to https://example.com
|
|
70
|
+
// ## Pages
|
|
71
|
+
// 1: https://example.com/ [selected]
|
|
72
|
+
|
|
73
|
+
// Convert 'chrome_devtools' format to the target format for consistency in the CLI output
|
|
74
|
+
const lines = resultText.split('\n');
|
|
75
|
+
// keep only the first line that contains the navigation result
|
|
76
|
+
Assert.ok(lines.length > 0, "Expected at least one line in the navigate page result");
|
|
77
|
+
const navigateLine = lines[0].trim()
|
|
78
|
+
const outputStr = navigateLine ? navigateLine.trim() : resultText; // Return the navigate line if found, otherwise return the original text
|
|
79
|
+
return outputStr;
|
|
80
|
+
} else if (mcpTarget === 'playwright') {
|
|
81
|
+
// EXAMPLE:
|
|
82
|
+
// ### Ran Playwright code
|
|
83
|
+
// ```js
|
|
84
|
+
// await page.goto('https:/example.com');
|
|
85
|
+
// ```
|
|
86
|
+
// ### Page
|
|
87
|
+
// - Page URL: https://example.com/
|
|
88
|
+
// - Page Title: Example Domain
|
|
89
|
+
// ### Snapshot
|
|
90
|
+
// - [Snapshot](.playwright-mcp/page-2026-04-25T11-24-36-780Z.yml)
|
|
91
|
+
|
|
92
|
+
// Convert 'playwright' format to a simpler format for consistency in the CLI output
|
|
93
|
+
const lines = resultText.split('\n');
|
|
94
|
+
const pageUrlLine = lines.find(line => line.trim().startsWith('- Page URL:'));
|
|
95
|
+
const pageUrl = pageUrlLine ? pageUrlLine.replace('- Page URL:', '').trim() : '';
|
|
96
|
+
Assert.ok(pageUrl, "Expected to find a line with the page URL in the navigate page result");
|
|
97
|
+
const outputStr = `Successfully navigated to ${pageUrl}`
|
|
98
|
+
return outputStr;
|
|
99
|
+
} else {
|
|
100
|
+
throw new Error(`Unsupported MCP target: ${mcpTarget}`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
static async formatTakeSnapshot(mcpTarget: FastBrowserMcpTarget, callToolResult: CallToolResult): Promise<string> {
|
|
105
|
+
// extract the snapshot text from the tool response, which has different formats for chrome_devtools and playwright MCP targets
|
|
106
|
+
if (mcpTarget === 'chrome_devtools') {
|
|
107
|
+
// take a snapshot to get the latest accessibility tree
|
|
108
|
+
const responseText = callToolResult.content[0]
|
|
109
|
+
if (responseText.type !== "text") throw new Error("Unexpected content type");
|
|
110
|
+
|
|
111
|
+
// get the snapshot text and remove the first line (snapshot metadata)
|
|
112
|
+
let snapshotText = responseText.text;
|
|
113
|
+
snapshotText = snapshotText.split('\n').slice(1).join('\n');
|
|
114
|
+
return snapshotText;
|
|
115
|
+
} else if (mcpTarget === 'playwright') {
|
|
116
|
+
const responseText = callToolResult.content[0]
|
|
117
|
+
if (responseText.type !== "text") throw new Error("Unexpected content type");
|
|
118
|
+
const snapshotText = PlaywrightA11yConverter.convertToChromeDevtools(responseText.text);
|
|
119
|
+
return snapshotText;
|
|
120
|
+
} else {
|
|
121
|
+
throw new Error(`Unsupported MCP target: ${mcpTarget}`);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
static async formatPressKeys(mcpTarget: FastBrowserMcpTarget, keysToSend: string[]): Promise<string> {
|
|
126
|
+
const outputStr = `Pressed keys: ${keysToSend.join(', ')}`
|
|
127
|
+
return outputStr;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
static async formatClick(mcpTarget: FastBrowserMcpTarget, callToolResult: CallToolResult): Promise<string> {
|
|
131
|
+
const resultContent = callToolResult.content[0]
|
|
132
|
+
if (resultContent.type !== "text") throw new Error("Unexpected content type");
|
|
133
|
+
const resultText: string = resultContent.text
|
|
134
|
+
|
|
135
|
+
// Target format example:
|
|
136
|
+
// Successfully clicked on the element
|
|
137
|
+
|
|
138
|
+
if (mcpTarget === 'chrome_devtools') {
|
|
139
|
+
// EXAMPLE:
|
|
140
|
+
// Successfully clicked on the element
|
|
141
|
+
|
|
142
|
+
return resultText
|
|
143
|
+
} else if (mcpTarget === 'playwright') {
|
|
144
|
+
// EXAMPLE:
|
|
145
|
+
// ### Ran Playwright code`
|
|
146
|
+
// ```js
|
|
147
|
+
// await page.getByRole('link', { name: 'Learn more' }).click();
|
|
148
|
+
// ```
|
|
149
|
+
// ### Page
|
|
150
|
+
// - Page URL: https://www.iana.org/help/example-domains
|
|
151
|
+
// - Page Title: Example Domains
|
|
152
|
+
// ### Snapshot
|
|
153
|
+
// - [Snapshot](.playwrigh`t-mcp/page-2026-04-25T11-56-08-184Z.yml)
|
|
154
|
+
|
|
155
|
+
// Convert 'playwright' format to a simpler format for consistency in the CLI output
|
|
156
|
+
const outputStr = `Successfully clicked on the element`
|
|
157
|
+
return outputStr;
|
|
158
|
+
} else {
|
|
159
|
+
throw new Error(`Unsupported MCP target: ${mcpTarget}`);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
@@ -17,7 +17,7 @@ export const QuerySelectorInputSchema = z.object({
|
|
|
17
17
|
.default(0),
|
|
18
18
|
withAncestors: z.boolean()
|
|
19
19
|
.describe("Whether to include ancestor nodes in the result")
|
|
20
|
-
.default(
|
|
20
|
+
.default(false),
|
|
21
21
|
});
|
|
22
22
|
|
|
23
23
|
export const QuerySelectorsInputSchema = z.object({
|
|
@@ -30,7 +30,7 @@ export const QuerySelectorFirstInputSchema = z.object({
|
|
|
30
30
|
.describe("CSS-like selector to query the accessibility tree"),
|
|
31
31
|
withAncestors: z.boolean()
|
|
32
32
|
.describe("Whether to include ancestor nodes in the result")
|
|
33
|
-
.default(
|
|
33
|
+
.default(false),
|
|
34
34
|
});
|
|
35
35
|
|
|
36
36
|
export const QuerySelectorsFirstInputSchema = z.object({
|
package/tsconfig.json
CHANGED
|
@@ -1,37 +1,25 @@
|
|
|
1
1
|
{
|
|
2
2
|
"compilerOptions": {
|
|
3
3
|
"target": "ES2020",
|
|
4
|
-
"module": "
|
|
4
|
+
"module": "node16",
|
|
5
5
|
"lib": [
|
|
6
|
-
"ES2020"
|
|
7
|
-
"DOM"
|
|
6
|
+
"ES2020"
|
|
8
7
|
],
|
|
9
|
-
"
|
|
10
|
-
"node"
|
|
11
|
-
],
|
|
12
|
-
"outDir": "./dist",
|
|
13
|
-
"rootDir": "./src",
|
|
14
|
-
"declaration": true,
|
|
15
|
-
"declarationMap": true,
|
|
16
|
-
"sourceMap": true,
|
|
8
|
+
"moduleResolution": "node16",
|
|
17
9
|
"strict": true,
|
|
18
|
-
"noImplicitAny": true,
|
|
19
|
-
"strictNullChecks": true,
|
|
20
|
-
"strictFunctionTypes": true,
|
|
21
|
-
"strictBindCallApply": true,
|
|
22
|
-
"strictPropertyInitialization": true,
|
|
23
|
-
"noImplicitThis": true,
|
|
24
|
-
"alwaysStrict": true,
|
|
25
|
-
"noImplicitReturns": true,
|
|
26
|
-
"noFallthroughCasesInSwitch": true,
|
|
27
10
|
"esModuleInterop": true,
|
|
28
11
|
"skipLibCheck": true,
|
|
29
12
|
"forceConsistentCasingInFileNames": true,
|
|
30
13
|
"resolveJsonModule": true,
|
|
31
|
-
"
|
|
14
|
+
"types": [
|
|
15
|
+
"node"
|
|
16
|
+
],
|
|
17
|
+
"rootDir": ".",
|
|
32
18
|
},
|
|
33
19
|
"include": [
|
|
34
|
-
"src/**/*"
|
|
20
|
+
"src/**/*",
|
|
21
|
+
"tests/**/*",
|
|
22
|
+
"examples/**/*",
|
|
35
23
|
],
|
|
36
24
|
"exclude": [
|
|
37
25
|
"node_modules",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fastweb-cli.d.ts","sourceRoot":"","sources":["../../../contrib/fastweb-cli/fastweb-cli.ts"],"names":[],"mappings":""}
|
|
@@ -1,151 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
"use strict";
|
|
3
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
// npm imports
|
|
5
|
-
const commander_1 = require("commander");
|
|
6
|
-
// local imports
|
|
7
|
-
const http_client_js_1 = require("./http-client.js");
|
|
8
|
-
function getServerFromCmd(cmd) {
|
|
9
|
-
const globalOpts = cmd.optsWithGlobals();
|
|
10
|
-
return http_client_js_1.HttpClient.getServerUrl(globalOpts.server);
|
|
11
|
-
}
|
|
12
|
-
async function runTool(cmd, routeName, body) {
|
|
13
|
-
const server = getServerFromCmd(cmd);
|
|
14
|
-
try {
|
|
15
|
-
const response = await http_client_js_1.HttpClient.postTool(server, routeName, body);
|
|
16
|
-
http_client_js_1.HttpClient.printResponse(response);
|
|
17
|
-
}
|
|
18
|
-
catch (err) {
|
|
19
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
20
|
-
console.error(`fastweb-cli error: ${message}`);
|
|
21
|
-
process.exit(1);
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
///////////////////////////////////////////////////////////////////////////////
|
|
25
|
-
///////////////////////////////////////////////////////////////////////////////
|
|
26
|
-
//
|
|
27
|
-
///////////////////////////////////////////////////////////////////////////////
|
|
28
|
-
///////////////////////////////////////////////////////////////////////////////
|
|
29
|
-
function buildQuerySelectorsBody(opts) {
|
|
30
|
-
if (opts.selectorsJson !== undefined && opts.selectorsJson !== '') {
|
|
31
|
-
let parsed;
|
|
32
|
-
try {
|
|
33
|
-
parsed = JSON.parse(opts.selectorsJson);
|
|
34
|
-
}
|
|
35
|
-
catch (err) {
|
|
36
|
-
throw new Error(`--selectors-json is not valid JSON: ${err.message}`);
|
|
37
|
-
}
|
|
38
|
-
if (Array.isArray(parsed) === false) {
|
|
39
|
-
throw new Error('--selectors-json must be a JSON array');
|
|
40
|
-
}
|
|
41
|
-
return { selectors: parsed };
|
|
42
|
-
}
|
|
43
|
-
const selectorList = opts.selector ?? [];
|
|
44
|
-
if (selectorList.length === 0) {
|
|
45
|
-
throw new Error('At least one --selector or --selectors-json is required');
|
|
46
|
-
}
|
|
47
|
-
const limit = opts.limit === undefined ? 0 : Number.parseInt(opts.limit, 10);
|
|
48
|
-
if (Number.isNaN(limit) === true) {
|
|
49
|
-
throw new Error(`Invalid --limit: ${opts.limit}`);
|
|
50
|
-
}
|
|
51
|
-
const withAncestors = opts.withAncestors !== false;
|
|
52
|
-
const selectors = selectorList.map((selector) => ({
|
|
53
|
-
selector,
|
|
54
|
-
limit,
|
|
55
|
-
withAncestors,
|
|
56
|
-
}));
|
|
57
|
-
return { selectors };
|
|
58
|
-
}
|
|
59
|
-
///////////////////////////////////////////////////////////////////////////////
|
|
60
|
-
///////////////////////////////////////////////////////////////////////////////
|
|
61
|
-
//
|
|
62
|
-
///////////////////////////////////////////////////////////////////////////////
|
|
63
|
-
///////////////////////////////////////////////////////////////////////////////
|
|
64
|
-
async function main() {
|
|
65
|
-
const program = new commander_1.Command();
|
|
66
|
-
program
|
|
67
|
-
.name('fastweb-cli')
|
|
68
|
-
.description('CLI client for fastweb-http-server')
|
|
69
|
-
.option('-s, --server <url>', 'fastweb-http-server URL (default: env FASTWEB_SERVER or http://localhost:8787)');
|
|
70
|
-
program
|
|
71
|
-
.command('list_pages')
|
|
72
|
-
.description('List all open browser pages')
|
|
73
|
-
.action(async (_opts, cmd) => {
|
|
74
|
-
await runTool(cmd, 'list_pages', {});
|
|
75
|
-
});
|
|
76
|
-
program
|
|
77
|
-
.command('new_page')
|
|
78
|
-
.description('Open a new browser page')
|
|
79
|
-
.requiredOption('--url <url>', 'URL to open')
|
|
80
|
-
.action(async (opts, cmd) => {
|
|
81
|
-
await runTool(cmd, 'new_page', { url: opts.url });
|
|
82
|
-
});
|
|
83
|
-
program
|
|
84
|
-
.command('close_page')
|
|
85
|
-
.description('Close a page by its id')
|
|
86
|
-
.requiredOption('--page-id <number>', 'The page id to close')
|
|
87
|
-
.action(async (opts, cmd) => {
|
|
88
|
-
const pageId = Number.parseInt(opts.pageId, 10);
|
|
89
|
-
if (Number.isNaN(pageId) === true) {
|
|
90
|
-
console.error(`Invalid --page-id: ${opts.pageId}`);
|
|
91
|
-
process.exit(1);
|
|
92
|
-
}
|
|
93
|
-
await runTool(cmd, 'close_page', { pageId });
|
|
94
|
-
});
|
|
95
|
-
program
|
|
96
|
-
.command('navigate_page')
|
|
97
|
-
.description('Navigate the current page to a URL')
|
|
98
|
-
.requiredOption('--url <url>', 'URL to navigate to')
|
|
99
|
-
.action(async (opts, cmd) => {
|
|
100
|
-
await runTool(cmd, 'navigate_page', { url: opts.url });
|
|
101
|
-
});
|
|
102
|
-
program
|
|
103
|
-
.command('click')
|
|
104
|
-
.description('Click an element by its accessibility node uid')
|
|
105
|
-
.requiredOption('--uid <uid>', 'Accessibility node uid')
|
|
106
|
-
.action(async (opts, cmd) => {
|
|
107
|
-
await runTool(cmd, 'click', { uid: opts.uid });
|
|
108
|
-
});
|
|
109
|
-
program
|
|
110
|
-
.command('fill_form')
|
|
111
|
-
.description('Fill a form field')
|
|
112
|
-
.requiredOption('--uid <uid>', 'Accessibility node uid')
|
|
113
|
-
.requiredOption('--value <value>', 'Value to fill')
|
|
114
|
-
.action(async (opts, cmd) => {
|
|
115
|
-
await runTool(cmd, 'fill_form', {
|
|
116
|
-
elements: [{ uid: opts.uid, value: opts.value }],
|
|
117
|
-
});
|
|
118
|
-
});
|
|
119
|
-
program
|
|
120
|
-
.command('query_selectors_all')
|
|
121
|
-
.description('Query the accessibility tree with CSS-like selectors')
|
|
122
|
-
.option('--selector <selector>', 'CSS-like selector (repeatable)', (value, prev = []) => {
|
|
123
|
-
prev.push(value);
|
|
124
|
-
return prev;
|
|
125
|
-
})
|
|
126
|
-
.option('--limit <number>', 'Max nodes per selector (0 = unlimited)', '0')
|
|
127
|
-
.option('--with-ancestors', 'Include ancestor nodes', true)
|
|
128
|
-
.option('--no-with-ancestors', 'Exclude ancestor nodes')
|
|
129
|
-
.option('--selectors-json <json>', 'JSON array of {selector,limit,withAncestors} for per-selector control')
|
|
130
|
-
.action(async (opts, cmd) => {
|
|
131
|
-
let body;
|
|
132
|
-
try {
|
|
133
|
-
body = buildQuerySelectorsBody(opts);
|
|
134
|
-
}
|
|
135
|
-
catch (err) {
|
|
136
|
-
console.error(`fastweb-cli error: ${err.message}`);
|
|
137
|
-
process.exit(1);
|
|
138
|
-
}
|
|
139
|
-
await runTool(cmd, 'query_selectors_all', body);
|
|
140
|
-
});
|
|
141
|
-
program
|
|
142
|
-
.command('press_keys')
|
|
143
|
-
.description('Press a sequence of keys')
|
|
144
|
-
.requiredOption('--keys <keys>', "Comma-separated keys. E.g. 'Hello, Tab, Enter'")
|
|
145
|
-
.action(async (opts, cmd) => {
|
|
146
|
-
await runTool(cmd, 'press_keys', { keys: opts.keys });
|
|
147
|
-
});
|
|
148
|
-
await program.parseAsync(process.argv);
|
|
149
|
-
}
|
|
150
|
-
void main();
|
|
151
|
-
//# sourceMappingURL=fastweb-cli.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fastweb-cli.js","sourceRoot":"","sources":["../../../contrib/fastweb-cli/fastweb-cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import { type ToolResponse } from '../fastweb-http-server/tool-schemas.js';
|
|
2
|
-
export declare class HttpClient {
|
|
3
|
-
static getServerUrl(overrideUrl: string | undefined): string;
|
|
4
|
-
static postTool(serverUrl: string, routeName: string, body: unknown): Promise<ToolResponse>;
|
|
5
|
-
static printResponse(response: ToolResponse): void;
|
|
6
|
-
}
|
|
7
|
-
//# sourceMappingURL=http-client.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"http-client.d.ts","sourceRoot":"","sources":["../../../contrib/fastweb-cli/http-client.ts"],"names":[],"mappings":"AACA,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,wCAAwC,CAAC;AAQ/F,qBAAa,UAAU;IACtB,MAAM,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM;WAO/C,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC;IA2BjG,MAAM,CAAC,aAAa,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI;CAKlD"}
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.HttpClient = void 0;
|
|
4
|
-
// local imports
|
|
5
|
-
const tool_schemas_js_1 = require("../fastweb-http-server/tool-schemas.js");
|
|
6
|
-
///////////////////////////////////////////////////////////////////////////////
|
|
7
|
-
///////////////////////////////////////////////////////////////////////////////
|
|
8
|
-
//
|
|
9
|
-
///////////////////////////////////////////////////////////////////////////////
|
|
10
|
-
///////////////////////////////////////////////////////////////////////////////
|
|
11
|
-
class HttpClient {
|
|
12
|
-
static getServerUrl(overrideUrl) {
|
|
13
|
-
if (overrideUrl !== undefined && overrideUrl !== '')
|
|
14
|
-
return overrideUrl;
|
|
15
|
-
const envUrl = process.env.FASTWEB_SERVER;
|
|
16
|
-
if (envUrl !== undefined && envUrl !== '')
|
|
17
|
-
return envUrl;
|
|
18
|
-
return 'http://localhost:8787';
|
|
19
|
-
}
|
|
20
|
-
static async postTool(serverUrl, routeName, body) {
|
|
21
|
-
const url = `${serverUrl.replace(/\/+$/, '')}/tools/${routeName}`;
|
|
22
|
-
const response = await fetch(url, {
|
|
23
|
-
method: 'POST',
|
|
24
|
-
headers: { 'content-type': 'application/json' },
|
|
25
|
-
body: JSON.stringify(body ?? {}),
|
|
26
|
-
});
|
|
27
|
-
const responseText = await response.text();
|
|
28
|
-
if (response.ok === false) {
|
|
29
|
-
throw new Error(`HTTP ${response.status} ${response.statusText}: ${responseText}`);
|
|
30
|
-
}
|
|
31
|
-
let parsedJson;
|
|
32
|
-
try {
|
|
33
|
-
parsedJson = JSON.parse(responseText);
|
|
34
|
-
}
|
|
35
|
-
catch (err) {
|
|
36
|
-
throw new Error(`Invalid JSON from server: ${responseText}`);
|
|
37
|
-
}
|
|
38
|
-
const parsed = tool_schemas_js_1.ToolResponseSchema.safeParse(parsedJson);
|
|
39
|
-
if (parsed.success === false) {
|
|
40
|
-
throw new Error(`Unexpected response shape: ${JSON.stringify(parsed.error.flatten())}`);
|
|
41
|
-
}
|
|
42
|
-
return parsed.data;
|
|
43
|
-
}
|
|
44
|
-
static printResponse(response) {
|
|
45
|
-
for (const part of response.content) {
|
|
46
|
-
console.log(part.text);
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
exports.HttpClient = HttpClient;
|
|
51
|
-
//# sourceMappingURL=http-client.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"http-client.js","sourceRoot":"","sources":["../../../contrib/fastweb-cli/http-client.ts"],"names":[],"mappings":";;;AAAA,gBAAgB;AAChB,4EAA+F;AAE/F,+EAA+E;AAC/E,+EAA+E;AAC/E,EAAE;AACF,+EAA+E;AAC/E,+EAA+E;AAE/E,MAAa,UAAU;IACtB,MAAM,CAAC,YAAY,CAAC,WAA+B;QAClD,IAAI,WAAW,KAAK,SAAS,IAAI,WAAW,KAAK,EAAE;YAAE,OAAO,WAAW,CAAC;QACxE,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;QAC1C,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,EAAE;YAAE,OAAO,MAAM,CAAC;QACzD,OAAO,uBAAuB,CAAC;IAChC,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAiB,EAAE,SAAiB,EAAE,IAAa;QACxE,MAAM,GAAG,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,SAAS,EAAE,CAAC;QAClE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YACjC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,EAAE,CAAC;SAChC,CAAC,CAAC;QAEH,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC3C,IAAI,QAAQ,CAAC,EAAE,KAAK,KAAK,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,QAAQ,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,KAAK,YAAY,EAAE,CAAC,CAAC;QACpF,CAAC;QAED,IAAI,UAAmB,CAAC;QACxB,IAAI,CAAC;YACJ,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QACvC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,6BAA6B,YAAY,EAAE,CAAC,CAAC;QAC9D,CAAC;QAED,MAAM,MAAM,GAAG,oCAAkB,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACxD,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,8BAA8B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;QACzF,CAAC;QACD,OAAO,MAAM,CAAC,IAAI,CAAC;IACpB,CAAC;IAED,MAAM,CAAC,aAAa,CAAC,QAAsB;QAC1C,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxB,CAAC;IACF,CAAC;CACD;AAxCD,gCAwCC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fastweb-http-server.d.ts","sourceRoot":"","sources":["../../../contrib/fastweb-http-server/fastweb-http-server.ts"],"names":[],"mappings":""}
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
"use strict";
|
|
3
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
-
};
|
|
6
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
// node imports
|
|
8
|
-
const node_path_1 = __importDefault(require("node:path"));
|
|
9
|
-
// npm imports
|
|
10
|
-
const commander_1 = require("commander");
|
|
11
|
-
const express_1 = __importDefault(require("express"));
|
|
12
|
-
// local imports
|
|
13
|
-
const mcp_client_js_1 = require("../../src/libs/mcp_client.js");
|
|
14
|
-
const routes_js_1 = require("./routes.js");
|
|
15
|
-
///////////////////////////////////////////////////////////////////////////////
|
|
16
|
-
///////////////////////////////////////////////////////////////////////////////
|
|
17
|
-
//
|
|
18
|
-
///////////////////////////////////////////////////////////////////////////////
|
|
19
|
-
///////////////////////////////////////////////////////////////////////////////
|
|
20
|
-
class MainHelper {
|
|
21
|
-
static async commandStart({ port, verbose = false, }) {
|
|
22
|
-
// Spawn fastweb-mcp as a subprocess and hold a persistent MCP client to it.
|
|
23
|
-
const fastwebMcpEntry = node_path_1.default.resolve(__dirname, '..', '..', 'src', 'fastweb_mcp.ts');
|
|
24
|
-
const mcpClient = new mcp_client_js_1.McpClient({
|
|
25
|
-
name: 'fastweb-http-server',
|
|
26
|
-
version: '1.0.0',
|
|
27
|
-
transport: {
|
|
28
|
-
type: 'stdio',
|
|
29
|
-
command: 'npx',
|
|
30
|
-
args: ['tsx', fastwebMcpEntry, 'mcp_server'],
|
|
31
|
-
},
|
|
32
|
-
});
|
|
33
|
-
console.error('Connecting to fastweb-mcp ...');
|
|
34
|
-
await mcpClient.connect();
|
|
35
|
-
console.error('MCP client connected');
|
|
36
|
-
if (verbose) {
|
|
37
|
-
const tools = await mcpClient.listTools();
|
|
38
|
-
console.error('Tools available in fastweb-mcp:');
|
|
39
|
-
for (const tool of tools) {
|
|
40
|
-
console.error(`- ${tool.name}`);
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
const app = (0, express_1.default)();
|
|
44
|
-
app.use(express_1.default.json({ limit: '2mb' }));
|
|
45
|
-
routes_js_1.Routes.register(app, mcpClient);
|
|
46
|
-
const server = app.listen(port, () => {
|
|
47
|
-
console.error(`fastweb-http-server listening on http://localhost:${port}`);
|
|
48
|
-
});
|
|
49
|
-
const shutdown = async (signal) => {
|
|
50
|
-
console.error(`Received ${signal}, shutting down ...`);
|
|
51
|
-
server.close();
|
|
52
|
-
await mcpClient.close();
|
|
53
|
-
process.exit(0);
|
|
54
|
-
};
|
|
55
|
-
process.on('SIGINT', () => { void shutdown('SIGINT'); });
|
|
56
|
-
process.on('SIGTERM', () => { void shutdown('SIGTERM'); });
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
///////////////////////////////////////////////////////////////////////////////
|
|
60
|
-
///////////////////////////////////////////////////////////////////////////////
|
|
61
|
-
//
|
|
62
|
-
///////////////////////////////////////////////////////////////////////////////
|
|
63
|
-
///////////////////////////////////////////////////////////////////////////////
|
|
64
|
-
async function main() {
|
|
65
|
-
const program = new commander_1.Command();
|
|
66
|
-
program
|
|
67
|
-
.name('fastweb-http-server')
|
|
68
|
-
.description('Persistent HTTP server fronting fastweb-mcp')
|
|
69
|
-
.option('-p, --port <number>', 'Port to listen on', '8787')
|
|
70
|
-
.option('-v, --verbose', 'Enable verbose logging')
|
|
71
|
-
.action(async (opts) => {
|
|
72
|
-
const port = Number.parseInt(opts.port, 10);
|
|
73
|
-
if (Number.isNaN(port) === true) {
|
|
74
|
-
console.error(`Invalid --port: ${opts.port}`);
|
|
75
|
-
process.exit(1);
|
|
76
|
-
}
|
|
77
|
-
await MainHelper.commandStart({ port, verbose: opts.verbose });
|
|
78
|
-
});
|
|
79
|
-
await program.parseAsync(process.argv);
|
|
80
|
-
}
|
|
81
|
-
void main();
|
|
82
|
-
//# sourceMappingURL=fastweb-http-server.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fastweb-http-server.js","sourceRoot":"","sources":["../../../contrib/fastweb-http-server/fastweb-http-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../../contrib/fastweb-http-server/routes.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAqB,MAAM,SAAS,CAAC;AAG1D,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AASzD,qBAAa,MAAM;IAClB,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI;CA6BzD"}
|