fastbrowser_cli 1.0.2 → 1.0.4
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/README.md +118 -0
- package/dist/fastbrowser_cli/fastbrowser_cli.d.ts +3 -0
- package/dist/fastbrowser_cli/fastbrowser_cli.d.ts.map +1 -0
- package/dist/fastbrowser_cli/fastbrowser_cli.js +288 -0
- package/dist/fastbrowser_cli/fastbrowser_cli.js.map +1 -0
- package/dist/fastbrowser_cli/libs/http-client.d.ts +7 -0
- package/dist/fastbrowser_cli/libs/http-client.d.ts.map +1 -0
- package/dist/fastbrowser_cli/libs/http-client.js +51 -0
- package/dist/fastbrowser_cli/libs/http-client.js.map +1 -0
- package/dist/fastbrowser_cli/libs/server-manager.d.ts +12 -0
- package/dist/fastbrowser_cli/libs/server-manager.d.ts.map +1 -0
- package/dist/fastbrowser_cli/libs/server-manager.js +194 -0
- package/dist/fastbrowser_cli/libs/server-manager.js.map +1 -0
- package/dist/fastbrowser_httpd/fastbrowser_httpd.d.ts +3 -0
- package/dist/fastbrowser_httpd/fastbrowser_httpd.d.ts.map +1 -0
- package/dist/fastbrowser_httpd/fastbrowser_httpd.js +82 -0
- package/dist/fastbrowser_httpd/fastbrowser_httpd.js.map +1 -0
- package/dist/fastbrowser_httpd/libs/routes.d.ts +6 -0
- package/dist/fastbrowser_httpd/libs/routes.d.ts.map +1 -0
- package/dist/fastbrowser_httpd/libs/routes.js +41 -0
- package/dist/fastbrowser_httpd/libs/routes.js.map +1 -0
- package/dist/fastbrowser_httpd/libs/tool-schemas.d.ts +72 -0
- package/dist/fastbrowser_httpd/libs/tool-schemas.d.ts.map +1 -0
- package/dist/fastbrowser_httpd/libs/tool-schemas.js +65 -0
- package/dist/fastbrowser_httpd/libs/tool-schemas.js.map +1 -0
- package/dist/fastbrowser_mcp/fastbrowser_mcp.d.ts +4 -0
- package/dist/fastbrowser_mcp/fastbrowser_mcp.d.ts.map +1 -0
- package/dist/fastbrowser_mcp/fastbrowser_mcp.js +417 -0
- package/dist/fastbrowser_mcp/fastbrowser_mcp.js.map +1 -0
- package/dist/fastbrowser_mcp/libs/mcp_client.d.ts +120 -0
- package/dist/fastbrowser_mcp/libs/mcp_client.d.ts.map +1 -0
- package/dist/fastbrowser_mcp/libs/mcp_client.js +83 -0
- package/dist/fastbrowser_mcp/libs/mcp_client.js.map +1 -0
- package/dist/fastbrowser_mcp/libs/mcp_proxy.d.ts +10 -0
- package/dist/fastbrowser_mcp/libs/mcp_proxy.d.ts.map +1 -0
- package/dist/fastbrowser_mcp/libs/mcp_proxy.js +45 -0
- package/dist/fastbrowser_mcp/libs/mcp_proxy.js.map +1 -0
- package/dist/fastbrowser_mcp/libs/schemas.d.ts +28 -0
- package/dist/fastbrowser_mcp/libs/schemas.d.ts.map +1 -0
- package/dist/fastbrowser_mcp/libs/schemas.js +38 -0
- package/dist/fastbrowser_mcp/libs/schemas.js.map +1 -0
- package/docs/brainstorm_scrap_by_ai.md +1 -1
- package/docs/feature_support_cli.md +27 -27
- package/package.json +7 -7
- package/{tmp/.claude/skills/fastweb → skills/fastbrowser}/SKILL.md +22 -22
- package/src/{fastweb_cli/fastweb_cli.ts → fastbrowser_cli/fastbrowser_cli.ts} +49 -15
- package/src/{fastweb_cli → fastbrowser_cli}/libs/http-client.ts +2 -2
- package/src/{fastweb_cli → fastbrowser_cli}/libs/server-manager.ts +8 -8
- package/src/{fastweb_http_server/fastweb_http_server.ts → fastbrowser_httpd/fastbrowser_httpd.ts} +10 -10
- package/src/{fastweb_http_server → fastbrowser_httpd}/libs/routes.ts +1 -1
- package/src/{fastweb_http_server → fastbrowser_httpd}/libs/tool-schemas.ts +4 -4
- package/src/{fastweb_mcp → fastbrowser_mcp}/libs/mcp_proxy.ts +1 -1
- package/src/{fastweb_mcp → fastbrowser_mcp}/libs/schemas.ts +1 -1
- package/tmp/.claude/.claude/settings.local.json +7 -0
- package/tmp/.claude/skills/fastbrowser/SKILL.md +214 -0
- /package/src/{fastweb_mcp/fastweb_mcp.ts → fastbrowser_mcp/fastbrowser_mcp.ts} +0 -0
- /package/src/{fastweb_mcp → fastbrowser_mcp}/libs/mcp_client.ts +0 -0
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.ServerManager = void 0;
|
|
7
|
+
// node imports
|
|
8
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
9
|
+
const node_os_1 = __importDefault(require("node:os"));
|
|
10
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
11
|
+
const node_child_process_1 = require("node:child_process");
|
|
12
|
+
const STATE_DIR = node_path_1.default.join(node_os_1.default.homedir(), '.fastbrowser_cli');
|
|
13
|
+
const PID_FILE = node_path_1.default.join(STATE_DIR, 'server.json');
|
|
14
|
+
const LOG_FILE = node_path_1.default.join(STATE_DIR, 'server.log');
|
|
15
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
16
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
17
|
+
//
|
|
18
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
19
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
20
|
+
class ServerManager {
|
|
21
|
+
static async status(serverUrl) {
|
|
22
|
+
const base = serverUrl.replace(/\/+$/, '');
|
|
23
|
+
try {
|
|
24
|
+
const response = await fetch(`${base}/health`, {
|
|
25
|
+
method: 'GET',
|
|
26
|
+
signal: AbortSignal.timeout(500),
|
|
27
|
+
});
|
|
28
|
+
if (response.ok === false)
|
|
29
|
+
return 'stopped';
|
|
30
|
+
const payload = await response.json();
|
|
31
|
+
return payload.ok === true ? 'running' : 'stopped';
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return 'stopped';
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
static async ensureRunning(serverUrl) {
|
|
38
|
+
const state = await ServerManager.status(serverUrl);
|
|
39
|
+
if (state === 'running')
|
|
40
|
+
return;
|
|
41
|
+
if (ServerManager.isLocalUrl(serverUrl) === false) {
|
|
42
|
+
throw new Error(`fastbrowser server at ${serverUrl} is not reachable and cannot be auto-started (non-local URL)`);
|
|
43
|
+
}
|
|
44
|
+
await ServerManager.start(serverUrl);
|
|
45
|
+
}
|
|
46
|
+
static async start(serverUrl) {
|
|
47
|
+
const existing = await ServerManager.status(serverUrl);
|
|
48
|
+
if (existing === 'running') {
|
|
49
|
+
console.error(`fastbrowser server already running at ${serverUrl}`);
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
if (ServerManager.isLocalUrl(serverUrl) === false) {
|
|
53
|
+
throw new Error(`Refusing to start: ${serverUrl} is not a local URL`);
|
|
54
|
+
}
|
|
55
|
+
const port = ServerManager.parsePort(serverUrl);
|
|
56
|
+
const entryPath = node_path_1.default.resolve(__dirname, '..', '..', 'fastbrowser_httpd', 'fastbrowser_httpd.ts');
|
|
57
|
+
const packageRoot = node_path_1.default.resolve(__dirname, '..', '..', '..');
|
|
58
|
+
node_fs_1.default.mkdirSync(STATE_DIR, { recursive: true });
|
|
59
|
+
const logFd = node_fs_1.default.openSync(LOG_FILE, 'a');
|
|
60
|
+
const child = (0, node_child_process_1.spawn)('npx', ['tsx', entryPath, '--port', String(port)], {
|
|
61
|
+
detached: true,
|
|
62
|
+
stdio: ['ignore', logFd, logFd],
|
|
63
|
+
cwd: packageRoot,
|
|
64
|
+
env: process.env,
|
|
65
|
+
});
|
|
66
|
+
child.unref();
|
|
67
|
+
const pid = child.pid;
|
|
68
|
+
if (pid === undefined) {
|
|
69
|
+
node_fs_1.default.closeSync(logFd);
|
|
70
|
+
throw new Error('Failed to spawn fastbrowser-httpd (no pid)');
|
|
71
|
+
}
|
|
72
|
+
const pidFile = {
|
|
73
|
+
pid,
|
|
74
|
+
port,
|
|
75
|
+
startedAt: new Date().toISOString(),
|
|
76
|
+
};
|
|
77
|
+
node_fs_1.default.writeFileSync(PID_FILE, JSON.stringify(pidFile, null, 2));
|
|
78
|
+
const deadline = Date.now() + 10000;
|
|
79
|
+
while (Date.now() < deadline) {
|
|
80
|
+
const state = await ServerManager.status(serverUrl);
|
|
81
|
+
if (state === 'running') {
|
|
82
|
+
node_fs_1.default.closeSync(logFd);
|
|
83
|
+
console.error(`fastbrowser server started (pid=${pid}, port=${port})`);
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
await ServerManager.sleep(500);
|
|
87
|
+
}
|
|
88
|
+
node_fs_1.default.closeSync(logFd);
|
|
89
|
+
const tail = ServerManager.readLogTail(50);
|
|
90
|
+
throw new Error(`fastbrowser server did not become healthy within 10s. Log tail:\n${tail}`);
|
|
91
|
+
}
|
|
92
|
+
static async stop(serverUrl) {
|
|
93
|
+
if (node_fs_1.default.existsSync(PID_FILE) === false) {
|
|
94
|
+
console.error('no server pid file; nothing to stop');
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
let pidFile;
|
|
98
|
+
try {
|
|
99
|
+
const raw = node_fs_1.default.readFileSync(PID_FILE, 'utf8');
|
|
100
|
+
pidFile = JSON.parse(raw);
|
|
101
|
+
}
|
|
102
|
+
catch (err) {
|
|
103
|
+
throw new Error(`Failed to read pid file ${PID_FILE}: ${err.message}`);
|
|
104
|
+
}
|
|
105
|
+
const pid = pidFile.pid;
|
|
106
|
+
try {
|
|
107
|
+
process.kill(pid, 'SIGTERM');
|
|
108
|
+
}
|
|
109
|
+
catch (err) {
|
|
110
|
+
const code = err.code;
|
|
111
|
+
if (code !== 'ESRCH') {
|
|
112
|
+
throw err;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
const deadline = Date.now() + 5000;
|
|
116
|
+
while (Date.now() < deadline) {
|
|
117
|
+
if (ServerManager.isAlive(pid) === false)
|
|
118
|
+
break;
|
|
119
|
+
await ServerManager.sleep(200);
|
|
120
|
+
}
|
|
121
|
+
if (ServerManager.isAlive(pid) === true) {
|
|
122
|
+
try {
|
|
123
|
+
process.kill(pid, 'SIGKILL');
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
// best effort
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
try {
|
|
130
|
+
node_fs_1.default.unlinkSync(PID_FILE);
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
// best effort
|
|
134
|
+
}
|
|
135
|
+
// Best-effort: ensure the HTTP server is actually down from the caller's perspective.
|
|
136
|
+
const state = await ServerManager.status(serverUrl);
|
|
137
|
+
if (state === 'running') {
|
|
138
|
+
console.error(`warning: process ${pid} killed but ${serverUrl} still responds to /health`);
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
console.error('fastbrowser server stopped');
|
|
142
|
+
}
|
|
143
|
+
static isLocalUrl(serverUrl) {
|
|
144
|
+
try {
|
|
145
|
+
const parsed = new URL(serverUrl);
|
|
146
|
+
const host = parsed.hostname;
|
|
147
|
+
return host === 'localhost' || host === '127.0.0.1' || host === '::1' || host === '0.0.0.0';
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
return false;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
static parsePort(serverUrl) {
|
|
154
|
+
try {
|
|
155
|
+
const parsed = new URL(serverUrl);
|
|
156
|
+
if (parsed.port !== '') {
|
|
157
|
+
const port = Number.parseInt(parsed.port, 10);
|
|
158
|
+
if (Number.isNaN(port) === false)
|
|
159
|
+
return port;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
// fall through
|
|
164
|
+
}
|
|
165
|
+
return 8787;
|
|
166
|
+
}
|
|
167
|
+
static isAlive(pid) {
|
|
168
|
+
try {
|
|
169
|
+
process.kill(pid, 0);
|
|
170
|
+
return true;
|
|
171
|
+
}
|
|
172
|
+
catch (err) {
|
|
173
|
+
const code = err.code;
|
|
174
|
+
if (code === 'EPERM')
|
|
175
|
+
return true;
|
|
176
|
+
return false;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
static readLogTail(maxLines) {
|
|
180
|
+
try {
|
|
181
|
+
const content = node_fs_1.default.readFileSync(LOG_FILE, 'utf8');
|
|
182
|
+
const lines = content.split('\n');
|
|
183
|
+
return lines.slice(Math.max(0, lines.length - maxLines)).join('\n');
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
return '(log unavailable)';
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
static sleep(ms) {
|
|
190
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
exports.ServerManager = ServerManager;
|
|
194
|
+
//# sourceMappingURL=server-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-manager.js","sourceRoot":"","sources":["../../../src/fastbrowser_cli/libs/server-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fastbrowser_httpd.d.ts","sourceRoot":"","sources":["../../src/fastbrowser_httpd/fastbrowser_httpd.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,82 @@
|
|
|
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("../fastbrowser_mcp/libs/mcp_client.js");
|
|
14
|
+
const routes_js_1 = require("./libs/routes.js");
|
|
15
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
16
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
17
|
+
//
|
|
18
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
19
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
20
|
+
class MainHelper {
|
|
21
|
+
static async commandStart({ port, verbose = false, }) {
|
|
22
|
+
// Spawn fastbrowser-mcp as a subprocess and hold a persistent MCP client to it.
|
|
23
|
+
const fastbrowserMcpEntry = node_path_1.default.resolve(__dirname, '..', 'fastbrowser_mcp', 'fastbrowser_mcp.ts');
|
|
24
|
+
const mcpClient = new mcp_client_js_1.McpClient({
|
|
25
|
+
name: 'fastbrowser-httpd',
|
|
26
|
+
version: '1.0.0',
|
|
27
|
+
transport: {
|
|
28
|
+
type: 'stdio',
|
|
29
|
+
command: 'npx',
|
|
30
|
+
args: ['tsx', fastbrowserMcpEntry, 'mcp_server'],
|
|
31
|
+
},
|
|
32
|
+
});
|
|
33
|
+
console.error('Connecting to fastbrowser-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 fastbrowser-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(`fastbrowser-httpd 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('fastbrowser-httpd')
|
|
68
|
+
.description('Persistent HTTP server fronting fastbrowser-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=fastbrowser_httpd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fastbrowser_httpd.js","sourceRoot":"","sources":["../../src/fastbrowser_httpd/fastbrowser_httpd.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../../src/fastbrowser_httpd/libs/routes.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAqB,MAAM,SAAS,CAAC;AAG1D,OAAO,EAAE,SAAS,EAAE,MAAM,0CAA0C,CAAC;AASrE,qBAAa,MAAM;IAClB,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI;CA6BzD"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Routes = void 0;
|
|
4
|
+
const tool_schemas_js_1 = require("./tool-schemas.js");
|
|
5
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
6
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
7
|
+
//
|
|
8
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
9
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
10
|
+
class Routes {
|
|
11
|
+
static register(app, mcpClient) {
|
|
12
|
+
app.get('/health', (_req, res) => {
|
|
13
|
+
res.json({ ok: true });
|
|
14
|
+
});
|
|
15
|
+
for (const entry of tool_schemas_js_1.TOOL_SCHEMAS) {
|
|
16
|
+
const path = `/tools/${entry.routeName}`;
|
|
17
|
+
app.post(path, async (request, response) => {
|
|
18
|
+
// Validate body against the tool's Zod schema
|
|
19
|
+
const parsed = entry.requestSchema.safeParse(request.body ?? {});
|
|
20
|
+
if (parsed.success === false) {
|
|
21
|
+
response.status(400).json({ error: parsed.error.flatten() });
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
try {
|
|
25
|
+
const mcpResult = await mcpClient.callTool(entry.mcpToolName, parsed.data);
|
|
26
|
+
// Narrow the MCP result to our uniform response shape.
|
|
27
|
+
const toolResponse = tool_schemas_js_1.ToolResponseSchema.parse({
|
|
28
|
+
content: mcpResult.content,
|
|
29
|
+
});
|
|
30
|
+
response.json(toolResponse);
|
|
31
|
+
}
|
|
32
|
+
catch (err) {
|
|
33
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
34
|
+
response.status(500).json({ error: message });
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
exports.Routes = Routes;
|
|
41
|
+
//# sourceMappingURL=routes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routes.js","sourceRoot":"","sources":["../../../src/fastbrowser_httpd/libs/routes.ts"],"names":[],"mappings":";;;AAKA,uDAAqE;AAErE,+EAA+E;AAC/E,+EAA+E;AAC/E,EAAE;AACF,+EAA+E;AAC/E,+EAA+E;AAE/E,MAAa,MAAM;IAClB,MAAM,CAAC,QAAQ,CAAC,GAAY,EAAE,SAAoB;QACjD,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,IAAa,EAAE,GAAa,EAAE,EAAE;YACnD,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QACxB,CAAC,CAAC,CAAC;QAEH,KAAK,MAAM,KAAK,IAAI,8BAAY,EAAE,CAAC;YAClC,MAAM,IAAI,GAAG,UAAU,KAAK,CAAC,SAAS,EAAE,CAAC;YACzC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,OAAgB,EAAE,QAAkB,EAAE,EAAE;gBAC7D,8CAA8C;gBAC9C,MAAM,MAAM,GAAG,KAAK,CAAC,aAAa,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;gBACjE,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;oBAC9B,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;oBAC7D,OAAO;gBACR,CAAC;gBAED,IAAI,CAAC;oBACJ,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,MAAM,CAAC,IAA+B,CAAC,CAAC;oBACtG,uDAAuD;oBACvD,MAAM,YAAY,GAAG,oCAAkB,CAAC,KAAK,CAAC;wBAC7C,OAAO,EAAE,SAAS,CAAC,OAAO;qBAC1B,CAAC,CAAC;oBACH,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;gBAC7B,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACd,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;oBACjE,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;gBAC/C,CAAC;YACF,CAAC,CAAC,CAAC;QACJ,CAAC;IACF,CAAC;CACD;AA9BD,wBA8BC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export type { QuerySelectorInput, QuerySelectorsInput, QuerySelectorFirstInput, QuerySelectorsFirstInput } from '../../fastbrowser_mcp/libs/schemas.js';
|
|
3
|
+
export declare const ListPagesRequestSchema: z.ZodObject<{}, z.core.$strict>;
|
|
4
|
+
export type ListPagesRequest = z.infer<typeof ListPagesRequestSchema>;
|
|
5
|
+
export declare const NewPageRequestSchema: z.ZodObject<{
|
|
6
|
+
url: z.ZodString;
|
|
7
|
+
}, z.core.$strip>;
|
|
8
|
+
export type NewPageRequest = z.infer<typeof NewPageRequestSchema>;
|
|
9
|
+
export declare const ClosePageRequestSchema: z.ZodObject<{
|
|
10
|
+
pageId: z.ZodNumber;
|
|
11
|
+
}, z.core.$strip>;
|
|
12
|
+
export type ClosePageRequest = z.infer<typeof ClosePageRequestSchema>;
|
|
13
|
+
export declare const NavigatePageRequestSchema: z.ZodObject<{
|
|
14
|
+
url: z.ZodString;
|
|
15
|
+
}, z.core.$strip>;
|
|
16
|
+
export type NavigatePageRequest = z.infer<typeof NavigatePageRequestSchema>;
|
|
17
|
+
export declare const ClickRequestSchema: z.ZodObject<{
|
|
18
|
+
selector: z.ZodString;
|
|
19
|
+
}, z.core.$strip>;
|
|
20
|
+
export type ClickRequest = z.infer<typeof ClickRequestSchema>;
|
|
21
|
+
export declare const FillFormElementSchema: z.ZodObject<{
|
|
22
|
+
selector: z.ZodString;
|
|
23
|
+
value: z.ZodString;
|
|
24
|
+
}, z.core.$strip>;
|
|
25
|
+
export type FillFormElement = z.infer<typeof FillFormElementSchema>;
|
|
26
|
+
export declare const FillFormRequestSchema: z.ZodObject<{
|
|
27
|
+
elements: z.ZodArray<z.ZodObject<{
|
|
28
|
+
selector: z.ZodString;
|
|
29
|
+
value: z.ZodString;
|
|
30
|
+
}, z.core.$strip>>;
|
|
31
|
+
}, z.core.$strip>;
|
|
32
|
+
export type FillFormRequest = z.infer<typeof FillFormRequestSchema>;
|
|
33
|
+
export declare const QuerySelectorsAllRequestSchema: z.ZodObject<{
|
|
34
|
+
selectors: z.ZodArray<z.ZodObject<{
|
|
35
|
+
selector: z.ZodString;
|
|
36
|
+
limit: z.ZodDefault<z.ZodNumber>;
|
|
37
|
+
withAncestors: z.ZodDefault<z.ZodBoolean>;
|
|
38
|
+
}, z.core.$strip>>;
|
|
39
|
+
}, z.core.$strip>;
|
|
40
|
+
export type QuerySelectorsAllRequest = z.infer<typeof QuerySelectorsAllRequestSchema>;
|
|
41
|
+
export declare const QuerySelectorRequestSchema: z.ZodObject<{
|
|
42
|
+
selectors: z.ZodArray<z.ZodObject<{
|
|
43
|
+
selector: z.ZodString;
|
|
44
|
+
withAncestors: z.ZodDefault<z.ZodBoolean>;
|
|
45
|
+
}, z.core.$strip>>;
|
|
46
|
+
}, z.core.$strip>;
|
|
47
|
+
export type QuerySelectorRequest = z.infer<typeof QuerySelectorRequestSchema>;
|
|
48
|
+
export declare const PressKeysRequestSchema: z.ZodObject<{
|
|
49
|
+
keys: z.ZodString;
|
|
50
|
+
}, z.core.$strip>;
|
|
51
|
+
export type PressKeysRequest = z.infer<typeof PressKeysRequestSchema>;
|
|
52
|
+
export declare const TakeSnapshotRequestSchema: z.ZodObject<{}, z.core.$strict>;
|
|
53
|
+
export type TakeSnapshotRequest = z.infer<typeof TakeSnapshotRequestSchema>;
|
|
54
|
+
export declare const TextContentSchema: z.ZodObject<{
|
|
55
|
+
type: z.ZodLiteral<"text">;
|
|
56
|
+
text: z.ZodString;
|
|
57
|
+
}, z.core.$strip>;
|
|
58
|
+
export type TextContent = z.infer<typeof TextContentSchema>;
|
|
59
|
+
export declare const ToolResponseSchema: z.ZodObject<{
|
|
60
|
+
content: z.ZodArray<z.ZodObject<{
|
|
61
|
+
type: z.ZodLiteral<"text">;
|
|
62
|
+
text: z.ZodString;
|
|
63
|
+
}, z.core.$strip>>;
|
|
64
|
+
}, z.core.$strip>;
|
|
65
|
+
export type ToolResponse = z.infer<typeof ToolResponseSchema>;
|
|
66
|
+
export type ToolSchemaEntry = {
|
|
67
|
+
routeName: string;
|
|
68
|
+
mcpToolName: string;
|
|
69
|
+
requestSchema: z.ZodType;
|
|
70
|
+
};
|
|
71
|
+
export declare const TOOL_SCHEMAS: ToolSchemaEntry[];
|
|
72
|
+
//# sourceMappingURL=tool-schemas.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-schemas.d.ts","sourceRoot":"","sources":["../../../src/fastbrowser_httpd/libs/tool-schemas.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,YAAY,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,MAAM,uCAAuC,CAAC;AAUxJ,eAAO,MAAM,sBAAsB,iCAAwB,CAAC;AAC5D,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAEtE,eAAO,MAAM,oBAAoB;;iBAE/B,CAAC;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE,eAAO,MAAM,sBAAsB;;iBAEjC,CAAC;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAEtE,eAAO,MAAM,yBAAyB;;iBAEpC,CAAC;AACH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAE5E,eAAO,MAAM,kBAAkB;;iBAE7B,CAAC;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D,eAAO,MAAM,qBAAqB;;;iBAGhC,CAAC;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE,eAAO,MAAM,qBAAqB;;;;;iBAEhC,CAAC;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE,eAAO,MAAM,8BAA8B;;;;;;iBAA4B,CAAC;AACxE,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,8BAA8B,CAAC,CAAC;AAEtF,eAAO,MAAM,0BAA0B;;;;;iBAAiC,CAAC;AACzE,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAE9E,eAAO,MAAM,sBAAsB;;iBAEjC,CAAC;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAEtE,eAAO,MAAM,yBAAyB,iCAAwB,CAAC;AAC/D,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAQ5E,eAAO,MAAM,iBAAiB;;;iBAG5B,CAAC;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE5D,eAAO,MAAM,kBAAkB;;;;;iBAE7B,CAAC;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAW9D,MAAM,MAAM,eAAe,GAAG;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,CAAC,CAAC,OAAO,CAAC;CACzB,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,eAAe,EAWzC,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TOOL_SCHEMAS = exports.ToolResponseSchema = exports.TextContentSchema = exports.TakeSnapshotRequestSchema = exports.PressKeysRequestSchema = exports.QuerySelectorRequestSchema = exports.QuerySelectorsAllRequestSchema = exports.FillFormRequestSchema = exports.FillFormElementSchema = exports.ClickRequestSchema = exports.NavigatePageRequestSchema = exports.ClosePageRequestSchema = exports.NewPageRequestSchema = exports.ListPagesRequestSchema = void 0;
|
|
4
|
+
// npm imports
|
|
5
|
+
const zod_1 = require("zod");
|
|
6
|
+
// local imports - reuse the authoritative query selector schemas
|
|
7
|
+
const schemas_js_1 = require("../../fastbrowser_mcp/libs/schemas.js");
|
|
8
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
9
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
10
|
+
// Request schemas — one per tool. Shapes mirror what the underlying
|
|
11
|
+
// fastbrowser-mcp tools accept. For the proxied chrome-devtools-mcp tools,
|
|
12
|
+
// the shapes come from chrome-devtools-mcp's tool reference.
|
|
13
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
14
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
15
|
+
exports.ListPagesRequestSchema = zod_1.z.object({}).strict();
|
|
16
|
+
exports.NewPageRequestSchema = zod_1.z.object({
|
|
17
|
+
url: zod_1.z.string().describe('URL to open in the new page'),
|
|
18
|
+
});
|
|
19
|
+
exports.ClosePageRequestSchema = zod_1.z.object({
|
|
20
|
+
pageId: zod_1.z.number().describe('The id of the page to close'),
|
|
21
|
+
});
|
|
22
|
+
exports.NavigatePageRequestSchema = zod_1.z.object({
|
|
23
|
+
url: zod_1.z.string().describe('URL to navigate to'),
|
|
24
|
+
});
|
|
25
|
+
exports.ClickRequestSchema = zod_1.z.object({
|
|
26
|
+
selector: zod_1.z.string().describe('Accessibility selector (e.g. "#1_3" or \'button[name="Submit"]\')'),
|
|
27
|
+
});
|
|
28
|
+
exports.FillFormElementSchema = zod_1.z.object({
|
|
29
|
+
selector: zod_1.z.string(),
|
|
30
|
+
value: zod_1.z.string(),
|
|
31
|
+
});
|
|
32
|
+
exports.FillFormRequestSchema = zod_1.z.object({
|
|
33
|
+
elements: zod_1.z.array(exports.FillFormElementSchema).describe('Elements to fill, each with a selector and a value'),
|
|
34
|
+
});
|
|
35
|
+
exports.QuerySelectorsAllRequestSchema = schemas_js_1.QuerySelectorsInputSchema;
|
|
36
|
+
exports.QuerySelectorRequestSchema = schemas_js_1.QuerySelectorsFirstInputSchema;
|
|
37
|
+
exports.PressKeysRequestSchema = zod_1.z.object({
|
|
38
|
+
keys: zod_1.z.string().describe("Comma-separated sequence of keys. E.g. 'Hello, Tab, Enter'"),
|
|
39
|
+
});
|
|
40
|
+
exports.TakeSnapshotRequestSchema = zod_1.z.object({}).strict();
|
|
41
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
42
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
43
|
+
// Uniform response — narrowed mirror of MCP's CallToolResult
|
|
44
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
45
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
46
|
+
exports.TextContentSchema = zod_1.z.object({
|
|
47
|
+
type: zod_1.z.literal('text'),
|
|
48
|
+
text: zod_1.z.string(),
|
|
49
|
+
});
|
|
50
|
+
exports.ToolResponseSchema = zod_1.z.object({
|
|
51
|
+
content: zod_1.z.array(exports.TextContentSchema),
|
|
52
|
+
});
|
|
53
|
+
exports.TOOL_SCHEMAS = [
|
|
54
|
+
{ routeName: 'list_pages', mcpToolName: 'list_pages', requestSchema: exports.ListPagesRequestSchema },
|
|
55
|
+
{ routeName: 'new_page', mcpToolName: 'new_page', requestSchema: exports.NewPageRequestSchema },
|
|
56
|
+
{ routeName: 'close_page', mcpToolName: 'close_page', requestSchema: exports.ClosePageRequestSchema },
|
|
57
|
+
{ routeName: 'navigate_page', mcpToolName: 'navigate_page', requestSchema: exports.NavigatePageRequestSchema },
|
|
58
|
+
{ routeName: 'click', mcpToolName: 'click', requestSchema: exports.ClickRequestSchema },
|
|
59
|
+
{ routeName: 'fill_form', mcpToolName: 'fill_form', requestSchema: exports.FillFormRequestSchema },
|
|
60
|
+
{ routeName: 'query_selectors_all', mcpToolName: 'querySelectorsAll', requestSchema: exports.QuerySelectorsAllRequestSchema },
|
|
61
|
+
{ routeName: 'query_selectors', mcpToolName: 'querySelectors', requestSchema: exports.QuerySelectorRequestSchema },
|
|
62
|
+
{ routeName: 'press_keys', mcpToolName: 'pressKeys', requestSchema: exports.PressKeysRequestSchema },
|
|
63
|
+
{ routeName: 'take_snapshot', mcpToolName: 'take_snapshot', requestSchema: exports.TakeSnapshotRequestSchema },
|
|
64
|
+
];
|
|
65
|
+
//# sourceMappingURL=tool-schemas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-schemas.js","sourceRoot":"","sources":["../../../src/fastbrowser_httpd/libs/tool-schemas.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { QuerySelectorInputSchema, QuerySelectorsInputSchema, QuerySelectorFirstInputSchema, QuerySelectorsFirstInputSchema, type QuerySelectorInput, type QuerySelectorsInput, type QuerySelectorFirstInput, type QuerySelectorsFirstInput } from "./libs/schemas.js";
|
|
3
|
+
export { QuerySelectorInputSchema, QuerySelectorsInputSchema, QuerySelectorFirstInputSchema, QuerySelectorsFirstInputSchema, type QuerySelectorInput, type QuerySelectorsInput, type QuerySelectorFirstInput, type QuerySelectorsFirstInput, };
|
|
4
|
+
//# sourceMappingURL=fastbrowser_mcp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fastbrowser_mcp.d.ts","sourceRoot":"","sources":["../../src/fastbrowser_mcp/fastbrowser_mcp.ts"],"names":[],"mappings":";AAcA,OAAO,EACN,wBAAwB,EACxB,yBAAyB,EACzB,6BAA6B,EAC7B,8BAA8B,EAC9B,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,KAAK,uBAAuB,EAC5B,KAAK,wBAAwB,EAC7B,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACN,wBAAwB,EACxB,yBAAyB,EACzB,6BAA6B,EAC7B,8BAA8B,EAC9B,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,KAAK,uBAAuB,EAC5B,KAAK,wBAAwB,GAC7B,CAAC"}
|