Evidence and archive

extension.js · part 7

Full reference
Topics
Status
Showing all 60

60 text occurrences from desktop/Cursor.app/Contents/Resources/app/extensions/cursor-browser-automation/dist/extension.js, part 7. Every entry preserves the shipped literal and its saved verdict or selection reason.

File contents and all parts · All files

Shipped text

- Failed refs: ${t.join("; ")}

Source: desktop/Cursor.app/Contents/Resources/app/extensions/cursor-browser-automation/dist/extension.js, bytes 162403–162435, SHA-256 99d16f87112e843f.

Jev judged not model-facing (confidence 0.11; role code_data). This is a classifier judgment, not proof of delivery.

Readable text: - Failed refs: ${t.join("; ")}

- Failed refs: ${t.join("; ")}

No browser tab available. Please navigate to a page first.

Source: desktop/Cursor.app/Contents/Resources/app/extensions/cursor-browser-automation/dist/extension.js, bytes 162801–162861, SHA-256 16f1b030dc2ec6f3.

Jev judged not model-facing (confidence 0.12; role human). This is a classifier judgment, not proof of delivery.

Readable text: No browser tab available. Please navigate to a page first.

No browser tab available. Please navigate to a page first.

Error: Missing required "values" parameter. The browser select option tool requi

Source: desktop/Cursor.app/Contents/Resources/app/extensions/cursor-browser-automation/dist/extension.js, bytes 162938–163303, SHA-256 bc57c48775ff59c1.

Jev judged not model-facing (confidence 0.41; role tool). This is a classifier judgment, not proof of delivery.

