@dyyz1993/agent-browser 0.9.2 → 0.11.1
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/dist/__tests__/utils/parseCli.d.ts +1 -0
- package/dist/__tests__/utils/parseCli.d.ts.map +1 -1
- package/dist/__tests__/utils/parseCli.js +18 -10
- package/dist/__tests__/utils/parseCli.js.map +1 -1
- package/dist/actions.d.ts.map +1 -1
- package/dist/actions.js +63 -3
- package/dist/actions.js.map +1 -1
- package/dist/browser.d.ts +46 -2
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +343 -13
- package/dist/browser.js.map +1 -1
- package/dist/cli/commands.d.ts.map +1 -1
- package/dist/cli/commands.js +8 -3
- package/dist/cli/commands.js.map +1 -1
- package/dist/cli/connection.d.ts.map +1 -1
- package/dist/cli/connection.js +39 -1
- package/dist/cli/connection.js.map +1 -1
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/help.js +27 -20
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/output.d.ts.map +1 -1
- package/dist/cli/output.js +5 -0
- package/dist/cli/output.js.map +1 -1
- package/dist/cli.js +20 -0
- package/dist/cli.js.map +1 -1
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +147 -1
- package/dist/daemon.js.map +1 -1
- package/dist/message-bridge.d.ts.map +1 -1
- package/dist/message-bridge.js +22 -4
- package/dist/message-bridge.js.map +1 -1
- package/dist/openapi.d.ts +22 -0
- package/dist/openapi.d.ts.map +1 -0
- package/dist/openapi.js +382 -0
- package/dist/openapi.js.map +1 -0
- package/dist/protocol.d.ts.map +1 -1
- package/dist/protocol.js +18 -0
- package/dist/protocol.js.map +1 -1
- package/dist/recorder/inject.js +61 -134
- package/dist/stream-server-standalone.d.ts +10 -0
- package/dist/stream-server-standalone.d.ts.map +1 -1
- package/dist/stream-server-standalone.js +594 -74
- package/dist/stream-server-standalone.js.map +1 -1
- package/dist/stream-server.d.ts +67 -2
- package/dist/stream-server.d.ts.map +1 -1
- package/dist/stream-server.js +371 -51
- package/dist/stream-server.js.map +1 -1
- package/dist/swagger-ui.d.ts +6 -0
- package/dist/swagger-ui.d.ts.map +1 -0
- package/dist/swagger-ui.js +51 -0
- package/dist/swagger-ui.js.map +1 -0
- package/dist/test-live.d.ts +2 -0
- package/dist/test-live.d.ts.map +1 -0
- package/dist/test-live.js +333 -0
- package/dist/test-live.js.map +1 -0
- package/dist/types.d.ts +7 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/viewer-html.d.ts.map +1 -1
- package/dist/viewer-html.js +270 -58
- package/dist/viewer-html.js.map +1 -1
- package/dist/viewer-script.d.ts +20 -2
- package/dist/viewer-script.d.ts.map +1 -1
- package/dist/viewer-script.js +911 -154
- package/dist/viewer-script.js.map +1 -1
- package/package.json +1 -1
- package/scripts/postinstall.js +6 -32
- package/scripts/test-cli-help.sh +51 -0
- package/scripts/verify-form.sh +67 -0
- package/scripts/verify-login.sh +65 -0
- package/scripts/verify-recording.sh +80 -0
- package/scripts/verify-upload.sh +41 -0
- package/skills/agent-browser/SKILL.md +297 -160
- package/skills/agent-browser/references/commands.md +3 -0
- package/skills/agent-browser/references/mobile-viewer.md +188 -0
- package/skills/agent-browser/references/network-monitoring.md +232 -0
- package/skills/agent-browser/references/recorder.md +319 -0
- package/skills/agent-browser/references/viewer-mode.md +148 -0
- package/skills/agent-browser/templates/api-interception.sh +3 -1
- package/skills/agent-browser/templates/data-extraction.sh +8 -4
- package/skills/agent-browser/templates/form-automation.sh +18 -23
- package/skills/agent-browser/templates/network-intercept-crawl.sh +256 -0
- package/skills/agent-browser/templates/recorder-workflow.sh +51 -0
- package/skills/agent-browser/templates/viewer-remote.sh +41 -0
- package/dist/__tests__/test-iframe.d.ts +0 -2
- package/dist/__tests__/test-iframe.d.ts.map +0 -1
- package/dist/__tests__/test-iframe.js +0 -52
- package/dist/__tests__/test-iframe.js.map +0 -1
- package/dist/cli-new.d.ts +0 -3
- package/dist/cli-new.d.ts.map +0 -1
- package/dist/cli-new.js +0 -308
- package/dist/cli-new.js.map +0 -1
- package/dist/cli-old.d.ts +0 -3
- package/dist/cli-old.d.ts.map +0 -1
- package/dist/cli-old.js +0 -1101
- package/dist/cli-old.js.map +0 -1
- package/dist/recorder/binding.d.ts +0 -24
- package/dist/recorder/binding.d.ts.map +0 -1
- package/dist/recorder/binding.js +0 -215
- package/dist/recorder/binding.js.map +0 -1
- package/dist/recorder/index.d.ts +0 -4
- package/dist/recorder/index.d.ts.map +0 -1
- package/dist/recorder/index.js +0 -4
- package/dist/recorder/index.js.map +0 -1
- package/dist/recorder/recorder.d.ts +0 -19
- package/dist/recorder/recorder.d.ts.map +0 -1
- package/dist/recorder/recorder.js +0 -101
- package/dist/recorder/recorder.js.map +0 -1
- package/dist/recorder/store.d.ts +0 -22
- package/dist/recorder/store.d.ts.map +0 -1
- package/dist/recorder/store.js +0 -150
- package/dist/recorder/store.js.map +0 -1
- package/dist/recorder/types.d.ts +0 -73
- package/dist/recorder/types.d.ts.map +0 -1
- package/dist/recorder/types.js +0 -5
- package/dist/recorder/types.js.map +0 -1
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Network Interception Data Collection Template
|
|
3
|
+
set -euo pipefail
|
|
4
|
+
# Usage: ./network-intercept-crawl.sh <url> <output-dir> [max-scrolls]
|
|
5
|
+
#
|
|
6
|
+
# This script demonstrates how to capture API data using network interception.
|
|
7
|
+
# It handles infinite scroll pages that load data via AJAX/fetch calls.
|
|
8
|
+
#
|
|
9
|
+
# Prerequisites:
|
|
10
|
+
# - agent-browser installed and in PATH
|
|
11
|
+
# - jq for JSON processing
|
|
12
|
+
#
|
|
13
|
+
# Environment Variables:
|
|
14
|
+
# SCROLL_CONTAINER - CSS selector for scroll container (default: auto-detect)
|
|
15
|
+
# SCROLL_DELAY - Seconds to wait after scroll (default: 2)
|
|
16
|
+
# MAX_NO_NEW - Stop after N scrolls with no new data (default: 3)
|
|
17
|
+
#
|
|
18
|
+
# Examples:
|
|
19
|
+
# ./network-intercept-crawl.sh https://example.com/feed ./output 20
|
|
20
|
+
# SCROLL_CONTAINER=".feed-list" ./network-intercept-crawl.sh https://example.com/products ./data
|
|
21
|
+
|
|
22
|
+
set -e
|
|
23
|
+
|
|
24
|
+
# Configuration
|
|
25
|
+
TARGET_URL="${1:-https://example.com}"
|
|
26
|
+
OUTPUT_DIR="${2:-./collected-data}"
|
|
27
|
+
MAX_SCROLLS="${3:-20}"
|
|
28
|
+
SCROLL_CONTAINER="${SCROLL_CONTAINER:-}" # CSS selector for scroll container (empty = auto-detect)
|
|
29
|
+
SCROLL_DELAY="${SCROLL_DELAY:-2}" # Seconds to wait after scroll
|
|
30
|
+
MAX_NO_NEW="${MAX_NO_NEW:-3}" # Stop after N scrolls with no new data
|
|
31
|
+
|
|
32
|
+
mkdir -p "$OUTPUT_DIR"
|
|
33
|
+
|
|
34
|
+
echo "=========================================="
|
|
35
|
+
echo " Network Interception Data Collection"
|
|
36
|
+
echo "=========================================="
|
|
37
|
+
echo " URL: $TARGET_URL"
|
|
38
|
+
echo " Output: $OUTPUT_DIR"
|
|
39
|
+
echo " Max scrolls: $MAX_SCROLLS"
|
|
40
|
+
echo "=========================================="
|
|
41
|
+
|
|
42
|
+
# Cleanup function
|
|
43
|
+
cleanup() {
|
|
44
|
+
echo ""
|
|
45
|
+
echo "[Cleanup] Closing browser..."
|
|
46
|
+
agent-browser kill 2>/dev/null || true
|
|
47
|
+
}
|
|
48
|
+
trap cleanup EXIT
|
|
49
|
+
|
|
50
|
+
# Step 1: Start fresh
|
|
51
|
+
echo ""
|
|
52
|
+
echo "[Step 1] Starting browser session..."
|
|
53
|
+
agent-browser kill 2>/dev/null || true
|
|
54
|
+
sleep 1
|
|
55
|
+
|
|
56
|
+
# Step 2: Enable network interception
|
|
57
|
+
echo "[Step 2] Enabling network request capture..."
|
|
58
|
+
agent-browser network requests --capture-response
|
|
59
|
+
|
|
60
|
+
# Step 3: Navigate to target page
|
|
61
|
+
echo "[Step 3] Opening target URL..."
|
|
62
|
+
agent-browser open "$TARGET_URL"
|
|
63
|
+
agent-browser wait --load networkidle
|
|
64
|
+
sleep 2
|
|
65
|
+
|
|
66
|
+
# Step 4: Auto-detect scroll container if not specified
|
|
67
|
+
if [ -z "$SCROLL_CONTAINER" ]; then
|
|
68
|
+
echo "[Step 4] Auto-detecting scroll container..."
|
|
69
|
+
DETECTED_CONTAINER=$(agent-browser eval --stdin <<'EOF'
|
|
70
|
+
(() => {
|
|
71
|
+
// Check for common scroll container patterns
|
|
72
|
+
const selectors = [
|
|
73
|
+
'.simulation-area',
|
|
74
|
+
'.feed-container',
|
|
75
|
+
'.scroll-container',
|
|
76
|
+
'[class*="scroll"]',
|
|
77
|
+
'[class*="feed"]',
|
|
78
|
+
'[class*="list"]',
|
|
79
|
+
'.content',
|
|
80
|
+
'main'
|
|
81
|
+
];
|
|
82
|
+
|
|
83
|
+
for (const sel of selectors) {
|
|
84
|
+
const el = document.querySelector(sel);
|
|
85
|
+
if (el && el.scrollHeight > el.clientHeight) {
|
|
86
|
+
return sel;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return ''; // Use window scroll
|
|
90
|
+
})()
|
|
91
|
+
EOF
|
|
92
|
+
)
|
|
93
|
+
# Extract container from JSON response
|
|
94
|
+
SCROLL_CONTAINER=$(echo "$DETECTED_CONTAINER" | jq -r '.' 2>/dev/null || echo "")
|
|
95
|
+
|
|
96
|
+
if [ -n "$SCROLL_CONTAINER" ] && [ "$SCROLL_CONTAINER" != "null" ] && [ "$SCROLL_CONTAINER" != "" ]; then
|
|
97
|
+
echo " Detected container: $SCROLL_CONTAINER"
|
|
98
|
+
else
|
|
99
|
+
echo " No container detected, using window scroll"
|
|
100
|
+
SCROLL_CONTAINER=""
|
|
101
|
+
fi
|
|
102
|
+
else
|
|
103
|
+
echo "[Step 4] Using specified container: $SCROLL_CONTAINER"
|
|
104
|
+
fi
|
|
105
|
+
|
|
106
|
+
# Step 5: Extract initial data
|
|
107
|
+
echo "[Step 5] Extracting initial captured requests..."
|
|
108
|
+
|
|
109
|
+
# Function to get all captured requests
|
|
110
|
+
get_all_requests() {
|
|
111
|
+
agent-browser network requests --capture-response --type json --json 2>/dev/null
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
# Function to count requests with response bodies
|
|
115
|
+
count_valid_requests() {
|
|
116
|
+
local json_data="$1"
|
|
117
|
+
echo "$json_data" | jq '.data.requests | map(select(.responseBody != null)) | length' 2>/dev/null || echo "0"
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
# Function to count unique IDs in data
|
|
121
|
+
count_unique_ids() {
|
|
122
|
+
local json_data="$1"
|
|
123
|
+
local id_field="${2:-id}"
|
|
124
|
+
echo "$json_data" | jq -c "[.data.requests[].responseBody | select(. != null) | .[]?.${id_field}] | unique | length" 2>/dev/null || echo "0"
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
# Initialize tracking - cumulative approach (no clearing!)
|
|
128
|
+
ALL_DATA_FILE="$OUTPUT_DIR/all-captures.json"
|
|
129
|
+
PROCESSED_COUNT=0 # Track how many requests we've already processed
|
|
130
|
+
|
|
131
|
+
# Get initial data
|
|
132
|
+
get_all_requests > "$ALL_DATA_FILE"
|
|
133
|
+
TOTAL_REQUESTS=$(count_valid_requests "$(cat "$ALL_DATA_FILE")")
|
|
134
|
+
INITIAL_IDS=$(count_unique_ids "$(cat "$ALL_DATA_FILE")")
|
|
135
|
+
PROCESSED_COUNT=$TOTAL_REQUESTS
|
|
136
|
+
|
|
137
|
+
echo " Initial capture: $TOTAL_REQUESTS requests, ~$INITIAL_IDS unique items"
|
|
138
|
+
echo " Using cumulative mode (no data loss from clearing)"
|
|
139
|
+
|
|
140
|
+
# Step 6: Scroll to load more data
|
|
141
|
+
echo ""
|
|
142
|
+
echo "[Step 6] Scrolling to load more data..."
|
|
143
|
+
|
|
144
|
+
NO_NEW_COUNT=0
|
|
145
|
+
SCROLL_COUNT=0
|
|
146
|
+
|
|
147
|
+
while [ $SCROLL_COUNT -lt $MAX_SCROLLS ]; do
|
|
148
|
+
SCROLL_COUNT=$((SCROLL_COUNT + 1))
|
|
149
|
+
|
|
150
|
+
# Perform scroll
|
|
151
|
+
if [ -n "$SCROLL_CONTAINER" ]; then
|
|
152
|
+
# Scroll within specific container
|
|
153
|
+
agent-browser eval --stdin <<EOF
|
|
154
|
+
(() => {
|
|
155
|
+
const container = document.querySelector('$SCROLL_CONTAINER');
|
|
156
|
+
if (container) {
|
|
157
|
+
container.scrollTop = container.scrollHeight;
|
|
158
|
+
return { scrolled: true, scrollTop: container.scrollTop };
|
|
159
|
+
}
|
|
160
|
+
return { scrolled: false, error: 'Container not found' };
|
|
161
|
+
})()
|
|
162
|
+
EOF
|
|
163
|
+
else
|
|
164
|
+
# Scroll the page
|
|
165
|
+
agent-browser scroll down 1000
|
|
166
|
+
fi
|
|
167
|
+
|
|
168
|
+
# Wait for new requests
|
|
169
|
+
sleep "$SCROLL_DELAY"
|
|
170
|
+
|
|
171
|
+
# Get ALL requests (cumulative, no clearing!)
|
|
172
|
+
get_all_requests > "$ALL_DATA_FILE"
|
|
173
|
+
|
|
174
|
+
# Count total requests now
|
|
175
|
+
NEW_TOTAL=$(count_valid_requests "$(cat "$ALL_DATA_FILE")")
|
|
176
|
+
|
|
177
|
+
# Calculate how many new requests we got (offset from last processed)
|
|
178
|
+
NEW_COUNT=$((NEW_TOTAL - PROCESSED_COUNT))
|
|
179
|
+
|
|
180
|
+
if [ "$NEW_COUNT" -le 0 ]; then
|
|
181
|
+
echo " Scroll $SCROLL_COUNT: No new requests captured (total: $NEW_TOTAL)"
|
|
182
|
+
NO_NEW_COUNT=$((NO_NEW_COUNT + 1))
|
|
183
|
+
|
|
184
|
+
if [ $NO_NEW_COUNT -ge $MAX_NO_NEW ]; then
|
|
185
|
+
echo ""
|
|
186
|
+
echo " [Stop] Consecutive $MAX_NO_NEW scrolls with no new data"
|
|
187
|
+
break
|
|
188
|
+
fi
|
|
189
|
+
else
|
|
190
|
+
echo " Scroll $SCROLL_COUNT: Captured $NEW_COUNT new requests (total: $NEW_TOTAL)"
|
|
191
|
+
|
|
192
|
+
# Extract only NEW requests using offset
|
|
193
|
+
if [ $PROCESSED_COUNT -gt 0 ]; then
|
|
194
|
+
jq ".data.requests[$PROCESSED_COUNT:]" "$ALL_DATA_FILE" > "$OUTPUT_DIR/scroll-${SCROLL_COUNT}-new.json" 2>/dev/null || true
|
|
195
|
+
else
|
|
196
|
+
jq '.data.requests' "$ALL_DATA_FILE" > "$OUTPUT_DIR/scroll-${SCROLL_COUNT}-new.json" 2>/dev/null || true
|
|
197
|
+
fi
|
|
198
|
+
|
|
199
|
+
# Update processed count
|
|
200
|
+
PROCESSED_COUNT=$NEW_TOTAL
|
|
201
|
+
NO_NEW_COUNT=0
|
|
202
|
+
fi
|
|
203
|
+
done
|
|
204
|
+
|
|
205
|
+
# Step 7: Extract and save final data
|
|
206
|
+
echo ""
|
|
207
|
+
echo "[Step 7] Processing collected data..."
|
|
208
|
+
|
|
209
|
+
# Extract response bodies from all captured requests
|
|
210
|
+
OUTPUT_DATA="$OUTPUT_DIR/collected-data.json"
|
|
211
|
+
jq '
|
|
212
|
+
.data.requests |
|
|
213
|
+
map(select(.responseBody != null)) |
|
|
214
|
+
map({
|
|
215
|
+
url: .url,
|
|
216
|
+
method: .method,
|
|
217
|
+
status: .status,
|
|
218
|
+
contentType: .contentType,
|
|
219
|
+
timestamp: .timestamp,
|
|
220
|
+
data: .responseBody
|
|
221
|
+
})
|
|
222
|
+
' "$ALL_DATA_FILE" > "$OUTPUT_DATA" 2>/dev/null || echo "[]" > "$OUTPUT_DATA"
|
|
223
|
+
|
|
224
|
+
TOTAL_ITEMS=$(jq 'map(select(.data != null and .data != [])) | length' "$OUTPUT_DATA")
|
|
225
|
+
UNIQUE_IDS=$(count_unique_ids "$(cat "$ALL_DATA_FILE")")
|
|
226
|
+
|
|
227
|
+
echo " Total API responses captured: $TOTAL_ITEMS"
|
|
228
|
+
echo " Unique items identified: $UNIQUE_IDS"
|
|
229
|
+
|
|
230
|
+
# Save summary
|
|
231
|
+
SUMMARY_FILE="$OUTPUT_DIR/summary.json"
|
|
232
|
+
jq -n "
|
|
233
|
+
{
|
|
234
|
+
collectedAt: \"$(date -Iseconds)\",
|
|
235
|
+
targetUrl: \"$TARGET_URL\",
|
|
236
|
+
scrollContainer: \"$SCROLL_CONTAINER\",
|
|
237
|
+
totalScrolls: $SCROLL_COUNT,
|
|
238
|
+
totalRequests: $TOTAL_ITEMS,
|
|
239
|
+
uniqueItems: $UNIQUE_IDS,
|
|
240
|
+
mode: \"cumulative-no-clear\",
|
|
241
|
+
outputFiles: [
|
|
242
|
+
\"collected-data.json\",
|
|
243
|
+
\"all-captures.json\"
|
|
244
|
+
]
|
|
245
|
+
}
|
|
246
|
+
" > "$SUMMARY_FILE"
|
|
247
|
+
|
|
248
|
+
echo ""
|
|
249
|
+
echo "=========================================="
|
|
250
|
+
echo " Collection Complete"
|
|
251
|
+
echo "=========================================="
|
|
252
|
+
echo " Output directory: $OUTPUT_DIR"
|
|
253
|
+
echo " Total responses: $TOTAL_ITEMS"
|
|
254
|
+
echo " Files created:"
|
|
255
|
+
ls -la "$OUTPUT_DIR"
|
|
256
|
+
echo "=========================================="
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Template: Recorder Workflow
|
|
3
|
+
# Purpose: Record browser actions, save as YAML, replay later
|
|
4
|
+
# Usage: ./recorder-workflow.sh [url] [output.yaml]
|
|
5
|
+
#
|
|
6
|
+
# Records your interactions into a replayable YAML workflow file.
|
|
7
|
+
# Useful for test automation, demo creation, and regression testing.
|
|
8
|
+
|
|
9
|
+
set -euo pipefail
|
|
10
|
+
|
|
11
|
+
URL="${1:?https://example.com/form}"
|
|
12
|
+
OUTPUT="${2:-recording-$(date +%Y%m%d-%H%M%S).yaml}"
|
|
13
|
+
SESSION="record-$(date +%s)"
|
|
14
|
+
|
|
15
|
+
echo "=== Recorder Workflow: $URL ==="
|
|
16
|
+
|
|
17
|
+
# Step 1: Start recording
|
|
18
|
+
agent-browser recorder start --session "$SESSION"
|
|
19
|
+
echo "Recording started on session: $SESSION"
|
|
20
|
+
|
|
21
|
+
# Step 2: Navigate and perform workflow
|
|
22
|
+
agent-browser --session "$SESSION" open "$URL"
|
|
23
|
+
agent-browser --session "$SESSION" wait --load networkidle
|
|
24
|
+
|
|
25
|
+
echo ""
|
|
26
|
+
echo "Form structure (copy refs from below):"
|
|
27
|
+
agent-browser --session "$SESSION" snapshot -i
|
|
28
|
+
|
|
29
|
+
# Step 3: Perform your actions here (uncomment/customize):
|
|
30
|
+
#
|
|
31
|
+
# agent-browser --session "$SESSION" fill @e1 "user@example.com"
|
|
32
|
+
# agent-browser --session "$SESSION" fill @e2 "password123"
|
|
33
|
+
# agent-browser --session "$SESSION" click @e3
|
|
34
|
+
# agent-browser --session "$SESSION" wait --load networkidle
|
|
35
|
+
# agent-browser --session "$SESSION" snapshot -i # Verify
|
|
36
|
+
|
|
37
|
+
echo ""
|
|
38
|
+
echo "Waiting ${TIMEOUT:-10}s before stopping recording..."
|
|
39
|
+
sleep "${TIMEOUT:-10}"
|
|
40
|
+
|
|
41
|
+
# Step 4: Stop recording and save
|
|
42
|
+
agent-browser recorder stop --session "$SESSION" --output "$OUTPUT"
|
|
43
|
+
echo ""
|
|
44
|
+
echo "Saved recording to: $OUTPUT"
|
|
45
|
+
echo ""
|
|
46
|
+
echo "To replay:"
|
|
47
|
+
echo " agent-browser recorder replay $OUTPUT"
|
|
48
|
+
|
|
49
|
+
# Cleanup
|
|
50
|
+
agent-browser --session "$SESSION" close
|
|
51
|
+
echo "Done"
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Template: Viewer Remote Control Workflow
|
|
3
|
+
# Purpose: Open browser, start viewer, interact remotely via streaming UI
|
|
4
|
+
# Usage: ./viewer-remote.sh [url] [timeout-seconds]
|
|
5
|
+
#
|
|
6
|
+
# The viewer streams real-time browser frames to your local browser.
|
|
7
|
+
# On touch devices, you get touchpad + input panel for mobile control.
|
|
8
|
+
|
|
9
|
+
set -euo pipefail
|
|
10
|
+
|
|
11
|
+
URL="${1:?https://www.baidu.com}"
|
|
12
|
+
TIMEOUT="${2:-300}"
|
|
13
|
+
SESSION="viewer-$(date +%s)"
|
|
14
|
+
|
|
15
|
+
echo "=== Viewer Remote Control: $URL ==="
|
|
16
|
+
|
|
17
|
+
# Step 1: Launch browser (headed so you can see it locally too)
|
|
18
|
+
agent-browser --session "$SESSION" --headed open "$URL"
|
|
19
|
+
agent-browser --session "$SESSION" wait --load networkidle
|
|
20
|
+
|
|
21
|
+
# Step 2: Start viewer and get connection URL
|
|
22
|
+
VIEWER_INFO=$(agent-browser --session "$SESSION" viewer --json)
|
|
23
|
+
echo "Viewer info: $VIEWER_INFO"
|
|
24
|
+
|
|
25
|
+
# Extract URL (requires jq)
|
|
26
|
+
VIEWER_URL=$(echo "$VIEWER_INFO" | jq -r '.url // 2>/dev/null || echo "Check port 5005 manually")
|
|
27
|
+
echo ""
|
|
28
|
+
echo "Open this URL in your browser:"
|
|
29
|
+
echo " $VIEWER_URL"
|
|
30
|
+
echo ""
|
|
31
|
+
echo "Tips:"
|
|
32
|
+
echo " - Desktop: Click/drag/scroll on the streamed screen area"
|
|
33
|
+
echo " - Mobile: Use touchpad at bottom for cursor, tap inputs for text panel"
|
|
34
|
+
echo " - Tap a remote input field to open mobile text input"
|
|
35
|
+
echo ""
|
|
36
|
+
echo "Viewer will auto-close after ${TIMEOUT}s..."
|
|
37
|
+
sleep "$TIMEOUT"
|
|
38
|
+
|
|
39
|
+
# Cleanup
|
|
40
|
+
agent-browser --session "$SESSION" close
|
|
41
|
+
echo "Done"
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"test-iframe.d.ts","sourceRoot":"","sources":["../../src/__tests__/test-iframe.ts"],"names":[],"mappings":""}
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
import { chromium } from 'playwright-core';
|
|
2
|
-
async function test() {
|
|
3
|
-
const browser = await chromium.launch({ headless: true });
|
|
4
|
-
const context = await browser.newContext();
|
|
5
|
-
const page = await context.newPage();
|
|
6
|
-
// Listen for frame navigated events
|
|
7
|
-
page.on('framenavigated', (frame) => {
|
|
8
|
-
console.log('Frame navigated:', frame.url());
|
|
9
|
-
});
|
|
10
|
-
// Listen for console events
|
|
11
|
-
page.on('console', (msg) => {
|
|
12
|
-
console.log('Console:', msg.type(), msg.text());
|
|
13
|
-
});
|
|
14
|
-
// Listen for page errors
|
|
15
|
-
page.on('pageerror', (error) => {
|
|
16
|
-
console.log('Page error:', error.message);
|
|
17
|
-
});
|
|
18
|
-
// Listen for request failed
|
|
19
|
-
page.on('requestfailed', (request) => {
|
|
20
|
-
console.log('Request failed:', request.url(), request.failure()?.errorText);
|
|
21
|
-
});
|
|
22
|
-
await page.goto('https://www.example.com');
|
|
23
|
-
// Check CSP headers
|
|
24
|
-
const response = await page.evaluate(() => {
|
|
25
|
-
return {
|
|
26
|
-
csp: document.querySelector('meta[http-equiv="Content-Security-Policy"]')?.getAttribute('content'),
|
|
27
|
-
xFrameOptions: document.querySelector('meta[http-equiv="X-Frame-Options"]')?.getAttribute('content'),
|
|
28
|
-
};
|
|
29
|
-
});
|
|
30
|
-
console.log('CSP info:', response);
|
|
31
|
-
// Create iframe using DOM methods
|
|
32
|
-
await page.evaluate(() => {
|
|
33
|
-
const iframe = document.createElement('iframe');
|
|
34
|
-
iframe.id = 'cross-frame';
|
|
35
|
-
iframe.src = 'https://www.iana.org/domains/example';
|
|
36
|
-
iframe.width = '800';
|
|
37
|
-
iframe.height = '400';
|
|
38
|
-
document.body.appendChild(iframe);
|
|
39
|
-
});
|
|
40
|
-
// Wait for frame to be attached
|
|
41
|
-
await page.waitForSelector('#cross-frame');
|
|
42
|
-
// Wait longer
|
|
43
|
-
await page.waitForTimeout(5000);
|
|
44
|
-
// Check all frames
|
|
45
|
-
console.log('\n=== All frames ===');
|
|
46
|
-
const mainFrame = page.mainFrame();
|
|
47
|
-
console.log('Main frame URL:', mainFrame.url());
|
|
48
|
-
console.log('Child frames:', mainFrame.childFrames().map(f => ({ url: f.url(), name: f.name() })));
|
|
49
|
-
await browser.close();
|
|
50
|
-
}
|
|
51
|
-
test().catch(console.error);
|
|
52
|
-
//# sourceMappingURL=test-iframe.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"test-iframe.js","sourceRoot":"","sources":["../../src/__tests__/test-iframe.ts"],"names":[],"mappings":"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"}
|
package/dist/cli-new.d.ts
DELETED
package/dist/cli-new.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cli-new.d.ts","sourceRoot":"","sources":["../src/cli-new.ts"],"names":[],"mappings":""}
|