mcp-accessibility-scanner 1.1.2 → 2.0.0

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 (110) hide show
  1. package/lib/browserContextFactory.js +83 -99
  2. package/lib/browserContextFactory.js.map +1 -1
  3. package/lib/browserServerBackend.js +78 -0
  4. package/lib/browserServerBackend.js.map +1 -0
  5. package/lib/config.js +77 -20
  6. package/lib/config.js.map +1 -1
  7. package/lib/context.js +109 -174
  8. package/lib/context.js.map +1 -1
  9. package/lib/extension/cdpRelay.js +359 -0
  10. package/lib/extension/cdpRelay.js.map +1 -0
  11. package/lib/extension/extensionContextFactory.js +57 -0
  12. package/lib/extension/extensionContextFactory.js.map +1 -0
  13. package/lib/extension/protocol.js +19 -0
  14. package/lib/extension/protocol.js.map +1 -0
  15. package/lib/index.js +7 -3
  16. package/lib/index.js.map +1 -1
  17. package/lib/{transport.js → mcp/http.js} +65 -63
  18. package/lib/mcp/http.js.map +1 -0
  19. package/lib/mcp/inProcessTransport.js +73 -0
  20. package/lib/mcp/inProcessTransport.js.map +1 -0
  21. package/lib/mcp/manualPromise.js.map +1 -0
  22. package/lib/mcp/mdb.js +199 -0
  23. package/lib/mcp/mdb.js.map +1 -0
  24. package/lib/mcp/proxyBackend.js +105 -0
  25. package/lib/mcp/proxyBackend.js.map +1 -0
  26. package/lib/mcp/server.js +124 -0
  27. package/lib/mcp/server.js.map +1 -0
  28. package/lib/mcp/tool.js +33 -0
  29. package/lib/mcp/tool.js.map +1 -0
  30. package/lib/program.js +81 -26
  31. package/lib/program.js.map +1 -1
  32. package/lib/response.js +166 -0
  33. package/lib/response.js.map +1 -0
  34. package/lib/sessionLog.js +122 -0
  35. package/lib/sessionLog.js.map +1 -0
  36. package/lib/tab.js +171 -23
  37. package/lib/tab.js.map +1 -1
  38. package/lib/tools/common.js +12 -25
  39. package/lib/tools/common.js.map +1 -1
  40. package/lib/tools/console.js +4 -15
  41. package/lib/tools/console.js.map +1 -1
  42. package/lib/tools/dialogs.js +14 -19
  43. package/lib/tools/dialogs.js.map +1 -1
  44. package/lib/tools/evaluate.js +54 -0
  45. package/lib/tools/evaluate.js.map +1 -0
  46. package/lib/tools/files.js +12 -19
  47. package/lib/tools/files.js.map +1 -1
  48. package/lib/tools/form.js +58 -0
  49. package/lib/tools/form.js.map +1 -0
  50. package/lib/tools/install.js +7 -10
  51. package/lib/tools/install.js.map +1 -1
  52. package/lib/tools/keyboard.js +49 -17
  53. package/lib/tools/keyboard.js.map +1 -1
  54. package/lib/tools/mouse.js +100 -0
  55. package/lib/tools/mouse.js.map +1 -0
  56. package/lib/tools/navigate.js +13 -52
  57. package/lib/tools/navigate.js.map +1 -1
  58. package/lib/tools/network.js +5 -15
  59. package/lib/tools/network.js.map +1 -1
  60. package/lib/tools/pdf.js +8 -17
  61. package/lib/tools/pdf.js.map +1 -1
  62. package/lib/tools/screenshot.js +36 -34
  63. package/lib/tools/screenshot.js.map +1 -1
  64. package/lib/tools/snapshot.js +103 -154
  65. package/lib/tools/snapshot.js.map +1 -1
  66. package/lib/tools/tabs.js +34 -93
  67. package/lib/tools/tabs.js.map +1 -1
  68. package/lib/tools/tool.js +15 -0
  69. package/lib/tools/tool.js.map +1 -1
  70. package/lib/tools/utils.js +7 -13
  71. package/lib/tools/utils.js.map +1 -1
  72. package/lib/tools/verify.js +138 -0
  73. package/lib/tools/verify.js.map +1 -0
  74. package/lib/tools/wait.js +11 -15
  75. package/lib/tools/wait.js.map +1 -1
  76. package/lib/tools.js +19 -23
  77. package/lib/tools.js.map +1 -1
  78. package/lib/{javascript.js → utils/codegen.js} +2 -2
  79. package/lib/utils/codegen.js.map +1 -0
  80. package/lib/{fileUtils.js → utils/fileUtils.js} +6 -2
  81. package/lib/utils/fileUtils.js.map +1 -0
  82. package/lib/utils/guid.js +23 -0
  83. package/lib/utils/guid.js.map +1 -0
  84. package/lib/utils/log.js +22 -0
  85. package/lib/utils/log.js.map +1 -0
  86. package/lib/{package.js → utils/package.js} +4 -4
  87. package/lib/utils/package.js.map +1 -0
  88. package/lib/vscode/host.js +129 -0
  89. package/lib/vscode/host.js.map +1 -0
  90. package/lib/vscode/main.js +63 -0
  91. package/lib/vscode/main.js.map +1 -0
  92. package/package.json +20 -20
  93. package/lib/browserServer.js +0 -152
  94. package/lib/browserServer.js.map +0 -1
  95. package/lib/connection.js +0 -83
  96. package/lib/connection.js.map +0 -1
  97. package/lib/fileUtils.js.map +0 -1
  98. package/lib/httpServer.js +0 -202
  99. package/lib/httpServer.js.map +0 -1
  100. package/lib/javascript.js.map +0 -1
  101. package/lib/manualPromise.js.map +0 -1
  102. package/lib/package.js.map +0 -1
  103. package/lib/pageSnapshot.js +0 -44
  104. package/lib/pageSnapshot.js.map +0 -1
  105. package/lib/server.js +0 -49
  106. package/lib/server.js.map +0 -1
  107. package/lib/tools/vision.js +0 -190
  108. package/lib/tools/vision.js.map +0 -1
  109. package/lib/transport.js.map +0 -1
  110. /package/lib/{manualPromise.js → mcp/manualPromise.js} +0 -0
