@dyyz1993/agent-browser 0.9.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.
- package/LICENSE +202 -0
- package/README.md +907 -0
- package/bin/agent-browser-darwin-arm64 +0 -0
- package/bin/agent-browser.js +120 -0
- package/dist/__tests__/e2e/utils/test-helpers.d.ts +5 -0
- package/dist/__tests__/e2e/utils/test-helpers.d.ts.map +1 -0
- package/dist/__tests__/e2e/utils/test-helpers.js +22 -0
- package/dist/__tests__/e2e/utils/test-helpers.js.map +1 -0
- package/dist/__tests__/test-iframe.d.ts +2 -0
- package/dist/__tests__/test-iframe.d.ts.map +1 -0
- package/dist/__tests__/test-iframe.js +52 -0
- package/dist/__tests__/test-iframe.js.map +1 -0
- package/dist/__tests__/utils/parseCli.d.ts +20 -0
- package/dist/__tests__/utils/parseCli.d.ts.map +1 -0
- package/dist/__tests__/utils/parseCli.js +1086 -0
- package/dist/__tests__/utils/parseCli.js.map +1 -0
- package/dist/actions.d.ts +50 -0
- package/dist/actions.d.ts.map +1 -0
- package/dist/actions.js +2164 -0
- package/dist/actions.js.map +1 -0
- package/dist/browser.d.ts +556 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +2599 -0
- package/dist/browser.js.map +1 -0
- package/dist/cli/commands.d.ts +8 -0
- package/dist/cli/commands.d.ts.map +1 -0
- package/dist/cli/commands.js +1038 -0
- package/dist/cli/commands.js.map +1 -0
- package/dist/cli/connection.d.ts +50 -0
- package/dist/cli/connection.d.ts.map +1 -0
- package/dist/cli/connection.js +595 -0
- package/dist/cli/connection.js.map +1 -0
- package/dist/cli/flags.d.ts +36 -0
- package/dist/cli/flags.d.ts.map +1 -0
- package/dist/cli/flags.js +206 -0
- package/dist/cli/flags.js.map +1 -0
- package/dist/cli/help.d.ts +4 -0
- package/dist/cli/help.d.ts.map +1 -0
- package/dist/cli/help.js +1024 -0
- package/dist/cli/help.js.map +1 -0
- package/dist/cli/output.d.ts +14 -0
- package/dist/cli/output.d.ts.map +1 -0
- package/dist/cli/output.js +456 -0
- package/dist/cli/output.js.map +1 -0
- package/dist/cli-new.d.ts +3 -0
- package/dist/cli-new.d.ts.map +1 -0
- package/dist/cli-new.js +308 -0
- package/dist/cli-new.js.map +1 -0
- package/dist/cli-old.d.ts +3 -0
- package/dist/cli-old.d.ts.map +1 -0
- package/dist/cli-old.js +1101 -0
- package/dist/cli-old.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +403 -0
- package/dist/cli.js.map +1 -0
- package/dist/content-detection.d.ts +18 -0
- package/dist/content-detection.d.ts.map +1 -0
- package/dist/content-detection.js +68 -0
- package/dist/content-detection.js.map +1 -0
- package/dist/daemon.d.ts +55 -0
- package/dist/daemon.d.ts.map +1 -0
- package/dist/daemon.js +426 -0
- package/dist/daemon.js.map +1 -0
- package/dist/diff.d.ts +42 -0
- package/dist/diff.d.ts.map +1 -0
- package/dist/diff.js +166 -0
- package/dist/diff.js.map +1 -0
- package/dist/human-mouse.d.ts +31 -0
- package/dist/human-mouse.d.ts.map +1 -0
- package/dist/human-mouse.js +184 -0
- package/dist/human-mouse.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 +1076 -0
- package/dist/ios-manager.js.map +1 -0
- package/dist/message-bridge.d.ts +10 -0
- package/dist/message-bridge.d.ts.map +1 -0
- package/dist/message-bridge.js +60 -0
- package/dist/message-bridge.js.map +1 -0
- package/dist/protocol.d.ts +26 -0
- package/dist/protocol.d.ts.map +1 -0
- package/dist/protocol.js +912 -0
- package/dist/protocol.js.map +1 -0
- package/dist/recorder/binding.d.ts +24 -0
- package/dist/recorder/binding.d.ts.map +1 -0
- package/dist/recorder/binding.js +215 -0
- package/dist/recorder/binding.js.map +1 -0
- package/dist/recorder/index.d.ts +4 -0
- package/dist/recorder/index.d.ts.map +1 -0
- package/dist/recorder/index.js +4 -0
- package/dist/recorder/index.js.map +1 -0
- package/dist/recorder/inject.js +1913 -0
- package/dist/recorder/recorder.d.ts +19 -0
- package/dist/recorder/recorder.d.ts.map +1 -0
- package/dist/recorder/recorder.js +101 -0
- package/dist/recorder/recorder.js.map +1 -0
- package/dist/recorder/store.d.ts +22 -0
- package/dist/recorder/store.d.ts.map +1 -0
- package/dist/recorder/store.js +150 -0
- package/dist/recorder/store.js.map +1 -0
- package/dist/recorder/types.d.ts +73 -0
- package/dist/recorder/types.d.ts.map +1 -0
- package/dist/recorder/types.js +5 -0
- package/dist/recorder/types.js.map +1 -0
- package/dist/snapshot.d.ts +81 -0
- package/dist/snapshot.d.ts.map +1 -0
- package/dist/snapshot.js +1348 -0
- package/dist/snapshot.js.map +1 -0
- package/dist/stream-server-standalone.d.ts +38 -0
- package/dist/stream-server-standalone.d.ts.map +1 -0
- package/dist/stream-server-standalone.js +494 -0
- package/dist/stream-server-standalone.js.map +1 -0
- package/dist/stream-server.d.ts +214 -0
- package/dist/stream-server.d.ts.map +1 -0
- package/dist/stream-server.js +811 -0
- package/dist/stream-server.js.map +1 -0
- package/dist/types.d.ts +914 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +4 -0
- package/dist/types.js.map +1 -0
- package/dist/viewer-html.d.ts +2 -0
- package/dist/viewer-html.d.ts.map +1 -0
- package/dist/viewer-html.js +185 -0
- package/dist/viewer-html.js.map +1 -0
- package/dist/viewer-script.d.ts +47 -0
- package/dist/viewer-script.d.ts.map +1 -0
- package/dist/viewer-script.js +586 -0
- package/dist/viewer-script.js.map +1 -0
- package/package.json +86 -0
- package/scripts/build-all-platforms.sh +68 -0
- package/scripts/check-version-sync.js +39 -0
- package/scripts/check_goods_container.js +35 -0
- package/scripts/check_page_content.js +36 -0
- package/scripts/click_applause_rate.js +30 -0
- package/scripts/copy-native.js +36 -0
- package/scripts/copy-recorder.js +21 -0
- package/scripts/e2e-test-recorder.ts +584 -0
- package/scripts/explore_jd_page.js +31 -0
- package/scripts/extract_all_jd_data.js +80 -0
- package/scripts/extract_jd_product_detail.js +62 -0
- package/scripts/extract_jd_products_correct_links.js +78 -0
- package/scripts/extract_jd_products_final.js +80 -0
- package/scripts/extract_jd_reviews.js +48 -0
- package/scripts/extract_jd_seafood_final.js +78 -0
- package/scripts/extract_multiple_products.js +77 -0
- package/scripts/extract_products_no_scroll.js +68 -0
- package/scripts/extract_products_simple.js +68 -0
- package/scripts/find_applause_rate.js +26 -0
- package/scripts/find_jd_links.js +28 -0
- package/scripts/find_main_content.js +20 -0
- package/scripts/find_product_cards.js +38 -0
- package/scripts/find_root_content.js +26 -0
- package/scripts/find_unique_products.js +55 -0
- package/scripts/get_jd_product_detail.js +16 -0
- package/scripts/get_jd_products.js +23 -0
- package/scripts/get_jd_seafood_products.js +44 -0
- package/scripts/get_product_details_from_images.js +54 -0
- package/scripts/postinstall.js +235 -0
- package/scripts/scroll_and_get_products.js +47 -0
- package/scripts/scroll_deep_and_find.js +45 -0
- package/scripts/sync-version.js +69 -0
- package/scripts/verify-baidu-enter.ts +116 -0
- package/skills/agent-browser/SKILL.md +310 -0
- package/skills/agent-browser/references/authentication.md +198 -0
- package/skills/agent-browser/references/commands.md +471 -0
- package/skills/agent-browser/references/data-extraction.md +377 -0
- package/skills/agent-browser/references/proxy-support.md +188 -0
- package/skills/agent-browser/references/session-management.md +197 -0
- package/skills/agent-browser/references/snapshot-refs.md +379 -0
- package/skills/agent-browser/references/video-recording.md +173 -0
- package/skills/agent-browser/templates/api-interception.sh +53 -0
- package/skills/agent-browser/templates/authenticated-session.sh +97 -0
- package/skills/agent-browser/templates/capture-workflow.sh +69 -0
- package/skills/agent-browser/templates/data-extraction.sh +210 -0
- package/skills/agent-browser/templates/form-automation.sh +62 -0
- package/skills/skill-creator/LICENSE.txt +202 -0
- package/skills/skill-creator/SKILL.md +356 -0
- package/skills/skill-creator/references/output-patterns.md +82 -0
- package/skills/skill-creator/references/workflows.md +28 -0
- package/skills/skill-creator/scripts/init_skill.py +303 -0
- package/skills/skill-creator/scripts/package_skill.py +113 -0
- package/skills/skill-creator/scripts/quick_validate.py +95 -0
package/dist/diff.js
ADDED
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { getEnhancedSnapshot, resetRefs } from './snapshot.js';
|
|
2
|
+
export async function getDiffTarget(locator, scope) {
|
|
3
|
+
if (scope === 'full') {
|
|
4
|
+
return { target: locator.page(), description: 'full page' };
|
|
5
|
+
}
|
|
6
|
+
if (typeof scope === 'string') {
|
|
7
|
+
return { target: locator.page(), description: scope };
|
|
8
|
+
}
|
|
9
|
+
return { target: locator.page(), description: `${scope} levels up` };
|
|
10
|
+
}
|
|
11
|
+
export async function getSnapshotText(target) {
|
|
12
|
+
resetRefs();
|
|
13
|
+
const result = await getEnhancedSnapshot(target, { interactive: false, compact: true });
|
|
14
|
+
return result.tree;
|
|
15
|
+
}
|
|
16
|
+
function parseSnapshotLine(line) {
|
|
17
|
+
const match = line.match(/-\s+(\w+)\s+"([^"]*)"(?:\s+\[ref=(\w+)\])?(?:\s+\[value:\s*"([^"]*)"\])?/);
|
|
18
|
+
if (match) {
|
|
19
|
+
return {
|
|
20
|
+
role: match[1],
|
|
21
|
+
name: match[2],
|
|
22
|
+
ref: match[3],
|
|
23
|
+
value: match[4],
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
const textMatch = line.match(/-\s+(\w+):\s*"([^"]*)"/);
|
|
27
|
+
if (textMatch) {
|
|
28
|
+
return {
|
|
29
|
+
role: textMatch[1],
|
|
30
|
+
name: '',
|
|
31
|
+
value: textMatch[2],
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
const plainTextMatch = line.match(/-\s+(\w+):\s*(.+)$/);
|
|
35
|
+
if (plainTextMatch) {
|
|
36
|
+
return {
|
|
37
|
+
role: plainTextMatch[1],
|
|
38
|
+
name: '',
|
|
39
|
+
value: plainTextMatch[2].trim(),
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
export function parseSnapshot(text) {
|
|
45
|
+
const elements = new Map();
|
|
46
|
+
const lines = text.split('\n');
|
|
47
|
+
let index = 0;
|
|
48
|
+
for (const line of lines) {
|
|
49
|
+
const info = parseSnapshotLine(line.trim());
|
|
50
|
+
if (info) {
|
|
51
|
+
elements.set(index, info);
|
|
52
|
+
index++;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return elements;
|
|
56
|
+
}
|
|
57
|
+
export function elementsMatch(a, b) {
|
|
58
|
+
if (a.ref && b.ref && a.ref === b.ref)
|
|
59
|
+
return true;
|
|
60
|
+
if (a.role === b.role && a.name === b.name)
|
|
61
|
+
return true;
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
export function computeDiff(beforeText, afterText) {
|
|
65
|
+
const beforeElements = parseSnapshot(beforeText);
|
|
66
|
+
const afterElements = parseSnapshot(afterText);
|
|
67
|
+
const added = [];
|
|
68
|
+
const removed = [];
|
|
69
|
+
const changed = [];
|
|
70
|
+
const beforeArray = Array.from(beforeElements.values());
|
|
71
|
+
const afterArray = Array.from(afterElements.values());
|
|
72
|
+
const matchedBefore = new Set();
|
|
73
|
+
const matchedAfter = new Set();
|
|
74
|
+
for (let i = 0; i < beforeArray.length; i++) {
|
|
75
|
+
const before = beforeArray[i];
|
|
76
|
+
for (let j = 0; j < afterArray.length; j++) {
|
|
77
|
+
if (matchedAfter.has(j))
|
|
78
|
+
continue;
|
|
79
|
+
const after = afterArray[j];
|
|
80
|
+
if (elementsMatch(before, after)) {
|
|
81
|
+
matchedBefore.add(i);
|
|
82
|
+
matchedAfter.add(j);
|
|
83
|
+
if (before.value !== after.value || before.name !== after.name) {
|
|
84
|
+
changed.push({
|
|
85
|
+
role: after.role,
|
|
86
|
+
name: after.name,
|
|
87
|
+
ref: after.ref,
|
|
88
|
+
before: { value: before.value, name: before.name },
|
|
89
|
+
after: { value: after.value, name: after.name },
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
break;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
for (let i = 0; i < beforeArray.length; i++) {
|
|
97
|
+
if (!matchedBefore.has(i)) {
|
|
98
|
+
removed.push(beforeArray[i]);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
for (let j = 0; j < afterArray.length; j++) {
|
|
102
|
+
if (!matchedAfter.has(j)) {
|
|
103
|
+
added.push(afterArray[j]);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return { added, removed, changed, scope: '' };
|
|
107
|
+
}
|
|
108
|
+
export function formatDiff(diff) {
|
|
109
|
+
const lines = [];
|
|
110
|
+
for (const el of diff.added) {
|
|
111
|
+
const name = el.name ? ` "${el.name}"` : '';
|
|
112
|
+
const ref = el.ref ? ` [ref=${el.ref}]` : '';
|
|
113
|
+
lines.push(`+ ${el.role}${name}${ref}`);
|
|
114
|
+
}
|
|
115
|
+
for (const el of diff.removed) {
|
|
116
|
+
const name = el.name ? ` "${el.name}"` : '';
|
|
117
|
+
const ref = el.ref ? ` [ref=${el.ref}]` : '';
|
|
118
|
+
lines.push(`- ${el.role}${name}${ref}`);
|
|
119
|
+
}
|
|
120
|
+
for (const ch of diff.changed) {
|
|
121
|
+
const ref = ch.ref ? ` [ref=${ch.ref}]` : '';
|
|
122
|
+
const hasValueChange = ch.before.value !== ch.after.value;
|
|
123
|
+
const hasNameChange = ch.before.name !== ch.after.name;
|
|
124
|
+
if (hasNameChange && !hasValueChange) {
|
|
125
|
+
lines.push(`- ${ch.role} "${ch.before.name || ''}"${ref}`);
|
|
126
|
+
lines.push(`+ ${ch.role} "${ch.after.name || ''}"${ref}`);
|
|
127
|
+
}
|
|
128
|
+
else if (hasValueChange && !hasNameChange) {
|
|
129
|
+
const name = ch.name ? ` "${ch.name}"` : '';
|
|
130
|
+
lines.push(`- ${ch.role}${name}${ref}: "${ch.before.value || ''}"`);
|
|
131
|
+
lines.push(`+ ${ch.role}${name}${ref}: "${ch.after.value || ''}"`);
|
|
132
|
+
}
|
|
133
|
+
else if (hasValueChange && hasNameChange) {
|
|
134
|
+
lines.push(`- ${ch.role} "${ch.before.name || ''}"${ref}: "${ch.before.value || ''}"`);
|
|
135
|
+
lines.push(`+ ${ch.role} "${ch.after.name || ''}"${ref}: "${ch.after.value || ''}"`);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
if (lines.length === 0) {
|
|
139
|
+
return '(no changes detected)';
|
|
140
|
+
}
|
|
141
|
+
return lines.join('\n');
|
|
142
|
+
}
|
|
143
|
+
export async function performDiff(locator, scope, action) {
|
|
144
|
+
if (scope === undefined) {
|
|
145
|
+
await action();
|
|
146
|
+
return undefined;
|
|
147
|
+
}
|
|
148
|
+
const { target, description } = await getDiffTarget(locator, scope);
|
|
149
|
+
const beforeText = await getSnapshotText(target);
|
|
150
|
+
await action();
|
|
151
|
+
await new Promise(resolve => setTimeout(resolve, 100));
|
|
152
|
+
const afterText = await getSnapshotText(target);
|
|
153
|
+
if (beforeText === afterText) {
|
|
154
|
+
return {
|
|
155
|
+
diff: { added: [], removed: [], changed: [], scope: description },
|
|
156
|
+
output: '(no changes detected)',
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
const diff = computeDiff(beforeText, afterText);
|
|
160
|
+
diff.scope = description;
|
|
161
|
+
return {
|
|
162
|
+
diff,
|
|
163
|
+
output: formatDiff(diff),
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
//# 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,31 @@
|
|
|
1
|
+
import type { Page } from 'playwright-core';
|
|
2
|
+
export type HumanPathType = 'bezier' | 'arc' | 'random' | 'linear';
|
|
3
|
+
export interface HumanConfig {
|
|
4
|
+
enabled: boolean;
|
|
5
|
+
pathType: HumanPathType;
|
|
6
|
+
}
|
|
7
|
+
export interface Point {
|
|
8
|
+
x: number;
|
|
9
|
+
y: number;
|
|
10
|
+
}
|
|
11
|
+
export declare function humanMoveTo(page: Page, to: Point, config: HumanConfig): Promise<void>;
|
|
12
|
+
export declare function humanClick(page: Page, targetX: number, targetY: number, config: HumanConfig, options?: {
|
|
13
|
+
button?: 'left' | 'right' | 'middle';
|
|
14
|
+
clickCount?: number;
|
|
15
|
+
}): Promise<void>;
|
|
16
|
+
export declare function humanType(page: Page, text: string, config: HumanConfig): Promise<void>;
|
|
17
|
+
export declare function humanWander(page: Page, config: HumanConfig, options?: {
|
|
18
|
+
duration?: number;
|
|
19
|
+
area?: {
|
|
20
|
+
width: number;
|
|
21
|
+
height: number;
|
|
22
|
+
};
|
|
23
|
+
}): Promise<void>;
|
|
24
|
+
export declare function getLastMousePosition(): Point;
|
|
25
|
+
/**
|
|
26
|
+
* Get human config from environment variable AGENT_BROWSER_HUMAN
|
|
27
|
+
* Values: 1, bezier, arc, random, linear
|
|
28
|
+
* When set to "1", uses default path type "arc"
|
|
29
|
+
*/
|
|
30
|
+
export declare function getHumanConfigFromEnv(): HumanConfig;
|
|
31
|
+
//# sourceMappingURL=human-mouse.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"human-mouse.d.ts","sourceRoot":"","sources":["../src/human-mouse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAE5C,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,KAAK,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEnE,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,aAAa,CAAC;CACzB;AAED,MAAM,WAAW,KAAK;IACpB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AA0JD,wBAAsB,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,iBAE3E;AAED,wBAAsB,UAAU,CAC9B,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,WAAW,EACnB,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GACtE,OAAO,CAAC,IAAI,CAAC,CAmBf;AAED,wBAAsB,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,iBAK5E;AAED,wBAAsB,WAAW,CAC/B,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,WAAW,EACnB,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GACxE,OAAO,CAAC,IAAI,CAAC,CAef;AAED,wBAAgB,oBAAoB,IAAI,KAAK,CAE5C;AAID;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,WAAW,CAanD"}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
const PRESETS = {
|
|
2
|
+
arc: { speed: 300, overshoot: false },
|
|
3
|
+
bezier: { speed: 350, overshoot: true },
|
|
4
|
+
random: { speed: 280, overshoot: true },
|
|
5
|
+
linear: { speed: 250, overshoot: false },
|
|
6
|
+
};
|
|
7
|
+
function rand(min, max) {
|
|
8
|
+
return Math.random() * (max - min) + min;
|
|
9
|
+
}
|
|
10
|
+
function sleep(ms) {
|
|
11
|
+
return new Promise((r) => setTimeout(r, ms));
|
|
12
|
+
}
|
|
13
|
+
let lastPos = null;
|
|
14
|
+
function generateArcPath(start, end) {
|
|
15
|
+
const dx = end.x - start.x;
|
|
16
|
+
const dy = end.y - start.y;
|
|
17
|
+
const dist = Math.sqrt(dx * dx + dy * dy);
|
|
18
|
+
if (dist < 10)
|
|
19
|
+
return [start, end];
|
|
20
|
+
const mx = (start.x + end.x) / 2;
|
|
21
|
+
const my = (start.y + end.y) / 2;
|
|
22
|
+
const perpX = dist > 0 ? -dy / dist : 0;
|
|
23
|
+
const perpY = dist > 0 ? dx / dist : 0;
|
|
24
|
+
const arcHeight = dist * 0.25 * (Math.random() > 0.5 ? 1 : -1);
|
|
25
|
+
return [start, { x: mx + perpX * arcHeight, y: my + perpY * arcHeight }, end];
|
|
26
|
+
}
|
|
27
|
+
function generateBezierPath(start, end) {
|
|
28
|
+
const dx = end.x - start.x;
|
|
29
|
+
const dy = end.y - start.y;
|
|
30
|
+
const dist = Math.sqrt(dx * dx + dy * dy);
|
|
31
|
+
if (dist < 10)
|
|
32
|
+
return [start, end];
|
|
33
|
+
const angle = Math.atan2(dy, dx) + Math.PI / 2;
|
|
34
|
+
const offset = rand(-dist * 0.3, dist * 0.3);
|
|
35
|
+
return [
|
|
36
|
+
start,
|
|
37
|
+
{
|
|
38
|
+
x: start.x + dx * 0.3 + Math.cos(angle) * offset,
|
|
39
|
+
y: start.y + dy * 0.3 + Math.sin(angle) * offset,
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
x: start.x + dx * 0.7 + Math.cos(angle) * offset * 0.5,
|
|
43
|
+
y: start.y + dy * 0.7 + Math.sin(angle) * offset * 0.5,
|
|
44
|
+
},
|
|
45
|
+
end,
|
|
46
|
+
];
|
|
47
|
+
}
|
|
48
|
+
function generateRandomPath(start, end) {
|
|
49
|
+
const dx = end.x - start.x;
|
|
50
|
+
const dy = end.y - start.y;
|
|
51
|
+
const dist = Math.sqrt(dx * dx + dy * dy);
|
|
52
|
+
if (dist < 10)
|
|
53
|
+
return [start, end];
|
|
54
|
+
const n = Math.max(3, Math.floor(dist / 80));
|
|
55
|
+
const pts = [start];
|
|
56
|
+
for (let i = 1; i < n; i++) {
|
|
57
|
+
const t = i / n;
|
|
58
|
+
pts.push({
|
|
59
|
+
x: start.x + dx * t + rand(-dist * 0.15, dist * 0.15),
|
|
60
|
+
y: start.y + dy * t + rand(-dist * 0.15, dist * 0.15),
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
pts.push(end);
|
|
64
|
+
return pts;
|
|
65
|
+
}
|
|
66
|
+
function generatePath(start, end, type) {
|
|
67
|
+
switch (type) {
|
|
68
|
+
case 'arc':
|
|
69
|
+
return generateArcPath(start, end);
|
|
70
|
+
case 'bezier':
|
|
71
|
+
return generateBezierPath(start, end);
|
|
72
|
+
case 'random':
|
|
73
|
+
return generateRandomPath(start, end);
|
|
74
|
+
default:
|
|
75
|
+
return [start, end];
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
function interp(pts, t) {
|
|
79
|
+
if (pts.length === 2) {
|
|
80
|
+
return { x: pts[0].x + (pts[1].x - pts[0].x) * t, y: pts[0].y + (pts[1].y - pts[0].y) * t };
|
|
81
|
+
}
|
|
82
|
+
if (pts.length === 3) {
|
|
83
|
+
const m = 1 - t;
|
|
84
|
+
return {
|
|
85
|
+
x: m * m * pts[0].x + 2 * m * t * pts[1].x + t * t * pts[2].x,
|
|
86
|
+
y: m * m * pts[0].y + 2 * m * t * pts[1].y + t * t * pts[2].y,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
const [p0, p1, p2, p3] = pts;
|
|
90
|
+
const t2 = t * t, t3 = t2 * t, m = 1 - t, m2 = m * m, m3 = m2 * m;
|
|
91
|
+
return {
|
|
92
|
+
x: m3 * p0.x + 3 * m2 * t * p1.x + 3 * m * t2 * p2.x + t3 * p3.x,
|
|
93
|
+
y: m3 * p0.y + 3 * m2 * t * p1.y + 3 * m * t2 * p2.y + t3 * p3.y,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
async function moveAlongPath(page, pts, steps, preset) {
|
|
97
|
+
for (let i = 0; i <= steps; i++) {
|
|
98
|
+
const t = i / steps;
|
|
99
|
+
const ease = t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t;
|
|
100
|
+
const p = interp(pts, ease);
|
|
101
|
+
await page.mouse.move(p.x, p.y);
|
|
102
|
+
await sleep(rand(3, 8));
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
async function moveTo(page, to, config) {
|
|
106
|
+
const area = page.viewportSize() ?? { width: 1280, height: 800 };
|
|
107
|
+
if (!lastPos) {
|
|
108
|
+
lastPos = { x: rand(200, area.width - 200), y: rand(200, area.height - 200) };
|
|
109
|
+
await page.mouse.move(lastPos.x, lastPos.y);
|
|
110
|
+
}
|
|
111
|
+
const preset = PRESETS[config.pathType];
|
|
112
|
+
const dist = Math.sqrt((to.x - lastPos.x) ** 2 + (to.y - lastPos.y) ** 2);
|
|
113
|
+
const steps = Math.max(10, Math.floor((dist / preset.speed) * 40));
|
|
114
|
+
const path = generatePath(lastPos, to, config.pathType);
|
|
115
|
+
await sleep(rand(20, 50));
|
|
116
|
+
await moveAlongPath(page, path, steps, preset);
|
|
117
|
+
if (preset.overshoot && dist > 50 && Math.random() > 0.6) {
|
|
118
|
+
const over = { x: to.x + (to.x - lastPos.x) * 0.08, y: to.y + (to.y - lastPos.y) * 0.08 };
|
|
119
|
+
await moveAlongPath(page, [to, over, to], 4, preset);
|
|
120
|
+
}
|
|
121
|
+
lastPos = to;
|
|
122
|
+
}
|
|
123
|
+
export async function humanMoveTo(page, to, config) {
|
|
124
|
+
await moveTo(page, to, config);
|
|
125
|
+
}
|
|
126
|
+
export async function humanClick(page, targetX, targetY, config, options) {
|
|
127
|
+
const area = page.viewportSize() ?? { width: 1280, height: 800 };
|
|
128
|
+
if (!lastPos) {
|
|
129
|
+
lastPos = { x: rand(200, area.width - 200), y: rand(200, area.height - 200) };
|
|
130
|
+
await page.mouse.move(lastPos.x, lastPos.y);
|
|
131
|
+
}
|
|
132
|
+
// 直接移动到目标
|
|
133
|
+
await moveTo(page, { x: targetX, y: targetY }, config);
|
|
134
|
+
// 点击
|
|
135
|
+
await sleep(rand(20, 50));
|
|
136
|
+
await page.mouse.down({
|
|
137
|
+
button: options?.button ?? 'left',
|
|
138
|
+
clickCount: options?.clickCount ?? 1,
|
|
139
|
+
});
|
|
140
|
+
await sleep(rand(20, 50));
|
|
141
|
+
await page.mouse.up({ button: options?.button ?? 'left', clickCount: options?.clickCount ?? 1 });
|
|
142
|
+
}
|
|
143
|
+
export async function humanType(page, text, config) {
|
|
144
|
+
for (const char of text) {
|
|
145
|
+
await sleep(rand(50, 150));
|
|
146
|
+
await page.keyboard.type(char);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
export async function humanWander(page, config, options) {
|
|
150
|
+
const duration = options?.duration ?? 2000;
|
|
151
|
+
const area = options?.area ?? page.viewportSize() ?? { width: 1280, height: 800 };
|
|
152
|
+
if (!lastPos) {
|
|
153
|
+
lastPos = { x: rand(200, area.width - 200), y: rand(200, area.height - 200) };
|
|
154
|
+
await page.mouse.move(lastPos.x, lastPos.y);
|
|
155
|
+
}
|
|
156
|
+
const start = Date.now();
|
|
157
|
+
while (Date.now() - start < duration) {
|
|
158
|
+
const target = { x: rand(100, area.width - 100), y: rand(100, area.height - 100) };
|
|
159
|
+
await moveTo(page, target, config);
|
|
160
|
+
await sleep(rand(50, 150));
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
export function getLastMousePosition() {
|
|
164
|
+
return lastPos ? { ...lastPos } : { x: 0, y: 0 };
|
|
165
|
+
}
|
|
166
|
+
const VALID_PATH_TYPES = ['bezier', 'arc', 'random', 'linear'];
|
|
167
|
+
/**
|
|
168
|
+
* Get human config from environment variable AGENT_BROWSER_HUMAN
|
|
169
|
+
* Values: 1, bezier, arc, random, linear
|
|
170
|
+
* When set to "1", uses default path type "arc"
|
|
171
|
+
*/
|
|
172
|
+
export function getHumanConfigFromEnv() {
|
|
173
|
+
const env = process.env.AGENT_BROWSER_HUMAN;
|
|
174
|
+
if (!env) {
|
|
175
|
+
return { enabled: false, pathType: 'arc' };
|
|
176
|
+
}
|
|
177
|
+
// Check if it's a valid path type
|
|
178
|
+
if (VALID_PATH_TYPES.includes(env)) {
|
|
179
|
+
return { enabled: true, pathType: env };
|
|
180
|
+
}
|
|
181
|
+
// Any truthy value (like "1", "true", etc.) enables with default path type
|
|
182
|
+
return { enabled: true, pathType: 'arc' };
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=human-mouse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"human-mouse.js","sourceRoot":"","sources":["../src/human-mouse.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"}
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* iOS command execution - mirrors actions.ts but for iOS Safari via Appium.
|
|
3
|
+
* Provides 1:1 command parity where possible.
|
|
4
|
+
*/
|
|
5
|
+
function successResponse(id, data) {
|
|
6
|
+
return { id, success: true, data };
|
|
7
|
+
}
|
|
8
|
+
function errorResponse(id, error) {
|
|
9
|
+
return { id, success: false, error };
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Execute a command on the iOS manager
|
|
13
|
+
*/
|
|
14
|
+
export async function executeIOSCommand(command, manager) {
|
|
15
|
+
const { id, action } = command;
|
|
16
|
+
try {
|
|
17
|
+
switch (action) {
|
|
18
|
+
case 'launch': {
|
|
19
|
+
const cmd = command;
|
|
20
|
+
await manager.launch({
|
|
21
|
+
device: cmd.device,
|
|
22
|
+
udid: cmd.udid,
|
|
23
|
+
});
|
|
24
|
+
const info = manager.getDeviceInfo();
|
|
25
|
+
return successResponse(id, {
|
|
26
|
+
launched: true,
|
|
27
|
+
device: info?.name ?? 'iOS Simulator',
|
|
28
|
+
udid: info?.udid,
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
case 'navigate': {
|
|
32
|
+
const cmd = command;
|
|
33
|
+
const result = await manager.navigate(cmd.url);
|
|
34
|
+
return successResponse(id, result);
|
|
35
|
+
}
|
|
36
|
+
case 'click': {
|
|
37
|
+
const cmd = command;
|
|
38
|
+
await manager.click(cmd.selector);
|
|
39
|
+
return successResponse(id, { clicked: true });
|
|
40
|
+
}
|
|
41
|
+
case 'tap': {
|
|
42
|
+
const cmd = command;
|
|
43
|
+
await manager.tap(cmd.selector);
|
|
44
|
+
return successResponse(id, { tapped: true });
|
|
45
|
+
}
|
|
46
|
+
case 'type': {
|
|
47
|
+
const cmd = command;
|
|
48
|
+
await manager.type(cmd.selector, cmd.text, {
|
|
49
|
+
delay: cmd.delay,
|
|
50
|
+
clear: cmd.clear,
|
|
51
|
+
});
|
|
52
|
+
return successResponse(id, { typed: true });
|
|
53
|
+
}
|
|
54
|
+
case 'fill': {
|
|
55
|
+
const cmd = command;
|
|
56
|
+
await manager.fill(cmd.selector, cmd.value);
|
|
57
|
+
return successResponse(id, { filled: true });
|
|
58
|
+
}
|
|
59
|
+
case 'screenshot': {
|
|
60
|
+
const cmd = command;
|
|
61
|
+
const result = await manager.screenshot({
|
|
62
|
+
path: cmd.path,
|
|
63
|
+
fullPage: cmd.fullPage,
|
|
64
|
+
});
|
|
65
|
+
return successResponse(id, result);
|
|
66
|
+
}
|
|
67
|
+
case 'snapshot': {
|
|
68
|
+
const cmd = command;
|
|
69
|
+
const result = await manager.getSnapshot({
|
|
70
|
+
interactive: cmd.interactive,
|
|
71
|
+
});
|
|
72
|
+
return successResponse(id, { snapshot: result.tree, refs: result.refs });
|
|
73
|
+
}
|
|
74
|
+
case 'scroll': {
|
|
75
|
+
const cmd = command;
|
|
76
|
+
await manager.scroll({
|
|
77
|
+
selector: cmd.selector,
|
|
78
|
+
x: cmd.x,
|
|
79
|
+
y: cmd.y,
|
|
80
|
+
direction: cmd.direction,
|
|
81
|
+
amount: cmd.amount,
|
|
82
|
+
});
|
|
83
|
+
return successResponse(id, { scrolled: true });
|
|
84
|
+
}
|
|
85
|
+
case 'swipe': {
|
|
86
|
+
const cmd = command;
|
|
87
|
+
await manager.swipe(cmd.direction, { distance: cmd.distance });
|
|
88
|
+
return successResponse(id, { swiped: true });
|
|
89
|
+
}
|
|
90
|
+
case 'evaluate': {
|
|
91
|
+
const cmd = command;
|
|
92
|
+
const result = await manager.evaluate(cmd.script, ...(cmd.args ?? []));
|
|
93
|
+
return successResponse(id, { result });
|
|
94
|
+
}
|
|
95
|
+
case 'wait': {
|
|
96
|
+
const cmd = command;
|
|
97
|
+
await manager.wait({
|
|
98
|
+
selector: cmd.selector,
|
|
99
|
+
timeout: cmd.timeout,
|
|
100
|
+
state: cmd.state,
|
|
101
|
+
});
|
|
102
|
+
return successResponse(id, { waited: true });
|
|
103
|
+
}
|
|
104
|
+
case 'press': {
|
|
105
|
+
const cmd = command;
|
|
106
|
+
await manager.press(cmd.key);
|
|
107
|
+
return successResponse(id, { pressed: true });
|
|
108
|
+
}
|
|
109
|
+
case 'hover': {
|
|
110
|
+
const cmd = command;
|
|
111
|
+
await manager.hover(cmd.selector);
|
|
112
|
+
return successResponse(id, { hovered: true });
|
|
113
|
+
}
|
|
114
|
+
case 'content': {
|
|
115
|
+
const cmd = command;
|
|
116
|
+
const html = await manager.getContent(cmd.selector);
|
|
117
|
+
return successResponse(id, { html });
|
|
118
|
+
}
|
|
119
|
+
case 'gettext': {
|
|
120
|
+
const cmd = command;
|
|
121
|
+
const text = await manager.getText(cmd.selector);
|
|
122
|
+
return successResponse(id, { text });
|
|
123
|
+
}
|
|
124
|
+
case 'getattribute': {
|
|
125
|
+
const cmd = command;
|
|
126
|
+
const value = await manager.getAttribute(cmd.selector, cmd.attribute);
|
|
127
|
+
return successResponse(id, { value });
|
|
128
|
+
}
|
|
129
|
+
case 'isvisible': {
|
|
130
|
+
const cmd = command;
|
|
131
|
+
const visible = await manager.isVisible(cmd.selector);
|
|
132
|
+
return successResponse(id, { visible });
|
|
133
|
+
}
|
|
134
|
+
case 'isenabled': {
|
|
135
|
+
const cmd = command;
|
|
136
|
+
const enabled = await manager.isEnabled(cmd.selector);
|
|
137
|
+
return successResponse(id, { enabled });
|
|
138
|
+
}
|
|
139
|
+
case 'url': {
|
|
140
|
+
const url = await manager.getUrl();
|
|
141
|
+
return successResponse(id, { url });
|
|
142
|
+
}
|
|
143
|
+
case 'title': {
|
|
144
|
+
const title = await manager.getTitle();
|
|
145
|
+
return successResponse(id, { title });
|
|
146
|
+
}
|
|
147
|
+
case 'back': {
|
|
148
|
+
await manager.goBack();
|
|
149
|
+
return successResponse(id, { navigated: 'back' });
|
|
150
|
+
}
|
|
151
|
+
case 'forward': {
|
|
152
|
+
await manager.goForward();
|
|
153
|
+
return successResponse(id, { navigated: 'forward' });
|
|
154
|
+
}
|
|
155
|
+
case 'reload': {
|
|
156
|
+
await manager.reload();
|
|
157
|
+
return successResponse(id, { reloaded: true });
|
|
158
|
+
}
|
|
159
|
+
case 'select': {
|
|
160
|
+
const cmd = command;
|
|
161
|
+
await manager.select(cmd.selector, cmd.values);
|
|
162
|
+
return successResponse(id, { selected: true });
|
|
163
|
+
}
|
|
164
|
+
case 'check': {
|
|
165
|
+
const cmd = command;
|
|
166
|
+
await manager.check(cmd.selector);
|
|
167
|
+
return successResponse(id, { checked: true });
|
|
168
|
+
}
|
|
169
|
+
case 'uncheck': {
|
|
170
|
+
const cmd = command;
|
|
171
|
+
await manager.uncheck(cmd.selector);
|
|
172
|
+
return successResponse(id, { unchecked: true });
|
|
173
|
+
}
|
|
174
|
+
case 'focus': {
|
|
175
|
+
const cmd = command;
|
|
176
|
+
await manager.focus(cmd.selector);
|
|
177
|
+
return successResponse(id, { focused: true });
|
|
178
|
+
}
|
|
179
|
+
case 'clear': {
|
|
180
|
+
const cmd = command;
|
|
181
|
+
await manager.clear(cmd.selector);
|
|
182
|
+
return successResponse(id, { cleared: true });
|
|
183
|
+
}
|
|
184
|
+
case 'count': {
|
|
185
|
+
const cmd = command;
|
|
186
|
+
const count = await manager.count(cmd.selector);
|
|
187
|
+
return successResponse(id, { count });
|
|
188
|
+
}
|
|
189
|
+
case 'boundingbox': {
|
|
190
|
+
const cmd = command;
|
|
191
|
+
const box = await manager.getBoundingBox(cmd.selector);
|
|
192
|
+
return successResponse(id, { box });
|
|
193
|
+
}
|
|
194
|
+
case 'close': {
|
|
195
|
+
await manager.close();
|
|
196
|
+
return successResponse(id, { closed: true });
|
|
197
|
+
}
|
|
198
|
+
// iOS-specific: device list
|
|
199
|
+
case 'device_list': {
|
|
200
|
+
const devices = await manager.listDevices();
|
|
201
|
+
return successResponse(id, { devices });
|
|
202
|
+
}
|
|
203
|
+
// Commands that don't apply to iOS Safari
|
|
204
|
+
case 'tab_new':
|
|
205
|
+
case 'tab_list':
|
|
206
|
+
case 'tab_switch':
|
|
207
|
+
case 'tab_close':
|
|
208
|
+
case 'window_new':
|
|
209
|
+
return errorResponse(id, `Command '${action}' is not supported on iOS Safari. Mobile Safari does not support programmatic tab management.`);
|
|
210
|
+
case 'pdf':
|
|
211
|
+
return errorResponse(id, 'PDF generation is not supported on iOS Safari.');
|
|
212
|
+
case 'screencast_start':
|
|
213
|
+
case 'screencast_stop':
|
|
214
|
+
return errorResponse(id, 'Screencast is not supported on iOS (requires CDP).');
|
|
215
|
+
case 'recording_start':
|
|
216
|
+
case 'recording_stop':
|
|
217
|
+
case 'recording_restart':
|
|
218
|
+
return errorResponse(id, 'Video recording is not yet supported on iOS.');
|
|
219
|
+
default:
|
|
220
|
+
return errorResponse(id, `Unknown or unsupported iOS command: ${action}`);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
catch (error) {
|
|
224
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
225
|
+
return errorResponse(id, message);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
//# sourceMappingURL=ios-actions.js.map
|