Readable text: Error: Missing required "values" parameter. The browser_select_option tool requires a "values" array containing the option(s) to select. Example usage: - Single select: { ref: "e123", values: ["optionValue"] } - Multi-select: { ref: "e123…

Error: Missing required "values" parameter.

The browser_select_option tool requires a "values" array containing the option(s) to select.

Example usage:
- Single select: { ref: "e123", values: ["optionValue"] }
- Multi-select: { ref: "e123", values: ["value1", "value2"] }

Values can be option values or labels. Take a snapshot to see available options.

Error: Empty "values" array provided. Provide at least one value to select. Take

Source: desktop/Cursor.app/Contents/Resources/app/extensions/cursor-browser-automation/dist/extension.js, bytes 163364–163510, SHA-256 68f39d273dd928be.

Jev judged not model-facing (confidence 0.12; role code_data). This is a classifier judgment, not proof of delivery.

Readable text: Error: Empty "values" array provided. Provide at least one value to select. Take a snapshot to see available options for this select element.

Error: Empty "values" array provided.

Provide at least one value to select. Take a snapshot to see available options for this select element.

${q} ${c} (async function() { const ref = ${JSON.stringify(r)}; const { element

Source: desktop/Cursor.app/Contents/Resources/app/extensions/cursor-browser-automation/dist/extension.js, bytes 163601–169159, SHA-256 18a7e4d22b4775ef.

Jev judged not model-facing (confidence 0.05; role code_data). This is a classifier judgment, not proof of delivery.

Readable text: ${q} ${c} (async function() { const ref = ${JSON.stringify(r)}; const { element } = findElementByRef(ref); if (!element) throw new Error('Element not found: ' + ref + '. Take a snapshot to get updated refs.…


					${q}
					${c}
					(async function() {
						const ref = ${JSON.stringify(r)};
						const { element } = findElementByRef(ref);
						if (!element) throw new Error('Element not found: ' + ref + '. Take a snapshot to get updated refs.');

						const selectElement = element;
						if (selectElement.tagName.toUpperCase() !== 'SELECT') {
							throw new Error('Element ' + ref + ' is not a select element (found: ' + selectElement.tagName.toLowerCase() + ').');
						}

						if (selectElement.disabled) {
							throw new Error('Select element ' + ref + ' is disabled and cannot be interacted with.');
						}

						const rect = selectElement.getBoundingClientRect();
						const scrollPadding = 50;
						const needsScroll = rect.top < scrollPadding || rect.left < scrollPadding ||
							rect.bottom > window.innerHeight - scrollPadding || rect.right > window.innerWidth - scrollPadding;
						if (needsScroll) {
							selectElement.scrollIntoView({ block: 'center', inline: 'center', behavior: 'smooth' });
							await new Promise(r => setTimeout(r, 300));
						}

						selectElement.focus();
						await new Promise(r => setTimeout(r, 0));

						const values = ${JSON.stringify(t.values)};

						const availableOptions = Array.from(selectElement.options).map(o => ({
							value: o.value,
							label: o.textContent?.trim() || o.label || '',
							disabled: o.disabled
						}));

						if (values.length > 1 && !selectElement.multiple) {
							throw new Error('Cannot select multiple values on a single-select dropdown. The select element does not have the "multiple" attribute. Use a single value instead, or interact with the correct multi-select element.');
						}

						if (!selectElement.multiple) {
							selectElement.value = '';
						} else {
							Array.from(selectElement.options).forEach(option => {
								option.selected = false;
							});
						}

						const selectedValues = [];
						const matchedBy = [];
						for (const value of values) {
							let optionFound = false;
							for (const option of selectElement.options) {
								if (option.value === value) {
									if (option.disabled) {
										throw new Error('Option "' + value + '" is disabled and cannot be selected.');
									}
									option.selected = true;
									selectedValues.push(option.value);
									matchedBy.push('value');
									optionFound = true;
									break;
								}
							}
							if (!optionFound) {
								for (const option of selectElement.options) {
									const labelText = (option.textContent?.trim() || option.label || '').toLowerCase();
									if (labelText === value.toLowerCase()) {
										if (option.disabled) {
											throw new Error('Option with label "' + value + '" is disabled and cannot be selected.');
										}
										option.selected = true;
										selectedValues.push(option.value);
										matchedBy.push('label');
										optionFound = true;
										break;
									}
								}
							}
							if (!optionFound) {
								for (const option of selectElement.options) {
									const labelText = (option.textContent?.trim() || option.label || '').toLowerCase();
									if (labelText.includes(value.toLowerCase())) {
										if (option.disabled) {
											throw new Error('Option containing "' + value + '" is disabled and cannot be selected.');
										}
										option.selected = true;
										selectedValues.push(option.value);
										matchedBy.push('partial label');
										optionFound = true;
										break;
									}
								}
							}
							if (!optionFound) {
								const optionList = availableOptions.slice(0, 8).map(o =>
									'"' + o.label + '"' + (o.value !== o.label ? ' (value: ' + o.value + ')' : '') + (o.disabled ? ' [disabled]' : '')
								).join(', ');
								const isMultiple = selectElement.multiple ? ' (multi-select)' : ' (single-select)';
								throw new Error('Option "' + value + '" not found in select element' + isMultiple + '. Available options: ' + optionList + (availableOptions.length > 8 ? '...' : '') + '. Try using the exact option value or label.');
							}
						}

						selectElement.dispatchEvent(new Event('input', { bubbles: true }));
						selectElement.dispatchEvent(new Event('change', { bubbles: true }));

						const snapshotResult = buildPageSnapshot();
						return {
							success: true,
							selectedValues,
							matchedBy,
							availableOptions: availableOptions.slice(0, 10),
							pageState: {
								url: window.location.href,
								title: document.title,
								snapshot: snapshotResult.tree
							}
						};
					})();
				

${t} (matched by ${s.matchedBy e "value"})

Source: desktop/Cursor.app/Contents/Resources/app/extensions/cursor-browser-automation/dist/extension.js, bytes 169307–169353, SHA-256 502eb75a614a8aee.

Jev judged not model-facing (confidence 0.11; role code_data). This is a classifier judgment, not proof of delivery.

Readable text: ${t} (matched by ${s.matchedBy[e]||"value"})

${t} (matched by ${s.matchedBy[e]||"value"})

- Selected: ${t.join(", ")}

Source: desktop/Cursor.app/Contents/Resources/app/extensions/cursor-browser-automation/dist/extension.js, bytes 169362–169391, SHA-256 a182cafb349943c2.

Jev judged not model-facing (confidence 0.2; role code_data). This is a classifier judgment, not proof of delivery.

Readable text: - Selected: ${t.join(", ")}

- Selected: ${t.join(", ")}

- Selected values: (none)

Source: desktop/Cursor.app/Contents/Resources/app/extensions/cursor-browser-automation/dist/extension.js, bytes 169405–169432, SHA-256 d6a573547ded6e55.

Jev judged not model-facing (confidence 0.15; role code_data). This is a classifier judgment, not proof of delivery.

Readable text: - Selected values: (none)

- Selected values: (none)

No browser tab available. Please navigate to a page first. · byte 169811

Source: desktop/Cursor.app/Contents/Resources/app/extensions/cursor-browser-automation/dist/extension.js, bytes 169811–169871, SHA-256 16f1b030dc2ec6f3.

Jev judged not model-facing (confidence 0.11; role human). This is a classifier judgment, not proof of delivery.

Readable text: No browser tab available. Please navigate to a page first.

No browser tab available. Please navigate to a page first.

(function() { const keyInput = ${JSON.stringify(t.key)}; const keyCodeMap = { 'P

Source: desktop/Cursor.app/Contents/Resources/app/extensions/cursor-browser-automation/dist/extension.js, bytes 169916–177800, SHA-256 27258b685a08688b.

Jev judged not model-facing (confidence 0.03; role code_data). This is a classifier judgment, not proof of delivery.

Readable text: (function() { const keyInput = ${JSON.stringify(t.key)}; const keyCodeMap = { 'PageDown': 34, 'PageUp': 33, 'End': 35, 'Home': 36, 'ArrowLeft': 37, 'ArrowUp': 38, 'ArrowRight': 39, 'ArrowDown': 40, 'Enter':…


				(function() {
					const keyInput = ${JSON.stringify(t.key)};

					const keyCodeMap = {
						'PageDown': 34, 'PageUp': 33, 'End': 35, 'Home': 36,
						'ArrowLeft': 37, 'ArrowUp': 38, 'ArrowRight': 39, 'ArrowDown': 40,
						'Enter': 13, 'Escape': 27, 'Tab': 9, 'Backspace': 8, 'Delete': 46,
						'Space': 32, ' ': 32, 'F1': 112, 'F2': 113, 'F3': 114, 'F4': 115,
						'F5': 116, 'F6': 117, 'F7': 118, 'F8': 119, 'F9': 120, 'F10': 121,
						'F11': 122, 'F12': 123, 'Insert': 45, 'NumLock': 144, 'ScrollLock': 145,
						'Pause': 19, 'CapsLock': 20
					};

					const codeMap = {
						'a': 'KeyA', 'b': 'KeyB', 'c': 'KeyC', 'd': 'KeyD', 'e': 'KeyE',
						'f': 'KeyF', 'g': 'KeyG', 'h': 'KeyH', 'i': 'KeyI', 'j': 'KeyJ',
						'k': 'KeyK', 'l': 'KeyL', 'm': 'KeyM', 'n': 'KeyN', 'o': 'KeyO',
						'p': 'KeyP', 'q': 'KeyQ', 'r': 'KeyR', 's': 'KeyS', 't': 'KeyT',
						'u': 'KeyU', 'v': 'KeyV', 'w': 'KeyW', 'x': 'KeyX', 'y': 'KeyY', 'z': 'KeyZ',
						'0': 'Digit0', '1': 'Digit1', '2': 'Digit2', '3': 'Digit3', '4': 'Digit4',
						'5': 'Digit5', '6': 'Digit6', '7': 'Digit7', '8': 'Digit8', '9': 'Digit9',
						' ': 'Space', 'Space': 'Space',
						'Enter': 'Enter', 'Tab': 'Tab', 'Escape': 'Escape', 'Backspace': 'Backspace',
						'Delete': 'Delete', 'Insert': 'Insert',
						'ArrowUp': 'ArrowUp', 'ArrowDown': 'ArrowDown', 'ArrowLeft': 'ArrowLeft', 'ArrowRight': 'ArrowRight',
						'Home': 'Home', 'End': 'End', 'PageUp': 'PageUp', 'PageDown': 'PageDown',
						'F1': 'F1', 'F2': 'F2', 'F3': 'F3', 'F4': 'F4', 'F5': 'F5', 'F6': 'F6',
						'F7': 'F7', 'F8': 'F8', 'F9': 'F9', 'F10': 'F10', 'F11': 'F11', 'F12': 'F12',
						'-': 'Minus', '=': 'Equal', '[': 'BracketLeft', ']': 'BracketRight',
						'\\': 'Backslash', ';': 'Semicolon', "'": 'Quote', ',': 'Comma',
						'.': 'Period', '/': 'Slash', '`': 'Backquote'
					};

					const scrollAmounts = {
						'PageDown': { x: 0, y: window.innerHeight * 0.8 },
						'PageUp': { x: 0, y: -window.innerHeight * 0.8 },
						'ArrowDown': { x: 0, y: 40 },
						'ArrowUp': { x: 0, y: -40 },
						'End': { x: 0, y: document.documentElement.scrollHeight - window.scrollY },
						'Home': { x: 0, y: -window.scrollY },
						'Space': { x: 0, y: window.innerHeight * 0.8 },
						' ': { x: 0, y: window.innerHeight * 0.8 },
					};

					const modifierAliases = {
						'Control': ['Control', 'Ctrl', 'control', 'ctrl'],
						'Shift': ['Shift', 'shift'],
						'Alt': ['Alt', 'alt', 'Option', 'option'],
						'Meta': ['Meta', 'meta', 'Command', 'command', 'Cmd', 'cmd', 'Win', 'win']
					};

					function parseKeyCombo(input) {
						const parts = input.split('+').map(p => p.trim());
						const modifiers = { ctrlKey: false, shiftKey: false, altKey: false, metaKey: false };
						let mainKey = '';

						for (const part of parts) {
							let isModifier = false;
							for (const [mod, aliases] of Object.entries(modifierAliases)) {
								if (aliases.includes(part)) {
									if (mod === 'Control') modifiers.ctrlKey = true;
									else if (mod === 'Shift') modifiers.shiftKey = true;
									else if (mod === 'Alt') modifiers.altKey = true;
									else if (mod === 'Meta') modifiers.metaKey = true;
									isModifier = true;
									break;
								}
							}
							if (!isModifier) {
								mainKey = part;
							}
						}

						return { modifiers, mainKey };
					}

					const { modifiers, mainKey } = parseKeyCombo(keyInput);
					const key = mainKey || keyInput;

					const keyLower = key.toLowerCase();
					const code = codeMap[key] || codeMap[keyLower] || (key.length === 1 ? 'Key' + key.toUpperCase() : key);
					const keyCode = keyCodeMap[key] || (key.length === 1 ? key.toUpperCase().charCodeAt(0) : 0);

					const activeElement = document.activeElement || document.body;

					const scrollKeys = ['PageDown', 'PageUp', 'Home', 'End'];
					if (scrollKeys.includes(key) && !modifiers.ctrlKey && !modifiers.altKey && !modifiers.metaKey) {
						const isScrollable = (el) => {
							if (!el || !(el instanceof HTMLElement)) return false;
							const style = getComputedStyle(el);
							const overflowY = style.overflowY;
							return (overflowY === 'auto' || overflowY === 'scroll') && el.scrollHeight > el.clientHeight;
						};

						let scrollable = null;
						let current = activeElement;
						while (current && current !== document.body) {
							if (isScrollable(current)) {
								scrollable = current;
								break;
							}
							current = current.parentElement;
						}

						if (!scrollable) {
							scrollable = document.scrollingElement || document.documentElement;
						}

						const viewportHeight = scrollable.clientHeight;

						switch (key) {
							case 'PageDown':
								scrollable.scrollBy({ top: viewportHeight, behavior: 'instant' });
								break;
							case 'PageUp':
								scrollable.scrollBy({ top: -viewportHeight, behavior: 'instant' });
								break;
							case 'Home':
								scrollable.scrollTo({ top: 0, behavior: 'instant' });
								break;
							case 'End':
								scrollable.scrollTo({ top: scrollable.scrollHeight, behavior: 'instant' });
								break;
						}
					} else if (scrollAmounts[key] && !modifiers.ctrlKey && !modifiers.altKey && !modifiers.metaKey) {
						window.scrollBy({ left: scrollAmounts[key].x, top: scrollAmounts[key].y, behavior: 'smooth' });
					}

					const eventInit = {
						key: key,
						code: code,
						keyCode: keyCode,
						which: keyCode,
						bubbles: true,
						cancelable: true,
						ctrlKey: modifiers.ctrlKey,
						shiftKey: modifiers.shiftKey,
						altKey: modifiers.altKey,
						metaKey: modifiers.metaKey
					};

					activeElement.dispatchEvent(new KeyboardEvent('keydown', eventInit));

					if (key.length === 1 && !modifiers.ctrlKey && !modifiers.altKey && !modifiers.metaKey) {
						activeElement.dispatchEvent(new KeyboardEvent('keypress', eventInit));

						if (activeElement.tagName === 'INPUT' || activeElement.tagName === 'TEXTAREA' || activeElement.isContentEditable) {
							const inputEvent = new InputEvent('beforeinput', {
								bubbles: true,
								cancelable: true,
								inputType: 'insertText',
								data: key
							});
							activeElement.dispatchEvent(inputEvent);
						}
					}

					activeElement.dispatchEvent(new KeyboardEvent('keyup', eventInit));

					const modifierStr = [
						modifiers.ctrlKey ? 'Ctrl' : '',
						modifiers.shiftKey ? 'Shift' : '',
						modifiers.altKey ? 'Alt' : '',
						modifiers.metaKey ? 'Meta' : ''
					].filter(Boolean).join('+');

					return {
						action: 'press_key',
						success: true,
						key: key,
						code: code,
						modifiers: modifierStr || 'none',
						fullCombo: modifierStr ? modifierStr + '+' + key : key
					};
				})();
			

Successfully pressed key: ${o.fullCombo} (code: ${o.code})

Source: desktop/Cursor.app/Contents/Resources/app/extensions/cursor-browser-automation/dist/extension.js, bytes 177909–177969, SHA-256 eb4e744656d9e0bd.

Jev judged not model-facing (confidence 0.14; role code_data). This is a classifier judgment, not proof of delivery.

Readable text: Successfully pressed key: ${o.fullCombo} (code: ${o.code})

Successfully pressed key: ${o.fullCombo} (code: ${o.code})

Failed to press key: ${o.key}

Source: desktop/Cursor.app/Contents/Resources/app/extensions/cursor-browser-automation/dist/extension.js, bytes 178066–178097, SHA-256 d503f0a77d7c62de.

Jev judged not model-facing (confidence 0.07; role code_data). This is a classifier judgment, not proof of delivery.

Readable text: Failed to press key: ${o.key}

Failed to press key: ${o.key}

No browser tab available. Please navigate to a page first. · byte 178421

Source: desktop/Cursor.app/Contents/Resources/app/extensions/cursor-browser-automation/dist/extension.js, bytes 178421–178481, SHA-256 16f1b030dc2ec6f3.

Jev judged not model-facing (confidence 0.08; role human). This is a classifier judgment, not proof of delivery.

Readable text: No browser tab available. Please navigate to a page first.

No browser tab available. Please navigate to a page first.

Error: Either targetRef or both targetX and targetY must be provided for drag op

Source: desktop/Cursor.app/Contents/Resources/app/extensions/cursor-browser-automation/dist/extension.js, bytes 178685–178902, SHA-256 9ca050277f17b2fc.

Jev judged not model-facing (confidence 0.12; role human). This is a classifier judgment, not proof of delivery.

Readable text: Error: Either targetRef or both targetX and targetY must be provided for drag operation. Suggestion: Specify where to drop the element using targetRef (for element-to-element drag) or targetX/targetY coordinates.

Error: Either targetRef or both targetX and targetY must be provided for drag operation.

Suggestion: Specify where to drop the element using targetRef (for element-to-element drag) or targetX/targetY coordinates.

(async function() { ${q} const sourceRef = ${JSON.stringify(r)}; const targetRef

Source: desktop/Cursor.app/Contents/Resources/app/extensions/cursor-browser-automation/dist/extension.js, bytes 178914–186711, SHA-256 3898cc6ba6e41959.

Jev judged not model-facing (confidence 0.05; role code_data). This is a classifier judgment, not proof of delivery.

Readable text: (async function() { ${q} const sourceRef = ${JSON.stringify(r)}; const targetRef = ${JSON.stringify(o)}; const targetX = ${t.targetX??"null"}; const targetY = ${t.targetY??"null"}; const { element…


					(async function() {
						${q}

						const sourceRef = ${JSON.stringify(r)};
						const targetRef = ${JSON.stringify(o)};
						const targetX = ${t.targetX??"null"};
						const targetY = ${t.targetY??"null"};

						const { element: sourceElement } = findElementByRef(sourceRef);
						if (!sourceElement) {
							return {
								success: false,
								error: 'Source element not found: ' + sourceRef + '. Take a snapshot to get updated refs.',
								suggestion: 'The source element reference may be stale. Take a new snapshot to get current element refs.'
							};
						}

						const sourceStyle = window.getComputedStyle(sourceElement);
						const isDraggable = sourceElement.draggable || sourceElement.getAttribute('draggable') === 'true';
						if (!isDraggable && sourceStyle.cursor !== 'grab' && sourceStyle.cursor !== 'move') {
							return {
								success: false,
								error: 'Source element ' + sourceRef + ' does not appear to be draggable. It lacks the draggable attribute.',
								suggestion: 'Verify the element is meant to be dragged. Check if it has draggable="true" attribute or is part of a drag-and-drop library that uses different mechanisms.'
							};
						}

						let targetElement = null;
						if (targetRef) {
							const targetResult = findElementByRef(targetRef);
							targetElement = targetResult.element;
							if (!targetElement) {
								return {
									success: false,
									error: 'Target element not found: ' + targetRef + '. Take a snapshot to get updated refs.',
									suggestion: 'The target element reference may be stale. Take a new snapshot to get current element refs.'
								};
							}
						}

						const sourceRect = sourceElement.getBoundingClientRect();
						const startX = Math.round(sourceRect.left + sourceRect.width / 2);
						const startY = Math.round(sourceRect.top + sourceRect.height / 2);

						let dropX, dropY;
						if (targetElement) {
							const targetRect = targetElement.getBoundingClientRect();
							dropX = Math.round(targetRect.left + targetRect.width / 2);
							dropY = Math.round(targetRect.top + targetRect.height / 2);
						} else {
							dropX = targetX;
							dropY = targetY;
						}

						try {
							const dataTransfer = new DataTransfer();
							dataTransfer.effectAllowed = 'all';

							const pointerOpts = {
								bubbles: true,
								cancelable: true,
								view: window,
								pointerId: 1,
								pointerType: 'mouse',
								isPrimary: true,
								button: 0,
								buttons: 1
							};

							sourceElement.dispatchEvent(new PointerEvent('pointerover', { ...pointerOpts, clientX: startX, clientY: startY }));
							sourceElement.dispatchEvent(new PointerEvent('pointerenter', { ...pointerOpts, clientX: startX, clientY: startY, bubbles: false }));
							sourceElement.dispatchEvent(new MouseEvent('mouseover', { bubbles: true, clientX: startX, clientY: startY }));
							sourceElement.dispatchEvent(new MouseEvent('mouseenter', { bubbles: false, clientX: startX, clientY: startY }));

							sourceElement.dispatchEvent(new PointerEvent('pointerdown', { ...pointerOpts, clientX: startX, clientY: startY }));
							sourceElement.dispatchEvent(new MouseEvent('mousedown', { bubbles: true, cancelable: true, clientX: startX, clientY: startY, button: 0 }));

							await new Promise(r => setTimeout(r, 50));

							const dragStartEvent = new DragEvent('dragstart', {
								bubbles: true,
								cancelable: true,
								clientX: startX,
								clientY: startY,
								dataTransfer: dataTransfer
							});
							const dragStarted = sourceElement.dispatchEvent(dragStartEvent);

							if (!dragStarted) {
								return {
									success: false,
									error: 'Drag start was prevented by the page.',
									suggestion: 'The page may have event handlers preventing drag. Try using browser_evaluate to trigger the drag programmatically.'
								};
							}

							sourceElement.dispatchEvent(new DragEvent('drag', {
								bubbles: true,
								cancelable: true,
								clientX: startX,
								clientY: startY,
								dataTransfer: dataTransfer
							}));

							await new Promise(r => setTimeout(r, 50));

							const dropTarget = targetElement || document.elementFromPoint(dropX, dropY);
							if (!dropTarget) {
								return {
									success: false,
									error: 'No element found at drop coordinates (' + dropX + ', ' + dropY + ').',
									suggestion: 'Verify the target coordinates are within the viewport and point to a valid drop zone.'
								};
							}

							dropTarget.dispatchEvent(new DragEvent('dragenter', {
								bubbles: true,
								cancelable: true,
								clientX: dropX,
								clientY: dropY,
								dataTransfer: dataTransfer
							}));

							const dragOverEvent = new DragEvent('dragover', {
								bubbles: true,
								cancelable: true,
								clientX: dropX,
								clientY: dropY,
								dataTransfer: dataTransfer
							});
							dropTarget.dispatchEvent(dragOverEvent);

							await new Promise(r => setTimeout(r, 50));

							const dropEvent = new DragEvent('drop', {
								bubbles: true,
								cancelable: true,
								clientX: dropX,
								clientY: dropY,
								dataTransfer: dataTransfer
							});
							const dropAccepted = dropTarget.dispatchEvent(dropEvent);

							sourceElement.dispatchEvent(new DragEvent('dragend', {
								bubbles: true,
								cancelable: false,
								clientX: dropX,
								clientY: dropY,
								dataTransfer: dataTransfer
							}));

							sourceElement.dispatchEvent(new PointerEvent('pointerup', { ...pointerOpts, clientX: dropX, clientY: dropY }));
							sourceElement.dispatchEvent(new MouseEvent('mouseup', { bubbles: true, clientX: dropX, clientY: dropY }));

							return {
								success: true,
								action: 'drag',
								source: sourceRef,
								target: targetRef || ('(' + dropX + ', ' + dropY + ')'),
								dropAccepted: dropAccepted,
								message: 'Drag completed from ' + sourceRef + ' to ' + (targetRef || 'coordinates (' + dropX + ', ' + dropY + ')') + (dropAccepted ? '' : ' (drop may not have been accepted by target)')
							};
						} catch (err) {
							return {
								success: false,
								error: 'Drag operation failed: ' + (err instanceof Error ? err.message : String(err)),
								suggestion: 'The drag-and-drop may use a library (like react-dnd or sortablejs) that requires specific event sequences. Try using browser_evaluate to interact with the library directly.'
							};
						}
					})();
				

Action: drag - ${i.message} - Source: ${i.source} - Target: ${i.target}

Source: desktop/Cursor.app/Contents/Resources/app/extensions/cursor-browser-automation/dist/extension.js, bytes 186796–186876, SHA-256 4fd6efdd7af28053.

Jev judged not model-facing (confidence 0.62; role code_data). This is a classifier judgment, not proof of delivery.

Readable text: ### Action: drag - ${i.message} - Source: ${i.source} - Target: ${i.target}

### Action: drag
- ${i.message}
- Source: ${i.source}
- Target: ${i.target}

Error: ${i.error "Unknown drag error"} Suggestion: ${i.suggestion "Take a snap

Source: desktop/Cursor.app/Contents/Resources/app/extensions/cursor-browser-automation/dist/extension.js, bytes 186973–187139, SHA-256 5c21a9013a183760.

Jev judged not model-facing (confidence 0.31; role code_data). This is a classifier judgment, not proof of delivery.

Readable text: Error: ${i.error||"Unknown drag error"} Suggestion: ${i.suggestion||"Take a snapshot to verify the elements are draggable."} Recovery action: browser_snapshot

Error: ${i.error||"Unknown drag error"}

Suggestion: ${i.suggestion||"Take a snapshot to verify the elements are draggable."}

Recovery action: browser_snapshot

Unknown drag error

Source: desktop/Cursor.app/Contents/Resources/app/extensions/cursor-browser-automation/dist/extension.js, bytes 186992–187012, SHA-256 6c38a1753b85d143.

Jev judged not model-facing (confidence 0.14; role code_data). This is a classifier judgment, not proof of delivery.

Readable text: Unknown drag error

Unknown drag error

Take a snapshot to verify the elements are draggable.

Source: desktop/Cursor.app/Contents/Resources/app/extensions/cursor-browser-automation/dist/extension.js, bytes 187045–187100, SHA-256 62696e2fa68a7eab.

Jev judged not model-facing (confidence 0.63; role code_data). This is a classifier judgment, not proof of delivery.

Readable text: Take a snapshot to verify the elements are draggable.

Take a snapshot to verify the elements are draggable.

Browser snapshot push failed (${t}): ${n instanceof Error?n.message:String(n)}

Source: desktop/Cursor.app/Contents/Resources/app/extensions/cursor-browser-automation/dist/extension.js, bytes 191470–191550, SHA-256 1929f8d48e46071c.

Jev judged not model-facing (confidence 0.04; role code_data). This is a classifier judgment, not proof of delivery.

Readable text: Browser snapshot push failed (${t}): ${n instanceof Error?n.message:String(n)}

Browser snapshot push failed (${t}): ${n instanceof Error?n.message:String(n)}

Browser snapshot push retries exhausted (${t}); entering recovery backfill loop

Source: desktop/Cursor.app/Contents/Resources/app/extensions/cursor-browser-automation/dist/extension.js, bytes 191789–191870, SHA-256 ca56c354affb8ce4.

Jev judged not model-facing (confidence 0.04; role code_data). This is a classifier judgment, not proof of delivery.

Readable text: Browser snapshot push retries exhausted (${t}); entering recovery backfill loop

Browser snapshot push retries exhausted (${t}); entering recovery backfill loop

The cursor-ide-browser MCP server provides a Cursor-owned browser tab plus a raw

Source: desktop/Cursor.app/Contents/Resources/app/extensions/cursor-browser-automation/dist/extension.js, bytes 193657–198970, SHA-256 ead0bf080ee793c5.

Jev judged model-facing (confidence 0.93; role instructions). This is a classifier judgment, not proof of delivery.

Readable text: The cursor-ide-browser MCP server provides a Cursor-owned browser tab plus a raw Chrome DevTools Protocol command tool. CORE WORKFLOW: 1. Start by understanding the user's goal and what success looks like on the page. 2. Use browser_tabs w…

The cursor-ide-browser MCP server provides a Cursor-owned browser tab plus a raw Chrome DevTools Protocol command tool.

CORE WORKFLOW:
1. Start by understanding the user's goal and what success looks like on the page.
2. Use browser_tabs with action "list" to inspect open tabs and URLs before acting.
3. Use browser_navigate to create or navigate the target tab. Omit the position parameter for background automation so focus is preserved.
4. Use browser_lock before longer automation on an existing tab, then browser_lock with action "unlock" when finished.
5. Use browser_snapshot for accessibility context and browser_take_screenshot for visual verification.
6. Use browser_click, browser_type, browser_fill, browser_select_option, browser_press_key, browser_scroll, and browser_drag for page interactions.
7. Use browser_highlight and browser_get_bounding_box for visual grounding and coordinate diagnostics.
8. Use browser_cdp for page inspection, profiling, runtime evaluation, DOM/CSS queries, and performance data.

AVOID RABBIT HOLES:
1. Do not repeat the same failing action more than once without new evidence such as a fresh snapshot, a different ref, a changed page state, or a clear new hypothesis.
2. IMPORTANT: If four attempts fail or progress stalls, stop acting and report what you observed, what blocked progress, and the most likely next step.
3. Prefer gathering evidence over brute force. If the page is confusing, use browser_snapshot, browser_take_screenshot, or CDP inspection before trying more actions.
4. If you encounter a blocker such as login, passkey/manual user interaction, permissions, captchas, destructive confirmations, missing data, or an unexpected state, stop and report it instead of improvising repeated actions.
5. Do not get stuck in wait-action-wait loops. Every retry should be justified by something newly observed.

CRITICAL - Lock/unlock workflow:
1. browser_lock requires an existing browser tab - you CANNOT call browser_lock with action: "lock" before browser_navigate
2. Correct order: browser_navigate -> browser_lock({ action: "lock" }) -> (interactions) -> browser_lock({ action: "unlock" })
3. If a browser tab already exists (check with browser_tabs list), call browser_lock with action: "lock" FIRST before any interactions
4. Only call browser_lock with action: "unlock" when completely done with ALL browser operations for this turn

IMPORTANT - Waiting strategy:
When waiting for page changes, prefer short CDP polling loops with Runtime.evaluate, DOM queries, Page lifecycle signals, or browser_snapshot checks rather than a single long wait.

CDP USAGE:
- Use browser_cdp with a DevTools Protocol method and params object, for example Runtime.evaluate, DOM.getDocument, CSS.getComputedStyleForNode, Profiler.start/stop, Performance.getMetrics, Log.enable, and Network.enable.
- Do not use browser_cdp with CDP Input.* methods. They are denied because they are focus-sensitive in Electron webviews and can route input to Cursor UI instead of the browser page.
- Use browser_click, browser_type, browser_fill, browser_select_option, browser_press_key, browser_scroll, and browser_drag for clicks, typing, filling inputs, selecting options, keyboard actions, scrolling, and drag-and-drop.
- Use Runtime.evaluate for advanced DOM-scoped interactions that the dedicated browser tools do not cover.
- For profiling, call Profiler.enable, Profiler.start, reproduce the behavior, then Profiler.stop. The profile is saved to a file and returned as a log_file; read that file only when you need to inspect details.
- For JavaScript evaluation, prefer Runtime.evaluate with returnByValue when possible.
- Device emulation you set with Emulation.setDeviceMetricsOverride, Emulation.setTouchEmulationEnabled, or Emulation.setUserAgentOverride (for example for a phone-sized screenshot) lasts only for the current turn: it is cleared when your turn ends, and the user can reset it from the browser tab at any time. Send Emulation.clearDeviceMetricsOverride yourself once you are done with it within a turn.
- Some browser-wide or sensitive CDP methods are denied, especially cookie, storage, permission, download, target-management, filesystem-backed file-input commands, system-level commands, and CDP navigation/history navigation commands.
- Large CDP responses are saved to files instead of being inlined. Prefer using the returned file path over immediately stuffing large payloads into context; read focused sections only when needed.

VISION:
- browser_take_screenshot attaches an image result that the model can inspect. CDP Page.captureScreenshot returns data inside JSON and should not replace browser_take_screenshot when visual verification is needed.

NOTES:
- browser_snapshot returns snapshot YAML and is the main source of truth for page structure.
- Refs are opaque handles tied to the latest browser_snapshot for that tab.
- Iframe content is not accessible - only elements outside iframes can be interacted with.
- When you stop to report a blocker, include the current page, the target you were trying to reach, the blocker you observed, and the best next action. If the blocker requires manual user interaction, ask the user to take over at that point rather than assuming it in advance.

Navigate to a URL. By default reuses an existing tab; set newTab: true to open i

Source: desktop/Cursor.app/Contents/Resources/app/extensions/cursor-browser-automation/dist/extension.js, bytes 199020–199114, SHA-256 2eeccfd9775df5cb.

Jev judged model-facing (confidence 0.88; role tool). This is a classifier judgment, not proof of delivery.

Readable text: Navigate to a URL. By default reuses an existing tab; set newTab: true to open in a new tab.

Navigate to a URL. By default reuses an existing tab; set newTab: true to open in a new tab.

The URL to navigate to

Source: desktop/Cursor.app/Contents/Resources/app/extensions/cursor-browser-automation/dist/extension.js, bytes 199199–199223, SHA-256 a92588dbfede0090.

Jev judged model-facing (confidence 0.83; role parameter). This is a classifier judgment, not proof of delivery.

Readable text: The URL to navigate to

The URL to navigate to

Target browser tab ID. If omitted, uses the last interacted tab.

Source: desktop/Cursor.app/Contents/Resources/app/extensions/cursor-browser-automation/dist/extension.js, bytes 199259–199325, SHA-256 4238efc15cdf7a6e.

Jev judged model-facing (confidence 0.8; role parameter). This is a classifier judgment, not proof of delivery.

Readable text: Target browser tab ID. If omitted, uses the last interacted tab.

Target browser tab ID. If omitted, uses the last interacted tab.

Only set when the user explicitly asks to reveal, show, focus, or open the brows

Source: desktop/Cursor.app/Contents/Resources/app/extensions/cursor-browser-automation/dist/extension.js, bytes 199386–199679, SHA-256 84999b855cefbe14.

Jev judged model-facing (confidence 0.87; role parameter). This is a classifier judgment, not proof of delivery.

Readable text: Only set when the user explicitly asks to reveal, show, focus, or open the browser visibly. Set to "active" for visible/revealed browser UI, or "side" if the user mentions "side", "beside", "side panel", or "side by side". Omit this paramet…

Only set when the user explicitly asks to reveal, show, focus, or open the browser visibly. Set to "active" for visible/revealed browser UI, or "side" if the user mentions "side", "beside", "side panel", or "side by side". Omit this parameter for background automation so focus is preserved.

When true, takes a screenshot after navigation completes. Defaults to false.

Source: desktop/Cursor.app/Contents/Resources/app/extensions/cursor-browser-automation/dist/extension.js, bytes 199736–199814, SHA-256 bbbf05cb6a8f62e4.

Jev judged not model-facing (confidence 0.72; role parameter). This is a classifier judgment, not proof of delivery.

Readable text: When true, takes a screenshot after navigation completes. Defaults to false.

When true, takes a screenshot after navigation completes. Defaults to false.

When true, creates a new tab before navigating instead of reusing an existing ta

Source: desktop/Cursor.app/Contents/Resources/app/extensions/cursor-browser-automation/dist/extension.js, bytes 199851–199954, SHA-256 650dbc805d50f28f.

Jev judged not model-facing (confidence 0.66; role parameter). This is a classifier judgment, not proof of delivery.

Readable text: When true, creates a new tab before navigating instead of reusing an existing tab. Defaults to false.

When true, creates a new tab before navigating instead of reusing an existing tab. Defaults to false.

Capture accessibility snapshot of the current page, this is better than screensh

Source: desktop/Cursor.app/Contents/Resources/app/extensions/cursor-browser-automation/dist/extension.js, bytes 200014–200098, SHA-256 22833ef78f0c2789.

Jev judged model-facing (confidence 0.81; role tool). This is a classifier judgment, not proof of delivery.

Readable text: Capture accessibility snapshot of the current page, this is better than screenshot

Capture accessibility snapshot of the current page, this is better than screenshot

Target browser tab ID. If omitted, uses the last interacted tab. · byte 200186

Source: desktop/Cursor.app/Contents/Resources/app/extensions/cursor-browser-automation/dist/extension.js, bytes 200186–200252, SHA-256 4238efc15cdf7a6e.

Jev judged not model-facing (confidence 0.76; role parameter). This is a classifier judgment, not proof of delivery.

Readable text: Target browser tab ID. If omitted, uses the last interacted tab.

Target browser tab ID. If omitted, uses the last interacted tab.

When true, only include interactive elements in the snapshot. Defaults to false.

Source: desktop/Cursor.app/Contents/Resources/app/extensions/cursor-browser-automation/dist/extension.js, bytes 200294–200376, SHA-256 7b8e2fed1e9cf1b3.

Jev judged not model-facing (confidence 0.69; role parameter). This is a classifier judgment, not proof of delivery.

Readable text: When true, only include interactive elements in the snapshot. Defaults to false.

When true, only include interactive elements in the snapshot. Defaults to false.

Maximum depth for snapshot output. Defaults to 20.

Source: desktop/Cursor.app/Contents/Resources/app/extensions/cursor-browser-automation/dist/extension.js, bytes 200414–200466, SHA-256 cfb52d4eb4e6b927.

Jev judged not model-facing (confidence 0.69; role parameter). This is a classifier judgment, not proof of delivery.

Readable text: Maximum depth for snapshot output. Defaults to 20.

Maximum depth for snapshot output. Defaults to 20.

When true, outputs a more compact snapshot format. Defaults to false.

Source: desktop/Cursor.app/Contents/Resources/app/extensions/cursor-browser-automation/dist/extension.js, bytes 200504–200575, SHA-256 8297b23b0c767ac3.

Jev judged not model-facing (confidence 0.61; role parameter). This is a classifier judgment, not proof of delivery.

Readable text: When true, outputs a more compact snapshot format. Defaults to false.

When true, outputs a more compact snapshot format. Defaults to false.

Optional CSS selector to scope the snapshot to a subtree.

Source: desktop/Cursor.app/Contents/Resources/app/extensions/cursor-browser-automation/dist/extension.js, bytes 200613–200672, SHA-256 9495858fd6598ace.

Jev judged not model-facing (confidence 0.71; role parameter). This is a classifier judgment, not proof of delivery.

Readable text: Optional CSS selector to scope the snapshot to a subtree.

Optional CSS selector to scope the snapshot to a subtree.

When true, include a diff vs the previous snapshot for this tab. Defaults to fal

Source: desktop/Cursor.app/Contents/Resources/app/extensions/cursor-browser-automation/dist/extension.js, bytes 200714–200799, SHA-256 de7c555cb2f4b418.

Jev judged not model-facing (confidence 0.64; role parameter). This is a classifier judgment, not proof of delivery.

Readable text: When true, include a diff vs the previous snapshot for this tab. Defaults to false.

When true, include a diff vs the previous snapshot for this tab. Defaults to false.

When true, takes a screenshot after snapshot completes. Defaults to false.

Source: desktop/Cursor.app/Contents/Resources/app/extensions/cursor-browser-automation/dist/extension.js, bytes 200856–200932, SHA-256 59660568c0dc4f73.

Jev judged not model-facing (confidence 0.7; role parameter). This is a classifier judgment, not proof of delivery.

Readable text: When true, takes a screenshot after snapshot completes. Defaults to false.

When true, takes a screenshot after snapshot completes. Defaults to false.

Click an element by ref from browser snapshot. Use this instead of CDP Input. m

Source: desktop/Cursor.app/Contents/Resources/app/extensions/cursor-browser-automation/dist/extension.js, bytes 200984–201073, SHA-256 4c40c51935440678.

Jev judged model-facing (confidence 0.86; role tool). This is a classifier judgment, not proof of delivery.

Readable text: Click an element by ref from browser_snapshot. Use this instead of CDP Input.* methods.

Click an element by ref from browser_snapshot. Use this instead of CDP Input.* methods.

Element ref from browser snapshot.

Source: desktop/Cursor.app/Contents/Resources/app/extensions/cursor-browser-automation/dist/extension.js, bytes 201158–201194, SHA-256 83c5d197343b25b9.

Jev judged not model-facing (confidence 0.72; role parameter). This is a classifier judgment, not proof of delivery.

Readable text: Element ref from browser_snapshot.

Element ref from browser_snapshot.

Human-readable description of the element.

Source: desktop/Cursor.app/Contents/Resources/app/extensions/cursor-browser-automation/dist/extension.js, bytes 201231–201275, SHA-256 cd44005fe24582e5.

Jev judged not model-facing (confidence 0.63; role parameter). This is a classifier judgment, not proof of delivery.

Readable text: Human-readable description of the element.

Human-readable description of the element.

Optional x offset from the element center.

Source: desktop/Cursor.app/Contents/Resources/app/extensions/cursor-browser-automation/dist/extension.js, bytes 201312–201356, SHA-256 915a23a33d878c1b.

Jev judged not model-facing (confidence 0.75; role parameter). This is a classifier judgment, not proof of delivery.

Readable text: Optional x offset from the element center.

Optional x offset from the element center.

Optional y offset from the element center.

Source: desktop/Cursor.app/Contents/Resources/app/extensions/cursor-browser-automation/dist/extension.js, bytes 201393–201437, SHA-256 b962d2b6bc578773.

Jev judged not model-facing (confidence 0.67; role parameter). This is a classifier judgment, not proof of delivery.

Readable text: Optional y offset from the element center.

Optional y offset from the element center.

When true, double-click the element.

Source: desktop/Cursor.app/Contents/Resources/app/extensions/cursor-browser-automation/dist/extension.js, bytes 201479–201517, SHA-256 9621ce7c03d80589.

Jev judged not model-facing (confidence 0.74; role parameter). This is a classifier judgment, not proof of delivery.

Readable text: When true, double-click the element.

When true, double-click the element.

Mouse button. Defaults to left.

Source: desktop/Cursor.app/Contents/Resources/app/extensions/cursor-browser-automation/dist/extension.js, bytes 201584–201617, SHA-256 94efba6492dc4b21.

Jev judged not model-facing (confidence 0.65; role parameter). This is a classifier judgment, not proof of delivery.

Readable text: Mouse button. Defaults to left.

Mouse button. Defaults to left.

Optional modifier keys.

Source: desktop/Cursor.app/Contents/Resources/app/extensions/cursor-browser-automation/dist/extension.js, bytes 201731–201756, SHA-256 e7fcb4f46fc2d29f.

Jev judged not model-facing (confidence 0.63; role parameter). This is a classifier judgment, not proof of delivery.

Readable text: Optional modifier keys.

Optional modifier keys.

Optional mouse hold duration before release.

Source: desktop/Cursor.app/Contents/Resources/app/extensions/cursor-browser-automation/dist/extension.js, bytes 201800–201846, SHA-256 fb0ff2b438eace04.

Jev judged not model-facing (confidence 0.68; role parameter). This is a classifier judgment, not proof of delivery.

Readable text: Optional mouse hold duration before release.

Optional mouse hold duration before release.

Target browser tab ID. If omitted, uses the last interacted tab. · byte 201882

Source: desktop/Cursor.app/Contents/Resources/app/extensions/cursor-browser-automation/dist/extension.js, bytes 201882–201948, SHA-256 4238efc15cdf7a6e.

Jev judged not model-facing (confidence 0.72; role parameter). This is a classifier judgment, not proof of delivery.

Readable text: Target browser tab ID. If omitted, uses the last interacted tab.

Target browser tab ID. If omitted, uses the last interacted tab.

When true, takes a screenshot after the click completes. Defaults to false.

Source: desktop/Cursor.app/Contents/Resources/app/extensions/cursor-browser-automation/dist/extension.js, bytes 202005–202082, SHA-256 ae130cd32931d7a8.

Jev judged not model-facing (confidence 0.65; role parameter). This is a classifier judgment, not proof of delivery.

Readable text: When true, takes a screenshot after the click completes. Defaults to false.

When true, takes a screenshot after the click completes. Defaults to false.

Click at viewport coordinates. Prefer browser click with refs when possible.

Source: desktop/Cursor.app/Contents/Resources/app/extensions/cursor-browser-automation/dist/extension.js, bytes 202148–202226, SHA-256 3263b17fb704e3aa.

Jev judged model-facing (confidence 0.82; role tool). This is a classifier judgment, not proof of delivery.

Readable text: Click at viewport coordinates. Prefer browser_click with refs when possible.

Click at viewport coordinates. Prefer browser_click with refs when possible.

Viewport x coordinate.

Source: desktop/Cursor.app/Contents/Resources/app/extensions/cursor-browser-automation/dist/extension.js, bytes 202309–202333, SHA-256 f201ca5102e7f4aa.

Jev judged not model-facing (confidence 0.78; role parameter). This is a classifier judgment, not proof of delivery.

Readable text: Viewport x coordinate.

Viewport x coordinate.

Viewport y coordinate.

Source: desktop/Cursor.app/Contents/Resources/app/extensions/cursor-browser-automation/dist/extension.js, bytes 202364–202388, SHA-256 363d0beb5d92fd6c.

Jev judged not model-facing (confidence 0.79; role parameter). This is a classifier judgment, not proof of delivery.

Readable text: Viewport y coordinate.

Viewport y coordinate.

Mouse button. Defaults to left. · byte 202455

Source: desktop/Cursor.app/Contents/Resources/app/extensions/cursor-browser-automation/dist/extension.js, bytes 202455–202488, SHA-256 94efba6492dc4b21.

Jev judged not model-facing (confidence 0.78; role parameter). This is a classifier judgment, not proof of delivery.

Readable text: Mouse button. Defaults to left.

Mouse button. Defaults to left.

Target browser tab ID. If omitted, uses the last interacted tab. · byte 202524

Source: desktop/Cursor.app/Contents/Resources/app/extensions/cursor-browser-automation/dist/extension.js, bytes 202524–202590, SHA-256 4238efc15cdf7a6e.

Jev judged not model-facing (confidence 0.78; role parameter). This is a classifier judgment, not proof of delivery.

Readable text: Target browser tab ID. If omitted, uses the last interacted tab.

Target browser tab ID. If omitted, uses the last interacted tab.

When true, takes a screenshot after the click completes. Defaults to false. · byte 202647

Source: desktop/Cursor.app/Contents/Resources/app/extensions/cursor-browser-automation/dist/extension.js, bytes 202647–202724, SHA-256 ae130cd32931d7a8.

Jev judged not model-facing (confidence 0.63; role parameter). This is a classifier judgment, not proof of delivery.

Readable text: When true, takes a screenshot after the click completes. Defaults to false.

When true, takes a screenshot after the click completes. Defaults to false.

Type text into an input, textarea, or contenteditable element by ref.

Source: desktop/Cursor.app/Contents/Resources/app/extensions/cursor-browser-automation/dist/extension.js, bytes 202782–202853, SHA-256 1c63e213a518a8a8.

Jev judged model-facing (confidence 0.82; role tool). This is a classifier judgment, not proof of delivery.

Readable text: Type text into an input, textarea, or contenteditable element by ref.

Type text into an input, textarea, or contenteditable element by ref.

Element ref from browser snapshot. · byte 202938

Source: desktop/Cursor.app/Contents/Resources/app/extensions/cursor-browser-automation/dist/extension.js, bytes 202938–202974, SHA-256 83c5d197343b25b9.

Jev judged not model-facing (confidence 0.61; role parameter). This is a classifier judgment, not proof of delivery.

Readable text: Element ref from browser_snapshot.

Element ref from browser_snapshot.

Text to type.

Source: desktop/Cursor.app/Contents/Resources/app/extensions/cursor-browser-automation/dist/extension.js, bytes 203008–203023, SHA-256 36a5640dc16efc9f.

Jev judged not model-facing (confidence 0.68; role parameter). This is a classifier judgment, not proof of delivery.

Readable text: Text to type.

Text to type.

Human-readable description of the element. · byte 203060

Source: desktop/Cursor.app/Contents/Resources/app/extensions/cursor-browser-automation/dist/extension.js, bytes 203060–203104, SHA-256 cd44005fe24582e5.

Jev judged not model-facing (confidence 0.67; role parameter). This is a classifier judgment, not proof of delivery.

Readable text: Human-readable description of the element.

Human-readable description of the element.

When true, clear existing text first.

Source: desktop/Cursor.app/Contents/Resources/app/extensions/cursor-browser-automation/dist/extension.js, bytes 203140–203179, SHA-256 04621919382a99c9.

Jev judged model-facing (confidence 0.81; role parameter). This is a classifier judgment, not proof of delivery.

Readable text: When true, clear existing text first.

When true, clear existing text first.

When true, press Enter after typing.

Source: desktop/Cursor.app/Contents/Resources/app/extensions/cursor-browser-automation/dist/extension.js, bytes 203216–203254, SHA-256 b53821af2dc16852.

Jev judged not model-facing (confidence 0.62; role parameter). This is a classifier judgment, not proof of delivery.

Readable text: When true, press Enter after typing.

When true, press Enter after typing.

When true, type character by character.

Source: desktop/Cursor.app/Contents/Resources/app/extensions/cursor-browser-automation/dist/extension.js, bytes 203291–203332, SHA-256 a67a36f9ad87249f.

Jev judged not model-facing (confidence 0.68; role parameter). This is a classifier judgment, not proof of delivery.

Readable text: When true, type character by character.

When true, type character by character.