agent-browser 0.6.0 → 0.7.2

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 (42) hide show
  1. package/README.md +90 -9
  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/dist/actions.js +17 -11
  8. package/dist/actions.js.map +1 -1
  9. package/dist/browser.d.ts +24 -1
  10. package/dist/browser.d.ts.map +1 -1
  11. package/dist/browser.js +241 -21
  12. package/dist/browser.js.map +1 -1
  13. package/dist/daemon.d.ts +5 -0
  14. package/dist/daemon.d.ts.map +1 -1
  15. package/dist/daemon.js +51 -5
  16. package/dist/daemon.js.map +1 -1
  17. package/dist/protocol.d.ts.map +1 -1
  18. package/dist/protocol.js +11 -0
  19. package/dist/protocol.js.map +1 -1
  20. package/dist/types.d.ts +5 -0
  21. package/dist/types.d.ts.map +1 -1
  22. package/package.json +26 -23
  23. package/scripts/build-all-platforms.sh +0 -0
  24. package/scripts/copy-native.js +2 -1
  25. package/scripts/postinstall.js +1 -1
  26. package/skills/agent-browser/SKILL.md +132 -35
  27. package/skills/agent-browser/references/authentication.md +188 -0
  28. package/skills/agent-browser/references/proxy-support.md +175 -0
  29. package/skills/agent-browser/references/session-management.md +181 -0
  30. package/skills/agent-browser/references/snapshot-refs.md +186 -0
  31. package/skills/agent-browser/references/video-recording.md +162 -0
  32. package/skills/agent-browser/templates/authenticated-session.sh +91 -0
  33. package/skills/agent-browser/templates/capture-workflow.sh +68 -0
  34. package/skills/agent-browser/templates/form-automation.sh +64 -0
  35. package/dist/browser.test.d.ts +0 -2
  36. package/dist/browser.test.d.ts.map +0 -1
  37. package/dist/browser.test.js +0 -136
  38. package/dist/browser.test.js.map +0 -1
  39. package/dist/protocol.test.d.ts +0 -2
  40. package/dist/protocol.test.d.ts.map +0 -1
  41. package/dist/protocol.test.js +0 -176
  42. package/dist/protocol.test.js.map +0 -1
