@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
|
@@ -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');
|