agent-browser-stealth 0.14.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 (77) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +1219 -0
  3. package/bin/agent-browser-darwin-arm64 +0 -0
  4. package/bin/agent-browser-local +0 -0
  5. package/bin/agent-browser.js +109 -0
  6. package/dist/actions.d.ts +17 -0
  7. package/dist/actions.d.ts.map +1 -0
  8. package/dist/actions.js +1917 -0
  9. package/dist/actions.js.map +1 -0
  10. package/dist/browser.d.ts +598 -0
  11. package/dist/browser.d.ts.map +1 -0
  12. package/dist/browser.js +2287 -0
  13. package/dist/browser.js.map +1 -0
  14. package/dist/daemon.d.ts +66 -0
  15. package/dist/daemon.d.ts.map +1 -0
  16. package/dist/daemon.js +603 -0
  17. package/dist/daemon.js.map +1 -0
  18. package/dist/diff.d.ts +18 -0
  19. package/dist/diff.d.ts.map +1 -0
  20. package/dist/diff.js +271 -0
  21. package/dist/diff.js.map +1 -0
  22. package/dist/encryption.d.ts +50 -0
  23. package/dist/encryption.d.ts.map +1 -0
  24. package/dist/encryption.js +85 -0
  25. package/dist/encryption.js.map +1 -0
  26. package/dist/ios-actions.d.ts +11 -0
  27. package/dist/ios-actions.d.ts.map +1 -0
  28. package/dist/ios-actions.js +228 -0
  29. package/dist/ios-actions.js.map +1 -0
  30. package/dist/ios-manager.d.ts +266 -0
  31. package/dist/ios-manager.d.ts.map +1 -0
  32. package/dist/ios-manager.js +1073 -0
  33. package/dist/ios-manager.js.map +1 -0
  34. package/dist/protocol.d.ts +26 -0
  35. package/dist/protocol.d.ts.map +1 -0
  36. package/dist/protocol.js +935 -0
  37. package/dist/protocol.js.map +1 -0
  38. package/dist/snapshot.d.ts +67 -0
  39. package/dist/snapshot.d.ts.map +1 -0
  40. package/dist/snapshot.js +514 -0
  41. package/dist/snapshot.js.map +1 -0
  42. package/dist/state-utils.d.ts +77 -0
  43. package/dist/state-utils.d.ts.map +1 -0
  44. package/dist/state-utils.js +178 -0
  45. package/dist/state-utils.js.map +1 -0
  46. package/dist/stealth.d.ts +22 -0
  47. package/dist/stealth.d.ts.map +1 -0
  48. package/dist/stealth.js +614 -0
  49. package/dist/stealth.js.map +1 -0
  50. package/dist/stream-server.d.ts +117 -0
  51. package/dist/stream-server.d.ts.map +1 -0
  52. package/dist/stream-server.js +309 -0
  53. package/dist/stream-server.js.map +1 -0
  54. package/dist/types.d.ts +855 -0
  55. package/dist/types.d.ts.map +1 -0
  56. package/dist/types.js +2 -0
  57. package/dist/types.js.map +1 -0
  58. package/package.json +85 -0
  59. package/scripts/build-all-platforms.sh +68 -0
  60. package/scripts/check-creepjs-headless.js +137 -0
  61. package/scripts/check-sannysoft-webdriver.js +112 -0
  62. package/scripts/check-version-sync.js +39 -0
  63. package/scripts/copy-native.js +36 -0
  64. package/scripts/postinstall.js +275 -0
  65. package/scripts/sync-upstream.sh +142 -0
  66. package/scripts/sync-version.js +69 -0
  67. package/skills/agent-browser/SKILL.md +464 -0
  68. package/skills/agent-browser/references/authentication.md +202 -0
  69. package/skills/agent-browser/references/commands.md +263 -0
  70. package/skills/agent-browser/references/profiling.md +120 -0
  71. package/skills/agent-browser/references/proxy-support.md +194 -0
  72. package/skills/agent-browser/references/session-management.md +193 -0
  73. package/skills/agent-browser/references/snapshot-refs.md +194 -0
  74. package/skills/agent-browser/references/video-recording.md +173 -0
  75. package/skills/agent-browser/templates/authenticated-session.sh +100 -0
  76. package/skills/agent-browser/templates/capture-workflow.sh +69 -0
  77. package/skills/agent-browser/templates/form-automation.sh +62 -0
