@dyyz1993/agent-browser 0.28.0 → 0.29.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/actions/context.d.ts +4 -0
- package/dist/actions/context.d.ts.map +1 -1
- package/dist/actions/context.js +41 -1
- package/dist/actions/context.js.map +1 -1
- package/dist/actions/index.d.ts.map +1 -1
- package/dist/actions/index.js +164 -297
- package/dist/actions/index.js.map +1 -1
- package/dist/actions/interaction.d.ts.map +1 -1
- package/dist/actions/interaction.js +96 -30
- package/dist/actions/interaction.js.map +1 -1
- package/dist/actions/touch.d.ts +25 -0
- package/dist/actions/touch.d.ts.map +1 -0
- package/dist/actions/touch.js +114 -0
- package/dist/actions/touch.js.map +1 -0
- package/dist/browser/browser-manager.d.ts +15 -0
- package/dist/browser/browser-manager.d.ts.map +1 -1
- package/dist/browser/browser-manager.js +75 -7
- package/dist/browser/browser-manager.js.map +1 -1
- package/dist/browser/network-analysis.d.ts +65 -0
- package/dist/browser/network-analysis.d.ts.map +1 -0
- package/dist/browser/network-analysis.js +359 -0
- package/dist/browser/network-analysis.js.map +1 -0
- package/dist/browser/network-tracker.d.ts +4 -0
- package/dist/browser/network-tracker.d.ts.map +1 -1
- package/dist/browser/network-tracker.js +41 -0
- package/dist/browser/network-tracker.js.map +1 -1
- package/dist/browser/popup-detector.d.ts +22 -0
- package/dist/browser/popup-detector.d.ts.map +1 -0
- package/dist/browser/popup-detector.js +138 -0
- package/dist/browser/popup-detector.js.map +1 -0
- package/dist/cli/commands/index.d.ts +5 -0
- package/dist/cli/commands/index.d.ts.map +1 -0
- package/dist/cli/commands/index.js +219 -0
- package/dist/cli/commands/index.js.map +1 -0
- package/dist/cli/commands/interact.d.ts +7 -0
- package/dist/cli/commands/interact.d.ts.map +1 -0
- package/dist/cli/commands/interact.js +371 -0
- package/dist/cli/commands/interact.js.map +1 -0
- package/dist/cli/commands/navigate.d.ts +4 -0
- package/dist/cli/commands/navigate.d.ts.map +1 -0
- package/dist/cli/commands/navigate.js +46 -0
- package/dist/cli/commands/navigate.js.map +1 -0
- package/dist/cli/commands/network.d.ts +3 -0
- package/dist/cli/commands/network.d.ts.map +1 -0
- package/dist/cli/commands/network.js +292 -0
- package/dist/cli/commands/network.js.map +1 -0
- package/dist/cli/commands/plugin.d.ts +3 -0
- package/dist/cli/commands/plugin.d.ts.map +1 -0
- package/dist/cli/commands/plugin.js +84 -0
- package/dist/cli/commands/plugin.js.map +1 -0
- package/dist/cli/commands/query.d.ts +7 -0
- package/dist/cli/commands/query.d.ts.map +1 -0
- package/dist/cli/commands/query.js +333 -0
- package/dist/cli/commands/query.js.map +1 -0
- package/dist/cli/commands/session.d.ts +3 -0
- package/dist/cli/commands/session.d.ts.map +1 -0
- package/dist/cli/commands/session.js +372 -0
- package/dist/cli/commands/session.js.map +1 -0
- package/dist/cli/commands/shared.d.ts +24 -0
- package/dist/cli/commands/shared.d.ts.map +1 -0
- package/dist/cli/commands/shared.js +113 -0
- package/dist/cli/commands/shared.js.map +1 -0
- package/dist/cli/commands.d.ts +1 -7
- package/dist/cli/commands.d.ts.map +1 -1
- package/dist/cli/commands.js +1 -1684
- package/dist/cli/commands.js.map +1 -1
- package/dist/cli/connection.d.ts.map +1 -1
- package/dist/cli/connection.js +9 -1
- package/dist/cli/connection.js.map +1 -1
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/help.js +1 -24
- package/dist/cli/help.js.map +1 -1
- package/dist/cli.js +2 -2
- package/dist/cli.js.map +1 -1
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +21 -1
- package/dist/daemon.js.map +1 -1
- package/dist/diff.d.ts +4 -0
- package/dist/diff.d.ts.map +1 -1
- package/dist/diff.js +16 -0
- package/dist/diff.js.map +1 -1
- package/dist/flow/exporters/cypress.js +1 -1
- package/dist/flow/exporters/cypress.js.map +1 -1
- package/dist/flow/exporters/selenium.js +1 -1
- package/dist/flow/exporters/selenium.js.map +1 -1
- package/dist/openapi.d.ts.map +1 -1
- package/dist/openapi.js +2 -1
- package/dist/openapi.js.map +1 -1
- package/dist/plugins/registry.d.ts.map +1 -1
- package/dist/plugins/registry.js +4 -1
- package/dist/plugins/registry.js.map +1 -1
- package/dist/plugins/types.d.ts +4 -4
- package/dist/plugins/types.d.ts.map +1 -1
- package/dist/protocol.d.ts.map +1 -1
- package/dist/protocol.js +30 -7
- package/dist/protocol.js.map +1 -1
- package/dist/snapshot/constants.d.ts +6 -0
- package/dist/snapshot/constants.d.ts.map +1 -0
- package/dist/snapshot/constants.js +77 -0
- package/dist/snapshot/constants.js.map +1 -0
- package/dist/snapshot/dom-scripts.d.ts +12 -0
- package/dist/snapshot/dom-scripts.d.ts.map +1 -0
- package/dist/snapshot/dom-scripts.js +438 -0
- package/dist/snapshot/dom-scripts.js.map +1 -0
- package/dist/snapshot/format.d.ts +13 -0
- package/dist/snapshot/format.d.ts.map +1 -0
- package/dist/snapshot/format.js +175 -0
- package/dist/snapshot/format.js.map +1 -0
- package/dist/snapshot/index.d.ts +6 -0
- package/dist/snapshot/index.d.ts.map +1 -0
- package/dist/snapshot/index.js +5 -0
- package/dist/snapshot/index.js.map +1 -0
- package/dist/snapshot/refs.d.ts +3 -0
- package/dist/snapshot/refs.d.ts.map +1 -0
- package/dist/snapshot/refs.js +8 -0
- package/dist/snapshot/refs.js.map +1 -0
- package/dist/snapshot/selectors.d.ts +17 -0
- package/dist/snapshot/selectors.d.ts.map +1 -0
- package/dist/snapshot/selectors.js +619 -0
- package/dist/snapshot/selectors.js.map +1 -0
- package/dist/snapshot/snapshot.d.ts +12 -0
- package/dist/snapshot/snapshot.d.ts.map +1 -0
- package/dist/snapshot/snapshot.js +104 -0
- package/dist/snapshot/snapshot.js.map +1 -0
- package/dist/snapshot/types.d.ts +27 -0
- package/dist/snapshot/types.d.ts.map +1 -0
- package/dist/snapshot/types.js +2 -0
- package/dist/snapshot/types.js.map +1 -0
- package/dist/snapshot.d.ts +1 -79
- package/dist/snapshot.d.ts.map +1 -1
- package/dist/snapshot.js +1 -1800
- package/dist/snapshot.js.map +1 -1
- package/dist/stream/client-state.d.ts +13 -0
- package/dist/stream/client-state.d.ts.map +1 -0
- package/dist/stream/client-state.js +2 -0
- package/dist/stream/client-state.js.map +1 -0
- package/dist/stream/element-utils.d.ts +8 -0
- package/dist/stream/element-utils.d.ts.map +1 -0
- package/dist/stream/element-utils.js +25 -0
- package/dist/stream/element-utils.js.map +1 -0
- package/dist/stream/frame-processor.d.ts +63 -0
- package/dist/stream/frame-processor.d.ts.map +1 -0
- package/dist/stream/frame-processor.js +178 -0
- package/dist/stream/frame-processor.js.map +1 -0
- package/dist/stream/index.d.ts +10 -0
- package/dist/stream/index.d.ts.map +1 -0
- package/dist/stream/index.js +5 -0
- package/dist/stream/index.js.map +1 -0
- package/dist/stream/input-handler.d.ts +10 -0
- package/dist/stream/input-handler.d.ts.map +1 -0
- package/dist/stream/input-handler.js +81 -0
- package/dist/stream/input-handler.js.map +1 -0
- package/dist/stream/messages.d.ts +144 -0
- package/dist/stream/messages.d.ts.map +1 -0
- package/dist/stream/messages.js +46 -0
- package/dist/stream/messages.js.map +1 -0
- package/dist/stream-server-standalone.d.ts +0 -3
- package/dist/stream-server-standalone.d.ts.map +1 -1
- package/dist/stream-server-standalone.js +22 -82
- package/dist/stream-server-standalone.js.map +1 -1
- package/dist/stream-server.d.ts +8 -212
- package/dist/stream-server.d.ts.map +1 -1
- package/dist/stream-server.js +35 -389
- package/dist/stream-server.js.map +1 -1
- package/dist/types/base.d.ts +11 -0
- package/dist/types/base.d.ts.map +1 -0
- package/dist/types/base.js +2 -0
- package/dist/types/base.js.map +1 -0
- package/dist/types/browser.d.ts +26 -0
- package/dist/types/browser.d.ts.map +1 -0
- package/dist/types/browser.js +2 -0
- package/dist/types/browser.js.map +1 -0
- package/dist/types/commands.d.ts +768 -0
- package/dist/types/commands.d.ts.map +1 -0
- package/dist/types/commands.js +2 -0
- package/dist/types/commands.js.map +1 -0
- package/dist/types/crawl.d.ts +89 -0
- package/dist/types/crawl.d.ts.map +1 -0
- package/dist/types/crawl.js +2 -0
- package/dist/types/crawl.js.map +1 -0
- package/dist/types/index.d.ts +9 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +9 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/interact.d.ts +61 -0
- package/dist/types/interact.d.ts.map +1 -0
- package/dist/types/interact.js +2 -0
- package/dist/types/interact.js.map +1 -0
- package/dist/types/plugins.d.ts +39 -0
- package/dist/types/plugins.d.ts.map +1 -0
- package/dist/types/plugins.js +2 -0
- package/dist/types/plugins.js.map +1 -0
- package/dist/types/responses.d.ts +140 -0
- package/dist/types/responses.d.ts.map +1 -0
- package/dist/types/responses.js +4 -0
- package/dist/types/responses.js.map +1 -0
- package/dist/types/utils.d.ts +12 -0
- package/dist/types/utils.d.ts.map +1 -0
- package/dist/types/utils.js +2 -0
- package/dist/types/utils.js.map +1 -0
- package/dist/types.d.ts +1 -1125
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -3
- package/dist/types.js.map +1 -1
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +31 -0
- package/dist/version.js.map +1 -0
- package/package.json +11 -11
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import type { StreamState } from './frame-processor.js';
|
|
2
|
+
import type { Command } from '../types.js';
|
|
3
|
+
export declare function isAllowedOrigin(origin: string | undefined): boolean;
|
|
4
|
+
export interface FrameMessage {
|
|
5
|
+
type: 'frame';
|
|
6
|
+
metadata: {
|
|
7
|
+
offsetTop: number;
|
|
8
|
+
pageScaleFactor: number;
|
|
9
|
+
deviceWidth: number;
|
|
10
|
+
deviceHeight: number;
|
|
11
|
+
scrollOffsetX: number;
|
|
12
|
+
scrollOffsetY: number;
|
|
13
|
+
timestamp?: number;
|
|
14
|
+
};
|
|
15
|
+
format: 'jpeg' | 'webp';
|
|
16
|
+
fps: number;
|
|
17
|
+
state: StreamState;
|
|
18
|
+
}
|
|
19
|
+
export interface InputMouseMessage {
|
|
20
|
+
type: 'input_mouse';
|
|
21
|
+
eventType: 'mousePressed' | 'mouseReleased' | 'mouseMoved' | 'mouseWheel';
|
|
22
|
+
x: number;
|
|
23
|
+
y: number;
|
|
24
|
+
button?: 'left' | 'right' | 'middle' | 'none';
|
|
25
|
+
clickCount?: number;
|
|
26
|
+
deltaX?: number;
|
|
27
|
+
deltaY?: number;
|
|
28
|
+
modifiers?: number;
|
|
29
|
+
}
|
|
30
|
+
export interface InputKeyboardMessage {
|
|
31
|
+
type: 'input_keyboard';
|
|
32
|
+
eventType: 'keyDown' | 'keyUp' | 'rawKeyDown' | 'char';
|
|
33
|
+
key?: string;
|
|
34
|
+
code?: string;
|
|
35
|
+
text?: string;
|
|
36
|
+
modifiers?: number;
|
|
37
|
+
}
|
|
38
|
+
export interface InputTouchMessage {
|
|
39
|
+
type: 'input_touch';
|
|
40
|
+
eventType: 'touchStart' | 'touchEnd' | 'touchMove' | 'touchCancel';
|
|
41
|
+
touchPoints: Array<{
|
|
42
|
+
x: number;
|
|
43
|
+
y: number;
|
|
44
|
+
id?: number;
|
|
45
|
+
}>;
|
|
46
|
+
modifiers?: number;
|
|
47
|
+
}
|
|
48
|
+
export interface InputTextMessage {
|
|
49
|
+
type: 'input_text';
|
|
50
|
+
text: string;
|
|
51
|
+
}
|
|
52
|
+
export interface KeyboardDownMessage {
|
|
53
|
+
type: 'keyboard_down';
|
|
54
|
+
key: string;
|
|
55
|
+
}
|
|
56
|
+
export interface KeyboardUpMessage {
|
|
57
|
+
type: 'keyboard_up';
|
|
58
|
+
key: string;
|
|
59
|
+
}
|
|
60
|
+
export interface KeyboardInsertTextMessage {
|
|
61
|
+
type: 'keyboard_insert_text';
|
|
62
|
+
text: string;
|
|
63
|
+
}
|
|
64
|
+
export interface InputFillMessage {
|
|
65
|
+
type: 'input_fill';
|
|
66
|
+
selector?: string;
|
|
67
|
+
text?: string;
|
|
68
|
+
}
|
|
69
|
+
export interface InputBlurElementMessage {
|
|
70
|
+
type: 'input_blur_element';
|
|
71
|
+
selector?: string;
|
|
72
|
+
}
|
|
73
|
+
export interface StatusMessage {
|
|
74
|
+
type: 'status';
|
|
75
|
+
connected: boolean;
|
|
76
|
+
screencasting: boolean;
|
|
77
|
+
viewportWidth?: number;
|
|
78
|
+
viewportHeight?: number;
|
|
79
|
+
fps?: number;
|
|
80
|
+
state?: StreamState;
|
|
81
|
+
element?: {
|
|
82
|
+
selector: string;
|
|
83
|
+
x: number;
|
|
84
|
+
y: number;
|
|
85
|
+
width: number;
|
|
86
|
+
height: number;
|
|
87
|
+
};
|
|
88
|
+
degraded?: boolean;
|
|
89
|
+
version?: string;
|
|
90
|
+
}
|
|
91
|
+
export interface ErrorMessage {
|
|
92
|
+
type: 'error';
|
|
93
|
+
message: string;
|
|
94
|
+
}
|
|
95
|
+
export interface TabCreatedMessage {
|
|
96
|
+
type: 'tab_created';
|
|
97
|
+
data: {
|
|
98
|
+
index: number;
|
|
99
|
+
url: string;
|
|
100
|
+
title: string;
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
export interface TabClosedMessage {
|
|
104
|
+
type: 'tab_closed';
|
|
105
|
+
data: {
|
|
106
|
+
index: number;
|
|
107
|
+
remainingTabs: number;
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
export interface TabSwitchedMessage {
|
|
111
|
+
type: 'tab_switched';
|
|
112
|
+
data: {
|
|
113
|
+
fromIndex: number;
|
|
114
|
+
toIndex: number;
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
export interface NavigationMessage {
|
|
118
|
+
type: 'navigation';
|
|
119
|
+
data: {
|
|
120
|
+
url: string;
|
|
121
|
+
title: string;
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
export interface UserActivityMessage {
|
|
125
|
+
type: 'user_activity';
|
|
126
|
+
}
|
|
127
|
+
export interface InputFocusedMessage {
|
|
128
|
+
type: 'input_focused';
|
|
129
|
+
tag: string;
|
|
130
|
+
inputType: string;
|
|
131
|
+
value: string;
|
|
132
|
+
placeholder: string;
|
|
133
|
+
id: string;
|
|
134
|
+
}
|
|
135
|
+
export interface InputValueMessage {
|
|
136
|
+
type: 'input_value';
|
|
137
|
+
text: string;
|
|
138
|
+
}
|
|
139
|
+
export interface InputBlurMessage {
|
|
140
|
+
type: 'input_blur';
|
|
141
|
+
}
|
|
142
|
+
export type StreamMessage = FrameMessage | InputMouseMessage | InputKeyboardMessage | InputTouchMessage | InputTextMessage | KeyboardDownMessage | KeyboardUpMessage | KeyboardInsertTextMessage | InputFocusedMessage | InputValueMessage | InputBlurMessage | InputFillMessage | InputBlurElementMessage | StatusMessage | ErrorMessage | TabCreatedMessage | TabClosedMessage | TabSwitchedMessage | NavigationMessage | UserActivityMessage | Command;
|
|
143
|
+
export declare function isCommandMessage(msg: StreamMessage): msg is Command;
|
|
144
|
+
//# sourceMappingURL=messages.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../src/stream/messages.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
function isPrivateIP(hostname) {
|
|
2
|
+
const parts = hostname.split('.').map(Number);
|
|
3
|
+
if (parts.length === 4 && parts.every((p) => !isNaN(p))) {
|
|
4
|
+
const [a, b] = parts;
|
|
5
|
+
if (a === 10)
|
|
6
|
+
return true;
|
|
7
|
+
if (a === 172 && b >= 16 && b <= 31)
|
|
8
|
+
return true;
|
|
9
|
+
if (a === 192 && b === 168)
|
|
10
|
+
return true;
|
|
11
|
+
if (a === 127)
|
|
12
|
+
return true;
|
|
13
|
+
if (a === 0)
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
const lower = hostname.toLowerCase();
|
|
17
|
+
if (lower === '::1' || lower === '[::1]' || lower === '::' || lower === 'localhost')
|
|
18
|
+
return true;
|
|
19
|
+
if (lower.startsWith('fc') || lower.startsWith('fd') || lower.startsWith('fe80'))
|
|
20
|
+
return true;
|
|
21
|
+
if (hostname === 'localhost')
|
|
22
|
+
return true;
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
export function isAllowedOrigin(origin) {
|
|
26
|
+
if (!origin) {
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
if (origin.startsWith('file://')) {
|
|
30
|
+
return true;
|
|
31
|
+
}
|
|
32
|
+
try {
|
|
33
|
+
const url = new URL(origin);
|
|
34
|
+
if (isPrivateIP(url.hostname)) {
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
// Invalid origin URL - reject
|
|
40
|
+
}
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
export function isCommandMessage(msg) {
|
|
44
|
+
return 'id' in msg && 'action' in msg && !('type' in msg);
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=messages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messages.js","sourceRoot":"","sources":["../../src/stream/messages.ts"],"names":[],"mappings":"AAGA,SAAS,WAAW,CAAC,QAAgB;IACnC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC9C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACxD,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC;QACrB,IAAI,CAAC,KAAK,EAAE;YAAE,OAAO,IAAI,CAAC;QAC1B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;YAAE,OAAO,IAAI,CAAC;QACjD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG;YAAE,OAAO,IAAI,CAAC;QACxC,IAAI,CAAC,KAAK,GAAG;YAAE,OAAO,IAAI,CAAC;QAC3B,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;IAC3B,CAAC;IAED,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IACrC,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,WAAW;QAAE,OAAO,IAAI,CAAC;IACjG,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IAC9F,IAAI,QAAQ,KAAK,WAAW;QAAE,OAAO,IAAI,CAAC;IAE1C,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAA0B;IACxD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;QAC5B,IAAI,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,8BAA8B;IAChC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAsKD,MAAM,UAAU,gBAAgB,CAAC,GAAkB;IACjD,OAAO,IAAI,IAAI,GAAG,IAAI,QAAQ,IAAI,GAAG,IAAI,CAAC,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC;AAC5D,CAAC"}
|
|
@@ -30,9 +30,6 @@ declare class StreamServerStandalone {
|
|
|
30
30
|
private broadcastStatus;
|
|
31
31
|
private sendStatus;
|
|
32
32
|
private getTotalClientCount;
|
|
33
|
-
/**
|
|
34
|
-
* Send a command to the daemon via Unix socket and return the response
|
|
35
|
-
*/
|
|
36
33
|
private sendCommandToDaemon;
|
|
37
34
|
private getPidFile;
|
|
38
35
|
private getIpcPath;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stream-server-standalone.d.ts","sourceRoot":"","sources":["../src/stream-server-standalone.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"stream-server-standalone.d.ts","sourceRoot":"","sources":["../src/stream-server-standalone.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAMpD,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAmCD,cAAM,sBAAsB;IAC1B,OAAO,CAAC,GAAG,CAAgC;IAC3C,OAAO,CAAC,UAAU,CAA4B;IAC9C,OAAO,CAAC,SAAS,CAA2B;IAC5C,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,QAAQ,CAAuC;IACvD,OAAO,CAAC,OAAO,CAA0C;IACzD,OAAO,CAAC,aAAa,CAAsC;IAC3D,OAAO,CAAC,eAAe,CAAsC;IAC7D,OAAO,CAAC,YAAY,CAA8D;IAClF,OAAO,CAAC,mBAAmB,CAAkC;IAC7D,OAAO,CAAC,YAAY,CAA4D;IAChF,OAAO,CAAC,YAAY,CAA0C;IAC9D,OAAO,CAAC,EAAE,cAAc,CAAC;gBAEb,IAAI,GAAE,MAA4B;YAIhC,kBAAkB;IA6B1B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAsBd,WAAW;IAoTzB,OAAO,CAAC,yBAAyB;IAkHjC,OAAO,CAAC,mBAAmB;IAkD3B,OAAO,CAAC,iBAAiB;YAkBX,gBAAgB;YAiDhB,cAAc;IAyB5B,OAAO,CAAC,mBAAmB;YAsCb,gBAAgB;IAmG9B,OAAO,CAAC,eAAe;YA6GT,cAAc;IAgG5B,OAAO,CAAC,eAAe;IAiCvB,OAAO,CAAC,UAAU;IA+BlB,OAAO,CAAC,mBAAmB;YAQb,mBAAmB;IAkGjC,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,qBAAqB;IAuCvB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CA+B5B;AAED,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C;AAED,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C;AAED,OAAO,EAAE,sBAAsB,EAAE,CAAC"}
|
|
@@ -1,18 +1,21 @@
|
|
|
1
1
|
import * as net from 'net';
|
|
2
2
|
import * as fs from 'fs';
|
|
3
3
|
const LOG_FILE = '/tmp/standalone-diag.log';
|
|
4
|
+
const DEBUG_ENABLED = !!process.env.AGENT_BROWSER_DEBUG;
|
|
4
5
|
function logDiag(msg) {
|
|
6
|
+
if (!DEBUG_ENABLED)
|
|
7
|
+
return;
|
|
5
8
|
fs.appendFileSync(LOG_FILE, new Date().toISOString().substring(11, 23) + ' ' + msg + '\n');
|
|
6
9
|
}
|
|
7
10
|
import * as path from 'path';
|
|
8
11
|
import * as http from 'http';
|
|
9
12
|
import { WebSocketServer, WebSocket } from 'ws';
|
|
10
|
-
import sharp from 'sharp';
|
|
11
13
|
import { getViewerHtml } from './viewer-html.js';
|
|
12
|
-
import { isAllowedOrigin } from './stream
|
|
14
|
+
import { isAllowedOrigin, cropFrameForElement } from './stream/index.js';
|
|
13
15
|
import { getSocketDir } from './daemon.js';
|
|
14
16
|
import { openApiSpec } from './openapi.js';
|
|
15
17
|
import { getSwaggerUiHtml } from './swagger-ui.js';
|
|
18
|
+
import { getVersion } from './version.js';
|
|
16
19
|
const DEFAULT_STREAM_PORT = parseInt(process.env.AGENT_BROWSER_STREAM_PORT || '5005', 10);
|
|
17
20
|
const STREAM_SERVER_PID_FILE = 'stream-server.pid';
|
|
18
21
|
const STREAM_SERVER_IPC_FILE = 'stream-server.ipc';
|
|
@@ -111,7 +114,6 @@ class StreamServerStandalone {
|
|
|
111
114
|
res.end(JSON.stringify({ sessions: Array.from(this.sessions.keys()) }));
|
|
112
115
|
return;
|
|
113
116
|
}
|
|
114
|
-
// HTTP API: Execute command
|
|
115
117
|
if (req.url === '/api/command' && req.method === 'POST') {
|
|
116
118
|
let body = '';
|
|
117
119
|
req.on('data', (chunk) => (body += chunk));
|
|
@@ -129,7 +131,6 @@ class StreamServerStandalone {
|
|
|
129
131
|
});
|
|
130
132
|
return;
|
|
131
133
|
}
|
|
132
|
-
// HTTP API: Plugin shortcuts (GET)
|
|
133
134
|
if (req.url?.startsWith('/api/') && req.method === 'GET') {
|
|
134
135
|
(async () => {
|
|
135
136
|
const parsed = new URL(req.url, `http://${req.headers.host}`);
|
|
@@ -197,7 +198,6 @@ class StreamServerStandalone {
|
|
|
197
198
|
}
|
|
198
199
|
return;
|
|
199
200
|
}
|
|
200
|
-
// GET /api/scrape?url=...
|
|
201
201
|
if (parsed.pathname === '/api/scrape') {
|
|
202
202
|
const targetUrl = parsed.searchParams.get('url');
|
|
203
203
|
if (!targetUrl) {
|
|
@@ -257,7 +257,6 @@ class StreamServerStandalone {
|
|
|
257
257
|
}
|
|
258
258
|
return;
|
|
259
259
|
}
|
|
260
|
-
// GET /api/evaluate?script=...
|
|
261
260
|
if (parsed.pathname === '/api/evaluate') {
|
|
262
261
|
const script = parsed.searchParams.get('script');
|
|
263
262
|
if (!script) {
|
|
@@ -286,24 +285,21 @@ class StreamServerStandalone {
|
|
|
286
285
|
})().catch(() => { });
|
|
287
286
|
return;
|
|
288
287
|
}
|
|
289
|
-
// HTTP API: OpenAPI specification
|
|
290
288
|
if (req.url === '/api/openapi.json' && req.method === 'GET') {
|
|
291
289
|
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
292
290
|
res.end(JSON.stringify(openApiSpec));
|
|
293
291
|
return;
|
|
294
292
|
}
|
|
295
|
-
// HTTP API: Swagger UI
|
|
296
293
|
if (req.url === '/api/docs' && req.method === 'GET') {
|
|
297
294
|
res.setHeader('Content-Type', 'text/html; charset=utf-8');
|
|
298
295
|
res.end(getSwaggerUiHtml());
|
|
299
296
|
return;
|
|
300
297
|
}
|
|
301
|
-
// HTTP API: Help - list available commands
|
|
302
298
|
if (req.url === '/api/help' && req.method === 'GET') {
|
|
303
299
|
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
304
300
|
res.end(JSON.stringify({
|
|
305
301
|
title: 'agent-browser HTTP API',
|
|
306
|
-
version:
|
|
302
|
+
version: getVersion(),
|
|
307
303
|
endpoints: {
|
|
308
304
|
'POST /api/command': {
|
|
309
305
|
description: 'Execute a browser command',
|
|
@@ -535,39 +531,14 @@ class StreamServerStandalone {
|
|
|
535
531
|
const box = clientState.elementBox;
|
|
536
532
|
const header = JSON.parse(frame.header);
|
|
537
533
|
const meta = header.metadata;
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
if (meta?.deviceWidth && meta?.deviceHeight) {
|
|
543
|
-
const imgInfo = await sharp(frame.data).metadata();
|
|
544
|
-
const actualW = imgInfo.width || meta.deviceWidth;
|
|
545
|
-
const actualH = imgInfo.height || meta.deviceHeight;
|
|
546
|
-
const scaleX = actualW / meta.deviceWidth;
|
|
547
|
-
const scaleY = actualH / meta.deviceHeight;
|
|
548
|
-
if (scaleX !== 1 || scaleY !== 1) {
|
|
549
|
-
left = Math.round(box.x * scaleX);
|
|
550
|
-
top = Math.round(box.y * scaleY);
|
|
551
|
-
w = Math.round(box.width * scaleX);
|
|
552
|
-
h = Math.round(box.height * scaleY);
|
|
553
|
-
}
|
|
554
|
-
left = Math.max(0, Math.min(left, actualW - 1));
|
|
555
|
-
top = Math.max(0, Math.min(top, actualH - 1));
|
|
556
|
-
w = Math.min(w, actualW - left);
|
|
557
|
-
h = Math.min(h, actualH - top);
|
|
558
|
-
}
|
|
559
|
-
if (w <= 0 || h <= 0) {
|
|
534
|
+
const buf = await cropFrameForElement(frame.data, box, meta);
|
|
535
|
+
if (ws.readyState !== WebSocket.OPEN)
|
|
536
|
+
return;
|
|
537
|
+
if (buf === frame.data) {
|
|
560
538
|
ws.send(frame.header);
|
|
561
539
|
ws.send(frame.data);
|
|
562
540
|
return;
|
|
563
541
|
}
|
|
564
|
-
const buf = await sharp(frame.data)
|
|
565
|
-
.extract({ left, top, width: w, height: h })
|
|
566
|
-
.resize(box.width, box.height)
|
|
567
|
-
.jpeg({ quality: 80 })
|
|
568
|
-
.toBuffer();
|
|
569
|
-
if (ws.readyState !== WebSocket.OPEN)
|
|
570
|
-
return;
|
|
571
542
|
const croppedHeader = {
|
|
572
543
|
...header,
|
|
573
544
|
metadata: {
|
|
@@ -772,7 +743,6 @@ class StreamServerStandalone {
|
|
|
772
743
|
this.outboundSockets.delete(session);
|
|
773
744
|
});
|
|
774
745
|
this.outboundSockets.set(session, socket);
|
|
775
|
-
// Send inject_focus_listener command to daemon via this outbound connection
|
|
776
746
|
logDiag('[CTD] sending inject_focus_listener to daemon for session=' + session);
|
|
777
747
|
try {
|
|
778
748
|
socket.write(JSON.stringify({ id: 'inject-fl-' + Date.now(), action: 'inject_focus_listener' }) + '\n');
|
|
@@ -780,7 +750,6 @@ class StreamServerStandalone {
|
|
|
780
750
|
catch (e) {
|
|
781
751
|
console.error('[StreamServer] Failed to send inject_focus_listener:', e);
|
|
782
752
|
}
|
|
783
|
-
// Data handler: receive focus events from daemon's injectFocusListener callback
|
|
784
753
|
socket.on('data', (data) => {
|
|
785
754
|
const raw = data.toString();
|
|
786
755
|
logDiag('[CTD DATA] session=' +
|
|
@@ -795,7 +764,6 @@ class StreamServerStandalone {
|
|
|
795
764
|
continue;
|
|
796
765
|
try {
|
|
797
766
|
const msg = JSON.parse(line);
|
|
798
|
-
// Handle inject_focus_listener response — retry on "Browser not launched"
|
|
799
767
|
if (msg.id && String(msg.id).startsWith('inject-fl-')) {
|
|
800
768
|
if (msg.success === false && msg.error && msg.error.includes('Browser not launched')) {
|
|
801
769
|
logDiag('[CTD] inject_focus_listener failed: ' + msg.error + ' — retrying in 2s');
|
|
@@ -862,38 +830,9 @@ class StreamServerStandalone {
|
|
|
862
830
|
if (hasSelector && hasBox && hasFrame) {
|
|
863
831
|
try {
|
|
864
832
|
const box = clientState.elementBox;
|
|
865
|
-
const
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
let w = Math.round(box.width);
|
|
869
|
-
let h = Math.round(box.height);
|
|
870
|
-
if (meta?.deviceWidth && meta?.deviceHeight) {
|
|
871
|
-
const imgInfo = await sharp(frameData).metadata();
|
|
872
|
-
const actualW = imgInfo.width || meta.deviceWidth;
|
|
873
|
-
const actualH = imgInfo.height || meta.deviceHeight;
|
|
874
|
-
const scaleX = actualW / meta.deviceWidth;
|
|
875
|
-
const scaleY = actualH / meta.deviceHeight;
|
|
876
|
-
if (scaleX !== 1 || scaleY !== 1) {
|
|
877
|
-
left = Math.round(box.x * scaleX);
|
|
878
|
-
top = Math.round(box.y * scaleY);
|
|
879
|
-
w = Math.round(box.width * scaleX);
|
|
880
|
-
h = Math.round(box.height * scaleY);
|
|
881
|
-
}
|
|
882
|
-
left = Math.max(0, Math.min(left, actualW - 1));
|
|
883
|
-
top = Math.max(0, Math.min(top, actualH - 1));
|
|
884
|
-
w = Math.min(w, actualW - left);
|
|
885
|
-
h = Math.min(h, actualH - top);
|
|
886
|
-
}
|
|
887
|
-
if (w <= 0 || h <= 0) {
|
|
888
|
-
dataToSend = frameData;
|
|
889
|
-
}
|
|
890
|
-
else {
|
|
891
|
-
const cropped = await sharp(frameData)
|
|
892
|
-
.extract({ left, top, width: w, height: h })
|
|
893
|
-
.resize(box.width, box.height)
|
|
894
|
-
.jpeg({ quality: 80 })
|
|
895
|
-
.toBuffer();
|
|
896
|
-
dataToSend = Buffer.from(cropped);
|
|
833
|
+
const cropped = await cropFrameForElement(frameData, box, message.metadata);
|
|
834
|
+
if (cropped !== frameData) {
|
|
835
|
+
dataToSend = cropped;
|
|
897
836
|
if (metadata) {
|
|
898
837
|
metadata = {
|
|
899
838
|
...metadata,
|
|
@@ -946,7 +885,6 @@ class StreamServerStandalone {
|
|
|
946
885
|
client.send(dataToSend);
|
|
947
886
|
}
|
|
948
887
|
}
|
|
949
|
-
// 保存最新帧(原始)
|
|
950
888
|
if (frameData) {
|
|
951
889
|
this.latestFrames.set(session, {
|
|
952
890
|
header: JSON.stringify({
|
|
@@ -972,7 +910,7 @@ class StreamServerStandalone {
|
|
|
972
910
|
connected,
|
|
973
911
|
screencasting: connected,
|
|
974
912
|
session,
|
|
975
|
-
version:
|
|
913
|
+
version: getVersion(),
|
|
976
914
|
};
|
|
977
915
|
if (state?.selector && state.elementBox) {
|
|
978
916
|
msg.element = {
|
|
@@ -999,7 +937,7 @@ class StreamServerStandalone {
|
|
|
999
937
|
connected,
|
|
1000
938
|
screencasting: connected,
|
|
1001
939
|
session,
|
|
1002
|
-
version:
|
|
940
|
+
version: getVersion(),
|
|
1003
941
|
};
|
|
1004
942
|
if (clientState?.selector && clientState?.elementBox) {
|
|
1005
943
|
message.element = {
|
|
@@ -1026,15 +964,16 @@ class StreamServerStandalone {
|
|
|
1026
964
|
}
|
|
1027
965
|
return total;
|
|
1028
966
|
}
|
|
1029
|
-
/**
|
|
1030
|
-
* Send a command to the daemon via Unix socket and return the response
|
|
1031
|
-
*/
|
|
1032
967
|
async sendCommandToDaemon(commandJson) {
|
|
1033
968
|
return new Promise((resolve, reject) => {
|
|
1034
969
|
let targetSession;
|
|
970
|
+
let requestedTimeout;
|
|
1035
971
|
try {
|
|
1036
972
|
const parsed = JSON.parse(commandJson);
|
|
1037
973
|
targetSession = parsed.session;
|
|
974
|
+
if (typeof parsed.timeout === 'number' && parsed.timeout > 0) {
|
|
975
|
+
requestedTimeout = Math.min(parsed.timeout, 600000); // cap at 10 minutes
|
|
976
|
+
}
|
|
1038
977
|
}
|
|
1039
978
|
catch {
|
|
1040
979
|
/* ignored */
|
|
@@ -1067,13 +1006,14 @@ class StreamServerStandalone {
|
|
|
1067
1006
|
});
|
|
1068
1007
|
let buffer = '';
|
|
1069
1008
|
let resolved = false;
|
|
1009
|
+
const COMMAND_TIMEOUT_MS = requestedTimeout ?? 180000; // default 3min, max 10min via timeout field
|
|
1070
1010
|
const timeout = setTimeout(() => {
|
|
1071
1011
|
if (!resolved) {
|
|
1072
1012
|
resolved = true;
|
|
1073
1013
|
socket.destroy();
|
|
1074
|
-
reject(new Error(
|
|
1014
|
+
reject(new Error(`Command timeout (${COMMAND_TIMEOUT_MS}ms)`));
|
|
1075
1015
|
}
|
|
1076
|
-
},
|
|
1016
|
+
}, COMMAND_TIMEOUT_MS);
|
|
1077
1017
|
socket.on('data', (data) => {
|
|
1078
1018
|
buffer += data.toString();
|
|
1079
1019
|
const lines = buffer.split('\n');
|