@donggui/web 1.5.5-donggui.3

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 (166) hide show
  1. package/README.md +9 -0
  2. package/bin/midscene-playground +3 -0
  3. package/bin/midscene-web +2 -0
  4. package/dist/es/bin.mjs +23 -0
  5. package/dist/es/bin.mjs.map +1 -0
  6. package/dist/es/bridge-mode/agent-cli-side.mjs +137 -0
  7. package/dist/es/bridge-mode/agent-cli-side.mjs.map +1 -0
  8. package/dist/es/bridge-mode/browser.mjs +2 -0
  9. package/dist/es/bridge-mode/common.mjs +43 -0
  10. package/dist/es/bridge-mode/common.mjs.map +1 -0
  11. package/dist/es/bridge-mode/index.mjs +4 -0
  12. package/dist/es/bridge-mode/io-client.mjs +101 -0
  13. package/dist/es/bridge-mode/io-client.mjs.map +1 -0
  14. package/dist/es/bridge-mode/io-server.mjs +210 -0
  15. package/dist/es/bridge-mode/io-server.mjs.map +1 -0
  16. package/dist/es/bridge-mode/page-browser-side.mjs +118 -0
  17. package/dist/es/bridge-mode/page-browser-side.mjs.map +1 -0
  18. package/dist/es/chrome-extension/agent.mjs +9 -0
  19. package/dist/es/chrome-extension/agent.mjs.map +1 -0
  20. package/dist/es/chrome-extension/cdpInput.mjs +174 -0
  21. package/dist/es/chrome-extension/cdpInput.mjs.LICENSE.txt +5 -0
  22. package/dist/es/chrome-extension/cdpInput.mjs.map +1 -0
  23. package/dist/es/chrome-extension/dynamic-scripts.mjs +38 -0
  24. package/dist/es/chrome-extension/dynamic-scripts.mjs.map +1 -0
  25. package/dist/es/chrome-extension/index.mjs +5 -0
  26. package/dist/es/chrome-extension/page.mjs +651 -0
  27. package/dist/es/chrome-extension/page.mjs.map +1 -0
  28. package/dist/es/cli.mjs +16 -0
  29. package/dist/es/cli.mjs.map +1 -0
  30. package/dist/es/common/cache-helper.mjs +28 -0
  31. package/dist/es/common/cache-helper.mjs.map +1 -0
  32. package/dist/es/index.mjs +6 -0
  33. package/dist/es/mcp-server.mjs +35 -0
  34. package/dist/es/mcp-server.mjs.map +1 -0
  35. package/dist/es/mcp-tools-puppeteer.mjs +215 -0
  36. package/dist/es/mcp-tools-puppeteer.mjs.map +1 -0
  37. package/dist/es/mcp-tools.mjs +78 -0
  38. package/dist/es/mcp-tools.mjs.map +1 -0
  39. package/dist/es/playwright/ai-fixture.mjs +367 -0
  40. package/dist/es/playwright/ai-fixture.mjs.map +1 -0
  41. package/dist/es/playwright/index.mjs +40 -0
  42. package/dist/es/playwright/index.mjs.map +1 -0
  43. package/dist/es/playwright/page.mjs +44 -0
  44. package/dist/es/playwright/page.mjs.map +1 -0
  45. package/dist/es/playwright/reporter/index.mjs +216 -0
  46. package/dist/es/playwright/reporter/index.mjs.map +1 -0
  47. package/dist/es/puppeteer/agent-launcher.mjs +185 -0
  48. package/dist/es/puppeteer/agent-launcher.mjs.map +1 -0
  49. package/dist/es/puppeteer/base-page.mjs +564 -0
  50. package/dist/es/puppeteer/base-page.mjs.map +1 -0
  51. package/dist/es/puppeteer/index.mjs +34 -0
  52. package/dist/es/puppeteer/index.mjs.map +1 -0
  53. package/dist/es/puppeteer/page.mjs +9 -0
  54. package/dist/es/puppeteer/page.mjs.map +1 -0
  55. package/dist/es/static/index.mjs +3 -0
  56. package/dist/es/static/static-agent.mjs +12 -0
  57. package/dist/es/static/static-agent.mjs.map +1 -0
  58. package/dist/es/static/static-page.mjs +122 -0
  59. package/dist/es/static/static-page.mjs.map +1 -0
  60. package/dist/es/utils.mjs +8 -0
  61. package/dist/es/utils.mjs.map +1 -0
  62. package/dist/es/web-element.mjs +59 -0
  63. package/dist/es/web-element.mjs.map +1 -0
  64. package/dist/es/web-page.mjs +260 -0
  65. package/dist/es/web-page.mjs.map +1 -0
  66. package/dist/lib/bin.js +29 -0
  67. package/dist/lib/bin.js.map +1 -0
  68. package/dist/lib/bridge-mode/agent-cli-side.js +174 -0
  69. package/dist/lib/bridge-mode/agent-cli-side.js.map +1 -0
  70. package/dist/lib/bridge-mode/browser.js +38 -0
  71. package/dist/lib/bridge-mode/browser.js.map +1 -0
  72. package/dist/lib/bridge-mode/common.js +107 -0
  73. package/dist/lib/bridge-mode/common.js.map +1 -0
  74. package/dist/lib/bridge-mode/index.js +46 -0
  75. package/dist/lib/bridge-mode/index.js.map +1 -0
  76. package/dist/lib/bridge-mode/io-client.js +135 -0
  77. package/dist/lib/bridge-mode/io-client.js.map +1 -0
  78. package/dist/lib/bridge-mode/io-server.js +247 -0
  79. package/dist/lib/bridge-mode/io-server.js.map +1 -0
  80. package/dist/lib/bridge-mode/page-browser-side.js +162 -0
  81. package/dist/lib/bridge-mode/page-browser-side.js.map +1 -0
  82. package/dist/lib/chrome-extension/agent.js +43 -0
  83. package/dist/lib/chrome-extension/agent.js.map +1 -0
  84. package/dist/lib/chrome-extension/cdpInput.js +208 -0
  85. package/dist/lib/chrome-extension/cdpInput.js.LICENSE.txt +5 -0
  86. package/dist/lib/chrome-extension/cdpInput.js.map +1 -0
  87. package/dist/lib/chrome-extension/dynamic-scripts.js +88 -0
  88. package/dist/lib/chrome-extension/dynamic-scripts.js.map +1 -0
  89. package/dist/lib/chrome-extension/index.js +60 -0
  90. package/dist/lib/chrome-extension/index.js.map +1 -0
  91. package/dist/lib/chrome-extension/page.js +685 -0
  92. package/dist/lib/chrome-extension/page.js.map +1 -0
  93. package/dist/lib/cli.js +22 -0
  94. package/dist/lib/cli.js.map +1 -0
  95. package/dist/lib/common/cache-helper.js +68 -0
  96. package/dist/lib/common/cache-helper.js.map +1 -0
  97. package/dist/lib/index.js +60 -0
  98. package/dist/lib/index.js.map +1 -0
  99. package/dist/lib/mcp-server.js +75 -0
  100. package/dist/lib/mcp-server.js.map +1 -0
  101. package/dist/lib/mcp-tools-puppeteer.js +259 -0
  102. package/dist/lib/mcp-tools-puppeteer.js.map +1 -0
  103. package/dist/lib/mcp-tools.js +112 -0
  104. package/dist/lib/mcp-tools.js.map +1 -0
  105. package/dist/lib/playwright/ai-fixture.js +404 -0
  106. package/dist/lib/playwright/ai-fixture.js.map +1 -0
  107. package/dist/lib/playwright/index.js +93 -0
  108. package/dist/lib/playwright/index.js.map +1 -0
  109. package/dist/lib/playwright/page.js +78 -0
  110. package/dist/lib/playwright/page.js.map +1 -0
  111. package/dist/lib/playwright/reporter/index.js +250 -0
  112. package/dist/lib/playwright/reporter/index.js.map +1 -0
  113. package/dist/lib/puppeteer/agent-launcher.js +253 -0
  114. package/dist/lib/puppeteer/agent-launcher.js.map +1 -0
  115. package/dist/lib/puppeteer/base-page.js +607 -0
  116. package/dist/lib/puppeteer/base-page.js.map +1 -0
  117. package/dist/lib/puppeteer/index.js +84 -0
  118. package/dist/lib/puppeteer/index.js.map +1 -0
  119. package/dist/lib/puppeteer/page.js +43 -0
  120. package/dist/lib/puppeteer/page.js.map +1 -0
  121. package/dist/lib/static/index.js +52 -0
  122. package/dist/lib/static/index.js.map +1 -0
  123. package/dist/lib/static/static-agent.js +46 -0
  124. package/dist/lib/static/static-agent.js.map +1 -0
  125. package/dist/lib/static/static-page.js +156 -0
  126. package/dist/lib/static/static-page.js.map +1 -0
  127. package/dist/lib/utils.js +40 -0
  128. package/dist/lib/utils.js.map +1 -0
  129. package/dist/lib/web-element.js +96 -0
  130. package/dist/lib/web-element.js.map +1 -0
  131. package/dist/lib/web-page.js +310 -0
  132. package/dist/lib/web-page.js.map +1 -0
  133. package/dist/types/bin.d.ts +1 -0
  134. package/dist/types/bridge-mode/agent-cli-side.d.ts +49 -0
  135. package/dist/types/bridge-mode/browser.d.ts +2 -0
  136. package/dist/types/bridge-mode/common.d.ts +74 -0
  137. package/dist/types/bridge-mode/index.d.ts +4 -0
  138. package/dist/types/bridge-mode/io-client.d.ts +10 -0
  139. package/dist/types/bridge-mode/io-server.d.ts +27 -0
  140. package/dist/types/bridge-mode/page-browser-side.d.ts +21 -0
  141. package/dist/types/chrome-extension/agent.d.ts +5 -0
  142. package/dist/types/chrome-extension/cdpInput.d.ts +52 -0
  143. package/dist/types/chrome-extension/dynamic-scripts.d.ts +3 -0
  144. package/dist/types/chrome-extension/index.d.ts +5 -0
  145. package/dist/types/chrome-extension/page.d.ts +110 -0
  146. package/dist/types/cli.d.ts +1 -0
  147. package/dist/types/common/cache-helper.d.ts +20 -0
  148. package/dist/types/index.d.ts +7 -0
  149. package/dist/types/mcp-server.d.ts +26 -0
  150. package/dist/types/mcp-tools-puppeteer.d.ts +13 -0
  151. package/dist/types/mcp-tools.d.ts +12 -0
  152. package/dist/types/playwright/ai-fixture.d.ts +131 -0
  153. package/dist/types/playwright/index.d.ts +13 -0
  154. package/dist/types/playwright/page.d.ts +11 -0
  155. package/dist/types/playwright/reporter/index.d.ts +42 -0
  156. package/dist/types/puppeteer/agent-launcher.d.ts +61 -0
  157. package/dist/types/puppeteer/base-page.d.ts +106 -0
  158. package/dist/types/puppeteer/index.d.ts +10 -0
  159. package/dist/types/puppeteer/page.d.ts +6 -0
  160. package/dist/types/static/index.d.ts +2 -0
  161. package/dist/types/static/static-agent.d.ts +5 -0
  162. package/dist/types/static/static-page.d.ts +42 -0
  163. package/dist/types/utils.d.ts +6 -0
  164. package/dist/types/web-element.d.ts +48 -0
  165. package/dist/types/web-page.d.ts +62 -0
  166. package/package.json +166 -0