@@ -0,0 +1,64 @@
1
+ #!/bin/bash
2
+ # Template: Form Automation Workflow
3
+ # Fills and submits web forms with validation
4
+
5
+ set -euo pipefail
6
+
7
+ FORM_URL="${1:?Usage: $0 <form-url>}"
8
+
9
+ echo "Automating form at: $FORM_URL"
10
+
11
+ # Navigate to form page
12
+ agent-browser open "$FORM_URL"
13
+ agent-browser wait --load networkidle
14
+
15
+ # Get interactive snapshot to identify form fields
16
+ echo "Analyzing form structure..."
17
+ agent-browser snapshot -i
18
+
19
+ # Example: Fill common form fields
20
+ # Uncomment and modify refs based on snapshot output
21
+
22
+ # Text inputs
23
+ # agent-browser fill @e1 "John Doe" # Name field
24
+ # agent-browser fill @e2 "user@example.com" # Email field
25
+ # agent-browser fill @e3 "+1-555-123-4567" # Phone field
26
+
27
+ # Password fields
28
+ # agent-browser fill @e4 "SecureP@ssw0rd!"
29
+
30
+ # Dropdowns
31
+ # agent-browser select @e5 "Option Value"
32
+
33
+ # Checkboxes
34
+ # agent-browser check @e6 # Check
35
+ # agent-browser uncheck @e7 # Uncheck
36
+
37
+ # Radio buttons
38
+ # agent-browser click @e8 # Select radio option
39
+
40
+ # Text areas
41
+ # agent-browser fill @e9 "Multi-line text content here"
42
+
43
+ # File uploads
44
+ # agent-browser upload @e10 /path/to/file.pdf
45
+
46
+ # Submit form
47
+ # agent-browser click @e11 # Submit button
48
+
49
+ # Wait for response
50
+ # agent-browser wait --load networkidle
51
+ # agent-browser wait --url "**/success" # Or wait for redirect
52
+
53
+ # Verify submission
54
+ echo "Form submission result:"
55
+ agent-browser get url
56
+ agent-browser snapshot -i
57
+
58
+ # Take screenshot of result
59
+ agent-browser screenshot /tmp/form-result.png
60
+
61
+ # Cleanup
62
+ agent-browser close
63
+
64
+ echo "Form automation complete"
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=browser.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"browser.test.d.ts","sourceRoot":"","sources":["../src/browser.test.ts"],"names":[],"mappings":""}
@@ -1,136 +0,0 @@
1
- import { describe, it, expect, beforeAll, afterAll } from 'vitest';
2
- import { BrowserManager } from './browser.js';
3
- describe('BrowserManager', () => {
4
- let browser;
5
- beforeAll(async () => {
6
- browser = new BrowserManager();
7
- await browser.launch({ headless: true });
8
- });
9
- afterAll(async () => {
10
- await browser.close();
11
- });
12
- describe('launch and close', () => {
13
- it('should report as launched', () => {
14
- expect(browser.isLaunched()).toBe(true);
15
- });
16
- it('should have a page', () => {
17
- const page = browser.getPage();
18
- expect(page).toBeDefined();
19
- });
20
- });
21
- describe('navigation', () => {
22
- it('should navigate to URL', async () => {
23
- const page = browser.getPage();
24
- await page.goto('https://example.com');
25
- expect(page.url()).toBe('https://example.com/');
26
- });
27
- it('should get page title', async () => {
28
- const page = browser.getPage();
29
- const title = await page.title();
30
- expect(title).toBe('Example Domain');
31
- });
32
- });
33
- describe('element interaction', () => {
34
- it('should find element by selector', async () => {
35
- const page = browser.getPage();
36
- const heading = await page.locator('h1').textContent();
37
- expect(heading).toBe('Example Domain');
38
- });
39
- it('should check element visibility', async () => {
40
- const page = browser.getPage();
41
- const isVisible = await page.locator('h1').isVisible();
42
- expect(isVisible).toBe(true);
43
- });
44
- it('should count elements', async () => {
45
- const page = browser.getPage();
46
- const count = await page.locator('p').count();
47
- expect(count).toBeGreaterThan(0);
48
- });
49
- });
50
- describe('screenshots', () => {
51
- it('should take screenshot as buffer', async () => {
52
- const page = browser.getPage();
53
- const buffer = await page.screenshot();
54
- expect(buffer).toBeInstanceOf(Buffer);
55
- expect(buffer.length).toBeGreaterThan(0);
56
- });
57
- });
58
- describe('evaluate', () => {
59
- it('should evaluate JavaScript', async () => {
60
- const page = browser.getPage();
61
- const result = await page.evaluate(() => document.title);
62
- expect(result).toBe('Example Domain');
63
- });
64
- it('should evaluate with arguments', async () => {
65
- const page = browser.getPage();
66
- const result = await page.evaluate((x) => x * 2, 5);
67
- expect(result).toBe(10);
68
- });
69
- });
70
- describe('tabs', () => {
71
- it('should create new tab', async () => {
72
- const result = await browser.newTab();
73
- expect(result.index).toBe(1);
74
- expect(result.total).toBe(2);
75
- });
76
- it('should list tabs', async () => {
77
- const tabs = await browser.listTabs();
78
- expect(tabs.length).toBe(2);
79
- });
80
- it('should close tab', async () => {
81
- // Switch to second tab and close it
82
- const page = browser.getPage();
83
- const tabs = await browser.listTabs();
84
- if (tabs.length > 1) {
85
- const result = await browser.closeTab(1);
86
- expect(result.remaining).toBe(1);
87
- }
88
- });
89
- });
90
- describe('context operations', () => {
91
- it('should get cookies from context', async () => {
92
- const page = browser.getPage();
93
- const cookies = await page.context().cookies();
94
- expect(Array.isArray(cookies)).toBe(true);
95
- });
96
- it('should set and get cookies', async () => {
97
- const page = browser.getPage();
98
- const context = page.context();
99
- await context.addCookies([{ name: 'test', value: 'value', url: 'https://example.com' }]);
100
- const cookies = await context.cookies();
101
- const testCookie = cookies.find((c) => c.name === 'test');
102
- expect(testCookie?.value).toBe('value');
103
- });
104
- it('should clear cookies', async () => {
105
- const page = browser.getPage();
106
- const context = page.context();
107
- await context.clearCookies();
108
- const cookies = await context.cookies();
109
- expect(cookies.length).toBe(0);
110
- });
111
- });
112
- describe('storage via evaluate', () => {
113
- it('should set and get localStorage', async () => {
114
- const page = browser.getPage();
115
- await page.evaluate(() => localStorage.setItem('testKey', 'testValue'));
116
- const value = await page.evaluate(() => localStorage.getItem('testKey'));
117
- expect(value).toBe('testValue');
118
- });
119
- it('should clear localStorage', async () => {
120
- const page = browser.getPage();
121
- await page.evaluate(() => localStorage.clear());
122
- const value = await page.evaluate(() => localStorage.getItem('testKey'));
123
- expect(value).toBeNull();
124
- });
125
- });
126
- describe('viewport', () => {
127
- it('should set viewport', async () => {
128
- await browser.setViewport(1920, 1080);
129
- const page = browser.getPage();
130
- const size = page.viewportSize();
131
- expect(size?.width).toBe(1920);
132
- expect(size?.height).toBe(1080);
133
- });
134
- });
135
- });
136
- //# sourceMappingURL=browser.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"browser.test.js","sourceRoot":"","sources":["../src/browser.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=protocol.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"protocol.test.d.ts","sourceRoot":"","sources":["../src/protocol.test.ts"],"names":[],"mappings":""}
@@ -1,176 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { parseCommand } from './protocol.js';
3
- // Helper to create command JSON string
4
- const cmd = (obj) => JSON.stringify(obj);
5
- describe('parseCommand', () => {
6
- describe('navigation', () => {
7
- it('should parse navigate command', () => {
8
- const result = parseCommand(cmd({ id: '1', action: 'navigate', url: 'https://example.com' }));
9
- expect(result.success).toBe(true);
10
- if (result.success) {
11
- expect(result.command.action).toBe('navigate');
12
- expect(result.command.url).toBe('https://example.com');
13
- }
14
- });
15
- it('should reject navigate without url', () => {
16
- const result = parseCommand(cmd({ id: '1', action: 'navigate' }));
17
- expect(result.success).toBe(false);
18
- });
19
- });
20
- describe('click', () => {
21
- it('should parse click command', () => {
22
- const result = parseCommand(cmd({ id: '1', action: 'click', selector: '#btn' }));
23
- expect(result.success).toBe(true);
24
- if (result.success) {
25
- expect(result.command.action).toBe('click');
26
- expect(result.command.selector).toBe('#btn');
27
- }
28
- });
29
- it('should reject click without selector', () => {
30
- const result = parseCommand(cmd({ id: '1', action: 'click' }));
31
- expect(result.success).toBe(false);
32
- });
33
- });
34
- describe('type', () => {
35
- it('should parse type command', () => {
36
- const result = parseCommand(cmd({ id: '1', action: 'type', selector: '#input', text: 'hello' }));
37
- expect(result.success).toBe(true);
38
- if (result.success) {
39
- expect(result.command.action).toBe('type');
40
- expect(result.command.selector).toBe('#input');
41
- expect(result.command.text).toBe('hello');
42
- }
43
- });
44
- });
45
- describe('fill', () => {
46
- it('should parse fill command', () => {
47
- const result = parseCommand(cmd({ id: '1', action: 'fill', selector: '#input', value: 'hello' }));
48
- expect(result.success).toBe(true);
49
- if (result.success) {
50
- expect(result.command.action).toBe('fill');
51
- expect(result.command.value).toBe('hello');
52
- }
53
- });
54
- });
55
- describe('wait', () => {
56
- it('should parse wait with selector', () => {
57
- const result = parseCommand(cmd({ id: '1', action: 'wait', selector: '#loading' }));
58
- expect(result.success).toBe(true);
59
- });
60
- it('should parse wait with timeout', () => {
61
- const result = parseCommand(cmd({ id: '1', action: 'wait', timeout: 5000 }));
62
- expect(result.success).toBe(true);
63
- });
64
- it('should parse wait with text', () => {
65
- const result = parseCommand(cmd({ id: '1', action: 'wait', text: 'Welcome' }));
66
- expect(result.success).toBe(true);
67
- });
68
- });
69
- describe('screenshot', () => {
70
- it('should parse screenshot command', () => {
71
- const result = parseCommand(cmd({ id: '1', action: 'screenshot', path: 'test.png' }));
72
- expect(result.success).toBe(true);
73
- });
74
- it('should parse screenshot with fullPage', () => {
75
- const result = parseCommand(cmd({ id: '1', action: 'screenshot', fullPage: true }));
76
- expect(result.success).toBe(true);
77
- });
78
- });
79
- describe('cookies', () => {
80
- it('should parse cookies_get', () => {
81
- const result = parseCommand(cmd({ id: '1', action: 'cookies_get' }));
82
- expect(result.success).toBe(true);
83
- });
84
- it('should parse cookies_set', () => {
85
- const result = parseCommand(cmd({
86
- id: '1',
87
- action: 'cookies_set',
88
- cookies: [{ name: 'session', value: 'abc123' }],
89
- }));
90
- expect(result.success).toBe(true);
91
- });
92
- it('should parse cookies_clear', () => {
93
- const result = parseCommand(cmd({ id: '1', action: 'cookies_clear' }));
94
- expect(result.success).toBe(true);
95
- });
96
- });
97
- describe('storage', () => {
98
- it('should parse storage_get', () => {
99
- const result = parseCommand(cmd({ id: '1', action: 'storage_get', type: 'local' }));
100
- expect(result.success).toBe(true);
101
- });
102
- it('should parse storage_set', () => {
103
- const result = parseCommand(cmd({
104
- id: '1',
105
- action: 'storage_set',
106
- type: 'local',
107
- key: 'test',
108
- value: 'value',
109
- }));
110
- expect(result.success).toBe(true);
111
- });
112
- });
113
- describe('semantic locators', () => {
114
- it('should parse getbyrole', () => {
115
- const result = parseCommand(cmd({
116
- id: '1',
117
- action: 'getbyrole',
118
- role: 'button',
119
- subaction: 'click',
120
- }));
121
- expect(result.success).toBe(true);
122
- });
123
- it('should parse getbytext', () => {
124
- const result = parseCommand(cmd({
125
- id: '1',
126
- action: 'getbytext',
127
- text: 'Submit',
128
- subaction: 'click',
129
- }));
130
- expect(result.success).toBe(true);
131
- });
132
- it('should parse getbylabel', () => {
133
- const result = parseCommand(cmd({
134
- id: '1',
135
- action: 'getbylabel',
136
- label: 'Email',
137
- subaction: 'fill',
138
- value: 'test@test.com',
139
- }));
140
- expect(result.success).toBe(true);
141
- });
142
- });
143
- describe('tabs', () => {
144
- it('should parse tab_new', () => {
145
- const result = parseCommand(cmd({ id: '1', action: 'tab_new' }));
146
- expect(result.success).toBe(true);
147
- });
148
- it('should parse tab_list', () => {
149
- const result = parseCommand(cmd({ id: '1', action: 'tab_list' }));
150
- expect(result.success).toBe(true);
151
- });
152
- it('should parse tab_switch', () => {
153
- const result = parseCommand(cmd({ id: '1', action: 'tab_switch', index: 0 }));
154
- expect(result.success).toBe(true);
155
- });
156
- it('should parse tab_close', () => {
157
- const result = parseCommand(cmd({ id: '1', action: 'tab_close' }));
158
- expect(result.success).toBe(true);
159
- });
160
- });
161
- describe('invalid commands', () => {
162
- it('should reject unknown action', () => {
163
- const result = parseCommand(cmd({ id: '1', action: 'unknown' }));
164
- expect(result.success).toBe(false);
165
- });
166
- it('should reject missing id', () => {
167
- const result = parseCommand(cmd({ action: 'click', selector: '#btn' }));
168
- expect(result.success).toBe(false);
169
- });
170
- it('should reject invalid JSON', () => {
171
- const result = parseCommand('not json');
172
- expect(result.success).toBe(false);
173
- });
174
- });
175
- });
176
- //# sourceMappingURL=protocol.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"protocol.test.js","sourceRoot":"","sources":["../src/protocol.test.ts"],"names":[],"mappings":"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"}