@@ -0,0 +1,117 @@
1
+ import type { BrowserManager } from './browser.js';
2
+ /**
3
+ * Check whether a WebSocket connection origin should be allowed.
4
+ * Allows: no origin (CLI tools), file:// origins, and localhost/loopback origins.
5
+ * Rejects: all other origins (prevents malicious web pages from connecting).
6
+ */
7
+ export declare function isAllowedOrigin(origin: string | undefined): boolean;
8
+ export interface FrameMessage {
9
+ type: 'frame';
10
+ data: string;
11
+ metadata: {
12
+ offsetTop: number;
13
+ pageScaleFactor: number;
14
+ deviceWidth: number;
15
+ deviceHeight: number;
16
+ scrollOffsetX: number;
17
+ scrollOffsetY: number;
18
+ timestamp?: number;
19
+ };
20
+ }
21
+ export interface InputMouseMessage {
22
+ type: 'input_mouse';
23
+ eventType: 'mousePressed' | 'mouseReleased' | 'mouseMoved' | 'mouseWheel';
24
+ x: number;
25
+ y: number;
26
+ button?: 'left' | 'right' | 'middle' | 'none';
27
+ clickCount?: number;
28
+ deltaX?: number;
29
+ deltaY?: number;
30
+ modifiers?: number;
31
+ }
32
+ export interface InputKeyboardMessage {
33
+ type: 'input_keyboard';
34
+ eventType: 'keyDown' | 'keyUp' | 'char';
35
+ key?: string;
36
+ code?: string;
37
+ text?: string;
38
+ modifiers?: number;
39
+ }
40
+ export interface InputTouchMessage {
41
+ type: 'input_touch';
42
+ eventType: 'touchStart' | 'touchEnd' | 'touchMove' | 'touchCancel';
43
+ touchPoints: Array<{
44
+ x: number;
45
+ y: number;
46
+ id?: number;
47
+ }>;
48
+ modifiers?: number;
49
+ }
50
+ export interface StatusMessage {
51
+ type: 'status';
52
+ connected: boolean;
53
+ screencasting: boolean;
54
+ viewportWidth?: number;
55
+ viewportHeight?: number;
56
+ }
57
+ export interface ErrorMessage {
58
+ type: 'error';
59
+ message: string;
60
+ }
61
+ export type StreamMessage = FrameMessage | InputMouseMessage | InputKeyboardMessage | InputTouchMessage | StatusMessage | ErrorMessage;
62
+ /**
63
+ * WebSocket server for streaming browser viewport and receiving input
64
+ */
65
+ export declare class StreamServer {
66
+ private wss;
67
+ private clients;
68
+ private browser;
69
+ private port;
70
+ private isScreencasting;
71
+ constructor(browser: BrowserManager, port?: number);
72
+ /**
73
+ * Start the WebSocket server
74
+ */
75
+ start(): Promise<void>;
76
+ /**
77
+ * Stop the WebSocket server
78
+ */
79
+ stop(): Promise<void>;
80
+ /**
81
+ * Handle a new WebSocket connection
82
+ */
83
+ private handleConnection;
84
+ /**
85
+ * Handle incoming messages from clients
86
+ */
87
+ private handleMessage;
88
+ /**
89
+ * Broadcast a frame to all connected clients
90
+ */
91
+ private broadcastFrame;
92
+ /**
93
+ * Send status to a client
94
+ */
95
+ private sendStatus;
96
+ /**
97
+ * Send an error to a client
98
+ */
99
+ private sendError;
100
+ /**
101
+ * Start screencasting
102
+ */
103
+ private startScreencast;
104
+ /**
105
+ * Stop screencasting
106
+ */
107
+ private stopScreencast;
108
+ /**
109
+ * Get the port the server is running on
110
+ */
111
+ getPort(): number;
112
+ /**
113
+ * Get the number of connected clients
114
+ */
115
+ getClientCount(): number;
116
+ }
117
+ //# sourceMappingURL=stream-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream-server.d.ts","sourceRoot":"","sources":["../src/stream-server.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAmB,MAAM,cAAc,CAAC;AAGpE;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAoBnE;AAGD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE;QACR,SAAS,EAAE,MAAM,CAAC;QAClB,eAAe,EAAE,MAAM,CAAC;QACxB,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,MAAM,CAAC;QACtB,aAAa,EAAE,MAAM,CAAC;QACtB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;CACH;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,aAAa,CAAC;IACpB,SAAS,EAAE,cAAc,GAAG,eAAe,GAAG,YAAY,GAAG,YAAY,CAAC;IAC1E,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC9C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,gBAAgB,CAAC;IACvB,SAAS,EAAE,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;IACxC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,aAAa,CAAC;IACpB,SAAS,EAAE,YAAY,GAAG,UAAU,GAAG,WAAW,GAAG,aAAa,CAAC;IACnE,WAAW,EAAE,KAAK,CAAC;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC1D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,QAAQ,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,aAAa,GACrB,YAAY,GACZ,iBAAiB,GACjB,oBAAoB,GACpB,iBAAiB,GACjB,aAAa,GACb,YAAY,CAAC;AAEjB;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,GAAG,CAAgC;IAC3C,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,eAAe,CAAkB;gBAE7B,OAAO,EAAE,cAAc,EAAE,IAAI,GAAE,MAAa;IAKxD;;OAEG;IACH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAkDtB;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA0B3B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA4CxB;;OAEG;YACW,aAAa;IA6C3B;;OAEG;IACH,OAAO,CAAC,cAAc;IAgBtB;;OAEG;IACH,OAAO,CAAC,UAAU;IA0BlB;;OAEG;IACH,OAAO,CAAC,SAAS;IAWjB;;OAEG;YACW,eAAe;IA8B7B;;OAEG;YACW,cAAc;IAY5B;;OAEG;IACH,OAAO,IAAI,MAAM;IAIjB;;OAEG;IACH,cAAc,IAAI,MAAM;CAGzB"}
@@ -0,0 +1,309 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream-server.js","sourceRoot":"","sources":["../src/stream-server.ts"],"names":[],"mappings":"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"}