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.
- package/LICENSE +201 -0
- package/README.md +1219 -0
- package/bin/agent-browser-darwin-arm64 +0 -0
- package/bin/agent-browser-local +0 -0
- package/bin/agent-browser.js +109 -0
- package/dist/actions.d.ts +17 -0
- package/dist/actions.d.ts.map +1 -0
- package/dist/actions.js +1917 -0
- package/dist/actions.js.map +1 -0
- package/dist/browser.d.ts +598 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +2287 -0
- package/dist/browser.js.map +1 -0
- package/dist/daemon.d.ts +66 -0
- package/dist/daemon.d.ts.map +1 -0
- package/dist/daemon.js +603 -0
- package/dist/daemon.js.map +1 -0
- package/dist/diff.d.ts +18 -0
- package/dist/diff.d.ts.map +1 -0
- package/dist/diff.js +271 -0
- package/dist/diff.js.map +1 -0
- package/dist/encryption.d.ts +50 -0
- package/dist/encryption.d.ts.map +1 -0
- package/dist/encryption.js +85 -0
- package/dist/encryption.js.map +1 -0
- package/dist/ios-actions.d.ts +11 -0
- package/dist/ios-actions.d.ts.map +1 -0
- package/dist/ios-actions.js +228 -0
- package/dist/ios-actions.js.map +1 -0
- package/dist/ios-manager.d.ts +266 -0
- package/dist/ios-manager.d.ts.map +1 -0
- package/dist/ios-manager.js +1073 -0
- package/dist/ios-manager.js.map +1 -0
- package/dist/protocol.d.ts +26 -0
- package/dist/protocol.d.ts.map +1 -0
- package/dist/protocol.js +935 -0
- package/dist/protocol.js.map +1 -0
- package/dist/snapshot.d.ts +67 -0
- package/dist/snapshot.d.ts.map +1 -0
- package/dist/snapshot.js +514 -0
- package/dist/snapshot.js.map +1 -0
- package/dist/state-utils.d.ts +77 -0
- package/dist/state-utils.d.ts.map +1 -0
- package/dist/state-utils.js +178 -0
- package/dist/state-utils.js.map +1 -0
- package/dist/stealth.d.ts +22 -0
- package/dist/stealth.d.ts.map +1 -0
- package/dist/stealth.js +614 -0
- package/dist/stealth.js.map +1 -0
- package/dist/stream-server.d.ts +117 -0
- package/dist/stream-server.d.ts.map +1 -0
- package/dist/stream-server.js +309 -0
- package/dist/stream-server.js.map +1 -0
- package/dist/types.d.ts +855 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +85 -0
- package/scripts/build-all-platforms.sh +68 -0
- package/scripts/check-creepjs-headless.js +137 -0
- package/scripts/check-sannysoft-webdriver.js +112 -0
- package/scripts/check-version-sync.js +39 -0
- package/scripts/copy-native.js +36 -0
- package/scripts/postinstall.js +275 -0
- package/scripts/sync-upstream.sh +142 -0
- package/scripts/sync-version.js +69 -0
- package/skills/agent-browser/SKILL.md +464 -0
- package/skills/agent-browser/references/authentication.md +202 -0
- package/skills/agent-browser/references/commands.md +263 -0
- package/skills/agent-browser/references/profiling.md +120 -0
- package/skills/agent-browser/references/proxy-support.md +194 -0
- package/skills/agent-browser/references/session-management.md +193 -0
- package/skills/agent-browser/references/snapshot-refs.md +194 -0
- package/skills/agent-browser/references/video-recording.md +173 -0
- package/skills/agent-browser/templates/authenticated-session.sh +100 -0
- package/skills/agent-browser/templates/capture-workflow.sh +69 -0
- 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
|
package/dist/diff.js.map
ADDED
|
@@ -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":"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"}
|
|
@@ -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"}
|