@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.
Files changed (187) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +907 -0
  3. package/bin/agent-browser-darwin-arm64 +0 -0
  4. package/bin/agent-browser.js +120 -0
  5. package/dist/__tests__/e2e/utils/test-helpers.d.ts +5 -0
  6. package/dist/__tests__/e2e/utils/test-helpers.d.ts.map +1 -0
  7. package/dist/__tests__/e2e/utils/test-helpers.js +22 -0
  8. package/dist/__tests__/e2e/utils/test-helpers.js.map +1 -0
  9. package/dist/__tests__/test-iframe.d.ts +2 -0
  10. package/dist/__tests__/test-iframe.d.ts.map +1 -0
  11. package/dist/__tests__/test-iframe.js +52 -0
  12. package/dist/__tests__/test-iframe.js.map +1 -0
  13. package/dist/__tests__/utils/parseCli.d.ts +20 -0
  14. package/dist/__tests__/utils/parseCli.d.ts.map +1 -0
  15. package/dist/__tests__/utils/parseCli.js +1086 -0
  16. package/dist/__tests__/utils/parseCli.js.map +1 -0
  17. package/dist/actions.d.ts +50 -0
  18. package/dist/actions.d.ts.map +1 -0
  19. package/dist/actions.js +2164 -0
  20. package/dist/actions.js.map +1 -0
  21. package/dist/browser.d.ts +556 -0
  22. package/dist/browser.d.ts.map +1 -0
  23. package/dist/browser.js +2599 -0
  24. package/dist/browser.js.map +1 -0
  25. package/dist/cli/commands.d.ts +8 -0
  26. package/dist/cli/commands.d.ts.map +1 -0
  27. package/dist/cli/commands.js +1038 -0
  28. package/dist/cli/commands.js.map +1 -0
  29. package/dist/cli/connection.d.ts +50 -0
  30. package/dist/cli/connection.d.ts.map +1 -0
  31. package/dist/cli/connection.js +595 -0
  32. package/dist/cli/connection.js.map +1 -0
  33. package/dist/cli/flags.d.ts +36 -0
  34. package/dist/cli/flags.d.ts.map +1 -0
  35. package/dist/cli/flags.js +206 -0
  36. package/dist/cli/flags.js.map +1 -0
  37. package/dist/cli/help.d.ts +4 -0
  38. package/dist/cli/help.d.ts.map +1 -0
  39. package/dist/cli/help.js +1024 -0
  40. package/dist/cli/help.js.map +1 -0
  41. package/dist/cli/output.d.ts +14 -0
  42. package/dist/cli/output.d.ts.map +1 -0
  43. package/dist/cli/output.js +456 -0
  44. package/dist/cli/output.js.map +1 -0
  45. package/dist/cli-new.d.ts +3 -0
  46. package/dist/cli-new.d.ts.map +1 -0
  47. package/dist/cli-new.js +308 -0
  48. package/dist/cli-new.js.map +1 -0
  49. package/dist/cli-old.d.ts +3 -0
  50. package/dist/cli-old.d.ts.map +1 -0
  51. package/dist/cli-old.js +1101 -0
  52. package/dist/cli-old.js.map +1 -0
  53. package/dist/cli.d.ts +3 -0
  54. package/dist/cli.d.ts.map +1 -0
  55. package/dist/cli.js +403 -0
  56. package/dist/cli.js.map +1 -0
  57. package/dist/content-detection.d.ts +18 -0
  58. package/dist/content-detection.d.ts.map +1 -0
  59. package/dist/content-detection.js +68 -0
  60. package/dist/content-detection.js.map +1 -0
  61. package/dist/daemon.d.ts +55 -0
  62. package/dist/daemon.d.ts.map +1 -0
  63. package/dist/daemon.js +426 -0
  64. package/dist/daemon.js.map +1 -0
  65. package/dist/diff.d.ts +42 -0
  66. package/dist/diff.d.ts.map +1 -0
  67. package/dist/diff.js +166 -0
  68. package/dist/diff.js.map +1 -0
  69. package/dist/human-mouse.d.ts +31 -0
  70. package/dist/human-mouse.d.ts.map +1 -0
  71. package/dist/human-mouse.js +184 -0
  72. package/dist/human-mouse.js.map +1 -0
  73. package/dist/ios-actions.d.ts +11 -0
  74. package/dist/ios-actions.d.ts.map +1 -0
  75. package/dist/ios-actions.js +228 -0
  76. package/dist/ios-actions.js.map +1 -0
  77. package/dist/ios-manager.d.ts +266 -0
  78. package/dist/ios-manager.d.ts.map +1 -0
  79. package/dist/ios-manager.js +1076 -0
  80. package/dist/ios-manager.js.map +1 -0
  81. package/dist/message-bridge.d.ts +10 -0
  82. package/dist/message-bridge.d.ts.map +1 -0
  83. package/dist/message-bridge.js +60 -0
  84. package/dist/message-bridge.js.map +1 -0
  85. package/dist/protocol.d.ts +26 -0
  86. package/dist/protocol.d.ts.map +1 -0
  87. package/dist/protocol.js +912 -0
  88. package/dist/protocol.js.map +1 -0
  89. package/dist/recorder/binding.d.ts +24 -0
  90. package/dist/recorder/binding.d.ts.map +1 -0
  91. package/dist/recorder/binding.js +215 -0
  92. package/dist/recorder/binding.js.map +1 -0
  93. package/dist/recorder/index.d.ts +4 -0
  94. package/dist/recorder/index.d.ts.map +1 -0
  95. package/dist/recorder/index.js +4 -0
  96. package/dist/recorder/index.js.map +1 -0
  97. package/dist/recorder/inject.js +1913 -0
  98. package/dist/recorder/recorder.d.ts +19 -0
  99. package/dist/recorder/recorder.d.ts.map +1 -0
  100. package/dist/recorder/recorder.js +101 -0
  101. package/dist/recorder/recorder.js.map +1 -0
  102. package/dist/recorder/store.d.ts +22 -0
  103. package/dist/recorder/store.d.ts.map +1 -0
  104. package/dist/recorder/store.js +150 -0
  105. package/dist/recorder/store.js.map +1 -0
  106. package/dist/recorder/types.d.ts +73 -0
  107. package/dist/recorder/types.d.ts.map +1 -0
  108. package/dist/recorder/types.js +5 -0
  109. package/dist/recorder/types.js.map +1 -0
  110. package/dist/snapshot.d.ts +81 -0
  111. package/dist/snapshot.d.ts.map +1 -0
  112. package/dist/snapshot.js +1348 -0
  113. package/dist/snapshot.js.map +1 -0
  114. package/dist/stream-server-standalone.d.ts +38 -0
  115. package/dist/stream-server-standalone.d.ts.map +1 -0
  116. package/dist/stream-server-standalone.js +494 -0
  117. package/dist/stream-server-standalone.js.map +1 -0
  118. package/dist/stream-server.d.ts +214 -0
  119. package/dist/stream-server.d.ts.map +1 -0
  120. package/dist/stream-server.js +811 -0
  121. package/dist/stream-server.js.map +1 -0
  122. package/dist/types.d.ts +914 -0
  123. package/dist/types.d.ts.map +1 -0
  124. package/dist/types.js +4 -0
  125. package/dist/types.js.map +1 -0
  126. package/dist/viewer-html.d.ts +2 -0
  127. package/dist/viewer-html.d.ts.map +1 -0
  128. package/dist/viewer-html.js +185 -0
  129. package/dist/viewer-html.js.map +1 -0
  130. package/dist/viewer-script.d.ts +47 -0
  131. package/dist/viewer-script.d.ts.map +1 -0
  132. package/dist/viewer-script.js +586 -0
  133. package/dist/viewer-script.js.map +1 -0
  134. package/package.json +86 -0
  135. package/scripts/build-all-platforms.sh +68 -0
  136. package/scripts/check-version-sync.js +39 -0
  137. package/scripts/check_goods_container.js +35 -0
  138. package/scripts/check_page_content.js +36 -0
  139. package/scripts/click_applause_rate.js +30 -0
  140. package/scripts/copy-native.js +36 -0
  141. package/scripts/copy-recorder.js +21 -0
  142. package/scripts/e2e-test-recorder.ts +584 -0
  143. package/scripts/explore_jd_page.js +31 -0
  144. package/scripts/extract_all_jd_data.js +80 -0
  145. package/scripts/extract_jd_product_detail.js +62 -0
  146. package/scripts/extract_jd_products_correct_links.js +78 -0
  147. package/scripts/extract_jd_products_final.js +80 -0
  148. package/scripts/extract_jd_reviews.js +48 -0
  149. package/scripts/extract_jd_seafood_final.js +78 -0
  150. package/scripts/extract_multiple_products.js +77 -0
  151. package/scripts/extract_products_no_scroll.js +68 -0
  152. package/scripts/extract_products_simple.js +68 -0
  153. package/scripts/find_applause_rate.js +26 -0
  154. package/scripts/find_jd_links.js +28 -0
  155. package/scripts/find_main_content.js +20 -0
  156. package/scripts/find_product_cards.js +38 -0
  157. package/scripts/find_root_content.js +26 -0
  158. package/scripts/find_unique_products.js +55 -0
  159. package/scripts/get_jd_product_detail.js +16 -0
  160. package/scripts/get_jd_products.js +23 -0
  161. package/scripts/get_jd_seafood_products.js +44 -0
  162. package/scripts/get_product_details_from_images.js +54 -0
  163. package/scripts/postinstall.js +235 -0
  164. package/scripts/scroll_and_get_products.js +47 -0
  165. package/scripts/scroll_deep_and_find.js +45 -0
  166. package/scripts/sync-version.js +69 -0
  167. package/scripts/verify-baidu-enter.ts +116 -0
  168. package/skills/agent-browser/SKILL.md +310 -0
  169. package/skills/agent-browser/references/authentication.md +198 -0
  170. package/skills/agent-browser/references/commands.md +471 -0
  171. package/skills/agent-browser/references/data-extraction.md +377 -0
  172. package/skills/agent-browser/references/proxy-support.md +188 -0
  173. package/skills/agent-browser/references/session-management.md +197 -0
  174. package/skills/agent-browser/references/snapshot-refs.md +379 -0
  175. package/skills/agent-browser/references/video-recording.md +173 -0
  176. package/skills/agent-browser/templates/api-interception.sh +53 -0
  177. package/skills/agent-browser/templates/authenticated-session.sh +97 -0
  178. package/skills/agent-browser/templates/capture-workflow.sh +69 -0
  179. package/skills/agent-browser/templates/data-extraction.sh +210 -0
  180. package/skills/agent-browser/templates/form-automation.sh +62 -0
  181. package/skills/skill-creator/LICENSE.txt +202 -0
  182. package/skills/skill-creator/SKILL.md +356 -0
  183. package/skills/skill-creator/references/output-patterns.md +82 -0
  184. package/skills/skill-creator/references/workflows.md +28 -0
  185. package/skills/skill-creator/scripts/init_skill.py +303 -0
  186. package/skills/skill-creator/scripts/package_skill.py +113 -0
  187. package/skills/skill-creator/scripts/quick_validate.py +95 -0
