agent-browser 0.19.0 → 0.20.1

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 (86) hide show
  1. package/README.md +36 -82
  2. package/bin/agent-browser-darwin-arm64 +0 -0
  3. package/bin/agent-browser-darwin-x64 +0 -0
  4. package/bin/agent-browser-linux-arm64 +0 -0
  5. package/bin/agent-browser-linux-x64 +0 -0
  6. package/bin/agent-browser-win32-x64.exe +0 -0
  7. package/package.json +6 -49
  8. package/scripts/postinstall.js +12 -15
  9. package/skills/agent-browser/SKILL.md +9 -18
  10. package/skills/electron/SKILL.md +5 -5
  11. package/dist/action-policy.d.ts +0 -14
  12. package/dist/action-policy.d.ts.map +0 -1
  13. package/dist/action-policy.js +0 -253
  14. package/dist/action-policy.js.map +0 -1
  15. package/dist/actions.d.ts +0 -18
  16. package/dist/actions.d.ts.map +0 -1
  17. package/dist/actions.js +0 -2121
  18. package/dist/actions.js.map +0 -1
  19. package/dist/auth-cli.d.ts +0 -2
  20. package/dist/auth-cli.d.ts.map +0 -1
  21. package/dist/auth-cli.js +0 -97
  22. package/dist/auth-cli.js.map +0 -1
  23. package/dist/auth-vault.d.ts +0 -36
  24. package/dist/auth-vault.d.ts.map +0 -1
  25. package/dist/auth-vault.js +0 -125
  26. package/dist/auth-vault.js.map +0 -1
  27. package/dist/browser.d.ts +0 -629
  28. package/dist/browser.d.ts.map +0 -1
  29. package/dist/browser.js +0 -2342
  30. package/dist/browser.js.map +0 -1
  31. package/dist/confirmation.d.ts +0 -8
  32. package/dist/confirmation.d.ts.map +0 -1
  33. package/dist/confirmation.js +0 -30
  34. package/dist/confirmation.js.map +0 -1
  35. package/dist/daemon.d.ts +0 -71
  36. package/dist/daemon.d.ts.map +0 -1
  37. package/dist/daemon.js +0 -669
  38. package/dist/daemon.js.map +0 -1
  39. package/dist/diff.d.ts +0 -18
  40. package/dist/diff.d.ts.map +0 -1
  41. package/dist/diff.js +0 -271
  42. package/dist/diff.js.map +0 -1
  43. package/dist/domain-filter.d.ts +0 -28
  44. package/dist/domain-filter.d.ts.map +0 -1
  45. package/dist/domain-filter.js +0 -149
  46. package/dist/domain-filter.js.map +0 -1
  47. package/dist/encryption.d.ts +0 -73
  48. package/dist/encryption.d.ts.map +0 -1
  49. package/dist/encryption.js +0 -171
  50. package/dist/encryption.js.map +0 -1
  51. package/dist/index.d.ts +0 -7
  52. package/dist/index.d.ts.map +0 -1
  53. package/dist/index.js +0 -5
  54. package/dist/index.js.map +0 -1
  55. package/dist/inspect-server.d.ts +0 -26
  56. package/dist/inspect-server.d.ts.map +0 -1
  57. package/dist/inspect-server.js +0 -218
  58. package/dist/inspect-server.js.map +0 -1
  59. package/dist/ios-actions.d.ts +0 -11
  60. package/dist/ios-actions.d.ts.map +0 -1
  61. package/dist/ios-actions.js +0 -228
  62. package/dist/ios-actions.js.map +0 -1
  63. package/dist/ios-manager.d.ts +0 -266
  64. package/dist/ios-manager.d.ts.map +0 -1
  65. package/dist/ios-manager.js +0 -1073
  66. package/dist/ios-manager.js.map +0 -1
  67. package/dist/protocol.d.ts +0 -28
  68. package/dist/protocol.d.ts.map +0 -1
  69. package/dist/protocol.js +0 -988
  70. package/dist/protocol.js.map +0 -1
  71. package/dist/snapshot.d.ts +0 -67
  72. package/dist/snapshot.d.ts.map +0 -1
  73. package/dist/snapshot.js +0 -514
  74. package/dist/snapshot.js.map +0 -1
  75. package/dist/state-utils.d.ts +0 -77
  76. package/dist/state-utils.d.ts.map +0 -1
  77. package/dist/state-utils.js +0 -178
  78. package/dist/state-utils.js.map +0 -1
  79. package/dist/stream-server.d.ts +0 -117
  80. package/dist/stream-server.d.ts.map +0 -1
  81. package/dist/stream-server.js +0 -309
  82. package/dist/stream-server.js.map +0 -1
  83. package/dist/types.d.ts +0 -927
  84. package/dist/types.d.ts.map +0 -1
  85. package/dist/types.js +0 -2
  86. package/dist/types.js.map +0 -1