package/lib/tab.js CHANGED
@@ -13,54 +13,111 @@
13
13
  * See the License for the specific language governing permissions and
14
14
  * limitations under the License.
15
15
  */
16
- import { PageSnapshot } from './pageSnapshot.js';
17
- import { callOnPageNoTrace } from './tools/utils.js';
18
- export class Tab {
16
+ import { EventEmitter } from 'events';
17
+ import { callOnPageNoTrace, waitForCompletion } from './tools/utils.js';
18
+ import { logUnhandledError } from './utils/log.js';
19
+ import { ManualPromise } from './mcp/manualPromise.js';
20
+ export const TabEvents = {
21
+ modalState: 'modalState'
22
+ };
23
+ export class Tab extends EventEmitter {
19
24
  context;
20
25
  page;
26
+ _lastTitle = 'about:blank';
21
27
  _consoleMessages = [];
28
+ _recentConsoleMessages = [];
22
29
  _requests = new Map();
23
- _snapshot;
24
30
  _onPageClose;
31
+ _modalStates = [];
32
+ _downloads = [];
25
33
  constructor(context, page, onPageClose) {
34
+ super();
26
35
  this.context = context;
27
36
  this.page = page;
28
37
  this._onPageClose = onPageClose;
29
- page.on('console', event => this._consoleMessages.push(event));
38
+ page.on('console', event => this._handleConsoleMessage(messageToConsoleMessage(event)));
39
+ page.on('pageerror', error => this._handleConsoleMessage(pageErrorToConsoleMessage(error)));
30
40
  page.on('request', request => this._requests.set(request, null));
31
41
  page.on('response', response => this._requests.set(response.request(), response));
32
42
  page.on('close', () => this._onClose());
33
43
  page.on('filechooser', chooser => {
34
- this.context.setModalState({
44
+ this.setModalState({
35
45
  type: 'fileChooser',
36
46
  description: 'File chooser',
37
47
  fileChooser: chooser,
38
- }, this);
48
+ });
39
49
  });
40
- page.on('dialog', dialog => this.context.dialogShown(this, dialog));
50
+ page.on('dialog', dialog => this._dialogShown(dialog));
41
51
  page.on('download', download => {
42
- void this.context.downloadStarted(this, download);
52
+ void this._downloadStarted(download);
43
53
  });
44
54
  page.setDefaultNavigationTimeout(60000);
45
55
  page.setDefaultTimeout(5000);
56
+ page[tabSymbol] = this;
57
+ }
58
+ static forPage(page) {
59
+ return page[tabSymbol];
60
+ }
61
+ modalStates() {
62
+ return this._modalStates;
63
+ }
64
+ setModalState(modalState) {
65
+ this._modalStates.push(modalState);
66
+ this.emit(TabEvents.modalState, modalState);
67
+ }
68
+ clearModalState(modalState) {
69
+ this._modalStates = this._modalStates.filter(state => state !== modalState);
70
+ }
71
+ modalStatesMarkdown() {
72
+ return renderModalStates(this.context, this.modalStates());
73
+ }
74
+ _dialogShown(dialog) {
75
+ this.setModalState({
76
+ type: 'dialog',
77
+ description: `"${dialog.type()}" dialog with message "${dialog.message()}"`,
78
+ dialog,
79
+ });
80
+ }
81
+ async _downloadStarted(download) {
82
+ const entry = {
83
+ download,
84
+ finished: false,
85
+ outputFile: await this.context.outputFile(download.suggestedFilename())
86
+ };
87
+ this._downloads.push(entry);
88
+ await download.saveAs(entry.outputFile);
89
+ entry.finished = true;
46
90
  }
47
91
  _clearCollectedArtifacts() {
48
92
  this._consoleMessages.length = 0;
93
+ this._recentConsoleMessages.length = 0;
49
94
  this._requests.clear();
50
95
  }
96
+ _handleConsoleMessage(message) {
97
+ this._consoleMessages.push(message);
98
+ this._recentConsoleMessages.push(message);
99
+ }
51
100
  _onClose() {
52
101
  this._clearCollectedArtifacts();
53
102
  this._onPageClose(this);
54
103
  }
55
- async title() {
56
- return await callOnPageNoTrace(this.page, page => page.title());
104
+ async updateTitle() {
105
+ await this._raceAgainstModalStates(async () => {
106
+ this._lastTitle = await callOnPageNoTrace(this.page, page => page.title());
107
+ });
108
+ }
109
+ lastTitle() {
110
+ return this._lastTitle;
111
+ }
112
+ isCurrentTab() {
113
+ return this === this.context.currentTab();
57
114
  }
58
115
  async waitForLoadState(state, options) {
59
- await callOnPageNoTrace(this.page, page => page.waitForLoadState(state, options).catch(() => { }));
116
+ await callOnPageNoTrace(this.page, page => page.waitForLoadState(state, options).catch(logUnhandledError));
60
117
  }
61
118
  async navigate(url) {
62
119
  this._clearCollectedArtifacts();
63
- const downloadEvent = callOnPageNoTrace(this.page, page => page.waitForEvent('download').catch(() => { }));
120
+ const downloadEvent = callOnPageNoTrace(this.page, page => page.waitForEvent('download').catch(logUnhandledError));
64
121
  try {
65
122
  await this.page.goto(url, { waitUntil: 'domcontentloaded' });
66
123
  }
@@ -73,22 +130,17 @@ export class Tab {
73
130
  // on chromium, the download event is fired *after* page.goto rejects, so we wait a lil bit
74
131
  const download = await Promise.race([
75
132
  downloadEvent,
76
- new Promise(resolve => setTimeout(resolve, 1000)),
133
+ new Promise(resolve => setTimeout(resolve, 3000)),
77
134
  ]);
78
135
  if (!download)
79
136
  throw e;
137
+ // Make sure other "download" listeners are notified first.
138
+ await new Promise(resolve => setTimeout(resolve, 500));
139
+ return;
80
140
  }
81
141
  // Cap load event to 5 seconds, the page is operational at this point.
82
142
  await this.waitForLoadState('load', { timeout: 5000 });
83
143
  }
84
- hasSnapshot() {
85
- return !!this._snapshot;
86
- }
87
- snapshotOrDie() {
88
- if (!this._snapshot)
89
- throw new Error('No snapshot available');
90
- return this._snapshot;
91
- }
92
144
  consoleMessages() {
93
145
  return this._consoleMessages;
94
146
  }
@@ -96,7 +148,103 @@ export class Tab {
96
148
  return this._requests;
97
149
  }
98
150
  async captureSnapshot() {
99
- this._snapshot = await PageSnapshot.create(this.page);
151
+ let tabSnapshot;
152
+ const modalStates = await this._raceAgainstModalStates(async () => {
153
+ const snapshot = await this.page._snapshotForAI();
154
+ tabSnapshot = {
155
+ url: this.page.url(),
156
+ title: await this.page.title(),
157
+ ariaSnapshot: snapshot,
158
+ modalStates: [],
159
+ consoleMessages: [],
160
+ downloads: this._downloads,
161
+ };
162
+ });
163
+ if (tabSnapshot) {
164
+ // Assign console message late so that we did not lose any to modal state.
165
+ tabSnapshot.consoleMessages = this._recentConsoleMessages;
166
+ this._recentConsoleMessages = [];
167
+ }
168
+ return tabSnapshot ?? {
169
+ url: this.page.url(),
170
+ title: '',
171
+ ariaSnapshot: '',
172
+ modalStates,
173
+ consoleMessages: [],
174
+ downloads: [],
175
+ };
176
+ }
177
+ _javaScriptBlocked() {
178
+ return this._modalStates.some(state => state.type === 'dialog');
179
+ }
180
+ async _raceAgainstModalStates(action) {
181
+ if (this.modalStates().length)
182
+ return this.modalStates();
183
+ const promise = new ManualPromise();
184
+ const listener = (modalState) => promise.resolve([modalState]);
185
+ this.once(TabEvents.modalState, listener);
186
+ return await Promise.race([
187
+ action().then(() => {
188
+ this.off(TabEvents.modalState, listener);
189
+ return [];
190
+ }),
191
+ promise,
192
+ ]);
193
+ }
194
+ async waitForCompletion(callback) {
195
+ await this._raceAgainstModalStates(() => waitForCompletion(this, callback));
196
+ }
197
+ async refLocator(params) {
198
+ return (await this.refLocators([params]))[0];
199
+ }
200
+ async refLocators(params) {
201
+ const snapshot = await this.page._snapshotForAI();
202
+ return params.map(param => {
203
+ if (!snapshot.includes(`[ref=${param.ref}]`))
204
+ throw new Error(`Ref ${param.ref} not found in the current page snapshot. Try capturing new snapshot.`);
205
+ return this.page.locator(`aria-ref=${param.ref}`).describe(param.element);
206
+ });
207
+ }
208
+ async waitForTimeout(time) {
209
+ if (this._javaScriptBlocked()) {
210
+ await new Promise(f => setTimeout(f, time));
211
+ return;
212
+ }
213
+ await callOnPageNoTrace(this.page, page => {
214
+ return page.evaluate(() => new Promise(f => setTimeout(f, 1000)));
215
+ });
216
+ }
217
+ }
218
+ function messageToConsoleMessage(message) {
219
+ return {
220
+ type: message.type(),
221
+ text: message.text(),
222
+ toString: () => `[${message.type().toUpperCase()}] ${message.text()} @ ${message.location().url}:${message.location().lineNumber}`,
223
+ };
224
+ }
225
+ function pageErrorToConsoleMessage(errorOrValue) {
226
+ if (errorOrValue instanceof Error) {
227
+ return {
228
+ type: undefined,
229
+ text: errorOrValue.message,
230
+ toString: () => errorOrValue.stack || errorOrValue.message,
231
+ };
232
+ }
233
+ return {
234
+ type: undefined,
235
+ text: String(errorOrValue),
236
+ toString: () => String(errorOrValue),
237
+ };
238
+ }
239
+ export function renderModalStates(context, modalStates) {
240
+ const result = ['### Modal state'];
241
+ if (modalStates.length === 0)
242
+ result.push('- There is no modal state present');
243
+ for (const state of modalStates) {
244
+ const tool = context.tools.filter(tool => 'clearsModalState' in tool).find(tool => tool.clearsModalState === state.type);
245
+ result.push(`- [${state.description}]: can be handled by the "${tool?.schema.name}" tool`);
100
246
  }
247
+ return result;
101
248
  }
249
+ const tabSymbol = Symbol('tabSymbol');
102
250
  //# sourceMappingURL=tab.js.map
package/lib/tab.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"tab.js","sourceRoot":"","sources":["../src/tab.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tab.js","sourceRoot":"","sources":["../src/tab.ts"],"names":[],"mappings":"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"}
@@ -14,7 +14,7 @@
14
14
  * limitations under the License.
15
15
  */
16
16
  import { z } from 'zod';
17
- import { defineTool } from './tool.js';
17
+ import { defineTabTool, defineTool } from './tool.js';
18
18
  const close = defineTool({
19
19
  capability: 'core',
20
20
  schema: {
@@ -24,16 +24,13 @@ const close = defineTool({
24
24
  inputSchema: z.object({}),
25
25
  type: 'readOnly',
26
26
  },
27
- handle: async (context) => {
28
- await context.close();
29
- return {
30
- code: [`await page.close()`],
31
- captureSnapshot: false,
32
- waitForNetwork: false,
33
- };
27
+ handle: async (context, params, response) => {
28
+ await context.closeBrowserContext();
29
+ response.setIncludeTabs();
30
+ response.addCode(`await page.close()`);
34
31
  },
35
32
  });
36
- const resize = captureSnapshot => defineTool({
33
+ const resize = defineTabTool({
37
34
  capability: 'core',
38
35
  schema: {
39
36
  name: 'browser_resize',
@@ -45,25 +42,15 @@ const resize = captureSnapshot => defineTool({
45
42
  }),
46
43
  type: 'readOnly',
47
44
  },
48
- handle: async (context, params) => {
49
- const tab = context.currentTabOrDie();
50
- const code = [
51
- `// Resize browser window to ${params.width}x${params.height}`,
52
- `await page.setViewportSize({ width: ${params.width}, height: ${params.height} });`
53
- ];
54
- const action = async () => {
45
+ handle: async (tab, params, response) => {
46
+ response.addCode(`await page.setViewportSize({ width: ${params.width}, height: ${params.height} });`);
47
+ await tab.waitForCompletion(async () => {
55
48
  await tab.page.setViewportSize({ width: params.width, height: params.height });
56
- };
57
- return {
58
- code,
59
- action,
60
- captureSnapshot,
61
- waitForNetwork: true
62
- };
49
+ });
63
50
  },
64
51
  });
65
- export default (captureSnapshot) => [
52
+ export default [
66
53
  close,
67
- resize(captureSnapshot)
54
+ resize
68
55
  ];
69
56
  //# sourceMappingURL=common.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"common.js","sourceRoot":"","sources":["../../src/tools/common.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAoB,MAAM,WAAW,CAAC;AAEzD,MAAM,KAAK,GAAG,UAAU,CAAC;IACvB,UAAU,EAAE,MAAM;IAElB,MAAM,EAAE;QACN,IAAI,EAAE,eAAe;QACrB,KAAK,EAAE,eAAe;QACtB,WAAW,EAAE,gBAAgB;QAC7B,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;QACzB,IAAI,EAAE,UAAU;KACjB;IAED,MAAM,EAAE,KAAK,EAAC,OAAO,EAAC,EAAE;QACtB,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;QACtB,OAAO;YACL,IAAI,EAAE,CAAC,oBAAoB,CAAC;YAC5B,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,KAAK;SACtB,CAAC;IACJ,CAAC;CACF,CAAC,CAAC;AAEH,MAAM,MAAM,GAAgB,eAAe,CAAC,EAAE,CAAC,UAAU,CAAC;IACxD,UAAU,EAAE,MAAM;IAClB,MAAM,EAAE;QACN,IAAI,EAAE,gBAAgB;QACtB,KAAK,EAAE,uBAAuB;QAC9B,WAAW,EAAE,2BAA2B;QACxC,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACpB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;YACzD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;SAC5D,CAAC;QACF,IAAI,EAAE,UAAU;KACjB;IAED,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE;QAChC,MAAM,GAAG,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;QAEtC,MAAM,IAAI,GAAG;YACX,+BAA+B,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE;YAC9D,uCAAuC,MAAM,CAAC,KAAK,aAAa,MAAM,CAAC,MAAM,MAAM;SACpF,CAAC;QAEF,MAAM,MAAM,GAAG,KAAK,IAAI,EAAE;YACxB,MAAM,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QACjF,CAAC,CAAC;QAEF,OAAO;YACL,IAAI;YACJ,MAAM;YACN,eAAe;YACf,cAAc,EAAE,IAAI;SACrB,CAAC;IACJ,CAAC;CACF,CAAC,CAAC;AAEH,eAAe,CAAC,eAAwB,EAAE,EAAE,CAAC;IAC3C,KAAK;IACL,MAAM,CAAC,eAAe,CAAC;CACxB,CAAC"}
1
+ {"version":3,"file":"common.js","sourceRoot":"","sources":["../../src/tools/common.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEtD,MAAM,KAAK,GAAG,UAAU,CAAC;IACvB,UAAU,EAAE,MAAM;IAClB,MAAM,EAAE;QACN,IAAI,EAAE,eAAe;QACrB,KAAK,EAAE,eAAe;QACtB,WAAW,EAAE,gBAAgB;QAC7B,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;QACzB,IAAI,EAAE,UAAU;KACjB;IAED,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE;QAC1C,MAAM,OAAO,CAAC,mBAAmB,EAAE,CAAC;QACpC,QAAQ,CAAC,cAAc,EAAE,CAAC;QAC1B,QAAQ,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACzC,CAAC;CACF,CAAC,CAAC;AAEH,MAAM,MAAM,GAAG,aAAa,CAAC;IAC3B,UAAU,EAAE,MAAM;IAClB,MAAM,EAAE;QACN,IAAI,EAAE,gBAAgB;QACtB,KAAK,EAAE,uBAAuB;QAC9B,WAAW,EAAE,2BAA2B;QACxC,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACpB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;YACzD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;SAC5D,CAAC;QACF,IAAI,EAAE,UAAU;KACjB;IAED,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE;QACtC,QAAQ,CAAC,OAAO,CAAC,uCAAuC,MAAM,CAAC,KAAK,aAAa,MAAM,CAAC,MAAM,MAAM,CAAC,CAAC;QAEtG,MAAM,GAAG,CAAC,iBAAiB,CAAC,KAAK,IAAI,EAAE;YACrC,MAAM,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QACjF,CAAC,CAAC,CAAC;IACL,CAAC;CACF,CAAC,CAAC;AAEH,eAAe;IACb,KAAK;IACL,MAAM;CACP,CAAC"}
@@ -14,8 +14,8 @@
14
14
  * limitations under the License.
15
15
  */
16
16
  import { z } from 'zod';
17
- import { defineTool } from './tool.js';
18
- const console = defineTool({
17
+ import { defineTabTool } from './tool.js';
18
+ const console = defineTabTool({
19
19
  capability: 'core',
20
20
  schema: {
21
21
  name: 'browser_console_messages',
@@ -24,19 +24,8 @@ const console = defineTool({
24
24
  inputSchema: z.object({}),
25
25
  type: 'readOnly',
26
26
  },
27
- handle: async (context) => {
28
- const messages = context.currentTabOrDie().consoleMessages();
29
- const log = messages.map(message => `[${message.type().toUpperCase()}] ${message.text()}`).join('\n');
30
- return {
31
- code: [`// <internal code to get console messages>`],
32
- action: async () => {
33
- return {
34
- content: [{ type: 'text', text: log }]
35
- };
36
- },
37
- captureSnapshot: false,
38
- waitForNetwork: false,
39
- };
27
+ handle: async (tab, params, response) => {
28
+ tab.consoleMessages().map(message => response.addResult(message.toString()));
40
29
  },
41
30
  });
42
31
  export default [
@@ -1 +1 @@
1
- {"version":3,"file":"console.js","sourceRoot":"","sources":["../../src/tools/console.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvC,MAAM,OAAO,GAAG,UAAU,CAAC;IACzB,UAAU,EAAE,MAAM;IAClB,MAAM,EAAE;QACN,IAAI,EAAE,0BAA0B;QAChC,KAAK,EAAE,sBAAsB;QAC7B,WAAW,EAAE,8BAA8B;QAC3C,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;QACzB,IAAI,EAAE,UAAU;KACjB;IACD,MAAM,EAAE,KAAK,EAAC,OAAO,EAAC,EAAE;QACtB,MAAM,QAAQ,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,eAAe,EAAE,CAAC;QAC7D,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtG,OAAO;YACL,IAAI,EAAE,CAAC,4CAA4C,CAAC;YACpD,MAAM,EAAE,KAAK,IAAI,EAAE;gBACjB,OAAO;oBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;iBACvC,CAAC;YACJ,CAAC;YACD,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,KAAK;SACtB,CAAC;IACJ,CAAC;CACF,CAAC,CAAC;AAEH,eAAe;IACb,OAAO;CACR,CAAC"}
1
+ {"version":3,"file":"console.js","sourceRoot":"","sources":["../../src/tools/console.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,OAAO,GAAG,aAAa,CAAC;IAC5B,UAAU,EAAE,MAAM;IAClB,MAAM,EAAE;QACN,IAAI,EAAE,0BAA0B;QAChC,KAAK,EAAE,sBAAsB;QAC7B,WAAW,EAAE,8BAA8B;QAC3C,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;QACzB,IAAI,EAAE,UAAU;KACjB;IACD,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE;QACtC,GAAG,CAAC,eAAe,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IAC/E,CAAC;CACF,CAAC,CAAC;AAEH,eAAe;IACb,OAAO;CACR,CAAC"}
@@ -14,8 +14,8 @@
14
14
  * limitations under the License.
15
15
  */
16
16
  import { z } from 'zod';
17
- import { defineTool } from './tool.js';
18
- const handleDialog = captureSnapshot => defineTool({
17
+ import { defineTabTool } from './tool.js';
18
+ const handleDialog = defineTabTool({
19
19
  capability: 'core',
20
20
  schema: {
21
21
  name: 'browser_handle_dialog',
@@ -27,27 +27,22 @@ const handleDialog = captureSnapshot => defineTool({
27
27
  }),
28
28
  type: 'destructive',
29
29
  },
30
- handle: async (context, params) => {
31
- const dialogState = context.modalStates().find(state => state.type === 'dialog');
30
+ handle: async (tab, params, response) => {
31
+ response.setIncludeSnapshot();
32
+ const dialogState = tab.modalStates().find(state => state.type === 'dialog');
32
33
  if (!dialogState)
33
34
  throw new Error('No dialog visible');
34
- if (params.accept)
35
- await dialogState.dialog.accept(params.promptText);
36
- else
37
- await dialogState.dialog.dismiss();
38
- context.clearModalState(dialogState);
39
- const code = [
40
- `// <internal code to handle "${dialogState.dialog.type()}" dialog>`,
41
- ];
42
- return {
43
- code,
44
- captureSnapshot,
45
- waitForNetwork: false,
46
- };
35
+ tab.clearModalState(dialogState);
36
+ await tab.waitForCompletion(async () => {
37
+ if (params.accept)
38
+ await dialogState.dialog.accept(params.promptText);
39
+ else
40
+ await dialogState.dialog.dismiss();
41
+ });
47
42
  },
48
43
  clearsModalState: 'dialog',
49
44
  });
50
- export default (captureSnapshot) => [
51
- handleDialog(captureSnapshot),
45
+ export default [
46
+ handleDialog,
52
47
  ];
53
48
  //# sourceMappingURL=dialogs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"dialogs.js","sourceRoot":"","sources":["../../src/tools/dialogs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAoB,MAAM,WAAW,CAAC;AAEzD,MAAM,YAAY,GAAgB,eAAe,CAAC,EAAE,CAAC,UAAU,CAAC;IAC9D,UAAU,EAAE,MAAM;IAElB,MAAM,EAAE;QACN,IAAI,EAAE,uBAAuB;QAC7B,KAAK,EAAE,iBAAiB;QACxB,WAAW,EAAE,iBAAiB;QAC9B,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACpB,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;YAC7D,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oDAAoD,CAAC;SACjG,CAAC;QACF,IAAI,EAAE,aAAa;KACpB;IAED,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE;QAChC,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;QACjF,IAAI,CAAC,WAAW;YACd,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QAEvC,IAAI,MAAM,CAAC,MAAM;YACf,MAAM,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;;YAEnD,MAAM,WAAW,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QAErC,OAAO,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;QAErC,MAAM,IAAI,GAAG;YACX,gCAAgC,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW;SACrE,CAAC;QAEF,OAAO;YACL,IAAI;YACJ,eAAe;YACf,cAAc,EAAE,KAAK;SACtB,CAAC;IACJ,CAAC;IAED,gBAAgB,EAAE,QAAQ;CAC3B,CAAC,CAAC;AAEH,eAAe,CAAC,eAAwB,EAAE,EAAE,CAAC;IAC3C,YAAY,CAAC,eAAe,CAAC;CAC9B,CAAC"}
1
+ {"version":3,"file":"dialogs.js","sourceRoot":"","sources":["../../src/tools/dialogs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,YAAY,GAAG,aAAa,CAAC;IACjC,UAAU,EAAE,MAAM;IAElB,MAAM,EAAE;QACN,IAAI,EAAE,uBAAuB;QAC7B,KAAK,EAAE,iBAAiB;QACxB,WAAW,EAAE,iBAAiB;QAC9B,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACpB,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;YAC7D,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oDAAoD,CAAC;SACjG,CAAC;QACF,IAAI,EAAE,aAAa;KACpB;IAED,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE;QACtC,QAAQ,CAAC,kBAAkB,EAAE,CAAC;QAE9B,MAAM,WAAW,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;QAC7E,IAAI,CAAC,WAAW;YACd,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QAEvC,GAAG,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;QACjC,MAAM,GAAG,CAAC,iBAAiB,CAAC,KAAK,IAAI,EAAE;YACrC,IAAI,MAAM,CAAC,MAAM;gBACf,MAAM,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;;gBAEnD,MAAM,WAAW,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACvC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,gBAAgB,EAAE,QAAQ;CAC3B,CAAC,CAAC;AAEH,eAAe;IACb,YAAY;CACb,CAAC"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Copyright (c) Microsoft Corporation.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ import { z } from 'zod';
17
+ import { defineTabTool } from './tool.js';
18
+ import * as javascript from '../utils/codegen.js';
19
+ import { generateLocator } from './utils.js';
20
+ const evaluateSchema = z.object({
21
+ function: z.string().describe('() => { /* code */ } or (element) => { /* code */ } when element is provided'),
22
+ element: z.string().optional().describe('Human-readable element description used to obtain permission to interact with the element'),
23
+ ref: z.string().optional().describe('Exact target element reference from the page snapshot'),
24
+ });
25
+ const evaluate = defineTabTool({
26
+ capability: 'core',
27
+ schema: {
28
+ name: 'browser_evaluate',
29
+ title: 'Evaluate JavaScript',
30
+ description: 'Evaluate JavaScript expression on page or element',
31
+ inputSchema: evaluateSchema,
32
+ type: 'destructive',
33
+ },
34
+ handle: async (tab, params, response) => {
35
+ response.setIncludeSnapshot();
36
+ let locator;
37
+ if (params.ref && params.element) {
38
+ locator = await tab.refLocator({ ref: params.ref, element: params.element });
39
+ response.addCode(`await page.${await generateLocator(locator)}.evaluate(${javascript.quote(params.function)});`);
40
+ }
41
+ else {
42
+ response.addCode(`await page.evaluate(${javascript.quote(params.function)});`);
43
+ }
44
+ await tab.waitForCompletion(async () => {
45
+ const receiver = locator ?? tab.page;
46
+ const result = await receiver._evaluateFunction(params.function);
47
+ response.addResult(JSON.stringify(result, null, 2) || 'undefined');
48
+ });
49
+ },
50
+ });
51
+ export default [
52
+ evaluate,
53
+ ];
54
+ //# sourceMappingURL=evaluate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evaluate.js","sourceRoot":"","sources":["../../src/tools/evaluate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,KAAK,UAAU,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAI7C,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,8EAA8E,CAAC;IAC7G,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2FAA2F,CAAC;IACpI,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uDAAuD,CAAC;CAC7F,CAAC,CAAC;AAEH,MAAM,QAAQ,GAAG,aAAa,CAAC;IAC7B,UAAU,EAAE,MAAM;IAClB,MAAM,EAAE;QACN,IAAI,EAAE,kBAAkB;QACxB,KAAK,EAAE,qBAAqB;QAC5B,WAAW,EAAE,mDAAmD;QAChE,WAAW,EAAE,cAAc;QAC3B,IAAI,EAAE,aAAa;KACpB;IAED,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE;QACtC,QAAQ,CAAC,kBAAkB,EAAE,CAAC;QAE9B,IAAI,OAAuC,CAAC;QAC5C,IAAI,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACjC,OAAO,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;YAC7E,QAAQ,CAAC,OAAO,CAAC,cAAc,MAAM,eAAe,CAAC,OAAO,CAAC,aAAa,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACnH,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,OAAO,CAAC,uBAAuB,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACjF,CAAC;QAED,MAAM,GAAG,CAAC,iBAAiB,CAAC,KAAK,IAAI,EAAE;YACrC,MAAM,QAAQ,GAAG,OAAO,IAAI,GAAG,CAAC,IAAW,CAAC;YAC5C,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,iBAAiB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YACjE,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC;QACrE,CAAC,CAAC,CAAC;IACL,CAAC;CACF,CAAC,CAAC;AAEH,eAAe;IACb,QAAQ;CACT,CAAC"}
@@ -14,9 +14,9 @@
14
14
  * limitations under the License.
15
15
  */
16
16
  import { z } from 'zod';
17
- import { defineTool } from './tool.js';
18
- const uploadFile = captureSnapshot => defineTool({
19
- capability: 'files',
17
+ import { defineTabTool } from './tool.js';
18
+ const uploadFile = defineTabTool({
19
+ capability: 'core',
20
20
  schema: {
21
21
  name: 'browser_file_upload',
22
22
  title: 'Upload files',
@@ -26,27 +26,20 @@ const uploadFile = captureSnapshot => defineTool({
26
26
  }),
27
27
  type: 'destructive',
28
28
  },
29
- handle: async (context, params) => {
30
- const modalState = context.modalStates().find(state => state.type === 'fileChooser');
29
+ handle: async (tab, params, response) => {
30
+ response.setIncludeSnapshot();
31
+ const modalState = tab.modalStates().find(state => state.type === 'fileChooser');
31
32
  if (!modalState)
32
33
  throw new Error('No file chooser visible');
33
- const code = [
34
- `// <internal code to chose files ${params.paths.join(', ')}`,
35
- ];
36
- const action = async () => {
34
+ response.addCode(`await fileChooser.setFiles(${JSON.stringify(params.paths)})`);
35
+ tab.clearModalState(modalState);
36
+ await tab.waitForCompletion(async () => {
37
37
  await modalState.fileChooser.setFiles(params.paths);
38
- context.clearModalState(modalState);
39
- };
40
- return {
41
- code,
42
- action,
43
- captureSnapshot,
44
- waitForNetwork: true,
45
- };
38
+ });
46
39
  },
47
40
  clearsModalState: 'fileChooser',
48
41
  });
49
- export default (captureSnapshot) => [
50
- uploadFile(captureSnapshot),
42
+ export default [
43
+ uploadFile,
51
44
  ];
52
45
  //# sourceMappingURL=files.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/tools/files.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAoB,MAAM,WAAW,CAAC;AAEzD,MAAM,UAAU,GAAgB,eAAe,CAAC,EAAE,CAAC,UAAU,CAAC;IAC5D,UAAU,EAAE,OAAO;IAEnB,MAAM,EAAE;QACN,IAAI,EAAE,qBAAqB;QAC3B,KAAK,EAAE,cAAc;QACrB,WAAW,EAAE,8BAA8B;QAC3C,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACpB,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,oFAAoF,CAAC;SAC1H,CAAC;QACF,IAAI,EAAE,aAAa;KACpB;IAED,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE;QAChC,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC;QACrF,IAAI,CAAC,UAAU;YACb,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAE7C,MAAM,IAAI,GAAG;YACX,oCAAoC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;SAC9D,CAAC;QAEF,MAAM,MAAM,GAAG,KAAK,IAAI,EAAE;YACxB,MAAM,UAAU,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACpD,OAAO,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;QACtC,CAAC,CAAC;QAEF,OAAO;YACL,IAAI;YACJ,MAAM;YACN,eAAe;YACf,cAAc,EAAE,IAAI;SACrB,CAAC;IACJ,CAAC;IACD,gBAAgB,EAAE,aAAa;CAChC,CAAC,CAAC;AAEH,eAAe,CAAC,eAAwB,EAAE,EAAE,CAAC;IAC3C,UAAU,CAAC,eAAe,CAAC;CAC5B,CAAC"}
1
+ {"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/tools/files.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,UAAU,GAAG,aAAa,CAAC;IAC/B,UAAU,EAAE,MAAM;IAElB,MAAM,EAAE;QACN,IAAI,EAAE,qBAAqB;QAC3B,KAAK,EAAE,cAAc;QACrB,WAAW,EAAE,8BAA8B;QAC3C,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACpB,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,oFAAoF,CAAC;SAC1H,CAAC;QACF,IAAI,EAAE,aAAa;KACpB;IAED,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE;QACtC,QAAQ,CAAC,kBAAkB,EAAE,CAAC;QAE9B,MAAM,UAAU,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC;QACjF,IAAI,CAAC,UAAU;YACb,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAE7C,QAAQ,CAAC,OAAO,CAAC,8BAA8B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAEhF,GAAG,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;QAChC,MAAM,GAAG,CAAC,iBAAiB,CAAC,KAAK,IAAI,EAAE;YACrC,MAAM,UAAU,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;IACL,CAAC;IACD,gBAAgB,EAAE,aAAa;CAChC,CAAC,CAAC;AAEH,eAAe;IACb,UAAU;CACX,CAAC"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Copyright (c) Microsoft Corporation.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ import { z } from 'zod';
17
+ import { defineTabTool } from './tool.js';
18
+ import { generateLocator } from './utils.js';
19
+ import * as javascript from '../utils/codegen.js';
20
+ const fillForm = defineTabTool({
21
+ capability: 'core',
22
+ schema: {
23
+ name: 'browser_fill_form',
24
+ title: 'Fill form',
25
+ description: 'Fill multiple form fields',
26
+ inputSchema: z.object({
27
+ fields: z.array(z.object({
28
+ name: z.string().describe('Human-readable field name'),
29
+ type: z.enum(['textbox', 'checkbox', 'radio', 'combobox', 'slider']).describe('Type of the field'),
30
+ ref: z.string().describe('Exact target field reference from the page snapshot'),
31
+ value: z.string().describe('Value to fill in the field. If the field is a checkbox, the value should be `true` or `false`. If the field is a combobox, the value should be the text of the option.'),
32
+ })).describe('Fields to fill in'),
33
+ }),
34
+ type: 'destructive',
35
+ },
36
+ handle: async (tab, params, response) => {
37
+ for (const field of params.fields) {
38
+ const locator = await tab.refLocator({ element: field.name, ref: field.ref });
39
+ const locatorSource = `await page.${await generateLocator(locator)}`;
40
+ if (field.type === 'textbox' || field.type === 'slider') {
41
+ await locator.fill(field.value);
42
+ response.addCode(`${locatorSource}.fill(${javascript.quote(field.value)});`);
43
+ }
44
+ else if (field.type === 'checkbox' || field.type === 'radio') {
45
+ await locator.setChecked(field.value === 'true');
46
+ response.addCode(`${locatorSource}.setChecked(${javascript.quote(field.value)});`);
47
+ }
48
+ else if (field.type === 'combobox') {
49
+ await locator.selectOption({ label: field.value });
50
+ response.addCode(`${locatorSource}.selectOption(${javascript.quote(field.value)});`);
51
+ }
52
+ }
53
+ },
54
+ });
55
+ export default [
56
+ fillForm,
57
+ ];
58
+ //# sourceMappingURL=form.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form.js","sourceRoot":"","sources":["../../src/tools/form.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,KAAK,UAAU,MAAM,qBAAqB,CAAC;AAElD,MAAM,QAAQ,GAAG,aAAa,CAAC;IAC7B,UAAU,EAAE,MAAM;IAElB,MAAM,EAAE;QACN,IAAI,EAAE,mBAAmB;QACzB,KAAK,EAAE,WAAW;QAClB,WAAW,EAAE,2BAA2B;QACxC,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACpB,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;gBACvB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;gBACtD,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,mBAAmB,CAAC;gBAClG,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qDAAqD,CAAC;gBAC/E,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wKAAwK,CAAC;aACrM,CAAC,CAAC,CAAC,QAAQ,CAAC,mBAAmB,CAAC;SAClC,CAAC;QACF,IAAI,EAAE,aAAa;KACpB;IAED,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE;QACtC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClC,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;YAC9E,MAAM,aAAa,GAAG,cAAc,MAAM,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;YACrE,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACxD,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAChC,QAAQ,CAAC,OAAO,CAAC,GAAG,aAAa,SAAS,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC/E,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBAC/D,MAAM,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC;gBACjD,QAAQ,CAAC,OAAO,CAAC,GAAG,aAAa,eAAe,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACrF,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;gBACrC,MAAM,OAAO,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;gBACnD,QAAQ,CAAC,OAAO,CAAC,GAAG,aAAa,iBAAiB,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACvF,CAAC;QACH,CAAC;IACH,CAAC;CACF,CAAC,CAAC;AAEH,eAAe;IACb,QAAQ;CACT,CAAC"}