@agent-relay/browser-primitive 4.0.9 → 5.0.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.
Files changed (41) hide show
  1. package/dist/actions/extraction.d.ts +6 -0
  2. package/dist/actions/extraction.d.ts.map +1 -0
  3. package/dist/actions/extraction.js +91 -0
  4. package/dist/actions/extraction.js.map +1 -0
  5. package/dist/actions/interaction.d.ts +17 -0
  6. package/dist/actions/interaction.d.ts.map +1 -0
  7. package/dist/actions/interaction.js +159 -0
  8. package/dist/actions/interaction.js.map +1 -0
  9. package/dist/actions/navigation.d.ts +6 -0
  10. package/dist/actions/navigation.d.ts.map +1 -0
  11. package/dist/actions/navigation.js +37 -0
  12. package/dist/actions/navigation.js.map +1 -0
  13. package/dist/actions/script.d.ts +3 -0
  14. package/dist/actions/script.d.ts.map +1 -0
  15. package/dist/actions/script.js +35 -0
  16. package/dist/actions/script.js.map +1 -0
  17. package/dist/actions/waits.d.ts +5 -0
  18. package/dist/actions/waits.d.ts.map +1 -0
  19. package/dist/actions/waits.js +52 -0
  20. package/dist/actions/waits.js.map +1 -0
  21. package/dist/browser-client.d.ts +41 -0
  22. package/dist/browser-client.d.ts.map +1 -0
  23. package/dist/browser-client.js +435 -0
  24. package/dist/browser-client.js.map +1 -0
  25. package/dist/index.d.ts +10 -0
  26. package/dist/index.d.ts.map +1 -0
  27. package/dist/index.js +10 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/mcp-server.d.ts +95 -0
  30. package/dist/mcp-server.d.ts.map +1 -0
  31. package/dist/mcp-server.js +434 -0
  32. package/dist/mcp-server.js.map +1 -0
  33. package/dist/types.d.ts +364 -0
  34. package/dist/types.d.ts.map +1 -0
  35. package/dist/types.js +2 -0
  36. package/dist/types.js.map +1 -0
  37. package/dist/workflow-step.d.ts +99 -0
  38. package/dist/workflow-step.d.ts.map +1 -0
  39. package/dist/workflow-step.js +419 -0
  40. package/dist/workflow-step.js.map +1 -0
  41. package/package.json +2 -2
