@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.
Files changed (209) hide show
  1. package/dist/actions/context.d.ts +4 -0
  2. package/dist/actions/context.d.ts.map +1 -1
  3. package/dist/actions/context.js +41 -1
  4. package/dist/actions/context.js.map +1 -1
  5. package/dist/actions/index.d.ts.map +1 -1
  6. package/dist/actions/index.js +164 -297
  7. package/dist/actions/index.js.map +1 -1
  8. package/dist/actions/interaction.d.ts.map +1 -1
  9. package/dist/actions/interaction.js +96 -30
  10. package/dist/actions/interaction.js.map +1 -1
  11. package/dist/actions/touch.d.ts +25 -0
  12. package/dist/actions/touch.d.ts.map +1 -0
  13. package/dist/actions/touch.js +114 -0
  14. package/dist/actions/touch.js.map +1 -0
  15. package/dist/browser/browser-manager.d.ts +15 -0
  16. package/dist/browser/browser-manager.d.ts.map +1 -1
  17. package/dist/browser/browser-manager.js +75 -7
  18. package/dist/browser/browser-manager.js.map +1 -1
  19. package/dist/browser/network-analysis.d.ts +65 -0
  20. package/dist/browser/network-analysis.d.ts.map +1 -0
  21. package/dist/browser/network-analysis.js +359 -0
  22. package/dist/browser/network-analysis.js.map +1 -0
  23. package/dist/browser/network-tracker.d.ts +4 -0
  24. package/dist/browser/network-tracker.d.ts.map +1 -1
  25. package/dist/browser/network-tracker.js +41 -0
  26. package/dist/browser/network-tracker.js.map +1 -1
  27. package/dist/browser/popup-detector.d.ts +22 -0
  28. package/dist/browser/popup-detector.d.ts.map +1 -0
  29. package/dist/browser/popup-detector.js +138 -0
  30. package/dist/browser/popup-detector.js.map +1 -0
  31. package/dist/cli/commands/index.d.ts +5 -0
  32. package/dist/cli/commands/index.d.ts.map +1 -0
  33. package/dist/cli/commands/index.js +219 -0
  34. package/dist/cli/commands/index.js.map +1 -0
  35. package/dist/cli/commands/interact.d.ts +7 -0
  36. package/dist/cli/commands/interact.d.ts.map +1 -0
  37. package/dist/cli/commands/interact.js +371 -0
  38. package/dist/cli/commands/interact.js.map +1 -0
  39. package/dist/cli/commands/navigate.d.ts +4 -0
  40. package/dist/cli/commands/navigate.d.ts.map +1 -0
  41. package/dist/cli/commands/navigate.js +46 -0
  42. package/dist/cli/commands/navigate.js.map +1 -0
  43. package/dist/cli/commands/network.d.ts +3 -0
  44. package/dist/cli/commands/network.d.ts.map +1 -0
  45. package/dist/cli/commands/network.js +292 -0
  46. package/dist/cli/commands/network.js.map +1 -0
  47. package/dist/cli/commands/plugin.d.ts +3 -0
  48. package/dist/cli/commands/plugin.d.ts.map +1 -0
  49. package/dist/cli/commands/plugin.js +84 -0
  50. package/dist/cli/commands/plugin.js.map +1 -0
  51. package/dist/cli/commands/query.d.ts +7 -0
  52. package/dist/cli/commands/query.d.ts.map +1 -0
  53. package/dist/cli/commands/query.js +333 -0
  54. package/dist/cli/commands/query.js.map +1 -0
  55. package/dist/cli/commands/session.d.ts +3 -0
  56. package/dist/cli/commands/session.d.ts.map +1 -0
  57. package/dist/cli/commands/session.js +372 -0
  58. package/dist/cli/commands/session.js.map +1 -0
  59. package/dist/cli/commands/shared.d.ts +24 -0
  60. package/dist/cli/commands/shared.d.ts.map +1 -0
  61. package/dist/cli/commands/shared.js +113 -0
  62. package/dist/cli/commands/shared.js.map +1 -0
  63. package/dist/cli/commands.d.ts +1 -7
  64. package/dist/cli/commands.d.ts.map +1 -1
  65. package/dist/cli/commands.js +1 -1684
  66. package/dist/cli/commands.js.map +1 -1
  67. package/dist/cli/connection.d.ts.map +1 -1
  68. package/dist/cli/connection.js +9 -1
  69. package/dist/cli/connection.js.map +1 -1
  70. package/dist/cli/help.d.ts.map +1 -1
  71. package/dist/cli/help.js +1 -24
  72. package/dist/cli/help.js.map +1 -1
  73. package/dist/cli.js +2 -2
  74. package/dist/cli.js.map +1 -1
  75. package/dist/daemon.d.ts.map +1 -1
  76. package/dist/daemon.js +21 -1
  77. package/dist/daemon.js.map +1 -1
  78. package/dist/diff.d.ts +4 -0
  79. package/dist/diff.d.ts.map +1 -1
  80. package/dist/diff.js +16 -0
  81. package/dist/diff.js.map +1 -1
  82. package/dist/flow/exporters/cypress.js +1 -1
  83. package/dist/flow/exporters/cypress.js.map +1 -1
  84. package/dist/flow/exporters/selenium.js +1 -1
  85. package/dist/flow/exporters/selenium.js.map +1 -1
  86. package/dist/openapi.d.ts.map +1 -1
  87. package/dist/openapi.js +2 -1
  88. package/dist/openapi.js.map +1 -1
  89. package/dist/plugins/registry.d.ts.map +1 -1
  90. package/dist/plugins/registry.js +4 -1
  91. package/dist/plugins/registry.js.map +1 -1
  92. package/dist/plugins/types.d.ts +4 -4
  93. package/dist/plugins/types.d.ts.map +1 -1
  94. package/dist/protocol.d.ts.map +1 -1
  95. package/dist/protocol.js +30 -7
  96. package/dist/protocol.js.map +1 -1
  97. package/dist/snapshot/constants.d.ts +6 -0
  98. package/dist/snapshot/constants.d.ts.map +1 -0
  99. package/dist/snapshot/constants.js +77 -0
  100. package/dist/snapshot/constants.js.map +1 -0
  101. package/dist/snapshot/dom-scripts.d.ts +12 -0
  102. package/dist/snapshot/dom-scripts.d.ts.map +1 -0
  103. package/dist/snapshot/dom-scripts.js +438 -0
  104. package/dist/snapshot/dom-scripts.js.map +1 -0
  105. package/dist/snapshot/format.d.ts +13 -0
  106. package/dist/snapshot/format.d.ts.map +1 -0
  107. package/dist/snapshot/format.js +175 -0
  108. package/dist/snapshot/format.js.map +1 -0
  109. package/dist/snapshot/index.d.ts +6 -0
  110. package/dist/snapshot/index.d.ts.map +1 -0
  111. package/dist/snapshot/index.js +5 -0
  112. package/dist/snapshot/index.js.map +1 -0
  113. package/dist/snapshot/refs.d.ts +3 -0
  114. package/dist/snapshot/refs.d.ts.map +1 -0
  115. package/dist/snapshot/refs.js +8 -0
  116. package/dist/snapshot/refs.js.map +1 -0
  117. package/dist/snapshot/selectors.d.ts +17 -0
  118. package/dist/snapshot/selectors.d.ts.map +1 -0
  119. package/dist/snapshot/selectors.js +619 -0
  120. package/dist/snapshot/selectors.js.map +1 -0
  121. package/dist/snapshot/snapshot.d.ts +12 -0
  122. package/dist/snapshot/snapshot.d.ts.map +1 -0
  123. package/dist/snapshot/snapshot.js +104 -0
  124. package/dist/snapshot/snapshot.js.map +1 -0
  125. package/dist/snapshot/types.d.ts +27 -0
  126. package/dist/snapshot/types.d.ts.map +1 -0
  127. package/dist/snapshot/types.js +2 -0
  128. package/dist/snapshot/types.js.map +1 -0
  129. package/dist/snapshot.d.ts +1 -79
  130. package/dist/snapshot.d.ts.map +1 -1
  131. package/dist/snapshot.js +1 -1800
  132. package/dist/snapshot.js.map +1 -1
  133. package/dist/stream/client-state.d.ts +13 -0
  134. package/dist/stream/client-state.d.ts.map +1 -0
  135. package/dist/stream/client-state.js +2 -0
  136. package/dist/stream/client-state.js.map +1 -0
  137. package/dist/stream/element-utils.d.ts +8 -0
  138. package/dist/stream/element-utils.d.ts.map +1 -0
  139. package/dist/stream/element-utils.js +25 -0
  140. package/dist/stream/element-utils.js.map +1 -0
  141. package/dist/stream/frame-processor.d.ts +63 -0
  142. package/dist/stream/frame-processor.d.ts.map +1 -0
  143. package/dist/stream/frame-processor.js +178 -0
  144. package/dist/stream/frame-processor.js.map +1 -0
  145. package/dist/stream/index.d.ts +10 -0
  146. package/dist/stream/index.d.ts.map +1 -0
  147. package/dist/stream/index.js +5 -0
  148. package/dist/stream/index.js.map +1 -0
  149. package/dist/stream/input-handler.d.ts +10 -0
  150. package/dist/stream/input-handler.d.ts.map +1 -0
  151. package/dist/stream/input-handler.js +81 -0
  152. package/dist/stream/input-handler.js.map +1 -0
  153. package/dist/stream/messages.d.ts +144 -0
  154. package/dist/stream/messages.d.ts.map +1 -0
  155. package/dist/stream/messages.js +46 -0
  156. package/dist/stream/messages.js.map +1 -0
  157. package/dist/stream-server-standalone.d.ts +0 -3
  158. package/dist/stream-server-standalone.d.ts.map +1 -1
  159. package/dist/stream-server-standalone.js +22 -82
  160. package/dist/stream-server-standalone.js.map +1 -1
  161. package/dist/stream-server.d.ts +8 -212
  162. package/dist/stream-server.d.ts.map +1 -1
  163. package/dist/stream-server.js +35 -389
  164. package/dist/stream-server.js.map +1 -1
  165. package/dist/types/base.d.ts +11 -0
  166. package/dist/types/base.d.ts.map +1 -0
  167. package/dist/types/base.js +2 -0
  168. package/dist/types/base.js.map +1 -0
  169. package/dist/types/browser.d.ts +26 -0
  170. package/dist/types/browser.d.ts.map +1 -0
  171. package/dist/types/browser.js +2 -0
  172. package/dist/types/browser.js.map +1 -0
  173. package/dist/types/commands.d.ts +768 -0
  174. package/dist/types/commands.d.ts.map +1 -0
  175. package/dist/types/commands.js +2 -0
  176. package/dist/types/commands.js.map +1 -0
  177. package/dist/types/crawl.d.ts +89 -0
  178. package/dist/types/crawl.d.ts.map +1 -0
  179. package/dist/types/crawl.js +2 -0
  180. package/dist/types/crawl.js.map +1 -0
  181. package/dist/types/index.d.ts +9 -0
  182. package/dist/types/index.d.ts.map +1 -0
  183. package/dist/types/index.js +9 -0
  184. package/dist/types/index.js.map +1 -0
  185. package/dist/types/interact.d.ts +61 -0
  186. package/dist/types/interact.d.ts.map +1 -0
  187. package/dist/types/interact.js +2 -0
  188. package/dist/types/interact.js.map +1 -0
  189. package/dist/types/plugins.d.ts +39 -0
  190. package/dist/types/plugins.d.ts.map +1 -0
  191. package/dist/types/plugins.js +2 -0
  192. package/dist/types/plugins.js.map +1 -0
  193. package/dist/types/responses.d.ts +140 -0
  194. package/dist/types/responses.d.ts.map +1 -0
  195. package/dist/types/responses.js +4 -0
  196. package/dist/types/responses.js.map +1 -0
  197. package/dist/types/utils.d.ts +12 -0
  198. package/dist/types/utils.d.ts.map +1 -0
  199. package/dist/types/utils.js +2 -0
  200. package/dist/types/utils.js.map +1 -0
  201. package/dist/types.d.ts +1 -1125
  202. package/dist/types.d.ts.map +1 -1
  203. package/dist/types.js +1 -3
  204. package/dist/types.js.map +1 -1
  205. package/dist/version.d.ts +2 -0
  206. package/dist/version.d.ts.map +1 -0
  207. package/dist/version.js +31 -0
  208. package/dist/version.js.map +1 -0
  209. 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":"AAeA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAMpD,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AA0CD,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;IA2TzB,OAAO,CAAC,yBAAyB;IAkHjC,OAAO,CAAC,mBAAmB;IAkD3B,OAAO,CAAC,iBAAiB;YAkBX,gBAAgB;YA6EhB,cAAc;IAyB5B,OAAO,CAAC,mBAAmB;YAsCb,gBAAgB;IAmG9B,OAAO,CAAC,eAAe;YAgHT,cAAc;IA4I5B,OAAO,CAAC,eAAe;IAiCvB,OAAO,CAAC,UAAU;IA+BlB,OAAO,CAAC,mBAAmB;IAQ3B;;OAEG;YACW,mBAAmB;IA6FjC,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
+ {"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-server.js';
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: '0.11.0',
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
- let left = Math.round(box.x);
539
- let top = Math.round(box.y);
540
- let w = Math.round(box.width);
541
- let h = Math.round(box.height);
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 meta = message.metadata;
866
- let left = Math.round(box.x);
867
- let top = Math.round(box.y);
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: '0.11.0',
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: '0.11.0',
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('Command timeout'));
1014
+ reject(new Error(`Command timeout (${COMMAND_TIMEOUT_MS}ms)`));
1075
1015
  }
1076
- }, 120000);
1016
+ }, COMMAND_TIMEOUT_MS);
1077
1017
  socket.on('data', (data) => {
1078
1018
  buffer += data.toString();
1079
1019
  const lines = buffer.split('\n');