@@ -0,0 +1,68 @@
1
+ #!/bin/bash
2
+ set -e
3
+
4
+ # Build agent-browser for all platforms using Docker
5
+ # Usage: ./scripts/build-all-platforms.sh
6
+
7
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
8
+ PROJECT_ROOT="$(dirname "$SCRIPT_DIR")"
9
+ OUTPUT_DIR="$PROJECT_ROOT/bin"
10
+
11
+ # Colors
12
+ RED='\033[0;31m'
13
+ GREEN='\033[0;32m'
14
+ YELLOW='\033[1;33m'
15
+ NC='\033[0m' # No Color
16
+
17
+ echo -e "${YELLOW}Building agent-browser for all platforms...${NC}"
18
+ echo ""
19
+
20
+ # Ensure output directory exists
21
+ mkdir -p "$OUTPUT_DIR"
22
+
23
+ # Build the Docker image if needed
24
+ echo -e "${YELLOW}Building Docker cross-compilation image...${NC}"
25
+ docker build -t agent-browser-builder -f "$PROJECT_ROOT/docker/Dockerfile.build" "$PROJECT_ROOT"
26
+
27
+ # Function to build for a target
28
+ build_target() {
29
+ local target=$1
30
+ local output_name=$2
31
+
32
+ echo -e "${YELLOW}Building for ${target}...${NC}"
33
+
34
+ docker run --rm \
35
+ -v "$PROJECT_ROOT/cli:/build" \
36
+ -v "$OUTPUT_DIR:/output" \
37
+ agent-browser-builder \
38
+ -c "cargo zigbuild --release --target ${target} && cp /build/target/${target}/release/agent-browser* /output/${output_name} && chmod +x /output/${output_name} 2>/dev/null || true"
39
+
40
+ if [ -f "$OUTPUT_DIR/$output_name" ]; then
41
+ echo -e "${GREEN}✓ Built ${output_name}${NC}"
42
+ else
43
+ echo -e "${RED}✗ Failed to build ${output_name}${NC}"
44
+ return 1
45
+ fi
46
+ }
47
+
48
+ # Build for each platform
49
+ # Linux x64
50
+ build_target "x86_64-unknown-linux-gnu" "agent-browser-linux-x64"
51
+
52
+ # Linux ARM64
53
+ build_target "aarch64-unknown-linux-gnu" "agent-browser-linux-arm64"
54
+
55
+ # Windows x64
56
+ build_target "x86_64-pc-windows-gnu" "agent-browser-win32-x64.exe"
57
+
58
+ # macOS x64 (via zig for cross-compilation)
59
+ build_target "x86_64-apple-darwin" "agent-browser-darwin-x64"
60
+
61
+ # macOS ARM64 (via zig for cross-compilation)
62
+ build_target "aarch64-apple-darwin" "agent-browser-darwin-arm64"
63
+
64
+ echo ""
65
+ echo -e "${GREEN}Build complete!${NC}"
66
+ echo ""
67
+ echo "Binaries are in: $OUTPUT_DIR"
68
+ ls -la "$OUTPUT_DIR"/agent-browser-*
@@ -0,0 +1,39 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Verifies that package.json and cli/Cargo.toml have the same version.
5
+ * Used in CI to catch version drift.
6
+ */
7
+
8
+ import { readFileSync } from 'fs';
9
+ import { dirname, join } from 'path';
10
+ import { fileURLToPath } from 'url';
11
+
12
+ const __dirname = dirname(fileURLToPath(import.meta.url));
13
+ const rootDir = join(__dirname, '..');
14
+
15
+ // Read package.json version
16
+ const packageJson = JSON.parse(readFileSync(join(rootDir, 'package.json'), 'utf-8'));
17
+ const packageVersion = packageJson.version;
18
+
19
+ // Read Cargo.toml version
20
+ const cargoToml = readFileSync(join(rootDir, 'cli/Cargo.toml'), 'utf-8');
21
+ const cargoVersionMatch = cargoToml.match(/^version\s*=\s*"([^"]*)"/m);
22
+
23
+ if (!cargoVersionMatch) {
24
+ console.error('Could not find version in cli/Cargo.toml');
25
+ process.exit(1);
26
+ }
27
+
28
+ const cargoVersion = cargoVersionMatch[1];
29
+
30
+ if (packageVersion !== cargoVersion) {
31
+ console.error('Version mismatch detected!');
32
+ console.error(` package.json: ${packageVersion}`);
33
+ console.error(` cli/Cargo.toml: ${cargoVersion}`);
34
+ console.error('');
35
+ console.error("Run 'pnpm run version:sync' to fix this.");
36
+ process.exit(1);
37
+ }
38
+
39
+ console.log(`Versions are in sync: ${packageVersion}`);
@@ -0,0 +1,35 @@
1
+ (() => {
2
+ const result = {
3
+ goodsContainerCount: 0,
4
+ sampleContainer: null,
5
+ allClasses: []
6
+ };
7
+
8
+ const containers = document.querySelectorAll('._goodsContainer_1p2ae_1');
9
+ result.goodsContainerCount = containers.length;
10
+
11
+ if (containers.length > 0) {
12
+ result.sampleContainer = {
13
+ className: containers[0].className,
14
+ innerHTML: containers[0].innerHTML.substring(0, 500),
15
+ text: containers[0].textContent?.substring(0, 200)
16
+ };
17
+ }
18
+
19
+ const allDivs = document.querySelectorAll('div');
20
+ const classSet = new Set();
21
+ allDivs.forEach(div => {
22
+ if (div.className) {
23
+ const classes = String(div.className).split(' ');
24
+ classes.forEach(c => {
25
+ if (c.includes('goods') || c.includes('item') || c.includes('product')) {
26
+ classSet.add(c);
27
+ }
28
+ });
29
+ }
30
+ });
31
+
32
+ result.allClasses = Array.from(classSet).slice(0, 20);
33
+
34
+ return result;
35
+ })()
@@ -0,0 +1,36 @@
1
+ (() => {
2
+ const result = {
3
+ visibleElements: [],
4
+ linksWithProductInClass: []
5
+ };
6
+
7
+ const allElements = document.querySelectorAll('*');
8
+ let count = 0;
9
+
10
+ for (const el of allElements) {
11
+ if (count >= 50) break;
12
+
13
+ const className = el.className ? String(el.className) : '';
14
+ const text = el.textContent?.trim() || '';
15
+
16
+ if ((className.includes('product') || className.includes('item') || className.includes('card')) && text.length > 10) {
17
+ result.visibleElements.push({
18
+ tagName: el.tagName,
19
+ className: className.substring(0, 100),
20
+ text: text.substring(0, 100)
21
+ });
22
+ count++;
23
+ }
24
+ }
25
+
26
+ const productLinks = document.querySelectorAll('a[href*="item.jd"], a[href*="product.jd"]');
27
+ productLinks.forEach((link, index) => {
28
+ if (index >= 10) return;
29
+ result.linksWithProductInClass.push({
30
+ href: link.href.substring(0, 100),
31
+ text: link.textContent?.substring(0, 50)
32
+ });
33
+ });
34
+
35
+ return result;
36
+ })()
@@ -0,0 +1,30 @@
1
+ (async () => {
2
+ const applauseRateEl = document.querySelector('.applause-rate');
3
+
4
+ if (applauseRateEl) {
5
+ applauseRateEl.click();
6
+
7
+ await new Promise(resolve => setTimeout(resolve, 3000));
8
+
9
+ const result = {
10
+ elementFound: true,
11
+ elementText: applauseRateEl.textContent,
12
+ popup: null
13
+ };
14
+
15
+ const popup = document.querySelector('[class*="popup"], [class*="modal"], [class*="dialog"]');
16
+ if (popup) {
17
+ result.popup = {
18
+ className: popup.className,
19
+ text: popup.textContent?.substring(0, 500)
20
+ };
21
+ }
22
+
23
+ return result;
24
+ } else {
25
+ return {
26
+ elementFound: false,
27
+ message: 'applause-rate element not found'
28
+ };
29
+ }
30
+ })()
@@ -0,0 +1,36 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Copies the compiled Rust binary to bin/ with platform-specific naming
5
+ */
6
+
7
+ import { copyFileSync, existsSync, mkdirSync } from 'fs';
8
+ import { dirname, join } from 'path';
9
+ import { fileURLToPath } from 'url';
10
+ import { platform, arch } from 'os';
11
+
12
+ const __dirname = dirname(fileURLToPath(import.meta.url));
13
+ const projectRoot = join(__dirname, '..');
14
+
15
+ const sourceExt = platform() === 'win32' ? '.exe' : '';
16
+ const sourcePath = join(projectRoot, `cli/target/release/agent-browser${sourceExt}`);
17
+ const binDir = join(projectRoot, 'bin');
18
+
19
+ // Determine platform suffix
20
+ const platformKey = `${platform()}-${arch()}`;
21
+ const ext = platform() === 'win32' ? '.exe' : '';
22
+ const targetName = `agent-browser-${platformKey}${ext}`;
23
+ const targetPath = join(binDir, targetName);
24
+
25
+ if (!existsSync(sourcePath)) {
26
+ console.error(`Error: Native binary not found at ${sourcePath}`);
27
+ console.error('Run "cargo build --release --manifest-path cli/Cargo.toml" first');
28
+ process.exit(1);
29
+ }
30
+
31
+ if (!existsSync(binDir)) {
32
+ mkdirSync(binDir, { recursive: true });
33
+ }
34
+
35
+ copyFileSync(sourcePath, targetPath);
36
+ console.log(`✓ Copied native binary to ${targetPath}`);
@@ -0,0 +1,21 @@
1
+ import { copyFileSync, mkdirSync, existsSync } from 'node:fs';
2
+ import path from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+
5
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
6
+ const rootDir = path.join(__dirname, '..');
7
+ const srcDir = path.join(rootDir, 'src', 'recorder');
8
+ const distDir = path.join(rootDir, 'dist', 'recorder');
9
+
10
+ // Ensure dist/recorder directory exists
11
+ if (!existsSync(distDir)) {
12
+ mkdirSync(distDir, { recursive: true });
13
+ }
14
+
15
+ // Copy inject.js
16
+ copyFileSync(
17
+ path.join(srcDir, 'inject.js'),
18
+ path.join(distDir, 'inject.js')
19
+ );
20
+
21
+ console.log('Copied recorder/inject.js to dist/recorder/inject.js');