@@ -1,309 +0,0 @@
1
- import { WebSocketServer, WebSocket } from 'ws';
2
- import { setScreencastFrameCallback } from './actions.js';
3
- /**
4
- * Check whether a WebSocket connection origin should be allowed.
5
- * Allows: no origin (CLI tools), file:// origins, and localhost/loopback origins.
6
- * Rejects: all other origins (prevents malicious web pages from connecting).
7
- */
8
- export function isAllowedOrigin(origin) {
9
- // Allow connections with no origin (non-browser clients like CLI tools)
10
- if (!origin) {
11
- return true;
12
- }
13
- // Allow file:// origins (local HTML files)
14
- if (origin.startsWith('file://')) {
15
- return true;
16
- }
17
- // Allow localhost/loopback origins (browser-based stream viewers)
18
- try {
19
- const url = new URL(origin);
20
- const host = url.hostname;
21
- if (host === 'localhost' || host === '127.0.0.1' || host === '::1' || host === '[::1]') {
22
- return true;
23
- }
24
- }
25
- catch {
26
- // Invalid origin URL - reject
27
- }
28
- return false;
29
- }
30
- /**
31
- * WebSocket server for streaming browser viewport and receiving input
32
- */
33
- export class StreamServer {
34
- wss = null;
35
- clients = new Set();
36
- browser;
37
- port;
38
- isScreencasting = false;
39
- constructor(browser, port = 9223) {
40
- this.browser = browser;
41
- this.port = port;
42
- }
43
- /**
44
- * Start the WebSocket server
45
- */
46
- start() {
47
- return new Promise((resolve, reject) => {
48
- try {
49
- // SECURITY: Bind to localhost only to prevent network exposure.
50
- // The stream server allows direct input injection (mouse, keyboard, touch)
51
- // which would be a critical security risk if exposed to the network.
52
- this.wss = new WebSocketServer({
53
- port: this.port,
54
- host: '127.0.0.1',
55
- // Security: Reject cross-origin WebSocket connections from untrusted origins.
56
- // This prevents malicious web pages from connecting and injecting input events.
57
- // Localhost origins are allowed so browser-based stream viewers can connect.
58
- verifyClient: (info) => {
59
- if (isAllowedOrigin(info.origin)) {
60
- return true;
61
- }
62
- console.log(`[StreamServer] Rejected connection from origin: ${info.origin}`);
63
- return false;
64
- },
65
- });
66
- this.wss.on('connection', (ws) => {
67
- this.handleConnection(ws);
68
- });
69
- this.wss.on('error', (error) => {
70
- console.error('[StreamServer] WebSocket error:', error);
71
- reject(error);
72
- });
73
- this.wss.on('listening', () => {
74
- console.log(`[StreamServer] Listening on port ${this.port}`);
75
- // Set up the screencast frame callback
76
- setScreencastFrameCallback((frame) => {
77
- this.broadcastFrame(frame);
78
- });
79
- resolve();
80
- });
81
- }
82
- catch (error) {
83
- reject(error);
84
- }
85
- });
86
- }
87
- /**
88
- * Stop the WebSocket server
89
- */
90
- async stop() {
91
- // Stop screencasting
92
- if (this.isScreencasting) {
93
- await this.stopScreencast();
94
- }
95
- // Clear the callback
96
- setScreencastFrameCallback(null);
97
- // Close all clients
98
- for (const client of this.clients) {
99
- client.close();
100
- }
101
- this.clients.clear();
102
- // Close the server
103
- if (this.wss) {
104
- return new Promise((resolve) => {
105
- this.wss.close(() => {
106
- this.wss = null;
107
- resolve();
108
- });
109
- });
110
- }
111
- }
112
- /**
113
- * Handle a new WebSocket connection
114
- */
115
- handleConnection(ws) {
116
- console.log('[StreamServer] Client connected');
117
- this.clients.add(ws);
118
- // Send initial status
119
- this.sendStatus(ws);
120
- // Start screencasting if this is the first client
121
- if (this.clients.size === 1 && !this.isScreencasting) {
122
- this.startScreencast().catch((error) => {
123
- console.error('[StreamServer] Failed to start screencast:', error);
124
- this.sendError(ws, error.message);
125
- });
126
- }
127
- // Handle messages from client
128
- ws.on('message', (data) => {
129
- try {
130
- const message = JSON.parse(data.toString());
131
- this.handleMessage(message, ws);
132
- }
133
- catch (error) {
134
- console.error('[StreamServer] Failed to parse message:', error);
135
- }
136
- });
137
- // Handle client disconnect
138
- ws.on('close', () => {
139
- console.log('[StreamServer] Client disconnected');
140
- this.clients.delete(ws);
141
- // Stop screencasting if no more clients
142
- if (this.clients.size === 0 && this.isScreencasting) {
143
- this.stopScreencast().catch((error) => {
144
- console.error('[StreamServer] Failed to stop screencast:', error);
145
- });
146
- }
147
- });
148
- ws.on('error', (error) => {
149
- console.error('[StreamServer] Client error:', error);
150
- this.clients.delete(ws);
151
- });
152
- }
153
- /**
154
- * Handle incoming messages from clients
155
- */
156
- async handleMessage(message, ws) {
157
- try {
158
- switch (message.type) {
159
- case 'input_mouse':
160
- await this.browser.injectMouseEvent({
161
- type: message.eventType,
162
- x: message.x,
163
- y: message.y,
164
- button: message.button,
165
- clickCount: message.clickCount,
166
- deltaX: message.deltaX,
167
- deltaY: message.deltaY,
168
- modifiers: message.modifiers,
169
- });
170
- break;
171
- case 'input_keyboard':
172
- await this.browser.injectKeyboardEvent({
173
- type: message.eventType,
174
- key: message.key,
175
- code: message.code,
176
- text: message.text,
177
- modifiers: message.modifiers,
178
- });
179
- break;
180
- case 'input_touch':
181
- await this.browser.injectTouchEvent({
182
- type: message.eventType,
183
- touchPoints: message.touchPoints,
184
- modifiers: message.modifiers,
185
- });
186
- break;
187
- case 'status':
188
- // Client is requesting status
189
- this.sendStatus(ws);
190
- break;
191
- }
192
- }
193
- catch (error) {
194
- const errorMessage = error instanceof Error ? error.message : String(error);
195
- this.sendError(ws, errorMessage);
196
- }
197
- }
198
- /**
199
- * Broadcast a frame to all connected clients
200
- */
201
- broadcastFrame(frame) {
202
- const message = {
203
- type: 'frame',
204
- data: frame.data,
205
- metadata: frame.metadata,
206
- };
207
- const payload = JSON.stringify(message);
208
- for (const client of this.clients) {
209
- if (client.readyState === WebSocket.OPEN) {
210
- client.send(payload);
211
- }
212
- }
213
- }
214
- /**
215
- * Send status to a client
216
- */
217
- sendStatus(ws) {
218
- let viewportWidth;
219
- let viewportHeight;
220
- try {
221
- const page = this.browser.getPage();
222
- const viewport = page.viewportSize();
223
- viewportWidth = viewport?.width;
224
- viewportHeight = viewport?.height;
225
- }
226
- catch {
227
- // Browser not launched yet
228
- }
229
- const message = {
230
- type: 'status',
231
- connected: true,
232
- screencasting: this.isScreencasting,
233
- viewportWidth,
234
- viewportHeight,
235
- };
236
- if (ws.readyState === WebSocket.OPEN) {
237
- ws.send(JSON.stringify(message));
238
- }
239
- }
240
- /**
241
- * Send an error to a client
242
- */
243
- sendError(ws, errorMessage) {
244
- const message = {
245
- type: 'error',
246
- message: errorMessage,
247
- };
248
- if (ws.readyState === WebSocket.OPEN) {
249
- ws.send(JSON.stringify(message));
250
- }
251
- }
252
- /**
253
- * Start screencasting
254
- */
255
- async startScreencast() {
256
- // Set flag immediately to prevent race conditions with concurrent calls
257
- if (this.isScreencasting)
258
- return;
259
- this.isScreencasting = true;
260
- try {
261
- // Check if browser is launched
262
- if (!this.browser.isLaunched()) {
263
- throw new Error('Browser not launched');
264
- }
265
- await this.browser.startScreencast((frame) => this.broadcastFrame(frame), {
266
- format: 'jpeg',
267
- quality: 80,
268
- maxWidth: 1280,
269
- maxHeight: 720,
270
- everyNthFrame: 1,
271
- });
272
- // Notify all clients
273
- for (const client of this.clients) {
274
- this.sendStatus(client);
275
- }
276
- }
277
- catch (error) {
278
- // Reset flag on failure so caller can retry
279
- this.isScreencasting = false;
280
- throw error;
281
- }
282
- }
283
- /**
284
- * Stop screencasting
285
- */
286
- async stopScreencast() {
287
- if (!this.isScreencasting)
288
- return;
289
- await this.browser.stopScreencast();
290
- this.isScreencasting = false;
291
- // Notify all clients
292
- for (const client of this.clients) {
293
- this.sendStatus(client);
294
- }
295
- }
296
- /**
297
- * Get the port the server is running on
298
- */
299
- getPort() {
300
- return this.port;
301
- }
302
- /**
303
- * Get the number of connected clients
304
- */
305
- getClientCount() {
306
- return this.clients.size;
307
- }
308
- }
309
- //# sourceMappingURL=stream-server.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"stream-server.js","sourceRoot":"","sources":["../src/stream-server.ts"],"names":[],"mappings":"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"}