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
package/dist/diff.js ADDED
@@ -0,0 +1,271 @@
1
+ import { writeFile, mkdir } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ /**
4
+ * Myers diff algorithm operating on arrays of lines.
5
+ * Returns a minimal edit script.
6
+ */
7
+ function myersDiff(a, b) {
8
+ const n = a.length;
9
+ const m = b.length;
10
+ const max = n + m;
11
+ if (max === 0)
12
+ return [];
13
+ // Optimize: if both are identical, skip diff
14
+ if (n === m) {
15
+ let identical = true;
16
+ for (let i = 0; i < n; i++) {
17
+ if (a[i] !== b[i]) {
18
+ identical = false;
19
+ break;
20
+ }
21
+ }
22
+ if (identical)
23
+ return a.map((line) => ({ type: 'equal', line }));
24
+ }
25
+ const vSize = 2 * max + 1;
26
+ const v = new Int32Array(vSize);
27
+ v.fill(-1);
28
+ const trace = [];
29
+ v[max + 1] = 0;
30
+ for (let d = 0; d <= max; d++) {
31
+ const snapshot = new Int32Array(v);
32
+ trace.push(snapshot);
33
+ for (let k = -d; k <= d; k += 2) {
34
+ const idx = k + max;
35
+ let x;
36
+ if (k === -d || (k !== d && v[idx - 1] < v[idx + 1])) {
37
+ x = v[idx + 1];
38
+ }
39
+ else {
40
+ x = v[idx - 1] + 1;
41
+ }
42
+ let y = x - k;
43
+ while (x < n && y < m && a[x] === b[y]) {
44
+ x++;
45
+ y++;
46
+ }
47
+ v[idx] = x;
48
+ if (x >= n && y >= m) {
49
+ return buildEditScript(trace, a, b, max);
50
+ }
51
+ }
52
+ }
53
+ return buildEditScript(trace, a, b, max);
54
+ }
55
+ function buildEditScript(trace, a, b, max) {
56
+ const edits = [];
57
+ let x = a.length;
58
+ let y = b.length;
59
+ for (let d = trace.length - 1; d > 0; d--) {
60
+ const v = trace[d];
61
+ const k = x - y;
62
+ const idx = k + max;
63
+ let prevK;
64
+ if (k === -d || (k !== d && v[idx - 1] < v[idx + 1])) {
65
+ prevK = k + 1;
66
+ }
67
+ else {
68
+ prevK = k - 1;
69
+ }
70
+ const prevIdx = prevK + max;
71
+ let prevX = v[prevIdx];
72
+ let prevY = prevX - prevK;
73
+ // Diagonal (equal lines)
74
+ while (x > prevX && y > prevY) {
75
+ x--;
76
+ y--;
77
+ edits.push({ type: 'equal', line: a[x] });
78
+ }
79
+ if (x === prevX) {
80
+ y--;
81
+ edits.push({ type: 'insert', line: b[y] });
82
+ }
83
+ else {
84
+ x--;
85
+ edits.push({ type: 'delete', line: a[x] });
86
+ }
87
+ }
88
+ // Remaining diagonal at d=0
89
+ while (x > 0 && y > 0) {
90
+ x--;
91
+ y--;
92
+ edits.push({ type: 'equal', line: a[x] });
93
+ }
94
+ edits.reverse();
95
+ return edits;
96
+ }
97
+ /**
98
+ * Produce a unified diff string and stats from two snapshot texts.
99
+ */
100
+ export function diffSnapshots(before, after) {
101
+ const linesA = before.split('\n');
102
+ const linesB = after.split('\n');
103
+ const edits = myersDiff(linesA, linesB);
104
+ let additions = 0;
105
+ let removals = 0;
106
+ let unchanged = 0;
107
+ const diffLines = [];
108
+ for (const edit of edits) {
109
+ switch (edit.type) {
110
+ case 'equal':
111
+ unchanged++;
112
+ diffLines.push(` ${edit.line}`);
113
+ break;
114
+ case 'insert':
115
+ additions++;
116
+ diffLines.push(`+ ${edit.line}`);
117
+ break;
118
+ case 'delete':
119
+ removals++;
120
+ diffLines.push(`- ${edit.line}`);
121
+ break;
122
+ }
123
+ }
124
+ return {
125
+ diff: diffLines.join('\n'),
126
+ additions,
127
+ removals,
128
+ unchanged,
129
+ changed: additions > 0 || removals > 0,
130
+ };
131
+ }
132
+ const DIFF_ROUTE_PREFIX = 'https://agent-browser-diff.localhost';
133
+ /**
134
+ * Compare two image buffers using the browser's Canvas API for pixel comparison.
135
+ * Uses an isolated blank page to avoid CSP interference or DOM side effects on the
136
+ * user's page. Images are served via intercepted routes to avoid large base64 payloads
137
+ * through page.evaluate (which can be slow or hit CDP message size limits).
138
+ */
139
+ export async function diffScreenshots(context, baselineBuffer, currentBuffer, opts) {
140
+ const baselineMime = opts.baselineMime ?? 'image/png';
141
+ const threshold = opts.threshold ?? 0.1;
142
+ const nonce = Math.random().toString(36).slice(2, 10);
143
+ const blankUrl = `${DIFF_ROUTE_PREFIX}/${nonce}/index.html`;
144
+ const baselineUrl = `${DIFF_ROUTE_PREFIX}/${nonce}/baseline.png`;
145
+ const currentUrl = `${DIFF_ROUTE_PREFIX}/${nonce}/current.png`;
146
+ const diffPage = await context.newPage();
147
+ let blankRouted = false;
148
+ let baselineRouted = false;
149
+ let currentRouted = false;
150
+ try {
151
+ await diffPage.route(blankUrl, (route) => route.fulfill({ body: '<html><body></body></html>', contentType: 'text/html' }));
152
+ blankRouted = true;
153
+ await diffPage.route(baselineUrl, (route) => route.fulfill({ body: baselineBuffer, contentType: baselineMime }));
154
+ baselineRouted = true;
155
+ await diffPage.route(currentUrl, (route) => route.fulfill({ body: currentBuffer, contentType: 'image/png' }));
156
+ currentRouted = true;
157
+ await diffPage.goto(blankUrl);
158
+ const pixelDiffFn = async (args) => {
159
+ const g = globalThis;
160
+ const doc = g.document;
161
+ const Img = g.Image;
162
+ function loadImage(url) {
163
+ return new Promise((resolve, reject) => {
164
+ const img = new Img();
165
+ img.onload = () => resolve(img);
166
+ img.onerror = () => reject(new Error('Failed to load image'));
167
+ img.src = url;
168
+ });
169
+ }
170
+ const [imgA, imgB] = (await Promise.all([
171
+ loadImage(args.baselineUrl),
172
+ loadImage(args.currentUrl),
173
+ ]));
174
+ if (imgA.width !== imgB.width || imgA.height !== imgB.height) {
175
+ const c = doc.createElement('canvas');
176
+ c.width = 1;
177
+ c.height = 1;
178
+ return {
179
+ totalPixels: Math.max(imgA.width * imgA.height, imgB.width * imgB.height),
180
+ differentPixels: Math.max(imgA.width * imgA.height, imgB.width * imgB.height),
181
+ mismatchPercentage: 100,
182
+ diffBase64: c.toDataURL('image/png').split(',')[1],
183
+ dimensionMismatch: true,
184
+ };
185
+ }
186
+ const w = imgA.width;
187
+ const h = imgA.height;
188
+ const canvasA = doc.createElement('canvas');
189
+ canvasA.width = w;
190
+ canvasA.height = h;
191
+ const ctxA = canvasA.getContext('2d');
192
+ ctxA.drawImage(imgA, 0, 0);
193
+ const dataA = ctxA.getImageData(0, 0, w, h).data;
194
+ const canvasB = doc.createElement('canvas');
195
+ canvasB.width = w;
196
+ canvasB.height = h;
197
+ const ctxB = canvasB.getContext('2d');
198
+ ctxB.drawImage(imgB, 0, 0);
199
+ const dataB = ctxB.getImageData(0, 0, w, h).data;
200
+ const diffCanvas = doc.createElement('canvas');
201
+ diffCanvas.width = w;
202
+ diffCanvas.height = h;
203
+ const ctxDiff = diffCanvas.getContext('2d');
204
+ const diffImageData = ctxDiff.createImageData(w, h);
205
+ const diffData = diffImageData.data;
206
+ const maxColorDistance = args.threshold * 255 * Math.sqrt(3);
207
+ let differentPixels = 0;
208
+ const totalPixels = w * h;
209
+ for (let i = 0; i < totalPixels; i++) {
210
+ const offset = i * 4;
211
+ const rA = dataA[offset], gA = dataA[offset + 1], bA = dataA[offset + 2];
212
+ const rB = dataB[offset], gB = dataB[offset + 1], bB = dataB[offset + 2];
213
+ const dr = rA - rB, dg = gA - gB, db = bA - bB;
214
+ const dist = Math.sqrt(dr * dr + dg * dg + db * db);
215
+ if (dist > maxColorDistance) {
216
+ differentPixels++;
217
+ diffData[offset] = 255;
218
+ diffData[offset + 1] = 0;
219
+ diffData[offset + 2] = 0;
220
+ diffData[offset + 3] = 255;
221
+ }
222
+ else {
223
+ diffData[offset] = Math.round(rA * 0.3);
224
+ diffData[offset + 1] = Math.round(gA * 0.3);
225
+ diffData[offset + 2] = Math.round(bA * 0.3);
226
+ diffData[offset + 3] = 255;
227
+ }
228
+ }
229
+ ctxDiff.putImageData(diffImageData, 0, 0);
230
+ const diffBase64 = diffCanvas.toDataURL('image/png').split(',')[1];
231
+ return {
232
+ totalPixels,
233
+ differentPixels,
234
+ mismatchPercentage: Math.round((differentPixels / totalPixels) * 10000) / 100,
235
+ diffBase64,
236
+ dimensionMismatch: false,
237
+ };
238
+ };
239
+ const result = (await diffPage.evaluate(pixelDiffFn, {
240
+ baselineUrl,
241
+ currentUrl,
242
+ threshold,
243
+ }));
244
+ let outputPath = opts.outputPath;
245
+ if (!outputPath) {
246
+ const tmpDir = path.join(process.env.HOME || process.env.USERPROFILE || '/tmp', '.agent-browser', 'tmp', 'diffs');
247
+ await mkdir(tmpDir, { recursive: true });
248
+ outputPath = path.join(tmpDir, `diff-${Date.now()}.png`);
249
+ }
250
+ const diffBuffer = Buffer.from(result.diffBase64, 'base64');
251
+ await writeFile(outputPath, diffBuffer);
252
+ return {
253
+ diffPath: outputPath,
254
+ totalPixels: result.totalPixels,
255
+ differentPixels: result.differentPixels,
256
+ mismatchPercentage: result.mismatchPercentage,
257
+ match: result.differentPixels === 0,
258
+ ...(result.dimensionMismatch ? { dimensionMismatch: true } : {}),
259
+ };
260
+ }
261
+ finally {
262
+ if (blankRouted)
263
+ await diffPage.unroute(blankUrl).catch(() => { });
264
+ if (baselineRouted)
265
+ await diffPage.unroute(baselineUrl).catch(() => { });
266
+ if (currentRouted)
267
+ await diffPage.unroute(currentUrl).catch(() => { });
268
+ await diffPage.close().catch(() => { });
269
+ }
270
+ }
271
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../src/diff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Encryption utilities for state file protection using AES-256-GCM.
3
+ */
4
+ export declare const ENCRYPTION_ALGORITHM = "aes-256-gcm";
5
+ export declare const ENCRYPTION_KEY_ENV = "AGENT_BROWSER_ENCRYPTION_KEY";
6
+ export declare const IV_LENGTH = 12;
7
+ /**
8
+ * Encrypted payload structure.
9
+ */
10
+ export interface EncryptedPayload {
11
+ version: 1;
12
+ encrypted: true;
13
+ iv: string;
14
+ authTag: string;
15
+ data: string;
16
+ }
17
+ /**
18
+ * Get encryption key from environment variable.
19
+ * The key should be a 32-byte (256-bit) hex-encoded string (64 characters).
20
+ * Generate with: openssl rand -hex 32
21
+ *
22
+ * @returns Buffer containing the key, or null if not set/invalid
23
+ */
24
+ export declare function getEncryptionKey(): Buffer | null;
25
+ /**
26
+ * Encrypt data using AES-256-GCM.
27
+ * Returns a JSON-serializable payload with IV, auth tag, and encrypted data.
28
+ *
29
+ * @param plaintext - The string to encrypt
30
+ * @param key - The 256-bit encryption key
31
+ * @returns Encrypted payload object
32
+ */
33
+ export declare function encryptData(plaintext: string, key: Buffer): EncryptedPayload;
34
+ /**
35
+ * Decrypt data using AES-256-GCM.
36
+ *
37
+ * @param payload - The encrypted payload object
38
+ * @param key - The 256-bit encryption key
39
+ * @returns Decrypted plaintext string
40
+ * @throws Error if decryption fails (wrong key, tampered data, etc.)
41
+ */
42
+ export declare function decryptData(payload: EncryptedPayload, key: Buffer): string;
43
+ /**
44
+ * Check if a parsed JSON object is an encrypted payload.
45
+ *
46
+ * @param data - The object to check
47
+ * @returns True if the object is a valid encrypted payload
48
+ */
49
+ export declare function isEncryptedPayload(data: unknown): data is EncryptedPayload;
50
+ //# sourceMappingURL=encryption.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encryption.d.ts","sourceRoot":"","sources":["../src/encryption.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,eAAO,MAAM,oBAAoB,gBAAgB,CAAC;AAClD,eAAO,MAAM,kBAAkB,iCAAiC,CAAC;AACjE,eAAO,MAAM,SAAS,KAAK,CAAC;AAE5B;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,CAAC,CAAC;IACX,SAAS,EAAE,IAAI,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,GAAG,IAAI,CAchD;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,gBAAgB,CAc5E;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,gBAAgB,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAY1E;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,gBAAgB,CAW1E"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Encryption utilities for state file protection using AES-256-GCM.
3
+ */
4
+ import * as crypto from 'crypto';
5
+ // ============================================
6
+ // Constants
7
+ // ============================================
8
+ export const ENCRYPTION_ALGORITHM = 'aes-256-gcm';
9
+ export const ENCRYPTION_KEY_ENV = 'AGENT_BROWSER_ENCRYPTION_KEY';
10
+ export const IV_LENGTH = 12; // 96 bits for GCM
11
+ /**
12
+ * Get encryption key from environment variable.
13
+ * The key should be a 32-byte (256-bit) hex-encoded string (64 characters).
14
+ * Generate with: openssl rand -hex 32
15
+ *
16
+ * @returns Buffer containing the key, or null if not set/invalid
17
+ */
18
+ export function getEncryptionKey() {
19
+ const keyHex = process.env[ENCRYPTION_KEY_ENV];
20
+ if (!keyHex)
21
+ return null;
22
+ // Key should be 64 hex chars = 32 bytes = 256 bits
23
+ if (!/^[a-fA-F0-9]{64}$/.test(keyHex)) {
24
+ console.warn(`Warning: ${ENCRYPTION_KEY_ENV} should be a 64-character hex string (256 bits). ` +
25
+ `Generate one with: openssl rand -hex 32`);
26
+ return null;
27
+ }
28
+ return Buffer.from(keyHex, 'hex');
29
+ }
30
+ /**
31
+ * Encrypt data using AES-256-GCM.
32
+ * Returns a JSON-serializable payload with IV, auth tag, and encrypted data.
33
+ *
34
+ * @param plaintext - The string to encrypt
35
+ * @param key - The 256-bit encryption key
36
+ * @returns Encrypted payload object
37
+ */
38
+ export function encryptData(plaintext, key) {
39
+ const iv = crypto.randomBytes(IV_LENGTH);
40
+ const cipher = crypto.createCipheriv(ENCRYPTION_ALGORITHM, key, iv);
41
+ let encrypted = cipher.update(plaintext, 'utf8');
42
+ encrypted = Buffer.concat([encrypted, cipher.final()]);
43
+ return {
44
+ version: 1,
45
+ encrypted: true,
46
+ iv: iv.toString('base64'),
47
+ authTag: cipher.getAuthTag().toString('base64'),
48
+ data: encrypted.toString('base64'),
49
+ };
50
+ }
51
+ /**
52
+ * Decrypt data using AES-256-GCM.
53
+ *
54
+ * @param payload - The encrypted payload object
55
+ * @param key - The 256-bit encryption key
56
+ * @returns Decrypted plaintext string
57
+ * @throws Error if decryption fails (wrong key, tampered data, etc.)
58
+ */
59
+ export function decryptData(payload, key) {
60
+ const iv = Buffer.from(payload.iv, 'base64');
61
+ const authTag = Buffer.from(payload.authTag, 'base64');
62
+ const encryptedData = Buffer.from(payload.data, 'base64');
63
+ const decipher = crypto.createDecipheriv(ENCRYPTION_ALGORITHM, key, iv);
64
+ decipher.setAuthTag(authTag);
65
+ let decrypted = decipher.update(encryptedData);
66
+ decrypted = Buffer.concat([decrypted, decipher.final()]);
67
+ return decrypted.toString('utf8');
68
+ }
69
+ /**
70
+ * Check if a parsed JSON object is an encrypted payload.
71
+ *
72
+ * @param data - The object to check
73
+ * @returns True if the object is a valid encrypted payload
74
+ */
75
+ export function isEncryptedPayload(data) {
76
+ return (typeof data === 'object' &&
77
+ data !== null &&
78
+ 'encrypted' in data &&
79
+ data.encrypted === true &&
80
+ 'version' in data &&
81
+ 'iv' in data &&
82
+ 'authTag' in data &&
83
+ 'data' in data);
84
+ }
85
+ //# sourceMappingURL=encryption.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encryption.js","sourceRoot":"","sources":["../src/encryption.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AAEjC,+CAA+C;AAC/C,YAAY;AACZ,+CAA+C;AAC/C,MAAM,CAAC,MAAM,oBAAoB,GAAG,aAAa,CAAC;AAClD,MAAM,CAAC,MAAM,kBAAkB,GAAG,8BAA8B,CAAC;AACjE,MAAM,CAAC,MAAM,SAAS,GAAG,EAAE,CAAC,CAAC,kBAAkB;AAa/C;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB;IAC9B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAC/C,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAEzB,mDAAmD;IACnD,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACtC,OAAO,CAAC,IAAI,CACV,YAAY,kBAAkB,mDAAmD;YAC/E,yCAAyC,CAC5C,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AACpC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW,CAAC,SAAiB,EAAE,GAAW;IACxD,MAAM,EAAE,GAAG,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC,oBAAoB,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;IAEpE,IAAI,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IACjD,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAEvD,OAAO;QACL,OAAO,EAAE,CAAC;QACV,SAAS,EAAE,IAAI;QACf,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACzB,OAAO,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAC/C,IAAI,EAAE,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC;KACnC,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW,CAAC,OAAyB,EAAE,GAAW;IAChE,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;IAC7C,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACvD,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAE1D,MAAM,QAAQ,GAAG,MAAM,CAAC,gBAAgB,CAAC,oBAAoB,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;IACxE,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAE7B,IAAI,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IAC/C,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAEzD,OAAO,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAa;IAC9C,OAAO,CACL,OAAO,IAAI,KAAK,QAAQ;QACxB,IAAI,KAAK,IAAI;QACb,WAAW,IAAI,IAAI;QAClB,IAAyB,CAAC,SAAS,KAAK,IAAI;QAC7C,SAAS,IAAI,IAAI;QACjB,IAAI,IAAI,IAAI;QACZ,SAAS,IAAI,IAAI;QACjB,MAAM,IAAI,IAAI,CACf,CAAC;AACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * iOS command execution - mirrors actions.ts but for iOS Safari via Appium.
3
+ * Provides 1:1 command parity where possible.
4
+ */
5
+ import type { IOSManager } from './ios-manager.js';
6
+ import type { Command, Response } from './types.js';
7
+ /**
8
+ * Execute a command on the iOS manager
9
+ */
10
+ export declare function executeIOSCommand(command: Command, manager: IOSManager): Promise<Response>;
11
+ //# sourceMappingURL=ios-actions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ios-actions.d.ts","sourceRoot":"","sources":["../src/ios-actions.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAUpD;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,CA6PhG"}