diff --git a/common/dist/schemas/annotation_v3.schema.json b/common/dist/schemas/annotation_v3.schema.json new file mode 100644 index 0000000..4064939 --- /dev/null +++ b/common/dist/schemas/annotation_v3.schema.json @@ -0,0 +1,732 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "annotation", + "type": "object", + "description": "A visual annotation to add to the screenshot. Annotations can point to elements on the page (via `find`) or be positioned freely within the viewport.", + "anyOf": [ + { + "required": [ + "arrow" + ], + "not": { + "required": [ + "text", + "rectangle", + "circle", + "line", + "callout", + "highlight", + "blur" + ] + } + }, + { + "required": [ + "text" + ], + "not": { + "required": [ + "arrow", + "rectangle", + "circle", + "line", + "callout", + "highlight", + "blur" + ] + } + }, + { + "required": [ + "rectangle" + ], + "not": { + "required": [ + "arrow", + "text", + "circle", + "line", + "callout", + "highlight", + "blur" + ] + } + }, + { + "required": [ + "circle" + ], + "not": { + "required": [ + "arrow", + "text", + "rectangle", + "line", + "callout", + "highlight", + "blur" + ] + } + }, + { + "required": [ + "line" + ], + "not": { + "required": [ + "arrow", + "text", + "rectangle", + "circle", + "callout", + "highlight", + "blur" + ] + } + }, + { + "required": [ + "callout" + ], + "not": { + "required": [ + "arrow", + "text", + "rectangle", + "circle", + "line", + "highlight", + "blur" + ] + } + }, + { + "required": [ + "highlight" + ], + "not": { + "required": [ + "arrow", + "text", + "rectangle", + "circle", + "line", + "callout", + "blur" + ] + } + }, + { + "required": [ + "blur" + ], + "not": { + "required": [ + "arrow", + "text", + "rectangle", + "circle", + "line", + "callout", + "highlight" + ] + } + } + ], + "properties": { + "find": { + "type": "object", + "description": "Element on the page to annotate.", + "anyOf": [ + { + "required": [ + "selector" + ] + }, + { + "required": [ + "elementText" + ] + }, + { + "required": [ + "elementId" + ] + }, + { + "required": [ + "elementTestId" + ] + }, + { + "required": [ + "elementClass" + ] + }, + { + "required": [ + "elementAttribute" + ] + }, + { + "required": [ + "elementAria" + ] + } + ], + "additionalProperties": false, + "properties": { + "selector": { + "type": "string", + "description": "Selector of the element to annotate." + }, + "elementText": { + "type": "string", + "description": "Display text of the element to annotate." + }, + "elementTestId": { + "type": "string", + "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementClass": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "array", + "items": { + "type": "string" + } + } + ], + "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." + }, + "elementAttribute": { + "type": "object", + "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", + "additionalProperties": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + } + ] + } + }, + "elementAria": { + "type": "string", + "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." + } + } + }, + "position": { + "anyOf": [ + { + "type": "object", + "description": "A coordinate point (x, y).", + "properties": { + "x": { + "type": "number", + "description": "X coordinate in pixels." + }, + "y": { + "type": "number", + "description": "Y coordinate in pixels." + } + }, + "required": [ + "x", + "y" + ] + }, + { + "type": "string", + "enum": [ + "top", + "bottom", + "left", + "right", + "center", + "top-left", + "top-right", + "bottom-left", + "bottom-right" + ], + "description": "Position relative to the element (if `find` is provided) or to the viewport." + } + ] + }, + "arrow": { + "type": "object", + "description": "Configuration for arrow annotations.", + "properties": { + "from": { + "type": "object", + "description": "A coordinate point (x, y).", + "properties": { + "x": { + "type": "number", + "description": "X coordinate in pixels." + }, + "y": { + "type": "number", + "description": "Y coordinate in pixels." + } + }, + "required": [ + "x", + "y" + ] + }, + "to": { + "type": "object", + "description": "A coordinate point (x, y).", + "properties": { + "x": { + "type": "number", + "description": "X coordinate in pixels." + }, + "y": { + "type": "number", + "description": "Y coordinate in pixels." + } + }, + "required": [ + "x", + "y" + ] + }, + "color": { + "type": "string", + "description": "Color of the arrow (hex, rgb, or named color).", + "default": "#FF0000" + }, + "strokeWidth": { + "type": "number", + "description": "Width of the arrow line in pixels.", + "minimum": 1, + "default": 3 + }, + "headSize": { + "type": "number", + "description": "Size of the arrowhead in pixels.", + "minimum": 1, + "default": 15 + } + } + }, + "text": { + "type": "object", + "description": "Configuration for text annotations.", + "properties": { + "content": { + "type": "string", + "description": "Text content to display." + }, + "fontSize": { + "type": "number", + "description": "Font size in pixels.", + "minimum": 1, + "default": 16 + }, + "fontFamily": { + "type": "string", + "description": "Font family name.", + "default": "Arial" + }, + "color": { + "type": "string", + "description": "Text color (hex, rgb, or named color).", + "default": "#000000" + }, + "backgroundColor": { + "type": "string", + "description": "Background color for the text box.", + "default": "#FFFFFF" + }, + "padding": { + "anyOf": [ + { + "type": "number", + "description": "Padding in pixels on all sides.", + "minimum": 0 + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "top": { + "type": "number", + "minimum": 0 + }, + "right": { + "type": "number", + "minimum": 0 + }, + "bottom": { + "type": "number", + "minimum": 0 + }, + "left": { + "type": "number", + "minimum": 0 + } + } + } + ], + "default": 5 + }, + "maxWidth": { + "type": "number", + "description": "Maximum width of the text box. Text will wrap.", + "minimum": 1 + }, + "opacity": { + "type": "number", + "description": "Opacity of the text and background (0-1).", + "minimum": 0, + "maximum": 1, + "default": 1 + } + }, + "required": [ + "content" + ] + }, + "rectangle": { + "type": "object", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", + "properties": { + "width": { + "type": "number", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", + "minimum": 1 + }, + "fill": { + "type": "string", + "description": "Fill color (hex, rgb, or named color). Use 'transparent' for no fill.", + "default": "transparent" + }, + "stroke": { + "type": "string", + "description": "Border color (hex, rgb, or named color).", + "default": "#FF0000" + }, + "strokeWidth": { + "type": "number", + "description": "Border width in pixels.", + "minimum": 0, + "default": 2 + }, + "opacity": { + "type": "number", + "description": "Opacity (0-1).", + "minimum": 0, + "maximum": 1, + "default": 1 + }, + "rx": { + "type": "number", + "description": "Horizontal corner radius for rounded rectangles.", + "minimum": 0, + "default": 0 + }, + "ry": { + "type": "number", + "description": "Vertical corner radius for rounded rectangles.", + "minimum": 0, + "default": 0 + } + } + }, + "circle": { + "type": "object", + "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], + "properties": { + "radius": { + "type": "number", + "description": "Radius of the circle in pixels.", + "minimum": 1, + "default": 30 + }, + "fill": { + "type": "string", + "description": "Fill color (hex, rgb, or named color). Use 'transparent' for no fill.", + "default": "transparent" + }, + "stroke": { + "type": "string", + "description": "Border color (hex, rgb, or named color).", + "default": "#FF0000" + }, + "strokeWidth": { + "type": "number", + "description": "Border width in pixels.", + "minimum": 0, + "default": 2 + }, + "opacity": { + "type": "number", + "description": "Opacity (0-1).", + "minimum": 0, + "maximum": 1, + "default": 1 + } + } + }, + "line": { + "type": "object", + "description": "Configuration for line annotations.", + "properties": { + "from": { + "type": "object", + "description": "A coordinate point (x, y).", + "properties": { + "x": { + "type": "number", + "description": "X coordinate in pixels." + }, + "y": { + "type": "number", + "description": "Y coordinate in pixels." + } + }, + "required": [ + "x", + "y" + ] + }, + "to": { + "type": "object", + "description": "A coordinate point (x, y).", + "properties": { + "x": { + "type": "number", + "description": "X coordinate in pixels." + }, + "y": { + "type": "number", + "description": "Y coordinate in pixels." + } + }, + "required": [ + "x", + "y" + ] + }, + "color": { + "type": "string", + "description": "Color of the line (hex, rgb, or named color).", + "default": "#000000" + }, + "strokeWidth": { + "type": "number", + "description": "Width of the line in pixels.", + "minimum": 1, + "default": 2 + }, + "dashArray": { + "type": "array", + "description": "Dash pattern [dash, gap]. E.g., [5, 5] for dashed line.", + "items": { + "type": "number", + "minimum": 0 + } + } + }, + "required": [ + "from", + "to" + ] + }, + "callout": { + "type": "object", + "description": "Configuration for callout annotations (text with arrow).", + "properties": { + "content": { + "type": "string", + "description": "Text content to display." + }, + "target": { + "type": "object", + "description": "A coordinate point (x, y).", + "properties": { + "x": { + "type": "number", + "description": "X coordinate in pixels." + }, + "y": { + "type": "number", + "description": "Y coordinate in pixels." + } + }, + "required": [ + "x", + "y" + ] + }, + "textPosition": { + "type": "object", + "description": "A coordinate point (x, y).", + "properties": { + "x": { + "type": "number", + "description": "X coordinate in pixels." + }, + "y": { + "type": "number", + "description": "Y coordinate in pixels." + } + }, + "required": [ + "x", + "y" + ] + }, + "fontSize": { + "type": "number", + "description": "Font size in pixels.", + "minimum": 1, + "default": 14 + }, + "color": { + "type": "string", + "description": "Text color.", + "default": "#000000" + }, + "backgroundColor": { + "type": "string", + "description": "Background color for the text box.", + "default": "#FFFFCC" + }, + "arrowColor": { + "type": "string", + "description": "Color of the arrow.", + "default": "#000000" + }, + "maxWidth": { + "type": "number", + "description": "Maximum width of the text box.", + "minimum": 1 + } + }, + "required": [ + "content", + "target" + ] + }, + "highlight": { + "type": "object", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", + "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "color": { + "type": "string", + "description": "Highlight color (hex, rgb, or named color).", + "default": "#FFFF00" + }, + "opacity": { + "type": "number", + "description": "Opacity (0-1).", + "minimum": 0, + "maximum": 1, + "default": 0.3 + } + } + }, + "blur": { + "type": "object", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", + "properties": { + "intensity": { + "type": "number", + "description": "Blur intensity level.", + "minimum": 1, + "default": 10 + }, + "width": { + "type": "number", + "description": "Width of the blur area in pixels.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the blur area in pixels.", + "minimum": 1 + } + } + } + }, + "examples": [ + { + "find": { + "selector": "#submit-button" + }, + "arrow": { + "from": { + "x": 0, + "y": -50 + }, + "to": { + "x": 0, + "y": 0 + }, + "color": "#00FF00", + "strokeWidth": 4, + "headSize": 20 + } + }, + { + "position": "top-right", + "text": { + "content": "Important Notice", + "fontSize": 18, + "color": "#FFFFFF", + "backgroundColor": "#0000FF", + "padding": 10, + "maxWidth": 200, + "opacity": 0.9 + } + }, + { + "find": { + "elementClass": [ + "sensitive-info", + "/^private-/" + ] + }, + "blur": { + "intensity": 15, + "width": 200, + "height": 50 + } + } + ] +} \ No newline at end of file diff --git a/common/dist/schemas/checkLink_v3.schema.json b/common/dist/schemas/checkLink_v3.schema.json index ba4b15d..e4aee34 100644 --- a/common/dist/schemas/checkLink_v3.schema.json +++ b/common/dist/schemas/checkLink_v3.schema.json @@ -63,70 +63,6 @@ } } ], - "components": { - "schemas": { - "string": { - "title": "Check link (detailed)", - "description": "Check if an HTTP or HTTPS URL returns an acceptable status code from a GET request.", - "type": "string", - "pattern": "(^(http://|https://|\\/).*|\\$[A-Za-z0-9_]+$)", - "transform": [ - "trim" - ] - }, - "object": { - "title": "Check link (detailed)", - "description": "Check if an HTTP or HTTPS URL returns an acceptable status code from a GET request.", - "type": "object", - "additionalProperties": false, - "required": [ - "url" - ], - "properties": { - "url": { - "type": "string", - "description": "URL to check. Can be a full URL or a path. If a path is provided, `origin` must be specified.", - "pattern": "(^(http://|https://|/).*|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - "origin": { - "type": "string", - "description": "Protocol and domain to navigate to. Prepended to `url`.", - "transform": [ - "trim" - ] - }, - "statusCodes": { - "description": "Accepted status codes. If the specified URL returns a code other than what is specified here, the action fails.", - "anyOf": [ - { - "type": "integer" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "integer" - } - ] - } - } - ], - "default": [ - 200, - 301, - 302, - 307, - 308 - ] - } - } - } - } - }, "examples": [ "https://www.google.com", "/search", diff --git a/common/dist/schemas/click_v3.schema.json b/common/dist/schemas/click_v3.schema.json index 7c62e4f..eef79c3 100644 --- a/common/dist/schemas/click_v3.schema.json +++ b/common/dist/schemas/click_v3.schema.json @@ -115,127 +115,6 @@ "type": "boolean" } ], - "components": { - "schemas": { - "string": { - "title": "Click element (simple)", - "type": "string", - "description": "Identifier for the element to click. Can be a selector, element text, ARIA name, ID, or test ID." - }, - "button": { - "description": "Kind of click to perform.", - "type": "string", - "enum": [ - "left", - "right", - "middle" - ] - }, - "object": { - "title": "Click element (detailed)", - "type": "object", - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "properties": { - "button": { - "description": "Kind of click to perform.", - "type": "string", - "enum": [ - "left", - "right", - "middle" - ] - }, - "elementText": { - "type": "string", - "description": "Display text of the element to click. If combined with other element finding fields, the element must match all specified criteria." - }, - "selector": { - "type": "string", - "description": "Selector of the element to click. If combined with other element finding fields, the element must match all specified criteria." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to click. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to click. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - } - } - } - } - }, "examples": [ true, "right", diff --git a/common/dist/schemas/config_v3.schema.json b/common/dist/schemas/config_v3.schema.json index f828ad5..69022d1 100644 --- a/common/dist/schemas/config_v3.schema.json +++ b/common/dist/schemas/config_v3.schema.json @@ -5812,6 +5812,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -5991,16 +5995,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -6043,6 +6047,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -6218,8 +6225,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -6236,7 +6253,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -6398,16 +6415,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -6450,6 +6467,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -6625,8 +6645,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -6643,7 +6673,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -7175,6 +7205,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -7354,16 +7388,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -7406,6 +7440,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -7581,8 +7618,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -7599,7 +7646,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -7761,16 +7808,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -7813,6 +7860,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -7988,8 +8038,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -8006,7 +8066,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -10960,9870 +11020,6 @@ "default": false } }, - "components": { - "schemas": { - "environment": { - "type": "object", - "description": "Environment information for the system running Doc Detective.", - "readOnly": true, - "additionalProperties": false, - "required": [ - "platform" - ], - "properties": { - "workingDirectory": { - "description": "The current working directory of the process running Doc Detective.", - "type": "string" - }, - "platform": { - "description": "The operating system type running Doc Detective.", - "type": "string", - "enum": [ - "linux", - "mac", - "windows" - ] - }, - "arch": { - "description": "The processor architecture of the system running Doc Detective.", - "type": "string", - "enum": [ - "arm32", - "arm64", - "x32", - "x64" - ] - } - }, - "title": "Environment details" - }, - "markupDefinition": { - "type": "object", - "properties": { - "name": { - "description": "Name of the markup definition", - "type": "string" - }, - "regex": { - "description": "Regular expressions to match the markup type.", - "anyOf": [ - { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "minItems": 1, - "items": { - "type": "string" - } - } - ] - } - ] - }, - "batchMatches": { - "description": "If `true`, all matches are combined into a single string.", - "type": "boolean", - "default": false - }, - "actions": { - "description": "Actions to perform when the markup type is detected.", - "anyOf": [ - { - "type": "string", - "enum": [ - "checkLink", - "click", - "find", - "goTo", - "httpRequest", - "loadCookie", - "loadVariables", - "record", - "runCode", - "runShell", - "saveCookie", - "screenshot", - "stopRecord", - "type", - "wait" - ] - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string", - "enum": [ - "checkLink", - "click", - "find", - "goTo", - "httpRequest", - "loadCookie", - "loadVariables", - "record", - "runCode", - "runShell", - "saveCookie", - "screenshot", - "stopRecord", - "type", - "wait" - ] - }, - { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "step", - "description": "A step in a test.", - "type": "object", - "components": { - "schemas": { - "common": { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { - "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - }, - "title": "Common" - }, - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { - "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - } - }, - "anyOf": [ - { - "allOf": [ - { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { - "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - }, - "title": "Common" - }, - { - "type": "object", - "required": [ - "checkLink" - ], - "properties": { - "checkLink": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "checkLink", - "anyOf": [ - { - "title": "Check link (detailed)", - "description": "Check if an HTTP or HTTPS URL returns an acceptable status code from a GET request.", - "type": "string", - "pattern": "(^(http://|https://|\\/).*|\\$[A-Za-z0-9_]+$)", - "transform": [ - "trim" - ] - }, - { - "title": "Check link (detailed)", - "description": "Check if an HTTP or HTTPS URL returns an acceptable status code from a GET request.", - "type": "object", - "additionalProperties": false, - "required": [ - "url" - ], - "properties": { - "url": { - "type": "string", - "description": "URL to check. Can be a full URL or a path. If a path is provided, `origin` must be specified.", - "pattern": "(^(http://|https://|/).*|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - "origin": { - "type": "string", - "description": "Protocol and domain to navigate to. Prepended to `url`.", - "transform": [ - "trim" - ] - }, - "statusCodes": { - "description": "Accepted status codes. If the specified URL returns a code other than what is specified here, the action fails.", - "anyOf": [ - { - "type": "integer" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "integer" - } - ] - } - } - ], - "default": [ - 200, - 301, - 302, - 307, - 308 - ] - } - } - } - ], - "components": { - "schemas": { - "string": { - "title": "Check link (detailed)", - "description": "Check if an HTTP or HTTPS URL returns an acceptable status code from a GET request.", - "type": "string", - "pattern": "(^(http://|https://|\\/).*|\\$[A-Za-z0-9_]+$)", - "transform": [ - "trim" - ] - }, - "object": { - "title": "Check link (detailed)", - "description": "Check if an HTTP or HTTPS URL returns an acceptable status code from a GET request.", - "type": "object", - "additionalProperties": false, - "required": [ - "url" - ], - "properties": { - "url": { - "type": "string", - "description": "URL to check. Can be a full URL or a path. If a path is provided, `origin` must be specified.", - "pattern": "(^(http://|https://|/).*|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - "origin": { - "type": "string", - "description": "Protocol and domain to navigate to. Prepended to `url`.", - "transform": [ - "trim" - ] - }, - "statusCodes": { - "description": "Accepted status codes. If the specified URL returns a code other than what is specified here, the action fails.", - "anyOf": [ - { - "type": "integer" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "integer" - } - ] - } - } - ], - "default": [ - 200, - 301, - 302, - 307, - 308 - ] - } - } - } - } - }, - "examples": [ - "https://www.google.com", - "/search", - { - "url": "https://www.google.com", - "statusCodes": 200 - }, - { - "url": "/search", - "origin": "www.google.com", - "statusCodes": [ - 200 - ] - } - ] - } - }, - "title": "checkLink" - } - ] - }, - { - "allOf": [ - { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { - "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - }, - "title": "Common" - }, - { - "type": "object", - "required": [ - "click" - ], - "properties": { - "click": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "click", - "description": "Click or tap an element.", - "anyOf": [ - { - "title": "Click element (simple)", - "type": "string", - "description": "Identifier for the element to click. Can be a selector, element text, ARIA name, ID, or test ID." - }, - { - "title": "Click element (detailed)", - "type": "object", - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "properties": { - "button": { - "description": "Kind of click to perform.", - "type": "string", - "enum": [ - "left", - "right", - "middle" - ] - }, - "elementText": { - "type": "string", - "description": "Display text of the element to click. If combined with other element finding fields, the element must match all specified criteria." - }, - "selector": { - "type": "string", - "description": "Selector of the element to click. If combined with other element finding fields, the element must match all specified criteria." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to click. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to click. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - } - } - }, - { - "type": "boolean" - } - ], - "components": { - "schemas": { - "string": { - "title": "Click element (simple)", - "type": "string", - "description": "Identifier for the element to click. Can be a selector, element text, ARIA name, ID, or test ID." - }, - "button": { - "description": "Kind of click to perform.", - "type": "string", - "enum": [ - "left", - "right", - "middle" - ] - }, - "object": { - "title": "Click element (detailed)", - "type": "object", - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "properties": { - "button": { - "description": "Kind of click to perform.", - "type": "string", - "enum": [ - "left", - "right", - "middle" - ] - }, - "elementText": { - "type": "string", - "description": "Display text of the element to click. If combined with other element finding fields, the element must match all specified criteria." - }, - "selector": { - "type": "string", - "description": "Selector of the element to click. If combined with other element finding fields, the element must match all specified criteria." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to click. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to click. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - } - } - } - } - }, - "examples": [ - true, - "right", - { - "button": "left", - "elementText": "Element text" - }, - { - "selector": "#elementToScreenshot", - "elementText": "Element text", - "button": "middle" - } - ] - } - }, - "title": "click" - } - ] - }, - { - "allOf": [ - { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { - "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - }, - "title": "Common" - }, - { - "type": "object", - "required": [ - "find" - ], - "properties": { - "find": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "find", - "description": "Find an element based on display text or a selector, then optionally interact with it.", - "anyOf": [ - { - "title": "Find element (simple)", - "type": "string", - "description": "Identifier for the element to find. Can be a selector, element text, ARIA name, ID, or test ID." - }, - { - "title": "Find element (detailed)", - "type": "object", - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "additionalProperties": false, - "properties": { - "elementText": { - "type": "string", - "description": "Display text of the element to find. If combined with other element finding fields, the element must match all specified criteria." - }, - "selector": { - "type": "string", - "description": "Selector of the element to find. If combined with other element finding fields, the element must match all specified criteria." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - }, - "timeout": { - "type": "integer", - "description": "Max duration in milliseconds to wait for the element to exist.", - "default": 5000 - }, - "moveTo": { - "description": "Move to the element. If the element isn't visible, it's scrolled into view.", - "type": "boolean", - "default": true - }, - "click": { - "description": "Click the element.", - "anyOf": [ - { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "click", - "description": "Click or tap an element.", - "anyOf": [ - { - "title": "Click element (simple)", - "type": "string", - "description": "Identifier for the element to click. Can be a selector, element text, ARIA name, ID, or test ID." - }, - { - "title": "Click element (detailed)", - "type": "object", - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "properties": { - "button": { - "description": "Kind of click to perform.", - "type": "string", - "enum": [ - "left", - "right", - "middle" - ] - }, - "elementText": { - "type": "string", - "description": "Display text of the element to click. If combined with other element finding fields, the element must match all specified criteria." - }, - "selector": { - "type": "string", - "description": "Selector of the element to click. If combined with other element finding fields, the element must match all specified criteria." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to click. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to click. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - } - } - }, - { - "type": "boolean" - } - ], - "components": { - "schemas": { - "string": { - "title": "Click element (simple)", - "type": "string", - "description": "Identifier for the element to click. Can be a selector, element text, ARIA name, ID, or test ID." - }, - "button": { - "description": "Kind of click to perform.", - "type": "string", - "enum": [ - "left", - "right", - "middle" - ] - }, - "object": { - "title": "Click element (detailed)", - "type": "object", - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "properties": { - "button": { - "description": "Kind of click to perform.", - "type": "string", - "enum": [ - "left", - "right", - "middle" - ] - }, - "elementText": { - "type": "string", - "description": "Display text of the element to click. If combined with other element finding fields, the element must match all specified criteria." - }, - "selector": { - "type": "string", - "description": "Selector of the element to click. If combined with other element finding fields, the element must match all specified criteria." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to click. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to click. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - } - } - } - } - }, - "examples": [ - true, - "right", - { - "button": "left", - "elementText": "Element text" - }, - { - "selector": "#elementToScreenshot", - "elementText": "Element text", - "button": "middle" - } - ] - }, - { - "type": "object", - "properties": { - "button": { - "description": "Kind of click to perform.", - "type": "string", - "enum": [ - "left", - "right", - "middle" - ] - } - }, - "title": "Find element and click" - } - ] - }, - "type": { - "description": "Type keys after finding the element. Either a string or an object with a `keys` field as defined in [`type`](type). To type in the element, make the element active with the `click` parameter.", - "allOf": [ - { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "typeKeys", - "description": "Type keys. To type special keys, begin and end the string with `$` and use the special key's keyword. For example, to type the Escape key, enter `$ESCAPE$`.", - "anyOf": [ - { - "title": "Type keys (simple)", - "description": "Sequence of keys to enter.", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - } - ] - } - } - ] - }, - { - "title": "Type keys (detailed)", - "type": "object", - "properties": { - "keys": { - "title": "Type keys (simple)", - "description": "Sequence of keys to enter.", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - } - ] - } - } - ] - }, - "inputDelay": { - "type": "number", - "description": "Delay in milliseconds between each key press during a recording", - "default": 100 - }, - "selector": { - "type": "string", - "description": "Selector for the element to type into. If not specified, the typing occurs in the active element." - }, - "elementText": { - "type": "string", - "description": "Display text of the element to type into. If combined with other element finding fields, the element must match all specified criteria." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - } - }, - "required": [ - "keys" - ], - "additionalProperties": false - } - ], - "components": { - "schemas": { - "keys": { - "title": "Type keys (simple)", - "description": "Sequence of keys to enter.", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - } - ] - } - } - ] - }, - "object": { - "title": "Type keys (detailed)", - "type": "object", - "properties": { - "keys": { - "title": "Type keys (simple)", - "description": "Sequence of keys to enter.", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - } - ] - } - } - ] - }, - "inputDelay": { - "type": "number", - "description": "Delay in milliseconds between each key press during a recording", - "default": 100 - }, - "selector": { - "type": "string", - "description": "Selector for the element to type into. If not specified, the typing occurs in the active element." - }, - "elementText": { - "type": "string", - "description": "Display text of the element to type into. If combined with other element finding fields, the element must match all specified criteria." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - } - }, - "required": [ - "keys" - ], - "additionalProperties": false - } - } - }, - "examples": [ - "kittens", - [ - "$ENTER$" - ], - [ - "kittens", - "$ENTER$" - ], - { - "keys": "kittens" - }, - { - "keys": [ - "$ENTER$" - ] - }, - { - "keys": [ - "kittens", - "$ENTER$" - ], - "inputDelay": 500 - } - ] - }, - { - "not": { - "type": "object", - "required": [ - "selector", - "elementText", - "elementId", - "elementTestId", - "elementClass", - "elementAttribute", - "elementAria" - ], - "title": "Find element and type" - } - } - ] - } - } - } - ], - "components": { - "schemas": { - "string": { - "title": "Find element (simple)", - "type": "string", - "description": "Identifier for the element to find. Can be a selector, element text, ARIA name, ID, or test ID." - }, - "object": { - "title": "Find element (detailed)", - "type": "object", - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "additionalProperties": false, - "properties": { - "elementText": { - "type": "string", - "description": "Display text of the element to find. If combined with other element finding fields, the element must match all specified criteria." - }, - "selector": { - "type": "string", - "description": "Selector of the element to find. If combined with other element finding fields, the element must match all specified criteria." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - }, - "timeout": { - "type": "integer", - "description": "Max duration in milliseconds to wait for the element to exist.", - "default": 5000 - }, - "moveTo": { - "description": "Move to the element. If the element isn't visible, it's scrolled into view.", - "type": "boolean", - "default": true - }, - "click": { - "description": "Click the element.", - "anyOf": [ - { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "click", - "description": "Click or tap an element.", - "anyOf": [ - { - "title": "Click element (simple)", - "type": "string", - "description": "Identifier for the element to click. Can be a selector, element text, ARIA name, ID, or test ID." - }, - { - "title": "Click element (detailed)", - "type": "object", - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "properties": { - "button": { - "description": "Kind of click to perform.", - "type": "string", - "enum": [ - "left", - "right", - "middle" - ] - }, - "elementText": { - "type": "string", - "description": "Display text of the element to click. If combined with other element finding fields, the element must match all specified criteria." - }, - "selector": { - "type": "string", - "description": "Selector of the element to click. If combined with other element finding fields, the element must match all specified criteria." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to click. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to click. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - } - } - }, - { - "type": "boolean" - } - ], - "components": { - "schemas": { - "string": { - "title": "Click element (simple)", - "type": "string", - "description": "Identifier for the element to click. Can be a selector, element text, ARIA name, ID, or test ID." - }, - "button": { - "description": "Kind of click to perform.", - "type": "string", - "enum": [ - "left", - "right", - "middle" - ] - }, - "object": { - "title": "Click element (detailed)", - "type": "object", - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "properties": { - "button": { - "description": "Kind of click to perform.", - "type": "string", - "enum": [ - "left", - "right", - "middle" - ] - }, - "elementText": { - "type": "string", - "description": "Display text of the element to click. If combined with other element finding fields, the element must match all specified criteria." - }, - "selector": { - "type": "string", - "description": "Selector of the element to click. If combined with other element finding fields, the element must match all specified criteria." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to click. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to click. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - } - } - } - } - }, - "examples": [ - true, - "right", - { - "button": "left", - "elementText": "Element text" - }, - { - "selector": "#elementToScreenshot", - "elementText": "Element text", - "button": "middle" - } - ] - }, - { - "type": "object", - "properties": { - "button": { - "description": "Kind of click to perform.", - "type": "string", - "enum": [ - "left", - "right", - "middle" - ] - } - }, - "title": "Find element and click" - } - ] - }, - "type": { - "description": "Type keys after finding the element. Either a string or an object with a `keys` field as defined in [`type`](type). To type in the element, make the element active with the `click` parameter.", - "allOf": [ - { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "typeKeys", - "description": "Type keys. To type special keys, begin and end the string with `$` and use the special key's keyword. For example, to type the Escape key, enter `$ESCAPE$`.", - "anyOf": [ - { - "title": "Type keys (simple)", - "description": "Sequence of keys to enter.", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - } - ] - } - } - ] - }, - { - "title": "Type keys (detailed)", - "type": "object", - "properties": { - "keys": { - "title": "Type keys (simple)", - "description": "Sequence of keys to enter.", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - } - ] - } - } - ] - }, - "inputDelay": { - "type": "number", - "description": "Delay in milliseconds between each key press during a recording", - "default": 100 - }, - "selector": { - "type": "string", - "description": "Selector for the element to type into. If not specified, the typing occurs in the active element." - }, - "elementText": { - "type": "string", - "description": "Display text of the element to type into. If combined with other element finding fields, the element must match all specified criteria." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - } - }, - "required": [ - "keys" - ], - "additionalProperties": false - } - ], - "components": { - "schemas": { - "keys": { - "title": "Type keys (simple)", - "description": "Sequence of keys to enter.", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - } - ] - } - } - ] - }, - "object": { - "title": "Type keys (detailed)", - "type": "object", - "properties": { - "keys": { - "title": "Type keys (simple)", - "description": "Sequence of keys to enter.", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - } - ] - } - } - ] - }, - "inputDelay": { - "type": "number", - "description": "Delay in milliseconds between each key press during a recording", - "default": 100 - }, - "selector": { - "type": "string", - "description": "Selector for the element to type into. If not specified, the typing occurs in the active element." - }, - "elementText": { - "type": "string", - "description": "Display text of the element to type into. If combined with other element finding fields, the element must match all specified criteria." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - } - }, - "required": [ - "keys" - ], - "additionalProperties": false - } - } - }, - "examples": [ - "kittens", - [ - "$ENTER$" - ], - [ - "kittens", - "$ENTER$" - ], - { - "keys": "kittens" - }, - { - "keys": [ - "$ENTER$" - ] - }, - { - "keys": [ - "kittens", - "$ENTER$" - ], - "inputDelay": 500 - } - ] - }, - { - "not": { - "type": "object", - "required": [ - "selector", - "elementText", - "elementId", - "elementTestId", - "elementClass", - "elementAttribute", - "elementAria" - ], - "title": "Find element and type" - } - } - ] - } - } - } - } - }, - "examples": [ - "Find me!", - { - "selector": "[title=Search]" - }, - { - "selector": "[title=Search]", - "timeout": 10000, - "elementText": "Search", - "moveTo": true, - "click": true, - "type": "shorthair cat" - }, - { - "selector": "[title=Search]", - "click": { - "button": "right" - } - }, - { - "selector": "[title=Search]", - "timeout": 10000, - "elementText": "Search", - "moveTo": true, - "click": true, - "type": { - "keys": [ - "shorthair cat" - ], - "inputDelay": 100 - } - }, - { - "elementId": "/^user-[0-9]+$/", - "elementClass": [ - "admin", - "/^level-[1-5]$/" - ], - "elementAttribute": { - "data-active": true, - "data-score": "/^[0-9]+$/" - }, - "timeout": 8000, - "moveTo": false - } - ] - } - }, - "title": "find" - } - ] - }, - { - "allOf": [ - { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { - "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - }, - "title": "Common" - }, - { - "type": "object", - "required": [ - "goTo" - ], - "properties": { - "goTo": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "goTo", - "anyOf": [ - { - "title": "Go to URL (simple)", - "description": "Navigate to an HTTP or HTTPS URL. Can be a full URL or a path. If a path is provided, navigates relative to the current URL, if any.", - "type": "string", - "pattern": "(^(http://|https://|/).*|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - { - "description": "Navigate to an HTTP or HTTPS URL.", - "type": "object", - "additionalProperties": false, - "required": [ - "url" - ], - "properties": { - "url": { - "type": "string", - "description": "URL to navigate to. Can be a full URL or a path. If a path is provided and `origin` is specified, prepends `origin` to `url`. If a path is provided but `origin` isn't specified, attempts to navigate relative to the current URL, if any.", - "pattern": "(^(http://|https://|/).*|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - "origin": { - "type": "string", - "description": "Protocol and domain to navigate to. Prepended to `url`.", - "transform": [ - "trim" - ] - }, - "timeout": { - "type": "integer", - "description": "Maximum time in milliseconds to wait for the page to be ready. If exceeded, the goTo action fails.", - "default": 30000, - "minimum": 0 - }, - "waitUntil": { - "type": "object", - "description": "Configuration for waiting conditions after navigation.", - "additionalProperties": false, - "properties": { - "networkIdleTime": { - "description": "Wait for network activity to be idle (no new requests) for this duration in milliseconds. Set to `null` to skip this check.", - "anyOf": [ - { - "type": "integer", - "minimum": 0 - }, - { - "type": "null" - } - ], - "default": 500 - }, - "domIdleTime": { - "description": "Wait for DOM mutations to stop for this duration in milliseconds. Set to `null` to skip this check.", - "anyOf": [ - { - "type": "integer", - "minimum": 0 - }, - { - "type": "null" - } - ], - "default": 1000 - }, - "find": { - "type": "object", - "description": "Wait for a specific element to be present in the DOM. At least one of selector or elementText must be specified.", - "additionalProperties": false, - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "properties": { - "selector": { - "type": "string", - "description": "CSS selector for the element to wait for." - }, - "elementText": { - "type": "string", - "description": "Text content the element must contain. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - } - } - } - } - } - }, - "title": "Go to URL (detailed)" - } - ], - "components": { - "schemas": { - "string": { - "title": "Go to URL (simple)", - "description": "Navigate to an HTTP or HTTPS URL. Can be a full URL or a path. If a path is provided, navigates relative to the current URL, if any.", - "type": "string", - "pattern": "(^(http://|https://|/).*|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - "object": { - "description": "Navigate to an HTTP or HTTPS URL.", - "type": "object", - "additionalProperties": false, - "required": [ - "url" - ], - "properties": { - "url": { - "type": "string", - "description": "URL to navigate to. Can be a full URL or a path. If a path is provided and `origin` is specified, prepends `origin` to `url`. If a path is provided but `origin` isn't specified, attempts to navigate relative to the current URL, if any.", - "pattern": "(^(http://|https://|/).*|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - "origin": { - "type": "string", - "description": "Protocol and domain to navigate to. Prepended to `url`.", - "transform": [ - "trim" - ] - }, - "timeout": { - "type": "integer", - "description": "Maximum time in milliseconds to wait for the page to be ready. If exceeded, the goTo action fails.", - "default": 30000, - "minimum": 0 - }, - "waitUntil": { - "type": "object", - "description": "Configuration for waiting conditions after navigation.", - "additionalProperties": false, - "properties": { - "networkIdleTime": { - "description": "Wait for network activity to be idle (no new requests) for this duration in milliseconds. Set to `null` to skip this check.", - "anyOf": [ - { - "type": "integer", - "minimum": 0 - }, - { - "type": "null" - } - ], - "default": 500 - }, - "domIdleTime": { - "description": "Wait for DOM mutations to stop for this duration in milliseconds. Set to `null` to skip this check.", - "anyOf": [ - { - "type": "integer", - "minimum": 0 - }, - { - "type": "null" - } - ], - "default": 1000 - }, - "find": { - "type": "object", - "description": "Wait for a specific element to be present in the DOM. At least one of selector or elementText must be specified.", - "additionalProperties": false, - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "properties": { - "selector": { - "type": "string", - "description": "CSS selector for the element to wait for." - }, - "elementText": { - "type": "string", - "description": "Text content the element must contain. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - } - } - } - } - } - }, - "title": "Go to URL (detailed)" - } - } - }, - "examples": [ - "https://www.google.com", - "/search", - { - "url": "https://www.google.com" - }, - { - "url": "/search", - "origin": "https://www.google.com" - }, - { - "url": "https://www.example.com", - "waitUntil": { - "networkIdleTime": 500 - } - }, - { - "url": "https://www.example.com/dashboard", - "waitUntil": { - "find": { - "selector": "[data-testid='dashboard-loaded']" - } - } - }, - { - "url": "https://www.example.com/app", - "timeout": 60000, - "waitUntil": { - "networkIdleTime": 500, - "domIdleTime": 1000, - "find": { - "selector": ".main-content", - "elementText": "Dashboard" - } - } - }, - { - "url": "https://www.example.com/app", - "timeout": 60000, - "waitUntil": { - "networkIdleTime": null - } - }, - { - "url": "https://www.example.com/status", - "waitUntil": { - "find": { - "elementText": "System operational" - } - } - }, - { - "url": "http://localhost:8092", - "waitUntil": { - "find": { - "selector": "button", - "elementText": "Standard Button", - "elementTestId": "standard-btn", - "elementAria": "Sample Standard Button", - "elementId": "standard-btn", - "elementClass": [ - "btn" - ], - "elementAttribute": { - "type": "button", - "value": "Standard Button" - } - } - } - } - ] - } - }, - "title": "goTo" - } - ] - }, - { - "allOf": [ - { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { - "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - }, - "title": "Common" - }, - { - "type": "object", - "required": [ - "httpRequest" - ], - "properties": { - "httpRequest": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "httpRequest", - "description": "Perform a generic HTTP request, for example to an API.", - "anyOf": [ - { - "title": "HTTP request (simple)", - "type": "string", - "description": "URL for the HTTP request.", - "pattern": "(^(http://|https://).*|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - { - "title": "HTTP request (detailed)", - "type": "object", - "anyOf": [ - { - "required": [ - "url" - ] - }, - { - "required": [ - "openApi" - ] - } - ], - "additionalProperties": false, - "properties": { - "url": { - "title": "HTTP request (simple)", - "type": "string", - "description": "URL for the HTTP request.", - "pattern": "(^(http://|https://).*|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - "openApi": { - "anyOf": [ - { - "allOf": [ - { - "type": "string", - "description": "ID of the operation to use for the request." - }, - { - "title": "Operation ID", - "description": "Operation ID from the OpenAPI schema. Only valid if the OpenAPI description path is specified elsewhere and the operation ID is unique among all specified OpenAPI descriptions." - } - ] - }, - { - "allOf": [ - { - "version": "1.0.0", - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "openApi", - "type": "object", - "description": "OpenAPI description and configuration.", - "additionalProperties": false, - "anyOf": [ - { - "required": [ - "descriptionPath" - ] - }, - { - "required": [ - "operationId" - ] - } - ], - "properties": { - "name": { - "type": "string", - "description": "Name of the OpenAPI description, as defined in your configuration." - }, - "descriptionPath": { - "type": "string", - "description": "URL or local path to the OpenAPI description." - }, - "definition": { - "type": "object", - "readOnly": true, - "description": "OpenAPI definition object loaded from the `descriptionPath`. This is a resolved version of the OpenAPI description and should not be user-defined.", - "additionalProperties": true, - "title": "OpenAPI definition" - }, - "operationId": { - "type": "string", - "description": "ID of the operation to use for the request." - }, - "server": { - "type": "string", - "description": "Server to use for example requests. Only valid if `useExample` is `request` or `both`. If not specified but an example is used for the request, uses the first server defined in the OpenAPI description." - }, - "validateAgainstSchema": { - "type": "string", - "description": "Validates the request and/or response against the schema in the OpenAPI description. If the request or response doesn't match the schema, the step fails.", - "enum": [ - "request", - "response", - "both", - "none" - ], - "default": "both" - }, - "mockResponse": { - "type": "boolean", - "description": "If `true`, doesn't make the HTTP request, but instead uses the response example or schema from the OpenAPI description as the response data. Useful for creating tests when an API isn't fully implemented yet. If `statusCode` isn't specified, uses the first defined response code." - }, - "statusCode": { - "type": "integer", - "description": "Response code to use for validation, examples, and status code checking. If the response code doesn't match, the step fails. `statusCodes` overrides this value when specified." - }, - "useExample": { - "type": [ - "string" - ], - "description": "Uses the example from the OpenAPI description as the request and response data. If the request or response has multiple examples, specify `exampleKey`. If `statusCode` isn't specified, uses the first defined response code. `requestData`, `requestParams`, and `requestHeaders` override portions of request examples when specified. `responseData` overrides portions of response examples when specified.", - "enum": [ - "request", - "response", - "both", - "none" - ], - "default": "none" - }, - "exampleKey": { - "type": "string", - "description": "Key of the example to use from the `examples` property in the OpenAPI description. If an `examples` key isn't specified or isn't available for a given parameter or object, the `example` property value is used.", - "default": "" - }, - "headers": { - "type": "object", - "description": "Request headers to add to requests. For example, to set `Authorization` headers for all requests from the specified OpenAPI document. If specified in both a config and a step, the step value overrides the config value.", - "additionalProperties": { - "type": "string" - }, - "title": "OpenAPI request headers" - } - }, - "components": { - "schemas": { - "operationId": { - "type": "string", - "description": "ID of the operation to use for the request." - }, - "descriptionPath": { - "type": "string", - "description": "URL or local path to the OpenAPI description." - } - } - }, - "examples": [ - { - "descriptionPath": "https://petstore.swagger.io/v2/swagger.json" - }, - { - "name": "Reqres", - "operationId": "getUserById" - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "getUserById" - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both" - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both", - "exampleKey": "example1" - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both", - "exampleKey": "example1", - "statusCode": 201 - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both", - "exampleKey": "example1", - "statusCode": 201, - "validateAgainstSchema": "none" - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both", - "exampleKey": "example1", - "statusCode": 201, - "validateAgainstSchema": "none", - "mockResponse": true - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both", - "exampleKey": "example1", - "statusCode": 201, - "validateAgainstSchema": "none", - "mockResponse": true, - "headers": { - "Authorization": "Bearer 12345" - } - } - ] - }, - { - "type": "object", - "required": [ - "operationId" - ], - "title": "OpenAPI definition (httpRequest)" - } - ] - } - ] - }, - "statusCodes": { - "description": "Accepted status codes. If the specified URL returns a code other than what is specified here, the action fails.", - "type": "array", - "items": { - "anyOf": [ - { - "type": "integer" - } - ] - }, - "default": [ - 200, - 201 - ] - }, - "method": { - "type": "string", - "description": "Method of the HTTP request", - "enum": [ - "get", - "put", - "post", - "patch", - "delete" - ], - "transform": [ - "trim", - "toEnumCase" - ], - "default": "get" - }, - "timeout": { - "type": "integer", - "description": "Timeout for the HTTP request, in milliseconds.", - "default": 60000 - }, - "request": { - "type": "object", - "additionalProperties": false, - "properties": { - "headers": { - "description": "Headers to include in the HTTP request.", - "default": {}, - "anyOf": [ - { - "title": "Request headers (object)", - "description": "Headers to include in the HTTP request, in key/value format.", - "type": "object", - "additionalProperties": true, - "properties": {} - }, - { - "title": "Request headers (string)", - "description": "Headers to include in the HTTP request, as return-separated values. For example, `Content-Type: application/json\nAuthorization: Bearer token`.", - "type": "string" - } - ] - }, - "parameters": { - "description": "URL parameters to include in the HTTP request, in key/value format.", - "type": "object", - "additionalProperties": true, - "default": {}, - "properties": {}, - "title": "Request parameters" - }, - "body": { - "description": "The body of the HTTP request.", - "anyOf": [ - { - "title": "Request body (object)", - "description": "JSON object to include as the body of the HTTP request.", - "type": "object", - "additionalProperties": true, - "properties": {} - }, - { - "title": "Request body (array)", - "description": "JSON array to include as the body of the HTTP request.", - "type": "array", - "items": {} - }, - { - "title": "Request body (string)", - "description": "String to include as the body of the HTTP request.", - "type": "string" - } - ], - "default": {} - } - }, - "title": "Request" - }, - "response": { - "type": "object", - "additionalProperties": false, - "properties": { - "headers": { - "description": "Headers expected in the response, in key/value format. If one or more `responseHeaders` entries aren't present in the response, the step fails.", - "type": "object", - "additionalProperties": true, - "properties": {}, - "default": {}, - "title": "Response headers" - }, - "body": { - "description": "JSON object expected in the response. If one or more key/value pairs aren't present in the response, the step fails.", - "anyOf": [ - { - "type": "object", - "additionalProperties": true, - "properties": {}, - "title": "Response body object", - "description": "JSON key/value pairs expected in the response." - }, - { - "title": "Response body array", - "description": "JSON array expected in the response.", - "type": "array", - "items": {} - }, - { - "title": "Response body string", - "description": "String expected in the response.", - "type": "string" - } - ], - "default": {} - }, - "required": { - "type": "array", - "description": "Array of field paths that must exist in the response body. Uses dot notation for nested fields (e.g., 'user.name') and bracket notation for array indices (e.g., 'items[0].id'). Fields must be present but may have any value including null.", - "items": { - "type": "string" - }, - "default": [] - } - }, - "title": "Response" - }, - "allowAdditionalFields": { - "type": "boolean", - "description": "If `false`, the step fails when the response data contains fields not specified in the response body.", - "default": true - }, - "path": { - "type": "string", - "description": "File path to save the command's output, relative to `directory`. Specify a file extension that matches the expected response type, such as `.json` for JSON content or `.txt` for strings." - }, - "directory": { - "type": "string", - "description": "Directory to save the command's output. If the directory doesn't exist, creates the directory. If not specified, the directory is your media directory." - }, - "maxVariation": { - "type": "number", - "description": "Allowed variation in percentage of text different between the current output and previously saved output. If the difference between the current output and the previous output is greater than `maxVariation`, the step fails. If output doesn't exist at `path`, this value is ignored.", - "default": 0, - "minimum": 0, - "maximum": 1 - }, - "overwrite": { - "type": "string", - "description": "If `true`, overwrites the existing output at `path` if it exists.\nIf `aboveVariation`, overwrites the existing output at `path` if the difference between the new output and the existing output is greater than `maxVariation`.", - "enum": [ - "true", - "false", - "aboveVariation" - ], - "default": "aboveVariation" - } - } - } - ], - "components": { - "schemas": { - "url": { - "title": "HTTP request (simple)", - "type": "string", - "description": "URL for the HTTP request.", - "pattern": "(^(http://|https://).*|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - "object": { - "title": "HTTP request (detailed)", - "type": "object", - "anyOf": [ - { - "required": [ - "url" - ] - }, - { - "required": [ - "openApi" - ] - } - ], - "additionalProperties": false, - "properties": { - "url": { - "title": "HTTP request (simple)", - "type": "string", - "description": "URL for the HTTP request.", - "pattern": "(^(http://|https://).*|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - "openApi": { - "anyOf": [ - { - "allOf": [ - { - "type": "string", - "description": "ID of the operation to use for the request." - }, - { - "title": "Operation ID", - "description": "Operation ID from the OpenAPI schema. Only valid if the OpenAPI description path is specified elsewhere and the operation ID is unique among all specified OpenAPI descriptions." - } - ] - }, - { - "allOf": [ - { - "version": "1.0.0", - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "openApi", - "type": "object", - "description": "OpenAPI description and configuration.", - "additionalProperties": false, - "anyOf": [ - { - "required": [ - "descriptionPath" - ] - }, - { - "required": [ - "operationId" - ] - } - ], - "properties": { - "name": { - "type": "string", - "description": "Name of the OpenAPI description, as defined in your configuration." - }, - "descriptionPath": { - "type": "string", - "description": "URL or local path to the OpenAPI description." - }, - "definition": { - "type": "object", - "readOnly": true, - "description": "OpenAPI definition object loaded from the `descriptionPath`. This is a resolved version of the OpenAPI description and should not be user-defined.", - "additionalProperties": true, - "title": "OpenAPI definition" - }, - "operationId": { - "type": "string", - "description": "ID of the operation to use for the request." - }, - "server": { - "type": "string", - "description": "Server to use for example requests. Only valid if `useExample` is `request` or `both`. If not specified but an example is used for the request, uses the first server defined in the OpenAPI description." - }, - "validateAgainstSchema": { - "type": "string", - "description": "Validates the request and/or response against the schema in the OpenAPI description. If the request or response doesn't match the schema, the step fails.", - "enum": [ - "request", - "response", - "both", - "none" - ], - "default": "both" - }, - "mockResponse": { - "type": "boolean", - "description": "If `true`, doesn't make the HTTP request, but instead uses the response example or schema from the OpenAPI description as the response data. Useful for creating tests when an API isn't fully implemented yet. If `statusCode` isn't specified, uses the first defined response code." - }, - "statusCode": { - "type": "integer", - "description": "Response code to use for validation, examples, and status code checking. If the response code doesn't match, the step fails. `statusCodes` overrides this value when specified." - }, - "useExample": { - "type": [ - "string" - ], - "description": "Uses the example from the OpenAPI description as the request and response data. If the request or response has multiple examples, specify `exampleKey`. If `statusCode` isn't specified, uses the first defined response code. `requestData`, `requestParams`, and `requestHeaders` override portions of request examples when specified. `responseData` overrides portions of response examples when specified.", - "enum": [ - "request", - "response", - "both", - "none" - ], - "default": "none" - }, - "exampleKey": { - "type": "string", - "description": "Key of the example to use from the `examples` property in the OpenAPI description. If an `examples` key isn't specified or isn't available for a given parameter or object, the `example` property value is used.", - "default": "" - }, - "headers": { - "type": "object", - "description": "Request headers to add to requests. For example, to set `Authorization` headers for all requests from the specified OpenAPI document. If specified in both a config and a step, the step value overrides the config value.", - "additionalProperties": { - "type": "string" - }, - "title": "OpenAPI request headers" - } - }, - "components": { - "schemas": { - "operationId": { - "type": "string", - "description": "ID of the operation to use for the request." - }, - "descriptionPath": { - "type": "string", - "description": "URL or local path to the OpenAPI description." - } - } - }, - "examples": [ - { - "descriptionPath": "https://petstore.swagger.io/v2/swagger.json" - }, - { - "name": "Reqres", - "operationId": "getUserById" - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "getUserById" - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both" - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both", - "exampleKey": "example1" - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both", - "exampleKey": "example1", - "statusCode": 201 - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both", - "exampleKey": "example1", - "statusCode": 201, - "validateAgainstSchema": "none" - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both", - "exampleKey": "example1", - "statusCode": 201, - "validateAgainstSchema": "none", - "mockResponse": true - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both", - "exampleKey": "example1", - "statusCode": 201, - "validateAgainstSchema": "none", - "mockResponse": true, - "headers": { - "Authorization": "Bearer 12345" - } - } - ] - }, - { - "type": "object", - "required": [ - "operationId" - ], - "title": "OpenAPI definition (httpRequest)" - } - ] - } - ] - }, - "statusCodes": { - "description": "Accepted status codes. If the specified URL returns a code other than what is specified here, the action fails.", - "type": "array", - "items": { - "anyOf": [ - { - "type": "integer" - } - ] - }, - "default": [ - 200, - 201 - ] - }, - "method": { - "type": "string", - "description": "Method of the HTTP request", - "enum": [ - "get", - "put", - "post", - "patch", - "delete" - ], - "transform": [ - "trim", - "toEnumCase" - ], - "default": "get" - }, - "timeout": { - "type": "integer", - "description": "Timeout for the HTTP request, in milliseconds.", - "default": 60000 - }, - "request": { - "type": "object", - "additionalProperties": false, - "properties": { - "headers": { - "description": "Headers to include in the HTTP request.", - "default": {}, - "anyOf": [ - { - "title": "Request headers (object)", - "description": "Headers to include in the HTTP request, in key/value format.", - "type": "object", - "additionalProperties": true, - "properties": {} - }, - { - "title": "Request headers (string)", - "description": "Headers to include in the HTTP request, as return-separated values. For example, `Content-Type: application/json\nAuthorization: Bearer token`.", - "type": "string" - } - ] - }, - "parameters": { - "description": "URL parameters to include in the HTTP request, in key/value format.", - "type": "object", - "additionalProperties": true, - "default": {}, - "properties": {}, - "title": "Request parameters" - }, - "body": { - "description": "The body of the HTTP request.", - "anyOf": [ - { - "title": "Request body (object)", - "description": "JSON object to include as the body of the HTTP request.", - "type": "object", - "additionalProperties": true, - "properties": {} - }, - { - "title": "Request body (array)", - "description": "JSON array to include as the body of the HTTP request.", - "type": "array", - "items": {} - }, - { - "title": "Request body (string)", - "description": "String to include as the body of the HTTP request.", - "type": "string" - } - ], - "default": {} - } - }, - "title": "Request" - }, - "response": { - "type": "object", - "additionalProperties": false, - "properties": { - "headers": { - "description": "Headers expected in the response, in key/value format. If one or more `responseHeaders` entries aren't present in the response, the step fails.", - "type": "object", - "additionalProperties": true, - "properties": {}, - "default": {}, - "title": "Response headers" - }, - "body": { - "description": "JSON object expected in the response. If one or more key/value pairs aren't present in the response, the step fails.", - "anyOf": [ - { - "type": "object", - "additionalProperties": true, - "properties": {}, - "title": "Response body object", - "description": "JSON key/value pairs expected in the response." - }, - { - "title": "Response body array", - "description": "JSON array expected in the response.", - "type": "array", - "items": {} - }, - { - "title": "Response body string", - "description": "String expected in the response.", - "type": "string" - } - ], - "default": {} - }, - "required": { - "type": "array", - "description": "Array of field paths that must exist in the response body. Uses dot notation for nested fields (e.g., 'user.name') and bracket notation for array indices (e.g., 'items[0].id'). Fields must be present but may have any value including null.", - "items": { - "type": "string" - }, - "default": [] - } - }, - "title": "Response" - }, - "allowAdditionalFields": { - "type": "boolean", - "description": "If `false`, the step fails when the response data contains fields not specified in the response body.", - "default": true - }, - "path": { - "type": "string", - "description": "File path to save the command's output, relative to `directory`. Specify a file extension that matches the expected response type, such as `.json` for JSON content or `.txt` for strings." - }, - "directory": { - "type": "string", - "description": "Directory to save the command's output. If the directory doesn't exist, creates the directory. If not specified, the directory is your media directory." - }, - "maxVariation": { - "type": "number", - "description": "Allowed variation in percentage of text different between the current output and previously saved output. If the difference between the current output and the previous output is greater than `maxVariation`, the step fails. If output doesn't exist at `path`, this value is ignored.", - "default": 0, - "minimum": 0, - "maximum": 1 - }, - "overwrite": { - "type": "string", - "description": "If `true`, overwrites the existing output at `path` if it exists.\nIf `aboveVariation`, overwrites the existing output at `path` if the difference between the new output and the existing output is greater than `maxVariation`.", - "enum": [ - "true", - "false", - "aboveVariation" - ], - "default": "aboveVariation" - } - } - } - } - }, - "examples": [ - "https://reqres.in/api/users", - { - "url": "https://reqres.in/api/users" - }, - { - "url": "https://reqres.in/api/users/2", - "method": "put", - "request": { - "body": { - "name": "morpheus", - "job": "zion resident" - } - } - }, - { - "url": "https://reqres.in/api/users", - "method": "post", - "request": { - "body": { - "name": "morpheus", - "job": "leader" - } - }, - "response": { - "body": { - "name": "morpheus", - "job": "leader" - } - }, - "statusCodes": [ - 200, - 201 - ] - }, - { - "url": "https://www.api-server.com", - "method": "post", - "timeout": 30000, - "request": { - "body": { - "field": "value" - }, - "headers": { - "header": "value" - }, - "parameters": { - "param": "value" - } - }, - "response": { - "body": { - "field": "value" - }, - "headers": { - "header": "value" - } - }, - "statusCodes": [ - 200 - ] - }, - { - "url": "https://reqres.in/api/users", - "method": "post", - "request": { - "body": { - "name": "morpheus", - "job": "leader" - } - }, - "response": { - "body": { - "name": "morpheus", - "job": "leader" - } - }, - "statusCodes": [ - 200, - 201 - ], - "path": "response.json", - "directory": "media", - "maxVariation": 0.05, - "overwrite": "aboveVariation" - }, - { - "openApi": "getUserById" - }, - { - "openApi": { - "name": "Reqres", - "operationId": "getUserById" - }, - "request": { - "parameters": { - "id": 123 - } - } - }, - { - "openApi": { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "getUserById" - }, - "request": { - "parameters": { - "id": 123 - } - } - }, - { - "openApi": { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both" - } - }, - { - "openApi": { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "updateUser", - "useExample": "request", - "exampleKey": "acme" - } - }, - { - "openApi": { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "updateUser", - "useExample": "request", - "exampleKey": "acme", - "headers": { - "Authorization": "Bearer $TOKEN" - } - } - }, - { - "url": "https://www.api-server.com", - "method": "post", - "request": { - "headers": "Content-Type: application/json\\nAuthorization: Bearer token" - } - }, - { - "url": "https://api.example.com/users/123", - "response": { - "required": [ - "id", - "email", - "createdAt" - ] - } - }, - { - "url": "https://api.example.com/users/123", - "response": { - "required": [ - "user.profile.name", - "user.profile.avatar", - "user.settings.notifications" - ] - } - }, - { - "url": "https://api.example.com/orders", - "response": { - "required": [ - "orders[0].id", - "orders[0].total", - "orders[0].items[0].productId" - ] - } - }, - { - "url": "https://api.example.com/users", - "response": { - "required": [ - "sessionToken", - "expiresAt", - "user.id" - ], - "body": { - "status": "success", - "user": { - "role": "admin" - } - } - } - } - ] - } - }, - "title": "httpRequest" - } - ] - }, - { - "allOf": [ - { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { - "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - }, - "title": "Common" - }, - { - "type": "object", - "required": [ - "runShell" - ], - "properties": { - "runShell": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "runShell", - "description": "Perform a native shell command.", - "anyOf": [ - { - "title": "Run shell command (simple)", - "description": "Command to perform in the machine's default shell.", - "type": "string", - "transform": [ - "trim" - ] - }, - { - "type": "object", - "required": [ - "command" - ], - "additionalProperties": false, - "properties": { - "command": { - "type": "string", - "description": "Command to perform in the machine's default shell." - }, - "args": { - "type": "array", - "description": "Arguments for the command.", - "items": { - "anyOf": [ - { - "type": "string" - } - ] - }, - "default": [] - }, - "workingDirectory": { - "type": "string", - "description": "Working directory for the command.", - "default": "." - }, - "exitCodes": { - "type": "array", - "description": "Expected exit codes of the command. If the command's actual exit code isn't in this list, the step fails.", - "items": { - "anyOf": [ - { - "type": "integer" - } - ] - }, - "default": [ - 0 - ] - }, - "stdio": { - "type": "string", - "description": "Content expected in the command's stdout or stderr. If the expected content can't be found in the command's stdout or stderr, the step fails. Supports strings and regular expressions. To use a regular expression, the string must start and end with a forward slash, like in `/^hello-world.*/`." - }, - "path": { - "type": "string", - "description": "File path to save the command's output, relative to `directory`." - }, - "directory": { - "type": "string", - "description": "Directory to save the command's output. If the directory doesn't exist, creates the directory. If not specified, the directory is your media directory." - }, - "maxVariation": { - "type": "number", - "description": "Allowed variation in percentage of text different between the current output and previously saved output. If the difference between the current output and the previous output is greater than `maxVariation`, the step fails. If output doesn't exist at `path`, this value is ignored.", - "default": 0, - "minimum": 0, - "maximum": 1 - }, - "overwrite": { - "type": "string", - "description": "If `true`, overwrites the existing output at `path` if it exists.\nIf `aboveVariation`, overwrites the existing output at `path` if the difference between the new output and the existing output is greater than `maxVariation`.", - "enum": [ - "true", - "false", - "aboveVariation" - ], - "default": "aboveVariation" - }, - "timeout": { - "type": "integer", - "description": "Max time in milliseconds the command is allowed to run. If the command runs longer than this, the step fails.", - "default": 60000 - } - }, - "title": "Run shell command (detailed)" - } - ], - "components": { - "schemas": { - "string": { - "title": "Run shell command (simple)", - "description": "Command to perform in the machine's default shell.", - "type": "string", - "transform": [ - "trim" - ] - }, - "object": { - "type": "object", - "required": [ - "command" - ], - "additionalProperties": false, - "properties": { - "command": { - "type": "string", - "description": "Command to perform in the machine's default shell." - }, - "args": { - "type": "array", - "description": "Arguments for the command.", - "items": { - "anyOf": [ - { - "type": "string" - } - ] - }, - "default": [] - }, - "workingDirectory": { - "type": "string", - "description": "Working directory for the command.", - "default": "." - }, - "exitCodes": { - "type": "array", - "description": "Expected exit codes of the command. If the command's actual exit code isn't in this list, the step fails.", - "items": { - "anyOf": [ - { - "type": "integer" - } - ] - }, - "default": [ - 0 - ] - }, - "stdio": { - "type": "string", - "description": "Content expected in the command's stdout or stderr. If the expected content can't be found in the command's stdout or stderr, the step fails. Supports strings and regular expressions. To use a regular expression, the string must start and end with a forward slash, like in `/^hello-world.*/`." - }, - "path": { - "type": "string", - "description": "File path to save the command's output, relative to `directory`." - }, - "directory": { - "type": "string", - "description": "Directory to save the command's output. If the directory doesn't exist, creates the directory. If not specified, the directory is your media directory." - }, - "maxVariation": { - "type": "number", - "description": "Allowed variation in percentage of text different between the current output and previously saved output. If the difference between the current output and the previous output is greater than `maxVariation`, the step fails. If output doesn't exist at `path`, this value is ignored.", - "default": 0, - "minimum": 0, - "maximum": 1 - }, - "overwrite": { - "type": "string", - "description": "If `true`, overwrites the existing output at `path` if it exists.\nIf `aboveVariation`, overwrites the existing output at `path` if the difference between the new output and the existing output is greater than `maxVariation`.", - "enum": [ - "true", - "false", - "aboveVariation" - ], - "default": "aboveVariation" - }, - "timeout": { - "type": "integer", - "description": "Max time in milliseconds the command is allowed to run. If the command runs longer than this, the step fails.", - "default": 60000 - } - }, - "title": "Run shell command (detailed)" - } - } - }, - "examples": [ - "docker run hello-world", - { - "command": "echo", - "args": [ - "$USER" - ] - }, - { - "command": "echo", - "args": [ - "hello-world" - ] - }, - { - "command": "docker run hello-world", - "timeout": 20000, - "exitCodes": [ - 0 - ], - "stdio": "Hello from Docker!" - }, - { - "command": "false", - "exitCodes": [ - 1 - ] - }, - { - "command": "echo", - "args": [ - "setup" - ], - "exitCodes": [ - 0 - ], - "stdio": "/.*?/" - }, - { - "command": "docker run hello-world", - "workingDirectory": ".", - "exitCodes": [ - 0 - ], - "stdio": "Hello from Docker!", - "path": "docker-output.txt", - "directory": "output", - "maxVariation": 0.1, - "overwrite": "aboveVariation" - } - ] - } - }, - "title": "runShell" - } - ] - }, - { - "allOf": [ - { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { - "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - }, - "title": "Common" - }, - { - "type": "object", - "required": [ - "runCode" - ], - "properties": { - "runCode": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "runCode", - "description": "Assemble and run code.", - "anyOf": [ - { - "type": "object", - "required": [ - "code", - "language" - ], - "properties": { - "language": { - "type": "string", - "description": "Language of the code to run.", - "enum": [ - "python", - "bash", - "javascript" - ] - }, - "code": { - "description": "Code to run.", - "type": "string" - }, - "args": { - "type": "array", - "description": "Arguments for the command.", - "items": { - "anyOf": [ - { - "type": "string" - } - ] - }, - "default": [] - }, - "workingDirectory": { - "type": "string", - "description": "Working directory for the command.", - "default": "." - }, - "exitCodes": { - "type": "array", - "description": "Expected exit codes of the command. If the command's actual exit code isn't in this list, the step fails.", - "items": { - "anyOf": [ - { - "type": "integer" - } - ] - }, - "default": [ - 0 - ] - }, - "stdio": { - "type": "string", - "description": "Content expected in the command's output. If the expected content can't be found in the command's output (either stdout or stderr), the step fails. Supports strings and regular expressions. To use a regular expression, the string must start and end with a forward slash, like in `/^hello-world.*/`." - }, - "path": { - "type": "string", - "description": "File path to save the command's output, relative to `directory`." - }, - "directory": { - "type": "string", - "description": "Directory to save the command's output. If the directory doesn't exist, creates the directory. If not specified, the directory is your media directory." - }, - "maxVariation": { - "type": "number", - "description": "Allowed variation in percentage of text different between the current output and previously saved output. If the difference between the current output and the previous output is greater than `maxVariation`, the step fails. If output doesn't exist at `path`, this value is ignored.", - "default": 0, - "minimum": 0, - "maximum": 1 - }, - "overwrite": { - "type": "string", - "description": "If `true`, overwrites the existing output at `path` if it exists.\nIf `aboveVariation`, overwrites the existing output at `path` if the difference between the new output and the existing output is greater than `maxVariation`.", - "enum": [ - "true", - "false", - "aboveVariation" - ], - "default": "aboveVariation" - }, - "timeout": { - "type": "integer", - "description": "Max time in milliseconds the command is allowed to run. If the command runs longer than this, the step fails.", - "default": 60000 - } - }, - "title": "Run code (detailed)" - } - ], - "components": { - "schemas": { - "object": { - "type": "object", - "required": [ - "code", - "language" - ], - "properties": { - "language": { - "type": "string", - "description": "Language of the code to run.", - "enum": [ - "python", - "bash", - "javascript" - ] - }, - "code": { - "description": "Code to run.", - "type": "string" - }, - "args": { - "type": "array", - "description": "Arguments for the command.", - "items": { - "anyOf": [ - { - "type": "string" - } - ] - }, - "default": [] - }, - "workingDirectory": { - "type": "string", - "description": "Working directory for the command.", - "default": "." - }, - "exitCodes": { - "type": "array", - "description": "Expected exit codes of the command. If the command's actual exit code isn't in this list, the step fails.", - "items": { - "anyOf": [ - { - "type": "integer" - } - ] - }, - "default": [ - 0 - ] - }, - "stdio": { - "type": "string", - "description": "Content expected in the command's output. If the expected content can't be found in the command's output (either stdout or stderr), the step fails. Supports strings and regular expressions. To use a regular expression, the string must start and end with a forward slash, like in `/^hello-world.*/`." - }, - "path": { - "type": "string", - "description": "File path to save the command's output, relative to `directory`." - }, - "directory": { - "type": "string", - "description": "Directory to save the command's output. If the directory doesn't exist, creates the directory. If not specified, the directory is your media directory." - }, - "maxVariation": { - "type": "number", - "description": "Allowed variation in percentage of text different between the current output and previously saved output. If the difference between the current output and the previous output is greater than `maxVariation`, the step fails. If output doesn't exist at `path`, this value is ignored.", - "default": 0, - "minimum": 0, - "maximum": 1 - }, - "overwrite": { - "type": "string", - "description": "If `true`, overwrites the existing output at `path` if it exists.\nIf `aboveVariation`, overwrites the existing output at `path` if the difference between the new output and the existing output is greater than `maxVariation`.", - "enum": [ - "true", - "false", - "aboveVariation" - ], - "default": "aboveVariation" - }, - "timeout": { - "type": "integer", - "description": "Max time in milliseconds the command is allowed to run. If the command runs longer than this, the step fails.", - "default": 60000 - } - }, - "title": "Run code (detailed)" - } - } - }, - "examples": [ - { - "language": "javascript", - "code": "console.log('Hello, ${process.env.USER}!');" - }, - { - "language": "bash", - "code": "docker run hello-world", - "timeout": 20000, - "exitCodes": [ - 0 - ], - "stdio": "Hello from Docker!" - }, - { - "language": "javascript", - "code": "return false", - "exitCodes": [ - 1 - ] - }, - { - "language": "python", - "code": "print('Hello from Python')", - "workingDirectory": ".", - "exitCodes": [ - 0 - ], - "stdio": "Hello from Python!", - "path": "python-output.txt", - "directory": "output", - "maxVariation": 0.1, - "overwrite": "aboveVariation" - } - ] - } - }, - "title": "runCode" - } - ] - }, - { - "allOf": [ - { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { - "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - }, - "title": "Common" - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "typeKeys", - "description": "Type keys. To type special keys, begin and end the string with `$` and use the special key's keyword. For example, to type the Escape key, enter `$ESCAPE$`.", - "anyOf": [ - { - "title": "Type keys (simple)", - "description": "Sequence of keys to enter.", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - } - ] - } - } - ] - }, - { - "title": "Type keys (detailed)", - "type": "object", - "properties": { - "keys": { - "title": "Type keys (simple)", - "description": "Sequence of keys to enter.", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - } - ] - } - } - ] - }, - "inputDelay": { - "type": "number", - "description": "Delay in milliseconds between each key press during a recording", - "default": 100 - }, - "selector": { - "type": "string", - "description": "Selector for the element to type into. If not specified, the typing occurs in the active element." - }, - "elementText": { - "type": "string", - "description": "Display text of the element to type into. If combined with other element finding fields, the element must match all specified criteria." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - } - }, - "required": [ - "keys" - ], - "additionalProperties": false - } - ], - "components": { - "schemas": { - "keys": { - "title": "Type keys (simple)", - "description": "Sequence of keys to enter.", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - } - ] - } - } - ] - }, - "object": { - "title": "Type keys (detailed)", - "type": "object", - "properties": { - "keys": { - "title": "Type keys (simple)", - "description": "Sequence of keys to enter.", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - } - ] - } - } - ] - }, - "inputDelay": { - "type": "number", - "description": "Delay in milliseconds between each key press during a recording", - "default": 100 - }, - "selector": { - "type": "string", - "description": "Selector for the element to type into. If not specified, the typing occurs in the active element." - }, - "elementText": { - "type": "string", - "description": "Display text of the element to type into. If combined with other element finding fields, the element must match all specified criteria." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - } - }, - "required": [ - "keys" - ], - "additionalProperties": false - } - } - }, - "examples": [ - "kittens", - [ - "$ENTER$" - ], - [ - "kittens", - "$ENTER$" - ], - { - "keys": "kittens" - }, - { - "keys": [ - "$ENTER$" - ] - }, - { - "keys": [ - "kittens", - "$ENTER$" - ], - "inputDelay": 500 - } - ] - } - }, - "title": "type" - } - ] - }, - { - "allOf": [ - { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { - "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - }, - "title": "Common" - }, - { - "type": "object", - "required": [ - "screenshot" - ], - "properties": { - "screenshot": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "screenshot", - "description": "Takes a screenshot in PNG format.", - "anyOf": [ - { - "title": "Screenshot (simple)", - "description": "File path of the PNG file. Accepts absolute paths. If not specified, the file name is the ID of the step.", - "type": "string", - "pattern": "([A-Za-z0-9_-]*\\.(png|PNG)$|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - { - "type": "object", - "additionalProperties": false, - "properties": { - "path": { - "title": "Screenshot (simple)", - "description": "File path of the PNG file. Accepts absolute paths. If not specified, the file name is the ID of the step.", - "type": "string", - "pattern": "([A-Za-z0-9_-]*\\.(png|PNG)$|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - "directory": { - "type": "string", - "description": "Directory of the PNG file. If the directory doesn't exist, creates the directory.", - "transform": [ - "trim" - ] - }, - "maxVariation": { - "type": "number", - "description": "Allowed variation in percentage of pixels between the new screenshot and the existing screenshot at `path`. If the difference between the new screenshot and the existing screenshot is greater than `maxVariation`, the step fails. If a screenshot doesn't exist at `path`, this value is ignored.", - "default": 0.05, - "minimum": 0, - "maximum": 1 - }, - "overwrite": { - "type": "string", - "description": "If `true`, overwrites the existing screenshot at `path` if it exists.\nIf `aboveVariation`, overwrites the existing screenshot at `path` if the difference between the new screenshot and the existing screenshot is greater than `maxVariation`.", - "enum": [ - "true", - "false", - "aboveVariation" - ], - "default": "aboveVariation" - }, - "crop": { - "anyOf": [ - { - "title": "Crop by element (simple)", - "type": "string", - "description": "Display text or selector of the element to screenshot." - }, - { - "title": "Crop by element (detailed)", - "type": "object", - "description": "Crop the screenshot to a specific element.", - "additionalProperties": false, - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "properties": { - "elementText": { - "type": "string", - "description": "Display text of the element to screenshot." - }, - "selector": { - "type": "string", - "description": "Selector of the element to screenshot." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - }, - "padding": { - "anyOf": [ - { - "title": "Padding (simple)", - "type": "number", - "description": "Padding in pixels to add to the bounds of the element.", - "minimum": 0 - }, - { - "type": "object", - "additionalProperties": false, - "properties": { - "top": { - "type": "number", - "minimum": 0 - }, - "right": { - "type": "number", - "minimum": 0 - }, - "bottom": { - "type": "number", - "minimum": 0 - }, - "left": { - "type": "number", - "minimum": 0 - } - }, - "title": "Padding (detailed)", - "description": "Padding in pixels to add to the bounds of the element." - } - ] - } - } - } - ] - }, - "annotations": { - "type": "array", - "description": "Array of annotations to add to the screenshot.", - "items": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "annotation", - "type": "object", - "description": "A visual annotation to add to the screenshot. Annotations can point to elements on the page (via `find`) or be positioned freely within the viewport.", - "anyOf": [ - { - "required": [ - "arrow" - ], - "not": { - "required": [ - "text", - "rectangle", - "circle", - "line", - "callout", - "highlight", - "blur" - ] - } - }, - { - "required": [ - "text" - ], - "not": { - "required": [ - "arrow", - "rectangle", - "circle", - "line", - "callout", - "highlight", - "blur" - ] - } - }, - { - "required": [ - "rectangle" - ], - "not": { - "required": [ - "arrow", - "text", - "circle", - "line", - "callout", - "highlight", - "blur" - ] - } - }, - { - "required": [ - "circle" - ], - "not": { - "required": [ - "arrow", - "text", - "rectangle", - "line", - "callout", - "highlight", - "blur" - ] - } - }, - { - "required": [ - "line" - ], - "not": { - "required": [ - "arrow", - "text", - "rectangle", - "circle", - "callout", - "highlight", - "blur" - ] - } - }, - { - "required": [ - "callout" - ], - "not": { - "required": [ - "arrow", - "text", - "rectangle", - "circle", - "line", - "highlight", - "blur" - ] - } - }, - { - "required": [ - "highlight" - ], - "not": { - "required": [ - "arrow", - "text", - "rectangle", - "circle", - "line", - "callout", - "blur" - ] - } - }, - { - "required": [ - "blur" - ], - "not": { - "required": [ - "arrow", - "text", - "rectangle", - "circle", - "line", - "callout", - "highlight" - ] - } - } - ], - "properties": { - "find": { - "type": "object", - "description": "Element on the page to annotate.", - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "additionalProperties": false, - "properties": { - "selector": { - "type": "string", - "description": "Selector of the element to annotate." - }, - "elementText": { - "type": "string", - "description": "Display text of the element to annotate." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - } - } - }, - "position": { - "anyOf": [ - { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - { - "type": "string", - "enum": [ - "top", - "bottom", - "left", - "right", - "center", - "top-left", - "top-right", - "bottom-left", - "bottom-right" - ], - "description": "Position relative to the element (if `find` is provided) or to the viewport." - } - ] - }, - "arrow": { - "type": "object", - "description": "Configuration for arrow annotations.", - "properties": { - "from": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "to": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "color": { - "type": "string", - "description": "Color of the arrow (hex, rgb, or named color).", - "default": "#FF0000" - }, - "strokeWidth": { - "type": "number", - "description": "Width of the arrow line in pixels.", - "minimum": 1, - "default": 3 - }, - "headSize": { - "type": "number", - "description": "Size of the arrowhead in pixels.", - "minimum": 1, - "default": 15 - } - } - }, - "text": { - "type": "object", - "description": "Configuration for text annotations.", - "properties": { - "content": { - "type": "string", - "description": "Text content to display." - }, - "fontSize": { - "type": "number", - "description": "Font size in pixels.", - "minimum": 1, - "default": 16 - }, - "fontFamily": { - "type": "string", - "description": "Font family name.", - "default": "Arial" - }, - "color": { - "type": "string", - "description": "Text color (hex, rgb, or named color).", - "default": "#000000" - }, - "backgroundColor": { - "type": "string", - "description": "Background color for the text box.", - "default": "#FFFFFF" - }, - "padding": { - "anyOf": [ - { - "type": "number", - "description": "Padding in pixels on all sides.", - "minimum": 0 - }, - { - "type": "object", - "additionalProperties": false, - "properties": { - "top": { - "type": "number", - "minimum": 0 - }, - "right": { - "type": "number", - "minimum": 0 - }, - "bottom": { - "type": "number", - "minimum": 0 - }, - "left": { - "type": "number", - "minimum": 0 - } - } - } - ], - "default": 5 - }, - "maxWidth": { - "type": "number", - "description": "Maximum width of the text box. Text will wrap.", - "minimum": 1 - }, - "opacity": { - "type": "number", - "description": "Opacity of the text and background (0-1).", - "minimum": 0, - "maximum": 1, - "default": 1 - } - }, - "required": [ - "content" - ] - }, - "rectangle": { - "type": "object", - "description": "Configuration for rectangle annotations.", - "properties": { - "width": { - "type": "number", - "description": "Width of the rectangle in pixels.", - "minimum": 1 - }, - "height": { - "type": "number", - "description": "Height of the rectangle in pixels.", - "minimum": 1 - }, - "fill": { - "type": "string", - "description": "Fill color (hex, rgb, or named color). Use 'transparent' for no fill.", - "default": "transparent" - }, - "stroke": { - "type": "string", - "description": "Border color (hex, rgb, or named color).", - "default": "#FF0000" - }, - "strokeWidth": { - "type": "number", - "description": "Border width in pixels.", - "minimum": 0, - "default": 2 - }, - "opacity": { - "type": "number", - "description": "Opacity (0-1).", - "minimum": 0, - "maximum": 1, - "default": 1 - }, - "rx": { - "type": "number", - "description": "Horizontal corner radius for rounded rectangles.", - "minimum": 0, - "default": 0 - }, - "ry": { - "type": "number", - "description": "Vertical corner radius for rounded rectangles.", - "minimum": 0, - "default": 0 - } - } - }, - "circle": { - "type": "object", - "description": "Configuration for circle annotations.", - "properties": { - "radius": { - "type": "number", - "description": "Radius of the circle in pixels.", - "minimum": 1, - "default": 30 - }, - "fill": { - "type": "string", - "description": "Fill color (hex, rgb, or named color). Use 'transparent' for no fill.", - "default": "transparent" - }, - "stroke": { - "type": "string", - "description": "Border color (hex, rgb, or named color).", - "default": "#FF0000" - }, - "strokeWidth": { - "type": "number", - "description": "Border width in pixels.", - "minimum": 0, - "default": 2 - }, - "opacity": { - "type": "number", - "description": "Opacity (0-1).", - "minimum": 0, - "maximum": 1, - "default": 1 - } - } - }, - "line": { - "type": "object", - "description": "Configuration for line annotations.", - "properties": { - "from": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "to": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "color": { - "type": "string", - "description": "Color of the line (hex, rgb, or named color).", - "default": "#000000" - }, - "strokeWidth": { - "type": "number", - "description": "Width of the line in pixels.", - "minimum": 1, - "default": 2 - }, - "dashArray": { - "type": "array", - "description": "Dash pattern [dash, gap]. E.g., [5, 5] for dashed line.", - "items": { - "type": "number", - "minimum": 0 - } - } - }, - "required": [ - "from", - "to" - ] - }, - "callout": { - "type": "object", - "description": "Configuration for callout annotations (text with arrow).", - "properties": { - "content": { - "type": "string", - "description": "Text content to display." - }, - "target": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "textPosition": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "fontSize": { - "type": "number", - "description": "Font size in pixels.", - "minimum": 1, - "default": 14 - }, - "color": { - "type": "string", - "description": "Text color.", - "default": "#000000" - }, - "backgroundColor": { - "type": "string", - "description": "Background color for the text box.", - "default": "#FFFFCC" - }, - "arrowColor": { - "type": "string", - "description": "Color of the arrow.", - "default": "#000000" - }, - "maxWidth": { - "type": "number", - "description": "Maximum width of the text box.", - "minimum": 1 - } - }, - "required": [ - "content", - "target" - ] - }, - "highlight": { - "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", - "properties": { - "color": { - "type": "string", - "description": "Highlight color (hex, rgb, or named color).", - "default": "#FFFF00" - }, - "opacity": { - "type": "number", - "description": "Opacity (0-1).", - "minimum": 0, - "maximum": 1, - "default": 0.3 - } - } - }, - "blur": { - "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", - "properties": { - "intensity": { - "type": "number", - "description": "Blur intensity level.", - "minimum": 1, - "default": 10 - }, - "width": { - "type": "number", - "description": "Width of the blur area in pixels.", - "minimum": 1 - }, - "height": { - "type": "number", - "description": "Height of the blur area in pixels.", - "minimum": 1 - } - } - } - }, - "components": { - "schemas": { - "arrow_properties": { - "type": "object", - "description": "Configuration for arrow annotations.", - "properties": { - "from": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "to": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "color": { - "type": "string", - "description": "Color of the arrow (hex, rgb, or named color).", - "default": "#FF0000" - }, - "strokeWidth": { - "type": "number", - "description": "Width of the arrow line in pixels.", - "minimum": 1, - "default": 3 - }, - "headSize": { - "type": "number", - "description": "Size of the arrowhead in pixels.", - "minimum": 1, - "default": 15 - } - } - }, - "text_properties": { - "type": "object", - "description": "Configuration for text annotations.", - "properties": { - "content": { - "type": "string", - "description": "Text content to display." - }, - "fontSize": { - "type": "number", - "description": "Font size in pixels.", - "minimum": 1, - "default": 16 - }, - "fontFamily": { - "type": "string", - "description": "Font family name.", - "default": "Arial" - }, - "color": { - "type": "string", - "description": "Text color (hex, rgb, or named color).", - "default": "#000000" - }, - "backgroundColor": { - "type": "string", - "description": "Background color for the text box.", - "default": "#FFFFFF" - }, - "padding": { - "anyOf": [ - { - "type": "number", - "description": "Padding in pixels on all sides.", - "minimum": 0 - }, - { - "type": "object", - "additionalProperties": false, - "properties": { - "top": { - "type": "number", - "minimum": 0 - }, - "right": { - "type": "number", - "minimum": 0 - }, - "bottom": { - "type": "number", - "minimum": 0 - }, - "left": { - "type": "number", - "minimum": 0 - } - } - } - ], - "default": 5 - }, - "maxWidth": { - "type": "number", - "description": "Maximum width of the text box. Text will wrap.", - "minimum": 1 - }, - "opacity": { - "type": "number", - "description": "Opacity of the text and background (0-1).", - "minimum": 0, - "maximum": 1, - "default": 1 - } - }, - "required": [ - "content" - ] - }, - "rectangle_properties": { - "type": "object", - "description": "Configuration for rectangle annotations.", - "properties": { - "width": { - "type": "number", - "description": "Width of the rectangle in pixels.", - "minimum": 1 - }, - "height": { - "type": "number", - "description": "Height of the rectangle in pixels.", - "minimum": 1 - }, - "fill": { - "type": "string", - "description": "Fill color (hex, rgb, or named color). Use 'transparent' for no fill.", - "default": "transparent" - }, - "stroke": { - "type": "string", - "description": "Border color (hex, rgb, or named color).", - "default": "#FF0000" - }, - "strokeWidth": { - "type": "number", - "description": "Border width in pixels.", - "minimum": 0, - "default": 2 - }, - "opacity": { - "type": "number", - "description": "Opacity (0-1).", - "minimum": 0, - "maximum": 1, - "default": 1 - }, - "rx": { - "type": "number", - "description": "Horizontal corner radius for rounded rectangles.", - "minimum": 0, - "default": 0 - }, - "ry": { - "type": "number", - "description": "Vertical corner radius for rounded rectangles.", - "minimum": 0, - "default": 0 - } - } - }, - "circle_properties": { - "type": "object", - "description": "Configuration for circle annotations.", - "properties": { - "radius": { - "type": "number", - "description": "Radius of the circle in pixels.", - "minimum": 1, - "default": 30 - }, - "fill": { - "type": "string", - "description": "Fill color (hex, rgb, or named color). Use 'transparent' for no fill.", - "default": "transparent" - }, - "stroke": { - "type": "string", - "description": "Border color (hex, rgb, or named color).", - "default": "#FF0000" - }, - "strokeWidth": { - "type": "number", - "description": "Border width in pixels.", - "minimum": 0, - "default": 2 - }, - "opacity": { - "type": "number", - "description": "Opacity (0-1).", - "minimum": 0, - "maximum": 1, - "default": 1 - } - } - }, - "line_properties": { - "type": "object", - "description": "Configuration for line annotations.", - "properties": { - "from": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "to": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "color": { - "type": "string", - "description": "Color of the line (hex, rgb, or named color).", - "default": "#000000" - }, - "strokeWidth": { - "type": "number", - "description": "Width of the line in pixels.", - "minimum": 1, - "default": 2 - }, - "dashArray": { - "type": "array", - "description": "Dash pattern [dash, gap]. E.g., [5, 5] for dashed line.", - "items": { - "type": "number", - "minimum": 0 - } - } - }, - "required": [ - "from", - "to" - ] - }, - "callout_properties": { - "type": "object", - "description": "Configuration for callout annotations (text with arrow).", - "properties": { - "content": { - "type": "string", - "description": "Text content to display." - }, - "target": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "textPosition": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "fontSize": { - "type": "number", - "description": "Font size in pixels.", - "minimum": 1, - "default": 14 - }, - "color": { - "type": "string", - "description": "Text color.", - "default": "#000000" - }, - "backgroundColor": { - "type": "string", - "description": "Background color for the text box.", - "default": "#FFFFCC" - }, - "arrowColor": { - "type": "string", - "description": "Color of the arrow.", - "default": "#000000" - }, - "maxWidth": { - "type": "number", - "description": "Maximum width of the text box.", - "minimum": 1 - } - }, - "required": [ - "content", - "target" - ] - }, - "highlight_properties": { - "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", - "properties": { - "color": { - "type": "string", - "description": "Highlight color (hex, rgb, or named color).", - "default": "#FFFF00" - }, - "opacity": { - "type": "number", - "description": "Opacity (0-1).", - "minimum": 0, - "maximum": 1, - "default": 0.3 - } - } - }, - "blur_properties": { - "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", - "properties": { - "intensity": { - "type": "number", - "description": "Blur intensity level.", - "minimum": 1, - "default": 10 - }, - "width": { - "type": "number", - "description": "Width of the blur area in pixels.", - "minimum": 1 - }, - "height": { - "type": "number", - "description": "Height of the blur area in pixels.", - "minimum": 1 - } - } - }, - "point": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "padding": { - "type": "object", - "additionalProperties": false, - "properties": { - "top": { - "type": "number", - "minimum": 0 - }, - "right": { - "type": "number", - "minimum": 0 - }, - "bottom": { - "type": "number", - "minimum": 0 - }, - "left": { - "type": "number", - "minimum": 0 - } - } - } - } - }, - "examples": [ - { - "find": { - "selector": "#submit-button" - }, - "arrow": { - "from": { - "x": 0, - "y": -50 - }, - "to": { - "x": 0, - "y": 0 - }, - "color": "#00FF00", - "strokeWidth": 4, - "headSize": 20 - } - }, - { - "position": "top-right", - "text": { - "content": "Important Notice", - "fontSize": 18, - "color": "#FFFFFF", - "backgroundColor": "#0000FF", - "padding": 10, - "maxWidth": 200, - "opacity": 0.9 - } - }, - { - "find": { - "elementClass": [ - "sensitive-info", - "/^private-/" - ] - }, - "blur": { - "intensity": 15, - "width": 200, - "height": 50 - } - } - ] - } - } - }, - "title": "Capture screenshot (detailed)" - }, - { - "type": "boolean", - "title": "Capture screenshot", - "description": "If `true`, captures a screenshot. If `false`, doesn't capture a screenshot." - } - ], - "components": { - "schemas": { - "path": { - "title": "Screenshot (simple)", - "description": "File path of the PNG file. Accepts absolute paths. If not specified, the file name is the ID of the step.", - "type": "string", - "pattern": "([A-Za-z0-9_-]*\\.(png|PNG)$|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - "object": { - "type": "object", - "additionalProperties": false, - "properties": { - "path": { - "title": "Screenshot (simple)", - "description": "File path of the PNG file. Accepts absolute paths. If not specified, the file name is the ID of the step.", - "type": "string", - "pattern": "([A-Za-z0-9_-]*\\.(png|PNG)$|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - "directory": { - "type": "string", - "description": "Directory of the PNG file. If the directory doesn't exist, creates the directory.", - "transform": [ - "trim" - ] - }, - "maxVariation": { - "type": "number", - "description": "Allowed variation in percentage of pixels between the new screenshot and the existing screenshot at `path`. If the difference between the new screenshot and the existing screenshot is greater than `maxVariation`, the step fails. If a screenshot doesn't exist at `path`, this value is ignored.", - "default": 0.05, - "minimum": 0, - "maximum": 1 - }, - "overwrite": { - "type": "string", - "description": "If `true`, overwrites the existing screenshot at `path` if it exists.\nIf `aboveVariation`, overwrites the existing screenshot at `path` if the difference between the new screenshot and the existing screenshot is greater than `maxVariation`.", - "enum": [ - "true", - "false", - "aboveVariation" - ], - "default": "aboveVariation" - }, - "crop": { - "anyOf": [ - { - "title": "Crop by element (simple)", - "type": "string", - "description": "Display text or selector of the element to screenshot." - }, - { - "title": "Crop by element (detailed)", - "type": "object", - "description": "Crop the screenshot to a specific element.", - "additionalProperties": false, - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "properties": { - "elementText": { - "type": "string", - "description": "Display text of the element to screenshot." - }, - "selector": { - "type": "string", - "description": "Selector of the element to screenshot." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - }, - "padding": { - "anyOf": [ - { - "title": "Padding (simple)", - "type": "number", - "description": "Padding in pixels to add to the bounds of the element.", - "minimum": 0 - }, - { - "type": "object", - "additionalProperties": false, - "properties": { - "top": { - "type": "number", - "minimum": 0 - }, - "right": { - "type": "number", - "minimum": 0 - }, - "bottom": { - "type": "number", - "minimum": 0 - }, - "left": { - "type": "number", - "minimum": 0 - } - }, - "title": "Padding (detailed)", - "description": "Padding in pixels to add to the bounds of the element." - } - ] - } - } - } - ] - }, - "annotations": { - "type": "array", - "description": "Array of annotations to add to the screenshot.", - "items": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "annotation", - "type": "object", - "description": "A visual annotation to add to the screenshot. Annotations can point to elements on the page (via `find`) or be positioned freely within the viewport.", - "anyOf": [ - { - "required": [ - "arrow" - ], - "not": { - "required": [ - "text", - "rectangle", - "circle", - "line", - "callout", - "highlight", - "blur" - ] - } - }, - { - "required": [ - "text" - ], - "not": { - "required": [ - "arrow", - "rectangle", - "circle", - "line", - "callout", - "highlight", - "blur" - ] - } - }, - { - "required": [ - "rectangle" - ], - "not": { - "required": [ - "arrow", - "text", - "circle", - "line", - "callout", - "highlight", - "blur" - ] - } - }, - { - "required": [ - "circle" - ], - "not": { - "required": [ - "arrow", - "text", - "rectangle", - "line", - "callout", - "highlight", - "blur" - ] - } - }, - { - "required": [ - "line" - ], - "not": { - "required": [ - "arrow", - "text", - "rectangle", - "circle", - "callout", - "highlight", - "blur" - ] - } - }, - { - "required": [ - "callout" - ], - "not": { - "required": [ - "arrow", - "text", - "rectangle", - "circle", - "line", - "highlight", - "blur" - ] - } - }, - { - "required": [ - "highlight" - ], - "not": { - "required": [ - "arrow", - "text", - "rectangle", - "circle", - "line", - "callout", - "blur" - ] - } - }, - { - "required": [ - "blur" - ], - "not": { - "required": [ - "arrow", - "text", - "rectangle", - "circle", - "line", - "callout", - "highlight" - ] - } - } - ], - "properties": { - "find": { - "type": "object", - "description": "Element on the page to annotate.", - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "additionalProperties": false, - "properties": { - "selector": { - "type": "string", - "description": "Selector of the element to annotate." - }, - "elementText": { - "type": "string", - "description": "Display text of the element to annotate." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - } - } - }, - "position": { - "anyOf": [ - { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - { - "type": "string", - "enum": [ - "top", - "bottom", - "left", - "right", - "center", - "top-left", - "top-right", - "bottom-left", - "bottom-right" - ], - "description": "Position relative to the element (if `find` is provided) or to the viewport." - } - ] - }, - "arrow": { - "type": "object", - "description": "Configuration for arrow annotations.", - "properties": { - "from": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "to": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "color": { - "type": "string", - "description": "Color of the arrow (hex, rgb, or named color).", - "default": "#FF0000" - }, - "strokeWidth": { - "type": "number", - "description": "Width of the arrow line in pixels.", - "minimum": 1, - "default": 3 - }, - "headSize": { - "type": "number", - "description": "Size of the arrowhead in pixels.", - "minimum": 1, - "default": 15 - } - } - }, - "text": { - "type": "object", - "description": "Configuration for text annotations.", - "properties": { - "content": { - "type": "string", - "description": "Text content to display." - }, - "fontSize": { - "type": "number", - "description": "Font size in pixels.", - "minimum": 1, - "default": 16 - }, - "fontFamily": { - "type": "string", - "description": "Font family name.", - "default": "Arial" - }, - "color": { - "type": "string", - "description": "Text color (hex, rgb, or named color).", - "default": "#000000" - }, - "backgroundColor": { - "type": "string", - "description": "Background color for the text box.", - "default": "#FFFFFF" - }, - "padding": { - "anyOf": [ - { - "type": "number", - "description": "Padding in pixels on all sides.", - "minimum": 0 - }, - { - "type": "object", - "additionalProperties": false, - "properties": { - "top": { - "type": "number", - "minimum": 0 - }, - "right": { - "type": "number", - "minimum": 0 - }, - "bottom": { - "type": "number", - "minimum": 0 - }, - "left": { - "type": "number", - "minimum": 0 - } - } - } - ], - "default": 5 - }, - "maxWidth": { - "type": "number", - "description": "Maximum width of the text box. Text will wrap.", - "minimum": 1 - }, - "opacity": { - "type": "number", - "description": "Opacity of the text and background (0-1).", - "minimum": 0, - "maximum": 1, - "default": 1 - } - }, - "required": [ - "content" - ] - }, - "rectangle": { - "type": "object", - "description": "Configuration for rectangle annotations.", - "properties": { - "width": { - "type": "number", - "description": "Width of the rectangle in pixels.", - "minimum": 1 - }, - "height": { - "type": "number", - "description": "Height of the rectangle in pixels.", - "minimum": 1 - }, - "fill": { - "type": "string", - "description": "Fill color (hex, rgb, or named color). Use 'transparent' for no fill.", - "default": "transparent" - }, - "stroke": { - "type": "string", - "description": "Border color (hex, rgb, or named color).", - "default": "#FF0000" - }, - "strokeWidth": { - "type": "number", - "description": "Border width in pixels.", - "minimum": 0, - "default": 2 - }, - "opacity": { - "type": "number", - "description": "Opacity (0-1).", - "minimum": 0, - "maximum": 1, - "default": 1 - }, - "rx": { - "type": "number", - "description": "Horizontal corner radius for rounded rectangles.", - "minimum": 0, - "default": 0 - }, - "ry": { - "type": "number", - "description": "Vertical corner radius for rounded rectangles.", - "minimum": 0, - "default": 0 - } - } - }, - "circle": { - "type": "object", - "description": "Configuration for circle annotations.", - "properties": { - "radius": { - "type": "number", - "description": "Radius of the circle in pixels.", - "minimum": 1, - "default": 30 - }, - "fill": { - "type": "string", - "description": "Fill color (hex, rgb, or named color). Use 'transparent' for no fill.", - "default": "transparent" - }, - "stroke": { - "type": "string", - "description": "Border color (hex, rgb, or named color).", - "default": "#FF0000" - }, - "strokeWidth": { - "type": "number", - "description": "Border width in pixels.", - "minimum": 0, - "default": 2 - }, - "opacity": { - "type": "number", - "description": "Opacity (0-1).", - "minimum": 0, - "maximum": 1, - "default": 1 - } - } - }, - "line": { - "type": "object", - "description": "Configuration for line annotations.", - "properties": { - "from": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "to": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "color": { - "type": "string", - "description": "Color of the line (hex, rgb, or named color).", - "default": "#000000" - }, - "strokeWidth": { - "type": "number", - "description": "Width of the line in pixels.", - "minimum": 1, - "default": 2 - }, - "dashArray": { - "type": "array", - "description": "Dash pattern [dash, gap]. E.g., [5, 5] for dashed line.", - "items": { - "type": "number", - "minimum": 0 - } - } - }, - "required": [ - "from", - "to" - ] - }, - "callout": { - "type": "object", - "description": "Configuration for callout annotations (text with arrow).", - "properties": { - "content": { - "type": "string", - "description": "Text content to display." - }, - "target": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "textPosition": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "fontSize": { - "type": "number", - "description": "Font size in pixels.", - "minimum": 1, - "default": 14 - }, - "color": { - "type": "string", - "description": "Text color.", - "default": "#000000" - }, - "backgroundColor": { - "type": "string", - "description": "Background color for the text box.", - "default": "#FFFFCC" - }, - "arrowColor": { - "type": "string", - "description": "Color of the arrow.", - "default": "#000000" - }, - "maxWidth": { - "type": "number", - "description": "Maximum width of the text box.", - "minimum": 1 - } - }, - "required": [ - "content", - "target" - ] - }, - "highlight": { - "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", - "properties": { - "color": { - "type": "string", - "description": "Highlight color (hex, rgb, or named color).", - "default": "#FFFF00" - }, - "opacity": { - "type": "number", - "description": "Opacity (0-1).", - "minimum": 0, - "maximum": 1, - "default": 0.3 - } - } - }, - "blur": { - "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", - "properties": { - "intensity": { - "type": "number", - "description": "Blur intensity level.", - "minimum": 1, - "default": 10 - }, - "width": { - "type": "number", - "description": "Width of the blur area in pixels.", - "minimum": 1 - }, - "height": { - "type": "number", - "description": "Height of the blur area in pixels.", - "minimum": 1 - } - } - } - }, - "components": { - "schemas": { - "arrow_properties": { - "type": "object", - "description": "Configuration for arrow annotations.", - "properties": { - "from": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "to": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "color": { - "type": "string", - "description": "Color of the arrow (hex, rgb, or named color).", - "default": "#FF0000" - }, - "strokeWidth": { - "type": "number", - "description": "Width of the arrow line in pixels.", - "minimum": 1, - "default": 3 - }, - "headSize": { - "type": "number", - "description": "Size of the arrowhead in pixels.", - "minimum": 1, - "default": 15 - } - } - }, - "text_properties": { - "type": "object", - "description": "Configuration for text annotations.", - "properties": { - "content": { - "type": "string", - "description": "Text content to display." - }, - "fontSize": { - "type": "number", - "description": "Font size in pixels.", - "minimum": 1, - "default": 16 - }, - "fontFamily": { - "type": "string", - "description": "Font family name.", - "default": "Arial" - }, - "color": { - "type": "string", - "description": "Text color (hex, rgb, or named color).", - "default": "#000000" - }, - "backgroundColor": { - "type": "string", - "description": "Background color for the text box.", - "default": "#FFFFFF" - }, - "padding": { - "anyOf": [ - { - "type": "number", - "description": "Padding in pixels on all sides.", - "minimum": 0 - }, - { - "type": "object", - "additionalProperties": false, - "properties": { - "top": { - "type": "number", - "minimum": 0 - }, - "right": { - "type": "number", - "minimum": 0 - }, - "bottom": { - "type": "number", - "minimum": 0 - }, - "left": { - "type": "number", - "minimum": 0 - } - } - } - ], - "default": 5 - }, - "maxWidth": { - "type": "number", - "description": "Maximum width of the text box. Text will wrap.", - "minimum": 1 - }, - "opacity": { - "type": "number", - "description": "Opacity of the text and background (0-1).", - "minimum": 0, - "maximum": 1, - "default": 1 - } - }, - "required": [ - "content" - ] - }, - "rectangle_properties": { - "type": "object", - "description": "Configuration for rectangle annotations.", - "properties": { - "width": { - "type": "number", - "description": "Width of the rectangle in pixels.", - "minimum": 1 - }, - "height": { - "type": "number", - "description": "Height of the rectangle in pixels.", - "minimum": 1 - }, - "fill": { - "type": "string", - "description": "Fill color (hex, rgb, or named color). Use 'transparent' for no fill.", - "default": "transparent" - }, - "stroke": { - "type": "string", - "description": "Border color (hex, rgb, or named color).", - "default": "#FF0000" - }, - "strokeWidth": { - "type": "number", - "description": "Border width in pixels.", - "minimum": 0, - "default": 2 - }, - "opacity": { - "type": "number", - "description": "Opacity (0-1).", - "minimum": 0, - "maximum": 1, - "default": 1 - }, - "rx": { - "type": "number", - "description": "Horizontal corner radius for rounded rectangles.", - "minimum": 0, - "default": 0 - }, - "ry": { - "type": "number", - "description": "Vertical corner radius for rounded rectangles.", - "minimum": 0, - "default": 0 - } - } - }, - "circle_properties": { - "type": "object", - "description": "Configuration for circle annotations.", - "properties": { - "radius": { - "type": "number", - "description": "Radius of the circle in pixels.", - "minimum": 1, - "default": 30 - }, - "fill": { - "type": "string", - "description": "Fill color (hex, rgb, or named color). Use 'transparent' for no fill.", - "default": "transparent" - }, - "stroke": { - "type": "string", - "description": "Border color (hex, rgb, or named color).", - "default": "#FF0000" - }, - "strokeWidth": { - "type": "number", - "description": "Border width in pixels.", - "minimum": 0, - "default": 2 - }, - "opacity": { - "type": "number", - "description": "Opacity (0-1).", - "minimum": 0, - "maximum": 1, - "default": 1 - } - } - }, - "line_properties": { - "type": "object", - "description": "Configuration for line annotations.", - "properties": { - "from": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "to": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "color": { - "type": "string", - "description": "Color of the line (hex, rgb, or named color).", - "default": "#000000" - }, - "strokeWidth": { - "type": "number", - "description": "Width of the line in pixels.", - "minimum": 1, - "default": 2 - }, - "dashArray": { - "type": "array", - "description": "Dash pattern [dash, gap]. E.g., [5, 5] for dashed line.", - "items": { - "type": "number", - "minimum": 0 - } - } - }, - "required": [ - "from", - "to" - ] - }, - "callout_properties": { - "type": "object", - "description": "Configuration for callout annotations (text with arrow).", - "properties": { - "content": { - "type": "string", - "description": "Text content to display." - }, - "target": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "textPosition": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "fontSize": { - "type": "number", - "description": "Font size in pixels.", - "minimum": 1, - "default": 14 - }, - "color": { - "type": "string", - "description": "Text color.", - "default": "#000000" - }, - "backgroundColor": { - "type": "string", - "description": "Background color for the text box.", - "default": "#FFFFCC" - }, - "arrowColor": { - "type": "string", - "description": "Color of the arrow.", - "default": "#000000" - }, - "maxWidth": { - "type": "number", - "description": "Maximum width of the text box.", - "minimum": 1 - } - }, - "required": [ - "content", - "target" - ] - }, - "highlight_properties": { - "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", - "properties": { - "color": { - "type": "string", - "description": "Highlight color (hex, rgb, or named color).", - "default": "#FFFF00" - }, - "opacity": { - "type": "number", - "description": "Opacity (0-1).", - "minimum": 0, - "maximum": 1, - "default": 0.3 - } - } - }, - "blur_properties": { - "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", - "properties": { - "intensity": { - "type": "number", - "description": "Blur intensity level.", - "minimum": 1, - "default": 10 - }, - "width": { - "type": "number", - "description": "Width of the blur area in pixels.", - "minimum": 1 - }, - "height": { - "type": "number", - "description": "Height of the blur area in pixels.", - "minimum": 1 - } - } - }, - "point": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "padding": { - "type": "object", - "additionalProperties": false, - "properties": { - "top": { - "type": "number", - "minimum": 0 - }, - "right": { - "type": "number", - "minimum": 0 - }, - "bottom": { - "type": "number", - "minimum": 0 - }, - "left": { - "type": "number", - "minimum": 0 - } - } - } - } - }, - "examples": [ - { - "find": { - "selector": "#submit-button" - }, - "arrow": { - "from": { - "x": 0, - "y": -50 - }, - "to": { - "x": 0, - "y": 0 - }, - "color": "#00FF00", - "strokeWidth": 4, - "headSize": 20 - } - }, - { - "position": "top-right", - "text": { - "content": "Important Notice", - "fontSize": 18, - "color": "#FFFFFF", - "backgroundColor": "#0000FF", - "padding": 10, - "maxWidth": 200, - "opacity": 0.9 - } - }, - { - "find": { - "elementClass": [ - "sensitive-info", - "/^private-/" - ] - }, - "blur": { - "intensity": 15, - "width": 200, - "height": 50 - } - } - ] - } - } - }, - "title": "Capture screenshot (detailed)" - }, - "crop_element": { - "title": "Crop by element (detailed)", - "type": "object", - "description": "Crop the screenshot to a specific element.", - "additionalProperties": false, - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "properties": { - "elementText": { - "type": "string", - "description": "Display text of the element to screenshot." - }, - "selector": { - "type": "string", - "description": "Selector of the element to screenshot." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - }, - "padding": { - "anyOf": [ - { - "title": "Padding (simple)", - "type": "number", - "description": "Padding in pixels to add to the bounds of the element.", - "minimum": 0 - }, - { - "type": "object", - "additionalProperties": false, - "properties": { - "top": { - "type": "number", - "minimum": 0 - }, - "right": { - "type": "number", - "minimum": 0 - }, - "bottom": { - "type": "number", - "minimum": 0 - }, - "left": { - "type": "number", - "minimum": 0 - } - }, - "title": "Padding (detailed)", - "description": "Padding in pixels to add to the bounds of the element." - } - ] - } - } - }, - "padding": { - "type": "object", - "additionalProperties": false, - "properties": { - "top": { - "type": "number", - "minimum": 0 - }, - "right": { - "type": "number", - "minimum": 0 - }, - "bottom": { - "type": "number", - "minimum": 0 - }, - "left": { - "type": "number", - "minimum": 0 - } - }, - "title": "Padding (detailed)", - "description": "Padding in pixels to add to the bounds of the element." - } - } - }, - "examples": [ - true, - "image.png", - "static/images/image.png", - "/User/manny/projects/doc-detective/static/images/image.png", - { - "path": "image.png", - "directory": "static/images", - "maxVariation": 0.1, - "overwrite": "aboveVariation", - "crop": "#elementToScreenshot" - }, - { - "path": "image.png", - "directory": "static/images", - "maxVariation": 0.1, - "overwrite": "aboveVariation" - }, - { - "path": "image.png", - "directory": "static/images", - "maxVariation": 0.1, - "overwrite": "aboveVariation", - "crop": { - "selector": "#elementToScreenshot", - "elementText": "Element text", - "padding": { - "top": 0, - "right": 0, - "bottom": 0, - "left": 0 - } - } - }, - { - "path": "image.png", - "annotations": [ - { - "find": { - "selector": "#usernameField" - }, - "arrow": { - "from": { - "x": 0, - "y": -50 - }, - "to": { - "x": 0, - "y": 0 - }, - "color": "#FF0000", - "strokeWidth": 4, - "headSize": 10 - } - }, - { - "find": { - "elementText": "Username", - "elementClass": [ - "input-field", - "/^user-/" - ] - }, - "text": { - "content": "Enter your username here", - "fontSize": 14, - "color": "#0000FF", - "backgroundColor": "#FFFFFF", - "padding": 5 - } - }, - { - "rectangle": { - "x": 100, - "y": 150, - "width": 200, - "height": 100, - "borderColor": "#00FF00", - "borderWidth": 3, - "fillColor": "rgba(0, 255, 0, 0.2)" - } - } - ] - } - ] - } - }, - "title": "screenshot" - } - ] - }, - { - "allOf": [ - { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { - "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - }, - "title": "Common" - }, - { - "type": "object", - "required": [ - "saveCookie" - ], - "properties": { - "saveCookie": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "saveCookie", - "description": "Save a specific browser cookie to a file or environment variable for later reuse.", - "anyOf": [ - { - "type": "string", - "title": "Cookie name", - "description": "Name of the specific cookie to save. Will be saved to a default file path or environment variable.", - "pattern": "^[A-Za-z0-9_./\\-]+$", - "transform": [ - "trim" - ] - }, - { - "type": "object", - "additionalProperties": false, - "properties": { - "$schema": { - "description": "Optional self-describing schema URI for linters", - "type": "string", - "format": "uri-reference" - }, - "name": { - "type": "string", - "title": "Cookie name", - "description": "Name of the specific cookie to save.", - "pattern": "^[A-Za-z0-9_.-]+$", - "transform": [ - "trim" - ] - }, - "variable": { - "type": "string", - "title": "Environment variable name", - "description": "Environment variable name to store the cookie as JSON string.", - "pattern": "^[A-Za-z_][A-Za-z0-9_]*$", - "transform": [ - "trim" - ] - }, - "path": { - "type": "string", - "title": "Cookie file path", - "description": "File path to save the cookie, relative to directory. Uses Netscape cookie format.", - "transform": [ - "trim" - ] - }, - "directory": { - "type": "string", - "title": "Directory path", - "description": "Directory to save the cookie file. If not specified, uses output directory.", - "transform": [ - "trim" - ] - }, - "overwrite": { - "type": "boolean", - "title": "Overwrite existing file", - "description": "Whether to overwrite existing cookie file.", - "default": false - }, - "domain": { - "type": "string", - "title": "Cookie domain", - "description": "Specific domain to filter the cookie by (optional).", - "transform": [ - "trim" - ] - } - }, - "required": [ - "name" - ], - "anyOf": [ - { - "required": [ - "path" - ], - "not": { - "required": [ - "variable" - ] - } - }, - { - "required": [ - "variable" - ], - "not": { - "anyOf": [ - { - "required": [ - "path" - ] - }, - { - "required": [ - "directory" - ] - } - ] - } - } - ], - "title": "Save cookie (detailed)" - } - ], - "components": { - "schemas": { - "string": { - "type": "string", - "title": "Cookie name", - "description": "Name of the specific cookie to save. Will be saved to a default file path or environment variable.", - "pattern": "^[A-Za-z0-9_./\\-]+$", - "transform": [ - "trim" - ] - }, - "object": { - "type": "object", - "additionalProperties": false, - "properties": { - "$schema": { - "description": "Optional self-describing schema URI for linters", - "type": "string", - "format": "uri-reference" - }, - "name": { - "type": "string", - "title": "Cookie name", - "description": "Name of the specific cookie to save.", - "pattern": "^[A-Za-z0-9_.-]+$", - "transform": [ - "trim" - ] - }, - "variable": { - "type": "string", - "title": "Environment variable name", - "description": "Environment variable name to store the cookie as JSON string.", - "pattern": "^[A-Za-z_][A-Za-z0-9_]*$", - "transform": [ - "trim" - ] - }, - "path": { - "type": "string", - "title": "Cookie file path", - "description": "File path to save the cookie, relative to directory. Uses Netscape cookie format.", - "transform": [ - "trim" - ] - }, - "directory": { - "type": "string", - "title": "Directory path", - "description": "Directory to save the cookie file. If not specified, uses output directory.", - "transform": [ - "trim" - ] - }, - "overwrite": { - "type": "boolean", - "title": "Overwrite existing file", - "description": "Whether to overwrite existing cookie file.", - "default": false - }, - "domain": { - "type": "string", - "title": "Cookie domain", - "description": "Specific domain to filter the cookie by (optional).", - "transform": [ - "trim" - ] - } - }, - "required": [ - "name" - ], - "anyOf": [ - { - "required": [ - "path" - ], - "not": { - "required": [ - "variable" - ] - } - }, - { - "required": [ - "variable" - ], - "not": { - "anyOf": [ - { - "required": [ - "path" - ] - }, - { - "required": [ - "directory" - ] - } - ] - } - } - ], - "title": "Save cookie (detailed)" - } - } - }, - "examples": [ - "session_token", - "test_env_cookie", - { - "name": "auth_cookie", - "path": "auth-cookie.txt" - }, - { - "name": "session_token", - "variable": "SESSION_TOKEN" - }, - { - "name": "test_cookie", - "path": "test-cookie.txt", - "overwrite": true - }, - { - "name": "user_session", - "path": "user-session.txt", - "directory": "./test-data", - "overwrite": true - }, - { - "name": "login_token", - "path": "login-token.txt", - "domain": "app.example.com" - } - ] - } - }, - "title": "saveCookie" - } - ] - }, - { - "allOf": [ - { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { - "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - }, - "title": "Common" - }, - { - "type": "object", - "required": [ - "record" - ], - "properties": { - "record": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "record", - "description": "Start recording the current browser viewport. Must be followed by a `stopRecord` step. Only runs in Chrome browsers when they are visible. Supported extensions: [ '.mp4', '.webm', '.gif' ]", - "anyOf": [ - { - "title": "Record (simple)", - "type": "string", - "description": "File path of the recording. Supports the `.mp4`, `.webm`, and `.gif` extensions. If not specified, the file name is the ID of the step, and the extension is `.mp4`.", - "pattern": "([A-Za-z0-9_-]*\\.(mp4|webm|gif)$|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - { - "type": "object", - "properties": { - "path": { - "type": "string", - "description": "File path of the recording. Supports the `.mp4`, `.webm`, and `.gif` extensions. If not specified, the file name is the ID of the step, and the extension is `.mp4`.", - "pattern": "([A-Za-z0-9_-]*\\.(mp4|webm|gif)$|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - "directory": { - "type": "string", - "description": "Directory of the file. If the directory doesn't exist, creates the directory.", - "transform": [ - "trim" - ] - }, - "overwrite": { - "type": "string", - "description": "If `true`, overwrites the existing recording at `path` if it exists.", - "enum": [ - "true", - "false" - ] - } - }, - "title": "Record (detailed)" - }, - { - "type": "boolean", - "title": "Record (boolean)", - "description": "If `true`, records the current browser viewport. If `false`, doesn't record the current browser viewport." - } - ], - "components": { - "schemas": { - "string": { - "title": "Record (simple)", - "type": "string", - "description": "File path of the recording. Supports the `.mp4`, `.webm`, and `.gif` extensions. If not specified, the file name is the ID of the step, and the extension is `.mp4`.", - "pattern": "([A-Za-z0-9_-]*\\.(mp4|webm|gif)$|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - "object": { - "type": "object", - "properties": { - "path": { - "type": "string", - "description": "File path of the recording. Supports the `.mp4`, `.webm`, and `.gif` extensions. If not specified, the file name is the ID of the step, and the extension is `.mp4`.", - "pattern": "([A-Za-z0-9_-]*\\.(mp4|webm|gif)$|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - "directory": { - "type": "string", - "description": "Directory of the file. If the directory doesn't exist, creates the directory.", - "transform": [ - "trim" - ] - }, - "overwrite": { - "type": "string", - "description": "If `true`, overwrites the existing recording at `path` if it exists.", - "enum": [ - "true", - "false" - ] - } - }, - "title": "Record (detailed)" - } - } - }, - "examples": [ - true, - "results.mp4", - { - "path": "results.mp4", - "directory": "static/media", - "overwrite": "true" - } - ] - } - }, - "title": "record" - } - ] - }, - { - "allOf": [ - { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { - "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - }, - "title": "Common" - }, - { - "type": "object", - "required": [ - "stopRecord" - ], - "properties": { - "stopRecord": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "stopRecord", - "description": "Stop the current recording.", - "anyOf": [ - { - "type": "boolean", - "nullable": true - } - ], - "examples": [ - true - ] - } - }, - "title": "stopRecord" - } - ] - }, - { - "allOf": [ - { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { - "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - }, - "title": "Common" - }, - { - "title": "loadVariables", - "type": "object", - "required": [ - "loadVariables" - ], - "properties": { - "loadVariables": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "loadVariables", - "type": "string", - "description": "Load environment variables from the specified `.env` file.", - "examples": [ - ".env" - ] - } - } - } - ] - }, - { - "allOf": [ - { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { - "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - }, - "title": "Common" - }, - { - "title": "dragAndDrop", - "type": "object", - "required": [ - "dragAndDrop" - ], - "properties": { - "dragAndDrop": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "dragAndDrop", - "description": "Drag and drop an element from source to target.", - "type": "object", - "required": [ - "source", - "target" - ], - "properties": { - "source": { - "description": "The element to drag.", - "anyOf": [ - { - "title": "Element (simple)", - "type": "string", - "description": "Display text, selector, or regex pattern (enclosed in forward slashes) of the element." - }, - { - "title": "Element (detailed)", - "type": "object", - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "properties": { - "elementText": { - "type": "string", - "description": "Display text or regex pattern (enclosed in forward slashes) of the element. If combined with `selector`, the element must match both the text and the selector." - }, - "selector": { - "type": "string", - "description": "Selector of the element. If combined with `elementText`, the element must match both the text and the selector." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - }, - "timeout": { - "type": "integer", - "description": "Max duration in milliseconds to wait for the element to exist.", - "default": 5000 - } - } - } - ] - }, - "target": { - "description": "The target location to drop the element.", - "anyOf": [ - { - "title": "Element (simple)", - "type": "string", - "description": "Display text, selector, or regex pattern (enclosed in forward slashes) of the element." - }, - { - "title": "Element (detailed)", - "type": "object", - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "properties": { - "elementText": { - "type": "string", - "description": "Display text or regex pattern (enclosed in forward slashes) of the element. If combined with `selector`, the element must match both the text and the selector." - }, - "selector": { - "type": "string", - "description": "Selector of the element. If combined with `elementText`, the element must match both the text and the selector." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - }, - "timeout": { - "type": "integer", - "description": "Max duration in milliseconds to wait for the element to exist.", - "default": 5000 - } - } - } - ] - }, - "duration": { - "type": "integer", - "description": "Duration of the drag operation in milliseconds.", - "default": 1000, - "minimum": 0 - } - }, - "components": { - "schemas": { - "elementSpecification": { - "anyOf": [ - { - "title": "Element (simple)", - "type": "string", - "description": "Display text, selector, or regex pattern (enclosed in forward slashes) of the element." - }, - { - "title": "Element (detailed)", - "type": "object", - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "properties": { - "elementText": { - "type": "string", - "description": "Display text or regex pattern (enclosed in forward slashes) of the element. If combined with `selector`, the element must match both the text and the selector." - }, - "selector": { - "type": "string", - "description": "Selector of the element. If combined with `elementText`, the element must match both the text and the selector." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - }, - "timeout": { - "type": "integer", - "description": "Max duration in milliseconds to wait for the element to exist.", - "default": 5000 - } - } - } - ] - }, - "string": { - "title": "Element (simple)", - "type": "string", - "description": "Display text, selector, or regex pattern (enclosed in forward slashes) of the element." - }, - "object": { - "title": "Element (detailed)", - "type": "object", - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "properties": { - "elementText": { - "type": "string", - "description": "Display text or regex pattern (enclosed in forward slashes) of the element. If combined with `selector`, the element must match both the text and the selector." - }, - "selector": { - "type": "string", - "description": "Selector of the element. If combined with `elementText`, the element must match both the text and the selector." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - }, - "timeout": { - "type": "integer", - "description": "Max duration in milliseconds to wait for the element to exist.", - "default": 5000 - } - } - } - } - }, - "examples": [ - { - "source": "Table", - "target": "#canvas" - }, - { - "source": ".draggable-block", - "target": ".drop-zone", - "duration": 2000 - }, - { - "source": { - "selector": ".widget", - "elementText": "Data Table" - }, - "target": { - "selector": "#design-canvas" - }, - "duration": 500 - }, - { - "source": { - "selector": ".draggable", - "timeout": 10000 - }, - "target": { - "elementText": "Drop Zone", - "timeout": 5000 - } - }, - { - "source": "/Widget Item.*/", - "target": "#canvas" - }, - { - "source": { - "selector": ".draggable", - "elementText": "/Button [0-9]+/" - }, - "target": { - "elementText": "/Drop Zone.*/" - } - } - ] - } - } - } - ] - }, - { - "allOf": [ - { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { - "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - }, - "title": "Common" - }, - { - "title": "loadCookie", - "type": "object", - "required": [ - "loadCookie" - ], - "properties": { - "loadCookie": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "loadCookie", - "description": "Load a specific cookie from a file or environment variable into the browser.", - "anyOf": [ - { - "type": "string", - "title": "Cookie name or file path", - "description": "Name of the specific cookie to load from default location, or file path to cookie file.", - "pattern": "^[A-Za-z0-9_./\\-]+$", - "transform": [ - "trim" - ] - }, - { - "type": "object", - "additionalProperties": false, - "required": [ - "name" - ], - "anyOf": [ - { - "required": [ - "path" - ], - "not": { - "required": [ - "variable" - ] - } - }, - { - "required": [ - "variable" - ], - "not": { - "anyOf": [ - { - "required": [ - "path" - ] - }, - { - "required": [ - "directory" - ] - } - ] - } - } - ], - "properties": { - "$schema": { - "description": "Optional self-describing schema URI for linters", - "type": "string", - "format": "uri-reference" - }, - "name": { - "type": "string", - "title": "Cookie name", - "description": "Name of the specific cookie to load.", - "pattern": "^[A-Za-z0-9_.-]+$", - "transform": [ - "trim" - ] - }, - "variable": { - "type": "string", - "title": "Environment variable name", - "description": "Environment variable name containing the cookie as JSON string.", - "pattern": "^[A-Za-z_][A-Za-z0-9_]*$", - "transform": [ - "trim" - ] - }, - "path": { - "type": "string", - "title": "Cookie file path", - "description": "File path to cookie file, relative to directory. Supports Netscape cookie format.", - "transform": [ - "trim" - ] - }, - "directory": { - "type": "string", - "title": "Directory path", - "description": "Directory containing the cookie file.", - "transform": [ - "trim" - ] - }, - "domain": { - "type": "string", - "title": "Cookie domain", - "description": "Specific domain to filter the cookie by when loading from multi-cookie file (optional).", - "transform": [ - "trim" - ] - } - }, - "title": "Load cookie (detailed)" - } - ], - "components": { - "schemas": { - "string": { - "type": "string", - "title": "Cookie name or file path", - "description": "Name of the specific cookie to load from default location, or file path to cookie file.", - "pattern": "^[A-Za-z0-9_./\\-]+$", - "transform": [ - "trim" - ] - }, - "object": { - "type": "object", - "additionalProperties": false, - "required": [ - "name" - ], - "anyOf": [ - { - "required": [ - "path" - ], - "not": { - "required": [ - "variable" - ] - } - }, - { - "required": [ - "variable" - ], - "not": { - "anyOf": [ - { - "required": [ - "path" - ] - }, - { - "required": [ - "directory" - ] - } - ] - } - } - ], - "properties": { - "$schema": { - "description": "Optional self-describing schema URI for linters", - "type": "string", - "format": "uri-reference" - }, - "name": { - "type": "string", - "title": "Cookie name", - "description": "Name of the specific cookie to load.", - "pattern": "^[A-Za-z0-9_.-]+$", - "transform": [ - "trim" - ] - }, - "variable": { - "type": "string", - "title": "Environment variable name", - "description": "Environment variable name containing the cookie as JSON string.", - "pattern": "^[A-Za-z_][A-Za-z0-9_]*$", - "transform": [ - "trim" - ] - }, - "path": { - "type": "string", - "title": "Cookie file path", - "description": "File path to cookie file, relative to directory. Supports Netscape cookie format.", - "transform": [ - "trim" - ] - }, - "directory": { - "type": "string", - "title": "Directory path", - "description": "Directory containing the cookie file.", - "transform": [ - "trim" - ] - }, - "domain": { - "type": "string", - "title": "Cookie domain", - "description": "Specific domain to filter the cookie by when loading from multi-cookie file (optional).", - "transform": [ - "trim" - ] - } - }, - "title": "Load cookie (detailed)" - } - } - }, - "examples": [ - "session_token", - "./test-data/auth-session.txt", - "test_env_cookie", - { - "name": "auth_cookie", - "variable": "AUTH_COOKIE" - }, - { - "name": "test_cookie", - "path": "test-cookie.txt" - }, - { - "name": "session_token", - "path": "session-token.txt", - "directory": "./test-data" - }, - { - "name": "user_session", - "path": "saved-cookies.txt", - "domain": "app.example.com" - } - ] - } - } - } - ] - }, - { - "allOf": [ - { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { - "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - }, - "title": "Common" - }, - { - "title": "wait", - "type": "object", - "required": [ - "wait" - ], - "properties": { - "wait": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "wait", - "description": "Pause (in milliseconds) before performing the next action.", - "default": 5000, - "anyOf": [ - { - "type": "number", - "title": "Wait (simple)" - }, - { - "title": "Wait (environment variable)", - "type": "string", - "pattern": "(\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - { - "type": "boolean", - "title": "Wait (boolean)" - } - ], - "components": { - "schemas": { - "string": { - "title": "Wait (environment variable)", - "type": "string", - "pattern": "(\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - } - } - }, - "examples": [ - 5000, - "$WAIT_DURATION", - true - ] - } - } - } - ] - } - ], - "examples": [ - { - "stepId": "uuid", - "description": "Description of the step.", - "checkLink": "https://www.google.com", - "outputs": { - "outputKey": "outputValue" - }, - "variables": { - "variableKey": "variableValue" - } - }, - { - "checkLink": "https://www.google.com" - }, - { - "stepId": "path-only", - "checkLink": "/search" - }, - { - "stepId": "status-code", - "checkLink": { - "url": "https://www.google.com", - "statusCodes": [ - 200 - ] - } - }, - { - "goTo": { - "url": "https://www.google.com" - } - }, - { - "goTo": "https://www.google.com" - }, - { - "wait": 5000 - }, - { - "runCode": { - "language": "python", - "code": "print('Hello from Python')", - "workingDirectory": ".", - "exitCodes": [ - 0 - ], - "stdio": "Hello from Python!", - "path": "python-output.txt", - "directory": "output", - "maxVariation": 0.1, - "overwrite": "aboveVariation" - } - }, - { - "stopRecord": true - }, - { - "screenshot": true - }, - { - "screenshot": "image.png" - }, - { - "screenshot": "static/images/image.png" - }, - { - "screenshot": "/User/manny/projects/doc-detective/static/images/image.png" - }, - { - "screenshot": { - "path": "image.png", - "directory": "static/images", - "maxVariation": 0.1, - "overwrite": "aboveVariation", - "crop": "#elementToScreenshot" - } - }, - { - "screenshot": { - "path": "image.png", - "directory": "static/images", - "maxVariation": 0.1, - "overwrite": "aboveVariation" - } - }, - { - "screenshot": { - "path": "image.png", - "directory": "static/images", - "maxVariation": 0.1, - "overwrite": "aboveVariation", - "crop": { - "selector": "#elementToScreenshot", - "elementText": "Element text", - "padding": { - "top": 0, - "right": 0, - "bottom": 0, - "left": 0 - } - } - } - }, - { - "record": true - }, - { - "record": "video.mp4" - }, - { - "record": "static/media/video.mp4" - }, - { - "record": "/User/manny/projects/doc-detective/static/media/video.mp4" - }, - { - "record": { - "path": "video.mp4", - "directory": "static/media", - "overwrite": true - } - }, - { - "loadVariables": "variables.env" - }, - { - "saveCookie": "session_token" - }, - { - "saveCookie": { - "name": "auth_cookie", - "path": "auth-session.txt", - "directory": "./test-data", - "overwrite": true - } - }, - { - "loadCookie": "session_token" - }, - { - "loadCookie": { - "name": "auth_cookie", - "path": "auth-session.txt", - "directory": "./test-data" - } - }, - { - "find": "Find me!" - }, - { - "find": { - "selector": "[title=Search]" - } - }, - { - "find": { - "selector": "[title=Search]", - "timeout": 10000, - "elementText": "Search", - "moveTo": true, - "click": true, - "type": "shorthair cat" - } - }, - { - "find": { - "selector": "[title=Search]", - "click": { - "button": "right" - } - } - }, - { - "find": { - "selector": "[title=Search]", - "timeout": 10000, - "elementText": "Search", - "moveTo": true, - "click": true, - "type": { - "keys": [ - "shorthair cat" - ], - "inputDelay": 100 - } - } - }, - { - "click": true - }, - { - "click": "right" - }, - { - "click": { - "button": "left", - "elementText": "Element text" - } - }, - { - "click": { - "selector": "#elementToScreenshot", - "elementText": "Element text", - "button": "middle" - } - }, - { - "httpRequest": "https://reqres.in/api/users" - }, - { - "httpRequest": { - "url": "https://reqres.in/api/users" - } - }, - { - "httpRequest": { - "url": "https://reqres.in/api/users/2", - "method": "put", - "request": { - "body": { - "name": "morpheus", - "job": "zion resident" - } - } - } - }, - { - "httpRequest": { - "url": "https://reqres.in/api/users", - "method": "post", - "request": { - "body": { - "name": "morpheus", - "job": "leader" - } - }, - "response": { - "body": { - "name": "morpheus", - "job": "leader" - } - }, - "statusCodes": [ - 200, - 201 - ] - } - }, - { - "httpRequest": { - "url": "https://www.api-server.com", - "method": "post", - "timeout": 30000, - "request": { - "body": { - "field": "value" - }, - "headers": { - "header": "value" - }, - "parameters": { - "param": "value" - } - }, - "response": { - "body": { - "field": "value" - }, - "headers": { - "header": "value" - } - }, - "statusCodes": [ - 200 - ] - } - }, - { - "httpRequest": { - "url": "https://reqres.in/api/users", - "method": "post", - "request": { - "body": { - "name": "morpheus", - "job": "leader" - } - }, - "response": { - "body": { - "name": "morpheus", - "job": "leader" - } - }, - "statusCodes": [ - 200, - 201 - ], - "path": "response.json", - "directory": "media", - "maxVariation": 0.05, - "overwrite": "aboveVariation" - } - }, - { - "httpRequest": { - "openApi": "getUserById" - } - }, - { - "httpRequest": { - "openApi": { - "name": "Reqres", - "operationId": "getUserById" - }, - "request": { - "parameters": { - "id": 123 - } - } - } - }, - { - "httpRequest": { - "openApi": { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "getUserById" - }, - "request": { - "parameters": { - "id": 123 - } - } - } - }, - { - "httpRequest": { - "openApi": { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both" - } - } - }, - { - "httpRequest": { - "openApi": { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "updateUser", - "useExample": "request", - "exampleKey": "acme" - } - } - }, - { - "httpRequest": { - "openApi": { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "updateUser", - "useExample": "request", - "exampleKey": "acme", - "headers": { - "Authorization": "Bearer $TOKEN" - } - } - } - }, - { - "stepId": "breakpoint-example", - "description": "Step with breakpoint enabled", - "goTo": "https://www.example.com", - "breakpoint": true - }, - { - "checkLink": "https://www.google.com", - "breakpoint": false - }, - { - "dragAndDrop": { - "source": { - "selector": "#sourceElement" - }, - "target": { - "selector": "#targetElement" - } - } - } - ] - } - ] - } - } - ] - } - }, - "title": "Markup definition" - }, - "markupActionString": { - "type": "string", - "enum": [ - "checkLink", - "click", - "find", - "goTo", - "httpRequest", - "loadCookie", - "loadVariables", - "record", - "runCode", - "runShell", - "saveCookie", - "screenshot", - "stopRecord", - "type", - "wait" - ] - }, - "inlineStatements": { - "description": "Statements to include tests and steps inside the content of the file, such as within Markdown.", - "type": "object", - "properties": { - "testStart": { - "description": "Regular expressions that indicate the start of a test. If capture groups are used, the first capture group is used for the statement. If no capture groups are used, the entire match is used for the statement.", - "anyOf": [ - { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "minItems": 1, - "items": { - "type": "string" - } - } - ] - } - ] - }, - "testEnd": { - "description": "Regular expressions that indicate that the current test is complete.", - "anyOf": [ - { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "minItems": 1, - "items": { - "type": "string" - } - } - ] - } - ] - }, - "ignoreStart": { - "description": "Regular expressions that indicates that the following content should be ignored for testing purposes.", - "anyOf": [ - { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "minItems": 1, - "items": { - "type": "string" - } - } - ] - } - ] - }, - "ignoreEnd": { - "description": "Regular expressions that indicate that the ignored section of content is complete.", - "anyOf": [ - { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "minItems": 1, - "items": { - "type": "string" - } - } - ] - } - ] - }, - "step": { - "description": "Regular expressions that indicate a step in a test.", - "anyOf": [ - { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "minItems": 1, - "items": { - "type": "string" - } - } - ] - } - ] - } - }, - "title": "Inline statement definition" - }, - "stringOrArray": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "minItems": 1, - "items": { - "type": "string" - } - } - ] - } - } - }, "examples": [ {}, { diff --git a/common/dist/schemas/context_v3.schema.json b/common/dist/schemas/context_v3.schema.json index 3a080b5..88e2b3a 100644 --- a/common/dist/schemas/context_v3.schema.json +++ b/common/dist/schemas/context_v3.schema.json @@ -196,88 +196,6 @@ ] } }, - "components": { - "schemas": { - "platform": { - "type": "string", - "enum": [ - "linux", - "mac", - "windows" - ] - }, - "browserName": { - "type": "string", - "description": "Name of the browser.", - "enum": [ - "chrome", - "firefox", - "safari", - "webkit" - ], - "$comment": "`safari` is just a shortcut for `webkit`. Included for visibility and to reduce questions." - }, - "browser": { - "type": "object", - "description": "Browser configuration.", - "required": [ - "name" - ], - "additionalProperties": false, - "properties": { - "name": { - "type": "string", - "description": "Name of the browser.", - "enum": [ - "chrome", - "firefox", - "safari", - "webkit" - ], - "$comment": "`safari` is just a shortcut for `webkit`. Included for visibility and to reduce questions." - }, - "headless": { - "type": "boolean", - "description": "If `true`, runs the browser in headless mode.", - "default": true - }, - "window": { - "type": "object", - "description": "Browser dimensions.", - "additionalProperties": false, - "properties": { - "width": { - "type": "integer", - "description": "Width of the browser window in pixels." - }, - "height": { - "type": "integer", - "description": "Height of the browser window in pixels." - } - }, - "title": "Browser Window" - }, - "viewport": { - "type": "object", - "description": "Viewport dimensions.", - "additionalProperties": false, - "properties": { - "width": { - "type": "integer", - "description": "Width of the viewport in pixels." - }, - "height": { - "type": "integer", - "description": "Height of the viewport in pixels." - } - }, - "title": "Browser Viewport" - } - }, - "title": "Browser" - } - } - }, "examples": [ { "platforms": "linux", diff --git a/common/dist/schemas/dragAndDrop_v3.schema.json b/common/dist/schemas/dragAndDrop_v3.schema.json index ced06e3..295db77 100644 --- a/common/dist/schemas/dragAndDrop_v3.schema.json +++ b/common/dist/schemas/dragAndDrop_v3.schema.json @@ -233,222 +233,6 @@ "minimum": 0 } }, - "components": { - "schemas": { - "elementSpecification": { - "anyOf": [ - { - "title": "Element (simple)", - "type": "string", - "description": "Display text, selector, or regex pattern (enclosed in forward slashes) of the element." - }, - { - "title": "Element (detailed)", - "type": "object", - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "properties": { - "elementText": { - "type": "string", - "description": "Display text or regex pattern (enclosed in forward slashes) of the element. If combined with `selector`, the element must match both the text and the selector." - }, - "selector": { - "type": "string", - "description": "Selector of the element. If combined with `elementText`, the element must match both the text and the selector." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - }, - "timeout": { - "type": "integer", - "description": "Max duration in milliseconds to wait for the element to exist.", - "default": 5000 - } - } - } - ] - }, - "string": { - "title": "Element (simple)", - "type": "string", - "description": "Display text, selector, or regex pattern (enclosed in forward slashes) of the element." - }, - "object": { - "title": "Element (detailed)", - "type": "object", - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "properties": { - "elementText": { - "type": "string", - "description": "Display text or regex pattern (enclosed in forward slashes) of the element. If combined with `selector`, the element must match both the text and the selector." - }, - "selector": { - "type": "string", - "description": "Selector of the element. If combined with `elementText`, the element must match both the text and the selector." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - }, - "timeout": { - "type": "integer", - "description": "Max duration in milliseconds to wait for the element to exist.", - "default": 5000 - } - } - } - } - }, "examples": [ { "source": "Table", diff --git a/common/dist/schemas/find_v3.schema.json b/common/dist/schemas/find_v3.schema.json index 4f4aea6..abdfbb1 100644 --- a/common/dist/schemas/find_v3.schema.json +++ b/common/dist/schemas/find_v3.schema.json @@ -650,656 +650,6 @@ } } ], - "components": { - "schemas": { - "string": { - "title": "Find element (simple)", - "type": "string", - "description": "Identifier for the element to find. Can be a selector, element text, ARIA name, ID, or test ID." - }, - "object": { - "title": "Find element (detailed)", - "type": "object", - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "additionalProperties": false, - "properties": { - "elementText": { - "type": "string", - "description": "Display text of the element to find. If combined with other element finding fields, the element must match all specified criteria." - }, - "selector": { - "type": "string", - "description": "Selector of the element to find. If combined with other element finding fields, the element must match all specified criteria." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - }, - "timeout": { - "type": "integer", - "description": "Max duration in milliseconds to wait for the element to exist.", - "default": 5000 - }, - "moveTo": { - "description": "Move to the element. If the element isn't visible, it's scrolled into view.", - "type": "boolean", - "default": true - }, - "click": { - "description": "Click the element.", - "anyOf": [ - { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "click", - "description": "Click or tap an element.", - "anyOf": [ - { - "title": "Click element (simple)", - "type": "string", - "description": "Identifier for the element to click. Can be a selector, element text, ARIA name, ID, or test ID." - }, - { - "title": "Click element (detailed)", - "type": "object", - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "properties": { - "button": { - "description": "Kind of click to perform.", - "type": "string", - "enum": [ - "left", - "right", - "middle" - ] - }, - "elementText": { - "type": "string", - "description": "Display text of the element to click. If combined with other element finding fields, the element must match all specified criteria." - }, - "selector": { - "type": "string", - "description": "Selector of the element to click. If combined with other element finding fields, the element must match all specified criteria." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to click. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to click. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - } - } - }, - { - "type": "boolean" - } - ], - "components": { - "schemas": { - "string": { - "title": "Click element (simple)", - "type": "string", - "description": "Identifier for the element to click. Can be a selector, element text, ARIA name, ID, or test ID." - }, - "button": { - "description": "Kind of click to perform.", - "type": "string", - "enum": [ - "left", - "right", - "middle" - ] - }, - "object": { - "title": "Click element (detailed)", - "type": "object", - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "properties": { - "button": { - "description": "Kind of click to perform.", - "type": "string", - "enum": [ - "left", - "right", - "middle" - ] - }, - "elementText": { - "type": "string", - "description": "Display text of the element to click. If combined with other element finding fields, the element must match all specified criteria." - }, - "selector": { - "type": "string", - "description": "Selector of the element to click. If combined with other element finding fields, the element must match all specified criteria." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to click. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to click. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - } - } - } - } - }, - "examples": [ - true, - "right", - { - "button": "left", - "elementText": "Element text" - }, - { - "selector": "#elementToScreenshot", - "elementText": "Element text", - "button": "middle" - } - ] - }, - { - "type": "object", - "properties": { - "button": { - "description": "Kind of click to perform.", - "type": "string", - "enum": [ - "left", - "right", - "middle" - ] - } - }, - "title": "Find element and click" - } - ] - }, - "type": { - "description": "Type keys after finding the element. Either a string or an object with a `keys` field as defined in [`type`](type). To type in the element, make the element active with the `click` parameter.", - "allOf": [ - { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "typeKeys", - "description": "Type keys. To type special keys, begin and end the string with `$` and use the special key's keyword. For example, to type the Escape key, enter `$ESCAPE$`.", - "anyOf": [ - { - "title": "Type keys (simple)", - "description": "Sequence of keys to enter.", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - } - ] - } - } - ] - }, - { - "title": "Type keys (detailed)", - "type": "object", - "properties": { - "keys": { - "title": "Type keys (simple)", - "description": "Sequence of keys to enter.", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - } - ] - } - } - ] - }, - "inputDelay": { - "type": "number", - "description": "Delay in milliseconds between each key press during a recording", - "default": 100 - }, - "selector": { - "type": "string", - "description": "Selector for the element to type into. If not specified, the typing occurs in the active element." - }, - "elementText": { - "type": "string", - "description": "Display text of the element to type into. If combined with other element finding fields, the element must match all specified criteria." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - } - }, - "required": [ - "keys" - ], - "additionalProperties": false - } - ], - "components": { - "schemas": { - "keys": { - "title": "Type keys (simple)", - "description": "Sequence of keys to enter.", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - } - ] - } - } - ] - }, - "object": { - "title": "Type keys (detailed)", - "type": "object", - "properties": { - "keys": { - "title": "Type keys (simple)", - "description": "Sequence of keys to enter.", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - } - ] - } - } - ] - }, - "inputDelay": { - "type": "number", - "description": "Delay in milliseconds between each key press during a recording", - "default": 100 - }, - "selector": { - "type": "string", - "description": "Selector for the element to type into. If not specified, the typing occurs in the active element." - }, - "elementText": { - "type": "string", - "description": "Display text of the element to type into. If combined with other element finding fields, the element must match all specified criteria." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - } - }, - "required": [ - "keys" - ], - "additionalProperties": false - } - } - }, - "examples": [ - "kittens", - [ - "$ENTER$" - ], - [ - "kittens", - "$ENTER$" - ], - { - "keys": "kittens" - }, - { - "keys": [ - "$ENTER$" - ] - }, - { - "keys": [ - "kittens", - "$ENTER$" - ], - "inputDelay": 500 - } - ] - }, - { - "not": { - "type": "object", - "required": [ - "selector", - "elementText", - "elementId", - "elementTestId", - "elementClass", - "elementAttribute", - "elementAria" - ], - "title": "Find element and type" - } - } - ] - } - } - } - } - }, "examples": [ "Find me!", { diff --git a/common/dist/schemas/goTo_v3.schema.json b/common/dist/schemas/goTo_v3.schema.json index 4b3378c..efa7488 100644 --- a/common/dist/schemas/goTo_v3.schema.json +++ b/common/dist/schemas/goTo_v3.schema.json @@ -172,179 +172,6 @@ "title": "Go to URL (detailed)" } ], - "components": { - "schemas": { - "string": { - "title": "Go to URL (simple)", - "description": "Navigate to an HTTP or HTTPS URL. Can be a full URL or a path. If a path is provided, navigates relative to the current URL, if any.", - "type": "string", - "pattern": "(^(http://|https://|/).*|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - "object": { - "description": "Navigate to an HTTP or HTTPS URL.", - "type": "object", - "additionalProperties": false, - "required": [ - "url" - ], - "properties": { - "url": { - "type": "string", - "description": "URL to navigate to. Can be a full URL or a path. If a path is provided and `origin` is specified, prepends `origin` to `url`. If a path is provided but `origin` isn't specified, attempts to navigate relative to the current URL, if any.", - "pattern": "(^(http://|https://|/).*|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - "origin": { - "type": "string", - "description": "Protocol and domain to navigate to. Prepended to `url`.", - "transform": [ - "trim" - ] - }, - "timeout": { - "type": "integer", - "description": "Maximum time in milliseconds to wait for the page to be ready. If exceeded, the goTo action fails.", - "default": 30000, - "minimum": 0 - }, - "waitUntil": { - "type": "object", - "description": "Configuration for waiting conditions after navigation.", - "additionalProperties": false, - "properties": { - "networkIdleTime": { - "description": "Wait for network activity to be idle (no new requests) for this duration in milliseconds. Set to `null` to skip this check.", - "anyOf": [ - { - "type": "integer", - "minimum": 0 - }, - { - "type": "null" - } - ], - "default": 500 - }, - "domIdleTime": { - "description": "Wait for DOM mutations to stop for this duration in milliseconds. Set to `null` to skip this check.", - "anyOf": [ - { - "type": "integer", - "minimum": 0 - }, - { - "type": "null" - } - ], - "default": 1000 - }, - "find": { - "type": "object", - "description": "Wait for a specific element to be present in the DOM. At least one of selector or elementText must be specified.", - "additionalProperties": false, - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "properties": { - "selector": { - "type": "string", - "description": "CSS selector for the element to wait for." - }, - "elementText": { - "type": "string", - "description": "Text content the element must contain. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - } - } - } - } - } - }, - "title": "Go to URL (detailed)" - } - } - }, "examples": [ "https://www.google.com", "/search", diff --git a/common/dist/schemas/httpRequest_v3.schema.json b/common/dist/schemas/httpRequest_v3.schema.json index 20ae01d..26e96fa 100644 --- a/common/dist/schemas/httpRequest_v3.schema.json +++ b/common/dist/schemas/httpRequest_v3.schema.json @@ -400,406 +400,6 @@ } } ], - "components": { - "schemas": { - "url": { - "title": "HTTP request (simple)", - "type": "string", - "description": "URL for the HTTP request.", - "pattern": "(^(http://|https://).*|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - "object": { - "title": "HTTP request (detailed)", - "type": "object", - "anyOf": [ - { - "required": [ - "url" - ] - }, - { - "required": [ - "openApi" - ] - } - ], - "additionalProperties": false, - "properties": { - "url": { - "title": "HTTP request (simple)", - "type": "string", - "description": "URL for the HTTP request.", - "pattern": "(^(http://|https://).*|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - "openApi": { - "anyOf": [ - { - "allOf": [ - { - "type": "string", - "description": "ID of the operation to use for the request." - }, - { - "title": "Operation ID", - "description": "Operation ID from the OpenAPI schema. Only valid if the OpenAPI description path is specified elsewhere and the operation ID is unique among all specified OpenAPI descriptions." - } - ] - }, - { - "allOf": [ - { - "version": "1.0.0", - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "openApi", - "type": "object", - "description": "OpenAPI description and configuration.", - "additionalProperties": false, - "anyOf": [ - { - "required": [ - "descriptionPath" - ] - }, - { - "required": [ - "operationId" - ] - } - ], - "properties": { - "name": { - "type": "string", - "description": "Name of the OpenAPI description, as defined in your configuration." - }, - "descriptionPath": { - "type": "string", - "description": "URL or local path to the OpenAPI description." - }, - "definition": { - "type": "object", - "readOnly": true, - "description": "OpenAPI definition object loaded from the `descriptionPath`. This is a resolved version of the OpenAPI description and should not be user-defined.", - "additionalProperties": true, - "title": "OpenAPI definition" - }, - "operationId": { - "type": "string", - "description": "ID of the operation to use for the request." - }, - "server": { - "type": "string", - "description": "Server to use for example requests. Only valid if `useExample` is `request` or `both`. If not specified but an example is used for the request, uses the first server defined in the OpenAPI description." - }, - "validateAgainstSchema": { - "type": "string", - "description": "Validates the request and/or response against the schema in the OpenAPI description. If the request or response doesn't match the schema, the step fails.", - "enum": [ - "request", - "response", - "both", - "none" - ], - "default": "both" - }, - "mockResponse": { - "type": "boolean", - "description": "If `true`, doesn't make the HTTP request, but instead uses the response example or schema from the OpenAPI description as the response data. Useful for creating tests when an API isn't fully implemented yet. If `statusCode` isn't specified, uses the first defined response code." - }, - "statusCode": { - "type": "integer", - "description": "Response code to use for validation, examples, and status code checking. If the response code doesn't match, the step fails. `statusCodes` overrides this value when specified." - }, - "useExample": { - "type": [ - "string" - ], - "description": "Uses the example from the OpenAPI description as the request and response data. If the request or response has multiple examples, specify `exampleKey`. If `statusCode` isn't specified, uses the first defined response code. `requestData`, `requestParams`, and `requestHeaders` override portions of request examples when specified. `responseData` overrides portions of response examples when specified.", - "enum": [ - "request", - "response", - "both", - "none" - ], - "default": "none" - }, - "exampleKey": { - "type": "string", - "description": "Key of the example to use from the `examples` property in the OpenAPI description. If an `examples` key isn't specified or isn't available for a given parameter or object, the `example` property value is used.", - "default": "" - }, - "headers": { - "type": "object", - "description": "Request headers to add to requests. For example, to set `Authorization` headers for all requests from the specified OpenAPI document. If specified in both a config and a step, the step value overrides the config value.", - "additionalProperties": { - "type": "string" - }, - "title": "OpenAPI request headers" - } - }, - "components": { - "schemas": { - "operationId": { - "type": "string", - "description": "ID of the operation to use for the request." - }, - "descriptionPath": { - "type": "string", - "description": "URL or local path to the OpenAPI description." - } - } - }, - "examples": [ - { - "descriptionPath": "https://petstore.swagger.io/v2/swagger.json" - }, - { - "name": "Reqres", - "operationId": "getUserById" - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "getUserById" - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both" - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both", - "exampleKey": "example1" - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both", - "exampleKey": "example1", - "statusCode": 201 - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both", - "exampleKey": "example1", - "statusCode": 201, - "validateAgainstSchema": "none" - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both", - "exampleKey": "example1", - "statusCode": 201, - "validateAgainstSchema": "none", - "mockResponse": true - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both", - "exampleKey": "example1", - "statusCode": 201, - "validateAgainstSchema": "none", - "mockResponse": true, - "headers": { - "Authorization": "Bearer 12345" - } - } - ] - }, - { - "type": "object", - "required": [ - "operationId" - ], - "title": "OpenAPI definition (httpRequest)" - } - ] - } - ] - }, - "statusCodes": { - "description": "Accepted status codes. If the specified URL returns a code other than what is specified here, the action fails.", - "type": "array", - "items": { - "anyOf": [ - { - "type": "integer" - } - ] - }, - "default": [ - 200, - 201 - ] - }, - "method": { - "type": "string", - "description": "Method of the HTTP request", - "enum": [ - "get", - "put", - "post", - "patch", - "delete" - ], - "transform": [ - "trim", - "toEnumCase" - ], - "default": "get" - }, - "timeout": { - "type": "integer", - "description": "Timeout for the HTTP request, in milliseconds.", - "default": 60000 - }, - "request": { - "type": "object", - "additionalProperties": false, - "properties": { - "headers": { - "description": "Headers to include in the HTTP request.", - "default": {}, - "anyOf": [ - { - "title": "Request headers (object)", - "description": "Headers to include in the HTTP request, in key/value format.", - "type": "object", - "additionalProperties": true, - "properties": {} - }, - { - "title": "Request headers (string)", - "description": "Headers to include in the HTTP request, as return-separated values. For example, `Content-Type: application/json\nAuthorization: Bearer token`.", - "type": "string" - } - ] - }, - "parameters": { - "description": "URL parameters to include in the HTTP request, in key/value format.", - "type": "object", - "additionalProperties": true, - "default": {}, - "properties": {}, - "title": "Request parameters" - }, - "body": { - "description": "The body of the HTTP request.", - "anyOf": [ - { - "title": "Request body (object)", - "description": "JSON object to include as the body of the HTTP request.", - "type": "object", - "additionalProperties": true, - "properties": {} - }, - { - "title": "Request body (array)", - "description": "JSON array to include as the body of the HTTP request.", - "type": "array", - "items": {} - }, - { - "title": "Request body (string)", - "description": "String to include as the body of the HTTP request.", - "type": "string" - } - ], - "default": {} - } - }, - "title": "Request" - }, - "response": { - "type": "object", - "additionalProperties": false, - "properties": { - "headers": { - "description": "Headers expected in the response, in key/value format. If one or more `responseHeaders` entries aren't present in the response, the step fails.", - "type": "object", - "additionalProperties": true, - "properties": {}, - "default": {}, - "title": "Response headers" - }, - "body": { - "description": "JSON object expected in the response. If one or more key/value pairs aren't present in the response, the step fails.", - "anyOf": [ - { - "type": "object", - "additionalProperties": true, - "properties": {}, - "title": "Response body object", - "description": "JSON key/value pairs expected in the response." - }, - { - "title": "Response body array", - "description": "JSON array expected in the response.", - "type": "array", - "items": {} - }, - { - "title": "Response body string", - "description": "String expected in the response.", - "type": "string" - } - ], - "default": {} - }, - "required": { - "type": "array", - "description": "Array of field paths that must exist in the response body. Uses dot notation for nested fields (e.g., 'user.name') and bracket notation for array indices (e.g., 'items[0].id'). Fields must be present but may have any value including null.", - "items": { - "type": "string" - }, - "default": [] - } - }, - "title": "Response" - }, - "allowAdditionalFields": { - "type": "boolean", - "description": "If `false`, the step fails when the response data contains fields not specified in the response body.", - "default": true - }, - "path": { - "type": "string", - "description": "File path to save the command's output, relative to `directory`. Specify a file extension that matches the expected response type, such as `.json` for JSON content or `.txt` for strings." - }, - "directory": { - "type": "string", - "description": "Directory to save the command's output. If the directory doesn't exist, creates the directory. If not specified, the directory is your media directory." - }, - "maxVariation": { - "type": "number", - "description": "Allowed variation in percentage of text different between the current output and previously saved output. If the difference between the current output and the previous output is greater than `maxVariation`, the step fails. If output doesn't exist at `path`, this value is ignored.", - "default": 0, - "minimum": 0, - "maximum": 1 - }, - "overwrite": { - "type": "string", - "description": "If `true`, overwrites the existing output at `path` if it exists.\nIf `aboveVariation`, overwrites the existing output at `path` if the difference between the new output and the existing output is greater than `maxVariation`.", - "enum": [ - "true", - "false", - "aboveVariation" - ], - "default": "aboveVariation" - } - } - } - } - }, "examples": [ "https://reqres.in/api/users", { diff --git a/common/dist/schemas/loadCookie_v3.schema.json b/common/dist/schemas/loadCookie_v3.schema.json index 98c6ae2..39a292a 100644 --- a/common/dist/schemas/loadCookie_v3.schema.json +++ b/common/dist/schemas/loadCookie_v3.schema.json @@ -101,107 +101,6 @@ "title": "Load cookie (detailed)" } ], - "components": { - "schemas": { - "string": { - "type": "string", - "title": "Cookie name or file path", - "description": "Name of the specific cookie to load from default location, or file path to cookie file.", - "pattern": "^[A-Za-z0-9_./\\-]+$", - "transform": [ - "trim" - ] - }, - "object": { - "type": "object", - "additionalProperties": false, - "required": [ - "name" - ], - "anyOf": [ - { - "required": [ - "path" - ], - "not": { - "required": [ - "variable" - ] - } - }, - { - "required": [ - "variable" - ], - "not": { - "anyOf": [ - { - "required": [ - "path" - ] - }, - { - "required": [ - "directory" - ] - } - ] - } - } - ], - "properties": { - "$schema": { - "description": "Optional self-describing schema URI for linters", - "type": "string", - "format": "uri-reference" - }, - "name": { - "type": "string", - "title": "Cookie name", - "description": "Name of the specific cookie to load.", - "pattern": "^[A-Za-z0-9_.-]+$", - "transform": [ - "trim" - ] - }, - "variable": { - "type": "string", - "title": "Environment variable name", - "description": "Environment variable name containing the cookie as JSON string.", - "pattern": "^[A-Za-z_][A-Za-z0-9_]*$", - "transform": [ - "trim" - ] - }, - "path": { - "type": "string", - "title": "Cookie file path", - "description": "File path to cookie file, relative to directory. Supports Netscape cookie format.", - "transform": [ - "trim" - ] - }, - "directory": { - "type": "string", - "title": "Directory path", - "description": "Directory containing the cookie file.", - "transform": [ - "trim" - ] - }, - "domain": { - "type": "string", - "title": "Cookie domain", - "description": "Specific domain to filter the cookie by when loading from multi-cookie file (optional).", - "transform": [ - "trim" - ] - } - }, - "title": "Load cookie (detailed)" - } - } - }, "examples": [ "session_token", "./test-data/auth-session.txt", diff --git a/common/dist/schemas/openApi_v3.schema.json b/common/dist/schemas/openApi_v3.schema.json index bf4f847..d2c7cf9 100644 --- a/common/dist/schemas/openApi_v3.schema.json +++ b/common/dist/schemas/openApi_v3.schema.json @@ -87,18 +87,6 @@ "title": "OpenAPI request headers" } }, - "components": { - "schemas": { - "operationId": { - "type": "string", - "description": "ID of the operation to use for the request." - }, - "descriptionPath": { - "type": "string", - "description": "URL or local path to the OpenAPI description." - } - } - }, "examples": [ { "descriptionPath": "https://petstore.swagger.io/v2/swagger.json" diff --git a/common/dist/schemas/record_v3.schema.json b/common/dist/schemas/record_v3.schema.json index 1026028..c00159e 100644 --- a/common/dist/schemas/record_v3.schema.json +++ b/common/dist/schemas/record_v3.schema.json @@ -47,48 +47,6 @@ "description": "If `true`, records the current browser viewport. If `false`, doesn't record the current browser viewport." } ], - "components": { - "schemas": { - "string": { - "title": "Record (simple)", - "type": "string", - "description": "File path of the recording. Supports the `.mp4`, `.webm`, and `.gif` extensions. If not specified, the file name is the ID of the step, and the extension is `.mp4`.", - "pattern": "([A-Za-z0-9_-]*\\.(mp4|webm|gif)$|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - "object": { - "type": "object", - "properties": { - "path": { - "type": "string", - "description": "File path of the recording. Supports the `.mp4`, `.webm`, and `.gif` extensions. If not specified, the file name is the ID of the step, and the extension is `.mp4`.", - "pattern": "([A-Za-z0-9_-]*\\.(mp4|webm|gif)$|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - "directory": { - "type": "string", - "description": "Directory of the file. If the directory doesn't exist, creates the directory.", - "transform": [ - "trim" - ] - }, - "overwrite": { - "type": "string", - "description": "If `true`, overwrites the existing recording at `path` if it exists.", - "enum": [ - "true", - "false" - ] - } - }, - "title": "Record (detailed)" - } - } - }, "examples": [ true, "results.mp4", diff --git a/common/dist/schemas/report_v3.schema.json b/common/dist/schemas/report_v3.schema.json index 4d0f1ce..2b51717 100644 --- a/common/dist/schemas/report_v3.schema.json +++ b/common/dist/schemas/report_v3.schema.json @@ -6245,6 +6245,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -6424,16 +6428,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -6476,6 +6480,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -6651,8 +6658,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -6669,7 +6686,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -6831,16 +6848,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -6883,6 +6900,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -7058,8 +7078,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -7076,7 +7106,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -7608,6 +7638,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -7787,16 +7821,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -7839,6 +7873,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -8014,8 +8051,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -8032,7 +8079,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -8194,16 +8241,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -8246,6 +8293,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -8421,8 +8471,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -8439,7 +8499,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -16106,6 +16166,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -16285,16 +16349,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -16337,6 +16401,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -16512,8 +16579,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -16530,7 +16607,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -16692,16 +16769,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -16744,6 +16821,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -16919,8 +16999,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -16937,7 +17027,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -17469,6 +17559,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -17648,16 +17742,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -17700,6 +17794,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -17875,8 +17972,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -17893,7 +18000,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -18055,16 +18162,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -18107,6 +18214,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -18282,8 +18392,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -18300,7 +18420,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", diff --git a/common/dist/schemas/resolvedTests_v3.schema.json b/common/dist/schemas/resolvedTests_v3.schema.json index 7081445..e224dae 100644 --- a/common/dist/schemas/resolvedTests_v3.schema.json +++ b/common/dist/schemas/resolvedTests_v3.schema.json @@ -5825,6 +5825,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -6004,16 +6008,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -6056,6 +6060,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -6231,8 +6238,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -6249,7 +6266,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -6411,16 +6428,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -6463,6 +6480,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -6638,8 +6658,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -6656,7 +6686,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -7188,6 +7218,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -7367,16 +7401,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -7419,6 +7453,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -7594,8 +7631,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -7612,7 +7659,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -7774,16 +7821,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -7826,6 +7873,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -8001,8 +8051,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -8019,7 +8079,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -16117,6 +16177,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -16296,16 +16360,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -16348,6 +16412,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -16523,8 +16590,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -16541,7 +16618,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -16703,16 +16780,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -16755,6 +16832,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -16930,8 +17010,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -16948,7 +17038,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -17480,6 +17570,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -17659,16 +17753,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -17711,6 +17805,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -17886,8 +17983,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -17904,7 +18011,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -18066,16 +18173,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -18118,6 +18225,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -18293,8 +18403,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -18311,7 +18431,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -27178,6 +27298,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -27357,16 +27481,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -27409,6 +27533,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -27584,8 +27711,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -27602,7 +27739,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -27764,16 +27901,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -27816,6 +27953,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -27991,8 +28131,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -28009,7 +28159,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -28541,6 +28691,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -28720,16 +28874,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -28772,6 +28926,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -28947,8 +29104,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -28965,7 +29132,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -29127,16 +29294,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -29179,6 +29346,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -29354,8 +29524,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -29372,7 +29552,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -37039,6 +37219,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -37218,16 +37402,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -37270,6 +37454,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -37445,8 +37632,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -37463,7 +37660,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -37625,16 +37822,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -37677,6 +37874,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -37852,8 +38052,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -37870,7 +38080,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -38402,6 +38612,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -38581,16 +38795,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -38633,6 +38847,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -38808,8 +39025,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -38826,7 +39053,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -38988,16 +39215,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -39040,6 +39267,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -39215,8 +39445,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -39233,7 +39473,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", diff --git a/common/dist/schemas/runCode_v3.schema.json b/common/dist/schemas/runCode_v3.schema.json index 23899a5..e3be439 100644 --- a/common/dist/schemas/runCode_v3.schema.json +++ b/common/dist/schemas/runCode_v3.schema.json @@ -92,98 +92,6 @@ "title": "Run code (detailed)" } ], - "components": { - "schemas": { - "object": { - "type": "object", - "required": [ - "code", - "language" - ], - "properties": { - "language": { - "type": "string", - "description": "Language of the code to run.", - "enum": [ - "python", - "bash", - "javascript" - ] - }, - "code": { - "description": "Code to run.", - "type": "string" - }, - "args": { - "type": "array", - "description": "Arguments for the command.", - "items": { - "anyOf": [ - { - "type": "string" - } - ] - }, - "default": [] - }, - "workingDirectory": { - "type": "string", - "description": "Working directory for the command.", - "default": "." - }, - "exitCodes": { - "type": "array", - "description": "Expected exit codes of the command. If the command's actual exit code isn't in this list, the step fails.", - "items": { - "anyOf": [ - { - "type": "integer" - } - ] - }, - "default": [ - 0 - ] - }, - "stdio": { - "type": "string", - "description": "Content expected in the command's output. If the expected content can't be found in the command's output (either stdout or stderr), the step fails. Supports strings and regular expressions. To use a regular expression, the string must start and end with a forward slash, like in `/^hello-world.*/`." - }, - "path": { - "type": "string", - "description": "File path to save the command's output, relative to `directory`." - }, - "directory": { - "type": "string", - "description": "Directory to save the command's output. If the directory doesn't exist, creates the directory. If not specified, the directory is your media directory." - }, - "maxVariation": { - "type": "number", - "description": "Allowed variation in percentage of text different between the current output and previously saved output. If the difference between the current output and the previous output is greater than `maxVariation`, the step fails. If output doesn't exist at `path`, this value is ignored.", - "default": 0, - "minimum": 0, - "maximum": 1 - }, - "overwrite": { - "type": "string", - "description": "If `true`, overwrites the existing output at `path` if it exists.\nIf `aboveVariation`, overwrites the existing output at `path` if the difference between the new output and the existing output is greater than `maxVariation`.", - "enum": [ - "true", - "false", - "aboveVariation" - ], - "default": "aboveVariation" - }, - "timeout": { - "type": "integer", - "description": "Max time in milliseconds the command is allowed to run. If the command runs longer than this, the step fails.", - "default": 60000 - } - }, - "title": "Run code (detailed)" - } - } - }, "examples": [ { "language": "javascript", diff --git a/common/dist/schemas/runShell_v3.schema.json b/common/dist/schemas/runShell_v3.schema.json index a65de4f..dc0465b 100644 --- a/common/dist/schemas/runShell_v3.schema.json +++ b/common/dist/schemas/runShell_v3.schema.json @@ -91,97 +91,6 @@ "title": "Run shell command (detailed)" } ], - "components": { - "schemas": { - "string": { - "title": "Run shell command (simple)", - "description": "Command to perform in the machine's default shell.", - "type": "string", - "transform": [ - "trim" - ] - }, - "object": { - "type": "object", - "required": [ - "command" - ], - "additionalProperties": false, - "properties": { - "command": { - "type": "string", - "description": "Command to perform in the machine's default shell." - }, - "args": { - "type": "array", - "description": "Arguments for the command.", - "items": { - "anyOf": [ - { - "type": "string" - } - ] - }, - "default": [] - }, - "workingDirectory": { - "type": "string", - "description": "Working directory for the command.", - "default": "." - }, - "exitCodes": { - "type": "array", - "description": "Expected exit codes of the command. If the command's actual exit code isn't in this list, the step fails.", - "items": { - "anyOf": [ - { - "type": "integer" - } - ] - }, - "default": [ - 0 - ] - }, - "stdio": { - "type": "string", - "description": "Content expected in the command's stdout or stderr. If the expected content can't be found in the command's stdout or stderr, the step fails. Supports strings and regular expressions. To use a regular expression, the string must start and end with a forward slash, like in `/^hello-world.*/`." - }, - "path": { - "type": "string", - "description": "File path to save the command's output, relative to `directory`." - }, - "directory": { - "type": "string", - "description": "Directory to save the command's output. If the directory doesn't exist, creates the directory. If not specified, the directory is your media directory." - }, - "maxVariation": { - "type": "number", - "description": "Allowed variation in percentage of text different between the current output and previously saved output. If the difference between the current output and the previous output is greater than `maxVariation`, the step fails. If output doesn't exist at `path`, this value is ignored.", - "default": 0, - "minimum": 0, - "maximum": 1 - }, - "overwrite": { - "type": "string", - "description": "If `true`, overwrites the existing output at `path` if it exists.\nIf `aboveVariation`, overwrites the existing output at `path` if the difference between the new output and the existing output is greater than `maxVariation`.", - "enum": [ - "true", - "false", - "aboveVariation" - ], - "default": "aboveVariation" - }, - "timeout": { - "type": "integer", - "description": "Max time in milliseconds the command is allowed to run. If the command runs longer than this, the step fails.", - "default": 60000 - } - }, - "title": "Run shell command (detailed)" - } - } - }, "examples": [ "docker run hello-world", { diff --git a/common/dist/schemas/saveCookie_v3.schema.json b/common/dist/schemas/saveCookie_v3.schema.json index 96f8565..c4f112f 100644 --- a/common/dist/schemas/saveCookie_v3.schema.json +++ b/common/dist/schemas/saveCookie_v3.schema.json @@ -107,113 +107,6 @@ "title": "Save cookie (detailed)" } ], - "components": { - "schemas": { - "string": { - "type": "string", - "title": "Cookie name", - "description": "Name of the specific cookie to save. Will be saved to a default file path or environment variable.", - "pattern": "^[A-Za-z0-9_./\\-]+$", - "transform": [ - "trim" - ] - }, - "object": { - "type": "object", - "additionalProperties": false, - "properties": { - "$schema": { - "description": "Optional self-describing schema URI for linters", - "type": "string", - "format": "uri-reference" - }, - "name": { - "type": "string", - "title": "Cookie name", - "description": "Name of the specific cookie to save.", - "pattern": "^[A-Za-z0-9_.-]+$", - "transform": [ - "trim" - ] - }, - "variable": { - "type": "string", - "title": "Environment variable name", - "description": "Environment variable name to store the cookie as JSON string.", - "pattern": "^[A-Za-z_][A-Za-z0-9_]*$", - "transform": [ - "trim" - ] - }, - "path": { - "type": "string", - "title": "Cookie file path", - "description": "File path to save the cookie, relative to directory. Uses Netscape cookie format.", - "transform": [ - "trim" - ] - }, - "directory": { - "type": "string", - "title": "Directory path", - "description": "Directory to save the cookie file. If not specified, uses output directory.", - "transform": [ - "trim" - ] - }, - "overwrite": { - "type": "boolean", - "title": "Overwrite existing file", - "description": "Whether to overwrite existing cookie file.", - "default": false - }, - "domain": { - "type": "string", - "title": "Cookie domain", - "description": "Specific domain to filter the cookie by (optional).", - "transform": [ - "trim" - ] - } - }, - "required": [ - "name" - ], - "anyOf": [ - { - "required": [ - "path" - ], - "not": { - "required": [ - "variable" - ] - } - }, - { - "required": [ - "variable" - ], - "not": { - "anyOf": [ - { - "required": [ - "path" - ] - }, - { - "required": [ - "directory" - ] - } - ] - } - } - ], - "title": "Save cookie (detailed)" - } - } - }, "examples": [ "session_token", "test_env_cookie", diff --git a/common/dist/schemas/screenshot_v3.schema.json b/common/dist/schemas/screenshot_v3.schema.json index e9b641f..8e2c7b2 100644 --- a/common/dist/schemas/screenshot_v3.schema.json +++ b/common/dist/schemas/screenshot_v3.schema.json @@ -415,6 +415,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -594,16 +598,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -646,6 +650,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -821,8 +828,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -839,7 +856,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -1001,16 +1018,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -1053,6 +1070,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -1228,8 +1248,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -1246,7 +1276,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -1364,1519 +1394,6 @@ "description": "If `true`, captures a screenshot. If `false`, doesn't capture a screenshot." } ], - "components": { - "schemas": { - "path": { - "title": "Screenshot (simple)", - "description": "File path of the PNG file. Accepts absolute paths. If not specified, the file name is the ID of the step.", - "type": "string", - "pattern": "([A-Za-z0-9_-]*\\.(png|PNG)$|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - "object": { - "type": "object", - "additionalProperties": false, - "properties": { - "path": { - "title": "Screenshot (simple)", - "description": "File path of the PNG file. Accepts absolute paths. If not specified, the file name is the ID of the step.", - "type": "string", - "pattern": "([A-Za-z0-9_-]*\\.(png|PNG)$|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - "directory": { - "type": "string", - "description": "Directory of the PNG file. If the directory doesn't exist, creates the directory.", - "transform": [ - "trim" - ] - }, - "maxVariation": { - "type": "number", - "description": "Allowed variation in percentage of pixels between the new screenshot and the existing screenshot at `path`. If the difference between the new screenshot and the existing screenshot is greater than `maxVariation`, the step fails. If a screenshot doesn't exist at `path`, this value is ignored.", - "default": 0.05, - "minimum": 0, - "maximum": 1 - }, - "overwrite": { - "type": "string", - "description": "If `true`, overwrites the existing screenshot at `path` if it exists.\nIf `aboveVariation`, overwrites the existing screenshot at `path` if the difference between the new screenshot and the existing screenshot is greater than `maxVariation`.", - "enum": [ - "true", - "false", - "aboveVariation" - ], - "default": "aboveVariation" - }, - "crop": { - "anyOf": [ - { - "title": "Crop by element (simple)", - "type": "string", - "description": "Display text or selector of the element to screenshot." - }, - { - "title": "Crop by element (detailed)", - "type": "object", - "description": "Crop the screenshot to a specific element.", - "additionalProperties": false, - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "properties": { - "elementText": { - "type": "string", - "description": "Display text of the element to screenshot." - }, - "selector": { - "type": "string", - "description": "Selector of the element to screenshot." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - }, - "padding": { - "anyOf": [ - { - "title": "Padding (simple)", - "type": "number", - "description": "Padding in pixels to add to the bounds of the element.", - "minimum": 0 - }, - { - "type": "object", - "additionalProperties": false, - "properties": { - "top": { - "type": "number", - "minimum": 0 - }, - "right": { - "type": "number", - "minimum": 0 - }, - "bottom": { - "type": "number", - "minimum": 0 - }, - "left": { - "type": "number", - "minimum": 0 - } - }, - "title": "Padding (detailed)", - "description": "Padding in pixels to add to the bounds of the element." - } - ] - } - } - } - ] - }, - "annotations": { - "type": "array", - "description": "Array of annotations to add to the screenshot.", - "items": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "annotation", - "type": "object", - "description": "A visual annotation to add to the screenshot. Annotations can point to elements on the page (via `find`) or be positioned freely within the viewport.", - "anyOf": [ - { - "required": [ - "arrow" - ], - "not": { - "required": [ - "text", - "rectangle", - "circle", - "line", - "callout", - "highlight", - "blur" - ] - } - }, - { - "required": [ - "text" - ], - "not": { - "required": [ - "arrow", - "rectangle", - "circle", - "line", - "callout", - "highlight", - "blur" - ] - } - }, - { - "required": [ - "rectangle" - ], - "not": { - "required": [ - "arrow", - "text", - "circle", - "line", - "callout", - "highlight", - "blur" - ] - } - }, - { - "required": [ - "circle" - ], - "not": { - "required": [ - "arrow", - "text", - "rectangle", - "line", - "callout", - "highlight", - "blur" - ] - } - }, - { - "required": [ - "line" - ], - "not": { - "required": [ - "arrow", - "text", - "rectangle", - "circle", - "callout", - "highlight", - "blur" - ] - } - }, - { - "required": [ - "callout" - ], - "not": { - "required": [ - "arrow", - "text", - "rectangle", - "circle", - "line", - "highlight", - "blur" - ] - } - }, - { - "required": [ - "highlight" - ], - "not": { - "required": [ - "arrow", - "text", - "rectangle", - "circle", - "line", - "callout", - "blur" - ] - } - }, - { - "required": [ - "blur" - ], - "not": { - "required": [ - "arrow", - "text", - "rectangle", - "circle", - "line", - "callout", - "highlight" - ] - } - } - ], - "properties": { - "find": { - "type": "object", - "description": "Element on the page to annotate.", - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "additionalProperties": false, - "properties": { - "selector": { - "type": "string", - "description": "Selector of the element to annotate." - }, - "elementText": { - "type": "string", - "description": "Display text of the element to annotate." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - } - } - }, - "position": { - "anyOf": [ - { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - { - "type": "string", - "enum": [ - "top", - "bottom", - "left", - "right", - "center", - "top-left", - "top-right", - "bottom-left", - "bottom-right" - ], - "description": "Position relative to the element (if `find` is provided) or to the viewport." - } - ] - }, - "arrow": { - "type": "object", - "description": "Configuration for arrow annotations.", - "properties": { - "from": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "to": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "color": { - "type": "string", - "description": "Color of the arrow (hex, rgb, or named color).", - "default": "#FF0000" - }, - "strokeWidth": { - "type": "number", - "description": "Width of the arrow line in pixels.", - "minimum": 1, - "default": 3 - }, - "headSize": { - "type": "number", - "description": "Size of the arrowhead in pixels.", - "minimum": 1, - "default": 15 - } - } - }, - "text": { - "type": "object", - "description": "Configuration for text annotations.", - "properties": { - "content": { - "type": "string", - "description": "Text content to display." - }, - "fontSize": { - "type": "number", - "description": "Font size in pixels.", - "minimum": 1, - "default": 16 - }, - "fontFamily": { - "type": "string", - "description": "Font family name.", - "default": "Arial" - }, - "color": { - "type": "string", - "description": "Text color (hex, rgb, or named color).", - "default": "#000000" - }, - "backgroundColor": { - "type": "string", - "description": "Background color for the text box.", - "default": "#FFFFFF" - }, - "padding": { - "anyOf": [ - { - "type": "number", - "description": "Padding in pixels on all sides.", - "minimum": 0 - }, - { - "type": "object", - "additionalProperties": false, - "properties": { - "top": { - "type": "number", - "minimum": 0 - }, - "right": { - "type": "number", - "minimum": 0 - }, - "bottom": { - "type": "number", - "minimum": 0 - }, - "left": { - "type": "number", - "minimum": 0 - } - } - } - ], - "default": 5 - }, - "maxWidth": { - "type": "number", - "description": "Maximum width of the text box. Text will wrap.", - "minimum": 1 - }, - "opacity": { - "type": "number", - "description": "Opacity of the text and background (0-1).", - "minimum": 0, - "maximum": 1, - "default": 1 - } - }, - "required": [ - "content" - ] - }, - "rectangle": { - "type": "object", - "description": "Configuration for rectangle annotations.", - "properties": { - "width": { - "type": "number", - "description": "Width of the rectangle in pixels.", - "minimum": 1 - }, - "height": { - "type": "number", - "description": "Height of the rectangle in pixels.", - "minimum": 1 - }, - "fill": { - "type": "string", - "description": "Fill color (hex, rgb, or named color). Use 'transparent' for no fill.", - "default": "transparent" - }, - "stroke": { - "type": "string", - "description": "Border color (hex, rgb, or named color).", - "default": "#FF0000" - }, - "strokeWidth": { - "type": "number", - "description": "Border width in pixels.", - "minimum": 0, - "default": 2 - }, - "opacity": { - "type": "number", - "description": "Opacity (0-1).", - "minimum": 0, - "maximum": 1, - "default": 1 - }, - "rx": { - "type": "number", - "description": "Horizontal corner radius for rounded rectangles.", - "minimum": 0, - "default": 0 - }, - "ry": { - "type": "number", - "description": "Vertical corner radius for rounded rectangles.", - "minimum": 0, - "default": 0 - } - } - }, - "circle": { - "type": "object", - "description": "Configuration for circle annotations.", - "properties": { - "radius": { - "type": "number", - "description": "Radius of the circle in pixels.", - "minimum": 1, - "default": 30 - }, - "fill": { - "type": "string", - "description": "Fill color (hex, rgb, or named color). Use 'transparent' for no fill.", - "default": "transparent" - }, - "stroke": { - "type": "string", - "description": "Border color (hex, rgb, or named color).", - "default": "#FF0000" - }, - "strokeWidth": { - "type": "number", - "description": "Border width in pixels.", - "minimum": 0, - "default": 2 - }, - "opacity": { - "type": "number", - "description": "Opacity (0-1).", - "minimum": 0, - "maximum": 1, - "default": 1 - } - } - }, - "line": { - "type": "object", - "description": "Configuration for line annotations.", - "properties": { - "from": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "to": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "color": { - "type": "string", - "description": "Color of the line (hex, rgb, or named color).", - "default": "#000000" - }, - "strokeWidth": { - "type": "number", - "description": "Width of the line in pixels.", - "minimum": 1, - "default": 2 - }, - "dashArray": { - "type": "array", - "description": "Dash pattern [dash, gap]. E.g., [5, 5] for dashed line.", - "items": { - "type": "number", - "minimum": 0 - } - } - }, - "required": [ - "from", - "to" - ] - }, - "callout": { - "type": "object", - "description": "Configuration for callout annotations (text with arrow).", - "properties": { - "content": { - "type": "string", - "description": "Text content to display." - }, - "target": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "textPosition": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "fontSize": { - "type": "number", - "description": "Font size in pixels.", - "minimum": 1, - "default": 14 - }, - "color": { - "type": "string", - "description": "Text color.", - "default": "#000000" - }, - "backgroundColor": { - "type": "string", - "description": "Background color for the text box.", - "default": "#FFFFCC" - }, - "arrowColor": { - "type": "string", - "description": "Color of the arrow.", - "default": "#000000" - }, - "maxWidth": { - "type": "number", - "description": "Maximum width of the text box.", - "minimum": 1 - } - }, - "required": [ - "content", - "target" - ] - }, - "highlight": { - "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", - "properties": { - "color": { - "type": "string", - "description": "Highlight color (hex, rgb, or named color).", - "default": "#FFFF00" - }, - "opacity": { - "type": "number", - "description": "Opacity (0-1).", - "minimum": 0, - "maximum": 1, - "default": 0.3 - } - } - }, - "blur": { - "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", - "properties": { - "intensity": { - "type": "number", - "description": "Blur intensity level.", - "minimum": 1, - "default": 10 - }, - "width": { - "type": "number", - "description": "Width of the blur area in pixels.", - "minimum": 1 - }, - "height": { - "type": "number", - "description": "Height of the blur area in pixels.", - "minimum": 1 - } - } - } - }, - "components": { - "schemas": { - "arrow_properties": { - "type": "object", - "description": "Configuration for arrow annotations.", - "properties": { - "from": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "to": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "color": { - "type": "string", - "description": "Color of the arrow (hex, rgb, or named color).", - "default": "#FF0000" - }, - "strokeWidth": { - "type": "number", - "description": "Width of the arrow line in pixels.", - "minimum": 1, - "default": 3 - }, - "headSize": { - "type": "number", - "description": "Size of the arrowhead in pixels.", - "minimum": 1, - "default": 15 - } - } - }, - "text_properties": { - "type": "object", - "description": "Configuration for text annotations.", - "properties": { - "content": { - "type": "string", - "description": "Text content to display." - }, - "fontSize": { - "type": "number", - "description": "Font size in pixels.", - "minimum": 1, - "default": 16 - }, - "fontFamily": { - "type": "string", - "description": "Font family name.", - "default": "Arial" - }, - "color": { - "type": "string", - "description": "Text color (hex, rgb, or named color).", - "default": "#000000" - }, - "backgroundColor": { - "type": "string", - "description": "Background color for the text box.", - "default": "#FFFFFF" - }, - "padding": { - "anyOf": [ - { - "type": "number", - "description": "Padding in pixels on all sides.", - "minimum": 0 - }, - { - "type": "object", - "additionalProperties": false, - "properties": { - "top": { - "type": "number", - "minimum": 0 - }, - "right": { - "type": "number", - "minimum": 0 - }, - "bottom": { - "type": "number", - "minimum": 0 - }, - "left": { - "type": "number", - "minimum": 0 - } - } - } - ], - "default": 5 - }, - "maxWidth": { - "type": "number", - "description": "Maximum width of the text box. Text will wrap.", - "minimum": 1 - }, - "opacity": { - "type": "number", - "description": "Opacity of the text and background (0-1).", - "minimum": 0, - "maximum": 1, - "default": 1 - } - }, - "required": [ - "content" - ] - }, - "rectangle_properties": { - "type": "object", - "description": "Configuration for rectangle annotations.", - "properties": { - "width": { - "type": "number", - "description": "Width of the rectangle in pixels.", - "minimum": 1 - }, - "height": { - "type": "number", - "description": "Height of the rectangle in pixels.", - "minimum": 1 - }, - "fill": { - "type": "string", - "description": "Fill color (hex, rgb, or named color). Use 'transparent' for no fill.", - "default": "transparent" - }, - "stroke": { - "type": "string", - "description": "Border color (hex, rgb, or named color).", - "default": "#FF0000" - }, - "strokeWidth": { - "type": "number", - "description": "Border width in pixels.", - "minimum": 0, - "default": 2 - }, - "opacity": { - "type": "number", - "description": "Opacity (0-1).", - "minimum": 0, - "maximum": 1, - "default": 1 - }, - "rx": { - "type": "number", - "description": "Horizontal corner radius for rounded rectangles.", - "minimum": 0, - "default": 0 - }, - "ry": { - "type": "number", - "description": "Vertical corner radius for rounded rectangles.", - "minimum": 0, - "default": 0 - } - } - }, - "circle_properties": { - "type": "object", - "description": "Configuration for circle annotations.", - "properties": { - "radius": { - "type": "number", - "description": "Radius of the circle in pixels.", - "minimum": 1, - "default": 30 - }, - "fill": { - "type": "string", - "description": "Fill color (hex, rgb, or named color). Use 'transparent' for no fill.", - "default": "transparent" - }, - "stroke": { - "type": "string", - "description": "Border color (hex, rgb, or named color).", - "default": "#FF0000" - }, - "strokeWidth": { - "type": "number", - "description": "Border width in pixels.", - "minimum": 0, - "default": 2 - }, - "opacity": { - "type": "number", - "description": "Opacity (0-1).", - "minimum": 0, - "maximum": 1, - "default": 1 - } - } - }, - "line_properties": { - "type": "object", - "description": "Configuration for line annotations.", - "properties": { - "from": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "to": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "color": { - "type": "string", - "description": "Color of the line (hex, rgb, or named color).", - "default": "#000000" - }, - "strokeWidth": { - "type": "number", - "description": "Width of the line in pixels.", - "minimum": 1, - "default": 2 - }, - "dashArray": { - "type": "array", - "description": "Dash pattern [dash, gap]. E.g., [5, 5] for dashed line.", - "items": { - "type": "number", - "minimum": 0 - } - } - }, - "required": [ - "from", - "to" - ] - }, - "callout_properties": { - "type": "object", - "description": "Configuration for callout annotations (text with arrow).", - "properties": { - "content": { - "type": "string", - "description": "Text content to display." - }, - "target": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "textPosition": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "fontSize": { - "type": "number", - "description": "Font size in pixels.", - "minimum": 1, - "default": 14 - }, - "color": { - "type": "string", - "description": "Text color.", - "default": "#000000" - }, - "backgroundColor": { - "type": "string", - "description": "Background color for the text box.", - "default": "#FFFFCC" - }, - "arrowColor": { - "type": "string", - "description": "Color of the arrow.", - "default": "#000000" - }, - "maxWidth": { - "type": "number", - "description": "Maximum width of the text box.", - "minimum": 1 - } - }, - "required": [ - "content", - "target" - ] - }, - "highlight_properties": { - "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", - "properties": { - "color": { - "type": "string", - "description": "Highlight color (hex, rgb, or named color).", - "default": "#FFFF00" - }, - "opacity": { - "type": "number", - "description": "Opacity (0-1).", - "minimum": 0, - "maximum": 1, - "default": 0.3 - } - } - }, - "blur_properties": { - "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", - "properties": { - "intensity": { - "type": "number", - "description": "Blur intensity level.", - "minimum": 1, - "default": 10 - }, - "width": { - "type": "number", - "description": "Width of the blur area in pixels.", - "minimum": 1 - }, - "height": { - "type": "number", - "description": "Height of the blur area in pixels.", - "minimum": 1 - } - } - }, - "point": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "padding": { - "type": "object", - "additionalProperties": false, - "properties": { - "top": { - "type": "number", - "minimum": 0 - }, - "right": { - "type": "number", - "minimum": 0 - }, - "bottom": { - "type": "number", - "minimum": 0 - }, - "left": { - "type": "number", - "minimum": 0 - } - } - } - } - }, - "examples": [ - { - "find": { - "selector": "#submit-button" - }, - "arrow": { - "from": { - "x": 0, - "y": -50 - }, - "to": { - "x": 0, - "y": 0 - }, - "color": "#00FF00", - "strokeWidth": 4, - "headSize": 20 - } - }, - { - "position": "top-right", - "text": { - "content": "Important Notice", - "fontSize": 18, - "color": "#FFFFFF", - "backgroundColor": "#0000FF", - "padding": 10, - "maxWidth": 200, - "opacity": 0.9 - } - }, - { - "find": { - "elementClass": [ - "sensitive-info", - "/^private-/" - ] - }, - "blur": { - "intensity": 15, - "width": 200, - "height": 50 - } - } - ] - } - } - }, - "title": "Capture screenshot (detailed)" - }, - "crop_element": { - "title": "Crop by element (detailed)", - "type": "object", - "description": "Crop the screenshot to a specific element.", - "additionalProperties": false, - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "properties": { - "elementText": { - "type": "string", - "description": "Display text of the element to screenshot." - }, - "selector": { - "type": "string", - "description": "Selector of the element to screenshot." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - }, - "padding": { - "anyOf": [ - { - "title": "Padding (simple)", - "type": "number", - "description": "Padding in pixels to add to the bounds of the element.", - "minimum": 0 - }, - { - "type": "object", - "additionalProperties": false, - "properties": { - "top": { - "type": "number", - "minimum": 0 - }, - "right": { - "type": "number", - "minimum": 0 - }, - "bottom": { - "type": "number", - "minimum": 0 - }, - "left": { - "type": "number", - "minimum": 0 - } - }, - "title": "Padding (detailed)", - "description": "Padding in pixels to add to the bounds of the element." - } - ] - } - } - }, - "padding": { - "type": "object", - "additionalProperties": false, - "properties": { - "top": { - "type": "number", - "minimum": 0 - }, - "right": { - "type": "number", - "minimum": 0 - }, - "bottom": { - "type": "number", - "minimum": 0 - }, - "left": { - "type": "number", - "minimum": 0 - } - }, - "title": "Padding (detailed)", - "description": "Padding in pixels to add to the bounds of the element." - } - } - }, "examples": [ true, "image.png", diff --git a/common/dist/schemas/spec_v3.schema.json b/common/dist/schemas/spec_v3.schema.json index 3302ef8..4c83b74 100644 --- a/common/dist/schemas/spec_v3.schema.json +++ b/common/dist/schemas/spec_v3.schema.json @@ -6227,6 +6227,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -6406,16 +6410,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -6458,6 +6462,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -6633,8 +6640,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -6651,7 +6668,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -6813,16 +6830,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -6865,6 +6882,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -7040,8 +7060,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -7058,7 +7088,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -7590,6 +7620,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -7769,16 +7803,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -7821,6 +7855,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -7996,8 +8033,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -8014,7 +8061,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -8176,16 +8223,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -8228,6 +8275,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -8403,8 +8453,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -8421,7 +8481,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -16088,6 +16148,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -16267,16 +16331,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -16319,6 +16383,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -16494,8 +16561,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -16512,7 +16589,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -16674,16 +16751,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -16726,6 +16803,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -16901,8 +16981,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -16919,7 +17009,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -17451,6 +17541,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -17630,16 +17724,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -17682,6 +17776,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -17857,8 +17954,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -17875,7 +17982,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -18037,16 +18144,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -18089,6 +18196,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -18264,8 +18374,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -18282,7 +18402,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", diff --git a/common/dist/schemas/step_v3.schema.json b/common/dist/schemas/step_v3.schema.json index 7cb3291..a3ec4a5 100644 --- a/common/dist/schemas/step_v3.schema.json +++ b/common/dist/schemas/step_v3.schema.json @@ -3,117 +3,6 @@ "title": "step", "description": "A step in a test.", "type": "object", - "components": { - "schemas": { - "common": { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { - "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - }, - "title": "Common" - }, - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { - "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - } - }, "anyOf": [ { "allOf": [ @@ -5027,6 +4916,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -5206,16 +5099,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -5258,6 +5151,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -5433,8 +5329,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -5451,7 +5357,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -5613,16 +5519,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -5665,6 +5571,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -5840,8 +5749,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -5858,7 +5777,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -6390,6 +6309,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -6569,16 +6492,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -6621,6 +6544,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -6796,8 +6722,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -6814,7 +6750,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -6976,16 +6912,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -7028,6 +6964,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -7203,8 +7142,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -7221,7 +7170,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", diff --git a/common/dist/schemas/test_v3.schema.json b/common/dist/schemas/test_v3.schema.json index b7e04da..18c1c86 100644 --- a/common/dist/schemas/test_v3.schema.json +++ b/common/dist/schemas/test_v3.schema.json @@ -5626,6 +5626,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -5805,16 +5809,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -5857,6 +5861,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -6032,8 +6039,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -6050,7 +6067,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -6212,16 +6229,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -6264,6 +6281,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -6439,8 +6459,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -6457,7 +6487,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -6989,6 +7019,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -7168,16 +7202,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -7220,6 +7254,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -7395,8 +7432,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -7413,7 +7460,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -7575,16 +7622,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -7627,6 +7674,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -7802,8 +7852,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -7820,7 +7880,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -15487,6 +15547,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -15666,16 +15730,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -15718,6 +15782,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -15893,8 +15960,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -15911,7 +15988,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -16073,16 +16150,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -16125,6 +16202,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -16300,8 +16380,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -16318,7 +16408,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -16850,6 +16940,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -17029,16 +17123,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -17081,6 +17175,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -17256,8 +17353,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -17274,7 +17381,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -17436,16 +17543,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -17488,6 +17595,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -17663,8 +17773,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -17681,7 +17801,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -20083,192 +20203,6 @@ } ], "additionalProperties": false, - "components": { - "schemas": { - "openApi": { - "type": "array", - "items": { - "allOf": [ - { - "version": "1.0.0", - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "openApi", - "type": "object", - "description": "OpenAPI description and configuration.", - "additionalProperties": false, - "anyOf": [ - { - "required": [ - "descriptionPath" - ] - }, - { - "required": [ - "operationId" - ] - } - ], - "properties": { - "name": { - "type": "string", - "description": "Name of the OpenAPI description, as defined in your configuration." - }, - "descriptionPath": { - "type": "string", - "description": "URL or local path to the OpenAPI description." - }, - "definition": { - "type": "object", - "readOnly": true, - "description": "OpenAPI definition object loaded from the `descriptionPath`. This is a resolved version of the OpenAPI description and should not be user-defined.", - "additionalProperties": true, - "title": "OpenAPI definition" - }, - "operationId": { - "type": "string", - "description": "ID of the operation to use for the request." - }, - "server": { - "type": "string", - "description": "Server to use for example requests. Only valid if `useExample` is `request` or `both`. If not specified but an example is used for the request, uses the first server defined in the OpenAPI description." - }, - "validateAgainstSchema": { - "type": "string", - "description": "Validates the request and/or response against the schema in the OpenAPI description. If the request or response doesn't match the schema, the step fails.", - "enum": [ - "request", - "response", - "both", - "none" - ], - "default": "both" - }, - "mockResponse": { - "type": "boolean", - "description": "If `true`, doesn't make the HTTP request, but instead uses the response example or schema from the OpenAPI description as the response data. Useful for creating tests when an API isn't fully implemented yet. If `statusCode` isn't specified, uses the first defined response code." - }, - "statusCode": { - "type": "integer", - "description": "Response code to use for validation, examples, and status code checking. If the response code doesn't match, the step fails. `statusCodes` overrides this value when specified." - }, - "useExample": { - "type": [ - "string" - ], - "description": "Uses the example from the OpenAPI description as the request and response data. If the request or response has multiple examples, specify `exampleKey`. If `statusCode` isn't specified, uses the first defined response code. `requestData`, `requestParams`, and `requestHeaders` override portions of request examples when specified. `responseData` overrides portions of response examples when specified.", - "enum": [ - "request", - "response", - "both", - "none" - ], - "default": "none" - }, - "exampleKey": { - "type": "string", - "description": "Key of the example to use from the `examples` property in the OpenAPI description. If an `examples` key isn't specified or isn't available for a given parameter or object, the `example` property value is used.", - "default": "" - }, - "headers": { - "type": "object", - "description": "Request headers to add to requests. For example, to set `Authorization` headers for all requests from the specified OpenAPI document. If specified in both a config and a step, the step value overrides the config value.", - "additionalProperties": { - "type": "string" - }, - "title": "OpenAPI request headers" - } - }, - "components": { - "schemas": { - "operationId": { - "type": "string", - "description": "ID of the operation to use for the request." - }, - "descriptionPath": { - "type": "string", - "description": "URL or local path to the OpenAPI description." - } - } - }, - "examples": [ - { - "descriptionPath": "https://petstore.swagger.io/v2/swagger.json" - }, - { - "name": "Reqres", - "operationId": "getUserById" - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "getUserById" - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both" - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both", - "exampleKey": "example1" - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both", - "exampleKey": "example1", - "statusCode": 201 - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both", - "exampleKey": "example1", - "statusCode": 201, - "validateAgainstSchema": "none" - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both", - "exampleKey": "example1", - "statusCode": 201, - "validateAgainstSchema": "none", - "mockResponse": true - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both", - "exampleKey": "example1", - "statusCode": 201, - "validateAgainstSchema": "none", - "mockResponse": true, - "headers": { - "Authorization": "Bearer 12345" - } - } - ] - }, - { - "type": "object", - "not": { - "required": [ - "operationId" - ] - }, - "required": [ - "name", - "descriptionPath" - ], - "title": "OpenAPI description (test)" - } - ] - } - } - } - }, "examples": [ { "steps": [ diff --git a/common/dist/schemas/type_v3.schema.json b/common/dist/schemas/type_v3.schema.json index 566eda5..684a4bf 100644 --- a/common/dist/schemas/type_v3.schema.json +++ b/common/dist/schemas/type_v3.schema.json @@ -108,114 +108,6 @@ "additionalProperties": false } ], - "components": { - "schemas": { - "keys": { - "title": "Type keys (simple)", - "description": "Sequence of keys to enter.", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - } - ] - } - } - ] - }, - "object": { - "title": "Type keys (detailed)", - "type": "object", - "properties": { - "keys": { - "title": "Type keys (simple)", - "description": "Sequence of keys to enter.", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - } - ] - } - } - ] - }, - "inputDelay": { - "type": "number", - "description": "Delay in milliseconds between each key press during a recording", - "default": 100 - }, - "selector": { - "type": "string", - "description": "Selector for the element to type into. If not specified, the typing occurs in the active element." - }, - "elementText": { - "type": "string", - "description": "Display text of the element to type into. If combined with other element finding fields, the element must match all specified criteria." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - } - }, - "required": [ - "keys" - ], - "additionalProperties": false - } - } - }, "examples": [ "kittens", [ diff --git a/common/dist/schemas/wait_v3.schema.json b/common/dist/schemas/wait_v3.schema.json index 0374d01..014333a 100644 --- a/common/dist/schemas/wait_v3.schema.json +++ b/common/dist/schemas/wait_v3.schema.json @@ -21,18 +21,6 @@ "title": "Wait (boolean)" } ], - "components": { - "schemas": { - "string": { - "title": "Wait (environment variable)", - "type": "string", - "pattern": "(\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - } - } - }, "examples": [ 5000, "$WAIT_DURATION", diff --git a/common/package-lock.json b/common/package-lock.json index 633aa5a..a3f9052 100644 --- a/common/package-lock.json +++ b/common/package-lock.json @@ -202,6 +202,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", diff --git a/common/src/schemas/dereferenceSchemas.js b/common/src/schemas/dereferenceSchemas.js index cd1d7c5..e530104 100644 --- a/common/src/schemas/dereferenceSchemas.js +++ b/common/src/schemas/dereferenceSchemas.js @@ -26,6 +26,7 @@ async function dereferenceSchemas() { // These files should be present in the input directory const files = [ // v3 schemas + "annotation_v3.schema.json", "checkLink_v3.schema.json", "click_v3.schema.json", "config_v3.schema.json", @@ -116,6 +117,8 @@ async function dereferenceSchemas() { schema = await parser.dereference(schema); // Delete $id attributes schema = deleteDollarIds(schema); + // Delete components section (no longer needed after dereferencing) + schema = deleteComponents(schema); // Write to file fs.writeFileSync(outputFilePath, JSON.stringify(schema, null, 2)); @@ -203,3 +206,18 @@ function deleteDollarIds(schema) { } return schema; } + +/** + * Removes the `components` property from a dereferenced JSON schema object. + * After dereferencing, the components section contains unreferenced definitions + * and can be safely removed to reduce schema size. + * + * @param {object} schema - The dereferenced JSON schema object to process. + * @returns {object} The schema object with the `components` property deleted. + */ +function deleteComponents(schema) { + if (schema && typeof schema === "object" && schema.components) { + delete schema.components; + } + return schema; +} diff --git a/common/src/schemas/output_schemas/annotation_v3.schema.json b/common/src/schemas/output_schemas/annotation_v3.schema.json new file mode 100644 index 0000000..4064939 --- /dev/null +++ b/common/src/schemas/output_schemas/annotation_v3.schema.json @@ -0,0 +1,732 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "annotation", + "type": "object", + "description": "A visual annotation to add to the screenshot. Annotations can point to elements on the page (via `find`) or be positioned freely within the viewport.", + "anyOf": [ + { + "required": [ + "arrow" + ], + "not": { + "required": [ + "text", + "rectangle", + "circle", + "line", + "callout", + "highlight", + "blur" + ] + } + }, + { + "required": [ + "text" + ], + "not": { + "required": [ + "arrow", + "rectangle", + "circle", + "line", + "callout", + "highlight", + "blur" + ] + } + }, + { + "required": [ + "rectangle" + ], + "not": { + "required": [ + "arrow", + "text", + "circle", + "line", + "callout", + "highlight", + "blur" + ] + } + }, + { + "required": [ + "circle" + ], + "not": { + "required": [ + "arrow", + "text", + "rectangle", + "line", + "callout", + "highlight", + "blur" + ] + } + }, + { + "required": [ + "line" + ], + "not": { + "required": [ + "arrow", + "text", + "rectangle", + "circle", + "callout", + "highlight", + "blur" + ] + } + }, + { + "required": [ + "callout" + ], + "not": { + "required": [ + "arrow", + "text", + "rectangle", + "circle", + "line", + "highlight", + "blur" + ] + } + }, + { + "required": [ + "highlight" + ], + "not": { + "required": [ + "arrow", + "text", + "rectangle", + "circle", + "line", + "callout", + "blur" + ] + } + }, + { + "required": [ + "blur" + ], + "not": { + "required": [ + "arrow", + "text", + "rectangle", + "circle", + "line", + "callout", + "highlight" + ] + } + } + ], + "properties": { + "find": { + "type": "object", + "description": "Element on the page to annotate.", + "anyOf": [ + { + "required": [ + "selector" + ] + }, + { + "required": [ + "elementText" + ] + }, + { + "required": [ + "elementId" + ] + }, + { + "required": [ + "elementTestId" + ] + }, + { + "required": [ + "elementClass" + ] + }, + { + "required": [ + "elementAttribute" + ] + }, + { + "required": [ + "elementAria" + ] + } + ], + "additionalProperties": false, + "properties": { + "selector": { + "type": "string", + "description": "Selector of the element to annotate." + }, + "elementText": { + "type": "string", + "description": "Display text of the element to annotate." + }, + "elementTestId": { + "type": "string", + "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementClass": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "array", + "items": { + "type": "string" + } + } + ], + "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." + }, + "elementAttribute": { + "type": "object", + "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", + "additionalProperties": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + } + ] + } + }, + "elementAria": { + "type": "string", + "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." + } + } + }, + "position": { + "anyOf": [ + { + "type": "object", + "description": "A coordinate point (x, y).", + "properties": { + "x": { + "type": "number", + "description": "X coordinate in pixels." + }, + "y": { + "type": "number", + "description": "Y coordinate in pixels." + } + }, + "required": [ + "x", + "y" + ] + }, + { + "type": "string", + "enum": [ + "top", + "bottom", + "left", + "right", + "center", + "top-left", + "top-right", + "bottom-left", + "bottom-right" + ], + "description": "Position relative to the element (if `find` is provided) or to the viewport." + } + ] + }, + "arrow": { + "type": "object", + "description": "Configuration for arrow annotations.", + "properties": { + "from": { + "type": "object", + "description": "A coordinate point (x, y).", + "properties": { + "x": { + "type": "number", + "description": "X coordinate in pixels." + }, + "y": { + "type": "number", + "description": "Y coordinate in pixels." + } + }, + "required": [ + "x", + "y" + ] + }, + "to": { + "type": "object", + "description": "A coordinate point (x, y).", + "properties": { + "x": { + "type": "number", + "description": "X coordinate in pixels." + }, + "y": { + "type": "number", + "description": "Y coordinate in pixels." + } + }, + "required": [ + "x", + "y" + ] + }, + "color": { + "type": "string", + "description": "Color of the arrow (hex, rgb, or named color).", + "default": "#FF0000" + }, + "strokeWidth": { + "type": "number", + "description": "Width of the arrow line in pixels.", + "minimum": 1, + "default": 3 + }, + "headSize": { + "type": "number", + "description": "Size of the arrowhead in pixels.", + "minimum": 1, + "default": 15 + } + } + }, + "text": { + "type": "object", + "description": "Configuration for text annotations.", + "properties": { + "content": { + "type": "string", + "description": "Text content to display." + }, + "fontSize": { + "type": "number", + "description": "Font size in pixels.", + "minimum": 1, + "default": 16 + }, + "fontFamily": { + "type": "string", + "description": "Font family name.", + "default": "Arial" + }, + "color": { + "type": "string", + "description": "Text color (hex, rgb, or named color).", + "default": "#000000" + }, + "backgroundColor": { + "type": "string", + "description": "Background color for the text box.", + "default": "#FFFFFF" + }, + "padding": { + "anyOf": [ + { + "type": "number", + "description": "Padding in pixels on all sides.", + "minimum": 0 + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "top": { + "type": "number", + "minimum": 0 + }, + "right": { + "type": "number", + "minimum": 0 + }, + "bottom": { + "type": "number", + "minimum": 0 + }, + "left": { + "type": "number", + "minimum": 0 + } + } + } + ], + "default": 5 + }, + "maxWidth": { + "type": "number", + "description": "Maximum width of the text box. Text will wrap.", + "minimum": 1 + }, + "opacity": { + "type": "number", + "description": "Opacity of the text and background (0-1).", + "minimum": 0, + "maximum": 1, + "default": 1 + } + }, + "required": [ + "content" + ] + }, + "rectangle": { + "type": "object", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", + "properties": { + "width": { + "type": "number", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", + "minimum": 1 + }, + "fill": { + "type": "string", + "description": "Fill color (hex, rgb, or named color). Use 'transparent' for no fill.", + "default": "transparent" + }, + "stroke": { + "type": "string", + "description": "Border color (hex, rgb, or named color).", + "default": "#FF0000" + }, + "strokeWidth": { + "type": "number", + "description": "Border width in pixels.", + "minimum": 0, + "default": 2 + }, + "opacity": { + "type": "number", + "description": "Opacity (0-1).", + "minimum": 0, + "maximum": 1, + "default": 1 + }, + "rx": { + "type": "number", + "description": "Horizontal corner radius for rounded rectangles.", + "minimum": 0, + "default": 0 + }, + "ry": { + "type": "number", + "description": "Vertical corner radius for rounded rectangles.", + "minimum": 0, + "default": 0 + } + } + }, + "circle": { + "type": "object", + "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], + "properties": { + "radius": { + "type": "number", + "description": "Radius of the circle in pixels.", + "minimum": 1, + "default": 30 + }, + "fill": { + "type": "string", + "description": "Fill color (hex, rgb, or named color). Use 'transparent' for no fill.", + "default": "transparent" + }, + "stroke": { + "type": "string", + "description": "Border color (hex, rgb, or named color).", + "default": "#FF0000" + }, + "strokeWidth": { + "type": "number", + "description": "Border width in pixels.", + "minimum": 0, + "default": 2 + }, + "opacity": { + "type": "number", + "description": "Opacity (0-1).", + "minimum": 0, + "maximum": 1, + "default": 1 + } + } + }, + "line": { + "type": "object", + "description": "Configuration for line annotations.", + "properties": { + "from": { + "type": "object", + "description": "A coordinate point (x, y).", + "properties": { + "x": { + "type": "number", + "description": "X coordinate in pixels." + }, + "y": { + "type": "number", + "description": "Y coordinate in pixels." + } + }, + "required": [ + "x", + "y" + ] + }, + "to": { + "type": "object", + "description": "A coordinate point (x, y).", + "properties": { + "x": { + "type": "number", + "description": "X coordinate in pixels." + }, + "y": { + "type": "number", + "description": "Y coordinate in pixels." + } + }, + "required": [ + "x", + "y" + ] + }, + "color": { + "type": "string", + "description": "Color of the line (hex, rgb, or named color).", + "default": "#000000" + }, + "strokeWidth": { + "type": "number", + "description": "Width of the line in pixels.", + "minimum": 1, + "default": 2 + }, + "dashArray": { + "type": "array", + "description": "Dash pattern [dash, gap]. E.g., [5, 5] for dashed line.", + "items": { + "type": "number", + "minimum": 0 + } + } + }, + "required": [ + "from", + "to" + ] + }, + "callout": { + "type": "object", + "description": "Configuration for callout annotations (text with arrow).", + "properties": { + "content": { + "type": "string", + "description": "Text content to display." + }, + "target": { + "type": "object", + "description": "A coordinate point (x, y).", + "properties": { + "x": { + "type": "number", + "description": "X coordinate in pixels." + }, + "y": { + "type": "number", + "description": "Y coordinate in pixels." + } + }, + "required": [ + "x", + "y" + ] + }, + "textPosition": { + "type": "object", + "description": "A coordinate point (x, y).", + "properties": { + "x": { + "type": "number", + "description": "X coordinate in pixels." + }, + "y": { + "type": "number", + "description": "Y coordinate in pixels." + } + }, + "required": [ + "x", + "y" + ] + }, + "fontSize": { + "type": "number", + "description": "Font size in pixels.", + "minimum": 1, + "default": 14 + }, + "color": { + "type": "string", + "description": "Text color.", + "default": "#000000" + }, + "backgroundColor": { + "type": "string", + "description": "Background color for the text box.", + "default": "#FFFFCC" + }, + "arrowColor": { + "type": "string", + "description": "Color of the arrow.", + "default": "#000000" + }, + "maxWidth": { + "type": "number", + "description": "Maximum width of the text box.", + "minimum": 1 + } + }, + "required": [ + "content", + "target" + ] + }, + "highlight": { + "type": "object", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", + "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "color": { + "type": "string", + "description": "Highlight color (hex, rgb, or named color).", + "default": "#FFFF00" + }, + "opacity": { + "type": "number", + "description": "Opacity (0-1).", + "minimum": 0, + "maximum": 1, + "default": 0.3 + } + } + }, + "blur": { + "type": "object", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", + "properties": { + "intensity": { + "type": "number", + "description": "Blur intensity level.", + "minimum": 1, + "default": 10 + }, + "width": { + "type": "number", + "description": "Width of the blur area in pixels.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the blur area in pixels.", + "minimum": 1 + } + } + } + }, + "examples": [ + { + "find": { + "selector": "#submit-button" + }, + "arrow": { + "from": { + "x": 0, + "y": -50 + }, + "to": { + "x": 0, + "y": 0 + }, + "color": "#00FF00", + "strokeWidth": 4, + "headSize": 20 + } + }, + { + "position": "top-right", + "text": { + "content": "Important Notice", + "fontSize": 18, + "color": "#FFFFFF", + "backgroundColor": "#0000FF", + "padding": 10, + "maxWidth": 200, + "opacity": 0.9 + } + }, + { + "find": { + "elementClass": [ + "sensitive-info", + "/^private-/" + ] + }, + "blur": { + "intensity": 15, + "width": 200, + "height": 50 + } + } + ] +} \ No newline at end of file diff --git a/common/src/schemas/output_schemas/checkLink_v3.schema.json b/common/src/schemas/output_schemas/checkLink_v3.schema.json index ba4b15d..e4aee34 100644 --- a/common/src/schemas/output_schemas/checkLink_v3.schema.json +++ b/common/src/schemas/output_schemas/checkLink_v3.schema.json @@ -63,70 +63,6 @@ } } ], - "components": { - "schemas": { - "string": { - "title": "Check link (detailed)", - "description": "Check if an HTTP or HTTPS URL returns an acceptable status code from a GET request.", - "type": "string", - "pattern": "(^(http://|https://|\\/).*|\\$[A-Za-z0-9_]+$)", - "transform": [ - "trim" - ] - }, - "object": { - "title": "Check link (detailed)", - "description": "Check if an HTTP or HTTPS URL returns an acceptable status code from a GET request.", - "type": "object", - "additionalProperties": false, - "required": [ - "url" - ], - "properties": { - "url": { - "type": "string", - "description": "URL to check. Can be a full URL or a path. If a path is provided, `origin` must be specified.", - "pattern": "(^(http://|https://|/).*|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - "origin": { - "type": "string", - "description": "Protocol and domain to navigate to. Prepended to `url`.", - "transform": [ - "trim" - ] - }, - "statusCodes": { - "description": "Accepted status codes. If the specified URL returns a code other than what is specified here, the action fails.", - "anyOf": [ - { - "type": "integer" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "integer" - } - ] - } - } - ], - "default": [ - 200, - 301, - 302, - 307, - 308 - ] - } - } - } - } - }, "examples": [ "https://www.google.com", "/search", diff --git a/common/src/schemas/output_schemas/click_v3.schema.json b/common/src/schemas/output_schemas/click_v3.schema.json index 7c62e4f..eef79c3 100644 --- a/common/src/schemas/output_schemas/click_v3.schema.json +++ b/common/src/schemas/output_schemas/click_v3.schema.json @@ -115,127 +115,6 @@ "type": "boolean" } ], - "components": { - "schemas": { - "string": { - "title": "Click element (simple)", - "type": "string", - "description": "Identifier for the element to click. Can be a selector, element text, ARIA name, ID, or test ID." - }, - "button": { - "description": "Kind of click to perform.", - "type": "string", - "enum": [ - "left", - "right", - "middle" - ] - }, - "object": { - "title": "Click element (detailed)", - "type": "object", - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "properties": { - "button": { - "description": "Kind of click to perform.", - "type": "string", - "enum": [ - "left", - "right", - "middle" - ] - }, - "elementText": { - "type": "string", - "description": "Display text of the element to click. If combined with other element finding fields, the element must match all specified criteria." - }, - "selector": { - "type": "string", - "description": "Selector of the element to click. If combined with other element finding fields, the element must match all specified criteria." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to click. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to click. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - } - } - } - } - }, "examples": [ true, "right", diff --git a/common/src/schemas/output_schemas/config_v3.schema.json b/common/src/schemas/output_schemas/config_v3.schema.json index f828ad5..69022d1 100644 --- a/common/src/schemas/output_schemas/config_v3.schema.json +++ b/common/src/schemas/output_schemas/config_v3.schema.json @@ -5812,6 +5812,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -5991,16 +5995,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -6043,6 +6047,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -6218,8 +6225,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -6236,7 +6253,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -6398,16 +6415,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -6450,6 +6467,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -6625,8 +6645,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -6643,7 +6673,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -7175,6 +7205,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -7354,16 +7388,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -7406,6 +7440,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -7581,8 +7618,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -7599,7 +7646,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -7761,16 +7808,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -7813,6 +7860,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -7988,8 +8038,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -8006,7 +8066,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -10960,9870 +11020,6 @@ "default": false } }, - "components": { - "schemas": { - "environment": { - "type": "object", - "description": "Environment information for the system running Doc Detective.", - "readOnly": true, - "additionalProperties": false, - "required": [ - "platform" - ], - "properties": { - "workingDirectory": { - "description": "The current working directory of the process running Doc Detective.", - "type": "string" - }, - "platform": { - "description": "The operating system type running Doc Detective.", - "type": "string", - "enum": [ - "linux", - "mac", - "windows" - ] - }, - "arch": { - "description": "The processor architecture of the system running Doc Detective.", - "type": "string", - "enum": [ - "arm32", - "arm64", - "x32", - "x64" - ] - } - }, - "title": "Environment details" - }, - "markupDefinition": { - "type": "object", - "properties": { - "name": { - "description": "Name of the markup definition", - "type": "string" - }, - "regex": { - "description": "Regular expressions to match the markup type.", - "anyOf": [ - { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "minItems": 1, - "items": { - "type": "string" - } - } - ] - } - ] - }, - "batchMatches": { - "description": "If `true`, all matches are combined into a single string.", - "type": "boolean", - "default": false - }, - "actions": { - "description": "Actions to perform when the markup type is detected.", - "anyOf": [ - { - "type": "string", - "enum": [ - "checkLink", - "click", - "find", - "goTo", - "httpRequest", - "loadCookie", - "loadVariables", - "record", - "runCode", - "runShell", - "saveCookie", - "screenshot", - "stopRecord", - "type", - "wait" - ] - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string", - "enum": [ - "checkLink", - "click", - "find", - "goTo", - "httpRequest", - "loadCookie", - "loadVariables", - "record", - "runCode", - "runShell", - "saveCookie", - "screenshot", - "stopRecord", - "type", - "wait" - ] - }, - { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "step", - "description": "A step in a test.", - "type": "object", - "components": { - "schemas": { - "common": { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { - "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - }, - "title": "Common" - }, - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { - "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - } - }, - "anyOf": [ - { - "allOf": [ - { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { - "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - }, - "title": "Common" - }, - { - "type": "object", - "required": [ - "checkLink" - ], - "properties": { - "checkLink": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "checkLink", - "anyOf": [ - { - "title": "Check link (detailed)", - "description": "Check if an HTTP or HTTPS URL returns an acceptable status code from a GET request.", - "type": "string", - "pattern": "(^(http://|https://|\\/).*|\\$[A-Za-z0-9_]+$)", - "transform": [ - "trim" - ] - }, - { - "title": "Check link (detailed)", - "description": "Check if an HTTP or HTTPS URL returns an acceptable status code from a GET request.", - "type": "object", - "additionalProperties": false, - "required": [ - "url" - ], - "properties": { - "url": { - "type": "string", - "description": "URL to check. Can be a full URL or a path. If a path is provided, `origin` must be specified.", - "pattern": "(^(http://|https://|/).*|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - "origin": { - "type": "string", - "description": "Protocol and domain to navigate to. Prepended to `url`.", - "transform": [ - "trim" - ] - }, - "statusCodes": { - "description": "Accepted status codes. If the specified URL returns a code other than what is specified here, the action fails.", - "anyOf": [ - { - "type": "integer" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "integer" - } - ] - } - } - ], - "default": [ - 200, - 301, - 302, - 307, - 308 - ] - } - } - } - ], - "components": { - "schemas": { - "string": { - "title": "Check link (detailed)", - "description": "Check if an HTTP or HTTPS URL returns an acceptable status code from a GET request.", - "type": "string", - "pattern": "(^(http://|https://|\\/).*|\\$[A-Za-z0-9_]+$)", - "transform": [ - "trim" - ] - }, - "object": { - "title": "Check link (detailed)", - "description": "Check if an HTTP or HTTPS URL returns an acceptable status code from a GET request.", - "type": "object", - "additionalProperties": false, - "required": [ - "url" - ], - "properties": { - "url": { - "type": "string", - "description": "URL to check. Can be a full URL or a path. If a path is provided, `origin` must be specified.", - "pattern": "(^(http://|https://|/).*|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - "origin": { - "type": "string", - "description": "Protocol and domain to navigate to. Prepended to `url`.", - "transform": [ - "trim" - ] - }, - "statusCodes": { - "description": "Accepted status codes. If the specified URL returns a code other than what is specified here, the action fails.", - "anyOf": [ - { - "type": "integer" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "integer" - } - ] - } - } - ], - "default": [ - 200, - 301, - 302, - 307, - 308 - ] - } - } - } - } - }, - "examples": [ - "https://www.google.com", - "/search", - { - "url": "https://www.google.com", - "statusCodes": 200 - }, - { - "url": "/search", - "origin": "www.google.com", - "statusCodes": [ - 200 - ] - } - ] - } - }, - "title": "checkLink" - } - ] - }, - { - "allOf": [ - { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { - "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - }, - "title": "Common" - }, - { - "type": "object", - "required": [ - "click" - ], - "properties": { - "click": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "click", - "description": "Click or tap an element.", - "anyOf": [ - { - "title": "Click element (simple)", - "type": "string", - "description": "Identifier for the element to click. Can be a selector, element text, ARIA name, ID, or test ID." - }, - { - "title": "Click element (detailed)", - "type": "object", - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "properties": { - "button": { - "description": "Kind of click to perform.", - "type": "string", - "enum": [ - "left", - "right", - "middle" - ] - }, - "elementText": { - "type": "string", - "description": "Display text of the element to click. If combined with other element finding fields, the element must match all specified criteria." - }, - "selector": { - "type": "string", - "description": "Selector of the element to click. If combined with other element finding fields, the element must match all specified criteria." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to click. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to click. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - } - } - }, - { - "type": "boolean" - } - ], - "components": { - "schemas": { - "string": { - "title": "Click element (simple)", - "type": "string", - "description": "Identifier for the element to click. Can be a selector, element text, ARIA name, ID, or test ID." - }, - "button": { - "description": "Kind of click to perform.", - "type": "string", - "enum": [ - "left", - "right", - "middle" - ] - }, - "object": { - "title": "Click element (detailed)", - "type": "object", - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "properties": { - "button": { - "description": "Kind of click to perform.", - "type": "string", - "enum": [ - "left", - "right", - "middle" - ] - }, - "elementText": { - "type": "string", - "description": "Display text of the element to click. If combined with other element finding fields, the element must match all specified criteria." - }, - "selector": { - "type": "string", - "description": "Selector of the element to click. If combined with other element finding fields, the element must match all specified criteria." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to click. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to click. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - } - } - } - } - }, - "examples": [ - true, - "right", - { - "button": "left", - "elementText": "Element text" - }, - { - "selector": "#elementToScreenshot", - "elementText": "Element text", - "button": "middle" - } - ] - } - }, - "title": "click" - } - ] - }, - { - "allOf": [ - { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { - "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - }, - "title": "Common" - }, - { - "type": "object", - "required": [ - "find" - ], - "properties": { - "find": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "find", - "description": "Find an element based on display text or a selector, then optionally interact with it.", - "anyOf": [ - { - "title": "Find element (simple)", - "type": "string", - "description": "Identifier for the element to find. Can be a selector, element text, ARIA name, ID, or test ID." - }, - { - "title": "Find element (detailed)", - "type": "object", - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "additionalProperties": false, - "properties": { - "elementText": { - "type": "string", - "description": "Display text of the element to find. If combined with other element finding fields, the element must match all specified criteria." - }, - "selector": { - "type": "string", - "description": "Selector of the element to find. If combined with other element finding fields, the element must match all specified criteria." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - }, - "timeout": { - "type": "integer", - "description": "Max duration in milliseconds to wait for the element to exist.", - "default": 5000 - }, - "moveTo": { - "description": "Move to the element. If the element isn't visible, it's scrolled into view.", - "type": "boolean", - "default": true - }, - "click": { - "description": "Click the element.", - "anyOf": [ - { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "click", - "description": "Click or tap an element.", - "anyOf": [ - { - "title": "Click element (simple)", - "type": "string", - "description": "Identifier for the element to click. Can be a selector, element text, ARIA name, ID, or test ID." - }, - { - "title": "Click element (detailed)", - "type": "object", - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "properties": { - "button": { - "description": "Kind of click to perform.", - "type": "string", - "enum": [ - "left", - "right", - "middle" - ] - }, - "elementText": { - "type": "string", - "description": "Display text of the element to click. If combined with other element finding fields, the element must match all specified criteria." - }, - "selector": { - "type": "string", - "description": "Selector of the element to click. If combined with other element finding fields, the element must match all specified criteria." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to click. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to click. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - } - } - }, - { - "type": "boolean" - } - ], - "components": { - "schemas": { - "string": { - "title": "Click element (simple)", - "type": "string", - "description": "Identifier for the element to click. Can be a selector, element text, ARIA name, ID, or test ID." - }, - "button": { - "description": "Kind of click to perform.", - "type": "string", - "enum": [ - "left", - "right", - "middle" - ] - }, - "object": { - "title": "Click element (detailed)", - "type": "object", - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "properties": { - "button": { - "description": "Kind of click to perform.", - "type": "string", - "enum": [ - "left", - "right", - "middle" - ] - }, - "elementText": { - "type": "string", - "description": "Display text of the element to click. If combined with other element finding fields, the element must match all specified criteria." - }, - "selector": { - "type": "string", - "description": "Selector of the element to click. If combined with other element finding fields, the element must match all specified criteria." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to click. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to click. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - } - } - } - } - }, - "examples": [ - true, - "right", - { - "button": "left", - "elementText": "Element text" - }, - { - "selector": "#elementToScreenshot", - "elementText": "Element text", - "button": "middle" - } - ] - }, - { - "type": "object", - "properties": { - "button": { - "description": "Kind of click to perform.", - "type": "string", - "enum": [ - "left", - "right", - "middle" - ] - } - }, - "title": "Find element and click" - } - ] - }, - "type": { - "description": "Type keys after finding the element. Either a string or an object with a `keys` field as defined in [`type`](type). To type in the element, make the element active with the `click` parameter.", - "allOf": [ - { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "typeKeys", - "description": "Type keys. To type special keys, begin and end the string with `$` and use the special key's keyword. For example, to type the Escape key, enter `$ESCAPE$`.", - "anyOf": [ - { - "title": "Type keys (simple)", - "description": "Sequence of keys to enter.", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - } - ] - } - } - ] - }, - { - "title": "Type keys (detailed)", - "type": "object", - "properties": { - "keys": { - "title": "Type keys (simple)", - "description": "Sequence of keys to enter.", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - } - ] - } - } - ] - }, - "inputDelay": { - "type": "number", - "description": "Delay in milliseconds between each key press during a recording", - "default": 100 - }, - "selector": { - "type": "string", - "description": "Selector for the element to type into. If not specified, the typing occurs in the active element." - }, - "elementText": { - "type": "string", - "description": "Display text of the element to type into. If combined with other element finding fields, the element must match all specified criteria." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - } - }, - "required": [ - "keys" - ], - "additionalProperties": false - } - ], - "components": { - "schemas": { - "keys": { - "title": "Type keys (simple)", - "description": "Sequence of keys to enter.", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - } - ] - } - } - ] - }, - "object": { - "title": "Type keys (detailed)", - "type": "object", - "properties": { - "keys": { - "title": "Type keys (simple)", - "description": "Sequence of keys to enter.", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - } - ] - } - } - ] - }, - "inputDelay": { - "type": "number", - "description": "Delay in milliseconds between each key press during a recording", - "default": 100 - }, - "selector": { - "type": "string", - "description": "Selector for the element to type into. If not specified, the typing occurs in the active element." - }, - "elementText": { - "type": "string", - "description": "Display text of the element to type into. If combined with other element finding fields, the element must match all specified criteria." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - } - }, - "required": [ - "keys" - ], - "additionalProperties": false - } - } - }, - "examples": [ - "kittens", - [ - "$ENTER$" - ], - [ - "kittens", - "$ENTER$" - ], - { - "keys": "kittens" - }, - { - "keys": [ - "$ENTER$" - ] - }, - { - "keys": [ - "kittens", - "$ENTER$" - ], - "inputDelay": 500 - } - ] - }, - { - "not": { - "type": "object", - "required": [ - "selector", - "elementText", - "elementId", - "elementTestId", - "elementClass", - "elementAttribute", - "elementAria" - ], - "title": "Find element and type" - } - } - ] - } - } - } - ], - "components": { - "schemas": { - "string": { - "title": "Find element (simple)", - "type": "string", - "description": "Identifier for the element to find. Can be a selector, element text, ARIA name, ID, or test ID." - }, - "object": { - "title": "Find element (detailed)", - "type": "object", - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "additionalProperties": false, - "properties": { - "elementText": { - "type": "string", - "description": "Display text of the element to find. If combined with other element finding fields, the element must match all specified criteria." - }, - "selector": { - "type": "string", - "description": "Selector of the element to find. If combined with other element finding fields, the element must match all specified criteria." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - }, - "timeout": { - "type": "integer", - "description": "Max duration in milliseconds to wait for the element to exist.", - "default": 5000 - }, - "moveTo": { - "description": "Move to the element. If the element isn't visible, it's scrolled into view.", - "type": "boolean", - "default": true - }, - "click": { - "description": "Click the element.", - "anyOf": [ - { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "click", - "description": "Click or tap an element.", - "anyOf": [ - { - "title": "Click element (simple)", - "type": "string", - "description": "Identifier for the element to click. Can be a selector, element text, ARIA name, ID, or test ID." - }, - { - "title": "Click element (detailed)", - "type": "object", - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "properties": { - "button": { - "description": "Kind of click to perform.", - "type": "string", - "enum": [ - "left", - "right", - "middle" - ] - }, - "elementText": { - "type": "string", - "description": "Display text of the element to click. If combined with other element finding fields, the element must match all specified criteria." - }, - "selector": { - "type": "string", - "description": "Selector of the element to click. If combined with other element finding fields, the element must match all specified criteria." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to click. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to click. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - } - } - }, - { - "type": "boolean" - } - ], - "components": { - "schemas": { - "string": { - "title": "Click element (simple)", - "type": "string", - "description": "Identifier for the element to click. Can be a selector, element text, ARIA name, ID, or test ID." - }, - "button": { - "description": "Kind of click to perform.", - "type": "string", - "enum": [ - "left", - "right", - "middle" - ] - }, - "object": { - "title": "Click element (detailed)", - "type": "object", - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "properties": { - "button": { - "description": "Kind of click to perform.", - "type": "string", - "enum": [ - "left", - "right", - "middle" - ] - }, - "elementText": { - "type": "string", - "description": "Display text of the element to click. If combined with other element finding fields, the element must match all specified criteria." - }, - "selector": { - "type": "string", - "description": "Selector of the element to click. If combined with other element finding fields, the element must match all specified criteria." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to click. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to click. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - } - } - } - } - }, - "examples": [ - true, - "right", - { - "button": "left", - "elementText": "Element text" - }, - { - "selector": "#elementToScreenshot", - "elementText": "Element text", - "button": "middle" - } - ] - }, - { - "type": "object", - "properties": { - "button": { - "description": "Kind of click to perform.", - "type": "string", - "enum": [ - "left", - "right", - "middle" - ] - } - }, - "title": "Find element and click" - } - ] - }, - "type": { - "description": "Type keys after finding the element. Either a string or an object with a `keys` field as defined in [`type`](type). To type in the element, make the element active with the `click` parameter.", - "allOf": [ - { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "typeKeys", - "description": "Type keys. To type special keys, begin and end the string with `$` and use the special key's keyword. For example, to type the Escape key, enter `$ESCAPE$`.", - "anyOf": [ - { - "title": "Type keys (simple)", - "description": "Sequence of keys to enter.", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - } - ] - } - } - ] - }, - { - "title": "Type keys (detailed)", - "type": "object", - "properties": { - "keys": { - "title": "Type keys (simple)", - "description": "Sequence of keys to enter.", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - } - ] - } - } - ] - }, - "inputDelay": { - "type": "number", - "description": "Delay in milliseconds between each key press during a recording", - "default": 100 - }, - "selector": { - "type": "string", - "description": "Selector for the element to type into. If not specified, the typing occurs in the active element." - }, - "elementText": { - "type": "string", - "description": "Display text of the element to type into. If combined with other element finding fields, the element must match all specified criteria." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - } - }, - "required": [ - "keys" - ], - "additionalProperties": false - } - ], - "components": { - "schemas": { - "keys": { - "title": "Type keys (simple)", - "description": "Sequence of keys to enter.", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - } - ] - } - } - ] - }, - "object": { - "title": "Type keys (detailed)", - "type": "object", - "properties": { - "keys": { - "title": "Type keys (simple)", - "description": "Sequence of keys to enter.", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - } - ] - } - } - ] - }, - "inputDelay": { - "type": "number", - "description": "Delay in milliseconds between each key press during a recording", - "default": 100 - }, - "selector": { - "type": "string", - "description": "Selector for the element to type into. If not specified, the typing occurs in the active element." - }, - "elementText": { - "type": "string", - "description": "Display text of the element to type into. If combined with other element finding fields, the element must match all specified criteria." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - } - }, - "required": [ - "keys" - ], - "additionalProperties": false - } - } - }, - "examples": [ - "kittens", - [ - "$ENTER$" - ], - [ - "kittens", - "$ENTER$" - ], - { - "keys": "kittens" - }, - { - "keys": [ - "$ENTER$" - ] - }, - { - "keys": [ - "kittens", - "$ENTER$" - ], - "inputDelay": 500 - } - ] - }, - { - "not": { - "type": "object", - "required": [ - "selector", - "elementText", - "elementId", - "elementTestId", - "elementClass", - "elementAttribute", - "elementAria" - ], - "title": "Find element and type" - } - } - ] - } - } - } - } - }, - "examples": [ - "Find me!", - { - "selector": "[title=Search]" - }, - { - "selector": "[title=Search]", - "timeout": 10000, - "elementText": "Search", - "moveTo": true, - "click": true, - "type": "shorthair cat" - }, - { - "selector": "[title=Search]", - "click": { - "button": "right" - } - }, - { - "selector": "[title=Search]", - "timeout": 10000, - "elementText": "Search", - "moveTo": true, - "click": true, - "type": { - "keys": [ - "shorthair cat" - ], - "inputDelay": 100 - } - }, - { - "elementId": "/^user-[0-9]+$/", - "elementClass": [ - "admin", - "/^level-[1-5]$/" - ], - "elementAttribute": { - "data-active": true, - "data-score": "/^[0-9]+$/" - }, - "timeout": 8000, - "moveTo": false - } - ] - } - }, - "title": "find" - } - ] - }, - { - "allOf": [ - { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { - "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - }, - "title": "Common" - }, - { - "type": "object", - "required": [ - "goTo" - ], - "properties": { - "goTo": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "goTo", - "anyOf": [ - { - "title": "Go to URL (simple)", - "description": "Navigate to an HTTP or HTTPS URL. Can be a full URL or a path. If a path is provided, navigates relative to the current URL, if any.", - "type": "string", - "pattern": "(^(http://|https://|/).*|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - { - "description": "Navigate to an HTTP or HTTPS URL.", - "type": "object", - "additionalProperties": false, - "required": [ - "url" - ], - "properties": { - "url": { - "type": "string", - "description": "URL to navigate to. Can be a full URL or a path. If a path is provided and `origin` is specified, prepends `origin` to `url`. If a path is provided but `origin` isn't specified, attempts to navigate relative to the current URL, if any.", - "pattern": "(^(http://|https://|/).*|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - "origin": { - "type": "string", - "description": "Protocol and domain to navigate to. Prepended to `url`.", - "transform": [ - "trim" - ] - }, - "timeout": { - "type": "integer", - "description": "Maximum time in milliseconds to wait for the page to be ready. If exceeded, the goTo action fails.", - "default": 30000, - "minimum": 0 - }, - "waitUntil": { - "type": "object", - "description": "Configuration for waiting conditions after navigation.", - "additionalProperties": false, - "properties": { - "networkIdleTime": { - "description": "Wait for network activity to be idle (no new requests) for this duration in milliseconds. Set to `null` to skip this check.", - "anyOf": [ - { - "type": "integer", - "minimum": 0 - }, - { - "type": "null" - } - ], - "default": 500 - }, - "domIdleTime": { - "description": "Wait for DOM mutations to stop for this duration in milliseconds. Set to `null` to skip this check.", - "anyOf": [ - { - "type": "integer", - "minimum": 0 - }, - { - "type": "null" - } - ], - "default": 1000 - }, - "find": { - "type": "object", - "description": "Wait for a specific element to be present in the DOM. At least one of selector or elementText must be specified.", - "additionalProperties": false, - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "properties": { - "selector": { - "type": "string", - "description": "CSS selector for the element to wait for." - }, - "elementText": { - "type": "string", - "description": "Text content the element must contain. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - } - } - } - } - } - }, - "title": "Go to URL (detailed)" - } - ], - "components": { - "schemas": { - "string": { - "title": "Go to URL (simple)", - "description": "Navigate to an HTTP or HTTPS URL. Can be a full URL or a path. If a path is provided, navigates relative to the current URL, if any.", - "type": "string", - "pattern": "(^(http://|https://|/).*|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - "object": { - "description": "Navigate to an HTTP or HTTPS URL.", - "type": "object", - "additionalProperties": false, - "required": [ - "url" - ], - "properties": { - "url": { - "type": "string", - "description": "URL to navigate to. Can be a full URL or a path. If a path is provided and `origin` is specified, prepends `origin` to `url`. If a path is provided but `origin` isn't specified, attempts to navigate relative to the current URL, if any.", - "pattern": "(^(http://|https://|/).*|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - "origin": { - "type": "string", - "description": "Protocol and domain to navigate to. Prepended to `url`.", - "transform": [ - "trim" - ] - }, - "timeout": { - "type": "integer", - "description": "Maximum time in milliseconds to wait for the page to be ready. If exceeded, the goTo action fails.", - "default": 30000, - "minimum": 0 - }, - "waitUntil": { - "type": "object", - "description": "Configuration for waiting conditions after navigation.", - "additionalProperties": false, - "properties": { - "networkIdleTime": { - "description": "Wait for network activity to be idle (no new requests) for this duration in milliseconds. Set to `null` to skip this check.", - "anyOf": [ - { - "type": "integer", - "minimum": 0 - }, - { - "type": "null" - } - ], - "default": 500 - }, - "domIdleTime": { - "description": "Wait for DOM mutations to stop for this duration in milliseconds. Set to `null` to skip this check.", - "anyOf": [ - { - "type": "integer", - "minimum": 0 - }, - { - "type": "null" - } - ], - "default": 1000 - }, - "find": { - "type": "object", - "description": "Wait for a specific element to be present in the DOM. At least one of selector or elementText must be specified.", - "additionalProperties": false, - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "properties": { - "selector": { - "type": "string", - "description": "CSS selector for the element to wait for." - }, - "elementText": { - "type": "string", - "description": "Text content the element must contain. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - } - } - } - } - } - }, - "title": "Go to URL (detailed)" - } - } - }, - "examples": [ - "https://www.google.com", - "/search", - { - "url": "https://www.google.com" - }, - { - "url": "/search", - "origin": "https://www.google.com" - }, - { - "url": "https://www.example.com", - "waitUntil": { - "networkIdleTime": 500 - } - }, - { - "url": "https://www.example.com/dashboard", - "waitUntil": { - "find": { - "selector": "[data-testid='dashboard-loaded']" - } - } - }, - { - "url": "https://www.example.com/app", - "timeout": 60000, - "waitUntil": { - "networkIdleTime": 500, - "domIdleTime": 1000, - "find": { - "selector": ".main-content", - "elementText": "Dashboard" - } - } - }, - { - "url": "https://www.example.com/app", - "timeout": 60000, - "waitUntil": { - "networkIdleTime": null - } - }, - { - "url": "https://www.example.com/status", - "waitUntil": { - "find": { - "elementText": "System operational" - } - } - }, - { - "url": "http://localhost:8092", - "waitUntil": { - "find": { - "selector": "button", - "elementText": "Standard Button", - "elementTestId": "standard-btn", - "elementAria": "Sample Standard Button", - "elementId": "standard-btn", - "elementClass": [ - "btn" - ], - "elementAttribute": { - "type": "button", - "value": "Standard Button" - } - } - } - } - ] - } - }, - "title": "goTo" - } - ] - }, - { - "allOf": [ - { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { - "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - }, - "title": "Common" - }, - { - "type": "object", - "required": [ - "httpRequest" - ], - "properties": { - "httpRequest": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "httpRequest", - "description": "Perform a generic HTTP request, for example to an API.", - "anyOf": [ - { - "title": "HTTP request (simple)", - "type": "string", - "description": "URL for the HTTP request.", - "pattern": "(^(http://|https://).*|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - { - "title": "HTTP request (detailed)", - "type": "object", - "anyOf": [ - { - "required": [ - "url" - ] - }, - { - "required": [ - "openApi" - ] - } - ], - "additionalProperties": false, - "properties": { - "url": { - "title": "HTTP request (simple)", - "type": "string", - "description": "URL for the HTTP request.", - "pattern": "(^(http://|https://).*|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - "openApi": { - "anyOf": [ - { - "allOf": [ - { - "type": "string", - "description": "ID of the operation to use for the request." - }, - { - "title": "Operation ID", - "description": "Operation ID from the OpenAPI schema. Only valid if the OpenAPI description path is specified elsewhere and the operation ID is unique among all specified OpenAPI descriptions." - } - ] - }, - { - "allOf": [ - { - "version": "1.0.0", - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "openApi", - "type": "object", - "description": "OpenAPI description and configuration.", - "additionalProperties": false, - "anyOf": [ - { - "required": [ - "descriptionPath" - ] - }, - { - "required": [ - "operationId" - ] - } - ], - "properties": { - "name": { - "type": "string", - "description": "Name of the OpenAPI description, as defined in your configuration." - }, - "descriptionPath": { - "type": "string", - "description": "URL or local path to the OpenAPI description." - }, - "definition": { - "type": "object", - "readOnly": true, - "description": "OpenAPI definition object loaded from the `descriptionPath`. This is a resolved version of the OpenAPI description and should not be user-defined.", - "additionalProperties": true, - "title": "OpenAPI definition" - }, - "operationId": { - "type": "string", - "description": "ID of the operation to use for the request." - }, - "server": { - "type": "string", - "description": "Server to use for example requests. Only valid if `useExample` is `request` or `both`. If not specified but an example is used for the request, uses the first server defined in the OpenAPI description." - }, - "validateAgainstSchema": { - "type": "string", - "description": "Validates the request and/or response against the schema in the OpenAPI description. If the request or response doesn't match the schema, the step fails.", - "enum": [ - "request", - "response", - "both", - "none" - ], - "default": "both" - }, - "mockResponse": { - "type": "boolean", - "description": "If `true`, doesn't make the HTTP request, but instead uses the response example or schema from the OpenAPI description as the response data. Useful for creating tests when an API isn't fully implemented yet. If `statusCode` isn't specified, uses the first defined response code." - }, - "statusCode": { - "type": "integer", - "description": "Response code to use for validation, examples, and status code checking. If the response code doesn't match, the step fails. `statusCodes` overrides this value when specified." - }, - "useExample": { - "type": [ - "string" - ], - "description": "Uses the example from the OpenAPI description as the request and response data. If the request or response has multiple examples, specify `exampleKey`. If `statusCode` isn't specified, uses the first defined response code. `requestData`, `requestParams`, and `requestHeaders` override portions of request examples when specified. `responseData` overrides portions of response examples when specified.", - "enum": [ - "request", - "response", - "both", - "none" - ], - "default": "none" - }, - "exampleKey": { - "type": "string", - "description": "Key of the example to use from the `examples` property in the OpenAPI description. If an `examples` key isn't specified or isn't available for a given parameter or object, the `example` property value is used.", - "default": "" - }, - "headers": { - "type": "object", - "description": "Request headers to add to requests. For example, to set `Authorization` headers for all requests from the specified OpenAPI document. If specified in both a config and a step, the step value overrides the config value.", - "additionalProperties": { - "type": "string" - }, - "title": "OpenAPI request headers" - } - }, - "components": { - "schemas": { - "operationId": { - "type": "string", - "description": "ID of the operation to use for the request." - }, - "descriptionPath": { - "type": "string", - "description": "URL or local path to the OpenAPI description." - } - } - }, - "examples": [ - { - "descriptionPath": "https://petstore.swagger.io/v2/swagger.json" - }, - { - "name": "Reqres", - "operationId": "getUserById" - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "getUserById" - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both" - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both", - "exampleKey": "example1" - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both", - "exampleKey": "example1", - "statusCode": 201 - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both", - "exampleKey": "example1", - "statusCode": 201, - "validateAgainstSchema": "none" - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both", - "exampleKey": "example1", - "statusCode": 201, - "validateAgainstSchema": "none", - "mockResponse": true - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both", - "exampleKey": "example1", - "statusCode": 201, - "validateAgainstSchema": "none", - "mockResponse": true, - "headers": { - "Authorization": "Bearer 12345" - } - } - ] - }, - { - "type": "object", - "required": [ - "operationId" - ], - "title": "OpenAPI definition (httpRequest)" - } - ] - } - ] - }, - "statusCodes": { - "description": "Accepted status codes. If the specified URL returns a code other than what is specified here, the action fails.", - "type": "array", - "items": { - "anyOf": [ - { - "type": "integer" - } - ] - }, - "default": [ - 200, - 201 - ] - }, - "method": { - "type": "string", - "description": "Method of the HTTP request", - "enum": [ - "get", - "put", - "post", - "patch", - "delete" - ], - "transform": [ - "trim", - "toEnumCase" - ], - "default": "get" - }, - "timeout": { - "type": "integer", - "description": "Timeout for the HTTP request, in milliseconds.", - "default": 60000 - }, - "request": { - "type": "object", - "additionalProperties": false, - "properties": { - "headers": { - "description": "Headers to include in the HTTP request.", - "default": {}, - "anyOf": [ - { - "title": "Request headers (object)", - "description": "Headers to include in the HTTP request, in key/value format.", - "type": "object", - "additionalProperties": true, - "properties": {} - }, - { - "title": "Request headers (string)", - "description": "Headers to include in the HTTP request, as return-separated values. For example, `Content-Type: application/json\nAuthorization: Bearer token`.", - "type": "string" - } - ] - }, - "parameters": { - "description": "URL parameters to include in the HTTP request, in key/value format.", - "type": "object", - "additionalProperties": true, - "default": {}, - "properties": {}, - "title": "Request parameters" - }, - "body": { - "description": "The body of the HTTP request.", - "anyOf": [ - { - "title": "Request body (object)", - "description": "JSON object to include as the body of the HTTP request.", - "type": "object", - "additionalProperties": true, - "properties": {} - }, - { - "title": "Request body (array)", - "description": "JSON array to include as the body of the HTTP request.", - "type": "array", - "items": {} - }, - { - "title": "Request body (string)", - "description": "String to include as the body of the HTTP request.", - "type": "string" - } - ], - "default": {} - } - }, - "title": "Request" - }, - "response": { - "type": "object", - "additionalProperties": false, - "properties": { - "headers": { - "description": "Headers expected in the response, in key/value format. If one or more `responseHeaders` entries aren't present in the response, the step fails.", - "type": "object", - "additionalProperties": true, - "properties": {}, - "default": {}, - "title": "Response headers" - }, - "body": { - "description": "JSON object expected in the response. If one or more key/value pairs aren't present in the response, the step fails.", - "anyOf": [ - { - "type": "object", - "additionalProperties": true, - "properties": {}, - "title": "Response body object", - "description": "JSON key/value pairs expected in the response." - }, - { - "title": "Response body array", - "description": "JSON array expected in the response.", - "type": "array", - "items": {} - }, - { - "title": "Response body string", - "description": "String expected in the response.", - "type": "string" - } - ], - "default": {} - }, - "required": { - "type": "array", - "description": "Array of field paths that must exist in the response body. Uses dot notation for nested fields (e.g., 'user.name') and bracket notation for array indices (e.g., 'items[0].id'). Fields must be present but may have any value including null.", - "items": { - "type": "string" - }, - "default": [] - } - }, - "title": "Response" - }, - "allowAdditionalFields": { - "type": "boolean", - "description": "If `false`, the step fails when the response data contains fields not specified in the response body.", - "default": true - }, - "path": { - "type": "string", - "description": "File path to save the command's output, relative to `directory`. Specify a file extension that matches the expected response type, such as `.json` for JSON content or `.txt` for strings." - }, - "directory": { - "type": "string", - "description": "Directory to save the command's output. If the directory doesn't exist, creates the directory. If not specified, the directory is your media directory." - }, - "maxVariation": { - "type": "number", - "description": "Allowed variation in percentage of text different between the current output and previously saved output. If the difference between the current output and the previous output is greater than `maxVariation`, the step fails. If output doesn't exist at `path`, this value is ignored.", - "default": 0, - "minimum": 0, - "maximum": 1 - }, - "overwrite": { - "type": "string", - "description": "If `true`, overwrites the existing output at `path` if it exists.\nIf `aboveVariation`, overwrites the existing output at `path` if the difference between the new output and the existing output is greater than `maxVariation`.", - "enum": [ - "true", - "false", - "aboveVariation" - ], - "default": "aboveVariation" - } - } - } - ], - "components": { - "schemas": { - "url": { - "title": "HTTP request (simple)", - "type": "string", - "description": "URL for the HTTP request.", - "pattern": "(^(http://|https://).*|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - "object": { - "title": "HTTP request (detailed)", - "type": "object", - "anyOf": [ - { - "required": [ - "url" - ] - }, - { - "required": [ - "openApi" - ] - } - ], - "additionalProperties": false, - "properties": { - "url": { - "title": "HTTP request (simple)", - "type": "string", - "description": "URL for the HTTP request.", - "pattern": "(^(http://|https://).*|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - "openApi": { - "anyOf": [ - { - "allOf": [ - { - "type": "string", - "description": "ID of the operation to use for the request." - }, - { - "title": "Operation ID", - "description": "Operation ID from the OpenAPI schema. Only valid if the OpenAPI description path is specified elsewhere and the operation ID is unique among all specified OpenAPI descriptions." - } - ] - }, - { - "allOf": [ - { - "version": "1.0.0", - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "openApi", - "type": "object", - "description": "OpenAPI description and configuration.", - "additionalProperties": false, - "anyOf": [ - { - "required": [ - "descriptionPath" - ] - }, - { - "required": [ - "operationId" - ] - } - ], - "properties": { - "name": { - "type": "string", - "description": "Name of the OpenAPI description, as defined in your configuration." - }, - "descriptionPath": { - "type": "string", - "description": "URL or local path to the OpenAPI description." - }, - "definition": { - "type": "object", - "readOnly": true, - "description": "OpenAPI definition object loaded from the `descriptionPath`. This is a resolved version of the OpenAPI description and should not be user-defined.", - "additionalProperties": true, - "title": "OpenAPI definition" - }, - "operationId": { - "type": "string", - "description": "ID of the operation to use for the request." - }, - "server": { - "type": "string", - "description": "Server to use for example requests. Only valid if `useExample` is `request` or `both`. If not specified but an example is used for the request, uses the first server defined in the OpenAPI description." - }, - "validateAgainstSchema": { - "type": "string", - "description": "Validates the request and/or response against the schema in the OpenAPI description. If the request or response doesn't match the schema, the step fails.", - "enum": [ - "request", - "response", - "both", - "none" - ], - "default": "both" - }, - "mockResponse": { - "type": "boolean", - "description": "If `true`, doesn't make the HTTP request, but instead uses the response example or schema from the OpenAPI description as the response data. Useful for creating tests when an API isn't fully implemented yet. If `statusCode` isn't specified, uses the first defined response code." - }, - "statusCode": { - "type": "integer", - "description": "Response code to use for validation, examples, and status code checking. If the response code doesn't match, the step fails. `statusCodes` overrides this value when specified." - }, - "useExample": { - "type": [ - "string" - ], - "description": "Uses the example from the OpenAPI description as the request and response data. If the request or response has multiple examples, specify `exampleKey`. If `statusCode` isn't specified, uses the first defined response code. `requestData`, `requestParams`, and `requestHeaders` override portions of request examples when specified. `responseData` overrides portions of response examples when specified.", - "enum": [ - "request", - "response", - "both", - "none" - ], - "default": "none" - }, - "exampleKey": { - "type": "string", - "description": "Key of the example to use from the `examples` property in the OpenAPI description. If an `examples` key isn't specified or isn't available for a given parameter or object, the `example` property value is used.", - "default": "" - }, - "headers": { - "type": "object", - "description": "Request headers to add to requests. For example, to set `Authorization` headers for all requests from the specified OpenAPI document. If specified in both a config and a step, the step value overrides the config value.", - "additionalProperties": { - "type": "string" - }, - "title": "OpenAPI request headers" - } - }, - "components": { - "schemas": { - "operationId": { - "type": "string", - "description": "ID of the operation to use for the request." - }, - "descriptionPath": { - "type": "string", - "description": "URL or local path to the OpenAPI description." - } - } - }, - "examples": [ - { - "descriptionPath": "https://petstore.swagger.io/v2/swagger.json" - }, - { - "name": "Reqres", - "operationId": "getUserById" - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "getUserById" - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both" - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both", - "exampleKey": "example1" - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both", - "exampleKey": "example1", - "statusCode": 201 - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both", - "exampleKey": "example1", - "statusCode": 201, - "validateAgainstSchema": "none" - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both", - "exampleKey": "example1", - "statusCode": 201, - "validateAgainstSchema": "none", - "mockResponse": true - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both", - "exampleKey": "example1", - "statusCode": 201, - "validateAgainstSchema": "none", - "mockResponse": true, - "headers": { - "Authorization": "Bearer 12345" - } - } - ] - }, - { - "type": "object", - "required": [ - "operationId" - ], - "title": "OpenAPI definition (httpRequest)" - } - ] - } - ] - }, - "statusCodes": { - "description": "Accepted status codes. If the specified URL returns a code other than what is specified here, the action fails.", - "type": "array", - "items": { - "anyOf": [ - { - "type": "integer" - } - ] - }, - "default": [ - 200, - 201 - ] - }, - "method": { - "type": "string", - "description": "Method of the HTTP request", - "enum": [ - "get", - "put", - "post", - "patch", - "delete" - ], - "transform": [ - "trim", - "toEnumCase" - ], - "default": "get" - }, - "timeout": { - "type": "integer", - "description": "Timeout for the HTTP request, in milliseconds.", - "default": 60000 - }, - "request": { - "type": "object", - "additionalProperties": false, - "properties": { - "headers": { - "description": "Headers to include in the HTTP request.", - "default": {}, - "anyOf": [ - { - "title": "Request headers (object)", - "description": "Headers to include in the HTTP request, in key/value format.", - "type": "object", - "additionalProperties": true, - "properties": {} - }, - { - "title": "Request headers (string)", - "description": "Headers to include in the HTTP request, as return-separated values. For example, `Content-Type: application/json\nAuthorization: Bearer token`.", - "type": "string" - } - ] - }, - "parameters": { - "description": "URL parameters to include in the HTTP request, in key/value format.", - "type": "object", - "additionalProperties": true, - "default": {}, - "properties": {}, - "title": "Request parameters" - }, - "body": { - "description": "The body of the HTTP request.", - "anyOf": [ - { - "title": "Request body (object)", - "description": "JSON object to include as the body of the HTTP request.", - "type": "object", - "additionalProperties": true, - "properties": {} - }, - { - "title": "Request body (array)", - "description": "JSON array to include as the body of the HTTP request.", - "type": "array", - "items": {} - }, - { - "title": "Request body (string)", - "description": "String to include as the body of the HTTP request.", - "type": "string" - } - ], - "default": {} - } - }, - "title": "Request" - }, - "response": { - "type": "object", - "additionalProperties": false, - "properties": { - "headers": { - "description": "Headers expected in the response, in key/value format. If one or more `responseHeaders` entries aren't present in the response, the step fails.", - "type": "object", - "additionalProperties": true, - "properties": {}, - "default": {}, - "title": "Response headers" - }, - "body": { - "description": "JSON object expected in the response. If one or more key/value pairs aren't present in the response, the step fails.", - "anyOf": [ - { - "type": "object", - "additionalProperties": true, - "properties": {}, - "title": "Response body object", - "description": "JSON key/value pairs expected in the response." - }, - { - "title": "Response body array", - "description": "JSON array expected in the response.", - "type": "array", - "items": {} - }, - { - "title": "Response body string", - "description": "String expected in the response.", - "type": "string" - } - ], - "default": {} - }, - "required": { - "type": "array", - "description": "Array of field paths that must exist in the response body. Uses dot notation for nested fields (e.g., 'user.name') and bracket notation for array indices (e.g., 'items[0].id'). Fields must be present but may have any value including null.", - "items": { - "type": "string" - }, - "default": [] - } - }, - "title": "Response" - }, - "allowAdditionalFields": { - "type": "boolean", - "description": "If `false`, the step fails when the response data contains fields not specified in the response body.", - "default": true - }, - "path": { - "type": "string", - "description": "File path to save the command's output, relative to `directory`. Specify a file extension that matches the expected response type, such as `.json` for JSON content or `.txt` for strings." - }, - "directory": { - "type": "string", - "description": "Directory to save the command's output. If the directory doesn't exist, creates the directory. If not specified, the directory is your media directory." - }, - "maxVariation": { - "type": "number", - "description": "Allowed variation in percentage of text different between the current output and previously saved output. If the difference between the current output and the previous output is greater than `maxVariation`, the step fails. If output doesn't exist at `path`, this value is ignored.", - "default": 0, - "minimum": 0, - "maximum": 1 - }, - "overwrite": { - "type": "string", - "description": "If `true`, overwrites the existing output at `path` if it exists.\nIf `aboveVariation`, overwrites the existing output at `path` if the difference between the new output and the existing output is greater than `maxVariation`.", - "enum": [ - "true", - "false", - "aboveVariation" - ], - "default": "aboveVariation" - } - } - } - } - }, - "examples": [ - "https://reqres.in/api/users", - { - "url": "https://reqres.in/api/users" - }, - { - "url": "https://reqres.in/api/users/2", - "method": "put", - "request": { - "body": { - "name": "morpheus", - "job": "zion resident" - } - } - }, - { - "url": "https://reqres.in/api/users", - "method": "post", - "request": { - "body": { - "name": "morpheus", - "job": "leader" - } - }, - "response": { - "body": { - "name": "morpheus", - "job": "leader" - } - }, - "statusCodes": [ - 200, - 201 - ] - }, - { - "url": "https://www.api-server.com", - "method": "post", - "timeout": 30000, - "request": { - "body": { - "field": "value" - }, - "headers": { - "header": "value" - }, - "parameters": { - "param": "value" - } - }, - "response": { - "body": { - "field": "value" - }, - "headers": { - "header": "value" - } - }, - "statusCodes": [ - 200 - ] - }, - { - "url": "https://reqres.in/api/users", - "method": "post", - "request": { - "body": { - "name": "morpheus", - "job": "leader" - } - }, - "response": { - "body": { - "name": "morpheus", - "job": "leader" - } - }, - "statusCodes": [ - 200, - 201 - ], - "path": "response.json", - "directory": "media", - "maxVariation": 0.05, - "overwrite": "aboveVariation" - }, - { - "openApi": "getUserById" - }, - { - "openApi": { - "name": "Reqres", - "operationId": "getUserById" - }, - "request": { - "parameters": { - "id": 123 - } - } - }, - { - "openApi": { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "getUserById" - }, - "request": { - "parameters": { - "id": 123 - } - } - }, - { - "openApi": { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both" - } - }, - { - "openApi": { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "updateUser", - "useExample": "request", - "exampleKey": "acme" - } - }, - { - "openApi": { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "updateUser", - "useExample": "request", - "exampleKey": "acme", - "headers": { - "Authorization": "Bearer $TOKEN" - } - } - }, - { - "url": "https://www.api-server.com", - "method": "post", - "request": { - "headers": "Content-Type: application/json\\nAuthorization: Bearer token" - } - }, - { - "url": "https://api.example.com/users/123", - "response": { - "required": [ - "id", - "email", - "createdAt" - ] - } - }, - { - "url": "https://api.example.com/users/123", - "response": { - "required": [ - "user.profile.name", - "user.profile.avatar", - "user.settings.notifications" - ] - } - }, - { - "url": "https://api.example.com/orders", - "response": { - "required": [ - "orders[0].id", - "orders[0].total", - "orders[0].items[0].productId" - ] - } - }, - { - "url": "https://api.example.com/users", - "response": { - "required": [ - "sessionToken", - "expiresAt", - "user.id" - ], - "body": { - "status": "success", - "user": { - "role": "admin" - } - } - } - } - ] - } - }, - "title": "httpRequest" - } - ] - }, - { - "allOf": [ - { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { - "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - }, - "title": "Common" - }, - { - "type": "object", - "required": [ - "runShell" - ], - "properties": { - "runShell": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "runShell", - "description": "Perform a native shell command.", - "anyOf": [ - { - "title": "Run shell command (simple)", - "description": "Command to perform in the machine's default shell.", - "type": "string", - "transform": [ - "trim" - ] - }, - { - "type": "object", - "required": [ - "command" - ], - "additionalProperties": false, - "properties": { - "command": { - "type": "string", - "description": "Command to perform in the machine's default shell." - }, - "args": { - "type": "array", - "description": "Arguments for the command.", - "items": { - "anyOf": [ - { - "type": "string" - } - ] - }, - "default": [] - }, - "workingDirectory": { - "type": "string", - "description": "Working directory for the command.", - "default": "." - }, - "exitCodes": { - "type": "array", - "description": "Expected exit codes of the command. If the command's actual exit code isn't in this list, the step fails.", - "items": { - "anyOf": [ - { - "type": "integer" - } - ] - }, - "default": [ - 0 - ] - }, - "stdio": { - "type": "string", - "description": "Content expected in the command's stdout or stderr. If the expected content can't be found in the command's stdout or stderr, the step fails. Supports strings and regular expressions. To use a regular expression, the string must start and end with a forward slash, like in `/^hello-world.*/`." - }, - "path": { - "type": "string", - "description": "File path to save the command's output, relative to `directory`." - }, - "directory": { - "type": "string", - "description": "Directory to save the command's output. If the directory doesn't exist, creates the directory. If not specified, the directory is your media directory." - }, - "maxVariation": { - "type": "number", - "description": "Allowed variation in percentage of text different between the current output and previously saved output. If the difference between the current output and the previous output is greater than `maxVariation`, the step fails. If output doesn't exist at `path`, this value is ignored.", - "default": 0, - "minimum": 0, - "maximum": 1 - }, - "overwrite": { - "type": "string", - "description": "If `true`, overwrites the existing output at `path` if it exists.\nIf `aboveVariation`, overwrites the existing output at `path` if the difference between the new output and the existing output is greater than `maxVariation`.", - "enum": [ - "true", - "false", - "aboveVariation" - ], - "default": "aboveVariation" - }, - "timeout": { - "type": "integer", - "description": "Max time in milliseconds the command is allowed to run. If the command runs longer than this, the step fails.", - "default": 60000 - } - }, - "title": "Run shell command (detailed)" - } - ], - "components": { - "schemas": { - "string": { - "title": "Run shell command (simple)", - "description": "Command to perform in the machine's default shell.", - "type": "string", - "transform": [ - "trim" - ] - }, - "object": { - "type": "object", - "required": [ - "command" - ], - "additionalProperties": false, - "properties": { - "command": { - "type": "string", - "description": "Command to perform in the machine's default shell." - }, - "args": { - "type": "array", - "description": "Arguments for the command.", - "items": { - "anyOf": [ - { - "type": "string" - } - ] - }, - "default": [] - }, - "workingDirectory": { - "type": "string", - "description": "Working directory for the command.", - "default": "." - }, - "exitCodes": { - "type": "array", - "description": "Expected exit codes of the command. If the command's actual exit code isn't in this list, the step fails.", - "items": { - "anyOf": [ - { - "type": "integer" - } - ] - }, - "default": [ - 0 - ] - }, - "stdio": { - "type": "string", - "description": "Content expected in the command's stdout or stderr. If the expected content can't be found in the command's stdout or stderr, the step fails. Supports strings and regular expressions. To use a regular expression, the string must start and end with a forward slash, like in `/^hello-world.*/`." - }, - "path": { - "type": "string", - "description": "File path to save the command's output, relative to `directory`." - }, - "directory": { - "type": "string", - "description": "Directory to save the command's output. If the directory doesn't exist, creates the directory. If not specified, the directory is your media directory." - }, - "maxVariation": { - "type": "number", - "description": "Allowed variation in percentage of text different between the current output and previously saved output. If the difference between the current output and the previous output is greater than `maxVariation`, the step fails. If output doesn't exist at `path`, this value is ignored.", - "default": 0, - "minimum": 0, - "maximum": 1 - }, - "overwrite": { - "type": "string", - "description": "If `true`, overwrites the existing output at `path` if it exists.\nIf `aboveVariation`, overwrites the existing output at `path` if the difference between the new output and the existing output is greater than `maxVariation`.", - "enum": [ - "true", - "false", - "aboveVariation" - ], - "default": "aboveVariation" - }, - "timeout": { - "type": "integer", - "description": "Max time in milliseconds the command is allowed to run. If the command runs longer than this, the step fails.", - "default": 60000 - } - }, - "title": "Run shell command (detailed)" - } - } - }, - "examples": [ - "docker run hello-world", - { - "command": "echo", - "args": [ - "$USER" - ] - }, - { - "command": "echo", - "args": [ - "hello-world" - ] - }, - { - "command": "docker run hello-world", - "timeout": 20000, - "exitCodes": [ - 0 - ], - "stdio": "Hello from Docker!" - }, - { - "command": "false", - "exitCodes": [ - 1 - ] - }, - { - "command": "echo", - "args": [ - "setup" - ], - "exitCodes": [ - 0 - ], - "stdio": "/.*?/" - }, - { - "command": "docker run hello-world", - "workingDirectory": ".", - "exitCodes": [ - 0 - ], - "stdio": "Hello from Docker!", - "path": "docker-output.txt", - "directory": "output", - "maxVariation": 0.1, - "overwrite": "aboveVariation" - } - ] - } - }, - "title": "runShell" - } - ] - }, - { - "allOf": [ - { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { - "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - }, - "title": "Common" - }, - { - "type": "object", - "required": [ - "runCode" - ], - "properties": { - "runCode": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "runCode", - "description": "Assemble and run code.", - "anyOf": [ - { - "type": "object", - "required": [ - "code", - "language" - ], - "properties": { - "language": { - "type": "string", - "description": "Language of the code to run.", - "enum": [ - "python", - "bash", - "javascript" - ] - }, - "code": { - "description": "Code to run.", - "type": "string" - }, - "args": { - "type": "array", - "description": "Arguments for the command.", - "items": { - "anyOf": [ - { - "type": "string" - } - ] - }, - "default": [] - }, - "workingDirectory": { - "type": "string", - "description": "Working directory for the command.", - "default": "." - }, - "exitCodes": { - "type": "array", - "description": "Expected exit codes of the command. If the command's actual exit code isn't in this list, the step fails.", - "items": { - "anyOf": [ - { - "type": "integer" - } - ] - }, - "default": [ - 0 - ] - }, - "stdio": { - "type": "string", - "description": "Content expected in the command's output. If the expected content can't be found in the command's output (either stdout or stderr), the step fails. Supports strings and regular expressions. To use a regular expression, the string must start and end with a forward slash, like in `/^hello-world.*/`." - }, - "path": { - "type": "string", - "description": "File path to save the command's output, relative to `directory`." - }, - "directory": { - "type": "string", - "description": "Directory to save the command's output. If the directory doesn't exist, creates the directory. If not specified, the directory is your media directory." - }, - "maxVariation": { - "type": "number", - "description": "Allowed variation in percentage of text different between the current output and previously saved output. If the difference between the current output and the previous output is greater than `maxVariation`, the step fails. If output doesn't exist at `path`, this value is ignored.", - "default": 0, - "minimum": 0, - "maximum": 1 - }, - "overwrite": { - "type": "string", - "description": "If `true`, overwrites the existing output at `path` if it exists.\nIf `aboveVariation`, overwrites the existing output at `path` if the difference between the new output and the existing output is greater than `maxVariation`.", - "enum": [ - "true", - "false", - "aboveVariation" - ], - "default": "aboveVariation" - }, - "timeout": { - "type": "integer", - "description": "Max time in milliseconds the command is allowed to run. If the command runs longer than this, the step fails.", - "default": 60000 - } - }, - "title": "Run code (detailed)" - } - ], - "components": { - "schemas": { - "object": { - "type": "object", - "required": [ - "code", - "language" - ], - "properties": { - "language": { - "type": "string", - "description": "Language of the code to run.", - "enum": [ - "python", - "bash", - "javascript" - ] - }, - "code": { - "description": "Code to run.", - "type": "string" - }, - "args": { - "type": "array", - "description": "Arguments for the command.", - "items": { - "anyOf": [ - { - "type": "string" - } - ] - }, - "default": [] - }, - "workingDirectory": { - "type": "string", - "description": "Working directory for the command.", - "default": "." - }, - "exitCodes": { - "type": "array", - "description": "Expected exit codes of the command. If the command's actual exit code isn't in this list, the step fails.", - "items": { - "anyOf": [ - { - "type": "integer" - } - ] - }, - "default": [ - 0 - ] - }, - "stdio": { - "type": "string", - "description": "Content expected in the command's output. If the expected content can't be found in the command's output (either stdout or stderr), the step fails. Supports strings and regular expressions. To use a regular expression, the string must start and end with a forward slash, like in `/^hello-world.*/`." - }, - "path": { - "type": "string", - "description": "File path to save the command's output, relative to `directory`." - }, - "directory": { - "type": "string", - "description": "Directory to save the command's output. If the directory doesn't exist, creates the directory. If not specified, the directory is your media directory." - }, - "maxVariation": { - "type": "number", - "description": "Allowed variation in percentage of text different between the current output and previously saved output. If the difference between the current output and the previous output is greater than `maxVariation`, the step fails. If output doesn't exist at `path`, this value is ignored.", - "default": 0, - "minimum": 0, - "maximum": 1 - }, - "overwrite": { - "type": "string", - "description": "If `true`, overwrites the existing output at `path` if it exists.\nIf `aboveVariation`, overwrites the existing output at `path` if the difference between the new output and the existing output is greater than `maxVariation`.", - "enum": [ - "true", - "false", - "aboveVariation" - ], - "default": "aboveVariation" - }, - "timeout": { - "type": "integer", - "description": "Max time in milliseconds the command is allowed to run. If the command runs longer than this, the step fails.", - "default": 60000 - } - }, - "title": "Run code (detailed)" - } - } - }, - "examples": [ - { - "language": "javascript", - "code": "console.log('Hello, ${process.env.USER}!');" - }, - { - "language": "bash", - "code": "docker run hello-world", - "timeout": 20000, - "exitCodes": [ - 0 - ], - "stdio": "Hello from Docker!" - }, - { - "language": "javascript", - "code": "return false", - "exitCodes": [ - 1 - ] - }, - { - "language": "python", - "code": "print('Hello from Python')", - "workingDirectory": ".", - "exitCodes": [ - 0 - ], - "stdio": "Hello from Python!", - "path": "python-output.txt", - "directory": "output", - "maxVariation": 0.1, - "overwrite": "aboveVariation" - } - ] - } - }, - "title": "runCode" - } - ] - }, - { - "allOf": [ - { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { - "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - }, - "title": "Common" - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "typeKeys", - "description": "Type keys. To type special keys, begin and end the string with `$` and use the special key's keyword. For example, to type the Escape key, enter `$ESCAPE$`.", - "anyOf": [ - { - "title": "Type keys (simple)", - "description": "Sequence of keys to enter.", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - } - ] - } - } - ] - }, - { - "title": "Type keys (detailed)", - "type": "object", - "properties": { - "keys": { - "title": "Type keys (simple)", - "description": "Sequence of keys to enter.", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - } - ] - } - } - ] - }, - "inputDelay": { - "type": "number", - "description": "Delay in milliseconds between each key press during a recording", - "default": 100 - }, - "selector": { - "type": "string", - "description": "Selector for the element to type into. If not specified, the typing occurs in the active element." - }, - "elementText": { - "type": "string", - "description": "Display text of the element to type into. If combined with other element finding fields, the element must match all specified criteria." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - } - }, - "required": [ - "keys" - ], - "additionalProperties": false - } - ], - "components": { - "schemas": { - "keys": { - "title": "Type keys (simple)", - "description": "Sequence of keys to enter.", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - } - ] - } - } - ] - }, - "object": { - "title": "Type keys (detailed)", - "type": "object", - "properties": { - "keys": { - "title": "Type keys (simple)", - "description": "Sequence of keys to enter.", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - } - ] - } - } - ] - }, - "inputDelay": { - "type": "number", - "description": "Delay in milliseconds between each key press during a recording", - "default": 100 - }, - "selector": { - "type": "string", - "description": "Selector for the element to type into. If not specified, the typing occurs in the active element." - }, - "elementText": { - "type": "string", - "description": "Display text of the element to type into. If combined with other element finding fields, the element must match all specified criteria." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - } - }, - "required": [ - "keys" - ], - "additionalProperties": false - } - } - }, - "examples": [ - "kittens", - [ - "$ENTER$" - ], - [ - "kittens", - "$ENTER$" - ], - { - "keys": "kittens" - }, - { - "keys": [ - "$ENTER$" - ] - }, - { - "keys": [ - "kittens", - "$ENTER$" - ], - "inputDelay": 500 - } - ] - } - }, - "title": "type" - } - ] - }, - { - "allOf": [ - { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { - "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - }, - "title": "Common" - }, - { - "type": "object", - "required": [ - "screenshot" - ], - "properties": { - "screenshot": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "screenshot", - "description": "Takes a screenshot in PNG format.", - "anyOf": [ - { - "title": "Screenshot (simple)", - "description": "File path of the PNG file. Accepts absolute paths. If not specified, the file name is the ID of the step.", - "type": "string", - "pattern": "([A-Za-z0-9_-]*\\.(png|PNG)$|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - { - "type": "object", - "additionalProperties": false, - "properties": { - "path": { - "title": "Screenshot (simple)", - "description": "File path of the PNG file. Accepts absolute paths. If not specified, the file name is the ID of the step.", - "type": "string", - "pattern": "([A-Za-z0-9_-]*\\.(png|PNG)$|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - "directory": { - "type": "string", - "description": "Directory of the PNG file. If the directory doesn't exist, creates the directory.", - "transform": [ - "trim" - ] - }, - "maxVariation": { - "type": "number", - "description": "Allowed variation in percentage of pixels between the new screenshot and the existing screenshot at `path`. If the difference between the new screenshot and the existing screenshot is greater than `maxVariation`, the step fails. If a screenshot doesn't exist at `path`, this value is ignored.", - "default": 0.05, - "minimum": 0, - "maximum": 1 - }, - "overwrite": { - "type": "string", - "description": "If `true`, overwrites the existing screenshot at `path` if it exists.\nIf `aboveVariation`, overwrites the existing screenshot at `path` if the difference between the new screenshot and the existing screenshot is greater than `maxVariation`.", - "enum": [ - "true", - "false", - "aboveVariation" - ], - "default": "aboveVariation" - }, - "crop": { - "anyOf": [ - { - "title": "Crop by element (simple)", - "type": "string", - "description": "Display text or selector of the element to screenshot." - }, - { - "title": "Crop by element (detailed)", - "type": "object", - "description": "Crop the screenshot to a specific element.", - "additionalProperties": false, - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "properties": { - "elementText": { - "type": "string", - "description": "Display text of the element to screenshot." - }, - "selector": { - "type": "string", - "description": "Selector of the element to screenshot." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - }, - "padding": { - "anyOf": [ - { - "title": "Padding (simple)", - "type": "number", - "description": "Padding in pixels to add to the bounds of the element.", - "minimum": 0 - }, - { - "type": "object", - "additionalProperties": false, - "properties": { - "top": { - "type": "number", - "minimum": 0 - }, - "right": { - "type": "number", - "minimum": 0 - }, - "bottom": { - "type": "number", - "minimum": 0 - }, - "left": { - "type": "number", - "minimum": 0 - } - }, - "title": "Padding (detailed)", - "description": "Padding in pixels to add to the bounds of the element." - } - ] - } - } - } - ] - }, - "annotations": { - "type": "array", - "description": "Array of annotations to add to the screenshot.", - "items": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "annotation", - "type": "object", - "description": "A visual annotation to add to the screenshot. Annotations can point to elements on the page (via `find`) or be positioned freely within the viewport.", - "anyOf": [ - { - "required": [ - "arrow" - ], - "not": { - "required": [ - "text", - "rectangle", - "circle", - "line", - "callout", - "highlight", - "blur" - ] - } - }, - { - "required": [ - "text" - ], - "not": { - "required": [ - "arrow", - "rectangle", - "circle", - "line", - "callout", - "highlight", - "blur" - ] - } - }, - { - "required": [ - "rectangle" - ], - "not": { - "required": [ - "arrow", - "text", - "circle", - "line", - "callout", - "highlight", - "blur" - ] - } - }, - { - "required": [ - "circle" - ], - "not": { - "required": [ - "arrow", - "text", - "rectangle", - "line", - "callout", - "highlight", - "blur" - ] - } - }, - { - "required": [ - "line" - ], - "not": { - "required": [ - "arrow", - "text", - "rectangle", - "circle", - "callout", - "highlight", - "blur" - ] - } - }, - { - "required": [ - "callout" - ], - "not": { - "required": [ - "arrow", - "text", - "rectangle", - "circle", - "line", - "highlight", - "blur" - ] - } - }, - { - "required": [ - "highlight" - ], - "not": { - "required": [ - "arrow", - "text", - "rectangle", - "circle", - "line", - "callout", - "blur" - ] - } - }, - { - "required": [ - "blur" - ], - "not": { - "required": [ - "arrow", - "text", - "rectangle", - "circle", - "line", - "callout", - "highlight" - ] - } - } - ], - "properties": { - "find": { - "type": "object", - "description": "Element on the page to annotate.", - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "additionalProperties": false, - "properties": { - "selector": { - "type": "string", - "description": "Selector of the element to annotate." - }, - "elementText": { - "type": "string", - "description": "Display text of the element to annotate." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - } - } - }, - "position": { - "anyOf": [ - { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - { - "type": "string", - "enum": [ - "top", - "bottom", - "left", - "right", - "center", - "top-left", - "top-right", - "bottom-left", - "bottom-right" - ], - "description": "Position relative to the element (if `find` is provided) or to the viewport." - } - ] - }, - "arrow": { - "type": "object", - "description": "Configuration for arrow annotations.", - "properties": { - "from": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "to": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "color": { - "type": "string", - "description": "Color of the arrow (hex, rgb, or named color).", - "default": "#FF0000" - }, - "strokeWidth": { - "type": "number", - "description": "Width of the arrow line in pixels.", - "minimum": 1, - "default": 3 - }, - "headSize": { - "type": "number", - "description": "Size of the arrowhead in pixels.", - "minimum": 1, - "default": 15 - } - } - }, - "text": { - "type": "object", - "description": "Configuration for text annotations.", - "properties": { - "content": { - "type": "string", - "description": "Text content to display." - }, - "fontSize": { - "type": "number", - "description": "Font size in pixels.", - "minimum": 1, - "default": 16 - }, - "fontFamily": { - "type": "string", - "description": "Font family name.", - "default": "Arial" - }, - "color": { - "type": "string", - "description": "Text color (hex, rgb, or named color).", - "default": "#000000" - }, - "backgroundColor": { - "type": "string", - "description": "Background color for the text box.", - "default": "#FFFFFF" - }, - "padding": { - "anyOf": [ - { - "type": "number", - "description": "Padding in pixels on all sides.", - "minimum": 0 - }, - { - "type": "object", - "additionalProperties": false, - "properties": { - "top": { - "type": "number", - "minimum": 0 - }, - "right": { - "type": "number", - "minimum": 0 - }, - "bottom": { - "type": "number", - "minimum": 0 - }, - "left": { - "type": "number", - "minimum": 0 - } - } - } - ], - "default": 5 - }, - "maxWidth": { - "type": "number", - "description": "Maximum width of the text box. Text will wrap.", - "minimum": 1 - }, - "opacity": { - "type": "number", - "description": "Opacity of the text and background (0-1).", - "minimum": 0, - "maximum": 1, - "default": 1 - } - }, - "required": [ - "content" - ] - }, - "rectangle": { - "type": "object", - "description": "Configuration for rectangle annotations.", - "properties": { - "width": { - "type": "number", - "description": "Width of the rectangle in pixels.", - "minimum": 1 - }, - "height": { - "type": "number", - "description": "Height of the rectangle in pixels.", - "minimum": 1 - }, - "fill": { - "type": "string", - "description": "Fill color (hex, rgb, or named color). Use 'transparent' for no fill.", - "default": "transparent" - }, - "stroke": { - "type": "string", - "description": "Border color (hex, rgb, or named color).", - "default": "#FF0000" - }, - "strokeWidth": { - "type": "number", - "description": "Border width in pixels.", - "minimum": 0, - "default": 2 - }, - "opacity": { - "type": "number", - "description": "Opacity (0-1).", - "minimum": 0, - "maximum": 1, - "default": 1 - }, - "rx": { - "type": "number", - "description": "Horizontal corner radius for rounded rectangles.", - "minimum": 0, - "default": 0 - }, - "ry": { - "type": "number", - "description": "Vertical corner radius for rounded rectangles.", - "minimum": 0, - "default": 0 - } - } - }, - "circle": { - "type": "object", - "description": "Configuration for circle annotations.", - "properties": { - "radius": { - "type": "number", - "description": "Radius of the circle in pixels.", - "minimum": 1, - "default": 30 - }, - "fill": { - "type": "string", - "description": "Fill color (hex, rgb, or named color). Use 'transparent' for no fill.", - "default": "transparent" - }, - "stroke": { - "type": "string", - "description": "Border color (hex, rgb, or named color).", - "default": "#FF0000" - }, - "strokeWidth": { - "type": "number", - "description": "Border width in pixels.", - "minimum": 0, - "default": 2 - }, - "opacity": { - "type": "number", - "description": "Opacity (0-1).", - "minimum": 0, - "maximum": 1, - "default": 1 - } - } - }, - "line": { - "type": "object", - "description": "Configuration for line annotations.", - "properties": { - "from": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "to": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "color": { - "type": "string", - "description": "Color of the line (hex, rgb, or named color).", - "default": "#000000" - }, - "strokeWidth": { - "type": "number", - "description": "Width of the line in pixels.", - "minimum": 1, - "default": 2 - }, - "dashArray": { - "type": "array", - "description": "Dash pattern [dash, gap]. E.g., [5, 5] for dashed line.", - "items": { - "type": "number", - "minimum": 0 - } - } - }, - "required": [ - "from", - "to" - ] - }, - "callout": { - "type": "object", - "description": "Configuration for callout annotations (text with arrow).", - "properties": { - "content": { - "type": "string", - "description": "Text content to display." - }, - "target": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "textPosition": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "fontSize": { - "type": "number", - "description": "Font size in pixels.", - "minimum": 1, - "default": 14 - }, - "color": { - "type": "string", - "description": "Text color.", - "default": "#000000" - }, - "backgroundColor": { - "type": "string", - "description": "Background color for the text box.", - "default": "#FFFFCC" - }, - "arrowColor": { - "type": "string", - "description": "Color of the arrow.", - "default": "#000000" - }, - "maxWidth": { - "type": "number", - "description": "Maximum width of the text box.", - "minimum": 1 - } - }, - "required": [ - "content", - "target" - ] - }, - "highlight": { - "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", - "properties": { - "color": { - "type": "string", - "description": "Highlight color (hex, rgb, or named color).", - "default": "#FFFF00" - }, - "opacity": { - "type": "number", - "description": "Opacity (0-1).", - "minimum": 0, - "maximum": 1, - "default": 0.3 - } - } - }, - "blur": { - "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", - "properties": { - "intensity": { - "type": "number", - "description": "Blur intensity level.", - "minimum": 1, - "default": 10 - }, - "width": { - "type": "number", - "description": "Width of the blur area in pixels.", - "minimum": 1 - }, - "height": { - "type": "number", - "description": "Height of the blur area in pixels.", - "minimum": 1 - } - } - } - }, - "components": { - "schemas": { - "arrow_properties": { - "type": "object", - "description": "Configuration for arrow annotations.", - "properties": { - "from": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "to": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "color": { - "type": "string", - "description": "Color of the arrow (hex, rgb, or named color).", - "default": "#FF0000" - }, - "strokeWidth": { - "type": "number", - "description": "Width of the arrow line in pixels.", - "minimum": 1, - "default": 3 - }, - "headSize": { - "type": "number", - "description": "Size of the arrowhead in pixels.", - "minimum": 1, - "default": 15 - } - } - }, - "text_properties": { - "type": "object", - "description": "Configuration for text annotations.", - "properties": { - "content": { - "type": "string", - "description": "Text content to display." - }, - "fontSize": { - "type": "number", - "description": "Font size in pixels.", - "minimum": 1, - "default": 16 - }, - "fontFamily": { - "type": "string", - "description": "Font family name.", - "default": "Arial" - }, - "color": { - "type": "string", - "description": "Text color (hex, rgb, or named color).", - "default": "#000000" - }, - "backgroundColor": { - "type": "string", - "description": "Background color for the text box.", - "default": "#FFFFFF" - }, - "padding": { - "anyOf": [ - { - "type": "number", - "description": "Padding in pixels on all sides.", - "minimum": 0 - }, - { - "type": "object", - "additionalProperties": false, - "properties": { - "top": { - "type": "number", - "minimum": 0 - }, - "right": { - "type": "number", - "minimum": 0 - }, - "bottom": { - "type": "number", - "minimum": 0 - }, - "left": { - "type": "number", - "minimum": 0 - } - } - } - ], - "default": 5 - }, - "maxWidth": { - "type": "number", - "description": "Maximum width of the text box. Text will wrap.", - "minimum": 1 - }, - "opacity": { - "type": "number", - "description": "Opacity of the text and background (0-1).", - "minimum": 0, - "maximum": 1, - "default": 1 - } - }, - "required": [ - "content" - ] - }, - "rectangle_properties": { - "type": "object", - "description": "Configuration for rectangle annotations.", - "properties": { - "width": { - "type": "number", - "description": "Width of the rectangle in pixels.", - "minimum": 1 - }, - "height": { - "type": "number", - "description": "Height of the rectangle in pixels.", - "minimum": 1 - }, - "fill": { - "type": "string", - "description": "Fill color (hex, rgb, or named color). Use 'transparent' for no fill.", - "default": "transparent" - }, - "stroke": { - "type": "string", - "description": "Border color (hex, rgb, or named color).", - "default": "#FF0000" - }, - "strokeWidth": { - "type": "number", - "description": "Border width in pixels.", - "minimum": 0, - "default": 2 - }, - "opacity": { - "type": "number", - "description": "Opacity (0-1).", - "minimum": 0, - "maximum": 1, - "default": 1 - }, - "rx": { - "type": "number", - "description": "Horizontal corner radius for rounded rectangles.", - "minimum": 0, - "default": 0 - }, - "ry": { - "type": "number", - "description": "Vertical corner radius for rounded rectangles.", - "minimum": 0, - "default": 0 - } - } - }, - "circle_properties": { - "type": "object", - "description": "Configuration for circle annotations.", - "properties": { - "radius": { - "type": "number", - "description": "Radius of the circle in pixels.", - "minimum": 1, - "default": 30 - }, - "fill": { - "type": "string", - "description": "Fill color (hex, rgb, or named color). Use 'transparent' for no fill.", - "default": "transparent" - }, - "stroke": { - "type": "string", - "description": "Border color (hex, rgb, or named color).", - "default": "#FF0000" - }, - "strokeWidth": { - "type": "number", - "description": "Border width in pixels.", - "minimum": 0, - "default": 2 - }, - "opacity": { - "type": "number", - "description": "Opacity (0-1).", - "minimum": 0, - "maximum": 1, - "default": 1 - } - } - }, - "line_properties": { - "type": "object", - "description": "Configuration for line annotations.", - "properties": { - "from": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "to": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "color": { - "type": "string", - "description": "Color of the line (hex, rgb, or named color).", - "default": "#000000" - }, - "strokeWidth": { - "type": "number", - "description": "Width of the line in pixels.", - "minimum": 1, - "default": 2 - }, - "dashArray": { - "type": "array", - "description": "Dash pattern [dash, gap]. E.g., [5, 5] for dashed line.", - "items": { - "type": "number", - "minimum": 0 - } - } - }, - "required": [ - "from", - "to" - ] - }, - "callout_properties": { - "type": "object", - "description": "Configuration for callout annotations (text with arrow).", - "properties": { - "content": { - "type": "string", - "description": "Text content to display." - }, - "target": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "textPosition": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "fontSize": { - "type": "number", - "description": "Font size in pixels.", - "minimum": 1, - "default": 14 - }, - "color": { - "type": "string", - "description": "Text color.", - "default": "#000000" - }, - "backgroundColor": { - "type": "string", - "description": "Background color for the text box.", - "default": "#FFFFCC" - }, - "arrowColor": { - "type": "string", - "description": "Color of the arrow.", - "default": "#000000" - }, - "maxWidth": { - "type": "number", - "description": "Maximum width of the text box.", - "minimum": 1 - } - }, - "required": [ - "content", - "target" - ] - }, - "highlight_properties": { - "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", - "properties": { - "color": { - "type": "string", - "description": "Highlight color (hex, rgb, or named color).", - "default": "#FFFF00" - }, - "opacity": { - "type": "number", - "description": "Opacity (0-1).", - "minimum": 0, - "maximum": 1, - "default": 0.3 - } - } - }, - "blur_properties": { - "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", - "properties": { - "intensity": { - "type": "number", - "description": "Blur intensity level.", - "minimum": 1, - "default": 10 - }, - "width": { - "type": "number", - "description": "Width of the blur area in pixels.", - "minimum": 1 - }, - "height": { - "type": "number", - "description": "Height of the blur area in pixels.", - "minimum": 1 - } - } - }, - "point": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "padding": { - "type": "object", - "additionalProperties": false, - "properties": { - "top": { - "type": "number", - "minimum": 0 - }, - "right": { - "type": "number", - "minimum": 0 - }, - "bottom": { - "type": "number", - "minimum": 0 - }, - "left": { - "type": "number", - "minimum": 0 - } - } - } - } - }, - "examples": [ - { - "find": { - "selector": "#submit-button" - }, - "arrow": { - "from": { - "x": 0, - "y": -50 - }, - "to": { - "x": 0, - "y": 0 - }, - "color": "#00FF00", - "strokeWidth": 4, - "headSize": 20 - } - }, - { - "position": "top-right", - "text": { - "content": "Important Notice", - "fontSize": 18, - "color": "#FFFFFF", - "backgroundColor": "#0000FF", - "padding": 10, - "maxWidth": 200, - "opacity": 0.9 - } - }, - { - "find": { - "elementClass": [ - "sensitive-info", - "/^private-/" - ] - }, - "blur": { - "intensity": 15, - "width": 200, - "height": 50 - } - } - ] - } - } - }, - "title": "Capture screenshot (detailed)" - }, - { - "type": "boolean", - "title": "Capture screenshot", - "description": "If `true`, captures a screenshot. If `false`, doesn't capture a screenshot." - } - ], - "components": { - "schemas": { - "path": { - "title": "Screenshot (simple)", - "description": "File path of the PNG file. Accepts absolute paths. If not specified, the file name is the ID of the step.", - "type": "string", - "pattern": "([A-Za-z0-9_-]*\\.(png|PNG)$|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - "object": { - "type": "object", - "additionalProperties": false, - "properties": { - "path": { - "title": "Screenshot (simple)", - "description": "File path of the PNG file. Accepts absolute paths. If not specified, the file name is the ID of the step.", - "type": "string", - "pattern": "([A-Za-z0-9_-]*\\.(png|PNG)$|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - "directory": { - "type": "string", - "description": "Directory of the PNG file. If the directory doesn't exist, creates the directory.", - "transform": [ - "trim" - ] - }, - "maxVariation": { - "type": "number", - "description": "Allowed variation in percentage of pixels between the new screenshot and the existing screenshot at `path`. If the difference between the new screenshot and the existing screenshot is greater than `maxVariation`, the step fails. If a screenshot doesn't exist at `path`, this value is ignored.", - "default": 0.05, - "minimum": 0, - "maximum": 1 - }, - "overwrite": { - "type": "string", - "description": "If `true`, overwrites the existing screenshot at `path` if it exists.\nIf `aboveVariation`, overwrites the existing screenshot at `path` if the difference between the new screenshot and the existing screenshot is greater than `maxVariation`.", - "enum": [ - "true", - "false", - "aboveVariation" - ], - "default": "aboveVariation" - }, - "crop": { - "anyOf": [ - { - "title": "Crop by element (simple)", - "type": "string", - "description": "Display text or selector of the element to screenshot." - }, - { - "title": "Crop by element (detailed)", - "type": "object", - "description": "Crop the screenshot to a specific element.", - "additionalProperties": false, - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "properties": { - "elementText": { - "type": "string", - "description": "Display text of the element to screenshot." - }, - "selector": { - "type": "string", - "description": "Selector of the element to screenshot." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - }, - "padding": { - "anyOf": [ - { - "title": "Padding (simple)", - "type": "number", - "description": "Padding in pixels to add to the bounds of the element.", - "minimum": 0 - }, - { - "type": "object", - "additionalProperties": false, - "properties": { - "top": { - "type": "number", - "minimum": 0 - }, - "right": { - "type": "number", - "minimum": 0 - }, - "bottom": { - "type": "number", - "minimum": 0 - }, - "left": { - "type": "number", - "minimum": 0 - } - }, - "title": "Padding (detailed)", - "description": "Padding in pixels to add to the bounds of the element." - } - ] - } - } - } - ] - }, - "annotations": { - "type": "array", - "description": "Array of annotations to add to the screenshot.", - "items": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "annotation", - "type": "object", - "description": "A visual annotation to add to the screenshot. Annotations can point to elements on the page (via `find`) or be positioned freely within the viewport.", - "anyOf": [ - { - "required": [ - "arrow" - ], - "not": { - "required": [ - "text", - "rectangle", - "circle", - "line", - "callout", - "highlight", - "blur" - ] - } - }, - { - "required": [ - "text" - ], - "not": { - "required": [ - "arrow", - "rectangle", - "circle", - "line", - "callout", - "highlight", - "blur" - ] - } - }, - { - "required": [ - "rectangle" - ], - "not": { - "required": [ - "arrow", - "text", - "circle", - "line", - "callout", - "highlight", - "blur" - ] - } - }, - { - "required": [ - "circle" - ], - "not": { - "required": [ - "arrow", - "text", - "rectangle", - "line", - "callout", - "highlight", - "blur" - ] - } - }, - { - "required": [ - "line" - ], - "not": { - "required": [ - "arrow", - "text", - "rectangle", - "circle", - "callout", - "highlight", - "blur" - ] - } - }, - { - "required": [ - "callout" - ], - "not": { - "required": [ - "arrow", - "text", - "rectangle", - "circle", - "line", - "highlight", - "blur" - ] - } - }, - { - "required": [ - "highlight" - ], - "not": { - "required": [ - "arrow", - "text", - "rectangle", - "circle", - "line", - "callout", - "blur" - ] - } - }, - { - "required": [ - "blur" - ], - "not": { - "required": [ - "arrow", - "text", - "rectangle", - "circle", - "line", - "callout", - "highlight" - ] - } - } - ], - "properties": { - "find": { - "type": "object", - "description": "Element on the page to annotate.", - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "additionalProperties": false, - "properties": { - "selector": { - "type": "string", - "description": "Selector of the element to annotate." - }, - "elementText": { - "type": "string", - "description": "Display text of the element to annotate." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - } - } - }, - "position": { - "anyOf": [ - { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - { - "type": "string", - "enum": [ - "top", - "bottom", - "left", - "right", - "center", - "top-left", - "top-right", - "bottom-left", - "bottom-right" - ], - "description": "Position relative to the element (if `find` is provided) or to the viewport." - } - ] - }, - "arrow": { - "type": "object", - "description": "Configuration for arrow annotations.", - "properties": { - "from": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "to": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "color": { - "type": "string", - "description": "Color of the arrow (hex, rgb, or named color).", - "default": "#FF0000" - }, - "strokeWidth": { - "type": "number", - "description": "Width of the arrow line in pixels.", - "minimum": 1, - "default": 3 - }, - "headSize": { - "type": "number", - "description": "Size of the arrowhead in pixels.", - "minimum": 1, - "default": 15 - } - } - }, - "text": { - "type": "object", - "description": "Configuration for text annotations.", - "properties": { - "content": { - "type": "string", - "description": "Text content to display." - }, - "fontSize": { - "type": "number", - "description": "Font size in pixels.", - "minimum": 1, - "default": 16 - }, - "fontFamily": { - "type": "string", - "description": "Font family name.", - "default": "Arial" - }, - "color": { - "type": "string", - "description": "Text color (hex, rgb, or named color).", - "default": "#000000" - }, - "backgroundColor": { - "type": "string", - "description": "Background color for the text box.", - "default": "#FFFFFF" - }, - "padding": { - "anyOf": [ - { - "type": "number", - "description": "Padding in pixels on all sides.", - "minimum": 0 - }, - { - "type": "object", - "additionalProperties": false, - "properties": { - "top": { - "type": "number", - "minimum": 0 - }, - "right": { - "type": "number", - "minimum": 0 - }, - "bottom": { - "type": "number", - "minimum": 0 - }, - "left": { - "type": "number", - "minimum": 0 - } - } - } - ], - "default": 5 - }, - "maxWidth": { - "type": "number", - "description": "Maximum width of the text box. Text will wrap.", - "minimum": 1 - }, - "opacity": { - "type": "number", - "description": "Opacity of the text and background (0-1).", - "minimum": 0, - "maximum": 1, - "default": 1 - } - }, - "required": [ - "content" - ] - }, - "rectangle": { - "type": "object", - "description": "Configuration for rectangle annotations.", - "properties": { - "width": { - "type": "number", - "description": "Width of the rectangle in pixels.", - "minimum": 1 - }, - "height": { - "type": "number", - "description": "Height of the rectangle in pixels.", - "minimum": 1 - }, - "fill": { - "type": "string", - "description": "Fill color (hex, rgb, or named color). Use 'transparent' for no fill.", - "default": "transparent" - }, - "stroke": { - "type": "string", - "description": "Border color (hex, rgb, or named color).", - "default": "#FF0000" - }, - "strokeWidth": { - "type": "number", - "description": "Border width in pixels.", - "minimum": 0, - "default": 2 - }, - "opacity": { - "type": "number", - "description": "Opacity (0-1).", - "minimum": 0, - "maximum": 1, - "default": 1 - }, - "rx": { - "type": "number", - "description": "Horizontal corner radius for rounded rectangles.", - "minimum": 0, - "default": 0 - }, - "ry": { - "type": "number", - "description": "Vertical corner radius for rounded rectangles.", - "minimum": 0, - "default": 0 - } - } - }, - "circle": { - "type": "object", - "description": "Configuration for circle annotations.", - "properties": { - "radius": { - "type": "number", - "description": "Radius of the circle in pixels.", - "minimum": 1, - "default": 30 - }, - "fill": { - "type": "string", - "description": "Fill color (hex, rgb, or named color). Use 'transparent' for no fill.", - "default": "transparent" - }, - "stroke": { - "type": "string", - "description": "Border color (hex, rgb, or named color).", - "default": "#FF0000" - }, - "strokeWidth": { - "type": "number", - "description": "Border width in pixels.", - "minimum": 0, - "default": 2 - }, - "opacity": { - "type": "number", - "description": "Opacity (0-1).", - "minimum": 0, - "maximum": 1, - "default": 1 - } - } - }, - "line": { - "type": "object", - "description": "Configuration for line annotations.", - "properties": { - "from": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "to": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "color": { - "type": "string", - "description": "Color of the line (hex, rgb, or named color).", - "default": "#000000" - }, - "strokeWidth": { - "type": "number", - "description": "Width of the line in pixels.", - "minimum": 1, - "default": 2 - }, - "dashArray": { - "type": "array", - "description": "Dash pattern [dash, gap]. E.g., [5, 5] for dashed line.", - "items": { - "type": "number", - "minimum": 0 - } - } - }, - "required": [ - "from", - "to" - ] - }, - "callout": { - "type": "object", - "description": "Configuration for callout annotations (text with arrow).", - "properties": { - "content": { - "type": "string", - "description": "Text content to display." - }, - "target": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "textPosition": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "fontSize": { - "type": "number", - "description": "Font size in pixels.", - "minimum": 1, - "default": 14 - }, - "color": { - "type": "string", - "description": "Text color.", - "default": "#000000" - }, - "backgroundColor": { - "type": "string", - "description": "Background color for the text box.", - "default": "#FFFFCC" - }, - "arrowColor": { - "type": "string", - "description": "Color of the arrow.", - "default": "#000000" - }, - "maxWidth": { - "type": "number", - "description": "Maximum width of the text box.", - "minimum": 1 - } - }, - "required": [ - "content", - "target" - ] - }, - "highlight": { - "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", - "properties": { - "color": { - "type": "string", - "description": "Highlight color (hex, rgb, or named color).", - "default": "#FFFF00" - }, - "opacity": { - "type": "number", - "description": "Opacity (0-1).", - "minimum": 0, - "maximum": 1, - "default": 0.3 - } - } - }, - "blur": { - "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", - "properties": { - "intensity": { - "type": "number", - "description": "Blur intensity level.", - "minimum": 1, - "default": 10 - }, - "width": { - "type": "number", - "description": "Width of the blur area in pixels.", - "minimum": 1 - }, - "height": { - "type": "number", - "description": "Height of the blur area in pixels.", - "minimum": 1 - } - } - } - }, - "components": { - "schemas": { - "arrow_properties": { - "type": "object", - "description": "Configuration for arrow annotations.", - "properties": { - "from": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "to": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "color": { - "type": "string", - "description": "Color of the arrow (hex, rgb, or named color).", - "default": "#FF0000" - }, - "strokeWidth": { - "type": "number", - "description": "Width of the arrow line in pixels.", - "minimum": 1, - "default": 3 - }, - "headSize": { - "type": "number", - "description": "Size of the arrowhead in pixels.", - "minimum": 1, - "default": 15 - } - } - }, - "text_properties": { - "type": "object", - "description": "Configuration for text annotations.", - "properties": { - "content": { - "type": "string", - "description": "Text content to display." - }, - "fontSize": { - "type": "number", - "description": "Font size in pixels.", - "minimum": 1, - "default": 16 - }, - "fontFamily": { - "type": "string", - "description": "Font family name.", - "default": "Arial" - }, - "color": { - "type": "string", - "description": "Text color (hex, rgb, or named color).", - "default": "#000000" - }, - "backgroundColor": { - "type": "string", - "description": "Background color for the text box.", - "default": "#FFFFFF" - }, - "padding": { - "anyOf": [ - { - "type": "number", - "description": "Padding in pixels on all sides.", - "minimum": 0 - }, - { - "type": "object", - "additionalProperties": false, - "properties": { - "top": { - "type": "number", - "minimum": 0 - }, - "right": { - "type": "number", - "minimum": 0 - }, - "bottom": { - "type": "number", - "minimum": 0 - }, - "left": { - "type": "number", - "minimum": 0 - } - } - } - ], - "default": 5 - }, - "maxWidth": { - "type": "number", - "description": "Maximum width of the text box. Text will wrap.", - "minimum": 1 - }, - "opacity": { - "type": "number", - "description": "Opacity of the text and background (0-1).", - "minimum": 0, - "maximum": 1, - "default": 1 - } - }, - "required": [ - "content" - ] - }, - "rectangle_properties": { - "type": "object", - "description": "Configuration for rectangle annotations.", - "properties": { - "width": { - "type": "number", - "description": "Width of the rectangle in pixels.", - "minimum": 1 - }, - "height": { - "type": "number", - "description": "Height of the rectangle in pixels.", - "minimum": 1 - }, - "fill": { - "type": "string", - "description": "Fill color (hex, rgb, or named color). Use 'transparent' for no fill.", - "default": "transparent" - }, - "stroke": { - "type": "string", - "description": "Border color (hex, rgb, or named color).", - "default": "#FF0000" - }, - "strokeWidth": { - "type": "number", - "description": "Border width in pixels.", - "minimum": 0, - "default": 2 - }, - "opacity": { - "type": "number", - "description": "Opacity (0-1).", - "minimum": 0, - "maximum": 1, - "default": 1 - }, - "rx": { - "type": "number", - "description": "Horizontal corner radius for rounded rectangles.", - "minimum": 0, - "default": 0 - }, - "ry": { - "type": "number", - "description": "Vertical corner radius for rounded rectangles.", - "minimum": 0, - "default": 0 - } - } - }, - "circle_properties": { - "type": "object", - "description": "Configuration for circle annotations.", - "properties": { - "radius": { - "type": "number", - "description": "Radius of the circle in pixels.", - "minimum": 1, - "default": 30 - }, - "fill": { - "type": "string", - "description": "Fill color (hex, rgb, or named color). Use 'transparent' for no fill.", - "default": "transparent" - }, - "stroke": { - "type": "string", - "description": "Border color (hex, rgb, or named color).", - "default": "#FF0000" - }, - "strokeWidth": { - "type": "number", - "description": "Border width in pixels.", - "minimum": 0, - "default": 2 - }, - "opacity": { - "type": "number", - "description": "Opacity (0-1).", - "minimum": 0, - "maximum": 1, - "default": 1 - } - } - }, - "line_properties": { - "type": "object", - "description": "Configuration for line annotations.", - "properties": { - "from": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "to": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "color": { - "type": "string", - "description": "Color of the line (hex, rgb, or named color).", - "default": "#000000" - }, - "strokeWidth": { - "type": "number", - "description": "Width of the line in pixels.", - "minimum": 1, - "default": 2 - }, - "dashArray": { - "type": "array", - "description": "Dash pattern [dash, gap]. E.g., [5, 5] for dashed line.", - "items": { - "type": "number", - "minimum": 0 - } - } - }, - "required": [ - "from", - "to" - ] - }, - "callout_properties": { - "type": "object", - "description": "Configuration for callout annotations (text with arrow).", - "properties": { - "content": { - "type": "string", - "description": "Text content to display." - }, - "target": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "textPosition": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "fontSize": { - "type": "number", - "description": "Font size in pixels.", - "minimum": 1, - "default": 14 - }, - "color": { - "type": "string", - "description": "Text color.", - "default": "#000000" - }, - "backgroundColor": { - "type": "string", - "description": "Background color for the text box.", - "default": "#FFFFCC" - }, - "arrowColor": { - "type": "string", - "description": "Color of the arrow.", - "default": "#000000" - }, - "maxWidth": { - "type": "number", - "description": "Maximum width of the text box.", - "minimum": 1 - } - }, - "required": [ - "content", - "target" - ] - }, - "highlight_properties": { - "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", - "properties": { - "color": { - "type": "string", - "description": "Highlight color (hex, rgb, or named color).", - "default": "#FFFF00" - }, - "opacity": { - "type": "number", - "description": "Opacity (0-1).", - "minimum": 0, - "maximum": 1, - "default": 0.3 - } - } - }, - "blur_properties": { - "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", - "properties": { - "intensity": { - "type": "number", - "description": "Blur intensity level.", - "minimum": 1, - "default": 10 - }, - "width": { - "type": "number", - "description": "Width of the blur area in pixels.", - "minimum": 1 - }, - "height": { - "type": "number", - "description": "Height of the blur area in pixels.", - "minimum": 1 - } - } - }, - "point": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "padding": { - "type": "object", - "additionalProperties": false, - "properties": { - "top": { - "type": "number", - "minimum": 0 - }, - "right": { - "type": "number", - "minimum": 0 - }, - "bottom": { - "type": "number", - "minimum": 0 - }, - "left": { - "type": "number", - "minimum": 0 - } - } - } - } - }, - "examples": [ - { - "find": { - "selector": "#submit-button" - }, - "arrow": { - "from": { - "x": 0, - "y": -50 - }, - "to": { - "x": 0, - "y": 0 - }, - "color": "#00FF00", - "strokeWidth": 4, - "headSize": 20 - } - }, - { - "position": "top-right", - "text": { - "content": "Important Notice", - "fontSize": 18, - "color": "#FFFFFF", - "backgroundColor": "#0000FF", - "padding": 10, - "maxWidth": 200, - "opacity": 0.9 - } - }, - { - "find": { - "elementClass": [ - "sensitive-info", - "/^private-/" - ] - }, - "blur": { - "intensity": 15, - "width": 200, - "height": 50 - } - } - ] - } - } - }, - "title": "Capture screenshot (detailed)" - }, - "crop_element": { - "title": "Crop by element (detailed)", - "type": "object", - "description": "Crop the screenshot to a specific element.", - "additionalProperties": false, - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "properties": { - "elementText": { - "type": "string", - "description": "Display text of the element to screenshot." - }, - "selector": { - "type": "string", - "description": "Selector of the element to screenshot." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - }, - "padding": { - "anyOf": [ - { - "title": "Padding (simple)", - "type": "number", - "description": "Padding in pixels to add to the bounds of the element.", - "minimum": 0 - }, - { - "type": "object", - "additionalProperties": false, - "properties": { - "top": { - "type": "number", - "minimum": 0 - }, - "right": { - "type": "number", - "minimum": 0 - }, - "bottom": { - "type": "number", - "minimum": 0 - }, - "left": { - "type": "number", - "minimum": 0 - } - }, - "title": "Padding (detailed)", - "description": "Padding in pixels to add to the bounds of the element." - } - ] - } - } - }, - "padding": { - "type": "object", - "additionalProperties": false, - "properties": { - "top": { - "type": "number", - "minimum": 0 - }, - "right": { - "type": "number", - "minimum": 0 - }, - "bottom": { - "type": "number", - "minimum": 0 - }, - "left": { - "type": "number", - "minimum": 0 - } - }, - "title": "Padding (detailed)", - "description": "Padding in pixels to add to the bounds of the element." - } - } - }, - "examples": [ - true, - "image.png", - "static/images/image.png", - "/User/manny/projects/doc-detective/static/images/image.png", - { - "path": "image.png", - "directory": "static/images", - "maxVariation": 0.1, - "overwrite": "aboveVariation", - "crop": "#elementToScreenshot" - }, - { - "path": "image.png", - "directory": "static/images", - "maxVariation": 0.1, - "overwrite": "aboveVariation" - }, - { - "path": "image.png", - "directory": "static/images", - "maxVariation": 0.1, - "overwrite": "aboveVariation", - "crop": { - "selector": "#elementToScreenshot", - "elementText": "Element text", - "padding": { - "top": 0, - "right": 0, - "bottom": 0, - "left": 0 - } - } - }, - { - "path": "image.png", - "annotations": [ - { - "find": { - "selector": "#usernameField" - }, - "arrow": { - "from": { - "x": 0, - "y": -50 - }, - "to": { - "x": 0, - "y": 0 - }, - "color": "#FF0000", - "strokeWidth": 4, - "headSize": 10 - } - }, - { - "find": { - "elementText": "Username", - "elementClass": [ - "input-field", - "/^user-/" - ] - }, - "text": { - "content": "Enter your username here", - "fontSize": 14, - "color": "#0000FF", - "backgroundColor": "#FFFFFF", - "padding": 5 - } - }, - { - "rectangle": { - "x": 100, - "y": 150, - "width": 200, - "height": 100, - "borderColor": "#00FF00", - "borderWidth": 3, - "fillColor": "rgba(0, 255, 0, 0.2)" - } - } - ] - } - ] - } - }, - "title": "screenshot" - } - ] - }, - { - "allOf": [ - { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { - "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - }, - "title": "Common" - }, - { - "type": "object", - "required": [ - "saveCookie" - ], - "properties": { - "saveCookie": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "saveCookie", - "description": "Save a specific browser cookie to a file or environment variable for later reuse.", - "anyOf": [ - { - "type": "string", - "title": "Cookie name", - "description": "Name of the specific cookie to save. Will be saved to a default file path or environment variable.", - "pattern": "^[A-Za-z0-9_./\\-]+$", - "transform": [ - "trim" - ] - }, - { - "type": "object", - "additionalProperties": false, - "properties": { - "$schema": { - "description": "Optional self-describing schema URI for linters", - "type": "string", - "format": "uri-reference" - }, - "name": { - "type": "string", - "title": "Cookie name", - "description": "Name of the specific cookie to save.", - "pattern": "^[A-Za-z0-9_.-]+$", - "transform": [ - "trim" - ] - }, - "variable": { - "type": "string", - "title": "Environment variable name", - "description": "Environment variable name to store the cookie as JSON string.", - "pattern": "^[A-Za-z_][A-Za-z0-9_]*$", - "transform": [ - "trim" - ] - }, - "path": { - "type": "string", - "title": "Cookie file path", - "description": "File path to save the cookie, relative to directory. Uses Netscape cookie format.", - "transform": [ - "trim" - ] - }, - "directory": { - "type": "string", - "title": "Directory path", - "description": "Directory to save the cookie file. If not specified, uses output directory.", - "transform": [ - "trim" - ] - }, - "overwrite": { - "type": "boolean", - "title": "Overwrite existing file", - "description": "Whether to overwrite existing cookie file.", - "default": false - }, - "domain": { - "type": "string", - "title": "Cookie domain", - "description": "Specific domain to filter the cookie by (optional).", - "transform": [ - "trim" - ] - } - }, - "required": [ - "name" - ], - "anyOf": [ - { - "required": [ - "path" - ], - "not": { - "required": [ - "variable" - ] - } - }, - { - "required": [ - "variable" - ], - "not": { - "anyOf": [ - { - "required": [ - "path" - ] - }, - { - "required": [ - "directory" - ] - } - ] - } - } - ], - "title": "Save cookie (detailed)" - } - ], - "components": { - "schemas": { - "string": { - "type": "string", - "title": "Cookie name", - "description": "Name of the specific cookie to save. Will be saved to a default file path or environment variable.", - "pattern": "^[A-Za-z0-9_./\\-]+$", - "transform": [ - "trim" - ] - }, - "object": { - "type": "object", - "additionalProperties": false, - "properties": { - "$schema": { - "description": "Optional self-describing schema URI for linters", - "type": "string", - "format": "uri-reference" - }, - "name": { - "type": "string", - "title": "Cookie name", - "description": "Name of the specific cookie to save.", - "pattern": "^[A-Za-z0-9_.-]+$", - "transform": [ - "trim" - ] - }, - "variable": { - "type": "string", - "title": "Environment variable name", - "description": "Environment variable name to store the cookie as JSON string.", - "pattern": "^[A-Za-z_][A-Za-z0-9_]*$", - "transform": [ - "trim" - ] - }, - "path": { - "type": "string", - "title": "Cookie file path", - "description": "File path to save the cookie, relative to directory. Uses Netscape cookie format.", - "transform": [ - "trim" - ] - }, - "directory": { - "type": "string", - "title": "Directory path", - "description": "Directory to save the cookie file. If not specified, uses output directory.", - "transform": [ - "trim" - ] - }, - "overwrite": { - "type": "boolean", - "title": "Overwrite existing file", - "description": "Whether to overwrite existing cookie file.", - "default": false - }, - "domain": { - "type": "string", - "title": "Cookie domain", - "description": "Specific domain to filter the cookie by (optional).", - "transform": [ - "trim" - ] - } - }, - "required": [ - "name" - ], - "anyOf": [ - { - "required": [ - "path" - ], - "not": { - "required": [ - "variable" - ] - } - }, - { - "required": [ - "variable" - ], - "not": { - "anyOf": [ - { - "required": [ - "path" - ] - }, - { - "required": [ - "directory" - ] - } - ] - } - } - ], - "title": "Save cookie (detailed)" - } - } - }, - "examples": [ - "session_token", - "test_env_cookie", - { - "name": "auth_cookie", - "path": "auth-cookie.txt" - }, - { - "name": "session_token", - "variable": "SESSION_TOKEN" - }, - { - "name": "test_cookie", - "path": "test-cookie.txt", - "overwrite": true - }, - { - "name": "user_session", - "path": "user-session.txt", - "directory": "./test-data", - "overwrite": true - }, - { - "name": "login_token", - "path": "login-token.txt", - "domain": "app.example.com" - } - ] - } - }, - "title": "saveCookie" - } - ] - }, - { - "allOf": [ - { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { - "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - }, - "title": "Common" - }, - { - "type": "object", - "required": [ - "record" - ], - "properties": { - "record": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "record", - "description": "Start recording the current browser viewport. Must be followed by a `stopRecord` step. Only runs in Chrome browsers when they are visible. Supported extensions: [ '.mp4', '.webm', '.gif' ]", - "anyOf": [ - { - "title": "Record (simple)", - "type": "string", - "description": "File path of the recording. Supports the `.mp4`, `.webm`, and `.gif` extensions. If not specified, the file name is the ID of the step, and the extension is `.mp4`.", - "pattern": "([A-Za-z0-9_-]*\\.(mp4|webm|gif)$|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - { - "type": "object", - "properties": { - "path": { - "type": "string", - "description": "File path of the recording. Supports the `.mp4`, `.webm`, and `.gif` extensions. If not specified, the file name is the ID of the step, and the extension is `.mp4`.", - "pattern": "([A-Za-z0-9_-]*\\.(mp4|webm|gif)$|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - "directory": { - "type": "string", - "description": "Directory of the file. If the directory doesn't exist, creates the directory.", - "transform": [ - "trim" - ] - }, - "overwrite": { - "type": "string", - "description": "If `true`, overwrites the existing recording at `path` if it exists.", - "enum": [ - "true", - "false" - ] - } - }, - "title": "Record (detailed)" - }, - { - "type": "boolean", - "title": "Record (boolean)", - "description": "If `true`, records the current browser viewport. If `false`, doesn't record the current browser viewport." - } - ], - "components": { - "schemas": { - "string": { - "title": "Record (simple)", - "type": "string", - "description": "File path of the recording. Supports the `.mp4`, `.webm`, and `.gif` extensions. If not specified, the file name is the ID of the step, and the extension is `.mp4`.", - "pattern": "([A-Za-z0-9_-]*\\.(mp4|webm|gif)$|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - "object": { - "type": "object", - "properties": { - "path": { - "type": "string", - "description": "File path of the recording. Supports the `.mp4`, `.webm`, and `.gif` extensions. If not specified, the file name is the ID of the step, and the extension is `.mp4`.", - "pattern": "([A-Za-z0-9_-]*\\.(mp4|webm|gif)$|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - "directory": { - "type": "string", - "description": "Directory of the file. If the directory doesn't exist, creates the directory.", - "transform": [ - "trim" - ] - }, - "overwrite": { - "type": "string", - "description": "If `true`, overwrites the existing recording at `path` if it exists.", - "enum": [ - "true", - "false" - ] - } - }, - "title": "Record (detailed)" - } - } - }, - "examples": [ - true, - "results.mp4", - { - "path": "results.mp4", - "directory": "static/media", - "overwrite": "true" - } - ] - } - }, - "title": "record" - } - ] - }, - { - "allOf": [ - { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { - "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - }, - "title": "Common" - }, - { - "type": "object", - "required": [ - "stopRecord" - ], - "properties": { - "stopRecord": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "stopRecord", - "description": "Stop the current recording.", - "anyOf": [ - { - "type": "boolean", - "nullable": true - } - ], - "examples": [ - true - ] - } - }, - "title": "stopRecord" - } - ] - }, - { - "allOf": [ - { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { - "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - }, - "title": "Common" - }, - { - "title": "loadVariables", - "type": "object", - "required": [ - "loadVariables" - ], - "properties": { - "loadVariables": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "loadVariables", - "type": "string", - "description": "Load environment variables from the specified `.env` file.", - "examples": [ - ".env" - ] - } - } - } - ] - }, - { - "allOf": [ - { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { - "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - }, - "title": "Common" - }, - { - "title": "dragAndDrop", - "type": "object", - "required": [ - "dragAndDrop" - ], - "properties": { - "dragAndDrop": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "dragAndDrop", - "description": "Drag and drop an element from source to target.", - "type": "object", - "required": [ - "source", - "target" - ], - "properties": { - "source": { - "description": "The element to drag.", - "anyOf": [ - { - "title": "Element (simple)", - "type": "string", - "description": "Display text, selector, or regex pattern (enclosed in forward slashes) of the element." - }, - { - "title": "Element (detailed)", - "type": "object", - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "properties": { - "elementText": { - "type": "string", - "description": "Display text or regex pattern (enclosed in forward slashes) of the element. If combined with `selector`, the element must match both the text and the selector." - }, - "selector": { - "type": "string", - "description": "Selector of the element. If combined with `elementText`, the element must match both the text and the selector." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - }, - "timeout": { - "type": "integer", - "description": "Max duration in milliseconds to wait for the element to exist.", - "default": 5000 - } - } - } - ] - }, - "target": { - "description": "The target location to drop the element.", - "anyOf": [ - { - "title": "Element (simple)", - "type": "string", - "description": "Display text, selector, or regex pattern (enclosed in forward slashes) of the element." - }, - { - "title": "Element (detailed)", - "type": "object", - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "properties": { - "elementText": { - "type": "string", - "description": "Display text or regex pattern (enclosed in forward slashes) of the element. If combined with `selector`, the element must match both the text and the selector." - }, - "selector": { - "type": "string", - "description": "Selector of the element. If combined with `elementText`, the element must match both the text and the selector." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - }, - "timeout": { - "type": "integer", - "description": "Max duration in milliseconds to wait for the element to exist.", - "default": 5000 - } - } - } - ] - }, - "duration": { - "type": "integer", - "description": "Duration of the drag operation in milliseconds.", - "default": 1000, - "minimum": 0 - } - }, - "components": { - "schemas": { - "elementSpecification": { - "anyOf": [ - { - "title": "Element (simple)", - "type": "string", - "description": "Display text, selector, or regex pattern (enclosed in forward slashes) of the element." - }, - { - "title": "Element (detailed)", - "type": "object", - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "properties": { - "elementText": { - "type": "string", - "description": "Display text or regex pattern (enclosed in forward slashes) of the element. If combined with `selector`, the element must match both the text and the selector." - }, - "selector": { - "type": "string", - "description": "Selector of the element. If combined with `elementText`, the element must match both the text and the selector." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - }, - "timeout": { - "type": "integer", - "description": "Max duration in milliseconds to wait for the element to exist.", - "default": 5000 - } - } - } - ] - }, - "string": { - "title": "Element (simple)", - "type": "string", - "description": "Display text, selector, or regex pattern (enclosed in forward slashes) of the element." - }, - "object": { - "title": "Element (detailed)", - "type": "object", - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "properties": { - "elementText": { - "type": "string", - "description": "Display text or regex pattern (enclosed in forward slashes) of the element. If combined with `selector`, the element must match both the text and the selector." - }, - "selector": { - "type": "string", - "description": "Selector of the element. If combined with `elementText`, the element must match both the text and the selector." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - }, - "timeout": { - "type": "integer", - "description": "Max duration in milliseconds to wait for the element to exist.", - "default": 5000 - } - } - } - } - }, - "examples": [ - { - "source": "Table", - "target": "#canvas" - }, - { - "source": ".draggable-block", - "target": ".drop-zone", - "duration": 2000 - }, - { - "source": { - "selector": ".widget", - "elementText": "Data Table" - }, - "target": { - "selector": "#design-canvas" - }, - "duration": 500 - }, - { - "source": { - "selector": ".draggable", - "timeout": 10000 - }, - "target": { - "elementText": "Drop Zone", - "timeout": 5000 - } - }, - { - "source": "/Widget Item.*/", - "target": "#canvas" - }, - { - "source": { - "selector": ".draggable", - "elementText": "/Button [0-9]+/" - }, - "target": { - "elementText": "/Drop Zone.*/" - } - } - ] - } - } - } - ] - }, - { - "allOf": [ - { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { - "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - }, - "title": "Common" - }, - { - "title": "loadCookie", - "type": "object", - "required": [ - "loadCookie" - ], - "properties": { - "loadCookie": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "loadCookie", - "description": "Load a specific cookie from a file or environment variable into the browser.", - "anyOf": [ - { - "type": "string", - "title": "Cookie name or file path", - "description": "Name of the specific cookie to load from default location, or file path to cookie file.", - "pattern": "^[A-Za-z0-9_./\\-]+$", - "transform": [ - "trim" - ] - }, - { - "type": "object", - "additionalProperties": false, - "required": [ - "name" - ], - "anyOf": [ - { - "required": [ - "path" - ], - "not": { - "required": [ - "variable" - ] - } - }, - { - "required": [ - "variable" - ], - "not": { - "anyOf": [ - { - "required": [ - "path" - ] - }, - { - "required": [ - "directory" - ] - } - ] - } - } - ], - "properties": { - "$schema": { - "description": "Optional self-describing schema URI for linters", - "type": "string", - "format": "uri-reference" - }, - "name": { - "type": "string", - "title": "Cookie name", - "description": "Name of the specific cookie to load.", - "pattern": "^[A-Za-z0-9_.-]+$", - "transform": [ - "trim" - ] - }, - "variable": { - "type": "string", - "title": "Environment variable name", - "description": "Environment variable name containing the cookie as JSON string.", - "pattern": "^[A-Za-z_][A-Za-z0-9_]*$", - "transform": [ - "trim" - ] - }, - "path": { - "type": "string", - "title": "Cookie file path", - "description": "File path to cookie file, relative to directory. Supports Netscape cookie format.", - "transform": [ - "trim" - ] - }, - "directory": { - "type": "string", - "title": "Directory path", - "description": "Directory containing the cookie file.", - "transform": [ - "trim" - ] - }, - "domain": { - "type": "string", - "title": "Cookie domain", - "description": "Specific domain to filter the cookie by when loading from multi-cookie file (optional).", - "transform": [ - "trim" - ] - } - }, - "title": "Load cookie (detailed)" - } - ], - "components": { - "schemas": { - "string": { - "type": "string", - "title": "Cookie name or file path", - "description": "Name of the specific cookie to load from default location, or file path to cookie file.", - "pattern": "^[A-Za-z0-9_./\\-]+$", - "transform": [ - "trim" - ] - }, - "object": { - "type": "object", - "additionalProperties": false, - "required": [ - "name" - ], - "anyOf": [ - { - "required": [ - "path" - ], - "not": { - "required": [ - "variable" - ] - } - }, - { - "required": [ - "variable" - ], - "not": { - "anyOf": [ - { - "required": [ - "path" - ] - }, - { - "required": [ - "directory" - ] - } - ] - } - } - ], - "properties": { - "$schema": { - "description": "Optional self-describing schema URI for linters", - "type": "string", - "format": "uri-reference" - }, - "name": { - "type": "string", - "title": "Cookie name", - "description": "Name of the specific cookie to load.", - "pattern": "^[A-Za-z0-9_.-]+$", - "transform": [ - "trim" - ] - }, - "variable": { - "type": "string", - "title": "Environment variable name", - "description": "Environment variable name containing the cookie as JSON string.", - "pattern": "^[A-Za-z_][A-Za-z0-9_]*$", - "transform": [ - "trim" - ] - }, - "path": { - "type": "string", - "title": "Cookie file path", - "description": "File path to cookie file, relative to directory. Supports Netscape cookie format.", - "transform": [ - "trim" - ] - }, - "directory": { - "type": "string", - "title": "Directory path", - "description": "Directory containing the cookie file.", - "transform": [ - "trim" - ] - }, - "domain": { - "type": "string", - "title": "Cookie domain", - "description": "Specific domain to filter the cookie by when loading from multi-cookie file (optional).", - "transform": [ - "trim" - ] - } - }, - "title": "Load cookie (detailed)" - } - } - }, - "examples": [ - "session_token", - "./test-data/auth-session.txt", - "test_env_cookie", - { - "name": "auth_cookie", - "variable": "AUTH_COOKIE" - }, - { - "name": "test_cookie", - "path": "test-cookie.txt" - }, - { - "name": "session_token", - "path": "session-token.txt", - "directory": "./test-data" - }, - { - "name": "user_session", - "path": "saved-cookies.txt", - "domain": "app.example.com" - } - ] - } - } - } - ] - }, - { - "allOf": [ - { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { - "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - }, - "title": "Common" - }, - { - "title": "wait", - "type": "object", - "required": [ - "wait" - ], - "properties": { - "wait": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "wait", - "description": "Pause (in milliseconds) before performing the next action.", - "default": 5000, - "anyOf": [ - { - "type": "number", - "title": "Wait (simple)" - }, - { - "title": "Wait (environment variable)", - "type": "string", - "pattern": "(\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - { - "type": "boolean", - "title": "Wait (boolean)" - } - ], - "components": { - "schemas": { - "string": { - "title": "Wait (environment variable)", - "type": "string", - "pattern": "(\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - } - } - }, - "examples": [ - 5000, - "$WAIT_DURATION", - true - ] - } - } - } - ] - } - ], - "examples": [ - { - "stepId": "uuid", - "description": "Description of the step.", - "checkLink": "https://www.google.com", - "outputs": { - "outputKey": "outputValue" - }, - "variables": { - "variableKey": "variableValue" - } - }, - { - "checkLink": "https://www.google.com" - }, - { - "stepId": "path-only", - "checkLink": "/search" - }, - { - "stepId": "status-code", - "checkLink": { - "url": "https://www.google.com", - "statusCodes": [ - 200 - ] - } - }, - { - "goTo": { - "url": "https://www.google.com" - } - }, - { - "goTo": "https://www.google.com" - }, - { - "wait": 5000 - }, - { - "runCode": { - "language": "python", - "code": "print('Hello from Python')", - "workingDirectory": ".", - "exitCodes": [ - 0 - ], - "stdio": "Hello from Python!", - "path": "python-output.txt", - "directory": "output", - "maxVariation": 0.1, - "overwrite": "aboveVariation" - } - }, - { - "stopRecord": true - }, - { - "screenshot": true - }, - { - "screenshot": "image.png" - }, - { - "screenshot": "static/images/image.png" - }, - { - "screenshot": "/User/manny/projects/doc-detective/static/images/image.png" - }, - { - "screenshot": { - "path": "image.png", - "directory": "static/images", - "maxVariation": 0.1, - "overwrite": "aboveVariation", - "crop": "#elementToScreenshot" - } - }, - { - "screenshot": { - "path": "image.png", - "directory": "static/images", - "maxVariation": 0.1, - "overwrite": "aboveVariation" - } - }, - { - "screenshot": { - "path": "image.png", - "directory": "static/images", - "maxVariation": 0.1, - "overwrite": "aboveVariation", - "crop": { - "selector": "#elementToScreenshot", - "elementText": "Element text", - "padding": { - "top": 0, - "right": 0, - "bottom": 0, - "left": 0 - } - } - } - }, - { - "record": true - }, - { - "record": "video.mp4" - }, - { - "record": "static/media/video.mp4" - }, - { - "record": "/User/manny/projects/doc-detective/static/media/video.mp4" - }, - { - "record": { - "path": "video.mp4", - "directory": "static/media", - "overwrite": true - } - }, - { - "loadVariables": "variables.env" - }, - { - "saveCookie": "session_token" - }, - { - "saveCookie": { - "name": "auth_cookie", - "path": "auth-session.txt", - "directory": "./test-data", - "overwrite": true - } - }, - { - "loadCookie": "session_token" - }, - { - "loadCookie": { - "name": "auth_cookie", - "path": "auth-session.txt", - "directory": "./test-data" - } - }, - { - "find": "Find me!" - }, - { - "find": { - "selector": "[title=Search]" - } - }, - { - "find": { - "selector": "[title=Search]", - "timeout": 10000, - "elementText": "Search", - "moveTo": true, - "click": true, - "type": "shorthair cat" - } - }, - { - "find": { - "selector": "[title=Search]", - "click": { - "button": "right" - } - } - }, - { - "find": { - "selector": "[title=Search]", - "timeout": 10000, - "elementText": "Search", - "moveTo": true, - "click": true, - "type": { - "keys": [ - "shorthair cat" - ], - "inputDelay": 100 - } - } - }, - { - "click": true - }, - { - "click": "right" - }, - { - "click": { - "button": "left", - "elementText": "Element text" - } - }, - { - "click": { - "selector": "#elementToScreenshot", - "elementText": "Element text", - "button": "middle" - } - }, - { - "httpRequest": "https://reqres.in/api/users" - }, - { - "httpRequest": { - "url": "https://reqres.in/api/users" - } - }, - { - "httpRequest": { - "url": "https://reqres.in/api/users/2", - "method": "put", - "request": { - "body": { - "name": "morpheus", - "job": "zion resident" - } - } - } - }, - { - "httpRequest": { - "url": "https://reqres.in/api/users", - "method": "post", - "request": { - "body": { - "name": "morpheus", - "job": "leader" - } - }, - "response": { - "body": { - "name": "morpheus", - "job": "leader" - } - }, - "statusCodes": [ - 200, - 201 - ] - } - }, - { - "httpRequest": { - "url": "https://www.api-server.com", - "method": "post", - "timeout": 30000, - "request": { - "body": { - "field": "value" - }, - "headers": { - "header": "value" - }, - "parameters": { - "param": "value" - } - }, - "response": { - "body": { - "field": "value" - }, - "headers": { - "header": "value" - } - }, - "statusCodes": [ - 200 - ] - } - }, - { - "httpRequest": { - "url": "https://reqres.in/api/users", - "method": "post", - "request": { - "body": { - "name": "morpheus", - "job": "leader" - } - }, - "response": { - "body": { - "name": "morpheus", - "job": "leader" - } - }, - "statusCodes": [ - 200, - 201 - ], - "path": "response.json", - "directory": "media", - "maxVariation": 0.05, - "overwrite": "aboveVariation" - } - }, - { - "httpRequest": { - "openApi": "getUserById" - } - }, - { - "httpRequest": { - "openApi": { - "name": "Reqres", - "operationId": "getUserById" - }, - "request": { - "parameters": { - "id": 123 - } - } - } - }, - { - "httpRequest": { - "openApi": { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "getUserById" - }, - "request": { - "parameters": { - "id": 123 - } - } - } - }, - { - "httpRequest": { - "openApi": { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both" - } - } - }, - { - "httpRequest": { - "openApi": { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "updateUser", - "useExample": "request", - "exampleKey": "acme" - } - } - }, - { - "httpRequest": { - "openApi": { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "updateUser", - "useExample": "request", - "exampleKey": "acme", - "headers": { - "Authorization": "Bearer $TOKEN" - } - } - } - }, - { - "stepId": "breakpoint-example", - "description": "Step with breakpoint enabled", - "goTo": "https://www.example.com", - "breakpoint": true - }, - { - "checkLink": "https://www.google.com", - "breakpoint": false - }, - { - "dragAndDrop": { - "source": { - "selector": "#sourceElement" - }, - "target": { - "selector": "#targetElement" - } - } - } - ] - } - ] - } - } - ] - } - }, - "title": "Markup definition" - }, - "markupActionString": { - "type": "string", - "enum": [ - "checkLink", - "click", - "find", - "goTo", - "httpRequest", - "loadCookie", - "loadVariables", - "record", - "runCode", - "runShell", - "saveCookie", - "screenshot", - "stopRecord", - "type", - "wait" - ] - }, - "inlineStatements": { - "description": "Statements to include tests and steps inside the content of the file, such as within Markdown.", - "type": "object", - "properties": { - "testStart": { - "description": "Regular expressions that indicate the start of a test. If capture groups are used, the first capture group is used for the statement. If no capture groups are used, the entire match is used for the statement.", - "anyOf": [ - { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "minItems": 1, - "items": { - "type": "string" - } - } - ] - } - ] - }, - "testEnd": { - "description": "Regular expressions that indicate that the current test is complete.", - "anyOf": [ - { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "minItems": 1, - "items": { - "type": "string" - } - } - ] - } - ] - }, - "ignoreStart": { - "description": "Regular expressions that indicates that the following content should be ignored for testing purposes.", - "anyOf": [ - { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "minItems": 1, - "items": { - "type": "string" - } - } - ] - } - ] - }, - "ignoreEnd": { - "description": "Regular expressions that indicate that the ignored section of content is complete.", - "anyOf": [ - { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "minItems": 1, - "items": { - "type": "string" - } - } - ] - } - ] - }, - "step": { - "description": "Regular expressions that indicate a step in a test.", - "anyOf": [ - { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "minItems": 1, - "items": { - "type": "string" - } - } - ] - } - ] - } - }, - "title": "Inline statement definition" - }, - "stringOrArray": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "minItems": 1, - "items": { - "type": "string" - } - } - ] - } - } - }, "examples": [ {}, { diff --git a/common/src/schemas/output_schemas/context_v3.schema.json b/common/src/schemas/output_schemas/context_v3.schema.json index 3a080b5..88e2b3a 100644 --- a/common/src/schemas/output_schemas/context_v3.schema.json +++ b/common/src/schemas/output_schemas/context_v3.schema.json @@ -196,88 +196,6 @@ ] } }, - "components": { - "schemas": { - "platform": { - "type": "string", - "enum": [ - "linux", - "mac", - "windows" - ] - }, - "browserName": { - "type": "string", - "description": "Name of the browser.", - "enum": [ - "chrome", - "firefox", - "safari", - "webkit" - ], - "$comment": "`safari` is just a shortcut for `webkit`. Included for visibility and to reduce questions." - }, - "browser": { - "type": "object", - "description": "Browser configuration.", - "required": [ - "name" - ], - "additionalProperties": false, - "properties": { - "name": { - "type": "string", - "description": "Name of the browser.", - "enum": [ - "chrome", - "firefox", - "safari", - "webkit" - ], - "$comment": "`safari` is just a shortcut for `webkit`. Included for visibility and to reduce questions." - }, - "headless": { - "type": "boolean", - "description": "If `true`, runs the browser in headless mode.", - "default": true - }, - "window": { - "type": "object", - "description": "Browser dimensions.", - "additionalProperties": false, - "properties": { - "width": { - "type": "integer", - "description": "Width of the browser window in pixels." - }, - "height": { - "type": "integer", - "description": "Height of the browser window in pixels." - } - }, - "title": "Browser Window" - }, - "viewport": { - "type": "object", - "description": "Viewport dimensions.", - "additionalProperties": false, - "properties": { - "width": { - "type": "integer", - "description": "Width of the viewport in pixels." - }, - "height": { - "type": "integer", - "description": "Height of the viewport in pixels." - } - }, - "title": "Browser Viewport" - } - }, - "title": "Browser" - } - } - }, "examples": [ { "platforms": "linux", diff --git a/common/src/schemas/output_schemas/dragAndDrop_v3.schema.json b/common/src/schemas/output_schemas/dragAndDrop_v3.schema.json index ced06e3..295db77 100644 --- a/common/src/schemas/output_schemas/dragAndDrop_v3.schema.json +++ b/common/src/schemas/output_schemas/dragAndDrop_v3.schema.json @@ -233,222 +233,6 @@ "minimum": 0 } }, - "components": { - "schemas": { - "elementSpecification": { - "anyOf": [ - { - "title": "Element (simple)", - "type": "string", - "description": "Display text, selector, or regex pattern (enclosed in forward slashes) of the element." - }, - { - "title": "Element (detailed)", - "type": "object", - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "properties": { - "elementText": { - "type": "string", - "description": "Display text or regex pattern (enclosed in forward slashes) of the element. If combined with `selector`, the element must match both the text and the selector." - }, - "selector": { - "type": "string", - "description": "Selector of the element. If combined with `elementText`, the element must match both the text and the selector." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - }, - "timeout": { - "type": "integer", - "description": "Max duration in milliseconds to wait for the element to exist.", - "default": 5000 - } - } - } - ] - }, - "string": { - "title": "Element (simple)", - "type": "string", - "description": "Display text, selector, or regex pattern (enclosed in forward slashes) of the element." - }, - "object": { - "title": "Element (detailed)", - "type": "object", - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "properties": { - "elementText": { - "type": "string", - "description": "Display text or regex pattern (enclosed in forward slashes) of the element. If combined with `selector`, the element must match both the text and the selector." - }, - "selector": { - "type": "string", - "description": "Selector of the element. If combined with `elementText`, the element must match both the text and the selector." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - }, - "timeout": { - "type": "integer", - "description": "Max duration in milliseconds to wait for the element to exist.", - "default": 5000 - } - } - } - } - }, "examples": [ { "source": "Table", diff --git a/common/src/schemas/output_schemas/find_v3.schema.json b/common/src/schemas/output_schemas/find_v3.schema.json index 4f4aea6..abdfbb1 100644 --- a/common/src/schemas/output_schemas/find_v3.schema.json +++ b/common/src/schemas/output_schemas/find_v3.schema.json @@ -650,656 +650,6 @@ } } ], - "components": { - "schemas": { - "string": { - "title": "Find element (simple)", - "type": "string", - "description": "Identifier for the element to find. Can be a selector, element text, ARIA name, ID, or test ID." - }, - "object": { - "title": "Find element (detailed)", - "type": "object", - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "additionalProperties": false, - "properties": { - "elementText": { - "type": "string", - "description": "Display text of the element to find. If combined with other element finding fields, the element must match all specified criteria." - }, - "selector": { - "type": "string", - "description": "Selector of the element to find. If combined with other element finding fields, the element must match all specified criteria." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - }, - "timeout": { - "type": "integer", - "description": "Max duration in milliseconds to wait for the element to exist.", - "default": 5000 - }, - "moveTo": { - "description": "Move to the element. If the element isn't visible, it's scrolled into view.", - "type": "boolean", - "default": true - }, - "click": { - "description": "Click the element.", - "anyOf": [ - { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "click", - "description": "Click or tap an element.", - "anyOf": [ - { - "title": "Click element (simple)", - "type": "string", - "description": "Identifier for the element to click. Can be a selector, element text, ARIA name, ID, or test ID." - }, - { - "title": "Click element (detailed)", - "type": "object", - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "properties": { - "button": { - "description": "Kind of click to perform.", - "type": "string", - "enum": [ - "left", - "right", - "middle" - ] - }, - "elementText": { - "type": "string", - "description": "Display text of the element to click. If combined with other element finding fields, the element must match all specified criteria." - }, - "selector": { - "type": "string", - "description": "Selector of the element to click. If combined with other element finding fields, the element must match all specified criteria." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to click. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to click. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - } - } - }, - { - "type": "boolean" - } - ], - "components": { - "schemas": { - "string": { - "title": "Click element (simple)", - "type": "string", - "description": "Identifier for the element to click. Can be a selector, element text, ARIA name, ID, or test ID." - }, - "button": { - "description": "Kind of click to perform.", - "type": "string", - "enum": [ - "left", - "right", - "middle" - ] - }, - "object": { - "title": "Click element (detailed)", - "type": "object", - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "properties": { - "button": { - "description": "Kind of click to perform.", - "type": "string", - "enum": [ - "left", - "right", - "middle" - ] - }, - "elementText": { - "type": "string", - "description": "Display text of the element to click. If combined with other element finding fields, the element must match all specified criteria." - }, - "selector": { - "type": "string", - "description": "Selector of the element to click. If combined with other element finding fields, the element must match all specified criteria." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to click. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to click. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - } - } - } - } - }, - "examples": [ - true, - "right", - { - "button": "left", - "elementText": "Element text" - }, - { - "selector": "#elementToScreenshot", - "elementText": "Element text", - "button": "middle" - } - ] - }, - { - "type": "object", - "properties": { - "button": { - "description": "Kind of click to perform.", - "type": "string", - "enum": [ - "left", - "right", - "middle" - ] - } - }, - "title": "Find element and click" - } - ] - }, - "type": { - "description": "Type keys after finding the element. Either a string or an object with a `keys` field as defined in [`type`](type). To type in the element, make the element active with the `click` parameter.", - "allOf": [ - { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "typeKeys", - "description": "Type keys. To type special keys, begin and end the string with `$` and use the special key's keyword. For example, to type the Escape key, enter `$ESCAPE$`.", - "anyOf": [ - { - "title": "Type keys (simple)", - "description": "Sequence of keys to enter.", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - } - ] - } - } - ] - }, - { - "title": "Type keys (detailed)", - "type": "object", - "properties": { - "keys": { - "title": "Type keys (simple)", - "description": "Sequence of keys to enter.", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - } - ] - } - } - ] - }, - "inputDelay": { - "type": "number", - "description": "Delay in milliseconds between each key press during a recording", - "default": 100 - }, - "selector": { - "type": "string", - "description": "Selector for the element to type into. If not specified, the typing occurs in the active element." - }, - "elementText": { - "type": "string", - "description": "Display text of the element to type into. If combined with other element finding fields, the element must match all specified criteria." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - } - }, - "required": [ - "keys" - ], - "additionalProperties": false - } - ], - "components": { - "schemas": { - "keys": { - "title": "Type keys (simple)", - "description": "Sequence of keys to enter.", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - } - ] - } - } - ] - }, - "object": { - "title": "Type keys (detailed)", - "type": "object", - "properties": { - "keys": { - "title": "Type keys (simple)", - "description": "Sequence of keys to enter.", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - } - ] - } - } - ] - }, - "inputDelay": { - "type": "number", - "description": "Delay in milliseconds between each key press during a recording", - "default": 100 - }, - "selector": { - "type": "string", - "description": "Selector for the element to type into. If not specified, the typing occurs in the active element." - }, - "elementText": { - "type": "string", - "description": "Display text of the element to type into. If combined with other element finding fields, the element must match all specified criteria." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - } - }, - "required": [ - "keys" - ], - "additionalProperties": false - } - } - }, - "examples": [ - "kittens", - [ - "$ENTER$" - ], - [ - "kittens", - "$ENTER$" - ], - { - "keys": "kittens" - }, - { - "keys": [ - "$ENTER$" - ] - }, - { - "keys": [ - "kittens", - "$ENTER$" - ], - "inputDelay": 500 - } - ] - }, - { - "not": { - "type": "object", - "required": [ - "selector", - "elementText", - "elementId", - "elementTestId", - "elementClass", - "elementAttribute", - "elementAria" - ], - "title": "Find element and type" - } - } - ] - } - } - } - } - }, "examples": [ "Find me!", { diff --git a/common/src/schemas/output_schemas/goTo_v3.schema.json b/common/src/schemas/output_schemas/goTo_v3.schema.json index 4b3378c..efa7488 100644 --- a/common/src/schemas/output_schemas/goTo_v3.schema.json +++ b/common/src/schemas/output_schemas/goTo_v3.schema.json @@ -172,179 +172,6 @@ "title": "Go to URL (detailed)" } ], - "components": { - "schemas": { - "string": { - "title": "Go to URL (simple)", - "description": "Navigate to an HTTP or HTTPS URL. Can be a full URL or a path. If a path is provided, navigates relative to the current URL, if any.", - "type": "string", - "pattern": "(^(http://|https://|/).*|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - "object": { - "description": "Navigate to an HTTP or HTTPS URL.", - "type": "object", - "additionalProperties": false, - "required": [ - "url" - ], - "properties": { - "url": { - "type": "string", - "description": "URL to navigate to. Can be a full URL or a path. If a path is provided and `origin` is specified, prepends `origin` to `url`. If a path is provided but `origin` isn't specified, attempts to navigate relative to the current URL, if any.", - "pattern": "(^(http://|https://|/).*|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - "origin": { - "type": "string", - "description": "Protocol and domain to navigate to. Prepended to `url`.", - "transform": [ - "trim" - ] - }, - "timeout": { - "type": "integer", - "description": "Maximum time in milliseconds to wait for the page to be ready. If exceeded, the goTo action fails.", - "default": 30000, - "minimum": 0 - }, - "waitUntil": { - "type": "object", - "description": "Configuration for waiting conditions after navigation.", - "additionalProperties": false, - "properties": { - "networkIdleTime": { - "description": "Wait for network activity to be idle (no new requests) for this duration in milliseconds. Set to `null` to skip this check.", - "anyOf": [ - { - "type": "integer", - "minimum": 0 - }, - { - "type": "null" - } - ], - "default": 500 - }, - "domIdleTime": { - "description": "Wait for DOM mutations to stop for this duration in milliseconds. Set to `null` to skip this check.", - "anyOf": [ - { - "type": "integer", - "minimum": 0 - }, - { - "type": "null" - } - ], - "default": 1000 - }, - "find": { - "type": "object", - "description": "Wait for a specific element to be present in the DOM. At least one of selector or elementText must be specified.", - "additionalProperties": false, - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "properties": { - "selector": { - "type": "string", - "description": "CSS selector for the element to wait for." - }, - "elementText": { - "type": "string", - "description": "Text content the element must contain. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - } - } - } - } - } - }, - "title": "Go to URL (detailed)" - } - } - }, "examples": [ "https://www.google.com", "/search", diff --git a/common/src/schemas/output_schemas/httpRequest_v3.schema.json b/common/src/schemas/output_schemas/httpRequest_v3.schema.json index 20ae01d..26e96fa 100644 --- a/common/src/schemas/output_schemas/httpRequest_v3.schema.json +++ b/common/src/schemas/output_schemas/httpRequest_v3.schema.json @@ -400,406 +400,6 @@ } } ], - "components": { - "schemas": { - "url": { - "title": "HTTP request (simple)", - "type": "string", - "description": "URL for the HTTP request.", - "pattern": "(^(http://|https://).*|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - "object": { - "title": "HTTP request (detailed)", - "type": "object", - "anyOf": [ - { - "required": [ - "url" - ] - }, - { - "required": [ - "openApi" - ] - } - ], - "additionalProperties": false, - "properties": { - "url": { - "title": "HTTP request (simple)", - "type": "string", - "description": "URL for the HTTP request.", - "pattern": "(^(http://|https://).*|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - "openApi": { - "anyOf": [ - { - "allOf": [ - { - "type": "string", - "description": "ID of the operation to use for the request." - }, - { - "title": "Operation ID", - "description": "Operation ID from the OpenAPI schema. Only valid if the OpenAPI description path is specified elsewhere and the operation ID is unique among all specified OpenAPI descriptions." - } - ] - }, - { - "allOf": [ - { - "version": "1.0.0", - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "openApi", - "type": "object", - "description": "OpenAPI description and configuration.", - "additionalProperties": false, - "anyOf": [ - { - "required": [ - "descriptionPath" - ] - }, - { - "required": [ - "operationId" - ] - } - ], - "properties": { - "name": { - "type": "string", - "description": "Name of the OpenAPI description, as defined in your configuration." - }, - "descriptionPath": { - "type": "string", - "description": "URL or local path to the OpenAPI description." - }, - "definition": { - "type": "object", - "readOnly": true, - "description": "OpenAPI definition object loaded from the `descriptionPath`. This is a resolved version of the OpenAPI description and should not be user-defined.", - "additionalProperties": true, - "title": "OpenAPI definition" - }, - "operationId": { - "type": "string", - "description": "ID of the operation to use for the request." - }, - "server": { - "type": "string", - "description": "Server to use for example requests. Only valid if `useExample` is `request` or `both`. If not specified but an example is used for the request, uses the first server defined in the OpenAPI description." - }, - "validateAgainstSchema": { - "type": "string", - "description": "Validates the request and/or response against the schema in the OpenAPI description. If the request or response doesn't match the schema, the step fails.", - "enum": [ - "request", - "response", - "both", - "none" - ], - "default": "both" - }, - "mockResponse": { - "type": "boolean", - "description": "If `true`, doesn't make the HTTP request, but instead uses the response example or schema from the OpenAPI description as the response data. Useful for creating tests when an API isn't fully implemented yet. If `statusCode` isn't specified, uses the first defined response code." - }, - "statusCode": { - "type": "integer", - "description": "Response code to use for validation, examples, and status code checking. If the response code doesn't match, the step fails. `statusCodes` overrides this value when specified." - }, - "useExample": { - "type": [ - "string" - ], - "description": "Uses the example from the OpenAPI description as the request and response data. If the request or response has multiple examples, specify `exampleKey`. If `statusCode` isn't specified, uses the first defined response code. `requestData`, `requestParams`, and `requestHeaders` override portions of request examples when specified. `responseData` overrides portions of response examples when specified.", - "enum": [ - "request", - "response", - "both", - "none" - ], - "default": "none" - }, - "exampleKey": { - "type": "string", - "description": "Key of the example to use from the `examples` property in the OpenAPI description. If an `examples` key isn't specified or isn't available for a given parameter or object, the `example` property value is used.", - "default": "" - }, - "headers": { - "type": "object", - "description": "Request headers to add to requests. For example, to set `Authorization` headers for all requests from the specified OpenAPI document. If specified in both a config and a step, the step value overrides the config value.", - "additionalProperties": { - "type": "string" - }, - "title": "OpenAPI request headers" - } - }, - "components": { - "schemas": { - "operationId": { - "type": "string", - "description": "ID of the operation to use for the request." - }, - "descriptionPath": { - "type": "string", - "description": "URL or local path to the OpenAPI description." - } - } - }, - "examples": [ - { - "descriptionPath": "https://petstore.swagger.io/v2/swagger.json" - }, - { - "name": "Reqres", - "operationId": "getUserById" - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "getUserById" - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both" - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both", - "exampleKey": "example1" - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both", - "exampleKey": "example1", - "statusCode": 201 - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both", - "exampleKey": "example1", - "statusCode": 201, - "validateAgainstSchema": "none" - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both", - "exampleKey": "example1", - "statusCode": 201, - "validateAgainstSchema": "none", - "mockResponse": true - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both", - "exampleKey": "example1", - "statusCode": 201, - "validateAgainstSchema": "none", - "mockResponse": true, - "headers": { - "Authorization": "Bearer 12345" - } - } - ] - }, - { - "type": "object", - "required": [ - "operationId" - ], - "title": "OpenAPI definition (httpRequest)" - } - ] - } - ] - }, - "statusCodes": { - "description": "Accepted status codes. If the specified URL returns a code other than what is specified here, the action fails.", - "type": "array", - "items": { - "anyOf": [ - { - "type": "integer" - } - ] - }, - "default": [ - 200, - 201 - ] - }, - "method": { - "type": "string", - "description": "Method of the HTTP request", - "enum": [ - "get", - "put", - "post", - "patch", - "delete" - ], - "transform": [ - "trim", - "toEnumCase" - ], - "default": "get" - }, - "timeout": { - "type": "integer", - "description": "Timeout for the HTTP request, in milliseconds.", - "default": 60000 - }, - "request": { - "type": "object", - "additionalProperties": false, - "properties": { - "headers": { - "description": "Headers to include in the HTTP request.", - "default": {}, - "anyOf": [ - { - "title": "Request headers (object)", - "description": "Headers to include in the HTTP request, in key/value format.", - "type": "object", - "additionalProperties": true, - "properties": {} - }, - { - "title": "Request headers (string)", - "description": "Headers to include in the HTTP request, as return-separated values. For example, `Content-Type: application/json\nAuthorization: Bearer token`.", - "type": "string" - } - ] - }, - "parameters": { - "description": "URL parameters to include in the HTTP request, in key/value format.", - "type": "object", - "additionalProperties": true, - "default": {}, - "properties": {}, - "title": "Request parameters" - }, - "body": { - "description": "The body of the HTTP request.", - "anyOf": [ - { - "title": "Request body (object)", - "description": "JSON object to include as the body of the HTTP request.", - "type": "object", - "additionalProperties": true, - "properties": {} - }, - { - "title": "Request body (array)", - "description": "JSON array to include as the body of the HTTP request.", - "type": "array", - "items": {} - }, - { - "title": "Request body (string)", - "description": "String to include as the body of the HTTP request.", - "type": "string" - } - ], - "default": {} - } - }, - "title": "Request" - }, - "response": { - "type": "object", - "additionalProperties": false, - "properties": { - "headers": { - "description": "Headers expected in the response, in key/value format. If one or more `responseHeaders` entries aren't present in the response, the step fails.", - "type": "object", - "additionalProperties": true, - "properties": {}, - "default": {}, - "title": "Response headers" - }, - "body": { - "description": "JSON object expected in the response. If one or more key/value pairs aren't present in the response, the step fails.", - "anyOf": [ - { - "type": "object", - "additionalProperties": true, - "properties": {}, - "title": "Response body object", - "description": "JSON key/value pairs expected in the response." - }, - { - "title": "Response body array", - "description": "JSON array expected in the response.", - "type": "array", - "items": {} - }, - { - "title": "Response body string", - "description": "String expected in the response.", - "type": "string" - } - ], - "default": {} - }, - "required": { - "type": "array", - "description": "Array of field paths that must exist in the response body. Uses dot notation for nested fields (e.g., 'user.name') and bracket notation for array indices (e.g., 'items[0].id'). Fields must be present but may have any value including null.", - "items": { - "type": "string" - }, - "default": [] - } - }, - "title": "Response" - }, - "allowAdditionalFields": { - "type": "boolean", - "description": "If `false`, the step fails when the response data contains fields not specified in the response body.", - "default": true - }, - "path": { - "type": "string", - "description": "File path to save the command's output, relative to `directory`. Specify a file extension that matches the expected response type, such as `.json` for JSON content or `.txt` for strings." - }, - "directory": { - "type": "string", - "description": "Directory to save the command's output. If the directory doesn't exist, creates the directory. If not specified, the directory is your media directory." - }, - "maxVariation": { - "type": "number", - "description": "Allowed variation in percentage of text different between the current output and previously saved output. If the difference between the current output and the previous output is greater than `maxVariation`, the step fails. If output doesn't exist at `path`, this value is ignored.", - "default": 0, - "minimum": 0, - "maximum": 1 - }, - "overwrite": { - "type": "string", - "description": "If `true`, overwrites the existing output at `path` if it exists.\nIf `aboveVariation`, overwrites the existing output at `path` if the difference between the new output and the existing output is greater than `maxVariation`.", - "enum": [ - "true", - "false", - "aboveVariation" - ], - "default": "aboveVariation" - } - } - } - } - }, "examples": [ "https://reqres.in/api/users", { diff --git a/common/src/schemas/output_schemas/loadCookie_v3.schema.json b/common/src/schemas/output_schemas/loadCookie_v3.schema.json index 98c6ae2..39a292a 100644 --- a/common/src/schemas/output_schemas/loadCookie_v3.schema.json +++ b/common/src/schemas/output_schemas/loadCookie_v3.schema.json @@ -101,107 +101,6 @@ "title": "Load cookie (detailed)" } ], - "components": { - "schemas": { - "string": { - "type": "string", - "title": "Cookie name or file path", - "description": "Name of the specific cookie to load from default location, or file path to cookie file.", - "pattern": "^[A-Za-z0-9_./\\-]+$", - "transform": [ - "trim" - ] - }, - "object": { - "type": "object", - "additionalProperties": false, - "required": [ - "name" - ], - "anyOf": [ - { - "required": [ - "path" - ], - "not": { - "required": [ - "variable" - ] - } - }, - { - "required": [ - "variable" - ], - "not": { - "anyOf": [ - { - "required": [ - "path" - ] - }, - { - "required": [ - "directory" - ] - } - ] - } - } - ], - "properties": { - "$schema": { - "description": "Optional self-describing schema URI for linters", - "type": "string", - "format": "uri-reference" - }, - "name": { - "type": "string", - "title": "Cookie name", - "description": "Name of the specific cookie to load.", - "pattern": "^[A-Za-z0-9_.-]+$", - "transform": [ - "trim" - ] - }, - "variable": { - "type": "string", - "title": "Environment variable name", - "description": "Environment variable name containing the cookie as JSON string.", - "pattern": "^[A-Za-z_][A-Za-z0-9_]*$", - "transform": [ - "trim" - ] - }, - "path": { - "type": "string", - "title": "Cookie file path", - "description": "File path to cookie file, relative to directory. Supports Netscape cookie format.", - "transform": [ - "trim" - ] - }, - "directory": { - "type": "string", - "title": "Directory path", - "description": "Directory containing the cookie file.", - "transform": [ - "trim" - ] - }, - "domain": { - "type": "string", - "title": "Cookie domain", - "description": "Specific domain to filter the cookie by when loading from multi-cookie file (optional).", - "transform": [ - "trim" - ] - } - }, - "title": "Load cookie (detailed)" - } - } - }, "examples": [ "session_token", "./test-data/auth-session.txt", diff --git a/common/src/schemas/output_schemas/openApi_v3.schema.json b/common/src/schemas/output_schemas/openApi_v3.schema.json index bf4f847..d2c7cf9 100644 --- a/common/src/schemas/output_schemas/openApi_v3.schema.json +++ b/common/src/schemas/output_schemas/openApi_v3.schema.json @@ -87,18 +87,6 @@ "title": "OpenAPI request headers" } }, - "components": { - "schemas": { - "operationId": { - "type": "string", - "description": "ID of the operation to use for the request." - }, - "descriptionPath": { - "type": "string", - "description": "URL or local path to the OpenAPI description." - } - } - }, "examples": [ { "descriptionPath": "https://petstore.swagger.io/v2/swagger.json" diff --git a/common/src/schemas/output_schemas/record_v3.schema.json b/common/src/schemas/output_schemas/record_v3.schema.json index 1026028..c00159e 100644 --- a/common/src/schemas/output_schemas/record_v3.schema.json +++ b/common/src/schemas/output_schemas/record_v3.schema.json @@ -47,48 +47,6 @@ "description": "If `true`, records the current browser viewport. If `false`, doesn't record the current browser viewport." } ], - "components": { - "schemas": { - "string": { - "title": "Record (simple)", - "type": "string", - "description": "File path of the recording. Supports the `.mp4`, `.webm`, and `.gif` extensions. If not specified, the file name is the ID of the step, and the extension is `.mp4`.", - "pattern": "([A-Za-z0-9_-]*\\.(mp4|webm|gif)$|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - "object": { - "type": "object", - "properties": { - "path": { - "type": "string", - "description": "File path of the recording. Supports the `.mp4`, `.webm`, and `.gif` extensions. If not specified, the file name is the ID of the step, and the extension is `.mp4`.", - "pattern": "([A-Za-z0-9_-]*\\.(mp4|webm|gif)$|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - "directory": { - "type": "string", - "description": "Directory of the file. If the directory doesn't exist, creates the directory.", - "transform": [ - "trim" - ] - }, - "overwrite": { - "type": "string", - "description": "If `true`, overwrites the existing recording at `path` if it exists.", - "enum": [ - "true", - "false" - ] - } - }, - "title": "Record (detailed)" - } - } - }, "examples": [ true, "results.mp4", diff --git a/common/src/schemas/output_schemas/report_v3.schema.json b/common/src/schemas/output_schemas/report_v3.schema.json index 4d0f1ce..2b51717 100644 --- a/common/src/schemas/output_schemas/report_v3.schema.json +++ b/common/src/schemas/output_schemas/report_v3.schema.json @@ -6245,6 +6245,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -6424,16 +6428,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -6476,6 +6480,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -6651,8 +6658,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -6669,7 +6686,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -6831,16 +6848,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -6883,6 +6900,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -7058,8 +7078,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -7076,7 +7106,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -7608,6 +7638,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -7787,16 +7821,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -7839,6 +7873,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -8014,8 +8051,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -8032,7 +8079,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -8194,16 +8241,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -8246,6 +8293,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -8421,8 +8471,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -8439,7 +8499,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -16106,6 +16166,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -16285,16 +16349,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -16337,6 +16401,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -16512,8 +16579,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -16530,7 +16607,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -16692,16 +16769,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -16744,6 +16821,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -16919,8 +16999,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -16937,7 +17027,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -17469,6 +17559,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -17648,16 +17742,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -17700,6 +17794,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -17875,8 +17972,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -17893,7 +18000,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -18055,16 +18162,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -18107,6 +18214,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -18282,8 +18392,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -18300,7 +18420,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", diff --git a/common/src/schemas/output_schemas/resolvedTests_v3.schema.json b/common/src/schemas/output_schemas/resolvedTests_v3.schema.json index 7081445..e224dae 100644 --- a/common/src/schemas/output_schemas/resolvedTests_v3.schema.json +++ b/common/src/schemas/output_schemas/resolvedTests_v3.schema.json @@ -5825,6 +5825,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -6004,16 +6008,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -6056,6 +6060,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -6231,8 +6238,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -6249,7 +6266,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -6411,16 +6428,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -6463,6 +6480,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -6638,8 +6658,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -6656,7 +6686,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -7188,6 +7218,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -7367,16 +7401,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -7419,6 +7453,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -7594,8 +7631,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -7612,7 +7659,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -7774,16 +7821,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -7826,6 +7873,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -8001,8 +8051,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -8019,7 +8079,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -16117,6 +16177,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -16296,16 +16360,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -16348,6 +16412,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -16523,8 +16590,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -16541,7 +16618,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -16703,16 +16780,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -16755,6 +16832,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -16930,8 +17010,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -16948,7 +17038,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -17480,6 +17570,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -17659,16 +17753,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -17711,6 +17805,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -17886,8 +17983,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -17904,7 +18011,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -18066,16 +18173,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -18118,6 +18225,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -18293,8 +18403,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -18311,7 +18431,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -27178,6 +27298,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -27357,16 +27481,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -27409,6 +27533,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -27584,8 +27711,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -27602,7 +27739,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -27764,16 +27901,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -27816,6 +27953,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -27991,8 +28131,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -28009,7 +28159,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -28541,6 +28691,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -28720,16 +28874,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -28772,6 +28926,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -28947,8 +29104,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -28965,7 +29132,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -29127,16 +29294,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -29179,6 +29346,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -29354,8 +29524,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -29372,7 +29552,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -37039,6 +37219,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -37218,16 +37402,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -37270,6 +37454,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -37445,8 +37632,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -37463,7 +37660,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -37625,16 +37822,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -37677,6 +37874,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -37852,8 +38052,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -37870,7 +38080,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -38402,6 +38612,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -38581,16 +38795,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -38633,6 +38847,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -38808,8 +39025,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -38826,7 +39053,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -38988,16 +39215,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -39040,6 +39267,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -39215,8 +39445,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -39233,7 +39473,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", diff --git a/common/src/schemas/output_schemas/runCode_v3.schema.json b/common/src/schemas/output_schemas/runCode_v3.schema.json index 23899a5..e3be439 100644 --- a/common/src/schemas/output_schemas/runCode_v3.schema.json +++ b/common/src/schemas/output_schemas/runCode_v3.schema.json @@ -92,98 +92,6 @@ "title": "Run code (detailed)" } ], - "components": { - "schemas": { - "object": { - "type": "object", - "required": [ - "code", - "language" - ], - "properties": { - "language": { - "type": "string", - "description": "Language of the code to run.", - "enum": [ - "python", - "bash", - "javascript" - ] - }, - "code": { - "description": "Code to run.", - "type": "string" - }, - "args": { - "type": "array", - "description": "Arguments for the command.", - "items": { - "anyOf": [ - { - "type": "string" - } - ] - }, - "default": [] - }, - "workingDirectory": { - "type": "string", - "description": "Working directory for the command.", - "default": "." - }, - "exitCodes": { - "type": "array", - "description": "Expected exit codes of the command. If the command's actual exit code isn't in this list, the step fails.", - "items": { - "anyOf": [ - { - "type": "integer" - } - ] - }, - "default": [ - 0 - ] - }, - "stdio": { - "type": "string", - "description": "Content expected in the command's output. If the expected content can't be found in the command's output (either stdout or stderr), the step fails. Supports strings and regular expressions. To use a regular expression, the string must start and end with a forward slash, like in `/^hello-world.*/`." - }, - "path": { - "type": "string", - "description": "File path to save the command's output, relative to `directory`." - }, - "directory": { - "type": "string", - "description": "Directory to save the command's output. If the directory doesn't exist, creates the directory. If not specified, the directory is your media directory." - }, - "maxVariation": { - "type": "number", - "description": "Allowed variation in percentage of text different between the current output and previously saved output. If the difference between the current output and the previous output is greater than `maxVariation`, the step fails. If output doesn't exist at `path`, this value is ignored.", - "default": 0, - "minimum": 0, - "maximum": 1 - }, - "overwrite": { - "type": "string", - "description": "If `true`, overwrites the existing output at `path` if it exists.\nIf `aboveVariation`, overwrites the existing output at `path` if the difference between the new output and the existing output is greater than `maxVariation`.", - "enum": [ - "true", - "false", - "aboveVariation" - ], - "default": "aboveVariation" - }, - "timeout": { - "type": "integer", - "description": "Max time in milliseconds the command is allowed to run. If the command runs longer than this, the step fails.", - "default": 60000 - } - }, - "title": "Run code (detailed)" - } - } - }, "examples": [ { "language": "javascript", diff --git a/common/src/schemas/output_schemas/runShell_v3.schema.json b/common/src/schemas/output_schemas/runShell_v3.schema.json index a65de4f..dc0465b 100644 --- a/common/src/schemas/output_schemas/runShell_v3.schema.json +++ b/common/src/schemas/output_schemas/runShell_v3.schema.json @@ -91,97 +91,6 @@ "title": "Run shell command (detailed)" } ], - "components": { - "schemas": { - "string": { - "title": "Run shell command (simple)", - "description": "Command to perform in the machine's default shell.", - "type": "string", - "transform": [ - "trim" - ] - }, - "object": { - "type": "object", - "required": [ - "command" - ], - "additionalProperties": false, - "properties": { - "command": { - "type": "string", - "description": "Command to perform in the machine's default shell." - }, - "args": { - "type": "array", - "description": "Arguments for the command.", - "items": { - "anyOf": [ - { - "type": "string" - } - ] - }, - "default": [] - }, - "workingDirectory": { - "type": "string", - "description": "Working directory for the command.", - "default": "." - }, - "exitCodes": { - "type": "array", - "description": "Expected exit codes of the command. If the command's actual exit code isn't in this list, the step fails.", - "items": { - "anyOf": [ - { - "type": "integer" - } - ] - }, - "default": [ - 0 - ] - }, - "stdio": { - "type": "string", - "description": "Content expected in the command's stdout or stderr. If the expected content can't be found in the command's stdout or stderr, the step fails. Supports strings and regular expressions. To use a regular expression, the string must start and end with a forward slash, like in `/^hello-world.*/`." - }, - "path": { - "type": "string", - "description": "File path to save the command's output, relative to `directory`." - }, - "directory": { - "type": "string", - "description": "Directory to save the command's output. If the directory doesn't exist, creates the directory. If not specified, the directory is your media directory." - }, - "maxVariation": { - "type": "number", - "description": "Allowed variation in percentage of text different between the current output and previously saved output. If the difference between the current output and the previous output is greater than `maxVariation`, the step fails. If output doesn't exist at `path`, this value is ignored.", - "default": 0, - "minimum": 0, - "maximum": 1 - }, - "overwrite": { - "type": "string", - "description": "If `true`, overwrites the existing output at `path` if it exists.\nIf `aboveVariation`, overwrites the existing output at `path` if the difference between the new output and the existing output is greater than `maxVariation`.", - "enum": [ - "true", - "false", - "aboveVariation" - ], - "default": "aboveVariation" - }, - "timeout": { - "type": "integer", - "description": "Max time in milliseconds the command is allowed to run. If the command runs longer than this, the step fails.", - "default": 60000 - } - }, - "title": "Run shell command (detailed)" - } - } - }, "examples": [ "docker run hello-world", { diff --git a/common/src/schemas/output_schemas/saveCookie_v3.schema.json b/common/src/schemas/output_schemas/saveCookie_v3.schema.json index 96f8565..c4f112f 100644 --- a/common/src/schemas/output_schemas/saveCookie_v3.schema.json +++ b/common/src/schemas/output_schemas/saveCookie_v3.schema.json @@ -107,113 +107,6 @@ "title": "Save cookie (detailed)" } ], - "components": { - "schemas": { - "string": { - "type": "string", - "title": "Cookie name", - "description": "Name of the specific cookie to save. Will be saved to a default file path or environment variable.", - "pattern": "^[A-Za-z0-9_./\\-]+$", - "transform": [ - "trim" - ] - }, - "object": { - "type": "object", - "additionalProperties": false, - "properties": { - "$schema": { - "description": "Optional self-describing schema URI for linters", - "type": "string", - "format": "uri-reference" - }, - "name": { - "type": "string", - "title": "Cookie name", - "description": "Name of the specific cookie to save.", - "pattern": "^[A-Za-z0-9_.-]+$", - "transform": [ - "trim" - ] - }, - "variable": { - "type": "string", - "title": "Environment variable name", - "description": "Environment variable name to store the cookie as JSON string.", - "pattern": "^[A-Za-z_][A-Za-z0-9_]*$", - "transform": [ - "trim" - ] - }, - "path": { - "type": "string", - "title": "Cookie file path", - "description": "File path to save the cookie, relative to directory. Uses Netscape cookie format.", - "transform": [ - "trim" - ] - }, - "directory": { - "type": "string", - "title": "Directory path", - "description": "Directory to save the cookie file. If not specified, uses output directory.", - "transform": [ - "trim" - ] - }, - "overwrite": { - "type": "boolean", - "title": "Overwrite existing file", - "description": "Whether to overwrite existing cookie file.", - "default": false - }, - "domain": { - "type": "string", - "title": "Cookie domain", - "description": "Specific domain to filter the cookie by (optional).", - "transform": [ - "trim" - ] - } - }, - "required": [ - "name" - ], - "anyOf": [ - { - "required": [ - "path" - ], - "not": { - "required": [ - "variable" - ] - } - }, - { - "required": [ - "variable" - ], - "not": { - "anyOf": [ - { - "required": [ - "path" - ] - }, - { - "required": [ - "directory" - ] - } - ] - } - } - ], - "title": "Save cookie (detailed)" - } - } - }, "examples": [ "session_token", "test_env_cookie", diff --git a/common/src/schemas/output_schemas/screenshot_v3.schema.json b/common/src/schemas/output_schemas/screenshot_v3.schema.json index e9b641f..8e2c7b2 100644 --- a/common/src/schemas/output_schemas/screenshot_v3.schema.json +++ b/common/src/schemas/output_schemas/screenshot_v3.schema.json @@ -415,6 +415,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -594,16 +598,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -646,6 +650,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -821,8 +828,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -839,7 +856,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -1001,16 +1018,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -1053,6 +1070,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -1228,8 +1248,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -1246,7 +1276,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -1364,1519 +1394,6 @@ "description": "If `true`, captures a screenshot. If `false`, doesn't capture a screenshot." } ], - "components": { - "schemas": { - "path": { - "title": "Screenshot (simple)", - "description": "File path of the PNG file. Accepts absolute paths. If not specified, the file name is the ID of the step.", - "type": "string", - "pattern": "([A-Za-z0-9_-]*\\.(png|PNG)$|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - "object": { - "type": "object", - "additionalProperties": false, - "properties": { - "path": { - "title": "Screenshot (simple)", - "description": "File path of the PNG file. Accepts absolute paths. If not specified, the file name is the ID of the step.", - "type": "string", - "pattern": "([A-Za-z0-9_-]*\\.(png|PNG)$|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - "directory": { - "type": "string", - "description": "Directory of the PNG file. If the directory doesn't exist, creates the directory.", - "transform": [ - "trim" - ] - }, - "maxVariation": { - "type": "number", - "description": "Allowed variation in percentage of pixels between the new screenshot and the existing screenshot at `path`. If the difference between the new screenshot and the existing screenshot is greater than `maxVariation`, the step fails. If a screenshot doesn't exist at `path`, this value is ignored.", - "default": 0.05, - "minimum": 0, - "maximum": 1 - }, - "overwrite": { - "type": "string", - "description": "If `true`, overwrites the existing screenshot at `path` if it exists.\nIf `aboveVariation`, overwrites the existing screenshot at `path` if the difference between the new screenshot and the existing screenshot is greater than `maxVariation`.", - "enum": [ - "true", - "false", - "aboveVariation" - ], - "default": "aboveVariation" - }, - "crop": { - "anyOf": [ - { - "title": "Crop by element (simple)", - "type": "string", - "description": "Display text or selector of the element to screenshot." - }, - { - "title": "Crop by element (detailed)", - "type": "object", - "description": "Crop the screenshot to a specific element.", - "additionalProperties": false, - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "properties": { - "elementText": { - "type": "string", - "description": "Display text of the element to screenshot." - }, - "selector": { - "type": "string", - "description": "Selector of the element to screenshot." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - }, - "padding": { - "anyOf": [ - { - "title": "Padding (simple)", - "type": "number", - "description": "Padding in pixels to add to the bounds of the element.", - "minimum": 0 - }, - { - "type": "object", - "additionalProperties": false, - "properties": { - "top": { - "type": "number", - "minimum": 0 - }, - "right": { - "type": "number", - "minimum": 0 - }, - "bottom": { - "type": "number", - "minimum": 0 - }, - "left": { - "type": "number", - "minimum": 0 - } - }, - "title": "Padding (detailed)", - "description": "Padding in pixels to add to the bounds of the element." - } - ] - } - } - } - ] - }, - "annotations": { - "type": "array", - "description": "Array of annotations to add to the screenshot.", - "items": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "annotation", - "type": "object", - "description": "A visual annotation to add to the screenshot. Annotations can point to elements on the page (via `find`) or be positioned freely within the viewport.", - "anyOf": [ - { - "required": [ - "arrow" - ], - "not": { - "required": [ - "text", - "rectangle", - "circle", - "line", - "callout", - "highlight", - "blur" - ] - } - }, - { - "required": [ - "text" - ], - "not": { - "required": [ - "arrow", - "rectangle", - "circle", - "line", - "callout", - "highlight", - "blur" - ] - } - }, - { - "required": [ - "rectangle" - ], - "not": { - "required": [ - "arrow", - "text", - "circle", - "line", - "callout", - "highlight", - "blur" - ] - } - }, - { - "required": [ - "circle" - ], - "not": { - "required": [ - "arrow", - "text", - "rectangle", - "line", - "callout", - "highlight", - "blur" - ] - } - }, - { - "required": [ - "line" - ], - "not": { - "required": [ - "arrow", - "text", - "rectangle", - "circle", - "callout", - "highlight", - "blur" - ] - } - }, - { - "required": [ - "callout" - ], - "not": { - "required": [ - "arrow", - "text", - "rectangle", - "circle", - "line", - "highlight", - "blur" - ] - } - }, - { - "required": [ - "highlight" - ], - "not": { - "required": [ - "arrow", - "text", - "rectangle", - "circle", - "line", - "callout", - "blur" - ] - } - }, - { - "required": [ - "blur" - ], - "not": { - "required": [ - "arrow", - "text", - "rectangle", - "circle", - "line", - "callout", - "highlight" - ] - } - } - ], - "properties": { - "find": { - "type": "object", - "description": "Element on the page to annotate.", - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "additionalProperties": false, - "properties": { - "selector": { - "type": "string", - "description": "Selector of the element to annotate." - }, - "elementText": { - "type": "string", - "description": "Display text of the element to annotate." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - } - } - }, - "position": { - "anyOf": [ - { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - { - "type": "string", - "enum": [ - "top", - "bottom", - "left", - "right", - "center", - "top-left", - "top-right", - "bottom-left", - "bottom-right" - ], - "description": "Position relative to the element (if `find` is provided) or to the viewport." - } - ] - }, - "arrow": { - "type": "object", - "description": "Configuration for arrow annotations.", - "properties": { - "from": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "to": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "color": { - "type": "string", - "description": "Color of the arrow (hex, rgb, or named color).", - "default": "#FF0000" - }, - "strokeWidth": { - "type": "number", - "description": "Width of the arrow line in pixels.", - "minimum": 1, - "default": 3 - }, - "headSize": { - "type": "number", - "description": "Size of the arrowhead in pixels.", - "minimum": 1, - "default": 15 - } - } - }, - "text": { - "type": "object", - "description": "Configuration for text annotations.", - "properties": { - "content": { - "type": "string", - "description": "Text content to display." - }, - "fontSize": { - "type": "number", - "description": "Font size in pixels.", - "minimum": 1, - "default": 16 - }, - "fontFamily": { - "type": "string", - "description": "Font family name.", - "default": "Arial" - }, - "color": { - "type": "string", - "description": "Text color (hex, rgb, or named color).", - "default": "#000000" - }, - "backgroundColor": { - "type": "string", - "description": "Background color for the text box.", - "default": "#FFFFFF" - }, - "padding": { - "anyOf": [ - { - "type": "number", - "description": "Padding in pixels on all sides.", - "minimum": 0 - }, - { - "type": "object", - "additionalProperties": false, - "properties": { - "top": { - "type": "number", - "minimum": 0 - }, - "right": { - "type": "number", - "minimum": 0 - }, - "bottom": { - "type": "number", - "minimum": 0 - }, - "left": { - "type": "number", - "minimum": 0 - } - } - } - ], - "default": 5 - }, - "maxWidth": { - "type": "number", - "description": "Maximum width of the text box. Text will wrap.", - "minimum": 1 - }, - "opacity": { - "type": "number", - "description": "Opacity of the text and background (0-1).", - "minimum": 0, - "maximum": 1, - "default": 1 - } - }, - "required": [ - "content" - ] - }, - "rectangle": { - "type": "object", - "description": "Configuration for rectangle annotations.", - "properties": { - "width": { - "type": "number", - "description": "Width of the rectangle in pixels.", - "minimum": 1 - }, - "height": { - "type": "number", - "description": "Height of the rectangle in pixels.", - "minimum": 1 - }, - "fill": { - "type": "string", - "description": "Fill color (hex, rgb, or named color). Use 'transparent' for no fill.", - "default": "transparent" - }, - "stroke": { - "type": "string", - "description": "Border color (hex, rgb, or named color).", - "default": "#FF0000" - }, - "strokeWidth": { - "type": "number", - "description": "Border width in pixels.", - "minimum": 0, - "default": 2 - }, - "opacity": { - "type": "number", - "description": "Opacity (0-1).", - "minimum": 0, - "maximum": 1, - "default": 1 - }, - "rx": { - "type": "number", - "description": "Horizontal corner radius for rounded rectangles.", - "minimum": 0, - "default": 0 - }, - "ry": { - "type": "number", - "description": "Vertical corner radius for rounded rectangles.", - "minimum": 0, - "default": 0 - } - } - }, - "circle": { - "type": "object", - "description": "Configuration for circle annotations.", - "properties": { - "radius": { - "type": "number", - "description": "Radius of the circle in pixels.", - "minimum": 1, - "default": 30 - }, - "fill": { - "type": "string", - "description": "Fill color (hex, rgb, or named color). Use 'transparent' for no fill.", - "default": "transparent" - }, - "stroke": { - "type": "string", - "description": "Border color (hex, rgb, or named color).", - "default": "#FF0000" - }, - "strokeWidth": { - "type": "number", - "description": "Border width in pixels.", - "minimum": 0, - "default": 2 - }, - "opacity": { - "type": "number", - "description": "Opacity (0-1).", - "minimum": 0, - "maximum": 1, - "default": 1 - } - } - }, - "line": { - "type": "object", - "description": "Configuration for line annotations.", - "properties": { - "from": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "to": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "color": { - "type": "string", - "description": "Color of the line (hex, rgb, or named color).", - "default": "#000000" - }, - "strokeWidth": { - "type": "number", - "description": "Width of the line in pixels.", - "minimum": 1, - "default": 2 - }, - "dashArray": { - "type": "array", - "description": "Dash pattern [dash, gap]. E.g., [5, 5] for dashed line.", - "items": { - "type": "number", - "minimum": 0 - } - } - }, - "required": [ - "from", - "to" - ] - }, - "callout": { - "type": "object", - "description": "Configuration for callout annotations (text with arrow).", - "properties": { - "content": { - "type": "string", - "description": "Text content to display." - }, - "target": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "textPosition": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "fontSize": { - "type": "number", - "description": "Font size in pixels.", - "minimum": 1, - "default": 14 - }, - "color": { - "type": "string", - "description": "Text color.", - "default": "#000000" - }, - "backgroundColor": { - "type": "string", - "description": "Background color for the text box.", - "default": "#FFFFCC" - }, - "arrowColor": { - "type": "string", - "description": "Color of the arrow.", - "default": "#000000" - }, - "maxWidth": { - "type": "number", - "description": "Maximum width of the text box.", - "minimum": 1 - } - }, - "required": [ - "content", - "target" - ] - }, - "highlight": { - "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", - "properties": { - "color": { - "type": "string", - "description": "Highlight color (hex, rgb, or named color).", - "default": "#FFFF00" - }, - "opacity": { - "type": "number", - "description": "Opacity (0-1).", - "minimum": 0, - "maximum": 1, - "default": 0.3 - } - } - }, - "blur": { - "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", - "properties": { - "intensity": { - "type": "number", - "description": "Blur intensity level.", - "minimum": 1, - "default": 10 - }, - "width": { - "type": "number", - "description": "Width of the blur area in pixels.", - "minimum": 1 - }, - "height": { - "type": "number", - "description": "Height of the blur area in pixels.", - "minimum": 1 - } - } - } - }, - "components": { - "schemas": { - "arrow_properties": { - "type": "object", - "description": "Configuration for arrow annotations.", - "properties": { - "from": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "to": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "color": { - "type": "string", - "description": "Color of the arrow (hex, rgb, or named color).", - "default": "#FF0000" - }, - "strokeWidth": { - "type": "number", - "description": "Width of the arrow line in pixels.", - "minimum": 1, - "default": 3 - }, - "headSize": { - "type": "number", - "description": "Size of the arrowhead in pixels.", - "minimum": 1, - "default": 15 - } - } - }, - "text_properties": { - "type": "object", - "description": "Configuration for text annotations.", - "properties": { - "content": { - "type": "string", - "description": "Text content to display." - }, - "fontSize": { - "type": "number", - "description": "Font size in pixels.", - "minimum": 1, - "default": 16 - }, - "fontFamily": { - "type": "string", - "description": "Font family name.", - "default": "Arial" - }, - "color": { - "type": "string", - "description": "Text color (hex, rgb, or named color).", - "default": "#000000" - }, - "backgroundColor": { - "type": "string", - "description": "Background color for the text box.", - "default": "#FFFFFF" - }, - "padding": { - "anyOf": [ - { - "type": "number", - "description": "Padding in pixels on all sides.", - "minimum": 0 - }, - { - "type": "object", - "additionalProperties": false, - "properties": { - "top": { - "type": "number", - "minimum": 0 - }, - "right": { - "type": "number", - "minimum": 0 - }, - "bottom": { - "type": "number", - "minimum": 0 - }, - "left": { - "type": "number", - "minimum": 0 - } - } - } - ], - "default": 5 - }, - "maxWidth": { - "type": "number", - "description": "Maximum width of the text box. Text will wrap.", - "minimum": 1 - }, - "opacity": { - "type": "number", - "description": "Opacity of the text and background (0-1).", - "minimum": 0, - "maximum": 1, - "default": 1 - } - }, - "required": [ - "content" - ] - }, - "rectangle_properties": { - "type": "object", - "description": "Configuration for rectangle annotations.", - "properties": { - "width": { - "type": "number", - "description": "Width of the rectangle in pixels.", - "minimum": 1 - }, - "height": { - "type": "number", - "description": "Height of the rectangle in pixels.", - "minimum": 1 - }, - "fill": { - "type": "string", - "description": "Fill color (hex, rgb, or named color). Use 'transparent' for no fill.", - "default": "transparent" - }, - "stroke": { - "type": "string", - "description": "Border color (hex, rgb, or named color).", - "default": "#FF0000" - }, - "strokeWidth": { - "type": "number", - "description": "Border width in pixels.", - "minimum": 0, - "default": 2 - }, - "opacity": { - "type": "number", - "description": "Opacity (0-1).", - "minimum": 0, - "maximum": 1, - "default": 1 - }, - "rx": { - "type": "number", - "description": "Horizontal corner radius for rounded rectangles.", - "minimum": 0, - "default": 0 - }, - "ry": { - "type": "number", - "description": "Vertical corner radius for rounded rectangles.", - "minimum": 0, - "default": 0 - } - } - }, - "circle_properties": { - "type": "object", - "description": "Configuration for circle annotations.", - "properties": { - "radius": { - "type": "number", - "description": "Radius of the circle in pixels.", - "minimum": 1, - "default": 30 - }, - "fill": { - "type": "string", - "description": "Fill color (hex, rgb, or named color). Use 'transparent' for no fill.", - "default": "transparent" - }, - "stroke": { - "type": "string", - "description": "Border color (hex, rgb, or named color).", - "default": "#FF0000" - }, - "strokeWidth": { - "type": "number", - "description": "Border width in pixels.", - "minimum": 0, - "default": 2 - }, - "opacity": { - "type": "number", - "description": "Opacity (0-1).", - "minimum": 0, - "maximum": 1, - "default": 1 - } - } - }, - "line_properties": { - "type": "object", - "description": "Configuration for line annotations.", - "properties": { - "from": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "to": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "color": { - "type": "string", - "description": "Color of the line (hex, rgb, or named color).", - "default": "#000000" - }, - "strokeWidth": { - "type": "number", - "description": "Width of the line in pixels.", - "minimum": 1, - "default": 2 - }, - "dashArray": { - "type": "array", - "description": "Dash pattern [dash, gap]. E.g., [5, 5] for dashed line.", - "items": { - "type": "number", - "minimum": 0 - } - } - }, - "required": [ - "from", - "to" - ] - }, - "callout_properties": { - "type": "object", - "description": "Configuration for callout annotations (text with arrow).", - "properties": { - "content": { - "type": "string", - "description": "Text content to display." - }, - "target": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "textPosition": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "fontSize": { - "type": "number", - "description": "Font size in pixels.", - "minimum": 1, - "default": 14 - }, - "color": { - "type": "string", - "description": "Text color.", - "default": "#000000" - }, - "backgroundColor": { - "type": "string", - "description": "Background color for the text box.", - "default": "#FFFFCC" - }, - "arrowColor": { - "type": "string", - "description": "Color of the arrow.", - "default": "#000000" - }, - "maxWidth": { - "type": "number", - "description": "Maximum width of the text box.", - "minimum": 1 - } - }, - "required": [ - "content", - "target" - ] - }, - "highlight_properties": { - "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", - "properties": { - "color": { - "type": "string", - "description": "Highlight color (hex, rgb, or named color).", - "default": "#FFFF00" - }, - "opacity": { - "type": "number", - "description": "Opacity (0-1).", - "minimum": 0, - "maximum": 1, - "default": 0.3 - } - } - }, - "blur_properties": { - "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", - "properties": { - "intensity": { - "type": "number", - "description": "Blur intensity level.", - "minimum": 1, - "default": 10 - }, - "width": { - "type": "number", - "description": "Width of the blur area in pixels.", - "minimum": 1 - }, - "height": { - "type": "number", - "description": "Height of the blur area in pixels.", - "minimum": 1 - } - } - }, - "point": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "padding": { - "type": "object", - "additionalProperties": false, - "properties": { - "top": { - "type": "number", - "minimum": 0 - }, - "right": { - "type": "number", - "minimum": 0 - }, - "bottom": { - "type": "number", - "minimum": 0 - }, - "left": { - "type": "number", - "minimum": 0 - } - } - } - } - }, - "examples": [ - { - "find": { - "selector": "#submit-button" - }, - "arrow": { - "from": { - "x": 0, - "y": -50 - }, - "to": { - "x": 0, - "y": 0 - }, - "color": "#00FF00", - "strokeWidth": 4, - "headSize": 20 - } - }, - { - "position": "top-right", - "text": { - "content": "Important Notice", - "fontSize": 18, - "color": "#FFFFFF", - "backgroundColor": "#0000FF", - "padding": 10, - "maxWidth": 200, - "opacity": 0.9 - } - }, - { - "find": { - "elementClass": [ - "sensitive-info", - "/^private-/" - ] - }, - "blur": { - "intensity": 15, - "width": 200, - "height": 50 - } - } - ] - } - } - }, - "title": "Capture screenshot (detailed)" - }, - "crop_element": { - "title": "Crop by element (detailed)", - "type": "object", - "description": "Crop the screenshot to a specific element.", - "additionalProperties": false, - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "properties": { - "elementText": { - "type": "string", - "description": "Display text of the element to screenshot." - }, - "selector": { - "type": "string", - "description": "Selector of the element to screenshot." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - }, - "padding": { - "anyOf": [ - { - "title": "Padding (simple)", - "type": "number", - "description": "Padding in pixels to add to the bounds of the element.", - "minimum": 0 - }, - { - "type": "object", - "additionalProperties": false, - "properties": { - "top": { - "type": "number", - "minimum": 0 - }, - "right": { - "type": "number", - "minimum": 0 - }, - "bottom": { - "type": "number", - "minimum": 0 - }, - "left": { - "type": "number", - "minimum": 0 - } - }, - "title": "Padding (detailed)", - "description": "Padding in pixels to add to the bounds of the element." - } - ] - } - } - }, - "padding": { - "type": "object", - "additionalProperties": false, - "properties": { - "top": { - "type": "number", - "minimum": 0 - }, - "right": { - "type": "number", - "minimum": 0 - }, - "bottom": { - "type": "number", - "minimum": 0 - }, - "left": { - "type": "number", - "minimum": 0 - } - }, - "title": "Padding (detailed)", - "description": "Padding in pixels to add to the bounds of the element." - } - } - }, "examples": [ true, "image.png", diff --git a/common/src/schemas/output_schemas/spec_v3.schema.json b/common/src/schemas/output_schemas/spec_v3.schema.json index 3302ef8..4c83b74 100644 --- a/common/src/schemas/output_schemas/spec_v3.schema.json +++ b/common/src/schemas/output_schemas/spec_v3.schema.json @@ -6227,6 +6227,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -6406,16 +6410,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -6458,6 +6462,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -6633,8 +6640,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -6651,7 +6668,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -6813,16 +6830,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -6865,6 +6882,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -7040,8 +7060,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -7058,7 +7088,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -7590,6 +7620,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -7769,16 +7803,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -7821,6 +7855,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -7996,8 +8033,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -8014,7 +8061,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -8176,16 +8223,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -8228,6 +8275,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -8403,8 +8453,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -8421,7 +8481,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -16088,6 +16148,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -16267,16 +16331,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -16319,6 +16383,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -16494,8 +16561,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -16512,7 +16589,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -16674,16 +16751,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -16726,6 +16803,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -16901,8 +16981,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -16919,7 +17009,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -17451,6 +17541,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -17630,16 +17724,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -17682,6 +17776,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -17857,8 +17954,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -17875,7 +17982,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -18037,16 +18144,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -18089,6 +18196,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -18264,8 +18374,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -18282,7 +18402,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", diff --git a/common/src/schemas/output_schemas/step_v3.schema.json b/common/src/schemas/output_schemas/step_v3.schema.json index 7cb3291..a3ec4a5 100644 --- a/common/src/schemas/output_schemas/step_v3.schema.json +++ b/common/src/schemas/output_schemas/step_v3.schema.json @@ -3,117 +3,6 @@ "title": "step", "description": "A step in a test.", "type": "object", - "components": { - "schemas": { - "common": { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { - "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - }, - "title": "Common" - }, - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { - "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - } - }, "anyOf": [ { "allOf": [ @@ -5027,6 +4916,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -5206,16 +5099,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -5258,6 +5151,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -5433,8 +5329,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -5451,7 +5357,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -5613,16 +5519,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -5665,6 +5571,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -5840,8 +5749,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -5858,7 +5777,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -6390,6 +6309,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -6569,16 +6492,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -6621,6 +6544,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -6796,8 +6722,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -6814,7 +6750,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -6976,16 +6912,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -7028,6 +6964,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -7203,8 +7142,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -7221,7 +7170,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", diff --git a/common/src/schemas/output_schemas/test_v3.schema.json b/common/src/schemas/output_schemas/test_v3.schema.json index b7e04da..18c1c86 100644 --- a/common/src/schemas/output_schemas/test_v3.schema.json +++ b/common/src/schemas/output_schemas/test_v3.schema.json @@ -5626,6 +5626,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -5805,16 +5809,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -5857,6 +5861,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -6032,8 +6039,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -6050,7 +6067,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -6212,16 +6229,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -6264,6 +6281,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -6439,8 +6459,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -6457,7 +6487,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -6989,6 +7019,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -7168,16 +7202,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -7220,6 +7254,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -7395,8 +7432,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -7413,7 +7460,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -7575,16 +7622,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -7627,6 +7674,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -7802,8 +7852,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -7820,7 +7880,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -15487,6 +15547,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -15666,16 +15730,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -15718,6 +15782,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -15893,8 +15960,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -15911,7 +15988,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -16073,16 +16150,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -16125,6 +16202,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -16300,8 +16380,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -16318,7 +16408,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -16850,6 +16940,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -17029,16 +17123,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -17081,6 +17175,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -17256,8 +17353,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -17274,7 +17381,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -17436,16 +17543,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -17488,6 +17595,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -17663,8 +17773,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -17681,7 +17801,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -20083,192 +20203,6 @@ } ], "additionalProperties": false, - "components": { - "schemas": { - "openApi": { - "type": "array", - "items": { - "allOf": [ - { - "version": "1.0.0", - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "openApi", - "type": "object", - "description": "OpenAPI description and configuration.", - "additionalProperties": false, - "anyOf": [ - { - "required": [ - "descriptionPath" - ] - }, - { - "required": [ - "operationId" - ] - } - ], - "properties": { - "name": { - "type": "string", - "description": "Name of the OpenAPI description, as defined in your configuration." - }, - "descriptionPath": { - "type": "string", - "description": "URL or local path to the OpenAPI description." - }, - "definition": { - "type": "object", - "readOnly": true, - "description": "OpenAPI definition object loaded from the `descriptionPath`. This is a resolved version of the OpenAPI description and should not be user-defined.", - "additionalProperties": true, - "title": "OpenAPI definition" - }, - "operationId": { - "type": "string", - "description": "ID of the operation to use for the request." - }, - "server": { - "type": "string", - "description": "Server to use for example requests. Only valid if `useExample` is `request` or `both`. If not specified but an example is used for the request, uses the first server defined in the OpenAPI description." - }, - "validateAgainstSchema": { - "type": "string", - "description": "Validates the request and/or response against the schema in the OpenAPI description. If the request or response doesn't match the schema, the step fails.", - "enum": [ - "request", - "response", - "both", - "none" - ], - "default": "both" - }, - "mockResponse": { - "type": "boolean", - "description": "If `true`, doesn't make the HTTP request, but instead uses the response example or schema from the OpenAPI description as the response data. Useful for creating tests when an API isn't fully implemented yet. If `statusCode` isn't specified, uses the first defined response code." - }, - "statusCode": { - "type": "integer", - "description": "Response code to use for validation, examples, and status code checking. If the response code doesn't match, the step fails. `statusCodes` overrides this value when specified." - }, - "useExample": { - "type": [ - "string" - ], - "description": "Uses the example from the OpenAPI description as the request and response data. If the request or response has multiple examples, specify `exampleKey`. If `statusCode` isn't specified, uses the first defined response code. `requestData`, `requestParams`, and `requestHeaders` override portions of request examples when specified. `responseData` overrides portions of response examples when specified.", - "enum": [ - "request", - "response", - "both", - "none" - ], - "default": "none" - }, - "exampleKey": { - "type": "string", - "description": "Key of the example to use from the `examples` property in the OpenAPI description. If an `examples` key isn't specified or isn't available for a given parameter or object, the `example` property value is used.", - "default": "" - }, - "headers": { - "type": "object", - "description": "Request headers to add to requests. For example, to set `Authorization` headers for all requests from the specified OpenAPI document. If specified in both a config and a step, the step value overrides the config value.", - "additionalProperties": { - "type": "string" - }, - "title": "OpenAPI request headers" - } - }, - "components": { - "schemas": { - "operationId": { - "type": "string", - "description": "ID of the operation to use for the request." - }, - "descriptionPath": { - "type": "string", - "description": "URL or local path to the OpenAPI description." - } - } - }, - "examples": [ - { - "descriptionPath": "https://petstore.swagger.io/v2/swagger.json" - }, - { - "name": "Reqres", - "operationId": "getUserById" - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "getUserById" - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both" - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both", - "exampleKey": "example1" - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both", - "exampleKey": "example1", - "statusCode": 201 - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both", - "exampleKey": "example1", - "statusCode": 201, - "validateAgainstSchema": "none" - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both", - "exampleKey": "example1", - "statusCode": 201, - "validateAgainstSchema": "none", - "mockResponse": true - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both", - "exampleKey": "example1", - "statusCode": 201, - "validateAgainstSchema": "none", - "mockResponse": true, - "headers": { - "Authorization": "Bearer 12345" - } - } - ] - }, - { - "type": "object", - "not": { - "required": [ - "operationId" - ] - }, - "required": [ - "name", - "descriptionPath" - ], - "title": "OpenAPI description (test)" - } - ] - } - } - } - }, "examples": [ { "steps": [ diff --git a/common/src/schemas/output_schemas/type_v3.schema.json b/common/src/schemas/output_schemas/type_v3.schema.json index 566eda5..684a4bf 100644 --- a/common/src/schemas/output_schemas/type_v3.schema.json +++ b/common/src/schemas/output_schemas/type_v3.schema.json @@ -108,114 +108,6 @@ "additionalProperties": false } ], - "components": { - "schemas": { - "keys": { - "title": "Type keys (simple)", - "description": "Sequence of keys to enter.", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - } - ] - } - } - ] - }, - "object": { - "title": "Type keys (detailed)", - "type": "object", - "properties": { - "keys": { - "title": "Type keys (simple)", - "description": "Sequence of keys to enter.", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - } - ] - } - } - ] - }, - "inputDelay": { - "type": "number", - "description": "Delay in milliseconds between each key press during a recording", - "default": 100 - }, - "selector": { - "type": "string", - "description": "Selector for the element to type into. If not specified, the typing occurs in the active element." - }, - "elementText": { - "type": "string", - "description": "Display text of the element to type into. If combined with other element finding fields, the element must match all specified criteria." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - } - }, - "required": [ - "keys" - ], - "additionalProperties": false - } - } - }, "examples": [ "kittens", [ diff --git a/common/src/schemas/output_schemas/wait_v3.schema.json b/common/src/schemas/output_schemas/wait_v3.schema.json index 0374d01..014333a 100644 --- a/common/src/schemas/output_schemas/wait_v3.schema.json +++ b/common/src/schemas/output_schemas/wait_v3.schema.json @@ -21,18 +21,6 @@ "title": "Wait (boolean)" } ], - "components": { - "schemas": { - "string": { - "title": "Wait (environment variable)", - "type": "string", - "pattern": "(\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - } - } - }, "examples": [ 5000, "$WAIT_DURATION", diff --git a/common/src/schemas/schemas.json b/common/src/schemas/schemas.json index 5e6e338..06fe4d7 100644 --- a/common/src/schemas/schemas.json +++ b/common/src/schemas/schemas.json @@ -1,4 +1,736 @@ { + "annotation_v3": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "annotation", + "type": "object", + "description": "A visual annotation to add to the screenshot. Annotations can point to elements on the page (via `find`) or be positioned freely within the viewport.", + "anyOf": [ + { + "required": [ + "arrow" + ], + "not": { + "required": [ + "text", + "rectangle", + "circle", + "line", + "callout", + "highlight", + "blur" + ] + } + }, + { + "required": [ + "text" + ], + "not": { + "required": [ + "arrow", + "rectangle", + "circle", + "line", + "callout", + "highlight", + "blur" + ] + } + }, + { + "required": [ + "rectangle" + ], + "not": { + "required": [ + "arrow", + "text", + "circle", + "line", + "callout", + "highlight", + "blur" + ] + } + }, + { + "required": [ + "circle" + ], + "not": { + "required": [ + "arrow", + "text", + "rectangle", + "line", + "callout", + "highlight", + "blur" + ] + } + }, + { + "required": [ + "line" + ], + "not": { + "required": [ + "arrow", + "text", + "rectangle", + "circle", + "callout", + "highlight", + "blur" + ] + } + }, + { + "required": [ + "callout" + ], + "not": { + "required": [ + "arrow", + "text", + "rectangle", + "circle", + "line", + "highlight", + "blur" + ] + } + }, + { + "required": [ + "highlight" + ], + "not": { + "required": [ + "arrow", + "text", + "rectangle", + "circle", + "line", + "callout", + "blur" + ] + } + }, + { + "required": [ + "blur" + ], + "not": { + "required": [ + "arrow", + "text", + "rectangle", + "circle", + "line", + "callout", + "highlight" + ] + } + } + ], + "properties": { + "find": { + "type": "object", + "description": "Element on the page to annotate.", + "anyOf": [ + { + "required": [ + "selector" + ] + }, + { + "required": [ + "elementText" + ] + }, + { + "required": [ + "elementId" + ] + }, + { + "required": [ + "elementTestId" + ] + }, + { + "required": [ + "elementClass" + ] + }, + { + "required": [ + "elementAttribute" + ] + }, + { + "required": [ + "elementAria" + ] + } + ], + "additionalProperties": false, + "properties": { + "selector": { + "type": "string", + "description": "Selector of the element to annotate." + }, + "elementText": { + "type": "string", + "description": "Display text of the element to annotate." + }, + "elementTestId": { + "type": "string", + "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementClass": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "array", + "items": { + "type": "string" + } + } + ], + "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." + }, + "elementAttribute": { + "type": "object", + "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", + "additionalProperties": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + } + ] + } + }, + "elementAria": { + "type": "string", + "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." + } + } + }, + "position": { + "anyOf": [ + { + "type": "object", + "description": "A coordinate point (x, y).", + "properties": { + "x": { + "type": "number", + "description": "X coordinate in pixels." + }, + "y": { + "type": "number", + "description": "Y coordinate in pixels." + } + }, + "required": [ + "x", + "y" + ] + }, + { + "type": "string", + "enum": [ + "top", + "bottom", + "left", + "right", + "center", + "top-left", + "top-right", + "bottom-left", + "bottom-right" + ], + "description": "Position relative to the element (if `find` is provided) or to the viewport." + } + ] + }, + "arrow": { + "type": "object", + "description": "Configuration for arrow annotations.", + "properties": { + "from": { + "type": "object", + "description": "A coordinate point (x, y).", + "properties": { + "x": { + "type": "number", + "description": "X coordinate in pixels." + }, + "y": { + "type": "number", + "description": "Y coordinate in pixels." + } + }, + "required": [ + "x", + "y" + ] + }, + "to": { + "type": "object", + "description": "A coordinate point (x, y).", + "properties": { + "x": { + "type": "number", + "description": "X coordinate in pixels." + }, + "y": { + "type": "number", + "description": "Y coordinate in pixels." + } + }, + "required": [ + "x", + "y" + ] + }, + "color": { + "type": "string", + "description": "Color of the arrow (hex, rgb, or named color).", + "default": "#FF0000" + }, + "strokeWidth": { + "type": "number", + "description": "Width of the arrow line in pixels.", + "minimum": 1, + "default": 3 + }, + "headSize": { + "type": "number", + "description": "Size of the arrowhead in pixels.", + "minimum": 1, + "default": 15 + } + } + }, + "text": { + "type": "object", + "description": "Configuration for text annotations.", + "properties": { + "content": { + "type": "string", + "description": "Text content to display." + }, + "fontSize": { + "type": "number", + "description": "Font size in pixels.", + "minimum": 1, + "default": 16 + }, + "fontFamily": { + "type": "string", + "description": "Font family name.", + "default": "Arial" + }, + "color": { + "type": "string", + "description": "Text color (hex, rgb, or named color).", + "default": "#000000" + }, + "backgroundColor": { + "type": "string", + "description": "Background color for the text box.", + "default": "#FFFFFF" + }, + "padding": { + "anyOf": [ + { + "type": "number", + "description": "Padding in pixels on all sides.", + "minimum": 0 + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "top": { + "type": "number", + "minimum": 0 + }, + "right": { + "type": "number", + "minimum": 0 + }, + "bottom": { + "type": "number", + "minimum": 0 + }, + "left": { + "type": "number", + "minimum": 0 + } + } + } + ], + "default": 5 + }, + "maxWidth": { + "type": "number", + "description": "Maximum width of the text box. Text will wrap.", + "minimum": 1 + }, + "opacity": { + "type": "number", + "description": "Opacity of the text and background (0-1).", + "minimum": 0, + "maximum": 1, + "default": 1 + } + }, + "required": [ + "content" + ] + }, + "rectangle": { + "type": "object", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", + "properties": { + "width": { + "type": "number", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", + "minimum": 1 + }, + "fill": { + "type": "string", + "description": "Fill color (hex, rgb, or named color). Use 'transparent' for no fill.", + "default": "transparent" + }, + "stroke": { + "type": "string", + "description": "Border color (hex, rgb, or named color).", + "default": "#FF0000" + }, + "strokeWidth": { + "type": "number", + "description": "Border width in pixels.", + "minimum": 0, + "default": 2 + }, + "opacity": { + "type": "number", + "description": "Opacity (0-1).", + "minimum": 0, + "maximum": 1, + "default": 1 + }, + "rx": { + "type": "number", + "description": "Horizontal corner radius for rounded rectangles.", + "minimum": 0, + "default": 0 + }, + "ry": { + "type": "number", + "description": "Vertical corner radius for rounded rectangles.", + "minimum": 0, + "default": 0 + } + } + }, + "circle": { + "type": "object", + "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], + "properties": { + "radius": { + "type": "number", + "description": "Radius of the circle in pixels.", + "minimum": 1, + "default": 30 + }, + "fill": { + "type": "string", + "description": "Fill color (hex, rgb, or named color). Use 'transparent' for no fill.", + "default": "transparent" + }, + "stroke": { + "type": "string", + "description": "Border color (hex, rgb, or named color).", + "default": "#FF0000" + }, + "strokeWidth": { + "type": "number", + "description": "Border width in pixels.", + "minimum": 0, + "default": 2 + }, + "opacity": { + "type": "number", + "description": "Opacity (0-1).", + "minimum": 0, + "maximum": 1, + "default": 1 + } + } + }, + "line": { + "type": "object", + "description": "Configuration for line annotations.", + "properties": { + "from": { + "type": "object", + "description": "A coordinate point (x, y).", + "properties": { + "x": { + "type": "number", + "description": "X coordinate in pixels." + }, + "y": { + "type": "number", + "description": "Y coordinate in pixels." + } + }, + "required": [ + "x", + "y" + ] + }, + "to": { + "type": "object", + "description": "A coordinate point (x, y).", + "properties": { + "x": { + "type": "number", + "description": "X coordinate in pixels." + }, + "y": { + "type": "number", + "description": "Y coordinate in pixels." + } + }, + "required": [ + "x", + "y" + ] + }, + "color": { + "type": "string", + "description": "Color of the line (hex, rgb, or named color).", + "default": "#000000" + }, + "strokeWidth": { + "type": "number", + "description": "Width of the line in pixels.", + "minimum": 1, + "default": 2 + }, + "dashArray": { + "type": "array", + "description": "Dash pattern [dash, gap]. E.g., [5, 5] for dashed line.", + "items": { + "type": "number", + "minimum": 0 + } + } + }, + "required": [ + "from", + "to" + ] + }, + "callout": { + "type": "object", + "description": "Configuration for callout annotations (text with arrow).", + "properties": { + "content": { + "type": "string", + "description": "Text content to display." + }, + "target": { + "type": "object", + "description": "A coordinate point (x, y).", + "properties": { + "x": { + "type": "number", + "description": "X coordinate in pixels." + }, + "y": { + "type": "number", + "description": "Y coordinate in pixels." + } + }, + "required": [ + "x", + "y" + ] + }, + "textPosition": { + "type": "object", + "description": "A coordinate point (x, y).", + "properties": { + "x": { + "type": "number", + "description": "X coordinate in pixels." + }, + "y": { + "type": "number", + "description": "Y coordinate in pixels." + } + }, + "required": [ + "x", + "y" + ] + }, + "fontSize": { + "type": "number", + "description": "Font size in pixels.", + "minimum": 1, + "default": 14 + }, + "color": { + "type": "string", + "description": "Text color.", + "default": "#000000" + }, + "backgroundColor": { + "type": "string", + "description": "Background color for the text box.", + "default": "#FFFFCC" + }, + "arrowColor": { + "type": "string", + "description": "Color of the arrow.", + "default": "#000000" + }, + "maxWidth": { + "type": "number", + "description": "Maximum width of the text box.", + "minimum": 1 + } + }, + "required": [ + "content", + "target" + ] + }, + "highlight": { + "type": "object", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", + "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "color": { + "type": "string", + "description": "Highlight color (hex, rgb, or named color).", + "default": "#FFFF00" + }, + "opacity": { + "type": "number", + "description": "Opacity (0-1).", + "minimum": 0, + "maximum": 1, + "default": 0.3 + } + } + }, + "blur": { + "type": "object", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", + "properties": { + "intensity": { + "type": "number", + "description": "Blur intensity level.", + "minimum": 1, + "default": 10 + }, + "width": { + "type": "number", + "description": "Width of the blur area in pixels.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the blur area in pixels.", + "minimum": 1 + } + } + } + }, + "examples": [ + { + "find": { + "selector": "#submit-button" + }, + "arrow": { + "from": { + "x": 0, + "y": -50 + }, + "to": { + "x": 0, + "y": 0 + }, + "color": "#00FF00", + "strokeWidth": 4, + "headSize": 20 + } + }, + { + "position": "top-right", + "text": { + "content": "Important Notice", + "fontSize": 18, + "color": "#FFFFFF", + "backgroundColor": "#0000FF", + "padding": 10, + "maxWidth": 200, + "opacity": 0.9 + } + }, + { + "find": { + "elementClass": [ + "sensitive-info", + "/^private-/" + ] + }, + "blur": { + "intensity": 15, + "width": 200, + "height": 50 + } + } + ] + }, "checkLink_v3": { "$schema": "http://json-schema.org/draft-07/schema#", "title": "checkLink", @@ -64,70 +796,6 @@ } } ], - "components": { - "schemas": { - "string": { - "title": "Check link (detailed)", - "description": "Check if an HTTP or HTTPS URL returns an acceptable status code from a GET request.", - "type": "string", - "pattern": "(^(http://|https://|\\/).*|\\$[A-Za-z0-9_]+$)", - "transform": [ - "trim" - ] - }, - "object": { - "title": "Check link (detailed)", - "description": "Check if an HTTP or HTTPS URL returns an acceptable status code from a GET request.", - "type": "object", - "additionalProperties": false, - "required": [ - "url" - ], - "properties": { - "url": { - "type": "string", - "description": "URL to check. Can be a full URL or a path. If a path is provided, `origin` must be specified.", - "pattern": "(^(http://|https://|/).*|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - "origin": { - "type": "string", - "description": "Protocol and domain to navigate to. Prepended to `url`.", - "transform": [ - "trim" - ] - }, - "statusCodes": { - "description": "Accepted status codes. If the specified URL returns a code other than what is specified here, the action fails.", - "anyOf": [ - { - "type": "integer" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "integer" - } - ] - } - } - ], - "default": [ - 200, - 301, - 302, - 307, - 308 - ] - } - } - } - } - }, "examples": [ "https://www.google.com", "/search", @@ -261,127 +929,6 @@ "type": "boolean" } ], - "components": { - "schemas": { - "string": { - "title": "Click element (simple)", - "type": "string", - "description": "Identifier for the element to click. Can be a selector, element text, ARIA name, ID, or test ID." - }, - "button": { - "description": "Kind of click to perform.", - "type": "string", - "enum": [ - "left", - "right", - "middle" - ] - }, - "object": { - "title": "Click element (detailed)", - "type": "object", - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "properties": { - "button": { - "description": "Kind of click to perform.", - "type": "string", - "enum": [ - "left", - "right", - "middle" - ] - }, - "elementText": { - "type": "string", - "description": "Display text of the element to click. If combined with other element finding fields, the element must match all specified criteria." - }, - "selector": { - "type": "string", - "description": "Selector of the element to click. If combined with other element finding fields, the element must match all specified criteria." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to click. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to click. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - } - } - } - } - }, "examples": [ true, "right", @@ -6210,6 +6757,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -6389,16 +6940,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -6441,6 +6992,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -6616,8 +7170,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -6634,7 +7198,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -6796,16 +7360,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -6848,6 +7412,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -7023,8 +7590,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -7041,7 +7618,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -7573,6 +8150,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -7752,16 +8333,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -7804,6 +8385,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -7979,8 +8563,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -7997,7 +8591,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -8159,16 +8753,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -8211,6 +8805,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -8386,8 +8983,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -8404,7 +9011,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -11358,11062 +11965,900 @@ "default": false } }, - "components": { - "schemas": { - "environment": { - "type": "object", - "description": "Environment information for the system running Doc Detective.", - "readOnly": true, - "additionalProperties": false, - "required": [ - "platform" - ], - "properties": { - "workingDirectory": { - "description": "The current working directory of the process running Doc Detective.", - "type": "string" + "examples": [ + {}, + { + "input": ".", + "output": ".", + "recursive": true, + "loadVariables": ".env", + "fileTypes": [ + "markdown" + ] + }, + { + "fileTypes": [ + { + "extends": "markdown", + "extensions": [ + "md", + "markdown", + "mdx" + ], + "inlineStatements": { + "testStart": "", + "testEnd": "", + "ignoreStart": "", + "ignoreEnd": "", + "step": "" }, - "platform": { - "description": "The operating system type running Doc Detective.", + "markup": [ + { + "name": "onscreenText", + "regex": "\\*\\*.+?\\*\\*", + "actions": "find" + } + ] + } + ] + }, + { + "fileTypes": [ + { + "name": "Jupyter Notebooks", + "extensions": "ipynb", + "runShell": { + "command": "jupyter", + "args": [ + "nbconvert", + "--to", + "script", + "--execute", + "$1", + "--stdout" + ] + } + }, + { + "name": "JavaScript", + "extensions": "js", + "runShell": { + "command": "node $1" + } + }, + { + "name": "Python", + "extensions": "py", + "runShell": { + "command": "python $1" + } + } + ] + }, + { + "environment": { + "platform": "windows", + "arch": "x64" + } + }, + { + "concurrentRunners": 1 + }, + { + "concurrentRunners": true + }, + { + "concurrentRunners": 4 + }, + { + "debug": false + }, + { + "debug": true + }, + { + "debug": "stepThrough" + }, + { + "integrations": { + "docDetectiveApi": { + "apiKey": "your-api-key-here" + } + } + }, + { + "crawl": true + } + ] + }, + "context_v3": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "context", + "type": "object", + "description": "A context in which to perform tests. If no contexts are specified but a context is required by one or more tests, Doc Detective attempts to identify a supported context in the current environment and run tests against it. For example, if a browser isn't specified but is required by steps in the test, Doc Detective will search for and use a supported browser available in the current environment.", + "additionalProperties": false, + "dynamicDefaults": { + "contextId": "uuid" + }, + "properties": { + "$schema": { + "description": "JSON Schema for this object.", + "type": "string", + "enum": [ + "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/context_v3.schema.json" + ] + }, + "contextId": { + "type": "string", + "description": "Unique identifier for the context." + }, + "platforms": { + "description": "Platforms to run tests on.", + "anyOf": [ + { + "type": "string", + "enum": [ + "linux", + "mac", + "windows" + ] + }, + { + "type": "array", + "items": { "type": "string", "enum": [ "linux", "mac", "windows" ] - }, - "arch": { - "description": "The processor architecture of the system running Doc Detective.", - "type": "string", - "enum": [ - "arm32", - "arm64", - "x32", - "x64" - ] } + } + ] + }, + "browsers": { + "description": "Browsers to run tests on.", + "anyOf": [ + { + "type": "string", + "description": "Name of the browser.", + "enum": [ + "chrome", + "firefox", + "safari", + "webkit" + ], + "$comment": "`safari` is just a shortcut for `webkit`. Included for visibility and to reduce questions." }, - "title": "Environment details" - }, - "markupDefinition": { - "type": "object", - "properties": { - "name": { - "description": "Name of the markup definition", - "type": "string" + { + "type": "object", + "description": "Browser configuration.", + "required": [ + "name" + ], + "additionalProperties": false, + "properties": { + "name": { + "type": "string", + "description": "Name of the browser.", + "enum": [ + "chrome", + "firefox", + "safari", + "webkit" + ], + "$comment": "`safari` is just a shortcut for `webkit`. Included for visibility and to reduce questions." + }, + "headless": { + "type": "boolean", + "description": "If `true`, runs the browser in headless mode.", + "default": true + }, + "window": { + "type": "object", + "description": "Browser dimensions.", + "additionalProperties": false, + "properties": { + "width": { + "type": "integer", + "description": "Width of the browser window in pixels." + }, + "height": { + "type": "integer", + "description": "Height of the browser window in pixels." + } + }, + "title": "Browser Window" + }, + "viewport": { + "type": "object", + "description": "Viewport dimensions.", + "additionalProperties": false, + "properties": { + "width": { + "type": "integer", + "description": "Width of the viewport in pixels." + }, + "height": { + "type": "integer", + "description": "Height of the viewport in pixels." + } + }, + "title": "Browser Viewport" + } }, - "regex": { - "description": "Regular expressions to match the markup type.", + "title": "Browser" + }, + { + "type": "array", + "items": { "anyOf": [ { + "type": "string", + "description": "Name of the browser.", + "enum": [ + "chrome", + "firefox", + "safari", + "webkit" + ], + "$comment": "`safari` is just a shortcut for `webkit`. Included for visibility and to reduce questions." + }, + { + "type": "object", + "description": "Browser configuration.", + "required": [ + "name" + ], + "additionalProperties": false, + "properties": { + "name": { + "type": "string", + "description": "Name of the browser.", + "enum": [ + "chrome", + "firefox", + "safari", + "webkit" + ], + "$comment": "`safari` is just a shortcut for `webkit`. Included for visibility and to reduce questions." + }, + "headless": { + "type": "boolean", + "description": "If `true`, runs the browser in headless mode.", + "default": true + }, + "window": { + "type": "object", + "description": "Browser dimensions.", + "additionalProperties": false, + "properties": { + "width": { + "type": "integer", + "description": "Width of the browser window in pixels." + }, + "height": { + "type": "integer", + "description": "Height of the browser window in pixels." + } + }, + "title": "Browser Window" + }, + "viewport": { + "type": "object", + "description": "Viewport dimensions.", + "additionalProperties": false, + "properties": { + "width": { + "type": "integer", + "description": "Width of the viewport in pixels." + }, + "height": { + "type": "integer", + "description": "Height of the viewport in pixels." + } + }, + "title": "Browser Viewport" + } + }, + "title": "Browser" + } + ] + } + } + ] + } + }, + "examples": [ + { + "platforms": "linux", + "browsers": "chrome" + }, + { + "platforms": [ + "windows", + "mac", + "linux" + ], + "browsers": [ + "chrome", + "firefox", + "webkit" + ] + }, + { + "browsers": { + "name": "chrome", + "headless": true + } + }, + { + "browsers": [ + { + "name": "chrome", + "headless": true + }, + { + "name": "firefox" + } + ] + }, + { + "platforms": [ + "mac", + "linux" + ], + "browsers": { + "name": "chrome", + "headless": true + } + }, + { + "platforms": [ + "windows", + "mac", + "linux" + ], + "browsers": [ + { + "name": "chrome", + "headless": true, + "window": { + "width": 1920, + "height": 1080 + }, + "viewport": { + "width": 1600, + "height": 900 + } + }, + { + "name": "firefox", + "window": { + "width": 1366, + "height": 768 + } + }, + { + "name": "webkit", + "headless": false, + "viewport": { + "width": 1440, + "height": 900 + } + } + ] + }, + { + "platforms": "mac", + "browsers": [ + { + "name": "safari", + "window": { + "width": 1280, + "height": 800 + } + } + ] + } + ] + }, + "dragAndDrop_v3": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "dragAndDrop", + "description": "Drag and drop an element from source to target.", + "type": "object", + "required": [ + "source", + "target" + ], + "properties": { + "source": { + "description": "The element to drag.", + "anyOf": [ + { + "title": "Element (simple)", + "type": "string", + "description": "Display text, selector, or regex pattern (enclosed in forward slashes) of the element." + }, + { + "title": "Element (detailed)", + "type": "object", + "anyOf": [ + { + "required": [ + "selector" + ] + }, + { + "required": [ + "elementText" + ] + }, + { + "required": [ + "elementId" + ] + }, + { + "required": [ + "elementTestId" + ] + }, + { + "required": [ + "elementClass" + ] + }, + { + "required": [ + "elementAttribute" + ] + }, + { + "required": [ + "elementAria" + ] + } + ], + "properties": { + "elementText": { + "type": "string", + "description": "Display text or regex pattern (enclosed in forward slashes) of the element. If combined with `selector`, the element must match both the text and the selector." + }, + "selector": { + "type": "string", + "description": "Selector of the element. If combined with `elementText`, the element must match both the text and the selector." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementTestId": { + "type": "string", + "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementClass": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "array", + "items": { + "type": "string" + } + } + ], + "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." + }, + "elementAttribute": { + "type": "object", + "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", + "additionalProperties": { "anyOf": [ { "type": "string" }, { - "type": "array", - "minItems": 1, - "items": { - "type": "string" - } + "type": "number" + }, + { + "type": "boolean" } ] } - ] - }, - "batchMatches": { - "description": "If `true`, all matches are combined into a single string.", - "type": "boolean", - "default": false - }, - "actions": { - "description": "Actions to perform when the markup type is detected.", + }, + "elementAria": { + "type": "string", + "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "timeout": { + "type": "integer", + "description": "Max duration in milliseconds to wait for the element to exist.", + "default": 5000 + } + } + } + ] + }, + "target": { + "description": "The target location to drop the element.", + "anyOf": [ + { + "title": "Element (simple)", + "type": "string", + "description": "Display text, selector, or regex pattern (enclosed in forward slashes) of the element." + }, + { + "title": "Element (detailed)", + "type": "object", + "anyOf": [ + { + "required": [ + "selector" + ] + }, + { + "required": [ + "elementText" + ] + }, + { + "required": [ + "elementId" + ] + }, + { + "required": [ + "elementTestId" + ] + }, + { + "required": [ + "elementClass" + ] + }, + { + "required": [ + "elementAttribute" + ] + }, + { + "required": [ + "elementAria" + ] + } + ], + "properties": { + "elementText": { + "type": "string", + "description": "Display text or regex pattern (enclosed in forward slashes) of the element. If combined with `selector`, the element must match both the text and the selector." + }, + "selector": { + "type": "string", + "description": "Selector of the element. If combined with `elementText`, the element must match both the text and the selector." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementTestId": { + "type": "string", + "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementClass": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "array", + "items": { + "type": "string" + } + } + ], + "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." + }, + "elementAttribute": { + "type": "object", + "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", + "additionalProperties": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + } + ] + } + }, + "elementAria": { + "type": "string", + "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "timeout": { + "type": "integer", + "description": "Max duration in milliseconds to wait for the element to exist.", + "default": 5000 + } + } + } + ] + }, + "duration": { + "type": "integer", + "description": "Duration of the drag operation in milliseconds.", + "default": 1000, + "minimum": 0 + } + }, + "examples": [ + { + "source": "Table", + "target": "#canvas" + }, + { + "source": ".draggable-block", + "target": ".drop-zone", + "duration": 2000 + }, + { + "source": { + "selector": ".widget", + "elementText": "Data Table" + }, + "target": { + "selector": "#design-canvas" + }, + "duration": 500 + }, + { + "source": { + "selector": ".draggable", + "timeout": 10000 + }, + "target": { + "elementText": "Drop Zone", + "timeout": 5000 + } + }, + { + "source": "/Widget Item.*/", + "target": "#canvas" + }, + { + "source": { + "selector": ".draggable", + "elementText": "/Button [0-9]+/" + }, + "target": { + "elementText": "/Drop Zone.*/" + } + } + ] + }, + "find_v3": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "find", + "description": "Find an element based on display text or a selector, then optionally interact with it.", + "anyOf": [ + { + "title": "Find element (simple)", + "type": "string", + "description": "Identifier for the element to find. Can be a selector, element text, ARIA name, ID, or test ID." + }, + { + "title": "Find element (detailed)", + "type": "object", + "anyOf": [ + { + "required": [ + "selector" + ] + }, + { + "required": [ + "elementText" + ] + }, + { + "required": [ + "elementId" + ] + }, + { + "required": [ + "elementTestId" + ] + }, + { + "required": [ + "elementClass" + ] + }, + { + "required": [ + "elementAttribute" + ] + }, + { + "required": [ + "elementAria" + ] + } + ], + "additionalProperties": false, + "properties": { + "elementText": { + "type": "string", + "description": "Display text of the element to find. If combined with other element finding fields, the element must match all specified criteria." + }, + "selector": { + "type": "string", + "description": "Selector of the element to find. If combined with other element finding fields, the element must match all specified criteria." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementTestId": { + "type": "string", + "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementClass": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "array", + "items": { + "type": "string" + } + } + ], + "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." + }, + "elementAttribute": { + "type": "object", + "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", + "additionalProperties": { "anyOf": [ { - "type": "string", - "enum": [ - "checkLink", - "click", - "find", - "goTo", - "httpRequest", - "loadCookie", - "loadVariables", - "record", - "runCode", - "runShell", - "saveCookie", - "screenshot", - "stopRecord", - "type", - "wait" - ] + "type": "string" }, { - "type": "array", - "items": { + "type": "number" + }, + { + "type": "boolean" + } + ] + } + }, + "elementAria": { + "type": "string", + "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "timeout": { + "type": "integer", + "description": "Max duration in milliseconds to wait for the element to exist.", + "default": 5000 + }, + "moveTo": { + "description": "Move to the element. If the element isn't visible, it's scrolled into view.", + "type": "boolean", + "default": true + }, + "click": { + "description": "Click the element.", + "anyOf": [ + { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "click", + "description": "Click or tap an element.", + "anyOf": [ + { + "title": "Click element (simple)", + "type": "string", + "description": "Identifier for the element to click. Can be a selector, element text, ARIA name, ID, or test ID." + }, + { + "title": "Click element (detailed)", + "type": "object", "anyOf": [ { + "required": [ + "selector" + ] + }, + { + "required": [ + "elementText" + ] + }, + { + "required": [ + "elementId" + ] + }, + { + "required": [ + "elementTestId" + ] + }, + { + "required": [ + "elementClass" + ] + }, + { + "required": [ + "elementAttribute" + ] + }, + { + "required": [ + "elementAria" + ] + } + ], + "properties": { + "button": { + "description": "Kind of click to perform.", "type": "string", "enum": [ - "checkLink", - "click", - "find", - "goTo", - "httpRequest", - "loadCookie", - "loadVariables", - "record", - "runCode", - "runShell", - "saveCookie", - "screenshot", - "stopRecord", - "type", - "wait" + "left", + "right", + "middle" ] }, - { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "step", - "description": "A step in a test.", + "elementText": { + "type": "string", + "description": "Display text of the element to click. If combined with other element finding fields, the element must match all specified criteria." + }, + "selector": { + "type": "string", + "description": "Selector of the element to click. If combined with other element finding fields, the element must match all specified criteria." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to click. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementTestId": { + "type": "string", + "description": "data-testid attribute of the element to click. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementClass": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "array", + "items": { + "type": "string" + } + } + ], + "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." + }, + "elementAttribute": { "type": "object", - "components": { - "schemas": { - "common": { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { - "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - }, - "title": "Common" - }, - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, - "description": { - "type": "string", - "description": "Description of the step." + "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", + "additionalProperties": { + "anyOf": [ + { + "type": "string" }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { - "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - } - }, - "anyOf": [ - { - "allOf": [ - { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { - "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - }, - "title": "Common" - }, - { - "type": "object", - "required": [ - "checkLink" - ], - "properties": { - "checkLink": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "checkLink", - "anyOf": [ - { - "title": "Check link (detailed)", - "description": "Check if an HTTP or HTTPS URL returns an acceptable status code from a GET request.", - "type": "string", - "pattern": "(^(http://|https://|\\/).*|\\$[A-Za-z0-9_]+$)", - "transform": [ - "trim" - ] - }, - { - "title": "Check link (detailed)", - "description": "Check if an HTTP or HTTPS URL returns an acceptable status code from a GET request.", - "type": "object", - "additionalProperties": false, - "required": [ - "url" - ], - "properties": { - "url": { - "type": "string", - "description": "URL to check. Can be a full URL or a path. If a path is provided, `origin` must be specified.", - "pattern": "(^(http://|https://|/).*|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - "origin": { - "type": "string", - "description": "Protocol and domain to navigate to. Prepended to `url`.", - "transform": [ - "trim" - ] - }, - "statusCodes": { - "description": "Accepted status codes. If the specified URL returns a code other than what is specified here, the action fails.", - "anyOf": [ - { - "type": "integer" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "integer" - } - ] - } - } - ], - "default": [ - 200, - 301, - 302, - 307, - 308 - ] - } - } - } - ], - "components": { - "schemas": { - "string": { - "title": "Check link (detailed)", - "description": "Check if an HTTP or HTTPS URL returns an acceptable status code from a GET request.", - "type": "string", - "pattern": "(^(http://|https://|\\/).*|\\$[A-Za-z0-9_]+$)", - "transform": [ - "trim" - ] - }, - "object": { - "title": "Check link (detailed)", - "description": "Check if an HTTP or HTTPS URL returns an acceptable status code from a GET request.", - "type": "object", - "additionalProperties": false, - "required": [ - "url" - ], - "properties": { - "url": { - "type": "string", - "description": "URL to check. Can be a full URL or a path. If a path is provided, `origin` must be specified.", - "pattern": "(^(http://|https://|/).*|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - "origin": { - "type": "string", - "description": "Protocol and domain to navigate to. Prepended to `url`.", - "transform": [ - "trim" - ] - }, - "statusCodes": { - "description": "Accepted status codes. If the specified URL returns a code other than what is specified here, the action fails.", - "anyOf": [ - { - "type": "integer" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "integer" - } - ] - } - } - ], - "default": [ - 200, - 301, - 302, - 307, - 308 - ] - } - } - } - } - }, - "examples": [ - "https://www.google.com", - "/search", - { - "url": "https://www.google.com", - "statusCodes": 200 - }, - { - "url": "/search", - "origin": "www.google.com", - "statusCodes": [ - 200 - ] - } - ] - } - }, - "title": "checkLink" - } - ] - }, - { - "allOf": [ - { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { - "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - }, - "title": "Common" - }, - { - "type": "object", - "required": [ - "click" - ], - "properties": { - "click": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "click", - "description": "Click or tap an element.", - "anyOf": [ - { - "title": "Click element (simple)", - "type": "string", - "description": "Identifier for the element to click. Can be a selector, element text, ARIA name, ID, or test ID." - }, - { - "title": "Click element (detailed)", - "type": "object", - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "properties": { - "button": { - "description": "Kind of click to perform.", - "type": "string", - "enum": [ - "left", - "right", - "middle" - ] - }, - "elementText": { - "type": "string", - "description": "Display text of the element to click. If combined with other element finding fields, the element must match all specified criteria." - }, - "selector": { - "type": "string", - "description": "Selector of the element to click. If combined with other element finding fields, the element must match all specified criteria." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to click. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to click. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - } - } - }, - { - "type": "boolean" - } - ], - "components": { - "schemas": { - "string": { - "title": "Click element (simple)", - "type": "string", - "description": "Identifier for the element to click. Can be a selector, element text, ARIA name, ID, or test ID." - }, - "button": { - "description": "Kind of click to perform.", - "type": "string", - "enum": [ - "left", - "right", - "middle" - ] - }, - "object": { - "title": "Click element (detailed)", - "type": "object", - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "properties": { - "button": { - "description": "Kind of click to perform.", - "type": "string", - "enum": [ - "left", - "right", - "middle" - ] - }, - "elementText": { - "type": "string", - "description": "Display text of the element to click. If combined with other element finding fields, the element must match all specified criteria." - }, - "selector": { - "type": "string", - "description": "Selector of the element to click. If combined with other element finding fields, the element must match all specified criteria." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to click. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to click. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - } - } - } - } - }, - "examples": [ - true, - "right", - { - "button": "left", - "elementText": "Element text" - }, - { - "selector": "#elementToScreenshot", - "elementText": "Element text", - "button": "middle" - } - ] - } - }, - "title": "click" - } - ] - }, - { - "allOf": [ - { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { - "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - }, - "title": "Common" - }, - { - "type": "object", - "required": [ - "find" - ], - "properties": { - "find": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "find", - "description": "Find an element based on display text or a selector, then optionally interact with it.", - "anyOf": [ - { - "title": "Find element (simple)", - "type": "string", - "description": "Identifier for the element to find. Can be a selector, element text, ARIA name, ID, or test ID." - }, - { - "title": "Find element (detailed)", - "type": "object", - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "additionalProperties": false, - "properties": { - "elementText": { - "type": "string", - "description": "Display text of the element to find. If combined with other element finding fields, the element must match all specified criteria." - }, - "selector": { - "type": "string", - "description": "Selector of the element to find. If combined with other element finding fields, the element must match all specified criteria." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - }, - "timeout": { - "type": "integer", - "description": "Max duration in milliseconds to wait for the element to exist.", - "default": 5000 - }, - "moveTo": { - "description": "Move to the element. If the element isn't visible, it's scrolled into view.", - "type": "boolean", - "default": true - }, - "click": { - "description": "Click the element.", - "anyOf": [ - { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "click", - "description": "Click or tap an element.", - "anyOf": [ - { - "title": "Click element (simple)", - "type": "string", - "description": "Identifier for the element to click. Can be a selector, element text, ARIA name, ID, or test ID." - }, - { - "title": "Click element (detailed)", - "type": "object", - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "properties": { - "button": { - "description": "Kind of click to perform.", - "type": "string", - "enum": [ - "left", - "right", - "middle" - ] - }, - "elementText": { - "type": "string", - "description": "Display text of the element to click. If combined with other element finding fields, the element must match all specified criteria." - }, - "selector": { - "type": "string", - "description": "Selector of the element to click. If combined with other element finding fields, the element must match all specified criteria." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to click. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to click. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - } - } - }, - { - "type": "boolean" - } - ], - "components": { - "schemas": { - "string": { - "title": "Click element (simple)", - "type": "string", - "description": "Identifier for the element to click. Can be a selector, element text, ARIA name, ID, or test ID." - }, - "button": { - "description": "Kind of click to perform.", - "type": "string", - "enum": [ - "left", - "right", - "middle" - ] - }, - "object": { - "title": "Click element (detailed)", - "type": "object", - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "properties": { - "button": { - "description": "Kind of click to perform.", - "type": "string", - "enum": [ - "left", - "right", - "middle" - ] - }, - "elementText": { - "type": "string", - "description": "Display text of the element to click. If combined with other element finding fields, the element must match all specified criteria." - }, - "selector": { - "type": "string", - "description": "Selector of the element to click. If combined with other element finding fields, the element must match all specified criteria." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to click. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to click. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - } - } - } - } - }, - "examples": [ - true, - "right", - { - "button": "left", - "elementText": "Element text" - }, - { - "selector": "#elementToScreenshot", - "elementText": "Element text", - "button": "middle" - } - ] - }, - { - "type": "object", - "properties": { - "button": { - "description": "Kind of click to perform.", - "type": "string", - "enum": [ - "left", - "right", - "middle" - ] - } - }, - "title": "Find element and click" - } - ] - }, - "type": { - "description": "Type keys after finding the element. Either a string or an object with a `keys` field as defined in [`type`](type). To type in the element, make the element active with the `click` parameter.", - "allOf": [ - { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "typeKeys", - "description": "Type keys. To type special keys, begin and end the string with `$` and use the special key's keyword. For example, to type the Escape key, enter `$ESCAPE$`.", - "anyOf": [ - { - "title": "Type keys (simple)", - "description": "Sequence of keys to enter.", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - } - ] - } - } - ] - }, - { - "title": "Type keys (detailed)", - "type": "object", - "properties": { - "keys": { - "title": "Type keys (simple)", - "description": "Sequence of keys to enter.", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - } - ] - } - } - ] - }, - "inputDelay": { - "type": "number", - "description": "Delay in milliseconds between each key press during a recording", - "default": 100 - }, - "selector": { - "type": "string", - "description": "Selector for the element to type into. If not specified, the typing occurs in the active element." - }, - "elementText": { - "type": "string", - "description": "Display text of the element to type into. If combined with other element finding fields, the element must match all specified criteria." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - } - }, - "required": [ - "keys" - ], - "additionalProperties": false - } - ], - "components": { - "schemas": { - "keys": { - "title": "Type keys (simple)", - "description": "Sequence of keys to enter.", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - } - ] - } - } - ] - }, - "object": { - "title": "Type keys (detailed)", - "type": "object", - "properties": { - "keys": { - "title": "Type keys (simple)", - "description": "Sequence of keys to enter.", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - } - ] - } - } - ] - }, - "inputDelay": { - "type": "number", - "description": "Delay in milliseconds between each key press during a recording", - "default": 100 - }, - "selector": { - "type": "string", - "description": "Selector for the element to type into. If not specified, the typing occurs in the active element." - }, - "elementText": { - "type": "string", - "description": "Display text of the element to type into. If combined with other element finding fields, the element must match all specified criteria." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - } - }, - "required": [ - "keys" - ], - "additionalProperties": false - } - } - }, - "examples": [ - "kittens", - [ - "$ENTER$" - ], - [ - "kittens", - "$ENTER$" - ], - { - "keys": "kittens" - }, - { - "keys": [ - "$ENTER$" - ] - }, - { - "keys": [ - "kittens", - "$ENTER$" - ], - "inputDelay": 500 - } - ] - }, - { - "not": { - "type": "object", - "required": [ - "selector", - "elementText", - "elementId", - "elementTestId", - "elementClass", - "elementAttribute", - "elementAria" - ], - "title": "Find element and type" - } - } - ] - } - } - } - ], - "components": { - "schemas": { - "string": { - "title": "Find element (simple)", - "type": "string", - "description": "Identifier for the element to find. Can be a selector, element text, ARIA name, ID, or test ID." - }, - "object": { - "title": "Find element (detailed)", - "type": "object", - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "additionalProperties": false, - "properties": { - "elementText": { - "type": "string", - "description": "Display text of the element to find. If combined with other element finding fields, the element must match all specified criteria." - }, - "selector": { - "type": "string", - "description": "Selector of the element to find. If combined with other element finding fields, the element must match all specified criteria." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - }, - "timeout": { - "type": "integer", - "description": "Max duration in milliseconds to wait for the element to exist.", - "default": 5000 - }, - "moveTo": { - "description": "Move to the element. If the element isn't visible, it's scrolled into view.", - "type": "boolean", - "default": true - }, - "click": { - "description": "Click the element.", - "anyOf": [ - { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "click", - "description": "Click or tap an element.", - "anyOf": [ - { - "title": "Click element (simple)", - "type": "string", - "description": "Identifier for the element to click. Can be a selector, element text, ARIA name, ID, or test ID." - }, - { - "title": "Click element (detailed)", - "type": "object", - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "properties": { - "button": { - "description": "Kind of click to perform.", - "type": "string", - "enum": [ - "left", - "right", - "middle" - ] - }, - "elementText": { - "type": "string", - "description": "Display text of the element to click. If combined with other element finding fields, the element must match all specified criteria." - }, - "selector": { - "type": "string", - "description": "Selector of the element to click. If combined with other element finding fields, the element must match all specified criteria." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to click. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to click. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - } - } - }, - { - "type": "boolean" - } - ], - "components": { - "schemas": { - "string": { - "title": "Click element (simple)", - "type": "string", - "description": "Identifier for the element to click. Can be a selector, element text, ARIA name, ID, or test ID." - }, - "button": { - "description": "Kind of click to perform.", - "type": "string", - "enum": [ - "left", - "right", - "middle" - ] - }, - "object": { - "title": "Click element (detailed)", - "type": "object", - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "properties": { - "button": { - "description": "Kind of click to perform.", - "type": "string", - "enum": [ - "left", - "right", - "middle" - ] - }, - "elementText": { - "type": "string", - "description": "Display text of the element to click. If combined with other element finding fields, the element must match all specified criteria." - }, - "selector": { - "type": "string", - "description": "Selector of the element to click. If combined with other element finding fields, the element must match all specified criteria." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to click. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to click. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - } - } - } - } - }, - "examples": [ - true, - "right", - { - "button": "left", - "elementText": "Element text" - }, - { - "selector": "#elementToScreenshot", - "elementText": "Element text", - "button": "middle" - } - ] - }, - { - "type": "object", - "properties": { - "button": { - "description": "Kind of click to perform.", - "type": "string", - "enum": [ - "left", - "right", - "middle" - ] - } - }, - "title": "Find element and click" - } - ] - }, - "type": { - "description": "Type keys after finding the element. Either a string or an object with a `keys` field as defined in [`type`](type). To type in the element, make the element active with the `click` parameter.", - "allOf": [ - { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "typeKeys", - "description": "Type keys. To type special keys, begin and end the string with `$` and use the special key's keyword. For example, to type the Escape key, enter `$ESCAPE$`.", - "anyOf": [ - { - "title": "Type keys (simple)", - "description": "Sequence of keys to enter.", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - } - ] - } - } - ] - }, - { - "title": "Type keys (detailed)", - "type": "object", - "properties": { - "keys": { - "title": "Type keys (simple)", - "description": "Sequence of keys to enter.", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - } - ] - } - } - ] - }, - "inputDelay": { - "type": "number", - "description": "Delay in milliseconds between each key press during a recording", - "default": 100 - }, - "selector": { - "type": "string", - "description": "Selector for the element to type into. If not specified, the typing occurs in the active element." - }, - "elementText": { - "type": "string", - "description": "Display text of the element to type into. If combined with other element finding fields, the element must match all specified criteria." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - } - }, - "required": [ - "keys" - ], - "additionalProperties": false - } - ], - "components": { - "schemas": { - "keys": { - "title": "Type keys (simple)", - "description": "Sequence of keys to enter.", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - } - ] - } - } - ] - }, - "object": { - "title": "Type keys (detailed)", - "type": "object", - "properties": { - "keys": { - "title": "Type keys (simple)", - "description": "Sequence of keys to enter.", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - } - ] - } - } - ] - }, - "inputDelay": { - "type": "number", - "description": "Delay in milliseconds between each key press during a recording", - "default": 100 - }, - "selector": { - "type": "string", - "description": "Selector for the element to type into. If not specified, the typing occurs in the active element." - }, - "elementText": { - "type": "string", - "description": "Display text of the element to type into. If combined with other element finding fields, the element must match all specified criteria." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - } - }, - "required": [ - "keys" - ], - "additionalProperties": false - } - } - }, - "examples": [ - "kittens", - [ - "$ENTER$" - ], - [ - "kittens", - "$ENTER$" - ], - { - "keys": "kittens" - }, - { - "keys": [ - "$ENTER$" - ] - }, - { - "keys": [ - "kittens", - "$ENTER$" - ], - "inputDelay": 500 - } - ] - }, - { - "not": { - "type": "object", - "required": [ - "selector", - "elementText", - "elementId", - "elementTestId", - "elementClass", - "elementAttribute", - "elementAria" - ], - "title": "Find element and type" - } - } - ] - } - } - } - } - }, - "examples": [ - "Find me!", - { - "selector": "[title=Search]" - }, - { - "selector": "[title=Search]", - "timeout": 10000, - "elementText": "Search", - "moveTo": true, - "click": true, - "type": "shorthair cat" - }, - { - "selector": "[title=Search]", - "click": { - "button": "right" - } - }, - { - "selector": "[title=Search]", - "timeout": 10000, - "elementText": "Search", - "moveTo": true, - "click": true, - "type": { - "keys": [ - "shorthair cat" - ], - "inputDelay": 100 - } - }, - { - "elementId": "/^user-[0-9]+$/", - "elementClass": [ - "admin", - "/^level-[1-5]$/" - ], - "elementAttribute": { - "data-active": true, - "data-score": "/^[0-9]+$/" - }, - "timeout": 8000, - "moveTo": false - } - ] - } - }, - "title": "find" - } - ] - }, - { - "allOf": [ - { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { - "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - }, - "title": "Common" - }, - { - "type": "object", - "required": [ - "goTo" - ], - "properties": { - "goTo": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "goTo", - "anyOf": [ - { - "title": "Go to URL (simple)", - "description": "Navigate to an HTTP or HTTPS URL. Can be a full URL or a path. If a path is provided, navigates relative to the current URL, if any.", - "type": "string", - "pattern": "(^(http://|https://|/).*|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - { - "description": "Navigate to an HTTP or HTTPS URL.", - "type": "object", - "additionalProperties": false, - "required": [ - "url" - ], - "properties": { - "url": { - "type": "string", - "description": "URL to navigate to. Can be a full URL or a path. If a path is provided and `origin` is specified, prepends `origin` to `url`. If a path is provided but `origin` isn't specified, attempts to navigate relative to the current URL, if any.", - "pattern": "(^(http://|https://|/).*|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - "origin": { - "type": "string", - "description": "Protocol and domain to navigate to. Prepended to `url`.", - "transform": [ - "trim" - ] - }, - "timeout": { - "type": "integer", - "description": "Maximum time in milliseconds to wait for the page to be ready. If exceeded, the goTo action fails.", - "default": 30000, - "minimum": 0 - }, - "waitUntil": { - "type": "object", - "description": "Configuration for waiting conditions after navigation.", - "additionalProperties": false, - "properties": { - "networkIdleTime": { - "description": "Wait for network activity to be idle (no new requests) for this duration in milliseconds. Set to `null` to skip this check.", - "anyOf": [ - { - "type": "integer", - "minimum": 0 - }, - { - "type": "null" - } - ], - "default": 500 - }, - "domIdleTime": { - "description": "Wait for DOM mutations to stop for this duration in milliseconds. Set to `null` to skip this check.", - "anyOf": [ - { - "type": "integer", - "minimum": 0 - }, - { - "type": "null" - } - ], - "default": 1000 - }, - "find": { - "type": "object", - "description": "Wait for a specific element to be present in the DOM. At least one of selector or elementText must be specified.", - "additionalProperties": false, - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "properties": { - "selector": { - "type": "string", - "description": "CSS selector for the element to wait for." - }, - "elementText": { - "type": "string", - "description": "Text content the element must contain. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - } - } - } - } - } - }, - "title": "Go to URL (detailed)" - } - ], - "components": { - "schemas": { - "string": { - "title": "Go to URL (simple)", - "description": "Navigate to an HTTP or HTTPS URL. Can be a full URL or a path. If a path is provided, navigates relative to the current URL, if any.", - "type": "string", - "pattern": "(^(http://|https://|/).*|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - "object": { - "description": "Navigate to an HTTP or HTTPS URL.", - "type": "object", - "additionalProperties": false, - "required": [ - "url" - ], - "properties": { - "url": { - "type": "string", - "description": "URL to navigate to. Can be a full URL or a path. If a path is provided and `origin` is specified, prepends `origin` to `url`. If a path is provided but `origin` isn't specified, attempts to navigate relative to the current URL, if any.", - "pattern": "(^(http://|https://|/).*|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - "origin": { - "type": "string", - "description": "Protocol and domain to navigate to. Prepended to `url`.", - "transform": [ - "trim" - ] - }, - "timeout": { - "type": "integer", - "description": "Maximum time in milliseconds to wait for the page to be ready. If exceeded, the goTo action fails.", - "default": 30000, - "minimum": 0 - }, - "waitUntil": { - "type": "object", - "description": "Configuration for waiting conditions after navigation.", - "additionalProperties": false, - "properties": { - "networkIdleTime": { - "description": "Wait for network activity to be idle (no new requests) for this duration in milliseconds. Set to `null` to skip this check.", - "anyOf": [ - { - "type": "integer", - "minimum": 0 - }, - { - "type": "null" - } - ], - "default": 500 - }, - "domIdleTime": { - "description": "Wait for DOM mutations to stop for this duration in milliseconds. Set to `null` to skip this check.", - "anyOf": [ - { - "type": "integer", - "minimum": 0 - }, - { - "type": "null" - } - ], - "default": 1000 - }, - "find": { - "type": "object", - "description": "Wait for a specific element to be present in the DOM. At least one of selector or elementText must be specified.", - "additionalProperties": false, - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "properties": { - "selector": { - "type": "string", - "description": "CSS selector for the element to wait for." - }, - "elementText": { - "type": "string", - "description": "Text content the element must contain. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - } - } - } - } - } - }, - "title": "Go to URL (detailed)" - } - } - }, - "examples": [ - "https://www.google.com", - "/search", - { - "url": "https://www.google.com" - }, - { - "url": "/search", - "origin": "https://www.google.com" - }, - { - "url": "https://www.example.com", - "waitUntil": { - "networkIdleTime": 500 - } - }, - { - "url": "https://www.example.com/dashboard", - "waitUntil": { - "find": { - "selector": "[data-testid='dashboard-loaded']" - } - } - }, - { - "url": "https://www.example.com/app", - "timeout": 60000, - "waitUntil": { - "networkIdleTime": 500, - "domIdleTime": 1000, - "find": { - "selector": ".main-content", - "elementText": "Dashboard" - } - } - }, - { - "url": "https://www.example.com/app", - "timeout": 60000, - "waitUntil": { - "networkIdleTime": null - } - }, - { - "url": "https://www.example.com/status", - "waitUntil": { - "find": { - "elementText": "System operational" - } - } - }, - { - "url": "http://localhost:8092", - "waitUntil": { - "find": { - "selector": "button", - "elementText": "Standard Button", - "elementTestId": "standard-btn", - "elementAria": "Sample Standard Button", - "elementId": "standard-btn", - "elementClass": [ - "btn" - ], - "elementAttribute": { - "type": "button", - "value": "Standard Button" - } - } - } - } - ] - } - }, - "title": "goTo" - } - ] - }, - { - "allOf": [ - { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { - "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - }, - "title": "Common" - }, - { - "type": "object", - "required": [ - "httpRequest" - ], - "properties": { - "httpRequest": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "httpRequest", - "description": "Perform a generic HTTP request, for example to an API.", - "anyOf": [ - { - "title": "HTTP request (simple)", - "type": "string", - "description": "URL for the HTTP request.", - "pattern": "(^(http://|https://).*|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - { - "title": "HTTP request (detailed)", - "type": "object", - "anyOf": [ - { - "required": [ - "url" - ] - }, - { - "required": [ - "openApi" - ] - } - ], - "additionalProperties": false, - "properties": { - "url": { - "title": "HTTP request (simple)", - "type": "string", - "description": "URL for the HTTP request.", - "pattern": "(^(http://|https://).*|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - "openApi": { - "anyOf": [ - { - "allOf": [ - { - "type": "string", - "description": "ID of the operation to use for the request." - }, - { - "title": "Operation ID", - "description": "Operation ID from the OpenAPI schema. Only valid if the OpenAPI description path is specified elsewhere and the operation ID is unique among all specified OpenAPI descriptions." - } - ] - }, - { - "allOf": [ - { - "version": "1.0.0", - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "openApi", - "type": "object", - "description": "OpenAPI description and configuration.", - "additionalProperties": false, - "anyOf": [ - { - "required": [ - "descriptionPath" - ] - }, - { - "required": [ - "operationId" - ] - } - ], - "properties": { - "name": { - "type": "string", - "description": "Name of the OpenAPI description, as defined in your configuration." - }, - "descriptionPath": { - "type": "string", - "description": "URL or local path to the OpenAPI description." - }, - "definition": { - "type": "object", - "readOnly": true, - "description": "OpenAPI definition object loaded from the `descriptionPath`. This is a resolved version of the OpenAPI description and should not be user-defined.", - "additionalProperties": true, - "title": "OpenAPI definition" - }, - "operationId": { - "type": "string", - "description": "ID of the operation to use for the request." - }, - "server": { - "type": "string", - "description": "Server to use for example requests. Only valid if `useExample` is `request` or `both`. If not specified but an example is used for the request, uses the first server defined in the OpenAPI description." - }, - "validateAgainstSchema": { - "type": "string", - "description": "Validates the request and/or response against the schema in the OpenAPI description. If the request or response doesn't match the schema, the step fails.", - "enum": [ - "request", - "response", - "both", - "none" - ], - "default": "both" - }, - "mockResponse": { - "type": "boolean", - "description": "If `true`, doesn't make the HTTP request, but instead uses the response example or schema from the OpenAPI description as the response data. Useful for creating tests when an API isn't fully implemented yet. If `statusCode` isn't specified, uses the first defined response code." - }, - "statusCode": { - "type": "integer", - "description": "Response code to use for validation, examples, and status code checking. If the response code doesn't match, the step fails. `statusCodes` overrides this value when specified." - }, - "useExample": { - "type": [ - "string" - ], - "description": "Uses the example from the OpenAPI description as the request and response data. If the request or response has multiple examples, specify `exampleKey`. If `statusCode` isn't specified, uses the first defined response code. `requestData`, `requestParams`, and `requestHeaders` override portions of request examples when specified. `responseData` overrides portions of response examples when specified.", - "enum": [ - "request", - "response", - "both", - "none" - ], - "default": "none" - }, - "exampleKey": { - "type": "string", - "description": "Key of the example to use from the `examples` property in the OpenAPI description. If an `examples` key isn't specified or isn't available for a given parameter or object, the `example` property value is used.", - "default": "" - }, - "headers": { - "type": "object", - "description": "Request headers to add to requests. For example, to set `Authorization` headers for all requests from the specified OpenAPI document. If specified in both a config and a step, the step value overrides the config value.", - "additionalProperties": { - "type": "string" - }, - "title": "OpenAPI request headers" - } - }, - "components": { - "schemas": { - "operationId": { - "type": "string", - "description": "ID of the operation to use for the request." - }, - "descriptionPath": { - "type": "string", - "description": "URL or local path to the OpenAPI description." - } - } - }, - "examples": [ - { - "descriptionPath": "https://petstore.swagger.io/v2/swagger.json" - }, - { - "name": "Reqres", - "operationId": "getUserById" - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "getUserById" - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both" - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both", - "exampleKey": "example1" - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both", - "exampleKey": "example1", - "statusCode": 201 - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both", - "exampleKey": "example1", - "statusCode": 201, - "validateAgainstSchema": "none" - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both", - "exampleKey": "example1", - "statusCode": 201, - "validateAgainstSchema": "none", - "mockResponse": true - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both", - "exampleKey": "example1", - "statusCode": 201, - "validateAgainstSchema": "none", - "mockResponse": true, - "headers": { - "Authorization": "Bearer 12345" - } - } - ] - }, - { - "type": "object", - "required": [ - "operationId" - ], - "title": "OpenAPI definition (httpRequest)" - } - ] - } - ] - }, - "statusCodes": { - "description": "Accepted status codes. If the specified URL returns a code other than what is specified here, the action fails.", - "type": "array", - "items": { - "anyOf": [ - { - "type": "integer" - } - ] - }, - "default": [ - 200, - 201 - ] - }, - "method": { - "type": "string", - "description": "Method of the HTTP request", - "enum": [ - "get", - "put", - "post", - "patch", - "delete" - ], - "transform": [ - "trim", - "toEnumCase" - ], - "default": "get" - }, - "timeout": { - "type": "integer", - "description": "Timeout for the HTTP request, in milliseconds.", - "default": 60000 - }, - "request": { - "type": "object", - "additionalProperties": false, - "properties": { - "headers": { - "description": "Headers to include in the HTTP request.", - "default": {}, - "anyOf": [ - { - "title": "Request headers (object)", - "description": "Headers to include in the HTTP request, in key/value format.", - "type": "object", - "additionalProperties": true, - "properties": {} - }, - { - "title": "Request headers (string)", - "description": "Headers to include in the HTTP request, as return-separated values. For example, `Content-Type: application/json\nAuthorization: Bearer token`.", - "type": "string" - } - ] - }, - "parameters": { - "description": "URL parameters to include in the HTTP request, in key/value format.", - "type": "object", - "additionalProperties": true, - "default": {}, - "properties": {}, - "title": "Request parameters" - }, - "body": { - "description": "The body of the HTTP request.", - "anyOf": [ - { - "title": "Request body (object)", - "description": "JSON object to include as the body of the HTTP request.", - "type": "object", - "additionalProperties": true, - "properties": {} - }, - { - "title": "Request body (array)", - "description": "JSON array to include as the body of the HTTP request.", - "type": "array", - "items": {} - }, - { - "title": "Request body (string)", - "description": "String to include as the body of the HTTP request.", - "type": "string" - } - ], - "default": {} - } - }, - "title": "Request" - }, - "response": { - "type": "object", - "additionalProperties": false, - "properties": { - "headers": { - "description": "Headers expected in the response, in key/value format. If one or more `responseHeaders` entries aren't present in the response, the step fails.", - "type": "object", - "additionalProperties": true, - "properties": {}, - "default": {}, - "title": "Response headers" - }, - "body": { - "description": "JSON object expected in the response. If one or more key/value pairs aren't present in the response, the step fails.", - "anyOf": [ - { - "type": "object", - "additionalProperties": true, - "properties": {}, - "title": "Response body object", - "description": "JSON key/value pairs expected in the response." - }, - { - "title": "Response body array", - "description": "JSON array expected in the response.", - "type": "array", - "items": {} - }, - { - "title": "Response body string", - "description": "String expected in the response.", - "type": "string" - } - ], - "default": {} - }, - "required": { - "type": "array", - "description": "Array of field paths that must exist in the response body. Uses dot notation for nested fields (e.g., 'user.name') and bracket notation for array indices (e.g., 'items[0].id'). Fields must be present but may have any value including null.", - "items": { - "type": "string" - }, - "default": [] - } - }, - "title": "Response" - }, - "allowAdditionalFields": { - "type": "boolean", - "description": "If `false`, the step fails when the response data contains fields not specified in the response body.", - "default": true - }, - "path": { - "type": "string", - "description": "File path to save the command's output, relative to `directory`. Specify a file extension that matches the expected response type, such as `.json` for JSON content or `.txt` for strings." - }, - "directory": { - "type": "string", - "description": "Directory to save the command's output. If the directory doesn't exist, creates the directory. If not specified, the directory is your media directory." - }, - "maxVariation": { - "type": "number", - "description": "Allowed variation in percentage of text different between the current output and previously saved output. If the difference between the current output and the previous output is greater than `maxVariation`, the step fails. If output doesn't exist at `path`, this value is ignored.", - "default": 0, - "minimum": 0, - "maximum": 1 - }, - "overwrite": { - "type": "string", - "description": "If `true`, overwrites the existing output at `path` if it exists.\nIf `aboveVariation`, overwrites the existing output at `path` if the difference between the new output and the existing output is greater than `maxVariation`.", - "enum": [ - "true", - "false", - "aboveVariation" - ], - "default": "aboveVariation" - } - } - } - ], - "components": { - "schemas": { - "url": { - "title": "HTTP request (simple)", - "type": "string", - "description": "URL for the HTTP request.", - "pattern": "(^(http://|https://).*|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - "object": { - "title": "HTTP request (detailed)", - "type": "object", - "anyOf": [ - { - "required": [ - "url" - ] - }, - { - "required": [ - "openApi" - ] - } - ], - "additionalProperties": false, - "properties": { - "url": { - "title": "HTTP request (simple)", - "type": "string", - "description": "URL for the HTTP request.", - "pattern": "(^(http://|https://).*|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - "openApi": { - "anyOf": [ - { - "allOf": [ - { - "type": "string", - "description": "ID of the operation to use for the request." - }, - { - "title": "Operation ID", - "description": "Operation ID from the OpenAPI schema. Only valid if the OpenAPI description path is specified elsewhere and the operation ID is unique among all specified OpenAPI descriptions." - } - ] - }, - { - "allOf": [ - { - "version": "1.0.0", - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "openApi", - "type": "object", - "description": "OpenAPI description and configuration.", - "additionalProperties": false, - "anyOf": [ - { - "required": [ - "descriptionPath" - ] - }, - { - "required": [ - "operationId" - ] - } - ], - "properties": { - "name": { - "type": "string", - "description": "Name of the OpenAPI description, as defined in your configuration." - }, - "descriptionPath": { - "type": "string", - "description": "URL or local path to the OpenAPI description." - }, - "definition": { - "type": "object", - "readOnly": true, - "description": "OpenAPI definition object loaded from the `descriptionPath`. This is a resolved version of the OpenAPI description and should not be user-defined.", - "additionalProperties": true, - "title": "OpenAPI definition" - }, - "operationId": { - "type": "string", - "description": "ID of the operation to use for the request." - }, - "server": { - "type": "string", - "description": "Server to use for example requests. Only valid if `useExample` is `request` or `both`. If not specified but an example is used for the request, uses the first server defined in the OpenAPI description." - }, - "validateAgainstSchema": { - "type": "string", - "description": "Validates the request and/or response against the schema in the OpenAPI description. If the request or response doesn't match the schema, the step fails.", - "enum": [ - "request", - "response", - "both", - "none" - ], - "default": "both" - }, - "mockResponse": { - "type": "boolean", - "description": "If `true`, doesn't make the HTTP request, but instead uses the response example or schema from the OpenAPI description as the response data. Useful for creating tests when an API isn't fully implemented yet. If `statusCode` isn't specified, uses the first defined response code." - }, - "statusCode": { - "type": "integer", - "description": "Response code to use for validation, examples, and status code checking. If the response code doesn't match, the step fails. `statusCodes` overrides this value when specified." - }, - "useExample": { - "type": [ - "string" - ], - "description": "Uses the example from the OpenAPI description as the request and response data. If the request or response has multiple examples, specify `exampleKey`. If `statusCode` isn't specified, uses the first defined response code. `requestData`, `requestParams`, and `requestHeaders` override portions of request examples when specified. `responseData` overrides portions of response examples when specified.", - "enum": [ - "request", - "response", - "both", - "none" - ], - "default": "none" - }, - "exampleKey": { - "type": "string", - "description": "Key of the example to use from the `examples` property in the OpenAPI description. If an `examples` key isn't specified or isn't available for a given parameter or object, the `example` property value is used.", - "default": "" - }, - "headers": { - "type": "object", - "description": "Request headers to add to requests. For example, to set `Authorization` headers for all requests from the specified OpenAPI document. If specified in both a config and a step, the step value overrides the config value.", - "additionalProperties": { - "type": "string" - }, - "title": "OpenAPI request headers" - } - }, - "components": { - "schemas": { - "operationId": { - "type": "string", - "description": "ID of the operation to use for the request." - }, - "descriptionPath": { - "type": "string", - "description": "URL or local path to the OpenAPI description." - } - } - }, - "examples": [ - { - "descriptionPath": "https://petstore.swagger.io/v2/swagger.json" - }, - { - "name": "Reqres", - "operationId": "getUserById" - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "getUserById" - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both" - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both", - "exampleKey": "example1" - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both", - "exampleKey": "example1", - "statusCode": 201 - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both", - "exampleKey": "example1", - "statusCode": 201, - "validateAgainstSchema": "none" - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both", - "exampleKey": "example1", - "statusCode": 201, - "validateAgainstSchema": "none", - "mockResponse": true - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both", - "exampleKey": "example1", - "statusCode": 201, - "validateAgainstSchema": "none", - "mockResponse": true, - "headers": { - "Authorization": "Bearer 12345" - } - } - ] - }, - { - "type": "object", - "required": [ - "operationId" - ], - "title": "OpenAPI definition (httpRequest)" - } - ] - } - ] - }, - "statusCodes": { - "description": "Accepted status codes. If the specified URL returns a code other than what is specified here, the action fails.", - "type": "array", - "items": { - "anyOf": [ - { - "type": "integer" - } - ] - }, - "default": [ - 200, - 201 - ] - }, - "method": { - "type": "string", - "description": "Method of the HTTP request", - "enum": [ - "get", - "put", - "post", - "patch", - "delete" - ], - "transform": [ - "trim", - "toEnumCase" - ], - "default": "get" - }, - "timeout": { - "type": "integer", - "description": "Timeout for the HTTP request, in milliseconds.", - "default": 60000 - }, - "request": { - "type": "object", - "additionalProperties": false, - "properties": { - "headers": { - "description": "Headers to include in the HTTP request.", - "default": {}, - "anyOf": [ - { - "title": "Request headers (object)", - "description": "Headers to include in the HTTP request, in key/value format.", - "type": "object", - "additionalProperties": true, - "properties": {} - }, - { - "title": "Request headers (string)", - "description": "Headers to include in the HTTP request, as return-separated values. For example, `Content-Type: application/json\nAuthorization: Bearer token`.", - "type": "string" - } - ] - }, - "parameters": { - "description": "URL parameters to include in the HTTP request, in key/value format.", - "type": "object", - "additionalProperties": true, - "default": {}, - "properties": {}, - "title": "Request parameters" - }, - "body": { - "description": "The body of the HTTP request.", - "anyOf": [ - { - "title": "Request body (object)", - "description": "JSON object to include as the body of the HTTP request.", - "type": "object", - "additionalProperties": true, - "properties": {} - }, - { - "title": "Request body (array)", - "description": "JSON array to include as the body of the HTTP request.", - "type": "array", - "items": {} - }, - { - "title": "Request body (string)", - "description": "String to include as the body of the HTTP request.", - "type": "string" - } - ], - "default": {} - } - }, - "title": "Request" - }, - "response": { - "type": "object", - "additionalProperties": false, - "properties": { - "headers": { - "description": "Headers expected in the response, in key/value format. If one or more `responseHeaders` entries aren't present in the response, the step fails.", - "type": "object", - "additionalProperties": true, - "properties": {}, - "default": {}, - "title": "Response headers" - }, - "body": { - "description": "JSON object expected in the response. If one or more key/value pairs aren't present in the response, the step fails.", - "anyOf": [ - { - "type": "object", - "additionalProperties": true, - "properties": {}, - "title": "Response body object", - "description": "JSON key/value pairs expected in the response." - }, - { - "title": "Response body array", - "description": "JSON array expected in the response.", - "type": "array", - "items": {} - }, - { - "title": "Response body string", - "description": "String expected in the response.", - "type": "string" - } - ], - "default": {} - }, - "required": { - "type": "array", - "description": "Array of field paths that must exist in the response body. Uses dot notation for nested fields (e.g., 'user.name') and bracket notation for array indices (e.g., 'items[0].id'). Fields must be present but may have any value including null.", - "items": { - "type": "string" - }, - "default": [] - } - }, - "title": "Response" - }, - "allowAdditionalFields": { - "type": "boolean", - "description": "If `false`, the step fails when the response data contains fields not specified in the response body.", - "default": true - }, - "path": { - "type": "string", - "description": "File path to save the command's output, relative to `directory`. Specify a file extension that matches the expected response type, such as `.json` for JSON content or `.txt` for strings." - }, - "directory": { - "type": "string", - "description": "Directory to save the command's output. If the directory doesn't exist, creates the directory. If not specified, the directory is your media directory." - }, - "maxVariation": { - "type": "number", - "description": "Allowed variation in percentage of text different between the current output and previously saved output. If the difference between the current output and the previous output is greater than `maxVariation`, the step fails. If output doesn't exist at `path`, this value is ignored.", - "default": 0, - "minimum": 0, - "maximum": 1 - }, - "overwrite": { - "type": "string", - "description": "If `true`, overwrites the existing output at `path` if it exists.\nIf `aboveVariation`, overwrites the existing output at `path` if the difference between the new output and the existing output is greater than `maxVariation`.", - "enum": [ - "true", - "false", - "aboveVariation" - ], - "default": "aboveVariation" - } - } - } - } - }, - "examples": [ - "https://reqres.in/api/users", - { - "url": "https://reqres.in/api/users" - }, - { - "url": "https://reqres.in/api/users/2", - "method": "put", - "request": { - "body": { - "name": "morpheus", - "job": "zion resident" - } - } - }, - { - "url": "https://reqres.in/api/users", - "method": "post", - "request": { - "body": { - "name": "morpheus", - "job": "leader" - } - }, - "response": { - "body": { - "name": "morpheus", - "job": "leader" - } - }, - "statusCodes": [ - 200, - 201 - ] - }, - { - "url": "https://www.api-server.com", - "method": "post", - "timeout": 30000, - "request": { - "body": { - "field": "value" - }, - "headers": { - "header": "value" - }, - "parameters": { - "param": "value" - } - }, - "response": { - "body": { - "field": "value" - }, - "headers": { - "header": "value" - } - }, - "statusCodes": [ - 200 - ] - }, - { - "url": "https://reqres.in/api/users", - "method": "post", - "request": { - "body": { - "name": "morpheus", - "job": "leader" - } - }, - "response": { - "body": { - "name": "morpheus", - "job": "leader" - } - }, - "statusCodes": [ - 200, - 201 - ], - "path": "response.json", - "directory": "media", - "maxVariation": 0.05, - "overwrite": "aboveVariation" - }, - { - "openApi": "getUserById" - }, - { - "openApi": { - "name": "Reqres", - "operationId": "getUserById" - }, - "request": { - "parameters": { - "id": 123 - } - } - }, - { - "openApi": { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "getUserById" - }, - "request": { - "parameters": { - "id": 123 - } - } - }, - { - "openApi": { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both" - } - }, - { - "openApi": { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "updateUser", - "useExample": "request", - "exampleKey": "acme" - } - }, - { - "openApi": { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "updateUser", - "useExample": "request", - "exampleKey": "acme", - "headers": { - "Authorization": "Bearer $TOKEN" - } - } - }, - { - "url": "https://www.api-server.com", - "method": "post", - "request": { - "headers": "Content-Type: application/json\\nAuthorization: Bearer token" - } - }, - { - "url": "https://api.example.com/users/123", - "response": { - "required": [ - "id", - "email", - "createdAt" - ] - } - }, - { - "url": "https://api.example.com/users/123", - "response": { - "required": [ - "user.profile.name", - "user.profile.avatar", - "user.settings.notifications" - ] - } - }, - { - "url": "https://api.example.com/orders", - "response": { - "required": [ - "orders[0].id", - "orders[0].total", - "orders[0].items[0].productId" - ] - } - }, - { - "url": "https://api.example.com/users", - "response": { - "required": [ - "sessionToken", - "expiresAt", - "user.id" - ], - "body": { - "status": "success", - "user": { - "role": "admin" - } - } - } - } - ] - } - }, - "title": "httpRequest" - } - ] - }, - { - "allOf": [ - { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { - "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - }, - "title": "Common" - }, - { - "type": "object", - "required": [ - "runShell" - ], - "properties": { - "runShell": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "runShell", - "description": "Perform a native shell command.", - "anyOf": [ - { - "title": "Run shell command (simple)", - "description": "Command to perform in the machine's default shell.", - "type": "string", - "transform": [ - "trim" - ] - }, - { - "type": "object", - "required": [ - "command" - ], - "additionalProperties": false, - "properties": { - "command": { - "type": "string", - "description": "Command to perform in the machine's default shell." - }, - "args": { - "type": "array", - "description": "Arguments for the command.", - "items": { - "anyOf": [ - { - "type": "string" - } - ] - }, - "default": [] - }, - "workingDirectory": { - "type": "string", - "description": "Working directory for the command.", - "default": "." - }, - "exitCodes": { - "type": "array", - "description": "Expected exit codes of the command. If the command's actual exit code isn't in this list, the step fails.", - "items": { - "anyOf": [ - { - "type": "integer" - } - ] - }, - "default": [ - 0 - ] - }, - "stdio": { - "type": "string", - "description": "Content expected in the command's stdout or stderr. If the expected content can't be found in the command's stdout or stderr, the step fails. Supports strings and regular expressions. To use a regular expression, the string must start and end with a forward slash, like in `/^hello-world.*/`." - }, - "path": { - "type": "string", - "description": "File path to save the command's output, relative to `directory`." - }, - "directory": { - "type": "string", - "description": "Directory to save the command's output. If the directory doesn't exist, creates the directory. If not specified, the directory is your media directory." - }, - "maxVariation": { - "type": "number", - "description": "Allowed variation in percentage of text different between the current output and previously saved output. If the difference between the current output and the previous output is greater than `maxVariation`, the step fails. If output doesn't exist at `path`, this value is ignored.", - "default": 0, - "minimum": 0, - "maximum": 1 - }, - "overwrite": { - "type": "string", - "description": "If `true`, overwrites the existing output at `path` if it exists.\nIf `aboveVariation`, overwrites the existing output at `path` if the difference between the new output and the existing output is greater than `maxVariation`.", - "enum": [ - "true", - "false", - "aboveVariation" - ], - "default": "aboveVariation" - }, - "timeout": { - "type": "integer", - "description": "Max time in milliseconds the command is allowed to run. If the command runs longer than this, the step fails.", - "default": 60000 - } - }, - "title": "Run shell command (detailed)" - } - ], - "components": { - "schemas": { - "string": { - "title": "Run shell command (simple)", - "description": "Command to perform in the machine's default shell.", - "type": "string", - "transform": [ - "trim" - ] - }, - "object": { - "type": "object", - "required": [ - "command" - ], - "additionalProperties": false, - "properties": { - "command": { - "type": "string", - "description": "Command to perform in the machine's default shell." - }, - "args": { - "type": "array", - "description": "Arguments for the command.", - "items": { - "anyOf": [ - { - "type": "string" - } - ] - }, - "default": [] - }, - "workingDirectory": { - "type": "string", - "description": "Working directory for the command.", - "default": "." - }, - "exitCodes": { - "type": "array", - "description": "Expected exit codes of the command. If the command's actual exit code isn't in this list, the step fails.", - "items": { - "anyOf": [ - { - "type": "integer" - } - ] - }, - "default": [ - 0 - ] - }, - "stdio": { - "type": "string", - "description": "Content expected in the command's stdout or stderr. If the expected content can't be found in the command's stdout or stderr, the step fails. Supports strings and regular expressions. To use a regular expression, the string must start and end with a forward slash, like in `/^hello-world.*/`." - }, - "path": { - "type": "string", - "description": "File path to save the command's output, relative to `directory`." - }, - "directory": { - "type": "string", - "description": "Directory to save the command's output. If the directory doesn't exist, creates the directory. If not specified, the directory is your media directory." - }, - "maxVariation": { - "type": "number", - "description": "Allowed variation in percentage of text different between the current output and previously saved output. If the difference between the current output and the previous output is greater than `maxVariation`, the step fails. If output doesn't exist at `path`, this value is ignored.", - "default": 0, - "minimum": 0, - "maximum": 1 - }, - "overwrite": { - "type": "string", - "description": "If `true`, overwrites the existing output at `path` if it exists.\nIf `aboveVariation`, overwrites the existing output at `path` if the difference between the new output and the existing output is greater than `maxVariation`.", - "enum": [ - "true", - "false", - "aboveVariation" - ], - "default": "aboveVariation" - }, - "timeout": { - "type": "integer", - "description": "Max time in milliseconds the command is allowed to run. If the command runs longer than this, the step fails.", - "default": 60000 - } - }, - "title": "Run shell command (detailed)" - } - } - }, - "examples": [ - "docker run hello-world", - { - "command": "echo", - "args": [ - "$USER" - ] - }, - { - "command": "echo", - "args": [ - "hello-world" - ] - }, - { - "command": "docker run hello-world", - "timeout": 20000, - "exitCodes": [ - 0 - ], - "stdio": "Hello from Docker!" - }, - { - "command": "false", - "exitCodes": [ - 1 - ] - }, - { - "command": "echo", - "args": [ - "setup" - ], - "exitCodes": [ - 0 - ], - "stdio": "/.*?/" - }, - { - "command": "docker run hello-world", - "workingDirectory": ".", - "exitCodes": [ - 0 - ], - "stdio": "Hello from Docker!", - "path": "docker-output.txt", - "directory": "output", - "maxVariation": 0.1, - "overwrite": "aboveVariation" - } - ] - } - }, - "title": "runShell" - } - ] - }, - { - "allOf": [ - { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { - "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - }, - "title": "Common" - }, - { - "type": "object", - "required": [ - "runCode" - ], - "properties": { - "runCode": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "runCode", - "description": "Assemble and run code.", - "anyOf": [ - { - "type": "object", - "required": [ - "code", - "language" - ], - "properties": { - "language": { - "type": "string", - "description": "Language of the code to run.", - "enum": [ - "python", - "bash", - "javascript" - ] - }, - "code": { - "description": "Code to run.", - "type": "string" - }, - "args": { - "type": "array", - "description": "Arguments for the command.", - "items": { - "anyOf": [ - { - "type": "string" - } - ] - }, - "default": [] - }, - "workingDirectory": { - "type": "string", - "description": "Working directory for the command.", - "default": "." - }, - "exitCodes": { - "type": "array", - "description": "Expected exit codes of the command. If the command's actual exit code isn't in this list, the step fails.", - "items": { - "anyOf": [ - { - "type": "integer" - } - ] - }, - "default": [ - 0 - ] - }, - "stdio": { - "type": "string", - "description": "Content expected in the command's output. If the expected content can't be found in the command's output (either stdout or stderr), the step fails. Supports strings and regular expressions. To use a regular expression, the string must start and end with a forward slash, like in `/^hello-world.*/`." - }, - "path": { - "type": "string", - "description": "File path to save the command's output, relative to `directory`." - }, - "directory": { - "type": "string", - "description": "Directory to save the command's output. If the directory doesn't exist, creates the directory. If not specified, the directory is your media directory." - }, - "maxVariation": { - "type": "number", - "description": "Allowed variation in percentage of text different between the current output and previously saved output. If the difference between the current output and the previous output is greater than `maxVariation`, the step fails. If output doesn't exist at `path`, this value is ignored.", - "default": 0, - "minimum": 0, - "maximum": 1 - }, - "overwrite": { - "type": "string", - "description": "If `true`, overwrites the existing output at `path` if it exists.\nIf `aboveVariation`, overwrites the existing output at `path` if the difference between the new output and the existing output is greater than `maxVariation`.", - "enum": [ - "true", - "false", - "aboveVariation" - ], - "default": "aboveVariation" - }, - "timeout": { - "type": "integer", - "description": "Max time in milliseconds the command is allowed to run. If the command runs longer than this, the step fails.", - "default": 60000 - } - }, - "title": "Run code (detailed)" - } - ], - "components": { - "schemas": { - "object": { - "type": "object", - "required": [ - "code", - "language" - ], - "properties": { - "language": { - "type": "string", - "description": "Language of the code to run.", - "enum": [ - "python", - "bash", - "javascript" - ] - }, - "code": { - "description": "Code to run.", - "type": "string" - }, - "args": { - "type": "array", - "description": "Arguments for the command.", - "items": { - "anyOf": [ - { - "type": "string" - } - ] - }, - "default": [] - }, - "workingDirectory": { - "type": "string", - "description": "Working directory for the command.", - "default": "." - }, - "exitCodes": { - "type": "array", - "description": "Expected exit codes of the command. If the command's actual exit code isn't in this list, the step fails.", - "items": { - "anyOf": [ - { - "type": "integer" - } - ] - }, - "default": [ - 0 - ] - }, - "stdio": { - "type": "string", - "description": "Content expected in the command's output. If the expected content can't be found in the command's output (either stdout or stderr), the step fails. Supports strings and regular expressions. To use a regular expression, the string must start and end with a forward slash, like in `/^hello-world.*/`." - }, - "path": { - "type": "string", - "description": "File path to save the command's output, relative to `directory`." - }, - "directory": { - "type": "string", - "description": "Directory to save the command's output. If the directory doesn't exist, creates the directory. If not specified, the directory is your media directory." - }, - "maxVariation": { - "type": "number", - "description": "Allowed variation in percentage of text different between the current output and previously saved output. If the difference between the current output and the previous output is greater than `maxVariation`, the step fails. If output doesn't exist at `path`, this value is ignored.", - "default": 0, - "minimum": 0, - "maximum": 1 - }, - "overwrite": { - "type": "string", - "description": "If `true`, overwrites the existing output at `path` if it exists.\nIf `aboveVariation`, overwrites the existing output at `path` if the difference between the new output and the existing output is greater than `maxVariation`.", - "enum": [ - "true", - "false", - "aboveVariation" - ], - "default": "aboveVariation" - }, - "timeout": { - "type": "integer", - "description": "Max time in milliseconds the command is allowed to run. If the command runs longer than this, the step fails.", - "default": 60000 - } - }, - "title": "Run code (detailed)" - } - } - }, - "examples": [ - { - "language": "javascript", - "code": "console.log('Hello, ${process.env.USER}!');" - }, - { - "language": "bash", - "code": "docker run hello-world", - "timeout": 20000, - "exitCodes": [ - 0 - ], - "stdio": "Hello from Docker!" - }, - { - "language": "javascript", - "code": "return false", - "exitCodes": [ - 1 - ] - }, - { - "language": "python", - "code": "print('Hello from Python')", - "workingDirectory": ".", - "exitCodes": [ - 0 - ], - "stdio": "Hello from Python!", - "path": "python-output.txt", - "directory": "output", - "maxVariation": 0.1, - "overwrite": "aboveVariation" - } - ] - } - }, - "title": "runCode" - } - ] - }, - { - "allOf": [ - { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { - "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - }, - "title": "Common" - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "typeKeys", - "description": "Type keys. To type special keys, begin and end the string with `$` and use the special key's keyword. For example, to type the Escape key, enter `$ESCAPE$`.", - "anyOf": [ - { - "title": "Type keys (simple)", - "description": "Sequence of keys to enter.", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - } - ] - } - } - ] - }, - { - "title": "Type keys (detailed)", - "type": "object", - "properties": { - "keys": { - "title": "Type keys (simple)", - "description": "Sequence of keys to enter.", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - } - ] - } - } - ] - }, - "inputDelay": { - "type": "number", - "description": "Delay in milliseconds between each key press during a recording", - "default": 100 - }, - "selector": { - "type": "string", - "description": "Selector for the element to type into. If not specified, the typing occurs in the active element." - }, - "elementText": { - "type": "string", - "description": "Display text of the element to type into. If combined with other element finding fields, the element must match all specified criteria." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - } - }, - "required": [ - "keys" - ], - "additionalProperties": false - } - ], - "components": { - "schemas": { - "keys": { - "title": "Type keys (simple)", - "description": "Sequence of keys to enter.", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - } - ] - } - } - ] - }, - "object": { - "title": "Type keys (detailed)", - "type": "object", - "properties": { - "keys": { - "title": "Type keys (simple)", - "description": "Sequence of keys to enter.", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - } - ] - } - } - ] - }, - "inputDelay": { - "type": "number", - "description": "Delay in milliseconds between each key press during a recording", - "default": 100 - }, - "selector": { - "type": "string", - "description": "Selector for the element to type into. If not specified, the typing occurs in the active element." - }, - "elementText": { - "type": "string", - "description": "Display text of the element to type into. If combined with other element finding fields, the element must match all specified criteria." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - } - }, - "required": [ - "keys" - ], - "additionalProperties": false - } - } - }, - "examples": [ - "kittens", - [ - "$ENTER$" - ], - [ - "kittens", - "$ENTER$" - ], - { - "keys": "kittens" - }, - { - "keys": [ - "$ENTER$" - ] - }, - { - "keys": [ - "kittens", - "$ENTER$" - ], - "inputDelay": 500 - } - ] - } - }, - "title": "type" - } - ] - }, - { - "allOf": [ - { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { - "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - }, - "title": "Common" - }, - { - "type": "object", - "required": [ - "screenshot" - ], - "properties": { - "screenshot": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "screenshot", - "description": "Takes a screenshot in PNG format.", - "anyOf": [ - { - "title": "Screenshot (simple)", - "description": "File path of the PNG file. Accepts absolute paths. If not specified, the file name is the ID of the step.", - "type": "string", - "pattern": "([A-Za-z0-9_-]*\\.(png|PNG)$|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - { - "type": "object", - "additionalProperties": false, - "properties": { - "path": { - "title": "Screenshot (simple)", - "description": "File path of the PNG file. Accepts absolute paths. If not specified, the file name is the ID of the step.", - "type": "string", - "pattern": "([A-Za-z0-9_-]*\\.(png|PNG)$|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - "directory": { - "type": "string", - "description": "Directory of the PNG file. If the directory doesn't exist, creates the directory.", - "transform": [ - "trim" - ] - }, - "maxVariation": { - "type": "number", - "description": "Allowed variation in percentage of pixels between the new screenshot and the existing screenshot at `path`. If the difference between the new screenshot and the existing screenshot is greater than `maxVariation`, the step fails. If a screenshot doesn't exist at `path`, this value is ignored.", - "default": 0.05, - "minimum": 0, - "maximum": 1 - }, - "overwrite": { - "type": "string", - "description": "If `true`, overwrites the existing screenshot at `path` if it exists.\nIf `aboveVariation`, overwrites the existing screenshot at `path` if the difference between the new screenshot and the existing screenshot is greater than `maxVariation`.", - "enum": [ - "true", - "false", - "aboveVariation" - ], - "default": "aboveVariation" - }, - "crop": { - "anyOf": [ - { - "title": "Crop by element (simple)", - "type": "string", - "description": "Display text or selector of the element to screenshot." - }, - { - "title": "Crop by element (detailed)", - "type": "object", - "description": "Crop the screenshot to a specific element.", - "additionalProperties": false, - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "properties": { - "elementText": { - "type": "string", - "description": "Display text of the element to screenshot." - }, - "selector": { - "type": "string", - "description": "Selector of the element to screenshot." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - }, - "padding": { - "anyOf": [ - { - "title": "Padding (simple)", - "type": "number", - "description": "Padding in pixels to add to the bounds of the element.", - "minimum": 0 - }, - { - "type": "object", - "additionalProperties": false, - "properties": { - "top": { - "type": "number", - "minimum": 0 - }, - "right": { - "type": "number", - "minimum": 0 - }, - "bottom": { - "type": "number", - "minimum": 0 - }, - "left": { - "type": "number", - "minimum": 0 - } - }, - "title": "Padding (detailed)", - "description": "Padding in pixels to add to the bounds of the element." - } - ] - } - } - } - ] - }, - "annotations": { - "type": "array", - "description": "Array of annotations to add to the screenshot.", - "items": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "annotation", - "type": "object", - "description": "A visual annotation to add to the screenshot. Annotations can point to elements on the page (via `find`) or be positioned freely within the viewport.", - "anyOf": [ - { - "required": [ - "arrow" - ], - "not": { - "required": [ - "text", - "rectangle", - "circle", - "line", - "callout", - "highlight", - "blur" - ] - } - }, - { - "required": [ - "text" - ], - "not": { - "required": [ - "arrow", - "rectangle", - "circle", - "line", - "callout", - "highlight", - "blur" - ] - } - }, - { - "required": [ - "rectangle" - ], - "not": { - "required": [ - "arrow", - "text", - "circle", - "line", - "callout", - "highlight", - "blur" - ] - } - }, - { - "required": [ - "circle" - ], - "not": { - "required": [ - "arrow", - "text", - "rectangle", - "line", - "callout", - "highlight", - "blur" - ] - } - }, - { - "required": [ - "line" - ], - "not": { - "required": [ - "arrow", - "text", - "rectangle", - "circle", - "callout", - "highlight", - "blur" - ] - } - }, - { - "required": [ - "callout" - ], - "not": { - "required": [ - "arrow", - "text", - "rectangle", - "circle", - "line", - "highlight", - "blur" - ] - } - }, - { - "required": [ - "highlight" - ], - "not": { - "required": [ - "arrow", - "text", - "rectangle", - "circle", - "line", - "callout", - "blur" - ] - } - }, - { - "required": [ - "blur" - ], - "not": { - "required": [ - "arrow", - "text", - "rectangle", - "circle", - "line", - "callout", - "highlight" - ] - } - } - ], - "properties": { - "find": { - "type": "object", - "description": "Element on the page to annotate.", - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "additionalProperties": false, - "properties": { - "selector": { - "type": "string", - "description": "Selector of the element to annotate." - }, - "elementText": { - "type": "string", - "description": "Display text of the element to annotate." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - } - } - }, - "position": { - "anyOf": [ - { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - { - "type": "string", - "enum": [ - "top", - "bottom", - "left", - "right", - "center", - "top-left", - "top-right", - "bottom-left", - "bottom-right" - ], - "description": "Position relative to the element (if `find` is provided) or to the viewport." - } - ] - }, - "arrow": { - "type": "object", - "description": "Configuration for arrow annotations.", - "properties": { - "from": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "to": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "color": { - "type": "string", - "description": "Color of the arrow (hex, rgb, or named color).", - "default": "#FF0000" - }, - "strokeWidth": { - "type": "number", - "description": "Width of the arrow line in pixels.", - "minimum": 1, - "default": 3 - }, - "headSize": { - "type": "number", - "description": "Size of the arrowhead in pixels.", - "minimum": 1, - "default": 15 - } - } - }, - "text": { - "type": "object", - "description": "Configuration for text annotations.", - "properties": { - "content": { - "type": "string", - "description": "Text content to display." - }, - "fontSize": { - "type": "number", - "description": "Font size in pixels.", - "minimum": 1, - "default": 16 - }, - "fontFamily": { - "type": "string", - "description": "Font family name.", - "default": "Arial" - }, - "color": { - "type": "string", - "description": "Text color (hex, rgb, or named color).", - "default": "#000000" - }, - "backgroundColor": { - "type": "string", - "description": "Background color for the text box.", - "default": "#FFFFFF" - }, - "padding": { - "anyOf": [ - { - "type": "number", - "description": "Padding in pixels on all sides.", - "minimum": 0 - }, - { - "type": "object", - "additionalProperties": false, - "properties": { - "top": { - "type": "number", - "minimum": 0 - }, - "right": { - "type": "number", - "minimum": 0 - }, - "bottom": { - "type": "number", - "minimum": 0 - }, - "left": { - "type": "number", - "minimum": 0 - } - } - } - ], - "default": 5 - }, - "maxWidth": { - "type": "number", - "description": "Maximum width of the text box. Text will wrap.", - "minimum": 1 - }, - "opacity": { - "type": "number", - "description": "Opacity of the text and background (0-1).", - "minimum": 0, - "maximum": 1, - "default": 1 - } - }, - "required": [ - "content" - ] - }, - "rectangle": { - "type": "object", - "description": "Configuration for rectangle annotations.", - "properties": { - "width": { - "type": "number", - "description": "Width of the rectangle in pixels.", - "minimum": 1 - }, - "height": { - "type": "number", - "description": "Height of the rectangle in pixels.", - "minimum": 1 - }, - "fill": { - "type": "string", - "description": "Fill color (hex, rgb, or named color). Use 'transparent' for no fill.", - "default": "transparent" - }, - "stroke": { - "type": "string", - "description": "Border color (hex, rgb, or named color).", - "default": "#FF0000" - }, - "strokeWidth": { - "type": "number", - "description": "Border width in pixels.", - "minimum": 0, - "default": 2 - }, - "opacity": { - "type": "number", - "description": "Opacity (0-1).", - "minimum": 0, - "maximum": 1, - "default": 1 - }, - "rx": { - "type": "number", - "description": "Horizontal corner radius for rounded rectangles.", - "minimum": 0, - "default": 0 - }, - "ry": { - "type": "number", - "description": "Vertical corner radius for rounded rectangles.", - "minimum": 0, - "default": 0 - } - } - }, - "circle": { - "type": "object", - "description": "Configuration for circle annotations.", - "properties": { - "radius": { - "type": "number", - "description": "Radius of the circle in pixels.", - "minimum": 1, - "default": 30 - }, - "fill": { - "type": "string", - "description": "Fill color (hex, rgb, or named color). Use 'transparent' for no fill.", - "default": "transparent" - }, - "stroke": { - "type": "string", - "description": "Border color (hex, rgb, or named color).", - "default": "#FF0000" - }, - "strokeWidth": { - "type": "number", - "description": "Border width in pixels.", - "minimum": 0, - "default": 2 - }, - "opacity": { - "type": "number", - "description": "Opacity (0-1).", - "minimum": 0, - "maximum": 1, - "default": 1 - } - } - }, - "line": { - "type": "object", - "description": "Configuration for line annotations.", - "properties": { - "from": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "to": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "color": { - "type": "string", - "description": "Color of the line (hex, rgb, or named color).", - "default": "#000000" - }, - "strokeWidth": { - "type": "number", - "description": "Width of the line in pixels.", - "minimum": 1, - "default": 2 - }, - "dashArray": { - "type": "array", - "description": "Dash pattern [dash, gap]. E.g., [5, 5] for dashed line.", - "items": { - "type": "number", - "minimum": 0 - } - } - }, - "required": [ - "from", - "to" - ] - }, - "callout": { - "type": "object", - "description": "Configuration for callout annotations (text with arrow).", - "properties": { - "content": { - "type": "string", - "description": "Text content to display." - }, - "target": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "textPosition": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "fontSize": { - "type": "number", - "description": "Font size in pixels.", - "minimum": 1, - "default": 14 - }, - "color": { - "type": "string", - "description": "Text color.", - "default": "#000000" - }, - "backgroundColor": { - "type": "string", - "description": "Background color for the text box.", - "default": "#FFFFCC" - }, - "arrowColor": { - "type": "string", - "description": "Color of the arrow.", - "default": "#000000" - }, - "maxWidth": { - "type": "number", - "description": "Maximum width of the text box.", - "minimum": 1 - } - }, - "required": [ - "content", - "target" - ] - }, - "highlight": { - "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", - "properties": { - "color": { - "type": "string", - "description": "Highlight color (hex, rgb, or named color).", - "default": "#FFFF00" - }, - "opacity": { - "type": "number", - "description": "Opacity (0-1).", - "minimum": 0, - "maximum": 1, - "default": 0.3 - } - } - }, - "blur": { - "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", - "properties": { - "intensity": { - "type": "number", - "description": "Blur intensity level.", - "minimum": 1, - "default": 10 - }, - "width": { - "type": "number", - "description": "Width of the blur area in pixels.", - "minimum": 1 - }, - "height": { - "type": "number", - "description": "Height of the blur area in pixels.", - "minimum": 1 - } - } - } - }, - "components": { - "schemas": { - "arrow_properties": { - "type": "object", - "description": "Configuration for arrow annotations.", - "properties": { - "from": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "to": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "color": { - "type": "string", - "description": "Color of the arrow (hex, rgb, or named color).", - "default": "#FF0000" - }, - "strokeWidth": { - "type": "number", - "description": "Width of the arrow line in pixels.", - "minimum": 1, - "default": 3 - }, - "headSize": { - "type": "number", - "description": "Size of the arrowhead in pixels.", - "minimum": 1, - "default": 15 - } - } - }, - "text_properties": { - "type": "object", - "description": "Configuration for text annotations.", - "properties": { - "content": { - "type": "string", - "description": "Text content to display." - }, - "fontSize": { - "type": "number", - "description": "Font size in pixels.", - "minimum": 1, - "default": 16 - }, - "fontFamily": { - "type": "string", - "description": "Font family name.", - "default": "Arial" - }, - "color": { - "type": "string", - "description": "Text color (hex, rgb, or named color).", - "default": "#000000" - }, - "backgroundColor": { - "type": "string", - "description": "Background color for the text box.", - "default": "#FFFFFF" - }, - "padding": { - "anyOf": [ - { - "type": "number", - "description": "Padding in pixels on all sides.", - "minimum": 0 - }, - { - "type": "object", - "additionalProperties": false, - "properties": { - "top": { - "type": "number", - "minimum": 0 - }, - "right": { - "type": "number", - "minimum": 0 - }, - "bottom": { - "type": "number", - "minimum": 0 - }, - "left": { - "type": "number", - "minimum": 0 - } - } - } - ], - "default": 5 - }, - "maxWidth": { - "type": "number", - "description": "Maximum width of the text box. Text will wrap.", - "minimum": 1 - }, - "opacity": { - "type": "number", - "description": "Opacity of the text and background (0-1).", - "minimum": 0, - "maximum": 1, - "default": 1 - } - }, - "required": [ - "content" - ] - }, - "rectangle_properties": { - "type": "object", - "description": "Configuration for rectangle annotations.", - "properties": { - "width": { - "type": "number", - "description": "Width of the rectangle in pixels.", - "minimum": 1 - }, - "height": { - "type": "number", - "description": "Height of the rectangle in pixels.", - "minimum": 1 - }, - "fill": { - "type": "string", - "description": "Fill color (hex, rgb, or named color). Use 'transparent' for no fill.", - "default": "transparent" - }, - "stroke": { - "type": "string", - "description": "Border color (hex, rgb, or named color).", - "default": "#FF0000" - }, - "strokeWidth": { - "type": "number", - "description": "Border width in pixels.", - "minimum": 0, - "default": 2 - }, - "opacity": { - "type": "number", - "description": "Opacity (0-1).", - "minimum": 0, - "maximum": 1, - "default": 1 - }, - "rx": { - "type": "number", - "description": "Horizontal corner radius for rounded rectangles.", - "minimum": 0, - "default": 0 - }, - "ry": { - "type": "number", - "description": "Vertical corner radius for rounded rectangles.", - "minimum": 0, - "default": 0 - } - } - }, - "circle_properties": { - "type": "object", - "description": "Configuration for circle annotations.", - "properties": { - "radius": { - "type": "number", - "description": "Radius of the circle in pixels.", - "minimum": 1, - "default": 30 - }, - "fill": { - "type": "string", - "description": "Fill color (hex, rgb, or named color). Use 'transparent' for no fill.", - "default": "transparent" - }, - "stroke": { - "type": "string", - "description": "Border color (hex, rgb, or named color).", - "default": "#FF0000" - }, - "strokeWidth": { - "type": "number", - "description": "Border width in pixels.", - "minimum": 0, - "default": 2 - }, - "opacity": { - "type": "number", - "description": "Opacity (0-1).", - "minimum": 0, - "maximum": 1, - "default": 1 - } - } - }, - "line_properties": { - "type": "object", - "description": "Configuration for line annotations.", - "properties": { - "from": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "to": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "color": { - "type": "string", - "description": "Color of the line (hex, rgb, or named color).", - "default": "#000000" - }, - "strokeWidth": { - "type": "number", - "description": "Width of the line in pixels.", - "minimum": 1, - "default": 2 - }, - "dashArray": { - "type": "array", - "description": "Dash pattern [dash, gap]. E.g., [5, 5] for dashed line.", - "items": { - "type": "number", - "minimum": 0 - } - } - }, - "required": [ - "from", - "to" - ] - }, - "callout_properties": { - "type": "object", - "description": "Configuration for callout annotations (text with arrow).", - "properties": { - "content": { - "type": "string", - "description": "Text content to display." - }, - "target": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "textPosition": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "fontSize": { - "type": "number", - "description": "Font size in pixels.", - "minimum": 1, - "default": 14 - }, - "color": { - "type": "string", - "description": "Text color.", - "default": "#000000" - }, - "backgroundColor": { - "type": "string", - "description": "Background color for the text box.", - "default": "#FFFFCC" - }, - "arrowColor": { - "type": "string", - "description": "Color of the arrow.", - "default": "#000000" - }, - "maxWidth": { - "type": "number", - "description": "Maximum width of the text box.", - "minimum": 1 - } - }, - "required": [ - "content", - "target" - ] - }, - "highlight_properties": { - "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", - "properties": { - "color": { - "type": "string", - "description": "Highlight color (hex, rgb, or named color).", - "default": "#FFFF00" - }, - "opacity": { - "type": "number", - "description": "Opacity (0-1).", - "minimum": 0, - "maximum": 1, - "default": 0.3 - } - } - }, - "blur_properties": { - "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", - "properties": { - "intensity": { - "type": "number", - "description": "Blur intensity level.", - "minimum": 1, - "default": 10 - }, - "width": { - "type": "number", - "description": "Width of the blur area in pixels.", - "minimum": 1 - }, - "height": { - "type": "number", - "description": "Height of the blur area in pixels.", - "minimum": 1 - } - } - }, - "point": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "padding": { - "type": "object", - "additionalProperties": false, - "properties": { - "top": { - "type": "number", - "minimum": 0 - }, - "right": { - "type": "number", - "minimum": 0 - }, - "bottom": { - "type": "number", - "minimum": 0 - }, - "left": { - "type": "number", - "minimum": 0 - } - } - } - } - }, - "examples": [ - { - "find": { - "selector": "#submit-button" - }, - "arrow": { - "from": { - "x": 0, - "y": -50 - }, - "to": { - "x": 0, - "y": 0 - }, - "color": "#00FF00", - "strokeWidth": 4, - "headSize": 20 - } - }, - { - "position": "top-right", - "text": { - "content": "Important Notice", - "fontSize": 18, - "color": "#FFFFFF", - "backgroundColor": "#0000FF", - "padding": 10, - "maxWidth": 200, - "opacity": 0.9 - } - }, - { - "find": { - "elementClass": [ - "sensitive-info", - "/^private-/" - ] - }, - "blur": { - "intensity": 15, - "width": 200, - "height": 50 - } - } - ] - } - } - }, - "title": "Capture screenshot (detailed)" - }, - { - "type": "boolean", - "title": "Capture screenshot", - "description": "If `true`, captures a screenshot. If `false`, doesn't capture a screenshot." - } - ], - "components": { - "schemas": { - "path": { - "title": "Screenshot (simple)", - "description": "File path of the PNG file. Accepts absolute paths. If not specified, the file name is the ID of the step.", - "type": "string", - "pattern": "([A-Za-z0-9_-]*\\.(png|PNG)$|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - "object": { - "type": "object", - "additionalProperties": false, - "properties": { - "path": { - "title": "Screenshot (simple)", - "description": "File path of the PNG file. Accepts absolute paths. If not specified, the file name is the ID of the step.", - "type": "string", - "pattern": "([A-Za-z0-9_-]*\\.(png|PNG)$|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - "directory": { - "type": "string", - "description": "Directory of the PNG file. If the directory doesn't exist, creates the directory.", - "transform": [ - "trim" - ] - }, - "maxVariation": { - "type": "number", - "description": "Allowed variation in percentage of pixels between the new screenshot and the existing screenshot at `path`. If the difference between the new screenshot and the existing screenshot is greater than `maxVariation`, the step fails. If a screenshot doesn't exist at `path`, this value is ignored.", - "default": 0.05, - "minimum": 0, - "maximum": 1 - }, - "overwrite": { - "type": "string", - "description": "If `true`, overwrites the existing screenshot at `path` if it exists.\nIf `aboveVariation`, overwrites the existing screenshot at `path` if the difference between the new screenshot and the existing screenshot is greater than `maxVariation`.", - "enum": [ - "true", - "false", - "aboveVariation" - ], - "default": "aboveVariation" - }, - "crop": { - "anyOf": [ - { - "title": "Crop by element (simple)", - "type": "string", - "description": "Display text or selector of the element to screenshot." - }, - { - "title": "Crop by element (detailed)", - "type": "object", - "description": "Crop the screenshot to a specific element.", - "additionalProperties": false, - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "properties": { - "elementText": { - "type": "string", - "description": "Display text of the element to screenshot." - }, - "selector": { - "type": "string", - "description": "Selector of the element to screenshot." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - }, - "padding": { - "anyOf": [ - { - "title": "Padding (simple)", - "type": "number", - "description": "Padding in pixels to add to the bounds of the element.", - "minimum": 0 - }, - { - "type": "object", - "additionalProperties": false, - "properties": { - "top": { - "type": "number", - "minimum": 0 - }, - "right": { - "type": "number", - "minimum": 0 - }, - "bottom": { - "type": "number", - "minimum": 0 - }, - "left": { - "type": "number", - "minimum": 0 - } - }, - "title": "Padding (detailed)", - "description": "Padding in pixels to add to the bounds of the element." - } - ] - } - } - } - ] - }, - "annotations": { - "type": "array", - "description": "Array of annotations to add to the screenshot.", - "items": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "annotation", - "type": "object", - "description": "A visual annotation to add to the screenshot. Annotations can point to elements on the page (via `find`) or be positioned freely within the viewport.", - "anyOf": [ - { - "required": [ - "arrow" - ], - "not": { - "required": [ - "text", - "rectangle", - "circle", - "line", - "callout", - "highlight", - "blur" - ] - } - }, - { - "required": [ - "text" - ], - "not": { - "required": [ - "arrow", - "rectangle", - "circle", - "line", - "callout", - "highlight", - "blur" - ] - } - }, - { - "required": [ - "rectangle" - ], - "not": { - "required": [ - "arrow", - "text", - "circle", - "line", - "callout", - "highlight", - "blur" - ] - } - }, - { - "required": [ - "circle" - ], - "not": { - "required": [ - "arrow", - "text", - "rectangle", - "line", - "callout", - "highlight", - "blur" - ] - } - }, - { - "required": [ - "line" - ], - "not": { - "required": [ - "arrow", - "text", - "rectangle", - "circle", - "callout", - "highlight", - "blur" - ] - } - }, - { - "required": [ - "callout" - ], - "not": { - "required": [ - "arrow", - "text", - "rectangle", - "circle", - "line", - "highlight", - "blur" - ] - } - }, - { - "required": [ - "highlight" - ], - "not": { - "required": [ - "arrow", - "text", - "rectangle", - "circle", - "line", - "callout", - "blur" - ] - } - }, - { - "required": [ - "blur" - ], - "not": { - "required": [ - "arrow", - "text", - "rectangle", - "circle", - "line", - "callout", - "highlight" - ] - } - } - ], - "properties": { - "find": { - "type": "object", - "description": "Element on the page to annotate.", - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "additionalProperties": false, - "properties": { - "selector": { - "type": "string", - "description": "Selector of the element to annotate." - }, - "elementText": { - "type": "string", - "description": "Display text of the element to annotate." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - } - } - }, - "position": { - "anyOf": [ - { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - { - "type": "string", - "enum": [ - "top", - "bottom", - "left", - "right", - "center", - "top-left", - "top-right", - "bottom-left", - "bottom-right" - ], - "description": "Position relative to the element (if `find` is provided) or to the viewport." - } - ] - }, - "arrow": { - "type": "object", - "description": "Configuration for arrow annotations.", - "properties": { - "from": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "to": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "color": { - "type": "string", - "description": "Color of the arrow (hex, rgb, or named color).", - "default": "#FF0000" - }, - "strokeWidth": { - "type": "number", - "description": "Width of the arrow line in pixels.", - "minimum": 1, - "default": 3 - }, - "headSize": { - "type": "number", - "description": "Size of the arrowhead in pixels.", - "minimum": 1, - "default": 15 - } - } - }, - "text": { - "type": "object", - "description": "Configuration for text annotations.", - "properties": { - "content": { - "type": "string", - "description": "Text content to display." - }, - "fontSize": { - "type": "number", - "description": "Font size in pixels.", - "minimum": 1, - "default": 16 - }, - "fontFamily": { - "type": "string", - "description": "Font family name.", - "default": "Arial" - }, - "color": { - "type": "string", - "description": "Text color (hex, rgb, or named color).", - "default": "#000000" - }, - "backgroundColor": { - "type": "string", - "description": "Background color for the text box.", - "default": "#FFFFFF" - }, - "padding": { - "anyOf": [ - { - "type": "number", - "description": "Padding in pixels on all sides.", - "minimum": 0 - }, - { - "type": "object", - "additionalProperties": false, - "properties": { - "top": { - "type": "number", - "minimum": 0 - }, - "right": { - "type": "number", - "minimum": 0 - }, - "bottom": { - "type": "number", - "minimum": 0 - }, - "left": { - "type": "number", - "minimum": 0 - } - } - } - ], - "default": 5 - }, - "maxWidth": { - "type": "number", - "description": "Maximum width of the text box. Text will wrap.", - "minimum": 1 - }, - "opacity": { - "type": "number", - "description": "Opacity of the text and background (0-1).", - "minimum": 0, - "maximum": 1, - "default": 1 - } - }, - "required": [ - "content" - ] - }, - "rectangle": { - "type": "object", - "description": "Configuration for rectangle annotations.", - "properties": { - "width": { - "type": "number", - "description": "Width of the rectangle in pixels.", - "minimum": 1 - }, - "height": { - "type": "number", - "description": "Height of the rectangle in pixels.", - "minimum": 1 - }, - "fill": { - "type": "string", - "description": "Fill color (hex, rgb, or named color). Use 'transparent' for no fill.", - "default": "transparent" - }, - "stroke": { - "type": "string", - "description": "Border color (hex, rgb, or named color).", - "default": "#FF0000" - }, - "strokeWidth": { - "type": "number", - "description": "Border width in pixels.", - "minimum": 0, - "default": 2 - }, - "opacity": { - "type": "number", - "description": "Opacity (0-1).", - "minimum": 0, - "maximum": 1, - "default": 1 - }, - "rx": { - "type": "number", - "description": "Horizontal corner radius for rounded rectangles.", - "minimum": 0, - "default": 0 - }, - "ry": { - "type": "number", - "description": "Vertical corner radius for rounded rectangles.", - "minimum": 0, - "default": 0 - } - } - }, - "circle": { - "type": "object", - "description": "Configuration for circle annotations.", - "properties": { - "radius": { - "type": "number", - "description": "Radius of the circle in pixels.", - "minimum": 1, - "default": 30 - }, - "fill": { - "type": "string", - "description": "Fill color (hex, rgb, or named color). Use 'transparent' for no fill.", - "default": "transparent" - }, - "stroke": { - "type": "string", - "description": "Border color (hex, rgb, or named color).", - "default": "#FF0000" - }, - "strokeWidth": { - "type": "number", - "description": "Border width in pixels.", - "minimum": 0, - "default": 2 - }, - "opacity": { - "type": "number", - "description": "Opacity (0-1).", - "minimum": 0, - "maximum": 1, - "default": 1 - } - } - }, - "line": { - "type": "object", - "description": "Configuration for line annotations.", - "properties": { - "from": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "to": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "color": { - "type": "string", - "description": "Color of the line (hex, rgb, or named color).", - "default": "#000000" - }, - "strokeWidth": { - "type": "number", - "description": "Width of the line in pixels.", - "minimum": 1, - "default": 2 - }, - "dashArray": { - "type": "array", - "description": "Dash pattern [dash, gap]. E.g., [5, 5] for dashed line.", - "items": { - "type": "number", - "minimum": 0 - } - } - }, - "required": [ - "from", - "to" - ] - }, - "callout": { - "type": "object", - "description": "Configuration for callout annotations (text with arrow).", - "properties": { - "content": { - "type": "string", - "description": "Text content to display." - }, - "target": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "textPosition": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "fontSize": { - "type": "number", - "description": "Font size in pixels.", - "minimum": 1, - "default": 14 - }, - "color": { - "type": "string", - "description": "Text color.", - "default": "#000000" - }, - "backgroundColor": { - "type": "string", - "description": "Background color for the text box.", - "default": "#FFFFCC" - }, - "arrowColor": { - "type": "string", - "description": "Color of the arrow.", - "default": "#000000" - }, - "maxWidth": { - "type": "number", - "description": "Maximum width of the text box.", - "minimum": 1 - } - }, - "required": [ - "content", - "target" - ] - }, - "highlight": { - "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", - "properties": { - "color": { - "type": "string", - "description": "Highlight color (hex, rgb, or named color).", - "default": "#FFFF00" - }, - "opacity": { - "type": "number", - "description": "Opacity (0-1).", - "minimum": 0, - "maximum": 1, - "default": 0.3 - } - } - }, - "blur": { - "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", - "properties": { - "intensity": { - "type": "number", - "description": "Blur intensity level.", - "minimum": 1, - "default": 10 - }, - "width": { - "type": "number", - "description": "Width of the blur area in pixels.", - "minimum": 1 - }, - "height": { - "type": "number", - "description": "Height of the blur area in pixels.", - "minimum": 1 - } - } - } - }, - "components": { - "schemas": { - "arrow_properties": { - "type": "object", - "description": "Configuration for arrow annotations.", - "properties": { - "from": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "to": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "color": { - "type": "string", - "description": "Color of the arrow (hex, rgb, or named color).", - "default": "#FF0000" - }, - "strokeWidth": { - "type": "number", - "description": "Width of the arrow line in pixels.", - "minimum": 1, - "default": 3 - }, - "headSize": { - "type": "number", - "description": "Size of the arrowhead in pixels.", - "minimum": 1, - "default": 15 - } - } - }, - "text_properties": { - "type": "object", - "description": "Configuration for text annotations.", - "properties": { - "content": { - "type": "string", - "description": "Text content to display." - }, - "fontSize": { - "type": "number", - "description": "Font size in pixels.", - "minimum": 1, - "default": 16 - }, - "fontFamily": { - "type": "string", - "description": "Font family name.", - "default": "Arial" - }, - "color": { - "type": "string", - "description": "Text color (hex, rgb, or named color).", - "default": "#000000" - }, - "backgroundColor": { - "type": "string", - "description": "Background color for the text box.", - "default": "#FFFFFF" - }, - "padding": { - "anyOf": [ - { - "type": "number", - "description": "Padding in pixels on all sides.", - "minimum": 0 - }, - { - "type": "object", - "additionalProperties": false, - "properties": { - "top": { - "type": "number", - "minimum": 0 - }, - "right": { - "type": "number", - "minimum": 0 - }, - "bottom": { - "type": "number", - "minimum": 0 - }, - "left": { - "type": "number", - "minimum": 0 - } - } - } - ], - "default": 5 - }, - "maxWidth": { - "type": "number", - "description": "Maximum width of the text box. Text will wrap.", - "minimum": 1 - }, - "opacity": { - "type": "number", - "description": "Opacity of the text and background (0-1).", - "minimum": 0, - "maximum": 1, - "default": 1 - } - }, - "required": [ - "content" - ] - }, - "rectangle_properties": { - "type": "object", - "description": "Configuration for rectangle annotations.", - "properties": { - "width": { - "type": "number", - "description": "Width of the rectangle in pixels.", - "minimum": 1 - }, - "height": { - "type": "number", - "description": "Height of the rectangle in pixels.", - "minimum": 1 - }, - "fill": { - "type": "string", - "description": "Fill color (hex, rgb, or named color). Use 'transparent' for no fill.", - "default": "transparent" - }, - "stroke": { - "type": "string", - "description": "Border color (hex, rgb, or named color).", - "default": "#FF0000" - }, - "strokeWidth": { - "type": "number", - "description": "Border width in pixels.", - "minimum": 0, - "default": 2 - }, - "opacity": { - "type": "number", - "description": "Opacity (0-1).", - "minimum": 0, - "maximum": 1, - "default": 1 - }, - "rx": { - "type": "number", - "description": "Horizontal corner radius for rounded rectangles.", - "minimum": 0, - "default": 0 - }, - "ry": { - "type": "number", - "description": "Vertical corner radius for rounded rectangles.", - "minimum": 0, - "default": 0 - } - } - }, - "circle_properties": { - "type": "object", - "description": "Configuration for circle annotations.", - "properties": { - "radius": { - "type": "number", - "description": "Radius of the circle in pixels.", - "minimum": 1, - "default": 30 - }, - "fill": { - "type": "string", - "description": "Fill color (hex, rgb, or named color). Use 'transparent' for no fill.", - "default": "transparent" - }, - "stroke": { - "type": "string", - "description": "Border color (hex, rgb, or named color).", - "default": "#FF0000" - }, - "strokeWidth": { - "type": "number", - "description": "Border width in pixels.", - "minimum": 0, - "default": 2 - }, - "opacity": { - "type": "number", - "description": "Opacity (0-1).", - "minimum": 0, - "maximum": 1, - "default": 1 - } - } - }, - "line_properties": { - "type": "object", - "description": "Configuration for line annotations.", - "properties": { - "from": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "to": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "color": { - "type": "string", - "description": "Color of the line (hex, rgb, or named color).", - "default": "#000000" - }, - "strokeWidth": { - "type": "number", - "description": "Width of the line in pixels.", - "minimum": 1, - "default": 2 - }, - "dashArray": { - "type": "array", - "description": "Dash pattern [dash, gap]. E.g., [5, 5] for dashed line.", - "items": { - "type": "number", - "minimum": 0 - } - } - }, - "required": [ - "from", - "to" - ] - }, - "callout_properties": { - "type": "object", - "description": "Configuration for callout annotations (text with arrow).", - "properties": { - "content": { - "type": "string", - "description": "Text content to display." - }, - "target": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "textPosition": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "fontSize": { - "type": "number", - "description": "Font size in pixels.", - "minimum": 1, - "default": 14 - }, - "color": { - "type": "string", - "description": "Text color.", - "default": "#000000" - }, - "backgroundColor": { - "type": "string", - "description": "Background color for the text box.", - "default": "#FFFFCC" - }, - "arrowColor": { - "type": "string", - "description": "Color of the arrow.", - "default": "#000000" - }, - "maxWidth": { - "type": "number", - "description": "Maximum width of the text box.", - "minimum": 1 - } - }, - "required": [ - "content", - "target" - ] - }, - "highlight_properties": { - "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", - "properties": { - "color": { - "type": "string", - "description": "Highlight color (hex, rgb, or named color).", - "default": "#FFFF00" - }, - "opacity": { - "type": "number", - "description": "Opacity (0-1).", - "minimum": 0, - "maximum": 1, - "default": 0.3 - } - } - }, - "blur_properties": { - "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", - "properties": { - "intensity": { - "type": "number", - "description": "Blur intensity level.", - "minimum": 1, - "default": 10 - }, - "width": { - "type": "number", - "description": "Width of the blur area in pixels.", - "minimum": 1 - }, - "height": { - "type": "number", - "description": "Height of the blur area in pixels.", - "minimum": 1 - } - } - }, - "point": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "padding": { - "type": "object", - "additionalProperties": false, - "properties": { - "top": { - "type": "number", - "minimum": 0 - }, - "right": { - "type": "number", - "minimum": 0 - }, - "bottom": { - "type": "number", - "minimum": 0 - }, - "left": { - "type": "number", - "minimum": 0 - } - } - } - } - }, - "examples": [ - { - "find": { - "selector": "#submit-button" - }, - "arrow": { - "from": { - "x": 0, - "y": -50 - }, - "to": { - "x": 0, - "y": 0 - }, - "color": "#00FF00", - "strokeWidth": 4, - "headSize": 20 - } - }, - { - "position": "top-right", - "text": { - "content": "Important Notice", - "fontSize": 18, - "color": "#FFFFFF", - "backgroundColor": "#0000FF", - "padding": 10, - "maxWidth": 200, - "opacity": 0.9 - } - }, - { - "find": { - "elementClass": [ - "sensitive-info", - "/^private-/" - ] - }, - "blur": { - "intensity": 15, - "width": 200, - "height": 50 - } - } - ] - } - } - }, - "title": "Capture screenshot (detailed)" - }, - "crop_element": { - "title": "Crop by element (detailed)", - "type": "object", - "description": "Crop the screenshot to a specific element.", - "additionalProperties": false, - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "properties": { - "elementText": { - "type": "string", - "description": "Display text of the element to screenshot." - }, - "selector": { - "type": "string", - "description": "Selector of the element to screenshot." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - }, - "padding": { - "anyOf": [ - { - "title": "Padding (simple)", - "type": "number", - "description": "Padding in pixels to add to the bounds of the element.", - "minimum": 0 - }, - { - "type": "object", - "additionalProperties": false, - "properties": { - "top": { - "type": "number", - "minimum": 0 - }, - "right": { - "type": "number", - "minimum": 0 - }, - "bottom": { - "type": "number", - "minimum": 0 - }, - "left": { - "type": "number", - "minimum": 0 - } - }, - "title": "Padding (detailed)", - "description": "Padding in pixels to add to the bounds of the element." - } - ] - } - } - }, - "padding": { - "type": "object", - "additionalProperties": false, - "properties": { - "top": { - "type": "number", - "minimum": 0 - }, - "right": { - "type": "number", - "minimum": 0 - }, - "bottom": { - "type": "number", - "minimum": 0 - }, - "left": { - "type": "number", - "minimum": 0 - } - }, - "title": "Padding (detailed)", - "description": "Padding in pixels to add to the bounds of the element." - } - } - }, - "examples": [ - true, - "image.png", - "static/images/image.png", - "/User/manny/projects/doc-detective/static/images/image.png", - { - "path": "image.png", - "directory": "static/images", - "maxVariation": 0.1, - "overwrite": "aboveVariation", - "crop": "#elementToScreenshot" - }, - { - "path": "image.png", - "directory": "static/images", - "maxVariation": 0.1, - "overwrite": "aboveVariation" - }, - { - "path": "image.png", - "directory": "static/images", - "maxVariation": 0.1, - "overwrite": "aboveVariation", - "crop": { - "selector": "#elementToScreenshot", - "elementText": "Element text", - "padding": { - "top": 0, - "right": 0, - "bottom": 0, - "left": 0 - } - } - }, - { - "path": "image.png", - "annotations": [ - { - "find": { - "selector": "#usernameField" - }, - "arrow": { - "from": { - "x": 0, - "y": -50 - }, - "to": { - "x": 0, - "y": 0 - }, - "color": "#FF0000", - "strokeWidth": 4, - "headSize": 10 - } - }, - { - "find": { - "elementText": "Username", - "elementClass": [ - "input-field", - "/^user-/" - ] - }, - "text": { - "content": "Enter your username here", - "fontSize": 14, - "color": "#0000FF", - "backgroundColor": "#FFFFFF", - "padding": 5 - } - }, - { - "rectangle": { - "x": 100, - "y": 150, - "width": 200, - "height": 100, - "borderColor": "#00FF00", - "borderWidth": 3, - "fillColor": "rgba(0, 255, 0, 0.2)" - } - } - ] - } - ] - } - }, - "title": "screenshot" - } - ] - }, - { - "allOf": [ - { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { - "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - }, - "title": "Common" - }, - { - "type": "object", - "required": [ - "saveCookie" - ], - "properties": { - "saveCookie": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "saveCookie", - "description": "Save a specific browser cookie to a file or environment variable for later reuse.", - "anyOf": [ - { - "type": "string", - "title": "Cookie name", - "description": "Name of the specific cookie to save. Will be saved to a default file path or environment variable.", - "pattern": "^[A-Za-z0-9_./\\-]+$", - "transform": [ - "trim" - ] - }, - { - "type": "object", - "additionalProperties": false, - "properties": { - "$schema": { - "description": "Optional self-describing schema URI for linters", - "type": "string", - "format": "uri-reference" - }, - "name": { - "type": "string", - "title": "Cookie name", - "description": "Name of the specific cookie to save.", - "pattern": "^[A-Za-z0-9_.-]+$", - "transform": [ - "trim" - ] - }, - "variable": { - "type": "string", - "title": "Environment variable name", - "description": "Environment variable name to store the cookie as JSON string.", - "pattern": "^[A-Za-z_][A-Za-z0-9_]*$", - "transform": [ - "trim" - ] - }, - "path": { - "type": "string", - "title": "Cookie file path", - "description": "File path to save the cookie, relative to directory. Uses Netscape cookie format.", - "transform": [ - "trim" - ] - }, - "directory": { - "type": "string", - "title": "Directory path", - "description": "Directory to save the cookie file. If not specified, uses output directory.", - "transform": [ - "trim" - ] - }, - "overwrite": { - "type": "boolean", - "title": "Overwrite existing file", - "description": "Whether to overwrite existing cookie file.", - "default": false - }, - "domain": { - "type": "string", - "title": "Cookie domain", - "description": "Specific domain to filter the cookie by (optional).", - "transform": [ - "trim" - ] - } - }, - "required": [ - "name" - ], - "anyOf": [ - { - "required": [ - "path" - ], - "not": { - "required": [ - "variable" - ] - } - }, - { - "required": [ - "variable" - ], - "not": { - "anyOf": [ - { - "required": [ - "path" - ] - }, - { - "required": [ - "directory" - ] - } - ] - } - } - ], - "title": "Save cookie (detailed)" - } - ], - "components": { - "schemas": { - "string": { - "type": "string", - "title": "Cookie name", - "description": "Name of the specific cookie to save. Will be saved to a default file path or environment variable.", - "pattern": "^[A-Za-z0-9_./\\-]+$", - "transform": [ - "trim" - ] - }, - "object": { - "type": "object", - "additionalProperties": false, - "properties": { - "$schema": { - "description": "Optional self-describing schema URI for linters", - "type": "string", - "format": "uri-reference" - }, - "name": { - "type": "string", - "title": "Cookie name", - "description": "Name of the specific cookie to save.", - "pattern": "^[A-Za-z0-9_.-]+$", - "transform": [ - "trim" - ] - }, - "variable": { - "type": "string", - "title": "Environment variable name", - "description": "Environment variable name to store the cookie as JSON string.", - "pattern": "^[A-Za-z_][A-Za-z0-9_]*$", - "transform": [ - "trim" - ] - }, - "path": { - "type": "string", - "title": "Cookie file path", - "description": "File path to save the cookie, relative to directory. Uses Netscape cookie format.", - "transform": [ - "trim" - ] - }, - "directory": { - "type": "string", - "title": "Directory path", - "description": "Directory to save the cookie file. If not specified, uses output directory.", - "transform": [ - "trim" - ] - }, - "overwrite": { - "type": "boolean", - "title": "Overwrite existing file", - "description": "Whether to overwrite existing cookie file.", - "default": false - }, - "domain": { - "type": "string", - "title": "Cookie domain", - "description": "Specific domain to filter the cookie by (optional).", - "transform": [ - "trim" - ] - } - }, - "required": [ - "name" - ], - "anyOf": [ - { - "required": [ - "path" - ], - "not": { - "required": [ - "variable" - ] - } - }, - { - "required": [ - "variable" - ], - "not": { - "anyOf": [ - { - "required": [ - "path" - ] - }, - { - "required": [ - "directory" - ] - } - ] - } - } - ], - "title": "Save cookie (detailed)" - } - } - }, - "examples": [ - "session_token", - "test_env_cookie", - { - "name": "auth_cookie", - "path": "auth-cookie.txt" - }, - { - "name": "session_token", - "variable": "SESSION_TOKEN" - }, - { - "name": "test_cookie", - "path": "test-cookie.txt", - "overwrite": true - }, - { - "name": "user_session", - "path": "user-session.txt", - "directory": "./test-data", - "overwrite": true - }, - { - "name": "login_token", - "path": "login-token.txt", - "domain": "app.example.com" - } - ] - } - }, - "title": "saveCookie" - } - ] - }, - { - "allOf": [ - { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { - "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - }, - "title": "Common" - }, - { - "type": "object", - "required": [ - "record" - ], - "properties": { - "record": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "record", - "description": "Start recording the current browser viewport. Must be followed by a `stopRecord` step. Only runs in Chrome browsers when they are visible. Supported extensions: [ '.mp4', '.webm', '.gif' ]", - "anyOf": [ - { - "title": "Record (simple)", - "type": "string", - "description": "File path of the recording. Supports the `.mp4`, `.webm`, and `.gif` extensions. If not specified, the file name is the ID of the step, and the extension is `.mp4`.", - "pattern": "([A-Za-z0-9_-]*\\.(mp4|webm|gif)$|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - { - "type": "object", - "properties": { - "path": { - "type": "string", - "description": "File path of the recording. Supports the `.mp4`, `.webm`, and `.gif` extensions. If not specified, the file name is the ID of the step, and the extension is `.mp4`.", - "pattern": "([A-Za-z0-9_-]*\\.(mp4|webm|gif)$|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - "directory": { - "type": "string", - "description": "Directory of the file. If the directory doesn't exist, creates the directory.", - "transform": [ - "trim" - ] - }, - "overwrite": { - "type": "string", - "description": "If `true`, overwrites the existing recording at `path` if it exists.", - "enum": [ - "true", - "false" - ] - } - }, - "title": "Record (detailed)" - }, - { - "type": "boolean", - "title": "Record (boolean)", - "description": "If `true`, records the current browser viewport. If `false`, doesn't record the current browser viewport." - } - ], - "components": { - "schemas": { - "string": { - "title": "Record (simple)", - "type": "string", - "description": "File path of the recording. Supports the `.mp4`, `.webm`, and `.gif` extensions. If not specified, the file name is the ID of the step, and the extension is `.mp4`.", - "pattern": "([A-Za-z0-9_-]*\\.(mp4|webm|gif)$|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - "object": { - "type": "object", - "properties": { - "path": { - "type": "string", - "description": "File path of the recording. Supports the `.mp4`, `.webm`, and `.gif` extensions. If not specified, the file name is the ID of the step, and the extension is `.mp4`.", - "pattern": "([A-Za-z0-9_-]*\\.(mp4|webm|gif)$|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - "directory": { - "type": "string", - "description": "Directory of the file. If the directory doesn't exist, creates the directory.", - "transform": [ - "trim" - ] - }, - "overwrite": { - "type": "string", - "description": "If `true`, overwrites the existing recording at `path` if it exists.", - "enum": [ - "true", - "false" - ] - } - }, - "title": "Record (detailed)" - } - } - }, - "examples": [ - true, - "results.mp4", - { - "path": "results.mp4", - "directory": "static/media", - "overwrite": "true" - } - ] - } - }, - "title": "record" - } - ] - }, - { - "allOf": [ - { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { - "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - }, - "title": "Common" - }, - { - "type": "object", - "required": [ - "stopRecord" - ], - "properties": { - "stopRecord": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "stopRecord", - "description": "Stop the current recording.", - "anyOf": [ - { - "type": "boolean", - "nullable": true - } - ], - "examples": [ - true - ] - } - }, - "title": "stopRecord" - } - ] - }, - { - "allOf": [ - { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { - "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - }, - "title": "Common" - }, - { - "title": "loadVariables", - "type": "object", - "required": [ - "loadVariables" - ], - "properties": { - "loadVariables": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "loadVariables", - "type": "string", - "description": "Load environment variables from the specified `.env` file.", - "examples": [ - ".env" - ] - } - } - } - ] - }, - { - "allOf": [ - { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { - "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - }, - "title": "Common" - }, - { - "title": "dragAndDrop", - "type": "object", - "required": [ - "dragAndDrop" - ], - "properties": { - "dragAndDrop": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "dragAndDrop", - "description": "Drag and drop an element from source to target.", - "type": "object", - "required": [ - "source", - "target" - ], - "properties": { - "source": { - "description": "The element to drag.", - "anyOf": [ - { - "title": "Element (simple)", - "type": "string", - "description": "Display text, selector, or regex pattern (enclosed in forward slashes) of the element." - }, - { - "title": "Element (detailed)", - "type": "object", - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "properties": { - "elementText": { - "type": "string", - "description": "Display text or regex pattern (enclosed in forward slashes) of the element. If combined with `selector`, the element must match both the text and the selector." - }, - "selector": { - "type": "string", - "description": "Selector of the element. If combined with `elementText`, the element must match both the text and the selector." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - }, - "timeout": { - "type": "integer", - "description": "Max duration in milliseconds to wait for the element to exist.", - "default": 5000 - } - } - } - ] - }, - "target": { - "description": "The target location to drop the element.", - "anyOf": [ - { - "title": "Element (simple)", - "type": "string", - "description": "Display text, selector, or regex pattern (enclosed in forward slashes) of the element." - }, - { - "title": "Element (detailed)", - "type": "object", - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "properties": { - "elementText": { - "type": "string", - "description": "Display text or regex pattern (enclosed in forward slashes) of the element. If combined with `selector`, the element must match both the text and the selector." - }, - "selector": { - "type": "string", - "description": "Selector of the element. If combined with `elementText`, the element must match both the text and the selector." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - }, - "timeout": { - "type": "integer", - "description": "Max duration in milliseconds to wait for the element to exist.", - "default": 5000 - } - } - } - ] - }, - "duration": { - "type": "integer", - "description": "Duration of the drag operation in milliseconds.", - "default": 1000, - "minimum": 0 - } - }, - "components": { - "schemas": { - "elementSpecification": { - "anyOf": [ - { - "title": "Element (simple)", - "type": "string", - "description": "Display text, selector, or regex pattern (enclosed in forward slashes) of the element." - }, - { - "title": "Element (detailed)", - "type": "object", - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "properties": { - "elementText": { - "type": "string", - "description": "Display text or regex pattern (enclosed in forward slashes) of the element. If combined with `selector`, the element must match both the text and the selector." - }, - "selector": { - "type": "string", - "description": "Selector of the element. If combined with `elementText`, the element must match both the text and the selector." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - }, - "timeout": { - "type": "integer", - "description": "Max duration in milliseconds to wait for the element to exist.", - "default": 5000 - } - } - } - ] - }, - "string": { - "title": "Element (simple)", - "type": "string", - "description": "Display text, selector, or regex pattern (enclosed in forward slashes) of the element." - }, - "object": { - "title": "Element (detailed)", - "type": "object", - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "properties": { - "elementText": { - "type": "string", - "description": "Display text or regex pattern (enclosed in forward slashes) of the element. If combined with `selector`, the element must match both the text and the selector." - }, - "selector": { - "type": "string", - "description": "Selector of the element. If combined with `elementText`, the element must match both the text and the selector." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - }, - "timeout": { - "type": "integer", - "description": "Max duration in milliseconds to wait for the element to exist.", - "default": 5000 - } - } - } - } - }, - "examples": [ - { - "source": "Table", - "target": "#canvas" - }, - { - "source": ".draggable-block", - "target": ".drop-zone", - "duration": 2000 - }, - { - "source": { - "selector": ".widget", - "elementText": "Data Table" - }, - "target": { - "selector": "#design-canvas" - }, - "duration": 500 - }, - { - "source": { - "selector": ".draggable", - "timeout": 10000 - }, - "target": { - "elementText": "Drop Zone", - "timeout": 5000 - } - }, - { - "source": "/Widget Item.*/", - "target": "#canvas" - }, - { - "source": { - "selector": ".draggable", - "elementText": "/Button [0-9]+/" - }, - "target": { - "elementText": "/Drop Zone.*/" - } - } - ] - } - } - } - ] - }, - { - "allOf": [ - { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { - "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - }, - "title": "Common" - }, - { - "title": "loadCookie", - "type": "object", - "required": [ - "loadCookie" - ], - "properties": { - "loadCookie": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "loadCookie", - "description": "Load a specific cookie from a file or environment variable into the browser.", - "anyOf": [ - { - "type": "string", - "title": "Cookie name or file path", - "description": "Name of the specific cookie to load from default location, or file path to cookie file.", - "pattern": "^[A-Za-z0-9_./\\-]+$", - "transform": [ - "trim" - ] - }, - { - "type": "object", - "additionalProperties": false, - "required": [ - "name" - ], - "anyOf": [ - { - "required": [ - "path" - ], - "not": { - "required": [ - "variable" - ] - } - }, - { - "required": [ - "variable" - ], - "not": { - "anyOf": [ - { - "required": [ - "path" - ] - }, - { - "required": [ - "directory" - ] - } - ] - } - } - ], - "properties": { - "$schema": { - "description": "Optional self-describing schema URI for linters", - "type": "string", - "format": "uri-reference" - }, - "name": { - "type": "string", - "title": "Cookie name", - "description": "Name of the specific cookie to load.", - "pattern": "^[A-Za-z0-9_.-]+$", - "transform": [ - "trim" - ] - }, - "variable": { - "type": "string", - "title": "Environment variable name", - "description": "Environment variable name containing the cookie as JSON string.", - "pattern": "^[A-Za-z_][A-Za-z0-9_]*$", - "transform": [ - "trim" - ] - }, - "path": { - "type": "string", - "title": "Cookie file path", - "description": "File path to cookie file, relative to directory. Supports Netscape cookie format.", - "transform": [ - "trim" - ] - }, - "directory": { - "type": "string", - "title": "Directory path", - "description": "Directory containing the cookie file.", - "transform": [ - "trim" - ] - }, - "domain": { - "type": "string", - "title": "Cookie domain", - "description": "Specific domain to filter the cookie by when loading from multi-cookie file (optional).", - "transform": [ - "trim" - ] - } - }, - "title": "Load cookie (detailed)" - } - ], - "components": { - "schemas": { - "string": { - "type": "string", - "title": "Cookie name or file path", - "description": "Name of the specific cookie to load from default location, or file path to cookie file.", - "pattern": "^[A-Za-z0-9_./\\-]+$", - "transform": [ - "trim" - ] - }, - "object": { - "type": "object", - "additionalProperties": false, - "required": [ - "name" - ], - "anyOf": [ - { - "required": [ - "path" - ], - "not": { - "required": [ - "variable" - ] - } - }, - { - "required": [ - "variable" - ], - "not": { - "anyOf": [ - { - "required": [ - "path" - ] - }, - { - "required": [ - "directory" - ] - } - ] - } - } - ], - "properties": { - "$schema": { - "description": "Optional self-describing schema URI for linters", - "type": "string", - "format": "uri-reference" - }, - "name": { - "type": "string", - "title": "Cookie name", - "description": "Name of the specific cookie to load.", - "pattern": "^[A-Za-z0-9_.-]+$", - "transform": [ - "trim" - ] - }, - "variable": { - "type": "string", - "title": "Environment variable name", - "description": "Environment variable name containing the cookie as JSON string.", - "pattern": "^[A-Za-z_][A-Za-z0-9_]*$", - "transform": [ - "trim" - ] - }, - "path": { - "type": "string", - "title": "Cookie file path", - "description": "File path to cookie file, relative to directory. Supports Netscape cookie format.", - "transform": [ - "trim" - ] - }, - "directory": { - "type": "string", - "title": "Directory path", - "description": "Directory containing the cookie file.", - "transform": [ - "trim" - ] - }, - "domain": { - "type": "string", - "title": "Cookie domain", - "description": "Specific domain to filter the cookie by when loading from multi-cookie file (optional).", - "transform": [ - "trim" - ] - } - }, - "title": "Load cookie (detailed)" - } - } - }, - "examples": [ - "session_token", - "./test-data/auth-session.txt", - "test_env_cookie", - { - "name": "auth_cookie", - "variable": "AUTH_COOKIE" - }, - { - "name": "test_cookie", - "path": "test-cookie.txt" - }, - { - "name": "session_token", - "path": "session-token.txt", - "directory": "./test-data" - }, - { - "name": "user_session", - "path": "saved-cookies.txt", - "domain": "app.example.com" - } - ] - } - } - } - ] - }, - { - "allOf": [ - { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { - "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - }, - "title": "Common" - }, - { - "title": "wait", - "type": "object", - "required": [ - "wait" - ], - "properties": { - "wait": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "wait", - "description": "Pause (in milliseconds) before performing the next action.", - "default": 5000, - "anyOf": [ - { - "type": "number", - "title": "Wait (simple)" - }, - { - "title": "Wait (environment variable)", - "type": "string", - "pattern": "(\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - { - "type": "boolean", - "title": "Wait (boolean)" - } - ], - "components": { - "schemas": { - "string": { - "title": "Wait (environment variable)", - "type": "string", - "pattern": "(\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - } - } - }, - "examples": [ - 5000, - "$WAIT_DURATION", - true - ] - } - } - } - ] - } - ], - "examples": [ - { - "stepId": "uuid", - "description": "Description of the step.", - "checkLink": "https://www.google.com", - "outputs": { - "outputKey": "outputValue" - }, - "variables": { - "variableKey": "variableValue" - } - }, - { - "checkLink": "https://www.google.com" - }, - { - "stepId": "path-only", - "checkLink": "/search" - }, - { - "stepId": "status-code", - "checkLink": { - "url": "https://www.google.com", - "statusCodes": [ - 200 - ] - } - }, - { - "goTo": { - "url": "https://www.google.com" - } - }, - { - "goTo": "https://www.google.com" - }, - { - "wait": 5000 - }, - { - "runCode": { - "language": "python", - "code": "print('Hello from Python')", - "workingDirectory": ".", - "exitCodes": [ - 0 - ], - "stdio": "Hello from Python!", - "path": "python-output.txt", - "directory": "output", - "maxVariation": 0.1, - "overwrite": "aboveVariation" - } - }, - { - "stopRecord": true - }, - { - "screenshot": true - }, - { - "screenshot": "image.png" - }, - { - "screenshot": "static/images/image.png" - }, - { - "screenshot": "/User/manny/projects/doc-detective/static/images/image.png" - }, - { - "screenshot": { - "path": "image.png", - "directory": "static/images", - "maxVariation": 0.1, - "overwrite": "aboveVariation", - "crop": "#elementToScreenshot" - } - }, - { - "screenshot": { - "path": "image.png", - "directory": "static/images", - "maxVariation": 0.1, - "overwrite": "aboveVariation" - } - }, - { - "screenshot": { - "path": "image.png", - "directory": "static/images", - "maxVariation": 0.1, - "overwrite": "aboveVariation", - "crop": { - "selector": "#elementToScreenshot", - "elementText": "Element text", - "padding": { - "top": 0, - "right": 0, - "bottom": 0, - "left": 0 - } - } - } - }, - { - "record": true - }, - { - "record": "video.mp4" - }, - { - "record": "static/media/video.mp4" - }, - { - "record": "/User/manny/projects/doc-detective/static/media/video.mp4" - }, - { - "record": { - "path": "video.mp4", - "directory": "static/media", - "overwrite": true - } - }, - { - "loadVariables": "variables.env" - }, - { - "saveCookie": "session_token" - }, - { - "saveCookie": { - "name": "auth_cookie", - "path": "auth-session.txt", - "directory": "./test-data", - "overwrite": true - } - }, - { - "loadCookie": "session_token" - }, - { - "loadCookie": { - "name": "auth_cookie", - "path": "auth-session.txt", - "directory": "./test-data" - } - }, - { - "find": "Find me!" - }, - { - "find": { - "selector": "[title=Search]" - } - }, - { - "find": { - "selector": "[title=Search]", - "timeout": 10000, - "elementText": "Search", - "moveTo": true, - "click": true, - "type": "shorthair cat" - } - }, - { - "find": { - "selector": "[title=Search]", - "click": { - "button": "right" - } - } - }, - { - "find": { - "selector": "[title=Search]", - "timeout": 10000, - "elementText": "Search", - "moveTo": true, - "click": true, - "type": { - "keys": [ - "shorthair cat" - ], - "inputDelay": 100 - } - } - }, - { - "click": true - }, - { - "click": "right" - }, - { - "click": { - "button": "left", - "elementText": "Element text" - } - }, - { - "click": { - "selector": "#elementToScreenshot", - "elementText": "Element text", - "button": "middle" - } - }, - { - "httpRequest": "https://reqres.in/api/users" - }, - { - "httpRequest": { - "url": "https://reqres.in/api/users" - } - }, - { - "httpRequest": { - "url": "https://reqres.in/api/users/2", - "method": "put", - "request": { - "body": { - "name": "morpheus", - "job": "zion resident" - } - } - } - }, - { - "httpRequest": { - "url": "https://reqres.in/api/users", - "method": "post", - "request": { - "body": { - "name": "morpheus", - "job": "leader" - } - }, - "response": { - "body": { - "name": "morpheus", - "job": "leader" - } - }, - "statusCodes": [ - 200, - 201 - ] - } - }, - { - "httpRequest": { - "url": "https://www.api-server.com", - "method": "post", - "timeout": 30000, - "request": { - "body": { - "field": "value" - }, - "headers": { - "header": "value" - }, - "parameters": { - "param": "value" - } - }, - "response": { - "body": { - "field": "value" - }, - "headers": { - "header": "value" - } - }, - "statusCodes": [ - 200 - ] - } - }, - { - "httpRequest": { - "url": "https://reqres.in/api/users", - "method": "post", - "request": { - "body": { - "name": "morpheus", - "job": "leader" - } - }, - "response": { - "body": { - "name": "morpheus", - "job": "leader" - } - }, - "statusCodes": [ - 200, - 201 - ], - "path": "response.json", - "directory": "media", - "maxVariation": 0.05, - "overwrite": "aboveVariation" - } - }, - { - "httpRequest": { - "openApi": "getUserById" - } - }, - { - "httpRequest": { - "openApi": { - "name": "Reqres", - "operationId": "getUserById" - }, - "request": { - "parameters": { - "id": 123 - } - } - } - }, - { - "httpRequest": { - "openApi": { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "getUserById" - }, - "request": { - "parameters": { - "id": 123 - } - } - } - }, - { - "httpRequest": { - "openApi": { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both" - } - } - }, - { - "httpRequest": { - "openApi": { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "updateUser", - "useExample": "request", - "exampleKey": "acme" - } - } - }, - { - "httpRequest": { - "openApi": { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "updateUser", - "useExample": "request", - "exampleKey": "acme", - "headers": { - "Authorization": "Bearer $TOKEN" - } - } - } - }, - { - "stepId": "breakpoint-example", - "description": "Step with breakpoint enabled", - "goTo": "https://www.example.com", - "breakpoint": true - }, - { - "checkLink": "https://www.google.com", - "breakpoint": false - }, - { - "dragAndDrop": { - "source": { - "selector": "#sourceElement" - }, - "target": { - "selector": "#targetElement" - } - } - } - ] - } - ] - } - } - ] - } - }, - "title": "Markup definition" - }, - "markupActionString": { - "type": "string", - "enum": [ - "checkLink", - "click", - "find", - "goTo", - "httpRequest", - "loadCookie", - "loadVariables", - "record", - "runCode", - "runShell", - "saveCookie", - "screenshot", - "stopRecord", - "type", - "wait" - ] - }, - "inlineStatements": { - "description": "Statements to include tests and steps inside the content of the file, such as within Markdown.", - "type": "object", - "properties": { - "testStart": { - "description": "Regular expressions that indicate the start of a test. If capture groups are used, the first capture group is used for the statement. If no capture groups are used, the entire match is used for the statement.", - "anyOf": [ - { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "minItems": 1, - "items": { - "type": "string" - } - } - ] - } - ] - }, - "testEnd": { - "description": "Regular expressions that indicate that the current test is complete.", - "anyOf": [ - { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "minItems": 1, - "items": { - "type": "string" - } - } - ] - } - ] - }, - "ignoreStart": { - "description": "Regular expressions that indicates that the following content should be ignored for testing purposes.", - "anyOf": [ - { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "minItems": 1, - "items": { - "type": "string" - } - } - ] - } - ] - }, - "ignoreEnd": { - "description": "Regular expressions that indicate that the ignored section of content is complete.", - "anyOf": [ - { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "minItems": 1, - "items": { - "type": "string" - } - } - ] - } - ] - }, - "step": { - "description": "Regular expressions that indicate a step in a test.", - "anyOf": [ - { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "minItems": 1, - "items": { - "type": "string" - } - } - ] - } - ] - } - }, - "title": "Inline statement definition" - }, - "stringOrArray": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "minItems": 1, - "items": { - "type": "string" - } - } - ] - } - } - }, - "examples": [ - {}, - { - "input": ".", - "output": ".", - "recursive": true, - "loadVariables": ".env", - "fileTypes": [ - "markdown" - ] - }, - { - "fileTypes": [ - { - "extends": "markdown", - "extensions": [ - "md", - "markdown", - "mdx" - ], - "inlineStatements": { - "testStart": "", - "testEnd": "", - "ignoreStart": "", - "ignoreEnd": "", - "step": "" - }, - "markup": [ - { - "name": "onscreenText", - "regex": "\\*\\*.+?\\*\\*", - "actions": "find" - } - ] - } - ] - }, - { - "fileTypes": [ - { - "name": "Jupyter Notebooks", - "extensions": "ipynb", - "runShell": { - "command": "jupyter", - "args": [ - "nbconvert", - "--to", - "script", - "--execute", - "$1", - "--stdout" - ] - } - }, - { - "name": "JavaScript", - "extensions": "js", - "runShell": { - "command": "node $1" - } - }, - { - "name": "Python", - "extensions": "py", - "runShell": { - "command": "python $1" - } - } - ] - }, - { - "environment": { - "platform": "windows", - "arch": "x64" - } - }, - { - "concurrentRunners": 1 - }, - { - "concurrentRunners": true - }, - { - "concurrentRunners": 4 - }, - { - "debug": false - }, - { - "debug": true - }, - { - "debug": "stepThrough" - }, - { - "integrations": { - "docDetectiveApi": { - "apiKey": "your-api-key-here" - } - } - }, - { - "crawl": true - } - ] - }, - "context_v3": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "context", - "type": "object", - "description": "A context in which to perform tests. If no contexts are specified but a context is required by one or more tests, Doc Detective attempts to identify a supported context in the current environment and run tests against it. For example, if a browser isn't specified but is required by steps in the test, Doc Detective will search for and use a supported browser available in the current environment.", - "additionalProperties": false, - "dynamicDefaults": { - "contextId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/context_v3.schema.json" - ] - }, - "contextId": { - "type": "string", - "description": "Unique identifier for the context." - }, - "platforms": { - "description": "Platforms to run tests on.", - "anyOf": [ - { - "type": "string", - "enum": [ - "linux", - "mac", - "windows" - ] - }, - { - "type": "array", - "items": { - "type": "string", - "enum": [ - "linux", - "mac", - "windows" - ] - } - } - ] - }, - "browsers": { - "description": "Browsers to run tests on.", - "anyOf": [ - { - "type": "string", - "description": "Name of the browser.", - "enum": [ - "chrome", - "firefox", - "safari", - "webkit" - ], - "$comment": "`safari` is just a shortcut for `webkit`. Included for visibility and to reduce questions." - }, - { - "type": "object", - "description": "Browser configuration.", - "required": [ - "name" - ], - "additionalProperties": false, - "properties": { - "name": { - "type": "string", - "description": "Name of the browser.", - "enum": [ - "chrome", - "firefox", - "safari", - "webkit" - ], - "$comment": "`safari` is just a shortcut for `webkit`. Included for visibility and to reduce questions." - }, - "headless": { - "type": "boolean", - "description": "If `true`, runs the browser in headless mode.", - "default": true - }, - "window": { - "type": "object", - "description": "Browser dimensions.", - "additionalProperties": false, - "properties": { - "width": { - "type": "integer", - "description": "Width of the browser window in pixels." - }, - "height": { - "type": "integer", - "description": "Height of the browser window in pixels." - } - }, - "title": "Browser Window" - }, - "viewport": { - "type": "object", - "description": "Viewport dimensions.", - "additionalProperties": false, - "properties": { - "width": { - "type": "integer", - "description": "Width of the viewport in pixels." - }, - "height": { - "type": "integer", - "description": "Height of the viewport in pixels." - } - }, - "title": "Browser Viewport" - } - }, - "title": "Browser" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string", - "description": "Name of the browser.", - "enum": [ - "chrome", - "firefox", - "safari", - "webkit" - ], - "$comment": "`safari` is just a shortcut for `webkit`. Included for visibility and to reduce questions." - }, - { - "type": "object", - "description": "Browser configuration.", - "required": [ - "name" - ], - "additionalProperties": false, - "properties": { - "name": { - "type": "string", - "description": "Name of the browser.", - "enum": [ - "chrome", - "firefox", - "safari", - "webkit" - ], - "$comment": "`safari` is just a shortcut for `webkit`. Included for visibility and to reduce questions." - }, - "headless": { - "type": "boolean", - "description": "If `true`, runs the browser in headless mode.", - "default": true - }, - "window": { - "type": "object", - "description": "Browser dimensions.", - "additionalProperties": false, - "properties": { - "width": { - "type": "integer", - "description": "Width of the browser window in pixels." - }, - "height": { - "type": "integer", - "description": "Height of the browser window in pixels." - } - }, - "title": "Browser Window" - }, - "viewport": { - "type": "object", - "description": "Viewport dimensions.", - "additionalProperties": false, - "properties": { - "width": { - "type": "integer", - "description": "Width of the viewport in pixels." - }, - "height": { - "type": "integer", - "description": "Height of the viewport in pixels." - } - }, - "title": "Browser Viewport" - } - }, - "title": "Browser" - } - ] - } - } - ] - } - }, - "components": { - "schemas": { - "platform": { - "type": "string", - "enum": [ - "linux", - "mac", - "windows" - ] - }, - "browserName": { - "type": "string", - "description": "Name of the browser.", - "enum": [ - "chrome", - "firefox", - "safari", - "webkit" - ], - "$comment": "`safari` is just a shortcut for `webkit`. Included for visibility and to reduce questions." - }, - "browser": { - "type": "object", - "description": "Browser configuration.", - "required": [ - "name" - ], - "additionalProperties": false, - "properties": { - "name": { - "type": "string", - "description": "Name of the browser.", - "enum": [ - "chrome", - "firefox", - "safari", - "webkit" - ], - "$comment": "`safari` is just a shortcut for `webkit`. Included for visibility and to reduce questions." - }, - "headless": { - "type": "boolean", - "description": "If `true`, runs the browser in headless mode.", - "default": true - }, - "window": { - "type": "object", - "description": "Browser dimensions.", - "additionalProperties": false, - "properties": { - "width": { - "type": "integer", - "description": "Width of the browser window in pixels." - }, - "height": { - "type": "integer", - "description": "Height of the browser window in pixels." - } - }, - "title": "Browser Window" - }, - "viewport": { - "type": "object", - "description": "Viewport dimensions.", - "additionalProperties": false, - "properties": { - "width": { - "type": "integer", - "description": "Width of the viewport in pixels." - }, - "height": { - "type": "integer", - "description": "Height of the viewport in pixels." - } - }, - "title": "Browser Viewport" - } - }, - "title": "Browser" - } - } - }, - "examples": [ - { - "platforms": "linux", - "browsers": "chrome" - }, - { - "platforms": [ - "windows", - "mac", - "linux" - ], - "browsers": [ - "chrome", - "firefox", - "webkit" - ] - }, - { - "browsers": { - "name": "chrome", - "headless": true - } - }, - { - "browsers": [ - { - "name": "chrome", - "headless": true - }, - { - "name": "firefox" - } - ] - }, - { - "platforms": [ - "mac", - "linux" - ], - "browsers": { - "name": "chrome", - "headless": true - } - }, - { - "platforms": [ - "windows", - "mac", - "linux" - ], - "browsers": [ - { - "name": "chrome", - "headless": true, - "window": { - "width": 1920, - "height": 1080 - }, - "viewport": { - "width": 1600, - "height": 900 - } - }, - { - "name": "firefox", - "window": { - "width": 1366, - "height": 768 - } - }, - { - "name": "webkit", - "headless": false, - "viewport": { - "width": 1440, - "height": 900 - } - } - ] - }, - { - "platforms": "mac", - "browsers": [ - { - "name": "safari", - "window": { - "width": 1280, - "height": 800 - } - } - ] - } - ] - }, - "dragAndDrop_v3": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "dragAndDrop", - "description": "Drag and drop an element from source to target.", - "type": "object", - "required": [ - "source", - "target" - ], - "properties": { - "source": { - "description": "The element to drag.", - "anyOf": [ - { - "title": "Element (simple)", - "type": "string", - "description": "Display text, selector, or regex pattern (enclosed in forward slashes) of the element." - }, - { - "title": "Element (detailed)", - "type": "object", - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "properties": { - "elementText": { - "type": "string", - "description": "Display text or regex pattern (enclosed in forward slashes) of the element. If combined with `selector`, the element must match both the text and the selector." - }, - "selector": { - "type": "string", - "description": "Selector of the element. If combined with `elementText`, the element must match both the text and the selector." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - }, - "timeout": { - "type": "integer", - "description": "Max duration in milliseconds to wait for the element to exist.", - "default": 5000 - } - } - } - ] - }, - "target": { - "description": "The target location to drop the element.", - "anyOf": [ - { - "title": "Element (simple)", - "type": "string", - "description": "Display text, selector, or regex pattern (enclosed in forward slashes) of the element." - }, - { - "title": "Element (detailed)", - "type": "object", - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "properties": { - "elementText": { - "type": "string", - "description": "Display text or regex pattern (enclosed in forward slashes) of the element. If combined with `selector`, the element must match both the text and the selector." - }, - "selector": { - "type": "string", - "description": "Selector of the element. If combined with `elementText`, the element must match both the text and the selector." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - }, - "timeout": { - "type": "integer", - "description": "Max duration in milliseconds to wait for the element to exist.", - "default": 5000 - } - } - } - ] - }, - "duration": { - "type": "integer", - "description": "Duration of the drag operation in milliseconds.", - "default": 1000, - "minimum": 0 - } - }, - "components": { - "schemas": { - "elementSpecification": { - "anyOf": [ - { - "title": "Element (simple)", - "type": "string", - "description": "Display text, selector, or regex pattern (enclosed in forward slashes) of the element." - }, - { - "title": "Element (detailed)", - "type": "object", - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "properties": { - "elementText": { - "type": "string", - "description": "Display text or regex pattern (enclosed in forward slashes) of the element. If combined with `selector`, the element must match both the text and the selector." - }, - "selector": { - "type": "string", - "description": "Selector of the element. If combined with `elementText`, the element must match both the text and the selector." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - }, - "timeout": { - "type": "integer", - "description": "Max duration in milliseconds to wait for the element to exist.", - "default": 5000 - } - } - } - ] - }, - "string": { - "title": "Element (simple)", - "type": "string", - "description": "Display text, selector, or regex pattern (enclosed in forward slashes) of the element." - }, - "object": { - "title": "Element (detailed)", - "type": "object", - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "properties": { - "elementText": { - "type": "string", - "description": "Display text or regex pattern (enclosed in forward slashes) of the element. If combined with `selector`, the element must match both the text and the selector." - }, - "selector": { - "type": "string", - "description": "Selector of the element. If combined with `elementText`, the element must match both the text and the selector." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - }, - "timeout": { - "type": "integer", - "description": "Max duration in milliseconds to wait for the element to exist.", - "default": 5000 - } - } - } - } - }, - "examples": [ - { - "source": "Table", - "target": "#canvas" - }, - { - "source": ".draggable-block", - "target": ".drop-zone", - "duration": 2000 - }, - { - "source": { - "selector": ".widget", - "elementText": "Data Table" - }, - "target": { - "selector": "#design-canvas" - }, - "duration": 500 - }, - { - "source": { - "selector": ".draggable", - "timeout": 10000 - }, - "target": { - "elementText": "Drop Zone", - "timeout": 5000 - } - }, - { - "source": "/Widget Item.*/", - "target": "#canvas" - }, - { - "source": { - "selector": ".draggable", - "elementText": "/Button [0-9]+/" - }, - "target": { - "elementText": "/Drop Zone.*/" - } - } - ] - }, - "find_v3": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "find", - "description": "Find an element based on display text or a selector, then optionally interact with it.", - "anyOf": [ - { - "title": "Find element (simple)", - "type": "string", - "description": "Identifier for the element to find. Can be a selector, element text, ARIA name, ID, or test ID." - }, - { - "title": "Find element (detailed)", - "type": "object", - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "additionalProperties": false, - "properties": { - "elementText": { - "type": "string", - "description": "Display text of the element to find. If combined with other element finding fields, the element must match all specified criteria." - }, - "selector": { - "type": "string", - "description": "Selector of the element to find. If combined with other element finding fields, the element must match all specified criteria." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - }, - "timeout": { - "type": "integer", - "description": "Max duration in milliseconds to wait for the element to exist.", - "default": 5000 - }, - "moveTo": { - "description": "Move to the element. If the element isn't visible, it's scrolled into view.", - "type": "boolean", - "default": true - }, - "click": { - "description": "Click the element.", - "anyOf": [ - { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "click", - "description": "Click or tap an element.", - "anyOf": [ - { - "title": "Click element (simple)", - "type": "string", - "description": "Identifier for the element to click. Can be a selector, element text, ARIA name, ID, or test ID." - }, - { - "title": "Click element (detailed)", - "type": "object", - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "properties": { - "button": { - "description": "Kind of click to perform.", - "type": "string", - "enum": [ - "left", - "right", - "middle" - ] - }, - "elementText": { - "type": "string", - "description": "Display text of the element to click. If combined with other element finding fields, the element must match all specified criteria." - }, - "selector": { - "type": "string", - "description": "Selector of the element to click. If combined with other element finding fields, the element must match all specified criteria." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to click. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to click. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" + { + "type": "number" }, { "type": "boolean" @@ -22850,656 +13295,6 @@ } } ], - "components": { - "schemas": { - "string": { - "title": "Find element (simple)", - "type": "string", - "description": "Identifier for the element to find. Can be a selector, element text, ARIA name, ID, or test ID." - }, - "object": { - "title": "Find element (detailed)", - "type": "object", - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "additionalProperties": false, - "properties": { - "elementText": { - "type": "string", - "description": "Display text of the element to find. If combined with other element finding fields, the element must match all specified criteria." - }, - "selector": { - "type": "string", - "description": "Selector of the element to find. If combined with other element finding fields, the element must match all specified criteria." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - }, - "timeout": { - "type": "integer", - "description": "Max duration in milliseconds to wait for the element to exist.", - "default": 5000 - }, - "moveTo": { - "description": "Move to the element. If the element isn't visible, it's scrolled into view.", - "type": "boolean", - "default": true - }, - "click": { - "description": "Click the element.", - "anyOf": [ - { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "click", - "description": "Click or tap an element.", - "anyOf": [ - { - "title": "Click element (simple)", - "type": "string", - "description": "Identifier for the element to click. Can be a selector, element text, ARIA name, ID, or test ID." - }, - { - "title": "Click element (detailed)", - "type": "object", - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "properties": { - "button": { - "description": "Kind of click to perform.", - "type": "string", - "enum": [ - "left", - "right", - "middle" - ] - }, - "elementText": { - "type": "string", - "description": "Display text of the element to click. If combined with other element finding fields, the element must match all specified criteria." - }, - "selector": { - "type": "string", - "description": "Selector of the element to click. If combined with other element finding fields, the element must match all specified criteria." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to click. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to click. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - } - } - }, - { - "type": "boolean" - } - ], - "components": { - "schemas": { - "string": { - "title": "Click element (simple)", - "type": "string", - "description": "Identifier for the element to click. Can be a selector, element text, ARIA name, ID, or test ID." - }, - "button": { - "description": "Kind of click to perform.", - "type": "string", - "enum": [ - "left", - "right", - "middle" - ] - }, - "object": { - "title": "Click element (detailed)", - "type": "object", - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "properties": { - "button": { - "description": "Kind of click to perform.", - "type": "string", - "enum": [ - "left", - "right", - "middle" - ] - }, - "elementText": { - "type": "string", - "description": "Display text of the element to click. If combined with other element finding fields, the element must match all specified criteria." - }, - "selector": { - "type": "string", - "description": "Selector of the element to click. If combined with other element finding fields, the element must match all specified criteria." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to click. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to click. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - } - } - } - } - }, - "examples": [ - true, - "right", - { - "button": "left", - "elementText": "Element text" - }, - { - "selector": "#elementToScreenshot", - "elementText": "Element text", - "button": "middle" - } - ] - }, - { - "type": "object", - "properties": { - "button": { - "description": "Kind of click to perform.", - "type": "string", - "enum": [ - "left", - "right", - "middle" - ] - } - }, - "title": "Find element and click" - } - ] - }, - "type": { - "description": "Type keys after finding the element. Either a string or an object with a `keys` field as defined in [`type`](type). To type in the element, make the element active with the `click` parameter.", - "allOf": [ - { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "typeKeys", - "description": "Type keys. To type special keys, begin and end the string with `$` and use the special key's keyword. For example, to type the Escape key, enter `$ESCAPE$`.", - "anyOf": [ - { - "title": "Type keys (simple)", - "description": "Sequence of keys to enter.", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - } - ] - } - } - ] - }, - { - "title": "Type keys (detailed)", - "type": "object", - "properties": { - "keys": { - "title": "Type keys (simple)", - "description": "Sequence of keys to enter.", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - } - ] - } - } - ] - }, - "inputDelay": { - "type": "number", - "description": "Delay in milliseconds between each key press during a recording", - "default": 100 - }, - "selector": { - "type": "string", - "description": "Selector for the element to type into. If not specified, the typing occurs in the active element." - }, - "elementText": { - "type": "string", - "description": "Display text of the element to type into. If combined with other element finding fields, the element must match all specified criteria." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - } - }, - "required": [ - "keys" - ], - "additionalProperties": false - } - ], - "components": { - "schemas": { - "keys": { - "title": "Type keys (simple)", - "description": "Sequence of keys to enter.", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - } - ] - } - } - ] - }, - "object": { - "title": "Type keys (detailed)", - "type": "object", - "properties": { - "keys": { - "title": "Type keys (simple)", - "description": "Sequence of keys to enter.", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - } - ] - } - } - ] - }, - "inputDelay": { - "type": "number", - "description": "Delay in milliseconds between each key press during a recording", - "default": 100 - }, - "selector": { - "type": "string", - "description": "Selector for the element to type into. If not specified, the typing occurs in the active element." - }, - "elementText": { - "type": "string", - "description": "Display text of the element to type into. If combined with other element finding fields, the element must match all specified criteria." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - } - }, - "required": [ - "keys" - ], - "additionalProperties": false - } - } - }, - "examples": [ - "kittens", - [ - "$ENTER$" - ], - [ - "kittens", - "$ENTER$" - ], - { - "keys": "kittens" - }, - { - "keys": [ - "$ENTER$" - ] - }, - { - "keys": [ - "kittens", - "$ENTER$" - ], - "inputDelay": 500 - } - ] - }, - { - "not": { - "type": "object", - "required": [ - "selector", - "elementText", - "elementId", - "elementTestId", - "elementClass", - "elementAttribute", - "elementAria" - ], - "title": "Find element and type" - } - } - ] - } - } - } - } - }, "examples": [ "Find me!", { @@ -23721,179 +13516,6 @@ "title": "Go to URL (detailed)" } ], - "components": { - "schemas": { - "string": { - "title": "Go to URL (simple)", - "description": "Navigate to an HTTP or HTTPS URL. Can be a full URL or a path. If a path is provided, navigates relative to the current URL, if any.", - "type": "string", - "pattern": "(^(http://|https://|/).*|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - "object": { - "description": "Navigate to an HTTP or HTTPS URL.", - "type": "object", - "additionalProperties": false, - "required": [ - "url" - ], - "properties": { - "url": { - "type": "string", - "description": "URL to navigate to. Can be a full URL or a path. If a path is provided and `origin` is specified, prepends `origin` to `url`. If a path is provided but `origin` isn't specified, attempts to navigate relative to the current URL, if any.", - "pattern": "(^(http://|https://|/).*|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - "origin": { - "type": "string", - "description": "Protocol and domain to navigate to. Prepended to `url`.", - "transform": [ - "trim" - ] - }, - "timeout": { - "type": "integer", - "description": "Maximum time in milliseconds to wait for the page to be ready. If exceeded, the goTo action fails.", - "default": 30000, - "minimum": 0 - }, - "waitUntil": { - "type": "object", - "description": "Configuration for waiting conditions after navigation.", - "additionalProperties": false, - "properties": { - "networkIdleTime": { - "description": "Wait for network activity to be idle (no new requests) for this duration in milliseconds. Set to `null` to skip this check.", - "anyOf": [ - { - "type": "integer", - "minimum": 0 - }, - { - "type": "null" - } - ], - "default": 500 - }, - "domIdleTime": { - "description": "Wait for DOM mutations to stop for this duration in milliseconds. Set to `null` to skip this check.", - "anyOf": [ - { - "type": "integer", - "minimum": 0 - }, - { - "type": "null" - } - ], - "default": 1000 - }, - "find": { - "type": "object", - "description": "Wait for a specific element to be present in the DOM. At least one of selector or elementText must be specified.", - "additionalProperties": false, - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "properties": { - "selector": { - "type": "string", - "description": "CSS selector for the element to wait for." - }, - "elementText": { - "type": "string", - "description": "Text content the element must contain. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - } - } - } - } - } - }, - "title": "Go to URL (detailed)" - } - } - }, "examples": [ "https://www.google.com", "/search", @@ -24069,107 +13691,6 @@ "title": "Load cookie (detailed)" } ], - "components": { - "schemas": { - "string": { - "type": "string", - "title": "Cookie name or file path", - "description": "Name of the specific cookie to load from default location, or file path to cookie file.", - "pattern": "^[A-Za-z0-9_./\\-]+$", - "transform": [ - "trim" - ] - }, - "object": { - "type": "object", - "additionalProperties": false, - "required": [ - "name" - ], - "anyOf": [ - { - "required": [ - "path" - ], - "not": { - "required": [ - "variable" - ] - } - }, - { - "required": [ - "variable" - ], - "not": { - "anyOf": [ - { - "required": [ - "path" - ] - }, - { - "required": [ - "directory" - ] - } - ] - } - } - ], - "properties": { - "$schema": { - "description": "Optional self-describing schema URI for linters", - "type": "string", - "format": "uri-reference" - }, - "name": { - "type": "string", - "title": "Cookie name", - "description": "Name of the specific cookie to load.", - "pattern": "^[A-Za-z0-9_.-]+$", - "transform": [ - "trim" - ] - }, - "variable": { - "type": "string", - "title": "Environment variable name", - "description": "Environment variable name containing the cookie as JSON string.", - "pattern": "^[A-Za-z_][A-Za-z0-9_]*$", - "transform": [ - "trim" - ] - }, - "path": { - "type": "string", - "title": "Cookie file path", - "description": "File path to cookie file, relative to directory. Supports Netscape cookie format.", - "transform": [ - "trim" - ] - }, - "directory": { - "type": "string", - "title": "Directory path", - "description": "Directory containing the cookie file.", - "transform": [ - "trim" - ] - }, - "domain": { - "type": "string", - "title": "Cookie domain", - "description": "Specific domain to filter the cookie by when loading from multi-cookie file (optional).", - "transform": [ - "trim" - ] - } - }, - "title": "Load cookie (detailed)" - } - } - }, "examples": [ "session_token", "./test-data/auth-session.txt", @@ -24605,406 +14126,6 @@ } } ], - "components": { - "schemas": { - "url": { - "title": "HTTP request (simple)", - "type": "string", - "description": "URL for the HTTP request.", - "pattern": "(^(http://|https://).*|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - "object": { - "title": "HTTP request (detailed)", - "type": "object", - "anyOf": [ - { - "required": [ - "url" - ] - }, - { - "required": [ - "openApi" - ] - } - ], - "additionalProperties": false, - "properties": { - "url": { - "title": "HTTP request (simple)", - "type": "string", - "description": "URL for the HTTP request.", - "pattern": "(^(http://|https://).*|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - "openApi": { - "anyOf": [ - { - "allOf": [ - { - "type": "string", - "description": "ID of the operation to use for the request." - }, - { - "title": "Operation ID", - "description": "Operation ID from the OpenAPI schema. Only valid if the OpenAPI description path is specified elsewhere and the operation ID is unique among all specified OpenAPI descriptions." - } - ] - }, - { - "allOf": [ - { - "version": "1.0.0", - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "openApi", - "type": "object", - "description": "OpenAPI description and configuration.", - "additionalProperties": false, - "anyOf": [ - { - "required": [ - "descriptionPath" - ] - }, - { - "required": [ - "operationId" - ] - } - ], - "properties": { - "name": { - "type": "string", - "description": "Name of the OpenAPI description, as defined in your configuration." - }, - "descriptionPath": { - "type": "string", - "description": "URL or local path to the OpenAPI description." - }, - "definition": { - "type": "object", - "readOnly": true, - "description": "OpenAPI definition object loaded from the `descriptionPath`. This is a resolved version of the OpenAPI description and should not be user-defined.", - "additionalProperties": true, - "title": "OpenAPI definition" - }, - "operationId": { - "type": "string", - "description": "ID of the operation to use for the request." - }, - "server": { - "type": "string", - "description": "Server to use for example requests. Only valid if `useExample` is `request` or `both`. If not specified but an example is used for the request, uses the first server defined in the OpenAPI description." - }, - "validateAgainstSchema": { - "type": "string", - "description": "Validates the request and/or response against the schema in the OpenAPI description. If the request or response doesn't match the schema, the step fails.", - "enum": [ - "request", - "response", - "both", - "none" - ], - "default": "both" - }, - "mockResponse": { - "type": "boolean", - "description": "If `true`, doesn't make the HTTP request, but instead uses the response example or schema from the OpenAPI description as the response data. Useful for creating tests when an API isn't fully implemented yet. If `statusCode` isn't specified, uses the first defined response code." - }, - "statusCode": { - "type": "integer", - "description": "Response code to use for validation, examples, and status code checking. If the response code doesn't match, the step fails. `statusCodes` overrides this value when specified." - }, - "useExample": { - "type": [ - "string" - ], - "description": "Uses the example from the OpenAPI description as the request and response data. If the request or response has multiple examples, specify `exampleKey`. If `statusCode` isn't specified, uses the first defined response code. `requestData`, `requestParams`, and `requestHeaders` override portions of request examples when specified. `responseData` overrides portions of response examples when specified.", - "enum": [ - "request", - "response", - "both", - "none" - ], - "default": "none" - }, - "exampleKey": { - "type": "string", - "description": "Key of the example to use from the `examples` property in the OpenAPI description. If an `examples` key isn't specified or isn't available for a given parameter or object, the `example` property value is used.", - "default": "" - }, - "headers": { - "type": "object", - "description": "Request headers to add to requests. For example, to set `Authorization` headers for all requests from the specified OpenAPI document. If specified in both a config and a step, the step value overrides the config value.", - "additionalProperties": { - "type": "string" - }, - "title": "OpenAPI request headers" - } - }, - "components": { - "schemas": { - "operationId": { - "type": "string", - "description": "ID of the operation to use for the request." - }, - "descriptionPath": { - "type": "string", - "description": "URL or local path to the OpenAPI description." - } - } - }, - "examples": [ - { - "descriptionPath": "https://petstore.swagger.io/v2/swagger.json" - }, - { - "name": "Reqres", - "operationId": "getUserById" - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "getUserById" - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both" - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both", - "exampleKey": "example1" - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both", - "exampleKey": "example1", - "statusCode": 201 - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both", - "exampleKey": "example1", - "statusCode": 201, - "validateAgainstSchema": "none" - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both", - "exampleKey": "example1", - "statusCode": 201, - "validateAgainstSchema": "none", - "mockResponse": true - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both", - "exampleKey": "example1", - "statusCode": 201, - "validateAgainstSchema": "none", - "mockResponse": true, - "headers": { - "Authorization": "Bearer 12345" - } - } - ] - }, - { - "type": "object", - "required": [ - "operationId" - ], - "title": "OpenAPI definition (httpRequest)" - } - ] - } - ] - }, - "statusCodes": { - "description": "Accepted status codes. If the specified URL returns a code other than what is specified here, the action fails.", - "type": "array", - "items": { - "anyOf": [ - { - "type": "integer" - } - ] - }, - "default": [ - 200, - 201 - ] - }, - "method": { - "type": "string", - "description": "Method of the HTTP request", - "enum": [ - "get", - "put", - "post", - "patch", - "delete" - ], - "transform": [ - "trim", - "toEnumCase" - ], - "default": "get" - }, - "timeout": { - "type": "integer", - "description": "Timeout for the HTTP request, in milliseconds.", - "default": 60000 - }, - "request": { - "type": "object", - "additionalProperties": false, - "properties": { - "headers": { - "description": "Headers to include in the HTTP request.", - "default": {}, - "anyOf": [ - { - "title": "Request headers (object)", - "description": "Headers to include in the HTTP request, in key/value format.", - "type": "object", - "additionalProperties": true, - "properties": {} - }, - { - "title": "Request headers (string)", - "description": "Headers to include in the HTTP request, as return-separated values. For example, `Content-Type: application/json\nAuthorization: Bearer token`.", - "type": "string" - } - ] - }, - "parameters": { - "description": "URL parameters to include in the HTTP request, in key/value format.", - "type": "object", - "additionalProperties": true, - "default": {}, - "properties": {}, - "title": "Request parameters" - }, - "body": { - "description": "The body of the HTTP request.", - "anyOf": [ - { - "title": "Request body (object)", - "description": "JSON object to include as the body of the HTTP request.", - "type": "object", - "additionalProperties": true, - "properties": {} - }, - { - "title": "Request body (array)", - "description": "JSON array to include as the body of the HTTP request.", - "type": "array", - "items": {} - }, - { - "title": "Request body (string)", - "description": "String to include as the body of the HTTP request.", - "type": "string" - } - ], - "default": {} - } - }, - "title": "Request" - }, - "response": { - "type": "object", - "additionalProperties": false, - "properties": { - "headers": { - "description": "Headers expected in the response, in key/value format. If one or more `responseHeaders` entries aren't present in the response, the step fails.", - "type": "object", - "additionalProperties": true, - "properties": {}, - "default": {}, - "title": "Response headers" - }, - "body": { - "description": "JSON object expected in the response. If one or more key/value pairs aren't present in the response, the step fails.", - "anyOf": [ - { - "type": "object", - "additionalProperties": true, - "properties": {}, - "title": "Response body object", - "description": "JSON key/value pairs expected in the response." - }, - { - "title": "Response body array", - "description": "JSON array expected in the response.", - "type": "array", - "items": {} - }, - { - "title": "Response body string", - "description": "String expected in the response.", - "type": "string" - } - ], - "default": {} - }, - "required": { - "type": "array", - "description": "Array of field paths that must exist in the response body. Uses dot notation for nested fields (e.g., 'user.name') and bracket notation for array indices (e.g., 'items[0].id'). Fields must be present but may have any value including null.", - "items": { - "type": "string" - }, - "default": [] - } - }, - "title": "Response" - }, - "allowAdditionalFields": { - "type": "boolean", - "description": "If `false`, the step fails when the response data contains fields not specified in the response body.", - "default": true - }, - "path": { - "type": "string", - "description": "File path to save the command's output, relative to `directory`. Specify a file extension that matches the expected response type, such as `.json` for JSON content or `.txt` for strings." - }, - "directory": { - "type": "string", - "description": "Directory to save the command's output. If the directory doesn't exist, creates the directory. If not specified, the directory is your media directory." - }, - "maxVariation": { - "type": "number", - "description": "Allowed variation in percentage of text different between the current output and previously saved output. If the difference between the current output and the previous output is greater than `maxVariation`, the step fails. If output doesn't exist at `path`, this value is ignored.", - "default": 0, - "minimum": 0, - "maximum": 1 - }, - "overwrite": { - "type": "string", - "description": "If `true`, overwrites the existing output at `path` if it exists.\nIf `aboveVariation`, overwrites the existing output at `path` if the difference between the new output and the existing output is greater than `maxVariation`.", - "enum": [ - "true", - "false", - "aboveVariation" - ], - "default": "aboveVariation" - } - } - } - } - }, "examples": [ "https://reqres.in/api/users", { @@ -25286,18 +14407,6 @@ "title": "OpenAPI request headers" } }, - "components": { - "schemas": { - "operationId": { - "type": "string", - "description": "ID of the operation to use for the request." - }, - "descriptionPath": { - "type": "string", - "description": "URL or local path to the OpenAPI description." - } - } - }, "examples": [ { "descriptionPath": "https://petstore.swagger.io/v2/swagger.json" @@ -25408,48 +14517,6 @@ "description": "If `true`, records the current browser viewport. If `false`, doesn't record the current browser viewport." } ], - "components": { - "schemas": { - "string": { - "title": "Record (simple)", - "type": "string", - "description": "File path of the recording. Supports the `.mp4`, `.webm`, and `.gif` extensions. If not specified, the file name is the ID of the step, and the extension is `.mp4`.", - "pattern": "([A-Za-z0-9_-]*\\.(mp4|webm|gif)$|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - "object": { - "type": "object", - "properties": { - "path": { - "type": "string", - "description": "File path of the recording. Supports the `.mp4`, `.webm`, and `.gif` extensions. If not specified, the file name is the ID of the step, and the extension is `.mp4`.", - "pattern": "([A-Za-z0-9_-]*\\.(mp4|webm|gif)$|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - "directory": { - "type": "string", - "description": "Directory of the file. If the directory doesn't exist, creates the directory.", - "transform": [ - "trim" - ] - }, - "overwrite": { - "type": "string", - "description": "If `true`, overwrites the existing recording at `path` if it exists.", - "enum": [ - "true", - "false" - ] - } - }, - "title": "Record (detailed)" - } - } - }, "examples": [ true, "results.mp4", @@ -31287,6 +20354,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -31466,16 +20537,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -31518,6 +20589,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -31693,8 +20767,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -31711,7 +20795,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -31873,16 +20957,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -31925,6 +21009,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -32100,8 +21187,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -32118,7 +21215,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -32650,6 +21747,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -32829,16 +21930,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -32881,6 +21982,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -33056,8 +22160,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -33074,7 +22188,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -33236,16 +22350,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -33288,6 +22402,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -33463,8 +22580,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -33481,7 +22608,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -41579,6 +30706,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -41758,16 +30889,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -41810,6 +30941,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -41985,8 +31119,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -42003,7 +31147,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -42165,16 +31309,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -42217,6 +31361,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -42392,8 +31539,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -42410,7 +31567,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -42942,6 +32099,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -43121,16 +32282,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -43173,6 +32334,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -43348,8 +32512,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -43366,7 +32540,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -43528,16 +32702,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -43580,6 +32754,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -43755,8 +32932,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -43773,7 +32960,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -52640,6 +41827,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -52819,16 +42010,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -52871,6 +42062,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -53046,8 +42240,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -53064,7 +42268,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -53226,16 +42430,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -53278,6 +42482,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -53453,8 +42660,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -53471,7 +42688,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -54003,6 +43220,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -54182,16 +43403,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -54234,6 +43455,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -54409,8 +43633,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -54427,7 +43661,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -54589,16 +43823,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -54641,6 +43875,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -54816,8 +44053,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -54834,7 +44081,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -62501,6 +51748,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -62680,16 +51931,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -62732,6 +51983,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -62907,8 +52161,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -62925,7 +52189,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -63087,16 +52351,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -63139,6 +52403,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -63314,8 +52581,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -63332,7 +52609,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -63864,6 +53141,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -64043,16 +53324,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -64095,6 +53376,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -64270,8 +53554,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -64288,7 +53582,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -64450,16 +53744,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -64502,6 +53796,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -64677,8 +53974,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -64695,7 +54002,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -74072,6 +63379,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -74251,16 +63562,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -74303,6 +63614,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -74478,8 +63792,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -74496,7 +63820,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -74658,16 +63982,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -74710,6 +64034,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -74885,8 +64212,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -74903,7 +64240,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -75435,6 +64772,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -75614,16 +64955,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -75666,6 +65007,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -75841,8 +65185,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -75859,7 +65213,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -76021,16 +65375,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -76073,6 +65427,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -76248,8 +65605,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -76266,7 +65633,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -83933,6 +73300,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -84112,16 +73483,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -84164,6 +73535,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -84339,8 +73713,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -84357,7 +73741,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -84519,16 +73903,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -84571,6 +73955,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -84746,8 +74133,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -84764,7 +74161,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -85296,6 +74693,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -85475,16 +74876,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -85527,6 +74928,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -85702,8 +75106,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -85720,7 +75134,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -85882,16 +75296,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -85934,6 +75348,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -86109,8 +75526,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -86127,7 +75554,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -89317,98 +78744,6 @@ "title": "Run code (detailed)" } ], - "components": { - "schemas": { - "object": { - "type": "object", - "required": [ - "code", - "language" - ], - "properties": { - "language": { - "type": "string", - "description": "Language of the code to run.", - "enum": [ - "python", - "bash", - "javascript" - ] - }, - "code": { - "description": "Code to run.", - "type": "string" - }, - "args": { - "type": "array", - "description": "Arguments for the command.", - "items": { - "anyOf": [ - { - "type": "string" - } - ] - }, - "default": [] - }, - "workingDirectory": { - "type": "string", - "description": "Working directory for the command.", - "default": "." - }, - "exitCodes": { - "type": "array", - "description": "Expected exit codes of the command. If the command's actual exit code isn't in this list, the step fails.", - "items": { - "anyOf": [ - { - "type": "integer" - } - ] - }, - "default": [ - 0 - ] - }, - "stdio": { - "type": "string", - "description": "Content expected in the command's output. If the expected content can't be found in the command's output (either stdout or stderr), the step fails. Supports strings and regular expressions. To use a regular expression, the string must start and end with a forward slash, like in `/^hello-world.*/`." - }, - "path": { - "type": "string", - "description": "File path to save the command's output, relative to `directory`." - }, - "directory": { - "type": "string", - "description": "Directory to save the command's output. If the directory doesn't exist, creates the directory. If not specified, the directory is your media directory." - }, - "maxVariation": { - "type": "number", - "description": "Allowed variation in percentage of text different between the current output and previously saved output. If the difference between the current output and the previous output is greater than `maxVariation`, the step fails. If output doesn't exist at `path`, this value is ignored.", - "default": 0, - "minimum": 0, - "maximum": 1 - }, - "overwrite": { - "type": "string", - "description": "If `true`, overwrites the existing output at `path` if it exists.\nIf `aboveVariation`, overwrites the existing output at `path` if the difference between the new output and the existing output is greater than `maxVariation`.", - "enum": [ - "true", - "false", - "aboveVariation" - ], - "default": "aboveVariation" - }, - "timeout": { - "type": "integer", - "description": "Max time in milliseconds the command is allowed to run. If the command runs longer than this, the step fails.", - "default": 60000 - } - }, - "title": "Run code (detailed)" - } - } - }, "examples": [ { "language": "javascript", @@ -89538,97 +78873,6 @@ "title": "Run shell command (detailed)" } ], - "components": { - "schemas": { - "string": { - "title": "Run shell command (simple)", - "description": "Command to perform in the machine's default shell.", - "type": "string", - "transform": [ - "trim" - ] - }, - "object": { - "type": "object", - "required": [ - "command" - ], - "additionalProperties": false, - "properties": { - "command": { - "type": "string", - "description": "Command to perform in the machine's default shell." - }, - "args": { - "type": "array", - "description": "Arguments for the command.", - "items": { - "anyOf": [ - { - "type": "string" - } - ] - }, - "default": [] - }, - "workingDirectory": { - "type": "string", - "description": "Working directory for the command.", - "default": "." - }, - "exitCodes": { - "type": "array", - "description": "Expected exit codes of the command. If the command's actual exit code isn't in this list, the step fails.", - "items": { - "anyOf": [ - { - "type": "integer" - } - ] - }, - "default": [ - 0 - ] - }, - "stdio": { - "type": "string", - "description": "Content expected in the command's stdout or stderr. If the expected content can't be found in the command's stdout or stderr, the step fails. Supports strings and regular expressions. To use a regular expression, the string must start and end with a forward slash, like in `/^hello-world.*/`." - }, - "path": { - "type": "string", - "description": "File path to save the command's output, relative to `directory`." - }, - "directory": { - "type": "string", - "description": "Directory to save the command's output. If the directory doesn't exist, creates the directory. If not specified, the directory is your media directory." - }, - "maxVariation": { - "type": "number", - "description": "Allowed variation in percentage of text different between the current output and previously saved output. If the difference between the current output and the previous output is greater than `maxVariation`, the step fails. If output doesn't exist at `path`, this value is ignored.", - "default": 0, - "minimum": 0, - "maximum": 1 - }, - "overwrite": { - "type": "string", - "description": "If `true`, overwrites the existing output at `path` if it exists.\nIf `aboveVariation`, overwrites the existing output at `path` if the difference between the new output and the existing output is greater than `maxVariation`.", - "enum": [ - "true", - "false", - "aboveVariation" - ], - "default": "aboveVariation" - }, - "timeout": { - "type": "integer", - "description": "Max time in milliseconds the command is allowed to run. If the command runs longer than this, the step fails.", - "default": 60000 - } - }, - "title": "Run shell command (detailed)" - } - } - }, "examples": [ "docker run hello-world", { @@ -89790,113 +79034,6 @@ "title": "Save cookie (detailed)" } ], - "components": { - "schemas": { - "string": { - "type": "string", - "title": "Cookie name", - "description": "Name of the specific cookie to save. Will be saved to a default file path or environment variable.", - "pattern": "^[A-Za-z0-9_./\\-]+$", - "transform": [ - "trim" - ] - }, - "object": { - "type": "object", - "additionalProperties": false, - "properties": { - "$schema": { - "description": "Optional self-describing schema URI for linters", - "type": "string", - "format": "uri-reference" - }, - "name": { - "type": "string", - "title": "Cookie name", - "description": "Name of the specific cookie to save.", - "pattern": "^[A-Za-z0-9_.-]+$", - "transform": [ - "trim" - ] - }, - "variable": { - "type": "string", - "title": "Environment variable name", - "description": "Environment variable name to store the cookie as JSON string.", - "pattern": "^[A-Za-z_][A-Za-z0-9_]*$", - "transform": [ - "trim" - ] - }, - "path": { - "type": "string", - "title": "Cookie file path", - "description": "File path to save the cookie, relative to directory. Uses Netscape cookie format.", - "transform": [ - "trim" - ] - }, - "directory": { - "type": "string", - "title": "Directory path", - "description": "Directory to save the cookie file. If not specified, uses output directory.", - "transform": [ - "trim" - ] - }, - "overwrite": { - "type": "boolean", - "title": "Overwrite existing file", - "description": "Whether to overwrite existing cookie file.", - "default": false - }, - "domain": { - "type": "string", - "title": "Cookie domain", - "description": "Specific domain to filter the cookie by (optional).", - "transform": [ - "trim" - ] - } - }, - "required": [ - "name" - ], - "anyOf": [ - { - "required": [ - "path" - ], - "not": { - "required": [ - "variable" - ] - } - }, - { - "required": [ - "variable" - ], - "not": { - "anyOf": [ - { - "required": [ - "path" - ] - }, - { - "required": [ - "directory" - ] - } - ] - } - } - ], - "title": "Save cookie (detailed)" - } - } - }, "examples": [ "session_token", "test_env_cookie", @@ -90343,6 +79480,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -90522,16 +79663,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -90574,6 +79715,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -90749,8 +79893,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -90767,7 +79921,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -90929,16 +80083,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -90981,962 +80135,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", - "properties": { - "radius": { - "type": "number", - "description": "Radius of the circle in pixels.", - "minimum": 1, - "default": 30 - }, - "fill": { - "type": "string", - "description": "Fill color (hex, rgb, or named color). Use 'transparent' for no fill.", - "default": "transparent" - }, - "stroke": { - "type": "string", - "description": "Border color (hex, rgb, or named color).", - "default": "#FF0000" - }, - "strokeWidth": { - "type": "number", - "description": "Border width in pixels.", - "minimum": 0, - "default": 2 - }, - "opacity": { - "type": "number", - "description": "Opacity (0-1).", - "minimum": 0, - "maximum": 1, - "default": 1 - } - } - }, - "line_properties": { - "type": "object", - "description": "Configuration for line annotations.", - "properties": { - "from": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "to": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "color": { - "type": "string", - "description": "Color of the line (hex, rgb, or named color).", - "default": "#000000" - }, - "strokeWidth": { - "type": "number", - "description": "Width of the line in pixels.", - "minimum": 1, - "default": 2 - }, - "dashArray": { - "type": "array", - "description": "Dash pattern [dash, gap]. E.g., [5, 5] for dashed line.", - "items": { - "type": "number", - "minimum": 0 - } - } - }, - "required": [ - "from", - "to" - ] - }, - "callout_properties": { - "type": "object", - "description": "Configuration for callout annotations (text with arrow).", - "properties": { - "content": { - "type": "string", - "description": "Text content to display." - }, - "target": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "textPosition": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "fontSize": { - "type": "number", - "description": "Font size in pixels.", - "minimum": 1, - "default": 14 - }, - "color": { - "type": "string", - "description": "Text color.", - "default": "#000000" - }, - "backgroundColor": { - "type": "string", - "description": "Background color for the text box.", - "default": "#FFFFCC" - }, - "arrowColor": { - "type": "string", - "description": "Color of the arrow.", - "default": "#000000" - }, - "maxWidth": { - "type": "number", - "description": "Maximum width of the text box.", - "minimum": 1 - } - }, - "required": [ - "content", - "target" - ] - }, - "highlight_properties": { - "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", - "properties": { - "color": { - "type": "string", - "description": "Highlight color (hex, rgb, or named color).", - "default": "#FFFF00" - }, - "opacity": { - "type": "number", - "description": "Opacity (0-1).", - "minimum": 0, - "maximum": 1, - "default": 0.3 - } - } - }, - "blur_properties": { - "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", - "properties": { - "intensity": { - "type": "number", - "description": "Blur intensity level.", - "minimum": 1, - "default": 10 - }, - "width": { - "type": "number", - "description": "Width of the blur area in pixels.", - "minimum": 1 - }, - "height": { - "type": "number", - "description": "Height of the blur area in pixels.", - "minimum": 1 - } - } - }, - "point": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "padding": { - "type": "object", - "additionalProperties": false, - "properties": { - "top": { - "type": "number", - "minimum": 0 - }, - "right": { - "type": "number", - "minimum": 0 - }, - "bottom": { - "type": "number", - "minimum": 0 - }, - "left": { - "type": "number", - "minimum": 0 - } - } - } - } - }, - "examples": [ - { - "find": { - "selector": "#submit-button" - }, - "arrow": { - "from": { - "x": 0, - "y": -50 - }, - "to": { - "x": 0, - "y": 0 - }, - "color": "#00FF00", - "strokeWidth": 4, - "headSize": 20 - } - }, - { - "position": "top-right", - "text": { - "content": "Important Notice", - "fontSize": 18, - "color": "#FFFFFF", - "backgroundColor": "#0000FF", - "padding": 10, - "maxWidth": 200, - "opacity": 0.9 - } - }, - { - "find": { - "elementClass": [ - "sensitive-info", - "/^private-/" - ] - }, - "blur": { - "intensity": 15, - "width": 200, - "height": 50 - } - } - ] - } - } - }, - "title": "Capture screenshot (detailed)" - }, - { - "type": "boolean", - "title": "Capture screenshot", - "description": "If `true`, captures a screenshot. If `false`, doesn't capture a screenshot." - } - ], - "components": { - "schemas": { - "path": { - "title": "Screenshot (simple)", - "description": "File path of the PNG file. Accepts absolute paths. If not specified, the file name is the ID of the step.", - "type": "string", - "pattern": "([A-Za-z0-9_-]*\\.(png|PNG)$|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - "object": { - "type": "object", - "additionalProperties": false, - "properties": { - "path": { - "title": "Screenshot (simple)", - "description": "File path of the PNG file. Accepts absolute paths. If not specified, the file name is the ID of the step.", - "type": "string", - "pattern": "([A-Za-z0-9_-]*\\.(png|PNG)$|\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - "directory": { - "type": "string", - "description": "Directory of the PNG file. If the directory doesn't exist, creates the directory.", - "transform": [ - "trim" - ] - }, - "maxVariation": { - "type": "number", - "description": "Allowed variation in percentage of pixels between the new screenshot and the existing screenshot at `path`. If the difference between the new screenshot and the existing screenshot is greater than `maxVariation`, the step fails. If a screenshot doesn't exist at `path`, this value is ignored.", - "default": 0.05, - "minimum": 0, - "maximum": 1 - }, - "overwrite": { - "type": "string", - "description": "If `true`, overwrites the existing screenshot at `path` if it exists.\nIf `aboveVariation`, overwrites the existing screenshot at `path` if the difference between the new screenshot and the existing screenshot is greater than `maxVariation`.", - "enum": [ - "true", - "false", - "aboveVariation" - ], - "default": "aboveVariation" - }, - "crop": { - "anyOf": [ - { - "title": "Crop by element (simple)", - "type": "string", - "description": "Display text or selector of the element to screenshot." - }, - { - "title": "Crop by element (detailed)", - "type": "object", - "description": "Crop the screenshot to a specific element.", - "additionalProperties": false, - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "properties": { - "elementText": { - "type": "string", - "description": "Display text of the element to screenshot." - }, - "selector": { - "type": "string", - "description": "Selector of the element to screenshot." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - }, - "padding": { - "anyOf": [ - { - "title": "Padding (simple)", - "type": "number", - "description": "Padding in pixels to add to the bounds of the element.", - "minimum": 0 - }, - { - "type": "object", - "additionalProperties": false, - "properties": { - "top": { - "type": "number", - "minimum": 0 - }, - "right": { - "type": "number", - "minimum": 0 - }, - "bottom": { - "type": "number", - "minimum": 0 - }, - "left": { - "type": "number", - "minimum": 0 - } - }, - "title": "Padding (detailed)", - "description": "Padding in pixels to add to the bounds of the element." - } - ] - } - } - } - ] - }, - "annotations": { - "type": "array", - "description": "Array of annotations to add to the screenshot.", - "items": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "annotation", - "type": "object", - "description": "A visual annotation to add to the screenshot. Annotations can point to elements on the page (via `find`) or be positioned freely within the viewport.", - "anyOf": [ - { - "required": [ - "arrow" - ], - "not": { - "required": [ - "text", - "rectangle", - "circle", - "line", - "callout", - "highlight", - "blur" - ] - } - }, - { - "required": [ - "text" - ], - "not": { - "required": [ - "arrow", - "rectangle", - "circle", - "line", - "callout", - "highlight", - "blur" - ] - } - }, - { - "required": [ - "rectangle" - ], - "not": { - "required": [ - "arrow", - "text", - "circle", - "line", - "callout", - "highlight", - "blur" - ] - } - }, - { - "required": [ - "circle" - ], - "not": { - "required": [ - "arrow", - "text", - "rectangle", - "line", - "callout", - "highlight", - "blur" - ] - } - }, - { - "required": [ - "line" - ], - "not": { - "required": [ - "arrow", - "text", - "rectangle", - "circle", - "callout", - "highlight", - "blur" - ] - } - }, - { "required": [ - "callout" - ], - "not": { - "required": [ - "arrow", - "text", - "rectangle", - "circle", - "line", - "highlight", - "blur" - ] - } - }, - { - "required": [ - "highlight" - ], - "not": { - "required": [ - "arrow", - "text", - "rectangle", - "circle", - "line", - "callout", - "blur" - ] - } - }, - { - "required": [ - "blur" - ], - "not": { - "required": [ - "arrow", - "text", - "rectangle", - "circle", - "line", - "callout", - "highlight" - ] - } - } - ], - "properties": { - "find": { - "type": "object", - "description": "Element on the page to annotate.", - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } + "radius" ], - "additionalProperties": false, - "properties": { - "selector": { - "type": "string", - "description": "Selector of the element to annotate." - }, - "elementText": { - "type": "string", - "description": "Display text of the element to annotate." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - } - } - }, - "position": { - "anyOf": [ - { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - { - "type": "string", - "enum": [ - "top", - "bottom", - "left", - "right", - "center", - "top-left", - "top-right", - "bottom-left", - "bottom-right" - ], - "description": "Position relative to the element (if `find` is provided) or to the viewport." - } - ] - }, - "arrow": { - "type": "object", - "description": "Configuration for arrow annotations.", - "properties": { - "from": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "to": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "color": { - "type": "string", - "description": "Color of the arrow (hex, rgb, or named color).", - "default": "#FF0000" - }, - "strokeWidth": { - "type": "number", - "description": "Width of the arrow line in pixels.", - "minimum": 1, - "default": 3 - }, - "headSize": { - "type": "number", - "description": "Size of the arrowhead in pixels.", - "minimum": 1, - "default": 15 - } - } - }, - "text": { - "type": "object", - "description": "Configuration for text annotations.", - "properties": { - "content": { - "type": "string", - "description": "Text content to display." - }, - "fontSize": { - "type": "number", - "description": "Font size in pixels.", - "minimum": 1, - "default": 16 - }, - "fontFamily": { - "type": "string", - "description": "Font family name.", - "default": "Arial" - }, - "color": { - "type": "string", - "description": "Text color (hex, rgb, or named color).", - "default": "#000000" - }, - "backgroundColor": { - "type": "string", - "description": "Background color for the text box.", - "default": "#FFFFFF" - }, - "padding": { - "anyOf": [ - { - "type": "number", - "description": "Padding in pixels on all sides.", - "minimum": 0 - }, - { - "type": "object", - "additionalProperties": false, - "properties": { - "top": { - "type": "number", - "minimum": 0 - }, - "right": { - "type": "number", - "minimum": 0 - }, - "bottom": { - "type": "number", - "minimum": 0 - }, - "left": { - "type": "number", - "minimum": 0 - } - } - } - ], - "default": 5 - }, - "maxWidth": { - "type": "number", - "description": "Maximum width of the text box. Text will wrap.", - "minimum": 1 - }, - "opacity": { - "type": "number", - "description": "Opacity of the text and background (0-1).", - "minimum": 0, - "maximum": 1, - "default": 1 - } - }, - "required": [ - "content" - ] - }, - "rectangle": { - "type": "object", - "description": "Configuration for rectangle annotations.", - "properties": { - "width": { - "type": "number", - "description": "Width of the rectangle in pixels.", - "minimum": 1 - }, - "height": { - "type": "number", - "description": "Height of the rectangle in pixels.", - "minimum": 1 - }, - "fill": { - "type": "string", - "description": "Fill color (hex, rgb, or named color). Use 'transparent' for no fill.", - "default": "transparent" - }, - "stroke": { - "type": "string", - "description": "Border color (hex, rgb, or named color).", - "default": "#FF0000" - }, - "strokeWidth": { - "type": "number", - "description": "Border width in pixels.", - "minimum": 0, - "default": 2 - }, - "opacity": { - "type": "number", - "description": "Opacity (0-1).", - "minimum": 0, - "maximum": 1, - "default": 1 - }, - "rx": { - "type": "number", - "description": "Horizontal corner radius for rounded rectangles.", - "minimum": 0, - "default": 0 - }, - "ry": { - "type": "number", - "description": "Vertical corner radius for rounded rectangles.", - "minimum": 0, - "default": 0 - } - } - }, - "circle": { - "type": "object", - "description": "Configuration for circle annotations.", "properties": { "radius": { "type": "number", @@ -91969,7 +80170,7 @@ } } }, - "line": { + "line_properties": { "type": "object", "description": "Configuration for line annotations.", "properties": { @@ -92034,7 +80235,7 @@ "to" ] }, - "callout": { + "callout_properties": { "type": "object", "description": "Configuration for callout annotations (text with arrow).", "properties": { @@ -92110,10 +80311,20 @@ "target" ] }, - "highlight": { + "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -92128,9 +80339,9 @@ } } }, - "blur": { + "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -92149,662 +80360,105 @@ "minimum": 1 } } - } - }, - "components": { - "schemas": { - "arrow_properties": { - "type": "object", - "description": "Configuration for arrow annotations.", - "properties": { - "from": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "to": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "color": { - "type": "string", - "description": "Color of the arrow (hex, rgb, or named color).", - "default": "#FF0000" - }, - "strokeWidth": { - "type": "number", - "description": "Width of the arrow line in pixels.", - "minimum": 1, - "default": 3 - }, - "headSize": { - "type": "number", - "description": "Size of the arrowhead in pixels.", - "minimum": 1, - "default": 15 - } - } - }, - "text_properties": { - "type": "object", - "description": "Configuration for text annotations.", - "properties": { - "content": { - "type": "string", - "description": "Text content to display." - }, - "fontSize": { - "type": "number", - "description": "Font size in pixels.", - "minimum": 1, - "default": 16 - }, - "fontFamily": { - "type": "string", - "description": "Font family name.", - "default": "Arial" - }, - "color": { - "type": "string", - "description": "Text color (hex, rgb, or named color).", - "default": "#000000" - }, - "backgroundColor": { - "type": "string", - "description": "Background color for the text box.", - "default": "#FFFFFF" - }, - "padding": { - "anyOf": [ - { - "type": "number", - "description": "Padding in pixels on all sides.", - "minimum": 0 - }, - { - "type": "object", - "additionalProperties": false, - "properties": { - "top": { - "type": "number", - "minimum": 0 - }, - "right": { - "type": "number", - "minimum": 0 - }, - "bottom": { - "type": "number", - "minimum": 0 - }, - "left": { - "type": "number", - "minimum": 0 - } - } - } - ], - "default": 5 - }, - "maxWidth": { - "type": "number", - "description": "Maximum width of the text box. Text will wrap.", - "minimum": 1 - }, - "opacity": { - "type": "number", - "description": "Opacity of the text and background (0-1).", - "minimum": 0, - "maximum": 1, - "default": 1 - } + }, + "point": { + "type": "object", + "description": "A coordinate point (x, y).", + "properties": { + "x": { + "type": "number", + "description": "X coordinate in pixels." }, - "required": [ - "content" - ] - }, - "rectangle_properties": { - "type": "object", - "description": "Configuration for rectangle annotations.", - "properties": { - "width": { - "type": "number", - "description": "Width of the rectangle in pixels.", - "minimum": 1 - }, - "height": { - "type": "number", - "description": "Height of the rectangle in pixels.", - "minimum": 1 - }, - "fill": { - "type": "string", - "description": "Fill color (hex, rgb, or named color). Use 'transparent' for no fill.", - "default": "transparent" - }, - "stroke": { - "type": "string", - "description": "Border color (hex, rgb, or named color).", - "default": "#FF0000" - }, - "strokeWidth": { - "type": "number", - "description": "Border width in pixels.", - "minimum": 0, - "default": 2 - }, - "opacity": { - "type": "number", - "description": "Opacity (0-1).", - "minimum": 0, - "maximum": 1, - "default": 1 - }, - "rx": { - "type": "number", - "description": "Horizontal corner radius for rounded rectangles.", - "minimum": 0, - "default": 0 - }, - "ry": { - "type": "number", - "description": "Vertical corner radius for rounded rectangles.", - "minimum": 0, - "default": 0 - } - } - }, - "circle_properties": { - "type": "object", - "description": "Configuration for circle annotations.", - "properties": { - "radius": { - "type": "number", - "description": "Radius of the circle in pixels.", - "minimum": 1, - "default": 30 - }, - "fill": { - "type": "string", - "description": "Fill color (hex, rgb, or named color). Use 'transparent' for no fill.", - "default": "transparent" - }, - "stroke": { - "type": "string", - "description": "Border color (hex, rgb, or named color).", - "default": "#FF0000" - }, - "strokeWidth": { - "type": "number", - "description": "Border width in pixels.", - "minimum": 0, - "default": 2 - }, - "opacity": { - "type": "number", - "description": "Opacity (0-1).", - "minimum": 0, - "maximum": 1, - "default": 1 - } + "y": { + "type": "number", + "description": "Y coordinate in pixels." } }, - "line_properties": { - "type": "object", - "description": "Configuration for line annotations.", - "properties": { - "from": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "to": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "color": { - "type": "string", - "description": "Color of the line (hex, rgb, or named color).", - "default": "#000000" - }, - "strokeWidth": { - "type": "number", - "description": "Width of the line in pixels.", - "minimum": 1, - "default": 2 - }, - "dashArray": { - "type": "array", - "description": "Dash pattern [dash, gap]. E.g., [5, 5] for dashed line.", - "items": { - "type": "number", - "minimum": 0 - } - } + "required": [ + "x", + "y" + ] + }, + "padding": { + "type": "object", + "additionalProperties": false, + "properties": { + "top": { + "type": "number", + "minimum": 0 }, - "required": [ - "from", - "to" - ] - }, - "callout_properties": { - "type": "object", - "description": "Configuration for callout annotations (text with arrow).", - "properties": { - "content": { - "type": "string", - "description": "Text content to display." - }, - "target": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "textPosition": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } - }, - "required": [ - "x", - "y" - ] - }, - "fontSize": { - "type": "number", - "description": "Font size in pixels.", - "minimum": 1, - "default": 14 - }, - "color": { - "type": "string", - "description": "Text color.", - "default": "#000000" - }, - "backgroundColor": { - "type": "string", - "description": "Background color for the text box.", - "default": "#FFFFCC" - }, - "arrowColor": { - "type": "string", - "description": "Color of the arrow.", - "default": "#000000" - }, - "maxWidth": { - "type": "number", - "description": "Maximum width of the text box.", - "minimum": 1 - } + "right": { + "type": "number", + "minimum": 0 }, - "required": [ - "content", - "target" - ] - }, - "highlight_properties": { - "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", - "properties": { - "color": { - "type": "string", - "description": "Highlight color (hex, rgb, or named color).", - "default": "#FFFF00" - }, - "opacity": { - "type": "number", - "description": "Opacity (0-1).", - "minimum": 0, - "maximum": 1, - "default": 0.3 - } - } - }, - "blur_properties": { - "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", - "properties": { - "intensity": { - "type": "number", - "description": "Blur intensity level.", - "minimum": 1, - "default": 10 - }, - "width": { - "type": "number", - "description": "Width of the blur area in pixels.", - "minimum": 1 - }, - "height": { - "type": "number", - "description": "Height of the blur area in pixels.", - "minimum": 1 - } - } - }, - "point": { - "type": "object", - "description": "A coordinate point (x, y).", - "properties": { - "x": { - "type": "number", - "description": "X coordinate in pixels." - }, - "y": { - "type": "number", - "description": "Y coordinate in pixels." - } + "bottom": { + "type": "number", + "minimum": 0 }, - "required": [ - "x", - "y" - ] - }, - "padding": { - "type": "object", - "additionalProperties": false, - "properties": { - "top": { - "type": "number", - "minimum": 0 - }, - "right": { - "type": "number", - "minimum": 0 - }, - "bottom": { - "type": "number", - "minimum": 0 - }, - "left": { - "type": "number", - "minimum": 0 - } + "left": { + "type": "number", + "minimum": 0 } } } - }, - "examples": [ - { - "find": { - "selector": "#submit-button" - }, - "arrow": { - "from": { - "x": 0, - "y": -50 - }, - "to": { - "x": 0, - "y": 0 - }, - "color": "#00FF00", - "strokeWidth": 4, - "headSize": 20 - } - }, - { - "position": "top-right", - "text": { - "content": "Important Notice", - "fontSize": 18, - "color": "#FFFFFF", - "backgroundColor": "#0000FF", - "padding": 10, - "maxWidth": 200, - "opacity": 0.9 - } + } + }, + "examples": [ + { + "find": { + "selector": "#submit-button" }, - { - "find": { - "elementClass": [ - "sensitive-info", - "/^private-/" - ] + "arrow": { + "from": { + "x": 0, + "y": -50 }, - "blur": { - "intensity": 15, - "width": 200, - "height": 50 - } + "to": { + "x": 0, + "y": 0 + }, + "color": "#00FF00", + "strokeWidth": 4, + "headSize": 20 } - ] - } - } - }, - "title": "Capture screenshot (detailed)" - }, - "crop_element": { - "title": "Crop by element (detailed)", - "type": "object", - "description": "Crop the screenshot to a specific element.", - "additionalProperties": false, - "anyOf": [ - { - "required": [ - "selector" - ] - }, - { - "required": [ - "elementText" - ] - }, - { - "required": [ - "elementId" - ] - }, - { - "required": [ - "elementTestId" - ] - }, - { - "required": [ - "elementClass" - ] - }, - { - "required": [ - "elementAttribute" - ] - }, - { - "required": [ - "elementAria" - ] - } - ], - "properties": { - "elementText": { - "type": "string", - "description": "Display text of the element to screenshot." - }, - "selector": { - "type": "string", - "description": "Selector of the element to screenshot." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" }, { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" + "position": "top-right", + "text": { + "content": "Important Notice", + "fontSize": 18, + "color": "#FFFFFF", + "backgroundColor": "#0000FF", + "padding": 10, + "maxWidth": 200, + "opacity": 0.9 } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - }, - "padding": { - "anyOf": [ - { - "title": "Padding (simple)", - "type": "number", - "description": "Padding in pixels to add to the bounds of the element.", - "minimum": 0 }, { - "type": "object", - "additionalProperties": false, - "properties": { - "top": { - "type": "number", - "minimum": 0 - }, - "right": { - "type": "number", - "minimum": 0 - }, - "bottom": { - "type": "number", - "minimum": 0 - }, - "left": { - "type": "number", - "minimum": 0 - } + "find": { + "elementClass": [ + "sensitive-info", + "/^private-/" + ] }, - "title": "Padding (detailed)", - "description": "Padding in pixels to add to the bounds of the element." + "blur": { + "intensity": 15, + "width": 200, + "height": 50 + } } ] } } }, - "padding": { - "type": "object", - "additionalProperties": false, - "properties": { - "top": { - "type": "number", - "minimum": 0 - }, - "right": { - "type": "number", - "minimum": 0 - }, - "bottom": { - "type": "number", - "minimum": 0 - }, - "left": { - "type": "number", - "minimum": 0 - } - }, - "title": "Padding (detailed)", - "description": "Padding in pixels to add to the bounds of the element." - } + "title": "Capture screenshot (detailed)" + }, + { + "type": "boolean", + "title": "Capture screenshot", + "description": "If `true`, captures a screenshot. If `false`, doesn't capture a screenshot." } - }, + ], "examples": [ true, "image.png", @@ -99120,6 +86774,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -99299,16 +86957,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -99351,6 +87009,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -99526,8 +87187,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -99544,7 +87215,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -99706,16 +87377,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -99758,6 +87429,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -99933,8 +87607,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -99951,7 +87635,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -100483,6 +88167,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -100662,16 +88350,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -100714,6 +88402,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -100889,8 +88580,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -100907,7 +88608,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -101069,16 +88770,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -101121,6 +88822,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -101296,8 +89000,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -101314,7 +89028,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -108981,6 +96695,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -109160,16 +96878,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -109212,6 +96930,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -109387,8 +97108,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -109405,7 +97136,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -109567,16 +97298,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -109619,6 +97350,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -109794,8 +97528,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -109812,7 +97556,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -110344,6 +98088,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -110523,16 +98271,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -110575,6 +98323,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -110750,8 +98501,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -110768,7 +98529,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -110930,16 +98691,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -110982,6 +98743,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -111157,8 +98921,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -111175,7 +98949,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -114098,117 +101872,6 @@ "title": "step", "description": "A step in a test.", "type": "object", - "components": { - "schemas": { - "common": { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { - "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - }, - "title": "Common" - }, - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { - "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - } - }, "anyOf": [ { "allOf": [ @@ -119122,6 +106785,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -119301,16 +106968,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -119353,6 +107020,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -119528,8 +107198,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -119546,7 +107226,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -119708,16 +107388,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -119760,6 +107440,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -119935,8 +107618,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -119953,7 +107646,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -120485,6 +108178,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -120664,16 +108361,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -120716,6 +108413,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -120891,8 +108591,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -120909,7 +108619,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -121071,16 +108781,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -121123,6 +108833,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -121298,8 +109011,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -121316,7 +109039,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -129338,6 +117061,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -129517,16 +117244,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -129569,6 +117296,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -129744,8 +117474,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -129762,7 +117502,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -129924,16 +117664,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -129976,6 +117716,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -130151,8 +117894,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -130169,7 +117922,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -130701,6 +118454,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -130880,16 +118637,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -130932,6 +118689,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -131107,8 +118867,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -131125,7 +118895,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -131287,16 +119057,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -131339,6 +119109,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -131514,8 +119287,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -131532,7 +119315,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -139199,6 +126982,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -139378,16 +127165,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -139430,6 +127217,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -139605,8 +127395,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -139623,7 +127423,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -139785,16 +127585,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -139837,6 +127637,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -140012,8 +127815,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -140030,7 +127843,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -140562,6 +128375,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -140741,16 +128558,16 @@ }, "rectangle": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -140793,6 +128610,9 @@ "circle": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -140968,8 +128788,18 @@ }, "highlight": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -140986,7 +128816,7 @@ }, "blur": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -141148,16 +128978,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -141200,6 +129030,9 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": [ + "radius" + ], "properties": { "radius": { "type": "number", @@ -141375,8 +129208,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -141393,7 +129236,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", @@ -143795,192 +131638,6 @@ } ], "additionalProperties": false, - "components": { - "schemas": { - "openApi": { - "type": "array", - "items": { - "allOf": [ - { - "version": "1.0.0", - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "openApi", - "type": "object", - "description": "OpenAPI description and configuration.", - "additionalProperties": false, - "anyOf": [ - { - "required": [ - "descriptionPath" - ] - }, - { - "required": [ - "operationId" - ] - } - ], - "properties": { - "name": { - "type": "string", - "description": "Name of the OpenAPI description, as defined in your configuration." - }, - "descriptionPath": { - "type": "string", - "description": "URL or local path to the OpenAPI description." - }, - "definition": { - "type": "object", - "readOnly": true, - "description": "OpenAPI definition object loaded from the `descriptionPath`. This is a resolved version of the OpenAPI description and should not be user-defined.", - "additionalProperties": true, - "title": "OpenAPI definition" - }, - "operationId": { - "type": "string", - "description": "ID of the operation to use for the request." - }, - "server": { - "type": "string", - "description": "Server to use for example requests. Only valid if `useExample` is `request` or `both`. If not specified but an example is used for the request, uses the first server defined in the OpenAPI description." - }, - "validateAgainstSchema": { - "type": "string", - "description": "Validates the request and/or response against the schema in the OpenAPI description. If the request or response doesn't match the schema, the step fails.", - "enum": [ - "request", - "response", - "both", - "none" - ], - "default": "both" - }, - "mockResponse": { - "type": "boolean", - "description": "If `true`, doesn't make the HTTP request, but instead uses the response example or schema from the OpenAPI description as the response data. Useful for creating tests when an API isn't fully implemented yet. If `statusCode` isn't specified, uses the first defined response code." - }, - "statusCode": { - "type": "integer", - "description": "Response code to use for validation, examples, and status code checking. If the response code doesn't match, the step fails. `statusCodes` overrides this value when specified." - }, - "useExample": { - "type": [ - "string" - ], - "description": "Uses the example from the OpenAPI description as the request and response data. If the request or response has multiple examples, specify `exampleKey`. If `statusCode` isn't specified, uses the first defined response code. `requestData`, `requestParams`, and `requestHeaders` override portions of request examples when specified. `responseData` overrides portions of response examples when specified.", - "enum": [ - "request", - "response", - "both", - "none" - ], - "default": "none" - }, - "exampleKey": { - "type": "string", - "description": "Key of the example to use from the `examples` property in the OpenAPI description. If an `examples` key isn't specified or isn't available for a given parameter or object, the `example` property value is used.", - "default": "" - }, - "headers": { - "type": "object", - "description": "Request headers to add to requests. For example, to set `Authorization` headers for all requests from the specified OpenAPI document. If specified in both a config and a step, the step value overrides the config value.", - "additionalProperties": { - "type": "string" - }, - "title": "OpenAPI request headers" - } - }, - "components": { - "schemas": { - "operationId": { - "type": "string", - "description": "ID of the operation to use for the request." - }, - "descriptionPath": { - "type": "string", - "description": "URL or local path to the OpenAPI description." - } - } - }, - "examples": [ - { - "descriptionPath": "https://petstore.swagger.io/v2/swagger.json" - }, - { - "name": "Reqres", - "operationId": "getUserById" - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "getUserById" - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both" - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both", - "exampleKey": "example1" - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both", - "exampleKey": "example1", - "statusCode": 201 - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both", - "exampleKey": "example1", - "statusCode": 201, - "validateAgainstSchema": "none" - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both", - "exampleKey": "example1", - "statusCode": 201, - "validateAgainstSchema": "none", - "mockResponse": true - }, - { - "descriptionPath": "https://api.example.com/openapi.json", - "operationId": "createUser", - "useExample": "both", - "exampleKey": "example1", - "statusCode": 201, - "validateAgainstSchema": "none", - "mockResponse": true, - "headers": { - "Authorization": "Bearer 12345" - } - } - ] - }, - { - "type": "object", - "not": { - "required": [ - "operationId" - ] - }, - "required": [ - "name", - "descriptionPath" - ], - "title": "OpenAPI description (test)" - } - ] - } - } - } - }, "examples": [ { "steps": [ @@ -144255,114 +131912,6 @@ "additionalProperties": false } ], - "components": { - "schemas": { - "keys": { - "title": "Type keys (simple)", - "description": "Sequence of keys to enter.", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - } - ] - } - } - ] - }, - "object": { - "title": "Type keys (detailed)", - "type": "object", - "properties": { - "keys": { - "title": "Type keys (simple)", - "description": "Sequence of keys to enter.", - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - } - ] - } - } - ] - }, - "inputDelay": { - "type": "number", - "description": "Delay in milliseconds between each key press during a recording", - "default": 100 - }, - "selector": { - "type": "string", - "description": "Selector for the element to type into. If not specified, the typing occurs in the active element." - }, - "elementText": { - "type": "string", - "description": "Display text of the element to type into. If combined with other element finding fields, the element must match all specified criteria." - }, - "elementId": { - "type": "string", - "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementTestId": { - "type": "string", - "description": "data-testid attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." - }, - "elementClass": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ], - "description": "Class or array of classes that the element must have. Each class supports exact match or regex pattern using /pattern/ syntax. Element must have all specified classes." - }, - "elementAttribute": { - "type": "object", - "description": "Object of attribute key-value pairs that the element must have. Values can be strings (supporting /pattern/ regex), numbers, or booleans. Boolean true matches attribute presence, false matches absence.", - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } - ] - } - }, - "elementAria": { - "type": "string", - "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." - } - }, - "required": [ - "keys" - ], - "additionalProperties": false - } - } - }, "examples": [ "kittens", [ @@ -144412,18 +131961,6 @@ "title": "Wait (boolean)" } ], - "components": { - "schemas": { - "string": { - "title": "Wait (environment variable)", - "type": "string", - "pattern": "(\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - } - } - }, "examples": [ 5000, "$WAIT_DURATION", diff --git a/common/src/schemas/src_schemas/annotation_v3.schema.json b/common/src/schemas/src_schemas/annotation_v3.schema.json index 42a3f99..9c3c423 100644 --- a/common/src/schemas/src_schemas/annotation_v3.schema.json +++ b/common/src/schemas/src_schemas/annotation_v3.schema.json @@ -128,6 +128,10 @@ "elementAria": { "type": "string", "description": "Computed accessible name of the element per ARIA specification. Supports exact match or regex pattern using /pattern/ syntax." + }, + "elementId": { + "type": "string", + "description": "ID attribute of the element to find. Supports exact match or regex pattern using /pattern/ syntax." } } }, @@ -270,16 +274,16 @@ }, "rectangle_properties": { "type": "object", - "description": "Configuration for rectangle annotations.", + "description": "Configuration for rectangle annotations. When used with 'find', width and height are derived from the element's bounding box. When positioning freely (using 'position'), width and height must be specified.", "properties": { "width": { "type": "number", - "description": "Width of the rectangle in pixels.", + "description": "Width of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "height": { "type": "number", - "description": "Height of the rectangle in pixels.", + "description": "Height of the rectangle in pixels. Optional if 'find' is specified (uses element's bounding box).", "minimum": 1 }, "fill": { @@ -322,6 +326,7 @@ "circle_properties": { "type": "object", "description": "Configuration for circle annotations.", + "required": ["radius"], "properties": { "radius": { "type": "number", @@ -435,8 +440,18 @@ }, "highlight_properties": { "type": "object", - "description": "Configuration for highlight annotations (semi-transparent overlay).", + "description": "Configuration for highlight annotations (semi-transparent overlay). Requires either a 'find' element (uses element's bounding box) or explicit 'width' and 'height' properties with a 'position'.", "properties": { + "width": { + "type": "number", + "description": "Width of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, + "height": { + "type": "number", + "description": "Height of the highlight area in pixels. Optional if 'find' is specified.", + "minimum": 1 + }, "color": { "type": "string", "description": "Highlight color (hex, rgb, or named color).", @@ -453,7 +468,7 @@ }, "blur_properties": { "type": "object", - "description": "Configuration for blur annotations (for redacting sensitive information).", + "description": "Configuration for blur annotations (for redacting sensitive information). Note: Current implementation uses a semi-transparent overlay rather than true pixel blur. Requires 'width' and 'height' unless a 'find' element is specified (which provides dimensions automatically).", "properties": { "intensity": { "type": "number", diff --git a/core/package-lock.json b/core/package-lock.json index c71e9d8..499bf24 100644 --- a/core/package-lock.json +++ b/core/package-lock.json @@ -19,7 +19,7 @@ "appium-geckodriver": "^2.1.2", "appium-safari-driver": "^4.1.2", "axios": "^1.13.2", - "doc-detective-common": "^3.6.0", + "doc-detective-common": "file:../common", "doc-detective-resolver": "^3.6.1", "dotenv": "^17.2.3", "geckodriver": "^6.1.0", @@ -72,6 +72,25 @@ "@img/sharp-win32-x64": "^0.34.5" } }, + "../common": { + "name": "doc-detective-common", + "version": "3.6.0", + "license": "AGPL-3.0-only", + "dependencies": { + "@apidevtools/json-schema-ref-parser": "^15.1.3", + "ajv": "^8.17.1", + "ajv-errors": "^3.0.0", + "ajv-formats": "^3.0.1", + "ajv-keywords": "^5.1.0", + "axios": "^1.13.2", + "yaml": "^2.8.2" + }, + "devDependencies": { + "chai": "^6.2.1", + "mocha": "^11.7.5", + "sinon": "^21.0.0" + } + }, "node_modules/@apidevtools/json-schema-ref-parser": { "version": "15.1.3", "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-15.1.3.tgz", @@ -1765,6 +1784,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -1776,15 +1796,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/ajv-errors": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-3.0.0.tgz", - "integrity": "sha512-V3wD15YHfHz6y0KdhYFjyy9vWtEVALT9UrxfN3zqlI6dMioHnJrqOYfyPKol3oqrnCM9uwkcdCwkJ0WUcbLMTQ==", - "license": "MIT", - "peerDependencies": { - "ajv": "^8.0.1" - } - }, "node_modules/ajv-formats": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", @@ -1802,18 +1813,6 @@ } } }, - "node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, "node_modules/ansi-regex": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", @@ -1847,6 +1846,7 @@ "integrity": "sha512-0XEpQ7kIAIMPHT4eZRuczfzZhh/X/n6+IGX7URSCSm67ppyPl0zZvS3ZzLHXdfBIPiQi4T00CT1Id/9Ni26wdQ==", "hasInstallScript": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "@appium/base-driver": "^10.1.1", "@appium/base-plugin": "^3.0.4", @@ -6728,7 +6728,6 @@ "resolved": "https://registry.npmjs.org/@appium/base-driver/-/base-driver-10.1.1.tgz", "integrity": "sha512-7I6SxkqkUojD+LzasixT+G6HEZs1a4sRMbeqwkSPCwf7WlvV0WctFFWNmjDrk+XVVqctafXLrqrDWpfGouw4bQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@appium/support": "^7.0.3", "@appium/types": "^1.1.1", @@ -6763,7 +6762,6 @@ "resolved": "https://registry.npmjs.org/@appium/base-plugin/-/base-plugin-3.0.4.tgz", "integrity": "sha512-qpIkPT99EadfKQ2Jr8kHaY4uWeaRR77UVEbzjPTti4W82/nG9GCAWYJv2ORt3AY6PIGl1/Cp95tsOq9eatDQVA==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@appium/base-driver": "^10.1.1", "@appium/support": "^7.0.3" @@ -6778,7 +6776,6 @@ "resolved": "https://registry.npmjs.org/@appium/docutils/-/docutils-2.1.2.tgz", "integrity": "sha512-zJYdL0wWZfgE7uoCgcYCHmhgopehGAA6WEMc5fj4Sj81YdbVJsR3sqD3xj832GmbtP5FEoaFWi2xiHoovreA9w==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@appium/support": "^7.0.3", "chalk": "4.1.2", @@ -6808,7 +6805,6 @@ "resolved": "https://registry.npmjs.org/teen_process/-/teen_process-3.0.2.tgz", "integrity": "sha512-JyvPp0koEi9WVCrUYK8Rqg4G8Vxs+eY8XMpIjxJyGyG50UTo+u6CAfaWxCr5WW+ZvpMM3Qs2AFSdkS7SamQy3g==", "license": "Apache-2.0", - "peer": true, "dependencies": { "bluebird": "^3.7.2", "lodash": "^4.17.21", @@ -6982,7 +6978,6 @@ "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.8.tgz", "integrity": "sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==", "license": "MIT", - "peer": true, "dependencies": { "@so-ric/colorspace": "^1.1.6", "enabled": "2.0.x", @@ -7509,7 +7504,6 @@ "resolved": "https://registry.npmjs.org/@sidvind/better-ajv-errors/-/better-ajv-errors-4.0.0.tgz", "integrity": "sha512-rLZQkN6IfNwG6iqZZwqFMcs7DvQX3ZrLVhsHmSO1LUA4EZAz+VZLpTBCIOFsC5Qu3xuwzVfRMZ+1rtk/mCRRZw==", "license": "Apache-2.0", - "peer": true, "dependencies": { "kleur": "^4.1.0" }, @@ -7525,7 +7519,6 @@ "resolved": "https://registry.npmjs.org/@so-ric/colorspace/-/colorspace-1.1.6.tgz", "integrity": "sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==", "license": "MIT", - "peer": true, "dependencies": { "color": "^5.0.2", "text-hex": "1.0.x" @@ -7547,8 +7540,7 @@ "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/@xmldom/xmldom": { "version": "0.8.11", @@ -7576,7 +7568,6 @@ "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", "license": "MIT", - "peer": true, "dependencies": { "mime-types": "^3.0.0", "negotiator": "^1.0.0" @@ -7590,7 +7581,6 @@ "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", "license": "MIT", - "peer": true, "dependencies": { "ajv": "^8.0.0" }, @@ -7636,7 +7626,6 @@ "integrity": "sha512-0XEpQ7kIAIMPHT4eZRuczfzZhh/X/n6+IGX7URSCSm67ppyPl0zZvS3ZzLHXdfBIPiQi4T00CT1Id/9Ni26wdQ==", "hasInstallScript": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@appium/base-driver": "^10.1.1", "@appium/base-plugin": "^3.0.4", @@ -7703,7 +7692,6 @@ "resolved": "https://registry.npmjs.org/teen_process/-/teen_process-3.0.2.tgz", "integrity": "sha512-JyvPp0koEi9WVCrUYK8Rqg4G8Vxs+eY8XMpIjxJyGyG50UTo+u6CAfaWxCr5WW+ZvpMM3Qs2AFSdkS7SamQy3g==", "license": "Apache-2.0", - "peer": true, "dependencies": { "bluebird": "^3.7.2", "lodash": "^4.17.21", @@ -7836,8 +7824,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0", - "peer": true + "license": "Python-2.0" }, "node_modules/appium-geckodriver/node_modules/async": { "version": "3.2.6", @@ -7947,7 +7934,6 @@ "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", "license": "MIT", - "peer": true, "dependencies": { "safe-buffer": "5.1.2" }, @@ -7969,7 +7955,6 @@ "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "license": "MIT", - "peer": true, "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -7981,7 +7966,6 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", - "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -8002,7 +7986,6 @@ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", "license": "MIT", - "peer": true, "dependencies": { "bytes": "^3.1.2", "content-type": "^1.0.5", @@ -8058,7 +8041,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -8084,7 +8066,6 @@ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -8107,7 +8088,6 @@ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "license": "MIT", - "peer": true, "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" @@ -8152,7 +8132,6 @@ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "license": "MIT", - "peer": true, "dependencies": { "restore-cursor": "^3.1.0" }, @@ -8165,7 +8144,6 @@ "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", "license": "MIT", - "peer": true, "engines": { "node": ">=6" }, @@ -8178,7 +8156,6 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", "license": "ISC", - "peer": true, "dependencies": { "string-width": "^7.2.0", "strip-ansi": "^7.1.0", @@ -8193,7 +8170,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -8205,15 +8181,13 @@ "version": "10.6.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/cliui/node_modules/string-width": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "license": "MIT", - "peer": true, "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", @@ -8231,7 +8205,6 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", @@ -8249,7 +8222,6 @@ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.8" } @@ -8259,7 +8231,6 @@ "resolved": "https://registry.npmjs.org/color/-/color-5.0.3.tgz", "integrity": "sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==", "license": "MIT", - "peer": true, "dependencies": { "color-convert": "^3.1.3", "color-string": "^2.1.3" @@ -8291,7 +8262,6 @@ "resolved": "https://registry.npmjs.org/color-string/-/color-string-2.1.4.tgz", "integrity": "sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==", "license": "MIT", - "peer": true, "dependencies": { "color-name": "^2.0.0" }, @@ -8304,7 +8274,6 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz", "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==", "license": "MIT", - "peer": true, "engines": { "node": ">=12.20" } @@ -8314,7 +8283,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-3.1.3.tgz", "integrity": "sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==", "license": "MIT", - "peer": true, "dependencies": { "color-name": "^2.0.0" }, @@ -8327,7 +8295,6 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz", "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==", "license": "MIT", - "peer": true, "engines": { "node": ">=12.20" } @@ -8349,7 +8316,6 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", "license": "MIT", - "peer": true, "engines": { "node": ">= 6" } @@ -8375,7 +8341,6 @@ "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", "license": "MIT", - "peer": true, "engines": { "node": "^14.18.0 || >=16.10.0" } @@ -8391,7 +8356,6 @@ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -8405,7 +8369,6 @@ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -8415,7 +8378,6 @@ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -8425,7 +8387,6 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", "license": "MIT", - "peer": true, "engines": { "node": ">=6.6.0" } @@ -8501,7 +8462,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", - "peer": true, "dependencies": { "ms": "^2.1.3" }, @@ -8519,7 +8479,6 @@ "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "license": "MIT", - "peer": true, "dependencies": { "clone": "^1.0.2" }, @@ -8541,7 +8500,6 @@ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -8561,15 +8519,13 @@ "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", "license": "MIT", - "optional": true, - "peer": true + "optional": true }, "node_modules/appium-geckodriver/node_modules/diff": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.2.tgz", "integrity": "sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==", "license": "BSD-3-Clause", - "peer": true, "engines": { "node": ">=0.3.1" } @@ -8604,8 +8560,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/emoji-regex": { "version": "9.2.2", @@ -8617,15 +8572,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/encodeurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -8689,7 +8642,6 @@ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -8698,15 +8650,13 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -8743,7 +8693,6 @@ "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", "license": "MIT", - "peer": true, "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.0", @@ -8816,7 +8765,6 @@ "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 4.9.1" } @@ -8825,15 +8773,13 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/finalhandler": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", "license": "MIT", - "peer": true, "dependencies": { "debug": "^4.4.0", "encodeurl": "^2.0.0", @@ -8870,8 +8816,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/follow-redirects": { "version": "1.15.11", @@ -8963,7 +8908,6 @@ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -8973,7 +8917,6 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -9027,7 +8970,6 @@ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "license": "ISC", - "peer": true, "engines": { "node": "6.* || 8.* || >= 10.*" } @@ -9037,7 +8979,6 @@ "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -9155,8 +9096,7 @@ "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", "license": "MIT", - "optional": true, - "peer": true + "optional": true }, "node_modules/appium-geckodriver/node_modules/has-flag": { "version": "4.0.0", @@ -9218,7 +9158,6 @@ "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "inherits": "^2.0.1", "obuf": "^1.0.0", @@ -9231,8 +9170,7 @@ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "license": "MIT", - "optional": true, - "peer": true + "optional": true }, "node_modules/appium-geckodriver/node_modules/hpack.js/node_modules/readable-stream": { "version": "2.3.8", @@ -9240,7 +9178,6 @@ "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -9257,7 +9194,6 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -9267,15 +9203,13 @@ "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", "license": "MIT", - "optional": true, - "peer": true + "optional": true }, "node_modules/appium-geckodriver/node_modules/http-errors": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", "license": "MIT", - "peer": true, "dependencies": { "depd": "~2.0.0", "inherits": "~2.0.4", @@ -9295,15 +9229,13 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/http-status-codes/-/http-status-codes-2.3.0.tgz", "integrity": "sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/iconv-lite": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "license": "MIT", - "peer": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -9351,7 +9283,6 @@ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.10" } @@ -9391,7 +9322,6 @@ "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -9409,8 +9339,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/is-stream": { "version": "2.0.1", @@ -9525,7 +9454,6 @@ "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -9534,8 +9462,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/lazystream": { "version": "1.0.1", @@ -9584,7 +9511,6 @@ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", "license": "MIT", - "peer": true, "engines": { "node": ">=14" }, @@ -9655,7 +9581,6 @@ "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz", "integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==", "license": "MIT", - "peer": true, "dependencies": { "@colors/colors": "1.6.0", "@types/triple-beam": "^1.3.2", @@ -9691,7 +9616,6 @@ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -9701,7 +9625,6 @@ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -9714,7 +9637,6 @@ "resolved": "https://registry.npmjs.org/method-override/-/method-override-3.0.0.tgz", "integrity": "sha512-IJ2NNN/mSl9w3kzWB92rcdHpz+HjkxhDJWNDBqSlas+zQdP8wBiJzITPg08M/k2uVvMow7Sk41atndNtt/PHSA==", "license": "MIT", - "peer": true, "dependencies": { "debug": "3.1.0", "methods": "~1.1.2", @@ -9730,7 +9652,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "license": "MIT", - "peer": true, "dependencies": { "ms": "2.0.0" } @@ -9739,15 +9660,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -9757,7 +9676,6 @@ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -9767,7 +9685,6 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", "license": "MIT", - "peer": true, "dependencies": { "mime-db": "^1.54.0" }, @@ -9784,7 +9701,6 @@ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -9794,8 +9710,7 @@ "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", "license": "ISC", - "optional": true, - "peer": true + "optional": true }, "node_modules/appium-geckodriver/node_modules/minipass": { "version": "7.1.2", @@ -9820,7 +9735,6 @@ "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.1.tgz", "integrity": "sha512-223dMRJtI/l25dJKWpgij2cMtywuG/WiUKXdvwfbhGKBhy1puASqXwFzmWZ7+K73vUPoR7SS2Qz2cI/g9MKw0A==", "license": "MIT", - "peer": true, "dependencies": { "basic-auth": "~2.0.1", "debug": "2.6.9", @@ -9837,7 +9751,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", - "peer": true, "dependencies": { "ms": "2.0.0" } @@ -9846,15 +9759,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/morgan/node_modules/on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", "license": "MIT", - "peer": true, "dependencies": { "ee-first": "1.1.1" }, @@ -9882,7 +9793,6 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -9922,7 +9832,6 @@ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.4" }, @@ -9935,15 +9844,13 @@ "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", "license": "MIT", - "optional": true, - "peer": true + "optional": true }, "node_modules/appium-geckodriver/node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "license": "MIT", - "peer": true, "dependencies": { "ee-first": "1.1.1" }, @@ -9956,7 +9863,6 @@ "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -9975,7 +9881,6 @@ "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", "license": "MIT", - "peer": true, "dependencies": { "fn.name": "1.x.x" } @@ -9985,7 +9890,6 @@ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "license": "MIT", - "peer": true, "dependencies": { "mimic-fn": "^2.1.0" }, @@ -10001,7 +9905,6 @@ "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", "license": "MIT", - "peer": true, "dependencies": { "bl": "^4.1.0", "chalk": "^4.1.0", @@ -10025,7 +9928,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -10035,7 +9937,6 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "license": "MIT", - "peer": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -10078,7 +9979,6 @@ "resolved": "https://registry.npmjs.org/package-changed/-/package-changed-3.0.0.tgz", "integrity": "sha512-HSRbrO+Ab5AuqqYGSevtKJ1Yt96jW1VKV7wrp8K4SKj5tyDp/7D96uPCQyCPiNtWTEH/7nA3hZ4z2slbc9yFxg==", "license": "ISC", - "peer": true, "dependencies": { "commander": "^6.2.0" }, @@ -10123,7 +10023,6 @@ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -10173,7 +10072,6 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", "license": "MIT", - "peer": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/express" @@ -10269,7 +10167,6 @@ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "license": "MIT", - "peer": true, "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" @@ -10289,7 +10186,6 @@ "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", "license": "BSD-3-Clause", - "peer": true, "dependencies": { "side-channel": "^1.1.0" }, @@ -10305,7 +10201,6 @@ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -10315,7 +10210,6 @@ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", "license": "MIT", - "peer": true, "dependencies": { "bytes": "~3.1.2", "http-errors": "~2.0.1", @@ -10331,7 +10225,6 @@ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", "license": "MIT", - "peer": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -10481,7 +10374,6 @@ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "license": "MIT", - "peer": true, "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" @@ -10495,7 +10387,6 @@ "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", "license": "MIT", - "peer": true, "dependencies": { "debug": "^4.4.0", "depd": "^2.0.0", @@ -10518,7 +10409,6 @@ "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", "license": "MIT", - "peer": true, "engines": { "node": ">=10" } @@ -10527,8 +10417,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/sanitize-filename": { "version": "1.6.3", @@ -10544,8 +10433,7 @@ "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", "license": "MIT", - "optional": true, - "peer": true + "optional": true }, "node_modules/appium-geckodriver/node_modules/semver": { "version": "7.7.3", @@ -10564,7 +10452,6 @@ "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", "license": "MIT", - "peer": true, "dependencies": { "debug": "^4.3.5", "encodeurl": "^2.0.0", @@ -10587,7 +10474,6 @@ "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.5.1.tgz", "integrity": "sha512-JndLBslCLA/ebr7rS3d+/EKkzTsTi1jI2T9l+vHfAaGJ7A7NhtDpSZ0lx81HCNWnnE0yHncG+SSnVf9IMxOwXQ==", "license": "MIT", - "peer": true, "dependencies": { "etag": "~1.8.1", "fresh": "~0.5.2", @@ -10604,7 +10490,6 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -10627,15 +10512,13 @@ "url": "https://feross.org/support" } ], - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/serve-static": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", "license": "MIT", - "peer": true, "dependencies": { "encodeurl": "^2.0.0", "escape-html": "^1.0.3", @@ -10656,8 +10539,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/appium-geckodriver/node_modules/sharp": { "version": "0.34.5", @@ -10742,7 +10624,6 @@ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "license": "MIT", - "peer": true, "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", @@ -10762,7 +10643,6 @@ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", "license": "MIT", - "peer": true, "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" @@ -10779,7 +10659,6 @@ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", "license": "MIT", - "peer": true, "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -10798,7 +10677,6 @@ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "license": "MIT", - "peer": true, "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -10876,7 +10754,6 @@ "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "debug": "^4.1.0", "handle-thing": "^2.0.0", @@ -10894,7 +10771,6 @@ "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "debug": "^4.1.0", "detect-node": "^2.0.4", @@ -10910,7 +10786,6 @@ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -10925,7 +10800,6 @@ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", "license": "MIT", - "peer": true, "engines": { "node": "*" } @@ -10935,7 +10809,6 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -11174,8 +11047,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/through": { "version": "2.3.8", @@ -11188,7 +11060,6 @@ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.6" } @@ -11198,7 +11069,6 @@ "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 14.0.0" } @@ -11239,7 +11109,6 @@ "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", "license": "MIT", - "peer": true, "dependencies": { "content-type": "^1.0.5", "media-typer": "^1.1.0", @@ -11263,7 +11132,6 @@ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -11308,7 +11176,6 @@ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -11319,7 +11186,6 @@ "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "minimalistic-assert": "^1.0.0" } @@ -11329,7 +11195,6 @@ "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "license": "MIT", - "peer": true, "dependencies": { "defaults": "^1.0.3" } @@ -11354,7 +11219,6 @@ "resolved": "https://registry.npmjs.org/winston/-/winston-3.18.3.tgz", "integrity": "sha512-NoBZauFNNWENgsnC9YpgyYwOVrl2m58PpQ8lNHjV3kosGs7KJ7Npk9pCUE+WJlawVSe8mykWDKWFSVfs3QO9ww==", "license": "MIT", - "peer": true, "dependencies": { "@colors/colors": "^1.6.0", "@dabh/diagnostics": "^2.0.8", @@ -11377,7 +11241,6 @@ "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz", "integrity": "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==", "license": "MIT", - "peer": true, "dependencies": { "logform": "^2.7.0", "readable-stream": "^3.6.2", @@ -11392,7 +11255,6 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", - "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -11407,7 +11269,6 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", - "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -11422,7 +11283,6 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -11499,7 +11359,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -11508,15 +11367,13 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/wrap-ansi/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "license": "MIT", - "peer": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -11531,7 +11388,6 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "license": "MIT", - "peer": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -11550,7 +11406,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", "license": "MIT", - "peer": true, "engines": { "node": ">=10.0.0" }, @@ -11581,7 +11436,6 @@ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "license": "ISC", - "peer": true, "engines": { "node": ">=10" } @@ -11591,7 +11445,6 @@ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", "license": "ISC", - "peer": true, "bin": { "yaml": "bin.mjs" }, @@ -11604,7 +11457,6 @@ "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", "license": "MIT", - "peer": true, "dependencies": { "cliui": "^9.0.1", "escalade": "^3.1.1", @@ -11622,7 +11474,6 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", "license": "ISC", - "peer": true, "engines": { "node": "^20.19.0 || ^22.12.0 || >=23" } @@ -11631,15 +11482,13 @@ "version": "10.6.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/yargs/node_modules/string-width": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "license": "MIT", - "peer": true, "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", @@ -11728,7 +11577,6 @@ "resolved": "https://registry.npmjs.org/@appium/base-driver/-/base-driver-10.1.1.tgz", "integrity": "sha512-7I6SxkqkUojD+LzasixT+G6HEZs1a4sRMbeqwkSPCwf7WlvV0WctFFWNmjDrk+XVVqctafXLrqrDWpfGouw4bQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@appium/support": "^7.0.3", "@appium/types": "^1.1.1", @@ -11763,7 +11611,6 @@ "resolved": "https://registry.npmjs.org/@appium/base-plugin/-/base-plugin-3.0.4.tgz", "integrity": "sha512-qpIkPT99EadfKQ2Jr8kHaY4uWeaRR77UVEbzjPTti4W82/nG9GCAWYJv2ORt3AY6PIGl1/Cp95tsOq9eatDQVA==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@appium/base-driver": "^10.1.1", "@appium/support": "^7.0.3" @@ -11778,7 +11625,6 @@ "resolved": "https://registry.npmjs.org/@appium/docutils/-/docutils-2.1.2.tgz", "integrity": "sha512-zJYdL0wWZfgE7uoCgcYCHmhgopehGAA6WEMc5fj4Sj81YdbVJsR3sqD3xj832GmbtP5FEoaFWi2xiHoovreA9w==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@appium/support": "^7.0.3", "chalk": "4.1.2", @@ -11808,7 +11654,6 @@ "resolved": "https://registry.npmjs.org/teen_process/-/teen_process-3.0.2.tgz", "integrity": "sha512-JyvPp0koEi9WVCrUYK8Rqg4G8Vxs+eY8XMpIjxJyGyG50UTo+u6CAfaWxCr5WW+ZvpMM3Qs2AFSdkS7SamQy3g==", "license": "Apache-2.0", - "peer": true, "dependencies": { "bluebird": "^3.7.2", "lodash": "^4.17.21", @@ -11841,7 +11686,6 @@ "resolved": "https://registry.npmjs.org/@appium/schema/-/schema-1.0.0.tgz", "integrity": "sha512-eowz+sV6YxuHdsuRizEhG+AGeeMsUiS9ryWLkdFSqQlsNB+uDudehpYQiRkrrtaGOBzq7a3GDUB7zjc6eR80QA==", "license": "Apache-2.0", - "peer": true, "dependencies": { "json-schema": "0.4.0", "source-map-support": "0.5.21" @@ -11856,7 +11700,6 @@ "resolved": "https://registry.npmjs.org/@appium/support/-/support-7.0.3.tgz", "integrity": "sha512-r4vHjR+wQxg4DND9StWUM2GZvNO3+6ePVplBMKFU+HfKgxw07qjxf08CYMXvJb/YUMwhAhhbVRqzmGudNAk+bg==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@appium/logger": "^2.0.2", "@appium/tsconfig": "^1.1.0", @@ -11907,7 +11750,6 @@ "resolved": "https://registry.npmjs.org/teen_process/-/teen_process-3.0.2.tgz", "integrity": "sha512-JyvPp0koEi9WVCrUYK8Rqg4G8Vxs+eY8XMpIjxJyGyG50UTo+u6CAfaWxCr5WW+ZvpMM3Qs2AFSdkS7SamQy3g==", "license": "Apache-2.0", - "peer": true, "dependencies": { "bluebird": "^3.7.2", "lodash": "^4.17.21", @@ -11924,7 +11766,6 @@ "resolved": "https://registry.npmjs.org/@appium/tsconfig/-/tsconfig-1.1.0.tgz", "integrity": "sha512-4QO++yh9hMDiqAnPNHWQStxhTz1to6wG8hsPaviHjqOnlGQa34jrcS6gqciPZL6+xkd5qgIkZjmOTNNWNUFgqQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@tsconfig/node20": "20.1.6" }, @@ -11938,7 +11779,6 @@ "resolved": "https://registry.npmjs.org/@appium/types/-/types-1.1.1.tgz", "integrity": "sha512-zYuCH/QmDfh1F8S3+vz0GUjtAjvpKQdb6H41bhVuK+ZOQbhNWI8f+UdKXoCSOrtVK7dQ2R9uYm8hriJYLjadJw==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@appium/logger": "^2.0.2", "@appium/schema": "^1.0.0", @@ -11955,7 +11795,6 @@ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", @@ -11970,7 +11809,6 @@ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "license": "MIT", - "peer": true, "engines": { "node": ">=6.9.0" } @@ -11980,7 +11818,6 @@ "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.1.90" } @@ -11990,7 +11827,6 @@ "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.8.tgz", "integrity": "sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==", "license": "MIT", - "peer": true, "dependencies": { "@so-ric/colorspace": "^1.1.6", "enabled": "2.0.x", @@ -12013,7 +11849,6 @@ "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==", "license": "MIT", "optional": true, - "peer": true, "engines": { "node": ">=18" } @@ -12030,7 +11865,6 @@ "os": [ "darwin" ], - "peer": true, "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, @@ -12053,7 +11887,6 @@ "os": [ "darwin" ], - "peer": true, "funding": { "url": "https://opencollective.com/libvips" } @@ -12084,7 +11917,6 @@ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "license": "ISC", - "peer": true, "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", @@ -12102,7 +11934,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -12115,7 +11946,6 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", @@ -12134,7 +11964,6 @@ "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "license": "MIT", "optional": true, - "peer": true, "engines": { "node": ">=14" } @@ -12144,7 +11973,6 @@ "resolved": "https://registry.npmjs.org/@sidvind/better-ajv-errors/-/better-ajv-errors-4.0.0.tgz", "integrity": "sha512-rLZQkN6IfNwG6iqZZwqFMcs7DvQX3ZrLVhsHmSO1LUA4EZAz+VZLpTBCIOFsC5Qu3xuwzVfRMZ+1rtk/mCRRZw==", "license": "Apache-2.0", - "peer": true, "dependencies": { "kleur": "^4.1.0" }, @@ -12160,7 +11988,6 @@ "resolved": "https://registry.npmjs.org/@so-ric/colorspace/-/colorspace-1.1.6.tgz", "integrity": "sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==", "license": "MIT", - "peer": true, "dependencies": { "color": "^5.0.2", "text-hex": "1.0.x" @@ -12170,29 +11997,25 @@ "version": "20.1.6", "resolved": "https://registry.npmjs.org/@tsconfig/node20/-/node20-20.1.6.tgz", "integrity": "sha512-sz+Hqx9zwZDpZIV871WSbUzSqNIsXzghZydypnfgzPKLltVJfkINfUeTct31n/tTSa9ZE1ZOfKdRre1uHHquYQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/@types/normalize-package-data": { "version": "2.4.4", "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/@types/triple-beam": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/@xmldom/xmldom": { "version": "0.8.11", "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.11.tgz", "integrity": "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==", "license": "MIT", - "peer": true, "engines": { "node": ">=10.0.0" } @@ -12202,7 +12025,6 @@ "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", "license": "MIT", - "peer": true, "dependencies": { "event-target-shim": "^5.0.0" }, @@ -12215,7 +12037,6 @@ "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", "license": "MIT", - "peer": true, "dependencies": { "mime-types": "^3.0.0", "negotiator": "^1.0.0" @@ -12229,7 +12050,6 @@ "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", "license": "MIT", - "peer": true, "dependencies": { "ajv": "^8.0.0" }, @@ -12247,7 +12067,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -12260,7 +12079,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", - "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -12277,7 +12095,6 @@ "integrity": "sha512-0XEpQ7kIAIMPHT4eZRuczfzZhh/X/n6+IGX7URSCSm67ppyPl0zZvS3ZzLHXdfBIPiQi4T00CT1Id/9Ni26wdQ==", "hasInstallScript": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@appium/base-driver": "^10.1.1", "@appium/base-plugin": "^3.0.4", @@ -12322,7 +12139,6 @@ "resolved": "https://registry.npmjs.org/teen_process/-/teen_process-3.0.2.tgz", "integrity": "sha512-JyvPp0koEi9WVCrUYK8Rqg4G8Vxs+eY8XMpIjxJyGyG50UTo+u6CAfaWxCr5WW+ZvpMM3Qs2AFSdkS7SamQy3g==", "license": "Apache-2.0", - "peer": true, "dependencies": { "bluebird": "^3.7.2", "lodash": "^4.17.21", @@ -12339,7 +12155,6 @@ "resolved": "https://registry.npmjs.org/archiver/-/archiver-7.0.1.tgz", "integrity": "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==", "license": "MIT", - "peer": true, "dependencies": { "archiver-utils": "^5.0.2", "async": "^3.2.4", @@ -12358,7 +12173,6 @@ "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-5.0.2.tgz", "integrity": "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==", "license": "MIT", - "peer": true, "dependencies": { "glob": "^10.0.0", "graceful-fs": "^4.2.0", @@ -12377,7 +12191,6 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "license": "MIT", - "peer": true, "dependencies": { "balanced-match": "^1.0.0" } @@ -12387,7 +12200,6 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", "license": "ISC", - "peer": true, "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", @@ -12408,7 +12220,6 @@ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "license": "BlueOak-1.0.0", - "peer": true, "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -12423,15 +12234,13 @@ "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/appium-safari-driver/node_modules/archiver-utils/node_modules/minimatch": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "license": "ISC", - "peer": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -12447,7 +12256,6 @@ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "license": "BlueOak-1.0.0", - "peer": true, "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" @@ -12463,22 +12271,19 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0", - "peer": true + "license": "Python-2.0" }, "node_modules/appium-safari-driver/node_modules/async": { "version": "3.2.6", "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/async-lock": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/async-lock/-/async-lock-1.4.1.tgz", "integrity": "sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/asyncbox": { "version": "3.0.0", @@ -12498,15 +12303,13 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/axios": { "version": "1.13.2", "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz", "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", "license": "MIT", - "peer": true, "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.4", @@ -12518,7 +12321,6 @@ "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz", "integrity": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==", "license": "Apache-2.0", - "peer": true, "peerDependencies": { "react-native-b4a": "*" }, @@ -12532,15 +12334,13 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/bare-events": { "version": "2.8.2", "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.2.tgz", "integrity": "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==", "license": "Apache-2.0", - "peer": true, "peerDependencies": { "bare-abort-controller": "*" }, @@ -12568,22 +12368,19 @@ "url": "https://feross.org/support" } ], - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/base64-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/base64-stream/-/base64-stream-1.0.0.tgz", "integrity": "sha512-BQQZftaO48FcE1Kof9CmXMFaAdqkcNorgc8CxesZv9nMbbTF1EFyQe89UOuh//QMmdtfUDXyO8rgUalemL5ODA==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/basic-auth": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", "license": "MIT", - "peer": true, "dependencies": { "safe-buffer": "5.1.2" }, @@ -12596,7 +12393,6 @@ "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", "license": "Unlicense", - "peer": true, "engines": { "node": ">=0.6" } @@ -12606,7 +12402,6 @@ "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "license": "MIT", - "peer": true, "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -12618,7 +12413,6 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", - "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -12639,7 +12433,6 @@ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", "license": "MIT", - "peer": true, "dependencies": { "bytes": "^3.1.2", "content-type": "^1.0.5", @@ -12660,7 +12453,6 @@ "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.1.1.tgz", "integrity": "sha512-Ese7052fdWrxp/vqSJkydgx/1MdBnNOCV2XVfbmdGWD2H6EYza+Q4pyYSuVSnCUD22hfI/BFI4jHaC3NLXLlJQ==", "license": "MIT", - "peer": true, "dependencies": { "stream-buffers": "2.2.x" } @@ -12670,7 +12462,6 @@ "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz", "integrity": "sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==", "license": "MIT", - "peer": true, "dependencies": { "big-integer": "1.6.x" }, @@ -12697,7 +12488,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -12708,7 +12498,6 @@ "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz", "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==", "license": "MIT", - "peer": true, "engines": { "node": ">=8.0.0" } @@ -12724,7 +12513,6 @@ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -12734,7 +12522,6 @@ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "license": "MIT", - "peer": true, "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" @@ -12748,7 +12535,6 @@ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "license": "MIT", - "peer": true, "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" @@ -12765,7 +12551,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -12782,7 +12567,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "license": "MIT", - "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -12795,7 +12579,6 @@ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "license": "MIT", - "peer": true, "dependencies": { "restore-cursor": "^3.1.0" }, @@ -12808,7 +12591,6 @@ "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", "license": "MIT", - "peer": true, "engines": { "node": ">=6" }, @@ -12821,7 +12603,6 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", "license": "ISC", - "peer": true, "dependencies": { "string-width": "^7.2.0", "strip-ansi": "^7.1.0", @@ -12836,7 +12617,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -12848,15 +12628,13 @@ "version": "10.6.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/cliui/node_modules/string-width": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "license": "MIT", - "peer": true, "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", @@ -12874,7 +12652,6 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", @@ -12892,7 +12669,6 @@ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.8" } @@ -12902,7 +12678,6 @@ "resolved": "https://registry.npmjs.org/color/-/color-5.0.3.tgz", "integrity": "sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==", "license": "MIT", - "peer": true, "dependencies": { "color-convert": "^3.1.3", "color-string": "^2.1.3" @@ -12916,7 +12691,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "license": "MIT", - "peer": true, "dependencies": { "color-name": "~1.1.4" }, @@ -12928,15 +12702,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/color-string": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/color-string/-/color-string-2.1.4.tgz", "integrity": "sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==", "license": "MIT", - "peer": true, "dependencies": { "color-name": "^2.0.0" }, @@ -12949,7 +12721,6 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz", "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==", "license": "MIT", - "peer": true, "engines": { "node": ">=12.20" } @@ -12959,7 +12730,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-3.1.3.tgz", "integrity": "sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==", "license": "MIT", - "peer": true, "dependencies": { "color-name": "^2.0.0" }, @@ -12972,7 +12742,6 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz", "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==", "license": "MIT", - "peer": true, "engines": { "node": ">=12.20" } @@ -12982,7 +12751,6 @@ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "license": "MIT", - "peer": true, "dependencies": { "delayed-stream": "~1.0.0" }, @@ -12995,7 +12763,6 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", "license": "MIT", - "peer": true, "engines": { "node": ">= 6" } @@ -13005,7 +12772,6 @@ "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz", "integrity": "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==", "license": "MIT", - "peer": true, "dependencies": { "crc-32": "^1.2.0", "crc32-stream": "^6.0.0", @@ -13022,7 +12788,6 @@ "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", "license": "MIT", - "peer": true, "engines": { "node": "^14.18.0 || >=16.10.0" } @@ -13038,7 +12803,6 @@ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -13052,7 +12816,6 @@ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -13062,7 +12825,6 @@ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -13072,7 +12834,6 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", "license": "MIT", - "peer": true, "engines": { "node": ">=6.6.0" } @@ -13081,15 +12842,13 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/crc-32": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", "license": "Apache-2.0", - "peer": true, "bin": { "crc32": "bin/crc32.njs" }, @@ -13102,7 +12861,6 @@ "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-6.0.0.tgz", "integrity": "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==", "license": "MIT", - "peer": true, "dependencies": { "crc-32": "^1.2.0", "readable-stream": "^4.0.0" @@ -13116,7 +12874,6 @@ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "license": "MIT", - "peer": true, "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -13130,15 +12887,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/appium-safari-driver/node_modules/cross-spawn/node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "license": "ISC", - "peer": true, "dependencies": { "isexe": "^2.0.0" }, @@ -13154,7 +12909,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", - "peer": true, "dependencies": { "ms": "^2.1.3" }, @@ -13172,7 +12926,6 @@ "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "license": "MIT", - "peer": true, "dependencies": { "clone": "^1.0.2" }, @@ -13185,7 +12938,6 @@ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.4.0" } @@ -13195,7 +12947,6 @@ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -13206,7 +12957,6 @@ "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", "license": "Apache-2.0", "optional": true, - "peer": true, "engines": { "node": ">=8" } @@ -13216,15 +12966,13 @@ "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", "license": "MIT", - "optional": true, - "peer": true + "optional": true }, "node_modules/appium-safari-driver/node_modules/diff": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.2.tgz", "integrity": "sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==", "license": "BSD-3-Clause", - "peer": true, "engines": { "node": ">=0.3.1" } @@ -13234,7 +12982,6 @@ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", "license": "MIT", - "peer": true, "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", @@ -13248,43 +12995,37 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/enabled": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/encodeurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -13294,7 +13035,6 @@ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", "license": "MIT", - "peer": true, "dependencies": { "is-arrayish": "^0.2.1" } @@ -13304,7 +13044,6 @@ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.4" } @@ -13314,7 +13053,6 @@ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.4" } @@ -13324,7 +13062,6 @@ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", "license": "MIT", - "peer": true, "dependencies": { "es-errors": "^1.3.0" }, @@ -13337,7 +13074,6 @@ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", "license": "MIT", - "peer": true, "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", @@ -13353,7 +13089,6 @@ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -13362,15 +13097,13 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -13380,7 +13113,6 @@ "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -13390,7 +13122,6 @@ "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.8.x" } @@ -13400,7 +13131,6 @@ "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", "license": "Apache-2.0", - "peer": true, "dependencies": { "bare-events": "^2.7.0" } @@ -13410,7 +13140,6 @@ "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", "license": "MIT", - "peer": true, "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.0", @@ -13459,8 +13188,7 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/fast-uri": { "version": "3.1.0", @@ -13484,7 +13212,6 @@ "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 4.9.1" } @@ -13493,15 +13220,13 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/finalhandler": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", "license": "MIT", - "peer": true, "dependencies": { "debug": "^4.4.0", "encodeurl": "^2.0.0", @@ -13523,7 +13248,6 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "license": "MIT", - "peer": true, "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -13539,8 +13263,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/follow-redirects": { "version": "1.15.11", @@ -13553,7 +13276,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=4.0" }, @@ -13568,7 +13290,6 @@ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", "license": "ISC", - "peer": true, "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" @@ -13585,7 +13306,6 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "license": "ISC", - "peer": true, "engines": { "node": ">=14" }, @@ -13598,7 +13318,6 @@ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", "license": "MIT", - "peer": true, "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -13615,7 +13334,6 @@ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -13625,7 +13343,6 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "license": "MIT", - "peer": true, "dependencies": { "mime-db": "1.52.0" }, @@ -13638,7 +13355,6 @@ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -13648,7 +13364,6 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -13657,7 +13372,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/ftp-response-parser/-/ftp-response-parser-1.0.1.tgz", "integrity": "sha512-++Ahlo2hs/IC7UVQzjcSAfeUpCwTTzs4uvG5XfGnsinIFkWUYF4xWwPd5qZuK8MJrmUIxFMuHcfqaosCDjvIWw==", - "peer": true, "dependencies": { "readable-stream": "^1.0.31" }, @@ -13669,15 +13383,13 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/ftp-response-parser/node_modules/readable-stream": { "version": "1.1.14", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", "license": "MIT", - "peer": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.1", @@ -13689,15 +13401,13 @@ "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "license": "MIT", - "peer": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -13707,7 +13417,6 @@ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "license": "ISC", - "peer": true, "engines": { "node": "6.* || 8.* || >= 10.*" } @@ -13717,7 +13426,6 @@ "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -13730,7 +13438,6 @@ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "license": "MIT", - "peer": true, "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", @@ -13755,7 +13462,6 @@ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "license": "MIT", - "peer": true, "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" @@ -13769,7 +13475,6 @@ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -13782,7 +13487,6 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.3.tgz", "integrity": "sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==", "license": "ISC", - "peer": true, "dependencies": { "foreground-child": "^3.3.1", "jackspeak": "^4.1.1", @@ -13806,7 +13510,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", "license": "BlueOak-1.0.0", - "peer": true, "dependencies": { "@isaacs/brace-expansion": "^5.0.0" }, @@ -13822,7 +13525,6 @@ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.4" }, @@ -13834,23 +13536,20 @@ "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/appium-safari-driver/node_modules/handle-thing": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", "license": "MIT", - "optional": true, - "peer": true + "optional": true }, "node_modules/appium-safari-driver/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -13860,7 +13559,6 @@ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.4" }, @@ -13873,7 +13571,6 @@ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "license": "MIT", - "peer": true, "dependencies": { "has-symbols": "^1.0.3" }, @@ -13889,7 +13586,6 @@ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "license": "MIT", - "peer": true, "dependencies": { "function-bind": "^1.1.2" }, @@ -13901,8 +13597,7 @@ "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/appium-safari-driver/node_modules/hpack.js": { "version": "2.1.6", @@ -13910,7 +13605,6 @@ "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "inherits": "^2.0.1", "obuf": "^1.0.0", @@ -13923,8 +13617,7 @@ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "license": "MIT", - "optional": true, - "peer": true + "optional": true }, "node_modules/appium-safari-driver/node_modules/hpack.js/node_modules/readable-stream": { "version": "2.3.8", @@ -13932,7 +13625,6 @@ "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -13949,7 +13641,6 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -13959,15 +13650,13 @@ "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", "license": "MIT", - "optional": true, - "peer": true + "optional": true }, "node_modules/appium-safari-driver/node_modules/http-errors": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", "license": "MIT", - "peer": true, "dependencies": { "depd": "~2.0.0", "inherits": "~2.0.4", @@ -13987,15 +13676,13 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/http-status-codes/-/http-status-codes-2.3.0.tgz", "integrity": "sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/iconv-lite": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "license": "MIT", - "peer": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -14021,22 +13708,19 @@ "url": "https://feross.org/support" } ], - "license": "BSD-3-Clause", - "peer": true + "license": "BSD-3-Clause" }, "node_modules/appium-safari-driver/node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/appium-safari-driver/node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.10" } @@ -14045,15 +13729,13 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/is-core-module": { "version": "2.16.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "license": "MIT", - "peer": true, "dependencies": { "hasown": "^2.0.2" }, @@ -14069,7 +13751,6 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -14079,7 +13760,6 @@ "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -14097,15 +13777,13 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" }, @@ -14118,7 +13796,6 @@ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -14140,7 +13817,6 @@ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", "license": "BlueOak-1.0.0", - "peer": true, "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -14155,15 +13831,13 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/jsftp": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/jsftp/-/jsftp-2.1.3.tgz", "integrity": "sha512-r79EVB8jaNAZbq8hvanL8e8JGu2ZNr2bXdHC4ZdQhRImpSPpnWwm5DYVzQ5QxJmtGtKhNNuvqGgbNaFl604fEQ==", "license": "MIT", - "peer": true, "dependencies": { "debug": "^3.1.0", "ftp-response-parser": "^1.0.1", @@ -14181,7 +13855,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "license": "MIT", - "peer": true, "dependencies": { "ms": "^2.1.1" } @@ -14190,15 +13863,13 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/json-schema": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "license": "(AFL-2.1 OR BSD-3-Clause)", - "peer": true + "license": "(AFL-2.1 OR BSD-3-Clause)" }, "node_modules/appium-safari-driver/node_modules/json-schema-traverse": { "version": "1.0.0", @@ -14212,7 +13883,6 @@ "resolved": "https://registry.npmjs.org/klaw/-/klaw-4.1.0.tgz", "integrity": "sha512-1zGZ9MF9H22UnkpVeuaGKOjfA2t6WrfdrJmGjy16ykcjnKQDmHVX+KI477rpbGevz/5FD4MC3xf1oxylBgcaQw==", "license": "MIT", - "peer": true, "engines": { "node": ">=14.14.0" } @@ -14222,7 +13892,6 @@ "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -14231,15 +13900,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/lazystream": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", "license": "MIT", - "peer": true, "dependencies": { "readable-stream": "^2.0.5" }, @@ -14251,15 +13918,13 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/lazystream/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "license": "MIT", - "peer": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -14275,7 +13940,6 @@ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "license": "MIT", - "peer": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -14285,7 +13949,6 @@ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", "license": "MIT", - "peer": true, "engines": { "node": ">=14" }, @@ -14297,15 +13960,13 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "license": "MIT", - "peer": true, "dependencies": { "p-locate": "^5.0.0" }, @@ -14321,7 +13982,6 @@ "resolved": "https://registry.npmjs.org/lockfile/-/lockfile-1.0.4.tgz", "integrity": "sha512-cvbTwETRfsFh4nHsL1eGWapU1XFi5Ot9E85sWAwia7Y7EgB7vfqcZhTKZ+l7hCGxSPoushMv5GKhT5PdLv03WA==", "license": "ISC", - "peer": true, "dependencies": { "signal-exit": "^3.0.2" } @@ -14343,7 +14003,6 @@ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "license": "MIT", - "peer": true, "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" @@ -14360,7 +14019,6 @@ "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz", "integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==", "license": "MIT", - "peer": true, "dependencies": { "@colors/colors": "1.6.0", "@types/triple-beam": "^1.3.2", @@ -14387,7 +14045,6 @@ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.4" } @@ -14397,7 +14054,6 @@ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -14407,7 +14063,6 @@ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -14420,7 +14075,6 @@ "resolved": "https://registry.npmjs.org/method-override/-/method-override-3.0.0.tgz", "integrity": "sha512-IJ2NNN/mSl9w3kzWB92rcdHpz+HjkxhDJWNDBqSlas+zQdP8wBiJzITPg08M/k2uVvMow7Sk41atndNtt/PHSA==", "license": "MIT", - "peer": true, "dependencies": { "debug": "3.1.0", "methods": "~1.1.2", @@ -14436,7 +14090,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "license": "MIT", - "peer": true, "dependencies": { "ms": "2.0.0" } @@ -14445,15 +14098,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -14463,7 +14114,6 @@ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -14473,7 +14123,6 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", "license": "MIT", - "peer": true, "dependencies": { "mime-db": "^1.54.0" }, @@ -14490,7 +14139,6 @@ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -14500,8 +14148,7 @@ "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", "license": "ISC", - "optional": true, - "peer": true + "optional": true }, "node_modules/appium-safari-driver/node_modules/minipass": { "version": "7.1.2", @@ -14517,7 +14164,6 @@ "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", "license": "MIT", - "peer": true, "engines": { "node": "*" } @@ -14527,7 +14173,6 @@ "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.1.tgz", "integrity": "sha512-223dMRJtI/l25dJKWpgij2cMtywuG/WiUKXdvwfbhGKBhy1puASqXwFzmWZ7+K73vUPoR7SS2Qz2cI/g9MKw0A==", "license": "MIT", - "peer": true, "dependencies": { "basic-auth": "~2.0.1", "debug": "2.6.9", @@ -14544,7 +14189,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", - "peer": true, "dependencies": { "ms": "2.0.0" } @@ -14553,15 +14197,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/morgan/node_modules/on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", "license": "MIT", - "peer": true, "dependencies": { "ee-first": "1.1.1" }, @@ -14573,15 +14215,13 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/ncp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", "integrity": "sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==", "license": "MIT", - "peer": true, "bin": { "ncp": "bin/ncp" } @@ -14591,7 +14231,6 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -14638,7 +14277,6 @@ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "license": "BSD-2-Clause", - "peer": true, "dependencies": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", @@ -14651,7 +14289,6 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "license": "ISC", - "peer": true, "bin": { "semver": "bin/semver" } @@ -14661,7 +14298,6 @@ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -14671,7 +14307,6 @@ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.4" }, @@ -14684,15 +14319,13 @@ "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", "license": "MIT", - "optional": true, - "peer": true + "optional": true }, "node_modules/appium-safari-driver/node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "license": "MIT", - "peer": true, "dependencies": { "ee-first": "1.1.1" }, @@ -14705,7 +14338,6 @@ "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -14715,7 +14347,6 @@ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "license": "ISC", - "peer": true, "dependencies": { "wrappy": "1" } @@ -14725,7 +14356,6 @@ "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", "license": "MIT", - "peer": true, "dependencies": { "fn.name": "1.x.x" } @@ -14735,7 +14365,6 @@ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "license": "MIT", - "peer": true, "dependencies": { "mimic-fn": "^2.1.0" }, @@ -14751,7 +14380,6 @@ "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", "license": "MIT", - "peer": true, "dependencies": { "bl": "^4.1.0", "chalk": "^4.1.0", @@ -14775,7 +14403,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -14785,7 +14412,6 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "license": "MIT", - "peer": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -14798,7 +14424,6 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "license": "MIT", - "peer": true, "dependencies": { "yocto-queue": "^0.1.0" }, @@ -14814,7 +14439,6 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "license": "MIT", - "peer": true, "dependencies": { "p-limit": "^3.0.2" }, @@ -14830,7 +14454,6 @@ "resolved": "https://registry.npmjs.org/package-changed/-/package-changed-3.0.0.tgz", "integrity": "sha512-HSRbrO+Ab5AuqqYGSevtKJ1Yt96jW1VKV7wrp8K4SKj5tyDp/7D96uPCQyCPiNtWTEH/7nA3hZ4z2slbc9yFxg==", "license": "ISC", - "peer": true, "dependencies": { "commander": "^6.2.0" }, @@ -14849,7 +14472,6 @@ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -14867,7 +14489,6 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/parse-listing/-/parse-listing-1.1.3.tgz", "integrity": "sha512-a1p1i+9Qyc8pJNwdrSvW1g5TPxRH0sywVi6OzVvYHRo6xwF9bDWBxtH0KkxeOOvhUE8vAMtiSfsYQFOuK901eA==", - "peer": true, "engines": { "node": ">=0.6.21" } @@ -14877,7 +14498,6 @@ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -14887,7 +14507,6 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -14897,7 +14516,6 @@ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -14906,8 +14524,7 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/path-scurry": { "version": "2.0.1", @@ -14930,7 +14547,6 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", "license": "MIT", - "peer": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/express" @@ -14940,22 +14556,19 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/appium-safari-driver/node_modules/pkg-dir": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", "license": "MIT", - "peer": true, "dependencies": { "find-up": "^5.0.0" }, @@ -14968,7 +14581,6 @@ "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", "license": "MIT", - "peer": true, "dependencies": { "@xmldom/xmldom": "^0.8.8", "base64-js": "^1.5.1", @@ -14983,7 +14595,6 @@ "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", "license": "MIT", - "peer": true, "engines": { "node": ">=4" } @@ -15016,7 +14627,6 @@ "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6.0" } @@ -15025,15 +14635,13 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "license": "MIT", - "peer": true, "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" @@ -15046,15 +14654,13 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/qs": { "version": "6.14.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", "license": "BSD-3-Clause", - "peer": true, "dependencies": { "side-channel": "^1.1.0" }, @@ -15070,7 +14676,6 @@ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -15080,7 +14685,6 @@ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", "license": "MIT", - "peer": true, "dependencies": { "bytes": "~3.1.2", "http-errors": "~2.0.1", @@ -15096,7 +14700,6 @@ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", "license": "MIT", - "peer": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -15113,7 +14716,6 @@ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "license": "MIT", - "peer": true, "dependencies": { "@types/normalize-package-data": "^2.4.0", "normalize-package-data": "^2.5.0", @@ -15129,7 +14731,6 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", "license": "(MIT OR CC0-1.0)", - "peer": true, "engines": { "node": ">=8" } @@ -15139,7 +14740,6 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", "license": "MIT", - "peer": true, "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", @@ -15170,7 +14770,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" @@ -15181,7 +14780,6 @@ "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", "license": "Apache-2.0", - "peer": true, "dependencies": { "minimatch": "^5.1.0" } @@ -15191,7 +14789,6 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "license": "MIT", - "peer": true, "dependencies": { "balanced-match": "^1.0.0" } @@ -15201,7 +14798,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "license": "ISC", - "peer": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -15224,7 +14820,6 @@ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", "license": "MIT", - "peer": true, "dependencies": { "is-core-module": "^2.16.1", "path-parse": "^1.0.7", @@ -15245,7 +14840,6 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -15255,7 +14849,6 @@ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "license": "MIT", - "peer": true, "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" @@ -15320,7 +14913,6 @@ "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", "license": "MIT", - "peer": true, "dependencies": { "debug": "^4.4.0", "depd": "^2.0.0", @@ -15336,15 +14928,13 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/safe-stable-stringify": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", "license": "MIT", - "peer": true, "engines": { "node": ">=10" } @@ -15353,15 +14943,13 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/sanitize-filename": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", "license": "WTFPL OR ISC", - "peer": true, "dependencies": { "truncate-utf8-bytes": "^1.0.0" } @@ -15371,8 +14959,7 @@ "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", "license": "MIT", - "optional": true, - "peer": true + "optional": true }, "node_modules/appium-safari-driver/node_modules/semver": { "version": "7.7.3", @@ -15391,7 +14978,6 @@ "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", "license": "MIT", - "peer": true, "dependencies": { "debug": "^4.3.5", "encodeurl": "^2.0.0", @@ -15414,7 +15000,6 @@ "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.5.1.tgz", "integrity": "sha512-JndLBslCLA/ebr7rS3d+/EKkzTsTi1jI2T9l+vHfAaGJ7A7NhtDpSZ0lx81HCNWnnE0yHncG+SSnVf9IMxOwXQ==", "license": "MIT", - "peer": true, "dependencies": { "etag": "~1.8.1", "fresh": "~0.5.2", @@ -15431,7 +15016,6 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -15454,15 +15038,13 @@ "url": "https://feross.org/support" } ], - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/serve-static": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", "license": "MIT", - "peer": true, "dependencies": { "encodeurl": "^2.0.0", "escape-html": "^1.0.3", @@ -15483,8 +15065,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/appium-safari-driver/node_modules/sharp": { "version": "0.34.5", @@ -15493,7 +15074,6 @@ "hasInstallScript": true, "license": "Apache-2.0", "optional": true, - "peer": true, "dependencies": { "@img/colour": "^1.0.0", "detect-libc": "^2.1.2", @@ -15537,7 +15117,6 @@ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "license": "MIT", - "peer": true, "dependencies": { "shebang-regex": "^3.0.0" }, @@ -15550,7 +15129,6 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -15572,7 +15150,6 @@ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "license": "MIT", - "peer": true, "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", @@ -15592,7 +15169,6 @@ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", "license": "MIT", - "peer": true, "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" @@ -15609,7 +15185,6 @@ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", "license": "MIT", - "peer": true, "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -15628,7 +15203,6 @@ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "license": "MIT", - "peer": true, "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -15647,8 +15221,7 @@ "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/appium-safari-driver/node_modules/source-map": { "version": "0.6.1", @@ -15674,7 +15247,6 @@ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "license": "Apache-2.0", - "peer": true, "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -15684,15 +15256,13 @@ "version": "2.5.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "license": "CC-BY-3.0", - "peer": true + "license": "CC-BY-3.0" }, "node_modules/appium-safari-driver/node_modules/spdx-expression-parse": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "license": "MIT", - "peer": true, "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -15702,8 +15272,7 @@ "version": "3.0.22", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz", "integrity": "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==", - "license": "CC0-1.0", - "peer": true + "license": "CC0-1.0" }, "node_modules/appium-safari-driver/node_modules/spdy": { "version": "4.0.2", @@ -15711,7 +15280,6 @@ "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "debug": "^4.1.0", "handle-thing": "^2.0.0", @@ -15729,7 +15297,6 @@ "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "debug": "^4.1.0", "detect-node": "^2.0.4", @@ -15745,7 +15312,6 @@ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -15760,7 +15326,6 @@ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", "license": "MIT", - "peer": true, "engines": { "node": "*" } @@ -15770,7 +15335,6 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -15780,7 +15344,6 @@ "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", "integrity": "sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==", "license": "Unlicense", - "peer": true, "engines": { "node": ">= 0.10.0" } @@ -15790,7 +15353,6 @@ "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz", "integrity": "sha512-6yHMqgLYDzQDcAkL+tjJDC5nSNuNIx0vZtRZeiPh7Saef7VHX9H5Ijn9l2VIol2zaNYlYEX6KyuT/237A58qEQ==", "license": "MIT", - "peer": true, "dependencies": { "duplexer": "~0.1.1", "through": "~2.3.4" @@ -15801,7 +15363,6 @@ "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.23.0.tgz", "integrity": "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==", "license": "MIT", - "peer": true, "dependencies": { "events-universal": "^1.0.0", "fast-fifo": "^1.3.2", @@ -15813,7 +15374,6 @@ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "license": "MIT", - "peer": true, "dependencies": { "safe-buffer": "~5.2.0" } @@ -15836,15 +15396,13 @@ "url": "https://feross.org/support" } ], - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "license": "MIT", - "peer": true, "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -15863,7 +15421,6 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "license": "MIT", - "peer": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -15878,7 +15435,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -15887,15 +15443,13 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/string-width-cjs/node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "license": "MIT", - "peer": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -15908,7 +15462,6 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", "license": "MIT", - "peer": true, "dependencies": { "ansi-regex": "^6.0.1" }, @@ -15925,7 +15478,6 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "license": "MIT", - "peer": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -15938,7 +15490,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -15948,7 +15499,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "license": "MIT", - "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -15964,7 +15514,6 @@ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.4" }, @@ -15977,7 +15526,6 @@ "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz", "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==", "license": "MIT", - "peer": true, "engines": { "node": ">=20" }, @@ -15990,7 +15538,6 @@ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", "license": "MIT", - "peer": true, "dependencies": { "b4a": "^1.6.4", "fast-fifo": "^1.2.0", @@ -16018,7 +15565,6 @@ "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", "license": "Apache-2.0", - "peer": true, "dependencies": { "b4a": "^1.6.4" } @@ -16027,22 +15573,19 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.6" } @@ -16052,7 +15595,6 @@ "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 14.0.0" } @@ -16062,7 +15604,6 @@ "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", "license": "WTFPL", - "peer": true, "dependencies": { "utf8-byte-length": "^1.0.1" } @@ -16079,7 +15620,6 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.2.0.tgz", "integrity": "sha512-xxCJm+Bckc6kQBknN7i9fnP/xobQRsRQxR01CztFkp/h++yfVxUUcmMgfR2HttJx/dpWjS9ubVuyspJv24Q9DA==", "license": "(MIT OR CC0-1.0)", - "peer": true, "dependencies": { "tagged-tag": "^1.0.0" }, @@ -16095,7 +15635,6 @@ "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", "license": "MIT", - "peer": true, "dependencies": { "content-type": "^1.0.5", "media-typer": "^1.1.0", @@ -16110,7 +15649,6 @@ "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz", "integrity": "sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==", "license": "MIT or GPL-2.0", - "peer": true, "engines": { "node": ">= 0.4.0" } @@ -16120,7 +15658,6 @@ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -16129,15 +15666,13 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz", "integrity": "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==", - "license": "(WTFPL OR MIT)", - "peer": true + "license": "(WTFPL OR MIT)" }, "node_modules/appium-safari-driver/node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/uuid": { "version": "13.0.0", @@ -16157,7 +15692,6 @@ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "license": "Apache-2.0", - "peer": true, "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" @@ -16168,7 +15702,6 @@ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -16179,7 +15712,6 @@ "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "minimalistic-assert": "^1.0.0" } @@ -16189,7 +15721,6 @@ "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "license": "MIT", - "peer": true, "dependencies": { "defaults": "^1.0.3" } @@ -16199,7 +15730,6 @@ "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", "license": "ISC", - "peer": true, "dependencies": { "isexe": "^3.1.1" }, @@ -16215,7 +15745,6 @@ "resolved": "https://registry.npmjs.org/winston/-/winston-3.18.3.tgz", "integrity": "sha512-NoBZauFNNWENgsnC9YpgyYwOVrl2m58PpQ8lNHjV3kosGs7KJ7Npk9pCUE+WJlawVSe8mykWDKWFSVfs3QO9ww==", "license": "MIT", - "peer": true, "dependencies": { "@colors/colors": "^1.6.0", "@dabh/diagnostics": "^2.0.8", @@ -16238,7 +15767,6 @@ "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz", "integrity": "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==", "license": "MIT", - "peer": true, "dependencies": { "logform": "^2.7.0", "readable-stream": "^3.6.2", @@ -16253,7 +15781,6 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", - "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -16268,7 +15795,6 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", - "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -16283,7 +15809,6 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -16302,7 +15827,6 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -16320,7 +15844,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -16329,15 +15852,13 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/wrap-ansi-cjs/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "license": "MIT", - "peer": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -16352,7 +15873,6 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "license": "MIT", - "peer": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -16365,7 +15885,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -16374,15 +15893,13 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/wrap-ansi/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "license": "MIT", - "peer": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -16397,7 +15914,6 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "license": "MIT", - "peer": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -16409,15 +15925,13 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/appium-safari-driver/node_modules/ws": { "version": "8.18.3", "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", "license": "MIT", - "peer": true, "engines": { "node": ">=10.0.0" }, @@ -16439,7 +15953,6 @@ "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", "license": "MIT", - "peer": true, "engines": { "node": ">=8.0" } @@ -16449,7 +15962,6 @@ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "license": "ISC", - "peer": true, "engines": { "node": ">=10" } @@ -16459,7 +15971,6 @@ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", "license": "ISC", - "peer": true, "bin": { "yaml": "bin.mjs" }, @@ -16472,7 +15983,6 @@ "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", "license": "MIT", - "peer": true, "dependencies": { "cliui": "^9.0.1", "escalade": "^3.1.1", @@ -16490,7 +16000,6 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", "license": "ISC", - "peer": true, "engines": { "node": "^20.19.0 || ^22.12.0 || >=23" } @@ -16499,15 +16008,13 @@ "version": "10.6.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/yargs/node_modules/string-width": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "license": "MIT", - "peer": true, "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", @@ -16525,7 +16032,6 @@ "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-3.2.0.tgz", "integrity": "sha512-Ow9nuGZE+qp1u4JIPvg+uCiUr7xGQWdff7JQSk5VGYTAZMDe2q8lxJ10ygv10qmSj031Ty/6FNJpLO4o1Sgc+w==", "license": "MIT", - "peer": true, "dependencies": { "buffer-crc32": "~0.2.3", "pend": "~1.2.0" @@ -16539,7 +16045,6 @@ "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", "license": "MIT", - "peer": true, "engines": { "node": "*" } @@ -16549,7 +16054,6 @@ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -16562,7 +16066,6 @@ "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-6.0.1.tgz", "integrity": "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==", "license": "MIT", - "peer": true, "dependencies": { "archiver-utils": "^5.0.0", "compress-commons": "^6.0.2", @@ -17949,34 +17452,8 @@ } }, "node_modules/doc-detective-common": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/doc-detective-common/-/doc-detective-common-3.6.0.tgz", - "integrity": "sha512-rHZ3WNuw3Y51KduBh9GgnrYFzJdbCQHPP3xnkp+W8QyF+4bKhWFlVVmbotFh/XL3BupbV9+CP7YEBTsW02Hvuw==", - "license": "AGPL-3.0-only", - "dependencies": { - "@apidevtools/json-schema-ref-parser": "^15.1.3", - "ajv": "^8.17.1", - "ajv-errors": "^3.0.0", - "ajv-formats": "^3.0.1", - "ajv-keywords": "^5.1.0", - "axios": "^1.13.2", - "yaml": "^2.8.2" - } - }, - "node_modules/doc-detective-common/node_modules/yaml": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", - "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", - "license": "ISC", - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14.6" - }, - "funding": { - "url": "https://github.com/sponsors/eemeli" - } + "resolved": "../common", + "link": true }, "node_modules/doc-detective-resolver": { "version": "3.6.1", @@ -19613,6 +19090,7 @@ "resolved": "https://registry.npmjs.org/jsep/-/jsep-1.4.0.tgz", "integrity": "sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw==", "license": "MIT", + "peer": true, "engines": { "node": ">= 10.16.0" } diff --git a/core/package.json b/core/package.json index d1d0c53..b2cc3b9 100644 --- a/core/package.json +++ b/core/package.json @@ -36,7 +36,7 @@ "appium-geckodriver": "^2.1.2", "appium-safari-driver": "^4.1.2", "axios": "^1.13.2", - "doc-detective-common": "^3.6.0", + "doc-detective-common": "file:../common", "doc-detective-resolver": "^3.6.1", "dotenv": "^17.2.3", "geckodriver": "^6.1.0", diff --git a/core/src/tests/annotateScreenshot.js b/core/src/tests/annotateScreenshot.js new file mode 100644 index 0000000..6887b8f --- /dev/null +++ b/core/src/tests/annotateScreenshot.js @@ -0,0 +1,190 @@ +const sharp = require("sharp"); +const fs = require("fs"); +const { findElement } = require("./findElement"); +const { log } = require("../utils"); + +// Export +exports.annotateScreenshot = annotateScreenshot; + +// Helper to escape XML for SVG text +function escapeXml(str = "") { + return String(str).replace(/[<>&'\"]/g, (c) => + ({ "<": "<", ">": ">", "&": "&", "'": "'", '"': """ }[c]) + ); +} + +async function annotateScreenshot({ config, filePath, annotations = [], driver }) { + try { + log(config, "debug", `Starting SVG-based annotation of screenshot: ${filePath}`); + + if (!Array.isArray(annotations) || annotations.length === 0) { + log(config, "debug", "No annotations provided, skipping."); + return { success: true }; + } + + // Read image metadata + const image = sharp(filePath); + const meta = await image.metadata(); + const width = meta.width || 0; + const height = meta.height || 0; + + // Get device pixel ratio from driver, default to 1 + let pixelDensity = 1; + try { + const pd = await driver.execute(() => window.devicePixelRatio).catch(() => undefined); + if (pd && typeof pd === "number") pixelDensity = pd; + } catch (e) { + /* ignore */ + } + log(config, "debug", `Pixel density: ${pixelDensity}`); + + // Resolve any `find` annotations to bounding rects + const resolved = []; + for (const ann of annotations) { + const a = { ...ann }; + a._rect = null; + if (a.find) { + const findStep = { find: a.find }; + const findResult = await findElement({ config, step: findStep, driver }); + if (findResult.status === "FAIL") { + throw new Error(`Could not find element for annotation: ${findResult.description}`); + } + const element = findResult.outputs?.rawElement; + if (!element) throw new Error("Element not found for annotation"); + + const rect = await driver.execute((el) => { + const b = el.getBoundingClientRect(); + return { x: b.left, y: b.top, width: b.width, height: b.height }; + }, element); + + a._rect = { + x: Math.round(rect.x * pixelDensity), + y: Math.round(rect.y * pixelDensity), + width: Math.round(rect.width * pixelDensity), + height: Math.round(rect.height * pixelDensity), + }; + } + resolved.push(a); + } + + // Build SVG overlay (without blur regions) + const svgParts = []; + svgParts.push(``); + + for (const a of resolved) { + // Compute base x,y,width,height helpers + const baseX = (a.position && typeof a.position.x === 'number') ? Math.round(a.position.x * pixelDensity) : (a._rect ? a._rect.x : 0); + const baseY = (a.position && typeof a.position.y === 'number') ? Math.round(a.position.y * pixelDensity) : (a._rect ? a._rect.y : 0); + const baseW = (a.rectangle && a.rectangle.width) ? Math.round(a.rectangle.width * pixelDensity) : (a._rect ? a._rect.width : undefined); + const baseH = (a.rectangle && a.rectangle.height) ? Math.round(a.rectangle.height * pixelDensity) : (a._rect ? a._rect.height : undefined); + + if (a.rectangle) { + const rx = (a.rectangle.rx || 0) * pixelDensity; + const ry = (a.rectangle.ry || 0) * pixelDensity; + const stroke = a.rectangle.stroke || '#FF0000'; + const strokeW = (a.rectangle.strokeWidth || 2) * pixelDensity; + const fill = (a.rectangle.fill === 'transparent') ? 'none' : (a.rectangle.fill || 'none'); + const opacity = a.rectangle.opacity == null ? 1 : a.rectangle.opacity; + const w = baseW || (100 * pixelDensity); + const h = baseH || (100 * pixelDensity); + svgParts.push(``); + continue; + } + + if (a.circle) { + const cx = baseX; + const cy = baseY; + const r = Math.round((a.circle.radius || 30) * pixelDensity); + const fill = (a.circle.fill === 'transparent') ? 'none' : (a.circle.fill || 'none'); + const stroke = a.circle.stroke || '#FF0000'; + const strokeW = (a.circle.strokeWidth || 2) * pixelDensity; + const opacity = a.circle.opacity == null ? 1 : a.circle.opacity; + svgParts.push(``); + continue; + } + + if (a.line || a.arrow) { + const from = (a.line && a.line.from) || (a.arrow && a.arrow.from) || { x: 0, y: 0 }; + const to = (a.line && a.line.to) || (a.arrow && a.arrow.to) || { x: 10, y: 10 }; + const fx = baseX + Math.round((from.x || 0) * pixelDensity); + const fy = baseY + Math.round((from.y || 0) * pixelDensity); + const tx = baseX + Math.round((to.x || 0) * pixelDensity); + const ty = baseY + Math.round((to.y || 0) * pixelDensity); + const color = (a.line && a.line.color) || (a.arrow && a.arrow.color) || '#000000'; + const strokeW = ((a.line && a.line.strokeWidth) || (a.arrow && a.arrow.strokeWidth) || 2) * pixelDensity; + svgParts.push(``); + if (a.arrow) { + const head = (a.arrow.headSize || 15) * pixelDensity; + const angle = Math.atan2(ty - fy, tx - fx); + const hx = tx; + const hy = ty; + const leftX = hx - Math.cos(angle) * head + Math.sin(angle) * (head / 2); + const leftY = hy - Math.sin(angle) * head - Math.cos(angle) * (head / 2); + const rightX = hx - Math.cos(angle) * head - Math.sin(angle) * (head / 2); + const rightY = hy - Math.sin(angle) * head + Math.cos(angle) * (head / 2); + svgParts.push(``); + } + continue; + } + + if (a.text) { + const x = baseX; + const y = baseY; + const fontSize = ((a.text.fontSize || 16) * pixelDensity); + const color = a.text.color || '#000000'; + const opacity = a.text.opacity == null ? 1 : a.text.opacity; + const family = a.text.fontFamily || 'Arial, sans-serif'; + const content = escapeXml(a.text.content || ''); + svgParts.push(`${content}`); + continue; + } + + if (a.highlight) { + const x = baseX; + const y = baseY; + const w = baseW || (a.highlight.width ? Math.round(a.highlight.width * pixelDensity) : (a._rect ? a._rect.width : 100)); + const h = baseH || (a.highlight.height ? Math.round(a.highlight.height * pixelDensity) : (a._rect ? a._rect.height : 100)); + const color = a.highlight.color || '#FFFF00'; + const opacity = a.highlight.opacity == null ? 0.3 : a.highlight.opacity; + svgParts.push(``); + continue; + } + + // blur handled after SVG compositing via sharp + } + + svgParts.push(``); + const svg = svgParts.join('\n'); + + // Composite SVG overlay onto original image -> buffer + const baseBuffer = await image.composite([{ input: Buffer.from(svg), blend: 'over' }]).png().toBuffer(); + + // If there are blur annotations, apply them by extracting, blurring, and compositing + const blurAnns = resolved.filter((a) => a.blur); + if (blurAnns.length > 0) { + let working = sharp(baseBuffer); + for (const b of blurAnns) { + const bx = (b.position && typeof b.position.x === 'number') ? Math.round(b.position.x * pixelDensity) : (b._rect ? b._rect.x : 0); + const by = (b.position && typeof b.position.y === 'number') ? Math.round(b.position.y * pixelDensity) : (b._rect ? b._rect.y : 0); + const bw = (b.blur && b.blur.width) ? Math.round(b.blur.width * pixelDensity) : (b._rect ? b._rect.width : Math.round((b.blur && b.blur.width) || 100)); + const bh = (b.blur && b.blur.height) ? Math.round(b.blur.height * pixelDensity) : (b._rect ? b._rect.height : Math.round((b.blur && b.blur.height) || 50)); + try { + const extracted = await sharp(baseBuffer).extract({ left: bx, top: by, width: bw, height: bh }).blur(b.blur.intensity || 10).toBuffer(); + working = working.composite([{ input: extracted, left: bx, top: by }]); + } catch (err) { + log(config, 'warn', `Couldn't apply blur for annotation: ${err.message}`); + } + } + await working.png().toFile(filePath); + } else { + // No blur; write composed buffer directly + fs.writeFileSync(filePath, baseBuffer); + } + + log(config, 'debug', `Successfully annotated screenshot with ${annotations.length} annotation(s)`); + return { success: true }; + } catch (error) { + log(config, 'error', `Annotation failed: ${error.message}`); + return { success: false, error: error.message }; + } +} diff --git a/core/src/tests/saveScreenshot.js b/core/src/tests/saveScreenshot.js index b339df6..879e797 100644 --- a/core/src/tests/saveScreenshot.js +++ b/core/src/tests/saveScreenshot.js @@ -88,7 +88,7 @@ async function saveScreenshot({ config, step, driver }) { result.description = `File already exists: ${filePath}`; return result; } else { - // Set temp file path + await sharp(filePath) existFilePath = filePath; filePath = path.join(dir, `${step.stepId}_${Date.now()}.png`); } @@ -283,6 +283,27 @@ async function saveScreenshot({ config, step, driver }) { } } + // Apply annotations if specified + if (step.screenshot.annotations && Array.isArray(step.screenshot.annotations)) { + const { annotateScreenshot } = require("./annotateScreenshot"); + + // Always annotate the newly captured screenshot (filePath) + const annotationResult = await annotateScreenshot({ + config, + filePath: filePath, + annotations: step.screenshot.annotations, + driver, + }); + + if (!annotationResult.success) { + result.status = "FAIL"; + result.description = `Annotation failed: ${annotationResult.error}`; + return result; + } + + result.description += ` Added ${step.screenshot.annotations.length} annotation(s).`; + } + // If file already exists // If overwrite is true, replace old file with new file // If overwrite is aboveVariation, compare files and replace if variance is greater than threshold diff --git a/core/test/artifacts/annotations-simple.spec.json b/core/test/artifacts/annotations-simple.spec.json new file mode 100644 index 0000000..d95b7c5 --- /dev/null +++ b/core/test/artifacts/annotations-simple.spec.json @@ -0,0 +1,36 @@ +{ + "specId": "annotation-simple-test", + "tests": [ + { + "testId": "test-simple-annotation", + "description": "Test simple text annotation without element finding", + "steps": [ + { + "goTo": "http://localhost:8092/index.html" + }, + { + "stepId": "annotation-text-only", + "screenshot": { + "path": "annotation-text-simple.png", + "directory": "test/artifacts/annotations", + "overwrite": "true", + "annotations": [ + { + "position": { + "x": 50, + "y": 50 + }, + "text": { + "content": "Simple Test", + "fontSize": 20, + "color": "#FF0000", + "backgroundColor": "#FFFFFF" + } + } + ] + } + } + ] + } + ] +} diff --git a/core/test/artifacts/annotations.spec.json b/core/test/artifacts/annotations.spec.json new file mode 100644 index 0000000..21856cd --- /dev/null +++ b/core/test/artifacts/annotations.spec.json @@ -0,0 +1,225 @@ +{ + "specId": "screenshot-annotations", + "tests": [ + { + "testId": "test-annotations", + "description": "Test screenshot annotations with various types", + "steps": [ + { + "goTo": "http://localhost:8092/index.html" + }, + { + "stepId": "annotation-arrow", + "screenshot": { + "path": "annotation-arrow.png", + "directory": "test/artifacts/annotations", + "maxVariation": 0.1, + "annotations": [ + { + "find": { + "selector": "#text-input" + }, + "position": "center", + "arrow": { + "from": { "x": 0, "y": -50 }, + "to": { "x": 0, "y": 0 }, + "color": "#FF0000", + "strokeWidth": 4, + "headSize": 15 + } + } + ] + } + }, + { + "stepId": "annotation-text", + "screenshot": { + "path": "annotation-text.png", + "directory": "test/artifacts/annotations", + "maxVariation": 0.1, + "annotations": [ + { + "position": "top-right", + "text": { + "content": "Important Notice", + "fontSize": 18, + "color": "#FFFFFF", + "backgroundColor": "#0000FF", + "padding": 10, + "maxWidth": 200, + "opacity": 0.9 + } + } + ] + } + }, + { + "stepId": "annotation-rectangle", + "screenshot": { + "path": "annotation-rectangle.png", + "directory": "test/artifacts/annotations", + "maxVariation": 0.1, + "annotations": [ + { + "find": { + "selector": "#password-input" + }, + "rectangle": { + "stroke": "#00FF00", + "strokeWidth": 3, + "fill": "rgba(0, 255, 0, 0.2)", + "rx": 5, + "ry": 5 + } + } + ] + } + }, + { + "stepId": "annotation-circle", + "screenshot": { + "path": "annotation-circle.png", + "directory": "test/artifacts/annotations", + "maxVariation": 0.1, + "annotations": [ + { + "find": { + "elementText": "Submit Button" + }, + "position": "center", + "circle": { + "radius": 40, + "stroke": "#FF00FF", + "strokeWidth": 3, + "fill": "transparent" + } + } + ] + } + }, + { + "stepId": "annotation-line", + "screenshot": { + "path": "annotation-line.png", + "directory": "test/artifacts/annotations", + "maxVariation": 0.1, + "annotations": [ + { + "position": { "x": 50, "y": 50 }, + "line": { + "from": { "x": 0, "y": 0 }, + "to": { "x": 100, "y": 100 }, + "color": "#0000FF", + "strokeWidth": 3, + "dashArray": [5, 5] + } + } + ] + } + }, + { + "stepId": "annotation-highlight", + "screenshot": { + "path": "annotation-highlight.png", + "directory": "test/artifacts/annotations", + "maxVariation": 0.1, + "annotations": [ + { + "find": { + "selector": "h1" + }, + "highlight": { + "color": "#FFFF00", + "opacity": 0.4 + } + } + ] + } + }, + { + "stepId": "annotation-blur", + "screenshot": { + "path": "annotation-blur.png", + "directory": "test/artifacts/annotations", + "maxVariation": 0.1, + "annotations": [ + { + "find": { + "selector": "#password-input" + }, + "blur": { + "intensity": 15 + } + } + ] + } + }, + { + "stepId": "annotation-callout", + "screenshot": { + "path": "annotation-callout.png", + "directory": "test/artifacts/annotations", + "maxVariation": 0.1, + "annotations": [ + { + "find": { + "selector": "#text-input" + }, + "position": "center", + "callout": { + "content": "Enter your username here", + "target": { "x": 0, "y": 0 }, + "fontSize": 14, + "color": "#000000", + "backgroundColor": "#FFFFCC", + "arrowColor": "#000000", + "maxWidth": 150 + } + } + ] + } + }, + { + "stepId": "annotation-multiple", + "screenshot": { + "path": "annotation-multiple.png", + "directory": "test/artifacts/annotations", + "maxVariation": 0.1, + "annotations": [ + { + "find": { + "selector": "#text-input" + }, + "position": "center", + "arrow": { + "from": { "x": 0, "y": -50 }, + "to": { "x": 0, "y": 0 }, + "color": "#FF0000", + "strokeWidth": 3 + } + }, + { + "find": { + "selector": "#password-input" + }, + "rectangle": { + "stroke": "#00FF00", + "strokeWidth": 2 + } + }, + { + "position": "top-right", + "text": { + "content": "Test Page", + "fontSize": 16, + "color": "#000000", + "backgroundColor": "#FFFFFF" + } + } + ] + } + } + ] + } + ] +} diff --git a/core/test/artifacts/enhanced-modal-large.png b/core/test/artifacts/enhanced-modal-large.png new file mode 100644 index 0000000..f2ea351 Binary files /dev/null and b/core/test/artifacts/enhanced-modal-large.png differ diff --git a/core/test/artifacts/enhanced-modal.png b/core/test/artifacts/enhanced-modal.png new file mode 100644 index 0000000..558ee29 Binary files /dev/null and b/core/test/artifacts/enhanced-modal.png differ diff --git a/core/test/artifacts/screenshot-with-crop-elementTestId_1765828572849.png b/core/test/artifacts/screenshot-with-crop-elementTestId_1765828572849.png new file mode 100644 index 0000000..19b83f1 Binary files /dev/null and b/core/test/artifacts/screenshot-with-crop-elementTestId_1765828572849.png differ diff --git a/core/test/artifacts/test/artifacts/annotations/annotation-arrow.png b/core/test/artifacts/test/artifacts/annotations/annotation-arrow.png new file mode 100644 index 0000000..ac82900 Binary files /dev/null and b/core/test/artifacts/test/artifacts/annotations/annotation-arrow.png differ diff --git a/core/test/artifacts/test/artifacts/annotations/annotation-arrow_1765852453886.png b/core/test/artifacts/test/artifacts/annotations/annotation-arrow_1765852453886.png new file mode 100644 index 0000000..ac82900 Binary files /dev/null and b/core/test/artifacts/test/artifacts/annotations/annotation-arrow_1765852453886.png differ diff --git a/core/test/artifacts/test/artifacts/annotations/annotation-arrow_1765852858413.png b/core/test/artifacts/test/artifacts/annotations/annotation-arrow_1765852858413.png new file mode 100644 index 0000000..ac82900 Binary files /dev/null and b/core/test/artifacts/test/artifacts/annotations/annotation-arrow_1765852858413.png differ diff --git a/core/test/artifacts/test/artifacts/annotations/annotation-arrow_1765856264741.png b/core/test/artifacts/test/artifacts/annotations/annotation-arrow_1765856264741.png new file mode 100644 index 0000000..ac82900 Binary files /dev/null and b/core/test/artifacts/test/artifacts/annotations/annotation-arrow_1765856264741.png differ diff --git a/core/test/artifacts/test/artifacts/annotations/annotation-text-simple.png b/core/test/artifacts/test/artifacts/annotations/annotation-text-simple.png new file mode 100644 index 0000000..92d5fdd Binary files /dev/null and b/core/test/artifacts/test/artifacts/annotations/annotation-text-simple.png differ diff --git a/core/test/runAnnotateSmoke.js b/core/test/runAnnotateSmoke.js new file mode 100644 index 0000000..6f3a25d --- /dev/null +++ b/core/test/runAnnotateSmoke.js @@ -0,0 +1,31 @@ +const path = require('path'); +const { annotateScreenshot } = require('../src/tests/annotateScreenshot'); + +(async () => { + const filePath = path.resolve(__dirname, 'test-canvas-output.png'); + console.log('Using file:', filePath); + + // Simple driver stub with execute returning devicePixelRatio + const driver = { + execute: async (fn, ...args) => { + // If fn is a function (from WDIO's execute), call it in node context where window isn't defined + // We'll handle only window.devicePixelRatio case + try { + if (typeof fn === 'function') { + const code = fn.toString(); + if (code.includes('window.devicePixelRatio')) return 1; + } + } catch (e) {} + return undefined; + }, + }; + + const annotations = [ + { text: { content: 'Smoke test', fontSize: 24, color: '#00AA00' }, position: { x: 20, y: 20 } }, + { rectangle: { stroke: '#FF0000', strokeWidth: 4 }, position: { x: 50, y: 50 } }, + { circle: { radius: 30, stroke: '#0000FF', strokeWidth: 3 }, position: { x: 200, y: 80 } }, + ]; + + const res = await annotateScreenshot({ config: { logLevel: 'silent' }, filePath, annotations, driver }); + console.log('Result:', res); +})(); \ No newline at end of file diff --git a/core/test/temp-screenshot-regression-test.json b/core/test/temp-screenshot-regression-test.json new file mode 100644 index 0000000..6ff985b --- /dev/null +++ b/core/test/temp-screenshot-regression-test.json @@ -0,0 +1,18 @@ +{ + "tests": [ + { + "steps": [ + { + "goTo": "http://localhost:8092/drag-drop-test.html" + }, + { + "screenshot": { + "path": "/home/hawkeyexl/Workspaces/.github/core/test/temp-regression-screenshot.png", + "maxVariation": 0.05, + "overwrite": "aboveVariation" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/core/test/test-annotations.js b/core/test/test-annotations.js new file mode 100644 index 0000000..0b6fcb3 --- /dev/null +++ b/core/test/test-annotations.js @@ -0,0 +1,44 @@ +const { runTests } = require("../src"); +const path = require("path"); + +async function testAnnotations() { + console.log("Testing annotations..."); + + const config = { + runTests: { + input: path.resolve(__dirname, "artifacts/annotations.spec.json"), + }, + logLevel: "info", + telemetry: { send: false } + }; + + try { + const result = await runTests(config); + console.log("\n=== Test Results ==="); + console.log("Specs:", result.summary.specs); + console.log("Tests:", result.summary.tests); + console.log("Steps:", result.summary.steps); + + if (result.summary.specs.fail > 0 || result.summary.tests.fail > 0) { + console.log("\n=== Failed Tests ==="); + result.specs.forEach((spec) => { + spec.tests.forEach((test) => { + test.steps.forEach((step) => { + if (step.status === "FAIL") { + console.log(`Step ${step.stepId}: ${step.description}`); + } + }); + }); + }); + process.exit(1); + } else { + console.log("\nāœ“ All annotation tests passed!"); + process.exit(0); + } + } catch (error) { + console.error("Error running tests:", error); + process.exit(1); + } +} + +testAnnotations(); diff --git a/core/test/test-canvas-output.png b/core/test/test-canvas-output.png new file mode 100644 index 0000000..7384620 Binary files /dev/null and b/core/test/test-canvas-output.png differ diff --git a/core/test/test-fabric-basic.js b/core/test/test-fabric-basic.js new file mode 100644 index 0000000..43a0931 --- /dev/null +++ b/core/test/test-fabric-basic.js @@ -0,0 +1,73 @@ +const { createCanvas, loadImage } = require("canvas"); +const fs = require("fs"); +const path = require("path"); + +async function testCanvasIntegration() { + try { + console.log("Testing node-canvas for annotations..."); + + // Create a simple canvas + const width = 400; + const height = 300; + const canvas = createCanvas(width, height); + const ctx = canvas.getContext("2d"); + + // Fill with white background + ctx.fillStyle = "white"; + ctx.fillRect(0, 0, width, height); + + // Add a red rectangle + console.log("Adding rectangle..."); + ctx.strokeStyle = "red"; + ctx.lineWidth = 3; + ctx.strokeRect(100, 100, 200, 100); + + // Add an arrow (line + triangle) + console.log("Adding arrow..."); + ctx.strokeStyle = "blue"; + ctx.lineWidth = 3; + ctx.beginPath(); + ctx.moveTo(50, 50); + ctx.lineTo(150, 150); + ctx.stroke(); + + // Arrow head + const angle = Math.atan2(150 - 50, 150 - 50); + ctx.save(); + ctx.translate(150, 150); + ctx.rotate(angle); + ctx.fillStyle = "blue"; + ctx.beginPath(); + ctx.moveTo(0, 0); + ctx.lineTo(-15, -7.5); + ctx.lineTo(-15, 7.5); + ctx.closePath(); + ctx.fill(); + ctx.restore(); + + // Add text + console.log("Adding text..."); + ctx.font = "20px Arial"; + ctx.fillStyle = "yellow"; + ctx.fillRect(48, 175, 205, 30); + ctx.fillStyle = "black"; + ctx.fillText("Test Annotation", 50, 195); + + // Save to file + const outputPath = path.join(__dirname, "test-canvas-output.png"); + const buffer = canvas.toBuffer("image/png"); + fs.writeFileSync(outputPath, buffer); + + console.log(`āœ“ Success! Output saved to: ${outputPath}`); + console.log(`File size: ${buffer.length} bytes`); + + return true; + } catch (error) { + console.error("āœ— Error:", error); + return false; + } +} + +testCanvasIntegration().then((success) => { + process.exit(success ? 0 : 1); +});