@@ -0,0 +1,434 @@
1
+ #!/usr/bin/env node
2
+ import { createInterface } from 'node:readline';
3
+ import { fileURLToPath } from 'node:url';
4
+ import { BrowserClient } from './browser-client.js';
5
+ import { BrowserStepExecutor, } from './workflow-step.js';
6
+ export class BrowserMcpSessionManager {
7
+ defaultConfig;
8
+ clients = new Map();
9
+ defaultSessionId;
10
+ constructor(defaultConfig = {}) {
11
+ this.defaultConfig = defaultConfig;
12
+ }
13
+ async create(config = {}) {
14
+ const client = new BrowserClient({
15
+ config: {
16
+ ...this.defaultConfig,
17
+ ...config,
18
+ },
19
+ });
20
+ const session = await client.launch();
21
+ this.clients.set(session.id, client);
22
+ this.defaultSessionId ??= session.id;
23
+ return session;
24
+ }
25
+ async getOrCreate(sessionId, config = {}) {
26
+ if (sessionId) {
27
+ const existing = this.clients.get(sessionId);
28
+ if (existing)
29
+ return existing;
30
+ throw new Error(`Browser session not found: ${sessionId}`);
31
+ }
32
+ if (this.defaultSessionId) {
33
+ const existing = this.clients.get(this.defaultSessionId);
34
+ if (existing)
35
+ return existing;
36
+ }
37
+ const session = await this.create(config);
38
+ const client = this.clients.get(session.id);
39
+ if (!client) {
40
+ throw new Error(`Browser session was not registered: ${session.id}`);
41
+ }
42
+ return client;
43
+ }
44
+ get(sessionId) {
45
+ const client = this.clients.get(sessionId);
46
+ if (!client) {
47
+ throw new Error(`Browser session not found: ${sessionId}`);
48
+ }
49
+ return client.getSession();
50
+ }
51
+ list() {
52
+ return [...this.clients.values()].map((client) => client.getSession());
53
+ }
54
+ async close(sessionId) {
55
+ const client = this.clients.get(sessionId);
56
+ if (!client) {
57
+ return { closed: false, sessionId };
58
+ }
59
+ await client.close();
60
+ this.clients.delete(sessionId);
61
+ if (this.defaultSessionId === sessionId) {
62
+ this.defaultSessionId = this.clients.keys().next().value;
63
+ }
64
+ return { closed: true, sessionId };
65
+ }
66
+ async reset(sessionId, config) {
67
+ const client = this.clients.get(sessionId);
68
+ if (!client) {
69
+ throw new Error(`Browser session not found: ${sessionId}`);
70
+ }
71
+ return client.reset(config);
72
+ }
73
+ async closeAll() {
74
+ await Promise.all([...this.clients.values()].map((client) => client.close()));
75
+ this.clients.clear();
76
+ this.defaultSessionId = undefined;
77
+ }
78
+ }
79
+ export class BrowserMcpServer {
80
+ stdin;
81
+ stdout;
82
+ stderr;
83
+ serverName;
84
+ serverVersion;
85
+ sessions;
86
+ stepExecutor;
87
+ rl;
88
+ constructor(options = {}) {
89
+ this.stdin = options.stdin ?? process.stdin;
90
+ this.stdout = options.stdout ?? process.stdout;
91
+ this.stderr = options.stderr ?? process.stderr;
92
+ this.serverName = options.serverName ?? 'agent-relay-browser';
93
+ this.serverVersion = options.serverVersion ?? '1.0.0';
94
+ this.sessions = new BrowserMcpSessionManager(options.defaultConfig);
95
+ this.stepExecutor = new BrowserStepExecutor({ config: options.defaultConfig });
96
+ }
97
+ start() {
98
+ this.rl = createInterface({ input: this.stdin, terminal: false });
99
+ this.rl.on('line', (line) => {
100
+ void this.handleLine(line);
101
+ });
102
+ this.rl.on('close', () => {
103
+ void this.shutdown(0);
104
+ });
105
+ process.on('SIGTERM', () => {
106
+ void this.shutdown(0);
107
+ });
108
+ process.on('SIGINT', () => {
109
+ void this.shutdown(0);
110
+ });
111
+ this.stderr.write(`[${this.serverName}] MCP server started (stdio)\n`);
112
+ }
113
+ async handleLine(line) {
114
+ let request;
115
+ try {
116
+ request = JSON.parse(line);
117
+ }
118
+ catch {
119
+ this.writeResponse({
120
+ jsonrpc: '2.0',
121
+ id: null,
122
+ error: { code: -32700, message: 'Parse error' },
123
+ });
124
+ return;
125
+ }
126
+ const response = await this.handleRequest(request);
127
+ if (response) {
128
+ this.writeResponse(response);
129
+ }
130
+ }
131
+ async handleRequest(request) {
132
+ const id = request.id ?? null;
133
+ const isNotification = request.id === undefined;
134
+ try {
135
+ const result = await this.dispatch(request.method, request.params);
136
+ if (isNotification)
137
+ return undefined;
138
+ return { jsonrpc: '2.0', id, result };
139
+ }
140
+ catch (error) {
141
+ if (isNotification)
142
+ return undefined;
143
+ return {
144
+ jsonrpc: '2.0',
145
+ id,
146
+ error: toJsonRpcError(error),
147
+ };
148
+ }
149
+ }
150
+ async shutdown(exitCode) {
151
+ await this.sessions.closeAll();
152
+ await this.stepExecutor.closeAll();
153
+ if (exitCode !== undefined) {
154
+ process.exit(exitCode);
155
+ }
156
+ }
157
+ async dispatch(method, params) {
158
+ switch (method) {
159
+ case 'initialize':
160
+ return {
161
+ protocolVersion: '2024-11-05',
162
+ capabilities: {
163
+ tools: {},
164
+ },
165
+ serverInfo: {
166
+ name: this.serverName,
167
+ version: this.serverVersion,
168
+ },
169
+ };
170
+ case 'notifications/initialized':
171
+ return undefined;
172
+ case 'tools/list':
173
+ return { tools: getBrowserToolDefinitions() };
174
+ case 'tools/call':
175
+ return this.handleToolCall(params);
176
+ case 'browser.session.create':
177
+ return this.createSession(params);
178
+ case 'browser.session.list':
179
+ return this.sessions.list();
180
+ case 'browser.session.get':
181
+ return this.getSession(params);
182
+ case 'browser.session.close':
183
+ return this.closeSession(params);
184
+ case 'browser.session.reset':
185
+ return this.resetSession(params);
186
+ case 'browser.action.execute':
187
+ return this.executeAction(params);
188
+ case 'browser.actions.execute':
189
+ return this.executeActions(params);
190
+ case 'browser.step.execute':
191
+ return this.executeStep(params);
192
+ default:
193
+ throw jsonRpcMethodNotFound(method);
194
+ }
195
+ }
196
+ async handleToolCall(params) {
197
+ const toolParams = requireRecord(params, 'tools/call params');
198
+ const name = requireString(toolParams.name, 'tools/call params.name');
199
+ const args = isRecord(toolParams.arguments) ? toolParams.arguments : {};
200
+ switch (name) {
201
+ case 'browser_session_create':
202
+ return toMcpToolResult(await this.createSession(args));
203
+ case 'browser_session_list':
204
+ return toMcpToolResult(this.sessions.list());
205
+ case 'browser_session_get':
206
+ return toMcpToolResult(this.getSession(args));
207
+ case 'browser_session_close':
208
+ return toMcpToolResult(await this.closeSession(args));
209
+ case 'browser_session_reset':
210
+ return toMcpToolResult(await this.resetSession(args));
211
+ case 'browser_action_execute': {
212
+ const result = await this.executeAction(args);
213
+ return toMcpToolResult(result, isActionError(result));
214
+ }
215
+ case 'browser_actions_execute': {
216
+ const result = await this.executeActions(args);
217
+ return toMcpToolResult(result, hasActionErrors(result));
218
+ }
219
+ case 'browser_step_execute': {
220
+ const result = await this.executeStep(args);
221
+ return toMcpToolResult(result, !result.success);
222
+ }
223
+ default:
224
+ throw new Error(`Unknown browser tool: ${name}`);
225
+ }
226
+ }
227
+ async createSession(params) {
228
+ const record = params === undefined ? {} : requireRecord(params, 'browser.session.create params');
229
+ return this.sessions.create(readOptionalRecord(record.config, 'config') ?? {});
230
+ }
231
+ getSession(params) {
232
+ const record = requireRecord(params, 'browser.session.get params');
233
+ return this.sessions.get(requireString(record.sessionId, 'sessionId'));
234
+ }
235
+ async closeSession(params) {
236
+ const record = requireRecord(params, 'browser.session.close params');
237
+ return this.sessions.close(requireString(record.sessionId, 'sessionId'));
238
+ }
239
+ async resetSession(params) {
240
+ const record = requireRecord(params, 'browser.session.reset params');
241
+ return this.sessions.reset(requireString(record.sessionId, 'sessionId'), readOptionalRecord(record.config, 'config'));
242
+ }
243
+ async executeAction(params) {
244
+ const record = requireRecord(params, 'browser.action.execute params');
245
+ const action = requireString(record.action, 'action');
246
+ const actionParams = readOptionalRecord(record.params, 'params') ?? {};
247
+ const config = readOptionalRecord(record.config, 'config') ?? {};
248
+ const sessionId = typeof record.sessionId === 'string' ? record.sessionId : undefined;
249
+ const client = await this.sessions.getOrCreate(sessionId, config);
250
+ return client.execute({
251
+ action,
252
+ params: actionParams,
253
+ });
254
+ }
255
+ async executeActions(params) {
256
+ const record = requireRecord(params, 'browser.actions.execute params');
257
+ if (!Array.isArray(record.actions)) {
258
+ throw new Error('actions must be an array');
259
+ }
260
+ const config = readOptionalRecord(record.config, 'config') ?? {};
261
+ const sessionId = typeof record.sessionId === 'string' ? record.sessionId : undefined;
262
+ const client = await this.sessions.getOrCreate(sessionId, config);
263
+ return client.executeMany(record.actions);
264
+ }
265
+ async executeStep(params) {
266
+ const record = requireRecord(params, 'browser.step.execute params');
267
+ const step = requireRecord(record.step, 'step');
268
+ const workspaceId = typeof record.workspaceId === 'string' ? record.workspaceId : undefined;
269
+ return this.stepExecutor.execute(step, { workspaceId });
270
+ }
271
+ writeResponse(response) {
272
+ this.stdout.write(`${JSON.stringify(response)}\n`);
273
+ }
274
+ }
275
+ export function startBrowserMcpServer(options = {}) {
276
+ const server = new BrowserMcpServer(options);
277
+ server.start();
278
+ return server;
279
+ }
280
+ export function getBrowserToolDefinitions() {
281
+ return [
282
+ {
283
+ name: 'browser_session_create',
284
+ description: 'Create a browser session with optional Playwright launch/context settings.',
285
+ inputSchema: {
286
+ type: 'object',
287
+ properties: {
288
+ config: { type: 'object' },
289
+ },
290
+ },
291
+ },
292
+ {
293
+ name: 'browser_session_list',
294
+ description: 'List active browser sessions.',
295
+ inputSchema: { type: 'object', properties: {} },
296
+ },
297
+ {
298
+ name: 'browser_session_get',
299
+ description: 'Get browser session state.',
300
+ inputSchema: {
301
+ type: 'object',
302
+ properties: {
303
+ sessionId: { type: 'string' },
304
+ },
305
+ required: ['sessionId'],
306
+ },
307
+ },
308
+ {
309
+ name: 'browser_session_close',
310
+ description: 'Close a browser session.',
311
+ inputSchema: {
312
+ type: 'object',
313
+ properties: {
314
+ sessionId: { type: 'string' },
315
+ },
316
+ required: ['sessionId'],
317
+ },
318
+ },
319
+ {
320
+ name: 'browser_session_reset',
321
+ description: 'Reset a browser session, optionally replacing its browser config.',
322
+ inputSchema: {
323
+ type: 'object',
324
+ properties: {
325
+ sessionId: { type: 'string' },
326
+ config: { type: 'object' },
327
+ },
328
+ required: ['sessionId'],
329
+ },
330
+ },
331
+ {
332
+ name: 'browser_action_execute',
333
+ description: 'Execute one browser action in an existing or default session.',
334
+ inputSchema: {
335
+ type: 'object',
336
+ properties: {
337
+ sessionId: { type: 'string' },
338
+ action: { type: 'string' },
339
+ params: { type: 'object' },
340
+ config: { type: 'object' },
341
+ },
342
+ required: ['action'],
343
+ },
344
+ },
345
+ {
346
+ name: 'browser_actions_execute',
347
+ description: 'Execute multiple browser actions sequentially in one session.',
348
+ inputSchema: {
349
+ type: 'object',
350
+ properties: {
351
+ sessionId: { type: 'string' },
352
+ actions: { type: 'array', items: { type: 'object' } },
353
+ config: { type: 'object' },
354
+ },
355
+ required: ['actions'],
356
+ },
357
+ },
358
+ {
359
+ name: 'browser_step_execute',
360
+ description: 'Execute a BrowserStepConfig using the workflow step executor.',
361
+ inputSchema: {
362
+ type: 'object',
363
+ properties: {
364
+ workspaceId: { type: 'string' },
365
+ step: { type: 'object' },
366
+ },
367
+ required: ['step'],
368
+ },
369
+ },
370
+ ];
371
+ }
372
+ function toMcpToolResult(value, isError = false) {
373
+ return {
374
+ content: [
375
+ {
376
+ type: 'text',
377
+ text: JSON.stringify(value, undefined, 2),
378
+ },
379
+ ],
380
+ isError,
381
+ };
382
+ }
383
+ function isActionError(value) {
384
+ return isRecord(value) && value.success === false;
385
+ }
386
+ function hasActionErrors(value) {
387
+ return Array.isArray(value) && value.some(isActionError);
388
+ }
389
+ function toJsonRpcError(error) {
390
+ if (isRecord(error) && typeof error.code === 'number' && typeof error.message === 'string') {
391
+ return {
392
+ code: error.code,
393
+ message: error.message,
394
+ data: error.data,
395
+ };
396
+ }
397
+ return {
398
+ code: -32603,
399
+ message: error instanceof Error ? error.message : String(error),
400
+ };
401
+ }
402
+ function jsonRpcMethodNotFound(method) {
403
+ return {
404
+ code: -32601,
405
+ message: `Method not found: ${method}`,
406
+ };
407
+ }
408
+ function requireRecord(value, label) {
409
+ if (!isRecord(value)) {
410
+ throw new Error(`${label} must be an object`);
411
+ }
412
+ return value;
413
+ }
414
+ function readOptionalRecord(value, label) {
415
+ if (value === undefined)
416
+ return undefined;
417
+ return requireRecord(value, label);
418
+ }
419
+ function requireString(value, label) {
420
+ if (typeof value !== 'string' || value.length === 0) {
421
+ throw new Error(`${label} must be a non-empty string`);
422
+ }
423
+ return value;
424
+ }
425
+ function isRecord(value) {
426
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
427
+ }
428
+ function isMainModule() {
429
+ return process.argv[1] === fileURLToPath(import.meta.url);
430
+ }
431
+ if (isMainModule()) {
432
+ startBrowserMcpServer();
433
+ }
434
+ //# sourceMappingURL=mcp-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":"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"}