@@ -0,0 +1,260 @@
1
+ import node_assert from "node:assert";
2
+ import { z } from "@midscene/core";
3
+ import { AbstractInterface, defineAction, defineActionClearInput, defineActionCursorMove, defineActionDoubleClick, defineActionDragAndDrop, defineActionHover, defineActionInput, defineActionKeyboardPress, defineActionLongPress, defineActionRightClick, defineActionScroll, defineActionSwipe, defineActionTap } from "@midscene/core/device";
4
+ import { sleep } from "@midscene/core/utils";
5
+ import { getDebug } from "@midscene/shared/logger";
6
+ import { transformHotkeyInput } from "@midscene/shared/us-keyboard-layout";
7
+ const debug = getDebug('web:page');
8
+ const navigateParamSchema = z.object({
9
+ url: z.string().describe('The URL to navigate to. Must start with https://, file://, or a similar protocol.')
10
+ });
11
+ function normalizeKeyInputs(value) {
12
+ const inputs = Array.isArray(value) ? value : [
13
+ value
14
+ ];
15
+ const result = [];
16
+ for (const input of inputs){
17
+ if ('string' != typeof input) {
18
+ result.push(input);
19
+ continue;
20
+ }
21
+ const trimmed = input.trim();
22
+ if (!trimmed) {
23
+ result.push(input);
24
+ continue;
25
+ }
26
+ let normalized = trimmed;
27
+ if (normalized.length > 1 && normalized.includes('+')) normalized = normalized.replace(/\s*\+\s*/g, ' ');
28
+ if (/\s/.test(normalized)) normalized = normalized.replace(/\s+/g, ' ');
29
+ const transformed = transformHotkeyInput(normalized);
30
+ if (1 === transformed.length && '' === transformed[0] && '' !== trimmed) {
31
+ result.push(input);
32
+ continue;
33
+ }
34
+ if (0 === transformed.length) {
35
+ result.push(input);
36
+ continue;
37
+ }
38
+ result.push(...transformed);
39
+ }
40
+ return result;
41
+ }
42
+ function getKeyCommands(value) {
43
+ const keys = normalizeKeyInputs(value);
44
+ return keys.reduce((acc, k)=>{
45
+ const includeMeta = keys.includes('Meta') || keys.includes('Control');
46
+ if (includeMeta && ('a' === k || 'A' === k)) return acc.concat([
47
+ {
48
+ key: k,
49
+ command: 'SelectAll'
50
+ }
51
+ ]);
52
+ if (includeMeta && ('c' === k || 'C' === k)) return acc.concat([
53
+ {
54
+ key: k,
55
+ command: 'Copy'
56
+ }
57
+ ]);
58
+ if (includeMeta && ('v' === k || 'V' === k)) return acc.concat([
59
+ {
60
+ key: k,
61
+ command: 'Paste'
62
+ }
63
+ ]);
64
+ return acc.concat([
65
+ {
66
+ key: k
67
+ }
68
+ ]);
69
+ }, []);
70
+ }
71
+ class AbstractWebPage extends AbstractInterface {
72
+ get mouse() {
73
+ return {
74
+ click: async (x, y, options)=>{},
75
+ wheel: async (deltaX, deltaY)=>{},
76
+ move: async (x, y)=>{},
77
+ drag: async (from, to)=>{}
78
+ };
79
+ }
80
+ get keyboard() {
81
+ return {
82
+ type: async (text)=>{},
83
+ press: async (action)=>{}
84
+ };
85
+ }
86
+ async clearInput(element) {}
87
+ }
88
+ const commonWebActionsForWebPage = (page, includeTouchEvents = false)=>[
89
+ defineActionTap(async (param)=>{
90
+ const element = param.locate;
91
+ node_assert(element, 'Element not found, cannot tap');
92
+ await page.mouse.click(element.center[0], element.center[1], {
93
+ button: 'left'
94
+ });
95
+ }),
96
+ defineActionRightClick(async (param)=>{
97
+ const element = param.locate;
98
+ node_assert(element, 'Element not found, cannot right click');
99
+ await page.mouse.click(element.center[0], element.center[1], {
100
+ button: 'right'
101
+ });
102
+ }),
103
+ defineActionDoubleClick(async (param)=>{
104
+ const element = param.locate;
105
+ node_assert(element, 'Element not found, cannot double click');
106
+ await page.mouse.click(element.center[0], element.center[1], {
107
+ button: 'left',
108
+ count: 2
109
+ });
110
+ }),
111
+ defineActionHover(async (param)=>{
112
+ const element = param.locate;
113
+ node_assert(element, 'Element not found, cannot hover');
114
+ await page.mouse.move(element.center[0], element.center[1]);
115
+ }),
116
+ defineActionInput(async (param)=>{
117
+ const element = param.locate;
118
+ if (element && 'typeOnly' !== param.mode) await page.clearInput(element);
119
+ else if (element && 'typeOnly' === param.mode) {
120
+ await page.mouse.click(element.center[0], element.center[1], {
121
+ button: 'left'
122
+ });
123
+ await page.keyboard.press([
124
+ {
125
+ key: 'End'
126
+ }
127
+ ]);
128
+ }
129
+ if ('clear' === param.mode) return;
130
+ if (!param || !param.value) return;
131
+ await page.keyboard.type(param.value);
132
+ }),
133
+ defineActionKeyboardPress(async (param)=>{
134
+ const element = param.locate;
135
+ if (element) await page.mouse.click(element.center[0], element.center[1], {
136
+ button: 'left'
137
+ });
138
+ const keys = getKeyCommands(param.keyName);
139
+ await page.keyboard.press(keys);
140
+ }),
141
+ defineActionCursorMove(async (param)=>{
142
+ const arrowKey = 'left' === param.direction ? 'ArrowLeft' : 'ArrowRight';
143
+ const times = param.times ?? 1;
144
+ for(let i = 0; i < times; i++){
145
+ await page.keyboard.press([
146
+ {
147
+ key: arrowKey
148
+ }
149
+ ]);
150
+ await sleep(100);
151
+ }
152
+ }),
153
+ defineActionScroll(async (param)=>{
154
+ const element = param.locate;
155
+ const startingPoint = element ? {
156
+ left: element.center[0],
157
+ top: element.center[1]
158
+ } : void 0;
159
+ const scrollToEventName = param?.scrollType;
160
+ if ('scrollToTop' === scrollToEventName) await page.scrollUntilTop(startingPoint);
161
+ else if ('scrollToBottom' === scrollToEventName) await page.scrollUntilBottom(startingPoint);
162
+ else if ('scrollToRight' === scrollToEventName) await page.scrollUntilRight(startingPoint);
163
+ else if ('scrollToLeft' === scrollToEventName) await page.scrollUntilLeft(startingPoint);
164
+ else if ('singleAction' !== scrollToEventName && scrollToEventName) throw new Error(`Unknown scroll event type: ${scrollToEventName}, param: ${JSON.stringify(param)}`);
165
+ else {
166
+ if (param?.direction !== 'down' && param && param.direction) if ('up' === param.direction) await page.scrollUp(param.distance || void 0, startingPoint);
167
+ else if ('left' === param.direction) await page.scrollLeft(param.distance || void 0, startingPoint);
168
+ else if ('right' === param.direction) await page.scrollRight(param.distance || void 0, startingPoint);
169
+ else throw new Error(`Unknown scroll direction: ${param.direction}`);
170
+ else await page.scrollDown(param?.distance || void 0, startingPoint);
171
+ await sleep(500);
172
+ }
173
+ }),
174
+ defineActionDragAndDrop(async (param)=>{
175
+ const from = param.from;
176
+ const to = param.to;
177
+ node_assert(from, 'missing "from" param for drag and drop');
178
+ node_assert(to, 'missing "to" param for drag and drop');
179
+ await page.mouse.drag({
180
+ x: from.center[0],
181
+ y: from.center[1]
182
+ }, {
183
+ x: to.center[0],
184
+ y: to.center[1]
185
+ });
186
+ }),
187
+ defineActionLongPress(async (param)=>{
188
+ const element = param.locate;
189
+ node_assert(element, 'Element not found, cannot long press');
190
+ const duration = param?.duration;
191
+ await page.longPress(element.center[0], element.center[1], duration);
192
+ }),
193
+ ...includeTouchEvents ? [
194
+ defineActionSwipe(async (param)=>{
195
+ const { width, height } = await page.size();
196
+ const { start, end } = param;
197
+ const startPoint = start ? {
198
+ x: start.center[0],
199
+ y: start.center[1]
200
+ } : {
201
+ x: width / 2,
202
+ y: height / 2
203
+ };
204
+ let endPoint;
205
+ if (end) endPoint = {
206
+ x: end.center[0],
207
+ y: end.center[1]
208
+ };
209
+ else if (param.distance) {
210
+ const direction = param.direction;
211
+ if (!direction) throw new Error('direction is required for swipe gesture');
212
+ endPoint = {
213
+ x: startPoint.x + ('right' === direction ? param.distance : 'left' === direction ? -param.distance : 0),
214
+ y: startPoint.y + ('down' === direction ? param.distance : 'up' === direction ? -param.distance : 0)
215
+ };
216
+ } else throw new Error('Either end or distance must be specified for swipe gesture');
217
+ endPoint.x = Math.max(0, Math.min(endPoint.x, width));
218
+ endPoint.y = Math.max(0, Math.min(endPoint.y, height));
219
+ const duration = param.duration;
220
+ debug(`swipe from ${startPoint.x}, ${startPoint.y} to ${endPoint.x}, ${endPoint.y} with duration ${duration}ms, repeat is set to ${param.repeat}`);
221
+ let repeat = 'number' == typeof param.repeat ? param.repeat : 1;
222
+ if (0 === repeat) repeat = 10;
223
+ for(let i = 0; i < repeat; i++)await page.swipe(startPoint, endPoint, duration);
224
+ })
225
+ ] : [],
226
+ defineActionClearInput(async (param)=>{
227
+ await page.clearInput(param.locate);
228
+ }),
229
+ defineAction({
230
+ name: 'Navigate',
231
+ description: 'Navigate the browser to a specified URL. Opens the URL in the current tab.',
232
+ paramSchema: navigateParamSchema,
233
+ sample: {
234
+ url: 'https://www.example.com'
235
+ },
236
+ call: async (param)=>{
237
+ if (!page.navigate) throw new Error('Navigate operation is not supported on this page type');
238
+ await page.navigate(param.url);
239
+ }
240
+ }),
241
+ defineAction({
242
+ name: 'Reload',
243
+ description: 'Reload the current page',
244
+ call: async ()=>{
245
+ if (!page.reload) throw new Error('Reload operation is not supported on this page type');
246
+ await page.reload();
247
+ }
248
+ }),
249
+ defineAction({
250
+ name: 'GoBack',
251
+ description: 'Navigate back in browser history',
252
+ call: async ()=>{
253
+ if (!page.goBack) throw new Error('GoBack operation is not supported on this page type');
254
+ await page.goBack();
255
+ }
256
+ })
257
+ ];
258
+ export { AbstractWebPage, commonWebActionsForWebPage, getKeyCommands };
259
+
260
+ //# sourceMappingURL=web-page.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-page.mjs","sources":["../../src/web-page.ts"],"sourcesContent":["import assert from 'node:assert';\nimport type { Point } from '@midscene/core';\nimport { z } from '@midscene/core';\nimport {\n AbstractInterface,\n type DeviceAction,\n defineAction,\n defineActionClearInput,\n defineActionCursorMove,\n defineActionDoubleClick,\n defineActionDragAndDrop,\n defineActionHover,\n defineActionInput,\n defineActionKeyboardPress,\n defineActionLongPress,\n defineActionRightClick,\n defineActionScroll,\n defineActionSwipe,\n defineActionTap,\n} from '@midscene/core/device';\n\nimport { sleep } from '@midscene/core/utils';\nimport type { ElementInfo } from '@midscene/shared/extractor';\nimport { getDebug } from '@midscene/shared/logger';\nimport { transformHotkeyInput } from '@midscene/shared/us-keyboard-layout';\n\nconst debug = getDebug('web:page');\n\nconst navigateParamSchema = z.object({\n url: z\n .string()\n .describe(\n 'The URL to navigate to. Must start with https://, file://, or a similar protocol.',\n ),\n});\n\nfunction normalizeKeyInputs(value: string | string[]): string[] {\n const inputs = Array.isArray(value) ? value : [value];\n const result: string[] = [];\n\n for (const input of inputs) {\n if (typeof input !== 'string') {\n result.push(input as unknown as string);\n continue;\n }\n\n const trimmed = input.trim();\n if (!trimmed) {\n result.push(input);\n continue;\n }\n\n let normalized = trimmed;\n if (normalized.length > 1 && normalized.includes('+')) {\n normalized = normalized.replace(/\\s*\\+\\s*/g, ' ');\n }\n if (/\\s/.test(normalized)) {\n normalized = normalized.replace(/\\s+/g, ' ');\n }\n\n const transformed = transformHotkeyInput(normalized);\n if (transformed.length === 1 && transformed[0] === '' && trimmed !== '') {\n result.push(input);\n continue;\n }\n if (transformed.length === 0) {\n result.push(input);\n continue;\n }\n\n result.push(...transformed);\n }\n\n return result;\n}\n\nexport function getKeyCommands(\n value: string | string[],\n): Array<{ key: string; command?: string }> {\n const keys = normalizeKeyInputs(value);\n\n return keys.reduce((acc: Array<{ key: string; command?: string }>, k) => {\n const includeMeta = keys.includes('Meta') || keys.includes('Control');\n if (includeMeta && (k === 'a' || k === 'A')) {\n return acc.concat([{ key: k, command: 'SelectAll' }]);\n }\n if (includeMeta && (k === 'c' || k === 'C')) {\n return acc.concat([{ key: k, command: 'Copy' }]);\n }\n if (includeMeta && (k === 'v' || k === 'V')) {\n return acc.concat([{ key: k, command: 'Paste' }]);\n }\n return acc.concat([{ key: k }]);\n }, []);\n}\n\n// this is copied from puppeteer, but we don't want to import puppeteer here\nexport declare type KeyInput =\n | '0'\n | '1'\n | '2'\n | '3'\n | '4'\n | '5'\n | '6'\n | '7'\n | '8'\n | '9'\n | 'Power'\n | 'Eject'\n | 'Abort'\n | 'Help'\n | 'Backspace'\n | 'Tab'\n | 'Numpad5'\n | 'NumpadEnter'\n | 'Enter'\n | '\\r'\n | '\\n'\n | 'ShiftLeft'\n | 'ShiftRight'\n | 'ControlLeft'\n | 'ControlRight'\n | 'AltLeft'\n | 'AltRight'\n | 'Pause'\n | 'CapsLock'\n | 'Escape'\n | 'Convert'\n | 'NonConvert'\n | 'Space'\n | 'Numpad9'\n | 'PageUp'\n | 'Numpad3'\n | 'PageDown'\n | 'End'\n | 'Numpad1'\n | 'Home'\n | 'Numpad7'\n | 'ArrowLeft'\n | 'Numpad4'\n | 'Numpad8'\n | 'ArrowUp'\n | 'ArrowRight'\n | 'Numpad6'\n | 'Numpad2'\n | 'ArrowDown'\n | 'Select'\n | 'Open'\n | 'PrintScreen'\n | 'Insert'\n | 'Numpad0'\n | 'Delete'\n | 'NumpadDecimal'\n | 'Digit0'\n | 'Digit1'\n | 'Digit2'\n | 'Digit3'\n | 'Digit4'\n | 'Digit5'\n | 'Digit6'\n | 'Digit7'\n | 'Digit8'\n | 'Digit9'\n | 'KeyA'\n | 'KeyB'\n | 'KeyC'\n | 'KeyD'\n | 'KeyE'\n | 'KeyF'\n | 'KeyG'\n | 'KeyH'\n | 'KeyI'\n | 'KeyJ'\n | 'KeyK'\n | 'KeyL'\n | 'KeyM'\n | 'KeyN'\n | 'KeyO'\n | 'KeyP'\n | 'KeyQ'\n | 'KeyR'\n | 'KeyS'\n | 'KeyT'\n | 'KeyU'\n | 'KeyV'\n | 'KeyW'\n | 'KeyX'\n | 'KeyY'\n | 'KeyZ'\n | 'MetaLeft'\n | 'MetaRight'\n | 'ContextMenu'\n | 'NumpadMultiply'\n | 'NumpadAdd'\n | 'NumpadSubtract'\n | 'NumpadDivide'\n | 'F1'\n | 'F2'\n | 'F3'\n | 'F4'\n | 'F5'\n | 'F6'\n | 'F7'\n | 'F8'\n | 'F9'\n | 'F10'\n | 'F11'\n | 'F12'\n | 'F13'\n | 'F14'\n | 'F15'\n | 'F16'\n | 'F17'\n | 'F18'\n | 'F19'\n | 'F20'\n | 'F21'\n | 'F22'\n | 'F23'\n | 'F24'\n | 'NumLock'\n | 'ScrollLock'\n | 'AudioVolumeMute'\n | 'AudioVolumeDown'\n | 'AudioVolumeUp'\n | 'MediaTrackNext'\n | 'MediaTrackPrevious'\n | 'MediaStop'\n | 'MediaPlayPause'\n | 'Semicolon'\n | 'Equal'\n | 'NumpadEqual'\n | 'Comma'\n | 'Minus'\n | 'Period'\n | 'Slash'\n | 'Backquote'\n | 'BracketLeft'\n | 'Backslash'\n | 'BracketRight'\n | 'Quote'\n | 'AltGraph'\n | 'Props'\n | 'Cancel'\n | 'Clear'\n | 'Shift'\n | 'Control'\n | 'Alt'\n | 'Accept'\n | 'ModeChange'\n | ' '\n | 'Print'\n | 'Execute'\n | '\\u0000'\n | 'a'\n | 'b'\n | 'c'\n | 'd'\n | 'e'\n | 'f'\n | 'g'\n | 'h'\n | 'i'\n | 'j'\n | 'k'\n | 'l'\n | 'm'\n | 'n'\n | 'o'\n | 'p'\n | 'q'\n | 'r'\n | 's'\n | 't'\n | 'u'\n | 'v'\n | 'w'\n | 'x'\n | 'y'\n | 'z'\n | 'Meta'\n | '*'\n | '+'\n | '-'\n | '/'\n | ';'\n | '='\n | ','\n | '.'\n | '`'\n | '['\n | '\\\\'\n | ']'\n | \"'\"\n | 'Attn'\n | 'CrSel'\n | 'ExSel'\n | 'EraseEof'\n | 'Play'\n | 'ZoomOut'\n | ')'\n | '!'\n | '@'\n | '#'\n | '$'\n | '%'\n | '^'\n | '&'\n | '('\n | 'A'\n | 'B'\n | 'C'\n | 'D'\n | 'E'\n | 'F'\n | 'G'\n | 'H'\n | 'I'\n | 'J'\n | 'K'\n | 'L'\n | 'M'\n | 'N'\n | 'O'\n | 'P'\n | 'Q'\n | 'R'\n | 'S'\n | 'T'\n | 'U'\n | 'V'\n | 'W'\n | 'X'\n | 'Y'\n | 'Z'\n | ':'\n | '<'\n | '_'\n | '>'\n | '?'\n | '~'\n | '{'\n | '|'\n | '}'\n | '\"'\n | 'SoftLeft'\n | 'SoftRight'\n | 'Camera'\n | 'Call'\n | 'EndCall'\n | 'VolumeDown'\n | 'VolumeUp';\n\nexport type MouseButton = 'left' | 'right' | 'middle';\n\nexport interface MouseAction {\n click: (\n x: number,\n y: number,\n options: { button: MouseButton; count?: number },\n ) => Promise<void>;\n wheel: (deltaX: number, deltaY: number) => Promise<void>;\n move: (x: number, y: number) => Promise<void>;\n drag: (\n from: { x: number; y: number },\n to: { x: number; y: number },\n ) => Promise<void>;\n}\n\nexport interface KeyboardAction {\n type: (text: string) => Promise<void>;\n press: (\n action:\n | { key: KeyInput; command?: string }\n | { key: KeyInput; command?: string }[],\n ) => Promise<void>;\n}\n\nexport interface ChromePageDestroyOptions {\n closeTab?: boolean; // should close the tab when the page object is destroyed\n}\n\nexport abstract class AbstractWebPage extends AbstractInterface {\n navigate?(url: string): Promise<void>;\n reload?(): Promise<void>;\n goBack?(): Promise<void>;\n\n get mouse(): MouseAction {\n return {\n click: async (\n x: number,\n y: number,\n options: { button: MouseButton },\n ) => {},\n wheel: async (deltaX: number, deltaY: number) => {},\n move: async (x: number, y: number) => {},\n drag: async (\n from: { x: number; y: number },\n to: { x: number; y: number },\n ) => {},\n };\n }\n\n get keyboard(): KeyboardAction {\n return {\n type: async (text: string) => {},\n press: async (\n action:\n | { key: KeyInput; command?: string }\n | { key: KeyInput; command?: string }[],\n ) => {},\n };\n }\n\n async clearInput(element?: ElementInfo): Promise<void> {}\n\n abstract scrollUntilTop(startingPoint?: Point): Promise<void>;\n abstract scrollUntilBottom(startingPoint?: Point): Promise<void>;\n abstract scrollUntilLeft(startingPoint?: Point): Promise<void>;\n abstract scrollUntilRight(startingPoint?: Point): Promise<void>;\n abstract scrollUp(distance?: number, startingPoint?: Point): Promise<void>;\n abstract scrollDown(distance?: number, startingPoint?: Point): Promise<void>;\n abstract scrollLeft(distance?: number, startingPoint?: Point): Promise<void>;\n abstract scrollRight(distance?: number, startingPoint?: Point): Promise<void>;\n abstract longPress(x: number, y: number, duration?: number): Promise<void>;\n abstract swipe(\n from: { x: number; y: number },\n to: { x: number; y: number },\n duration?: number,\n ): Promise<void>;\n}\n\nexport const commonWebActionsForWebPage = <T extends AbstractWebPage>(\n page: T,\n includeTouchEvents = false,\n): DeviceAction<any>[] => [\n defineActionTap(async (param) => {\n const element = param.locate;\n assert(element, 'Element not found, cannot tap');\n\n // Pure tap action - file handling is done at Page layer via setFileChooserHandler\n await page.mouse.click(element.center[0], element.center[1], {\n button: 'left',\n });\n }),\n defineActionRightClick(async (param) => {\n const element = param.locate;\n assert(element, 'Element not found, cannot right click');\n await page.mouse.click(element.center[0], element.center[1], {\n button: 'right',\n });\n }),\n defineActionDoubleClick(async (param) => {\n const element = param.locate;\n assert(element, 'Element not found, cannot double click');\n\n await page.mouse.click(element.center[0], element.center[1], {\n button: 'left',\n count: 2,\n });\n }),\n defineActionHover(async (param) => {\n const element = param.locate;\n assert(element, 'Element not found, cannot hover');\n await page.mouse.move(element.center[0], element.center[1]);\n }),\n defineActionInput(async (param) => {\n const element = param.locate;\n if (element && param.mode !== 'typeOnly') {\n await page.clearInput(element as unknown as ElementInfo);\n } else if (element && param.mode === 'typeOnly') {\n // typeOnly mode: click to focus and move cursor to end, but don't clear\n await page.mouse.click(element.center[0], element.center[1], {\n button: 'left',\n });\n await page.keyboard.press([{ key: 'End' }]);\n }\n\n if (param.mode === 'clear') {\n return;\n }\n\n if (!param || !param.value) {\n return;\n }\n\n // Note: there is another implementation in AndroidDevicePage, which is more complex\n await page.keyboard.type(param.value);\n }),\n defineActionKeyboardPress(async (param) => {\n const element = param.locate;\n if (element) {\n await page.mouse.click(element.center[0], element.center[1], {\n button: 'left',\n });\n }\n\n const keys = getKeyCommands(param.keyName);\n await page.keyboard.press(keys as any); // TODO: fix this type error\n }),\n defineActionCursorMove(async (param) => {\n const arrowKey = param.direction === 'left' ? 'ArrowLeft' : 'ArrowRight';\n const times = param.times ?? 1;\n for (let i = 0; i < times; i++) {\n await page.keyboard.press([{ key: arrowKey as any }]);\n await sleep(100);\n }\n }),\n defineActionScroll(async (param) => {\n const element = param.locate;\n const startingPoint = element\n ? {\n left: element.center[0],\n top: element.center[1],\n }\n : undefined;\n const scrollToEventName = param?.scrollType;\n if (scrollToEventName === 'scrollToTop') {\n await page.scrollUntilTop(startingPoint);\n } else if (scrollToEventName === 'scrollToBottom') {\n await page.scrollUntilBottom(startingPoint);\n } else if (scrollToEventName === 'scrollToRight') {\n await page.scrollUntilRight(startingPoint);\n } else if (scrollToEventName === 'scrollToLeft') {\n await page.scrollUntilLeft(startingPoint);\n } else if (scrollToEventName === 'singleAction' || !scrollToEventName) {\n if (param?.direction === 'down' || !param || !param.direction) {\n await page.scrollDown(param?.distance || undefined, startingPoint);\n } else if (param.direction === 'up') {\n await page.scrollUp(param.distance || undefined, startingPoint);\n } else if (param.direction === 'left') {\n await page.scrollLeft(param.distance || undefined, startingPoint);\n } else if (param.direction === 'right') {\n await page.scrollRight(param.distance || undefined, startingPoint);\n } else {\n throw new Error(`Unknown scroll direction: ${param.direction}`);\n }\n // until mouse event is done\n await sleep(500);\n } else {\n throw new Error(\n `Unknown scroll event type: ${scrollToEventName}, param: ${JSON.stringify(\n param,\n )}`,\n );\n }\n }),\n defineActionDragAndDrop(async (param) => {\n const from = param.from;\n const to = param.to;\n assert(from, 'missing \"from\" param for drag and drop');\n assert(to, 'missing \"to\" param for drag and drop');\n await page.mouse.drag(\n {\n x: from.center[0],\n y: from.center[1],\n },\n {\n x: to.center[0],\n y: to.center[1],\n },\n );\n }),\n\n defineActionLongPress(async (param) => {\n const element = param.locate;\n assert(element, 'Element not found, cannot long press');\n const duration = param?.duration;\n await page.longPress(element.center[0], element.center[1], duration);\n }),\n\n ...(includeTouchEvents\n ? [\n defineActionSwipe(async (param) => {\n const { width, height } = await page.size();\n const { start, end } = param;\n\n const startPoint = start\n ? {\n x: start.center[0],\n y: start.center[1],\n }\n : {\n x: width / 2,\n y: height / 2,\n };\n\n let endPoint: {\n x: number;\n y: number;\n };\n\n if (end) {\n endPoint = {\n x: end.center[0],\n y: end.center[1],\n };\n } else if (param.distance) {\n const direction = param.direction;\n if (!direction) {\n throw new Error('direction is required for swipe gesture');\n }\n\n endPoint = {\n x:\n startPoint.x +\n (direction === 'right'\n ? param.distance\n : direction === 'left'\n ? -param.distance\n : 0),\n y:\n startPoint.y +\n (direction === 'down'\n ? param.distance\n : direction === 'up'\n ? -param.distance\n : 0),\n };\n } else {\n throw new Error(\n 'Either end or distance must be specified for swipe gesture',\n );\n }\n\n // Ensure end coordinates are within bounds\n endPoint.x = Math.max(0, Math.min(endPoint.x, width));\n endPoint.y = Math.max(0, Math.min(endPoint.y, height));\n\n const duration = param.duration;\n\n debug(\n `swipe from ${startPoint.x}, ${startPoint.y} to ${endPoint.x}, ${endPoint.y} with duration ${duration}ms, repeat is set to ${param.repeat}`,\n );\n let repeat = typeof param.repeat === 'number' ? param.repeat : 1;\n if (repeat === 0) {\n repeat = 10; // 10 times is enough for infinite swipe\n }\n for (let i = 0; i < repeat; i++) {\n await page.swipe(startPoint, endPoint, duration);\n }\n }),\n ]\n : []),\n\n defineActionClearInput(async (param) => {\n await page.clearInput(param.locate as ElementInfo | undefined);\n }),\n\n defineAction<typeof navigateParamSchema, { url: string }>({\n name: 'Navigate',\n description:\n 'Navigate the browser to a specified URL. Opens the URL in the current tab.',\n paramSchema: navigateParamSchema,\n sample: {\n url: 'https://www.example.com',\n },\n call: async (param) => {\n if (!page.navigate) {\n throw new Error(\n 'Navigate operation is not supported on this page type',\n );\n }\n await page.navigate(param.url);\n },\n }),\n\n defineAction({\n name: 'Reload',\n description: 'Reload the current page',\n call: async () => {\n if (!page.reload) {\n throw new Error('Reload operation is not supported on this page type');\n }\n await page.reload();\n },\n }),\n\n defineAction({\n name: 'GoBack',\n description: 'Navigate back in browser history',\n call: async () => {\n if (!page.goBack) {\n throw new Error('GoBack operation is not supported on this page type');\n }\n await page.goBack();\n },\n }),\n];\n"],"names":["debug","getDebug","navigateParamSchema","z","normalizeKeyInputs","value","inputs","Array","result","input","trimmed","normalized","transformed","transformHotkeyInput","getKeyCommands","keys","acc","k","includeMeta","AbstractWebPage","AbstractInterface","x","y","options","deltaX","deltaY","from","to","text","action","element","commonWebActionsForWebPage","page","includeTouchEvents","defineActionTap","param","assert","defineActionRightClick","defineActionDoubleClick","defineActionHover","defineActionInput","defineActionKeyboardPress","defineActionCursorMove","arrowKey","times","i","sleep","defineActionScroll","startingPoint","undefined","scrollToEventName","Error","JSON","defineActionDragAndDrop","defineActionLongPress","duration","defineActionSwipe","width","height","start","end","startPoint","endPoint","direction","Math","repeat","defineActionClearInput","defineAction"],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ var __webpack_exports__ = {};
3
+ const playground_namespaceObject = require("@midscene/playground");
4
+ const index_js_namespaceObject = require("./static/index.js");
5
+ require("dotenv/config");
6
+ const core_namespaceObject = require("@midscene/core");
7
+ async function startServer() {
8
+ const page = new index_js_namespaceObject.StaticPage({
9
+ shotSize: {
10
+ width: 800,
11
+ height: 600
12
+ },
13
+ screenshot: core_namespaceObject.ScreenshotItem.create('', Date.now()),
14
+ shrunkShotToLogicalRatio: 1
15
+ });
16
+ const agent = new index_js_namespaceObject.StaticPageAgent(page);
17
+ const { server } = await (0, playground_namespaceObject.playgroundForAgent)(agent).launch({
18
+ openBrowser: false,
19
+ verbose: false
20
+ });
21
+ console.log(`Midscene playground server is running on http://localhost:${server.port}`);
22
+ }
23
+ startServer().catch(console.error);
24
+ for(var __rspack_i in __webpack_exports__)exports[__rspack_i] = __webpack_exports__[__rspack_i];
25
+ Object.defineProperty(exports, '__esModule', {
26
+ value: true
27
+ });
28
+
29
+ //# sourceMappingURL=bin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.js","sources":["../../src/bin.ts"],"sourcesContent":["import { playgroundForAgent } from '@midscene/playground';\nimport { StaticPage, StaticPageAgent } from './static';\nimport 'dotenv/config';\nimport { ScreenshotItem } from '@midscene/core';\n\nasync function startServer() {\n // Create page and agent instances with minimal valid data\n // Use screenshotBase64 field for empty screenshot\n const page = new StaticPage({\n shotSize: { width: 800, height: 600 },\n screenshot: ScreenshotItem.create('', Date.now()),\n shrunkShotToLogicalRatio: 1,\n });\n const agent = new StaticPageAgent(page);\n\n const { server } = await playgroundForAgent(agent).launch({\n openBrowser: false,\n verbose: false,\n });\n console.log(\n `Midscene playground server is running on http://localhost:${server.port}`,\n );\n}\n\nstartServer().catch(console.error);\n"],"names":["startServer","page","StaticPage","ScreenshotItem","Date","agent","StaticPageAgent","server","playgroundForAgent","console"],"mappings":";;;;;;AAKA,eAAeA;IAGb,MAAMC,OAAO,IAAIC,yBAAAA,UAAUA,CAAC;QAC1B,UAAU;YAAE,OAAO;YAAK,QAAQ;QAAI;QACpC,YAAYC,qBAAAA,cAAAA,CAAAA,MAAqB,CAAC,IAAIC,KAAK,GAAG;QAC9C,0BAA0B;IAC5B;IACA,MAAMC,QAAQ,IAAIC,yBAAAA,eAAeA,CAACL;IAElC,MAAM,EAAEM,MAAM,EAAE,GAAG,MAAMC,AAAAA,IAAAA,2BAAAA,kBAAAA,AAAAA,EAAmBH,OAAO,MAAM,CAAC;QACxD,aAAa;QACb,SAAS;IACX;IACAI,QAAQ,GAAG,CACT,CAAC,0DAA0D,EAAEF,OAAO,IAAI,EAAE;AAE9E;AAEAP,cAAc,KAAK,CAACS,QAAQ,KAAK"}
@@ -0,0 +1,174 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.d = (exports1, definition)=>{
5
+ for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
6
+ enumerable: true,
7
+ get: definition[key]
8
+ });
9
+ };
10
+ })();
11
+ (()=>{
12
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
13
+ })();
14
+ (()=>{
15
+ __webpack_require__.r = (exports1)=>{
16
+ if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
17
+ value: 'Module'
18
+ });
19
+ Object.defineProperty(exports1, '__esModule', {
20
+ value: true
21
+ });
22
+ };
23
+ })();
24
+ var __webpack_exports__ = {};
25
+ __webpack_require__.r(__webpack_exports__);
26
+ __webpack_require__.d(__webpack_exports__, {
27
+ AgentOverChromeBridge: ()=>AgentOverChromeBridge,
28
+ getBridgePageInCliSide: ()=>getBridgePageInCliSide
29
+ });
30
+ const agent_namespaceObject = require("@midscene/core/agent");
31
+ const utils_namespaceObject = require("@midscene/shared/utils");
32
+ const external_web_page_js_namespaceObject = require("../web-page.js");
33
+ const external_common_js_namespaceObject = require("./common.js");
34
+ const external_io_server_js_namespaceObject = require("./io-server.js");
35
+ function _define_property(obj, key, value) {
36
+ if (key in obj) Object.defineProperty(obj, key, {
37
+ value: value,
38
+ enumerable: true,
39
+ configurable: true,
40
+ writable: true
41
+ });
42
+ else obj[key] = value;
43
+ return obj;
44
+ }
45
+ const sleep = (ms)=>new Promise((resolve)=>setTimeout(resolve, ms));
46
+ const getBridgePageInCliSide = (options)=>{
47
+ const host = options?.host || external_common_js_namespaceObject.DefaultBridgeServerHost;
48
+ const port = options?.port || external_common_js_namespaceObject.DefaultBridgeServerPort;
49
+ const server = new external_io_server_js_namespaceObject.BridgeServer(host, port, void 0, void 0, options?.closeConflictServer);
50
+ server.listen({
51
+ timeout: options?.timeout
52
+ });
53
+ const bridgeCaller = (method, timeout)=>async (...args)=>{
54
+ const response = await server.call(method, args, timeout);
55
+ return response;
56
+ };
57
+ const page = {
58
+ showStatusMessage: async (message)=>{
59
+ await server.call(external_common_js_namespaceObject.BridgeEvent.UpdateAgentStatus, [
60
+ message
61
+ ]);
62
+ }
63
+ };
64
+ const proxyPage = new Proxy(page, {
65
+ get (target, prop, receiver) {
66
+ (0, utils_namespaceObject.assert)('string' == typeof prop, 'prop must be a string');
67
+ if ('toJSON' === prop) return ()=>({
68
+ interfaceType: external_common_js_namespaceObject.BridgePageType
69
+ });
70
+ if ('interfaceType' === prop) return external_common_js_namespaceObject.BridgePageType;
71
+ if ('actionSpace' === prop) return ()=>(0, external_web_page_js_namespaceObject.commonWebActionsForWebPage)(proxyPage);
72
+ if (Object.keys(page).includes(prop)) return page[prop];
73
+ if ('mouse' === prop) {
74
+ const mouse = {
75
+ click: bridgeCaller(external_common_js_namespaceObject.MouseEvent.Click),
76
+ wheel: bridgeCaller(external_common_js_namespaceObject.MouseEvent.Wheel),
77
+ move: bridgeCaller(external_common_js_namespaceObject.MouseEvent.Move),
78
+ drag: bridgeCaller(external_common_js_namespaceObject.MouseEvent.Drag)
79
+ };
80
+ return mouse;
81
+ }
82
+ if ('keyboard' === prop) {
83
+ const keyboard = {
84
+ type: bridgeCaller(external_common_js_namespaceObject.KeyboardEvent.Type),
85
+ press: bridgeCaller(external_common_js_namespaceObject.KeyboardEvent.Press)
86
+ };
87
+ return keyboard;
88
+ }
89
+ if ('destroy' === prop) return async (...args)=>{
90
+ try {
91
+ const caller = bridgeCaller('destroy');
92
+ await caller(...args);
93
+ } catch (e) {}
94
+ return server.close();
95
+ };
96
+ if ('connectNewTabWithUrl' === prop) return async (url, options)=>{
97
+ const timeout = options?.timeout;
98
+ const caller = bridgeCaller(prop, timeout);
99
+ return await caller(url, options);
100
+ };
101
+ if ('connectCurrentTab' === prop) return async (options)=>{
102
+ const timeout = options?.timeout;
103
+ const caller = bridgeCaller(prop, timeout);
104
+ return await caller(options);
105
+ };
106
+ return bridgeCaller(prop);
107
+ }
108
+ });
109
+ return proxyPage;
110
+ };
111
+ class AgentOverChromeBridge extends agent_namespaceObject.Agent {
112
+ async setDestroyOptionsAfterConnect() {
113
+ if (this.destroyAfterDisconnectFlag) this.page.setDestroyOptions({
114
+ closeTab: true
115
+ });
116
+ }
117
+ async connectNewTabWithUrl(url, options) {
118
+ await this.page.connectNewTabWithUrl(url, options);
119
+ await sleep(500);
120
+ await this.setDestroyOptionsAfterConnect();
121
+ }
122
+ async getBrowserTabList() {
123
+ return await this.page.getBrowserTabList();
124
+ }
125
+ async setActiveTabId(tabId) {
126
+ return await this.page.setActiveTabId(Number.parseInt(tabId));
127
+ }
128
+ async connectCurrentTab(options) {
129
+ await this.page.connectCurrentTab(options);
130
+ await sleep(500);
131
+ await this.setDestroyOptionsAfterConnect();
132
+ }
133
+ async aiAct(prompt, options) {
134
+ if (options) console.warn('the `options` parameter of aiAct is not supported in cli side');
135
+ return await super.aiAct(prompt);
136
+ }
137
+ async destroy(closeNewTabsAfterDisconnect) {
138
+ if ('boolean' == typeof closeNewTabsAfterDisconnect) await this.page.setDestroyOptions({
139
+ closeTab: closeNewTabsAfterDisconnect
140
+ });
141
+ await super.destroy();
142
+ }
143
+ constructor(opts){
144
+ const host = (0, external_common_js_namespaceObject.getBridgeServerHost)({
145
+ host: opts?.host,
146
+ allowRemoteAccess: opts?.allowRemoteAccess
147
+ });
148
+ const page = getBridgePageInCliSide({
149
+ host,
150
+ port: opts?.port,
151
+ timeout: opts?.serverListeningTimeout,
152
+ closeConflictServer: opts?.closeConflictServer
153
+ });
154
+ const originalOnTaskStartTip = opts?.onTaskStartTip;
155
+ super(page, Object.assign(opts || {}, {
156
+ onTaskStartTip: (tip)=>{
157
+ this.page.showStatusMessage(tip);
158
+ if (originalOnTaskStartTip) originalOnTaskStartTip?.call(this, tip);
159
+ }
160
+ })), _define_property(this, "destroyAfterDisconnectFlag", void 0);
161
+ this.destroyAfterDisconnectFlag = opts?.closeNewTabsAfterDisconnect;
162
+ }
163
+ }
164
+ exports.AgentOverChromeBridge = __webpack_exports__.AgentOverChromeBridge;
165
+ exports.getBridgePageInCliSide = __webpack_exports__.getBridgePageInCliSide;
166
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
167
+ "AgentOverChromeBridge",
168
+ "getBridgePageInCliSide"
169
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
170
+ Object.defineProperty(exports, '__esModule', {
171
+ value: true
172
+ });
173
+
174
+ //# sourceMappingURL=agent-cli-side.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge-mode/agent-cli-side.js","sources":["webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../../src/bridge-mode/agent-cli-side.ts"],"sourcesContent":["__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import { Agent, type AgentOpt } from '@midscene/core/agent';\nimport { assert } from '@midscene/shared/utils';\nimport { commonWebActionsForWebPage } from '../web-page';\nimport type { KeyboardAction, MouseAction } from '../web-page';\nimport {\n type BridgeConnectTabOptions,\n BridgeEvent,\n BridgePageType,\n DefaultBridgeServerHost,\n DefaultBridgeServerPort,\n KeyboardEvent,\n MouseEvent,\n getBridgeServerHost,\n} from './common';\nimport { BridgeServer } from './io-server';\nimport type { ExtensionBridgePageBrowserSide } from './page-browser-side';\n\ninterface ChromeExtensionPageCliSide extends ExtensionBridgePageBrowserSide {\n showStatusMessage: (message: string) => Promise<void>;\n}\n\nconst sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n\n// actually, this is a proxy to the page in browser side\nexport const getBridgePageInCliSide = (options?: {\n host?: string;\n port?: number;\n timeout?: number | false;\n closeConflictServer?: boolean;\n}): ChromeExtensionPageCliSide => {\n const host = options?.host || DefaultBridgeServerHost;\n const port = options?.port || DefaultBridgeServerPort;\n const server = new BridgeServer(\n host,\n port,\n undefined,\n undefined,\n options?.closeConflictServer,\n );\n server.listen({\n timeout: options?.timeout,\n });\n const bridgeCaller = (method: string, timeout?: number) => {\n return async (...args: any[]) => {\n const response = await server.call(method, args, timeout);\n return response;\n };\n };\n const page = {\n showStatusMessage: async (message: string) => {\n await server.call(BridgeEvent.UpdateAgentStatus, [message]);\n },\n };\n\n const proxyPage = new Proxy(page, {\n get(target, prop, receiver) {\n assert(typeof prop === 'string', 'prop must be a string');\n\n if (prop === 'toJSON') {\n return () => {\n return {\n interfaceType: BridgePageType,\n };\n };\n }\n\n if (prop === 'interfaceType') {\n return BridgePageType;\n }\n\n if (prop === 'actionSpace') {\n return () => commonWebActionsForWebPage(proxyPage);\n }\n\n if (Object.keys(page).includes(prop)) {\n return page[prop as keyof typeof page];\n }\n\n if (prop === 'mouse') {\n const mouse: MouseAction = {\n click: bridgeCaller(MouseEvent.Click),\n wheel: bridgeCaller(MouseEvent.Wheel),\n move: bridgeCaller(MouseEvent.Move),\n drag: bridgeCaller(MouseEvent.Drag),\n };\n return mouse;\n }\n\n if (prop === 'keyboard') {\n const keyboard: KeyboardAction = {\n type: bridgeCaller(KeyboardEvent.Type),\n press: bridgeCaller(KeyboardEvent.Press),\n };\n return keyboard;\n }\n\n if (prop === 'destroy') {\n return async (...args: any[]) => {\n try {\n const caller = bridgeCaller('destroy');\n await caller(...args);\n } catch (e) {\n // console.error('error calling destroy', e);\n }\n return server.close();\n };\n }\n\n // Special handling for methods that support timeout in options\n if (prop === 'connectNewTabWithUrl') {\n return async (url: string, options?: BridgeConnectTabOptions) => {\n const timeout = options?.timeout;\n const caller = bridgeCaller(prop, timeout);\n return await caller(url, options);\n };\n }\n\n if (prop === 'connectCurrentTab') {\n return async (options?: BridgeConnectTabOptions) => {\n const timeout = options?.timeout;\n const caller = bridgeCaller(prop, timeout);\n return await caller(options);\n };\n }\n\n return bridgeCaller(prop);\n },\n }) as ChromeExtensionPageCliSide;\n\n return proxyPage;\n};\n\nexport class AgentOverChromeBridge extends Agent<ChromeExtensionPageCliSide> {\n private destroyAfterDisconnectFlag?: boolean;\n\n constructor(\n opts?: AgentOpt & {\n /**\n * Enable remote access to the bridge server.\n * - false (default): Only localhost can connect (most secure)\n * - true: Allow remote machines to connect (binds to 0.0.0.0)\n */\n allowRemoteAccess?: boolean;\n /**\n * Custom host to bind the bridge server to.\n * Overrides allowRemoteAccess if specified.\n */\n host?: string;\n /**\n * Custom port for the bridge server.\n * @default 3766\n */\n port?: number;\n closeNewTabsAfterDisconnect?: boolean;\n serverListeningTimeout?: number | false;\n closeConflictServer?: boolean;\n },\n ) {\n const host = getBridgeServerHost({\n host: opts?.host,\n allowRemoteAccess: opts?.allowRemoteAccess,\n });\n const page = getBridgePageInCliSide({\n host,\n port: opts?.port,\n timeout: opts?.serverListeningTimeout,\n closeConflictServer: opts?.closeConflictServer,\n });\n const originalOnTaskStartTip = opts?.onTaskStartTip;\n super(\n page,\n Object.assign(opts || {}, {\n onTaskStartTip: (tip: string) => {\n this.page.showStatusMessage(tip);\n if (originalOnTaskStartTip) {\n originalOnTaskStartTip?.call(this, tip);\n }\n },\n }),\n );\n this.destroyAfterDisconnectFlag = opts?.closeNewTabsAfterDisconnect;\n }\n\n async setDestroyOptionsAfterConnect() {\n if (this.destroyAfterDisconnectFlag) {\n this.page.setDestroyOptions({\n closeTab: true,\n });\n }\n }\n\n async connectNewTabWithUrl(url: string, options?: BridgeConnectTabOptions) {\n await this.page.connectNewTabWithUrl(url, options);\n await sleep(500);\n await this.setDestroyOptionsAfterConnect();\n }\n\n async getBrowserTabList() {\n return await this.page.getBrowserTabList();\n }\n\n async setActiveTabId(tabId: string) {\n return await this.page.setActiveTabId(Number.parseInt(tabId));\n }\n\n async connectCurrentTab(options?: BridgeConnectTabOptions) {\n await this.page.connectCurrentTab(options);\n await sleep(500);\n await this.setDestroyOptionsAfterConnect();\n }\n\n async aiAct(prompt: string, options?: any) {\n if (options) {\n console.warn(\n 'the `options` parameter of aiAct is not supported in cli side',\n );\n }\n return await super.aiAct(prompt);\n }\n\n async destroy(closeNewTabsAfterDisconnect?: boolean) {\n if (typeof closeNewTabsAfterDisconnect === 'boolean') {\n await this.page.setDestroyOptions({\n closeTab: closeNewTabsAfterDisconnect,\n });\n }\n await super.destroy();\n }\n}\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","sleep","ms","Promise","resolve","setTimeout","getBridgePageInCliSide","options","host","DefaultBridgeServerHost","port","DefaultBridgeServerPort","server","BridgeServer","undefined","bridgeCaller","method","timeout","args","response","page","message","BridgeEvent","proxyPage","Proxy","target","receiver","assert","BridgePageType","commonWebActionsForWebPage","mouse","MouseEvent","keyboard","KeyboardEvent","caller","e","url","AgentOverChromeBridge","Agent","tabId","Number","prompt","console","closeNewTabsAfterDisconnect","opts","getBridgeServerHost","originalOnTaskStartTip","tip"],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.d = (exports1, definition)=>{
5
+ for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
6
+ enumerable: true,
7
+ get: definition[key]
8
+ });
9
+ };
10
+ })();
11
+ (()=>{
12
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
13
+ })();
14
+ (()=>{
15
+ __webpack_require__.r = (exports1)=>{
16
+ if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
17
+ value: 'Module'
18
+ });
19
+ Object.defineProperty(exports1, '__esModule', {
20
+ value: true
21
+ });
22
+ };
23
+ })();
24
+ var __webpack_exports__ = {};
25
+ __webpack_require__.r(__webpack_exports__);
26
+ __webpack_require__.d(__webpack_exports__, {
27
+ ExtensionBridgePageBrowserSide: ()=>external_page_browser_side_js_namespaceObject.ExtensionBridgePageBrowserSide
28
+ });
29
+ const external_page_browser_side_js_namespaceObject = require("./page-browser-side.js");
30
+ exports.ExtensionBridgePageBrowserSide = __webpack_exports__.ExtensionBridgePageBrowserSide;
31
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
32
+ "ExtensionBridgePageBrowserSide"
33
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
34
+ Object.defineProperty(exports, '__esModule', {
35
+ value: true
36
+ });
37
+
38
+ //# sourceMappingURL=browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge-mode/browser.js","sources":["webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object"],"sourcesContent":["__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol"],"mappings":";;;IAAAA,oBAAoB,CAAC,GAAG,CAAC,UAASC;QACjC,IAAI,IAAIC,OAAOD,WACR,IAAGD,oBAAoB,CAAC,CAACC,YAAYC,QAAQ,CAACF,oBAAoB,CAAC,CAAC,UAASE,MACzEC,OAAO,cAAc,CAAC,UAASD,KAAK;YAAE,YAAY;YAAM,KAAKD,UAAU,CAACC,IAAI;QAAC;IAGzF;;;ICNAF,oBAAoB,CAAC,GAAG,CAACI,KAAKC,OAAUF,OAAO,SAAS,CAAC,cAAc,CAAC,IAAI,CAACC,KAAKC;;;ICClFL,oBAAoB,CAAC,GAAG,CAAC;QACxB,IAAG,AAAkB,eAAlB,OAAOM,UAA0BA,OAAO,WAAW,EACrDH,OAAO,cAAc,CAAC,UAASG,OAAO,WAAW,EAAE;YAAE,OAAO;QAAS;QAEtEH,OAAO,cAAc,CAAC,UAAS,cAAc;YAAE,OAAO;QAAK;IAC5D"}