@probolabs/playwright 1.4.0-rc.2 → 1.4.0-rc.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/probo.js +5 -1
- package/dist/.tsbuildinfo +1 -1
- package/dist/cli.js +61 -6
- package/dist/cli.js.map +1 -1
- package/dist/fixtures.cjs.map +1 -1
- package/dist/fixtures.js.map +1 -1
- package/dist/index.cjs +37 -6
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +37 -6
- package/dist/index.js.map +1 -1
- package/dist/types/cli.d.ts.map +1 -1
- package/dist/types/test-suite-runner.d.ts.map +1 -1
- package/package.json +2 -2
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sources":["../../probo-shared/dist/Interaction.js","../../probo-shared/dist/PlaywrightAction.js","../../probo-shared/dist/element-utils.js","../../probo-shared/dist/MessageType.js","../../probo-shared/dist/utils.js","../../probo-shared/dist/api-client.js","../../probo-shared/dist/AIModel.js","../../probo-shared/dist/PlaywrightTimeoutConfig.js","../../probo-shared/dist/RecorderSettings.js","../../probo-shared/dist/codegen.js","../src/codegen-api.ts","../src/test-suite-runner.ts","../src/cli.ts"],"sourcesContent":["export var ApplyAIStatus;\n(function (ApplyAIStatus) {\n ApplyAIStatus[\"PREPARE_START\"] = \"PREPARE_START\";\n ApplyAIStatus[\"PREPARE_SUCCESS\"] = \"PREPARE_SUCCESS\";\n ApplyAIStatus[\"PREPARE_ERROR\"] = \"PREPARE_ERROR\";\n ApplyAIStatus[\"SEND_START\"] = \"SEND_START\";\n ApplyAIStatus[\"SEND_SUCCESS\"] = \"SEND_SUCCESS\";\n ApplyAIStatus[\"SEND_ERROR\"] = \"SEND_ERROR\";\n ApplyAIStatus[\"APPLY_AI_ERROR\"] = \"APPLY_AI_ERROR\";\n ApplyAIStatus[\"APPLY_AI_CANCELLED\"] = \"APPLY_AI_CANCELLED\";\n ApplyAIStatus[\"SUMMARY_COMPLETED\"] = \"SUMMARY_COMPLETED\";\n ApplyAIStatus[\"SUMMARY_ERROR\"] = \"SUMMARY_ERROR\";\n})(ApplyAIStatus || (ApplyAIStatus = {}));\nexport var ReplayStatus;\n(function (ReplayStatus) {\n ReplayStatus[\"REPLAY_START\"] = \"REPLAY_START\";\n ReplayStatus[\"REPLAY_SUCCESS\"] = \"REPLAY_SUCCESS\";\n ReplayStatus[\"REPLAY_ERROR\"] = \"REPLAY_ERROR\";\n ReplayStatus[\"REPLAY_CANCELLED\"] = \"REPLAY_CANCELLED\";\n})(ReplayStatus || (ReplayStatus = {}));\n//# sourceMappingURL=Interaction.js.map","// Action constants\nexport var PlaywrightAction;\n(function (PlaywrightAction) {\n PlaywrightAction[\"VISIT_BASE_URL\"] = \"VISIT_BASE_URL\";\n PlaywrightAction[\"VISIT_URL\"] = \"VISIT_URL\";\n PlaywrightAction[\"CLICK\"] = \"CLICK\";\n PlaywrightAction[\"FILL_IN\"] = \"FILL_IN\";\n PlaywrightAction[\"SELECT_DROPDOWN\"] = \"SELECT_DROPDOWN\";\n PlaywrightAction[\"SELECT_MULTIPLE_DROPDOWN\"] = \"SELECT_MULTIPLE_DROPDOWN\";\n PlaywrightAction[\"CHECK_CHECKBOX\"] = \"CHECK_CHECKBOX\";\n PlaywrightAction[\"SELECT_RADIO\"] = \"SELECT_RADIO\";\n PlaywrightAction[\"TOGGLE_SWITCH\"] = \"TOGGLE_SWITCH\";\n PlaywrightAction[\"SET_SLIDER\"] = \"SET_SLIDER\";\n PlaywrightAction[\"TYPE_KEYS\"] = \"TYPE_KEYS\";\n PlaywrightAction[\"HOVER\"] = \"HOVER\";\n PlaywrightAction[\"ASSERT_EXACT_VALUE\"] = \"ASSERT_EXACT_VALUE\";\n PlaywrightAction[\"ASSERT_CONTAINS_VALUE\"] = \"ASSERT_CONTAINS_VALUE\";\n PlaywrightAction[\"ASSERT_URL\"] = \"ASSERT_URL\";\n PlaywrightAction[\"SCROLL_TO_ELEMENT\"] = \"SCROLL_TO_ELEMENT\";\n PlaywrightAction[\"EXTRACT_VALUE\"] = \"EXTRACT_VALUE\";\n PlaywrightAction[\"ASK_AI\"] = \"ASK_AI\";\n PlaywrightAction[\"EXECUTE_SCRIPT\"] = \"EXECUTE_SCRIPT\";\n PlaywrightAction[\"UPLOAD_FILES\"] = \"UPLOAD_FILES\";\n PlaywrightAction[\"WAIT_FOR\"] = \"WAIT_FOR\";\n PlaywrightAction[\"WAIT_FOR_OTP\"] = \"WAIT_FOR_OTP\";\n PlaywrightAction[\"GEN_TOTP\"] = \"GEN_TOTP\";\n // Sequence marker actions (not real interactions, used only for grouping)\n PlaywrightAction[\"SEQUENCE_START\"] = \"SEQUENCE_START\";\n PlaywrightAction[\"SEQUENCE_END\"] = \"SEQUENCE_END\";\n})(PlaywrightAction || (PlaywrightAction = {}));\n//# sourceMappingURL=PlaywrightAction.js.map","import { ElementTag } from \"./ElementTag.js\";\nimport { PlaywrightAction } from \"./PlaywrightAction.js\";\n/**\n * Resolves an action type to the corresponding ElementTag\n *\n * @param action The action type (CLICK, FILL_IN, SELECT_DROPDOWN)\n * @returns The corresponding ElementTag\n */\nexport function resolveElementTag(action) {\n switch (action) {\n case PlaywrightAction.CLICK:\n return [ElementTag.CLICKABLE, ElementTag.FILLABLE];\n case PlaywrightAction.FILL_IN:\n return [ElementTag.FILLABLE];\n case PlaywrightAction.SELECT_DROPDOWN:\n return [ElementTag.SELECTABLE];\n case PlaywrightAction.HOVER:\n return [ElementTag.CLICKABLE, ElementTag.FILLABLE, ElementTag.NON_INTERACTIVE_ELEMENT];\n case PlaywrightAction.ASSERT_EXACT_VALUE:\n case PlaywrightAction.ASSERT_CONTAINS_VALUE:\n case PlaywrightAction.EXTRACT_VALUE:\n case PlaywrightAction.WAIT_FOR:\n return [ElementTag.CLICKABLE, ElementTag.FILLABLE, ElementTag.NON_INTERACTIVE_ELEMENT];\n case PlaywrightAction.WAIT_FOR_OTP:\n case PlaywrightAction.GEN_TOTP:\n return [ElementTag.FILLABLE];\n default:\n console.error(`Unknown action: ${action}`);\n throw new Error(`Unknown action: ${action}`);\n }\n}\nexport function getElementText(element) {\n var _a;\n return element.textContent || element.innerText || element.value || ((_a = element.querySelector('input')) === null || _a === void 0 ? void 0 : _a.value) || '';\n}\n/**\n * Checks if any string in the array matches the given regular expression pattern.\n *\n * @param array - Array of strings to test.\n * @param pattern - Regular expression to test against each string.\n * @returns true if at least one string matches the pattern, false otherwise.\n */\nfunction testArray(array, pattern) {\n return array.some(item => pattern.test(item));\n}\n/**\n * Determines if an element is fillable (can accept text input)\n *\n * @param element The DOM element to check\n * @returns boolean indicating if the element is fillable\n */\nexport function isFillableElement(element) {\n var _a;\n if (!element)\n return false;\n // Check if it's an input element\n if (element.tagName === 'INPUT') {\n const inputType = (_a = element.type) === null || _a === void 0 ? void 0 : _a.toLowerCase();\n const isOTPInput = element.getAttribute('data-input-otp') === 'true' ||\n element.getAttribute('autocomplete') === 'one-time-code';\n // if it's an OTP input, don't consider it fillable as it's handled by OTP logic\n if (isOTPInput)\n return false;\n // Include text, password, email, number, tel, url, search, date, datetime-local, month, week, time\n const fillableTypes = [\n 'text', 'password', 'email', 'number', 'tel', 'url', 'search',\n 'date', 'datetime-local', 'month', 'week', 'time'\n ];\n return fillableTypes.includes(inputType);\n }\n // Check if it's a textarea\n if (element.tagName === 'TEXTAREA') {\n return true;\n }\n // Check if it's a contenteditable element\n if (element.getAttribute('contenteditable') === 'true') {\n return true;\n }\n return false;\n}\n/**\n * Determines if an element is a selectable dropdown element\n *\n * @param element The DOM element to check\n * @returns boolean indicating if the element is a select element\n */\nexport function isSelectableElement(element) {\n return element && element.tagName === 'SELECT';\n}\n/**\n * Determines if an element is a non-interactive element (not clickable, fillable, or selectable)\n *\n * @param element The DOM element to check\n * @returns boolean indicating if the element is non-interactive\n */\nexport function isSliderElement(element) {\n if (!element)\n return false;\n // check for <input type=\"range\">\n if (element.tagName === 'INPUT' && element.getAttribute('type') === 'range')\n return true;\n // check for role and additional attributes\n const sliderAttributes = ['aria-valuenow', 'aria-valuemin', 'aria-valuemax'];\n if (element.getAttribute('role') === 'slider' || sliderAttributes.some(attr => element.hasAttribute(attr)))\n return true;\n // check for class names\n const classNames = Array.from(element.classList);\n const sliderClassPattern = /^MuiSlider|mat-slider|mdl-slider|ui-slider|carousel/;\n if (testArray(classNames, sliderClassPattern))\n return true;\n return false;\n}\n/**\n * Determines if an element is an <input type=\"file\"> element.\n *\n * @param element The DOM element to check\n * @returns boolean indicating if the element is an input file element\n */\nexport function isInputFileElement(element) {\n return element && element.tagName === 'INPUT' && element.getAttribute('type') === 'file';\n}\n/**\n * Determines if an element is clickable\n *\n * @param element The DOM element to check\n * @returns boolean indicating if the element is fillable\n */\nexport function isClickableElement(element) {\n if (!element)\n return false;\n let depth = 0;\n while (depth < 5 && element && element.nodeType === Node.ELEMENT_NODE) {\n if (isClickableElementHelper(element) === IsClickable.YES)\n return true;\n if (isClickableElementHelper(element) === IsClickable.NO)\n return false;\n // if maybe, continue searching up to 5 levels up the DOM tree\n element = element.parentNode;\n depth++;\n }\n return false;\n}\n// clickable element detection result\nvar IsClickable;\n(function (IsClickable) {\n IsClickable[\"YES\"] = \"YES\";\n IsClickable[\"NO\"] = \"NO\";\n IsClickable[\"MAYBE\"] = \"MAYBE\";\n})(IsClickable || (IsClickable = {}));\nfunction isClickableElementHelper(element) {\n var _a, _b;\n if (!element)\n return IsClickable.NO;\n //check for tag name\n const tagName = element.tagName.toLowerCase();\n const clickableTags = [\n 'a', 'button',\n ];\n if (clickableTags.includes(tagName))\n return IsClickable.YES;\n //check for clickable <input>\n const inputType = (_a = element.type) === null || _a === void 0 ? void 0 : _a.toLowerCase();\n const clickableTypes = [\n 'button', 'submit', 'reset', 'checkbox', 'radio',\n ];\n const ariaAutocompleteValues = [\n 'list', 'both',\n ];\n if (tagName === 'input') {\n if (clickableTypes.includes(inputType) || ariaAutocompleteValues.includes((_b = element.getAttribute('aria-autocomplete')) !== null && _b !== void 0 ? _b : ''))\n return IsClickable.YES;\n if (['date', 'number', 'range'].includes(inputType))\n return IsClickable.NO; //don't record the click as a change event will be generated for elements that generate an input change event\n }\n // check for cursor type\n const style = window.getComputedStyle(element);\n if (style.cursor === 'pointer')\n return IsClickable.YES;\n // check for attributes\n const clickableRoles = [\n 'button', 'combobox', 'listbox', 'dropdown', 'option', 'menu', 'menuitem',\n 'navigation', 'checkbox', 'switch', 'toggle', 'slider', 'textbox', 'listitem',\n 'presentation',\n ];\n const ariaPopupValues = [\n 'true', 'listbox', 'menu',\n ];\n if (element.hasAttribute('onclick') ||\n clickableRoles.includes(element.getAttribute('role') || '') ||\n ariaPopupValues.includes(element.getAttribute('aria-haspopup') || ''))\n return IsClickable.YES;\n // check for tabindex (means element is focusable and therefore clickable)\n if (parseInt(element.getAttribute('tabindex') || '-1') >= 0)\n return IsClickable.YES;\n // extract class names\n const classNames = Array.from(element.classList);\n // check for checkbox/radio-like class name - TODO: check if can be removed\n const checkboxPattern = /checkbox|switch|toggle|slider/i;\n if (testArray(classNames, checkboxPattern))\n return IsClickable.YES;\n // check for Material UI class names\n const muiClickableClassPattern = /MuiButton|MuiIconButton|MuiChip|MuiMenuItem|MuiListItem|MuiInputBase|MuiOutlinedInput|MuiSelect|MuiAutocomplete|MuiToggleButton|MuiBackdrop-root|MuiBackdrop-invisible/;\n if (testArray(classNames, muiClickableClassPattern))\n return IsClickable.YES;\n // check for SalesForce class names\n const sfClassPattern = /slds-button|slds-dropdown|slds-combobox|slds-picklist|slds-tabs|slds-pill|slds-action|slds-row-action|slds-context-bar|slds-input|slds-rich-text-area|slds-radio|slds-checkbox|slds-toggle|slds-link|slds-accordion|slds-tree/;\n if (testArray(classNames, sfClassPattern))\n return IsClickable.YES;\n // check for chart dots\n const chartClickableClassPattern = /recharts-dot/;\n if (testArray(classNames, chartClickableClassPattern))\n return IsClickable.YES;\n // check for React component classes\n const reactClickableClassPattern = /react-select|ant-select|rc-select|react-dropdown|react-autocomplete|react-datepicker|react-modal|react-tooltip|react-popover|react-menu|react-tabs|react-accordion|react-collapse|react-toggle|react-switch|react-checkbox|react-radio|react-button|react-link|react-card|react-list-item|react-menu-item|react-option|react-tab|react-panel|react-drawer|react-sidebar|react-nav|react-breadcrumb|react-pagination|react-stepper|react-wizard|react-carousel|react-slider|react-range|react-progress|react-badge|react-chip|react-tag|react-avatar|react-icon|react-fab|react-speed-dial|react-floating|react-sticky|react-affix|react-backdrop|react-overlay|react-portal|react-transition|react-animate|react-spring|react-framer|react-gesture|react-drag|react-drop|react-sortable|react-resizable|react-split|react-grid|react-table|react-datagrid|react-tree|react-treeview|react-file|react-upload|react-cropper|react-image|react-gallery|react-lightbox|react-player|react-video|react-audio|react-chart|react-graph|react-diagram|react-flow|react-d3|react-plotly|react-vega|react-vis|react-nivo|react-recharts|react-victory|react-echarts|react-highcharts|react-google-charts|react-fusioncharts|react-apexcharts|react-chartjs|react-chartkick|react-sparklines|react-trend|react-smooth|react-animated|react-lottie|react-spring|react-framer-motion|react-pose|react-motion|react-transition-group|react-router|react-navigation/i;\n if (testArray(classNames, reactClickableClassPattern))\n return IsClickable.YES;\n //check for cloudinary class names\n const cloudinaryClickableClassPattern = /cld-combobox|cld-upload-button|cld-controls|cld-player|cld-tab|cld-menu-item|cld-close|cld-play|cld-pause|cld-fullscreen|cld-browse|cld-cancel|cld-retry/;\n if (testArray(classNames, cloudinaryClickableClassPattern))\n return IsClickable.YES;\n return IsClickable.MAYBE;\n}\nexport function isTextInputElement(element) {\n return (element.tagName === 'INPUT' && element.getAttribute('type') !== 'checkbox' && element.getAttribute('type') !== 'radio') ||\n element.tagName === 'TEXTAREA' ||\n element.getAttribute('contenteditable') === 'true' ||\n element.getAttribute('role') === 'textbox';\n}\nexport function getParentNode(element) {\n if (!element || element.nodeType !== Node.ELEMENT_NODE)\n return null;\n let parent = null;\n // SF is using slots and shadow DOM heavily\n // However, there might be slots in the light DOM which shouldn't be traversed\n if (element.assignedSlot && element.getRootNode() instanceof ShadowRoot)\n parent = element.assignedSlot;\n else\n parent = element.parentNode;\n // Check if we're at a shadow root\n if (parent && parent.nodeType !== Node.ELEMENT_NODE && parent.getRootNode() instanceof ShadowRoot)\n parent = parent.getRootNode().host;\n return parent;\n}\nexport function getElementDepth(element) {\n let depth = 0;\n let currentElement = element;\n while ((currentElement === null || currentElement === void 0 ? void 0 : currentElement.nodeType) === Node.ELEMENT_NODE) {\n depth++;\n currentElement = getParentNode(currentElement);\n }\n return depth;\n}\n//# sourceMappingURL=element-utils.js.map","// WebSocketsMessageType enum for WebSocket and event message types shared across the app\nexport var WebSocketsMessageType;\n(function (WebSocketsMessageType) {\n WebSocketsMessageType[\"INTERACTION_APPLY_AI_PREPARE_START\"] = \"INTERACTION_APPLY_AI_PREPARE_START\";\n WebSocketsMessageType[\"INTERACTION_APPLY_AI_PREPARE_SUCCESS\"] = \"INTERACTION_APPLY_AI_PREPARE_SUCCESS\";\n WebSocketsMessageType[\"INTERACTION_APPLY_AI_PREPARE_ERROR\"] = \"INTERACTION_APPLY_AI_PREPARE_ERROR\";\n WebSocketsMessageType[\"INTERACTION_APPLY_AI_SEND_TO_LLM_START\"] = \"INTERACTION_APPLY_AI_SEND_TO_LLM_START\";\n WebSocketsMessageType[\"INTERACTION_APPLY_AI_SEND_TO_LLM_SUCCESS\"] = \"INTERACTION_APPLY_AI_SEND_TO_LLM_SUCCESS\";\n WebSocketsMessageType[\"INTERACTION_APPLY_AI_SEND_TO_LLM_ERROR\"] = \"INTERACTION_APPLY_AI_SEND_TO_LLM_ERROR\";\n WebSocketsMessageType[\"INTERACTION_REPLAY_START\"] = \"INTERACTION_REPLAY_START\";\n WebSocketsMessageType[\"INTERACTION_REPLAY_SUCCESS\"] = \"INTERACTION_REPLAY_SUCCESS\";\n WebSocketsMessageType[\"INTERACTION_REPLAY_ERROR\"] = \"INTERACTION_REPLAY_ERROR\";\n WebSocketsMessageType[\"INTERACTION_REPLAY_CANCELLED\"] = \"INTERACTION_REPLAY_CANCELLED\";\n WebSocketsMessageType[\"INTERACTION_APPLY_AI_CANCELLED\"] = \"INTERACTION_APPLY_AI_CANCELLED\";\n WebSocketsMessageType[\"INTERACTION_APPLY_AI_ERROR\"] = \"INTERACTION_APPLY_AI_ERROR\";\n WebSocketsMessageType[\"INTERACTION_STEP_CREATED\"] = \"INTERACTION_STEP_CREATED\";\n WebSocketsMessageType[\"INTERACTION_APPLY_AI_SUMMARY_COMPLETED\"] = \"INTERACTION_APPLY_AI_SUMMARY_COMPLETED\";\n WebSocketsMessageType[\"INTERACTION_APPLY_AI_SUMMARY_ERROR\"] = \"INTERACTION_APPLY_AI_SUMMARY_ERROR\";\n WebSocketsMessageType[\"OTP_RETRIEVED\"] = \"OTP_RETRIEVED\";\n WebSocketsMessageType[\"TEST_SUITE_RUN_START\"] = \"TEST_SUITE_RUN_START\";\n WebSocketsMessageType[\"TEST_SUITE_RUN_LOG\"] = \"TEST_SUITE_RUN_LOG\";\n WebSocketsMessageType[\"TEST_SUITE_RUN_COMPLETE\"] = \"TEST_SUITE_RUN_COMPLETE\";\n WebSocketsMessageType[\"TEST_SUITE_RUN_ERROR\"] = \"TEST_SUITE_RUN_ERROR\";\n WebSocketsMessageType[\"TEST_SUITE_RUN_REPORTER_EVENT\"] = \"TEST_SUITE_RUN_REPORTER_EVENT\";\n})(WebSocketsMessageType || (WebSocketsMessageType = {}));\n//# sourceMappingURL=MessageType.js.map","import { PlaywrightAction } from './PlaywrightAction.js';\n/**\n * Logging levels for Probo\n */\nexport var ProboLogLevel;\n(function (ProboLogLevel) {\n ProboLogLevel[\"DEBUG\"] = \"DEBUG\";\n ProboLogLevel[\"INFO\"] = \"INFO\";\n ProboLogLevel[\"LOG\"] = \"LOG\";\n ProboLogLevel[\"WARN\"] = \"WARN\";\n ProboLogLevel[\"ERROR\"] = \"ERROR\";\n})(ProboLogLevel || (ProboLogLevel = {}));\nconst logLevelOrder = {\n [ProboLogLevel.DEBUG]: 0,\n [ProboLogLevel.INFO]: 1,\n [ProboLogLevel.LOG]: 2,\n [ProboLogLevel.WARN]: 3,\n [ProboLogLevel.ERROR]: 4,\n};\nexport class ProboLogger {\n constructor(prefix, level = ProboLogLevel.INFO) {\n this.prefix = prefix;\n this.level = level;\n }\n setLogLevel(level) {\n console.log(`[${this.prefix}] Setting log level to: ${level} (was: ${this.level})`);\n this.level = level;\n }\n shouldLog(level) {\n return logLevelOrder[level] >= logLevelOrder[this.level];\n }\n preamble(level) {\n const now = new Date();\n const hours = String(now.getHours()).padStart(2, '0');\n const minutes = String(now.getMinutes()).padStart(2, '0');\n const seconds = String(now.getSeconds()).padStart(2, '0');\n const milliseconds = String(now.getMilliseconds()).padStart(3, '0');\n return `[${hours}:${minutes}:${seconds}.${milliseconds}] [${this.prefix}] [${level}]`;\n }\n debug(...args) { if (this.shouldLog(ProboLogLevel.DEBUG))\n console.debug(this.preamble(ProboLogLevel.DEBUG), ...args); }\n info(...args) { if (this.shouldLog(ProboLogLevel.INFO))\n console.info(this.preamble(ProboLogLevel.INFO), ...args); }\n log(...args) { if (this.shouldLog(ProboLogLevel.LOG))\n console.log(this.preamble(ProboLogLevel.LOG), ...args); }\n warn(...args) { if (this.shouldLog(ProboLogLevel.WARN))\n console.warn(this.preamble(ProboLogLevel.WARN), ...args); }\n error(...args) { if (this.shouldLog(ProboLogLevel.ERROR))\n console.error(this.preamble(ProboLogLevel.ERROR), ...args); }\n}\n// Element cleaner logging\n// const elementLogger = new ProboLogger('element-cleaner');\n/**\n * Cleans and returns a minimal element info structure.\n */\n//TODO: is this needed?\n/* export function cleanupElementInfo(elementInfo: ElementInfo): CleanElementInfo {\n elementLogger.debug(\n `Cleaning up element info for ${elementInfo.tag} at index ${elementInfo.index}`\n );\n const depth = elementInfo.depth ?? elementInfo.getDepth();\n const cleanEl = {\n index: elementInfo.index,\n tag: elementInfo.tag,\n type: elementInfo.type,\n text: elementInfo.text,\n html: elementInfo.html,\n xpath: elementInfo.xpath,\n css_selector: elementInfo.css_selector,\n iframe_selector: elementInfo.iframe_selector,\n bounding_box: elementInfo.bounding_box,\n depth\n };\n elementLogger.debug(`Cleaned element: ${JSON.stringify(cleanEl)}`);\n return cleanEl;\n} */\n/**\n * Cleans highlighted elements in an instruction payload.\n */\n/* export function cleanupInstructionElements(instruction: any): any {\n if (!instruction?.result?.highlighted_elements) {\n elementLogger.debug('No highlighted elements to clean');\n return instruction;\n }\n elementLogger.debug(\n `Cleaning ${instruction.result.highlighted_elements.length} highlighted elements`\n );\n const cleaned = {\n ...instruction,\n result: {\n ...instruction.result,\n highlighted_elements: instruction.result.highlighted_elements.map(\n (el: ElementInfo) => cleanupElementInfo(el)\n )\n }\n };\n elementLogger.debug('Instruction cleaning completed');\n return cleaned;\n} */\n// Determine whether an interaction can return a value\nexport const hasReturnValue = (i) => {\n return [\n PlaywrightAction.EXTRACT_VALUE,\n PlaywrightAction.ASK_AI,\n PlaywrightAction.EXECUTE_SCRIPT\n ].includes(i.action);\n};\nexport const getReturnValueParameterName = (i) => {\n switch (i.action) {\n case PlaywrightAction.EXTRACT_VALUE:\n case PlaywrightAction.EXECUTE_SCRIPT:\n return i.parameterName;\n case PlaywrightAction.ASK_AI:\n return i.parameterName.replace(/^assert_/, '');\n default:\n console.error(`Action ${i.action} has no return value`);\n return '';\n }\n};\n// Determine whether an interaction can be parameterized\nexport const isParameterizable = (i) => {\n const parameterizableActions = [\n PlaywrightAction.FILL_IN,\n PlaywrightAction.SELECT_DROPDOWN,\n PlaywrightAction.SET_SLIDER,\n PlaywrightAction.ASSERT_CONTAINS_VALUE,\n PlaywrightAction.ASSERT_EXACT_VALUE,\n PlaywrightAction.VISIT_URL,\n PlaywrightAction.ASSERT_URL,\n PlaywrightAction.UPLOAD_FILES,\n PlaywrightAction.WAIT_FOR,\n PlaywrightAction.GEN_TOTP,\n PlaywrightAction.WAIT_FOR_OTP\n ];\n return parameterizableActions.includes(i.action) || (i.action === PlaywrightAction.ASK_AI && i.argument);\n};\n// Determine whether an interaction is AI-related\nexport const isAI = (i) => {\n var _a, _b, _c, _d, _e, _f;\n return !['TYPE_KEYS', 'VISIT_URL', 'EXECUTE_SCRIPT'].includes(i.action) &&\n (i.action === PlaywrightAction.ASK_AI ||\n (((_b = (_a = i.serverResponse) === null || _a === void 0 ? void 0 : _a.result) === null || _b === void 0 ? void 0 : _b.prompt) && (((_d = (_c = i.serverResponse) === null || _c === void 0 ? void 0 : _c.result) === null || _d === void 0 ? void 0 : _d.error) === \"\" || !((_f = (_e = i.serverResponse) === null || _e === void 0 ? void 0 : _e.result) === null || _f === void 0 ? void 0 : _f.error))));\n};\n// Determine whether an interaction is fortified (doesn't need AI processing)\nexport const isFortifiedInteraction = (i) => {\n return [\n PlaywrightAction.VISIT_URL,\n PlaywrightAction.ASSERT_URL,\n PlaywrightAction.TYPE_KEYS,\n PlaywrightAction.EXECUTE_SCRIPT,\n PlaywrightAction.ASK_AI\n ].includes(i.action);\n};\n/**\n * Check if an interaction is a sequence marker (SEQUENCE_START or SEQUENCE_END)\n * @param action - The PlaywrightAction to check\n * @returns true if the action is a sequence marker\n */\nexport function isSequenceMarker(action) {\n return action === PlaywrightAction.SEQUENCE_START || action === PlaywrightAction.SEQUENCE_END;\n}\nexport function singleQuoteString(str) {\n if (!str)\n return '';\n return `'${str.replace(/'/g, \"\\\\'\")}'`;\n}\nexport function doubleQuoteString(str) {\n if (!str)\n return '';\n return `\"${str.replace(/\"/g, '\\\\\"')}\"`;\n}\n/**\n * Converts a string to a filesystem-safe slug.\n * Used for filenames/package names (not URL parsing).\n */\nexport function slugify(text) {\n if (!text)\n return 'scenario';\n return text\n .toLowerCase()\n .trim()\n .replace(/[^a-zA-Z0-9-_]/g, '-') // Replace non-alphanumeric chars with hyphens\n .replace(/-+/g, '-') // Replace multiple hyphens with single hyphen\n .replace(/^-|-$/g, '') // Remove leading/trailing hyphens\n .substring(0, 100); // Limit length to 100 chars\n}\n// Normalize a parameter name to a legal JS identifier\nexport function normalizeParameterName(name) {\n // 0. Remove leading/trailing spaces\n // 1. Replace invalid characters with underscores\n // 2. collapse multiple underscores\n // 3. Remove trailing underscores\n // 4. If starts with a digit, prepend '_'\n // 5. Convert to lowercase\n name = name.trim();\n name = name.replace(/[^a-zA-Z0-9_$]/g, '_');\n name = name.replace(/_+/g, '_');\n name = name.replace(/_+$/, ''); // Remove trailing underscores\n if (/^[0-9]/.test(name)) {\n name = '_' + name;\n }\n name = name.toLowerCase();\n // Ensure we never return an empty string or just underscores\n if (!name || name === '_' || /^_+$/.test(name)) {\n name = 'param_' + Date.now();\n }\n return name;\n}\nexport function matchRegex(str, regex) {\n //parse the regex string\n const match = regex.match(/^\\/(.+)\\/([gimsuy]*)$/);\n if (!match) // normal string\n return str.includes(regex);\n else { // regex string\n const pattern = match[1].replace(/\\\\/g, '\\\\');\n const flags = match[2];\n console.log(`Matching ${str} against ${pattern} with flags ${flags}`);\n return new RegExp(pattern, flags).test(str);\n }\n}\n/**\n * Truncates a URL by replacing query parameters (everything after ?) with three dots.\n * @param url The URL to truncate\n * @returns The truncated URL with three dots replacing query parameters\n */\nexport function truncateUrl(url) {\n if (!url)\n return '';\n const questionMarkIndex = url.indexOf('?');\n if (questionMarkIndex === -1) {\n // No query parameters found, return the original URL\n return url;\n }\n const baseUrl = url.substring(0, questionMarkIndex);\n return `${baseUrl}...`;\n}\n/**\n * Sets up browser console logging on a Playwright page.\n * This function removes all existing console listeners and optionally adds a new one.\n * @param page The Playwright page instance\n * @param enableConsoleLogs Whether to enable console logging\n * @param logger Optional logger instance to use for output (defaults to console.log)\n */\nexport const setupBrowserConsoleLogs = (page, enableConsoleLogs, logger = null) => {\n // Always remove all existing console listeners first\n page.removeAllListeners('console');\n // Always add a listener, but filter output based on enableConsoleLogs\n const listener = (msg) => {\n if (enableConsoleLogs) {\n const type = msg.type();\n const text = msg.text();\n if (logger) {\n logger.log(`[Browser-${type}]: ${text}`);\n }\n else {\n console.log(`[Browser-${type}]: ${text}`);\n }\n }\n // If disabled, do nothing (silently ignore the console message)\n };\n page.on('console', listener);\n};\n/**\n * Safely interpolates template literals in a string using the provided context.\n * Similar to JavaScript template literals, but executed safely at runtime.\n * Recursively interpolates until no more template literals remain.\n *\n * This function only interpolates the argument string itself, not the entire context.\n * When a template literal resolves to another string containing template literals,\n * it recursively interpolates that result.\n *\n * @param str The string containing template literal syntax (e.g., \"Hello ${name}\")\n * @param context The context object containing variables for interpolation\n * @param maxDepth Maximum recursion depth to prevent infinite loops (default: 10)\n * @returns The interpolated string, or the original string if no interpolation is needed\n */\nexport function interpolateTemplate(str, context, maxDepth = 10) {\n if (typeof str !== 'string' || !str.includes('${')) {\n return str;\n }\n if (maxDepth <= 0) {\n console.warn('⚠️ Maximum interpolation depth reached, returning partially interpolated string');\n return str;\n }\n try {\n // Escape backticks in the template to prevent template literal injection\n const escapedTemplate = str.replace(/\\\\/g, '\\\\\\\\').replace(/`/g, '\\\\`');\n // Create a safe template execution function\n // Assign all context properties to variables so they're accessible in the template\n // This works for both simple values and nested objects like process.env\n const contextKeys = Object.keys(context);\n const assignments = contextKeys.map(key => `const ${key} = ctx.${key};`).join('\\n');\n const functionBody = `\n const ctx = arguments[0];\n ${assignments}\n return \\`${escapedTemplate}\\`;\n `;\n const compiled = new Function(functionBody);\n const rendered = compiled(context);\n // If the result still contains template literals, recursively interpolate\n if (rendered.includes('${') && rendered !== str) {\n return interpolateTemplate(rendered, context, maxDepth - 1);\n }\n return rendered;\n }\n catch (e) {\n const error = e instanceof Error ? e : new Error(String(e));\n console.error('⚠️ Template evaluation failed:', error);\n throw error;\n }\n}\nexport class Mutex {\n constructor() {\n this._locked = false;\n this._waiters = [];\n }\n lock() {\n return new Promise((resolve) => {\n const unlock = () => {\n if (this._waiters.length > 0) {\n const nextResolve = this._waiters.shift();\n if (nextResolve) {\n nextResolve(unlock);\n }\n }\n else {\n this._locked = false;\n }\n };\n if (this._locked) {\n this._waiters.push(resolve);\n }\n else {\n this._locked = true;\n resolve(unlock);\n }\n });\n }\n async withLock(fn) {\n const unlock = await this.lock();\n try {\n return await fn();\n }\n finally {\n unlock();\n }\n }\n}\n//# sourceMappingURL=utils.js.map","import pRetry from 'p-retry';\nimport { ProboLogger } from './utils.js';\nexport const apiLogger = new ProboLogger('apiclient');\nexport class ApiError extends Error {\n constructor(status, message, data) {\n super(message);\n this.status = status;\n this.data = data;\n this.name = 'ApiError';\n // Remove stack trace for cleaner error messages\n this.stack = undefined;\n }\n toString() {\n return `${this.message} (Status: ${this.status})`;\n }\n}\nexport class ApiClient {\n constructor(apiUrl, token, maxRetries = 3, initialBackoff = 1000) {\n this.apiUrl = apiUrl;\n this.token = token;\n this.maxRetries = maxRetries;\n this.initialBackoff = initialBackoff;\n }\n /**\n * Determines if an error should be retried.\n * Only retries on timeout and network errors, not on client/server errors.\n */\n isRetryableError(error) {\n var _a, _b, _c, _d, _e;\n // Network/connection errors should be retried\n if ((_a = error.message) === null || _a === void 0 ? void 0 : _a.includes('fetch failed'))\n return true;\n if ((_b = error.message) === null || _b === void 0 ? void 0 : _b.includes('network'))\n return true;\n if ((_c = error.message) === null || _c === void 0 ? void 0 : _c.includes('ETIMEDOUT'))\n return true;\n if ((_d = error.message) === null || _d === void 0 ? void 0 : _d.includes('ECONNRESET'))\n return true;\n if ((_e = error.message) === null || _e === void 0 ? void 0 : _e.includes('ECONNREFUSED'))\n return true;\n if (error.code === 'ETIMEDOUT')\n return true;\n if (error.code === 'ECONNRESET')\n return true;\n if (error.code === 'ECONNREFUSED')\n return true;\n // If it's an ApiError, check the status code\n if (error instanceof ApiError) {\n // Retry on timeout-related status codes\n if (error.status === 408)\n return true; // Request Timeout\n if (error.status === 502)\n return true; // Bad Gateway (temporary)\n if (error.status === 503)\n return true; // Service Unavailable (temporary)\n if (error.status === 504)\n return true; // Gateway Timeout\n if (error.status === 0)\n return true; // Network error\n // Don't retry on client errors (4xx) or server errors (5xx)\n // These indicate problems that won't be fixed by retrying\n return false;\n }\n // For unknown errors, don't retry to avoid masking issues\n return false;\n }\n /**\n * Generic helper to wrap API requests with retry logic and consistent error handling.\n */\n async requestWithRetry(operationName, operation) {\n return pRetry(operation, {\n retries: this.maxRetries,\n minTimeout: this.initialBackoff,\n shouldRetry: (error) => {\n const shouldRetry = this.isRetryableError(error);\n if (!shouldRetry) {\n apiLogger.error(`${operationName} failed with non-retryable error: ${error.message || error}`);\n }\n return shouldRetry;\n },\n onFailedAttempt: error => {\n apiLogger.warn(`${operationName} failed (retryable), attempt ${error.attemptNumber} of ${error.retriesLeft + error.attemptNumber}. Error: ${error.message}`);\n }\n });\n }\n async handleResponse(response) {\n var _a;\n try {\n const data = await response.json();\n const error = `${(data === null || data === void 0 ? void 0 : data.error) || 'Unknown error'}`;\n apiLogger.debug(`API response: ${JSON.stringify(data)}`);\n if (!response.ok) {\n switch (response.status) {\n case 401:\n throw new ApiError(401, `Unauthorized - Invalid or missing authentication token: ${error}`);\n case 403:\n throw new ApiError(403, `Forbidden - You do not have permission to perform this action: ${error}`);\n case 400:\n throw new ApiError(400, `Bad Request: ${error}`);\n case 404:\n throw new ApiError(404, `Not Found: ${error}`);\n case 500:\n throw new ApiError(500, `Internal Server Error: ${error}`);\n default:\n throw new ApiError(response.status, `API Error: ${error}`);\n }\n }\n return data;\n }\n catch (error) {\n // Only throw the original error if it's not a network error\n if (!((_a = error.message) === null || _a === void 0 ? void 0 : _a.includes('fetch failed'))) {\n throw error;\n }\n throw new ApiError(0, 'Network error: fetch failed');\n }\n }\n getHeaders() {\n const headers = {\n 'Content-Type': 'application/json',\n };\n // Always include token in headers now that we have a default\n headers['Authorization'] = `Token ${this.token}`;\n return headers;\n }\n async createStep(options) {\n apiLogger.debug('creating step ', options.stepPrompt);\n return this.requestWithRetry('createStep', async () => {\n const response = await fetch(`${this.apiUrl}/step-runners/`, {\n method: 'POST',\n headers: this.getHeaders(),\n body: JSON.stringify({\n step_id: options.stepIdFromServer,\n scenario_name: options.scenarioName,\n step_prompt: options.stepPrompt,\n argument: options.argument,\n initial_screenshot: options.initial_screenshot_url,\n initial_html_content: options.initial_html_content,\n use_cache: options.use_cache,\n url: options.url,\n action: options.action,\n vanilla_prompt: options.vanilla_prompt,\n is_vanilla_prompt_robust: options.is_vanilla_prompt_robust,\n target_element_name: options.target_element_name,\n position: options.position\n }),\n });\n const data = await this.handleResponse(response);\n return data.step.id;\n });\n }\n async patchStep(stepId, fields) {\n // Use PATCH /steps/:id/ endpoint with partial=true\n apiLogger.debug(`patching step #${stepId} with fields:`, Object.keys(fields));\n return this.requestWithRetry('patchStep', async () => {\n const response = await fetch(`${this.apiUrl}/steps/${stepId}/`, {\n method: 'PATCH',\n headers: this.getHeaders(),\n body: JSON.stringify(fields)\n });\n const data = await this.handleResponse(response);\n return;\n });\n }\n /* async resolveNextInstruction(stepId: string, instruction: Instruction | null, aiModel?: string) {\n apiLogger.debug(`resolving next instruction: ${instruction}`);\n return this.requestWithRetry('resolveNextInstruction', async () => {\n apiLogger.debug(`API client: Resolving next instruction for step ${stepId}`);\n \n const cleanInstruction = cleanupInstructionElements(instruction);\n \n const response = await fetch(`${this.apiUrl}/step-runners/${stepId}/run/`, {\n method: 'POST',\n headers: this.getHeaders(),\n body: JSON.stringify({\n executed_instruction: cleanInstruction,\n ai_model: aiModel\n }),\n });\n \n const data = await this.handleResponse(response);\n return data.instruction;\n });\n } */\n async uploadScreenshot(screenshot_bytes) {\n return this.requestWithRetry('uploadScreenshot', async () => {\n const response = await fetch(`${this.apiUrl}/upload-screenshots/`, {\n method: 'POST',\n headers: {\n 'Authorization': `Token ${this.token}`\n },\n body: screenshot_bytes,\n });\n const data = await this.handleResponse(response);\n return data.screenshot_url;\n });\n }\n async findStepById(stepId) {\n apiLogger.debug(`Finding step by id: ${stepId}`);\n return this.requestWithRetry('findStepById', async () => {\n const response = await fetch(`${this.apiUrl}/steps/${stepId}/`, {\n method: 'GET',\n headers: this.getHeaders(),\n });\n const data = await this.handleResponse(response);\n return data.step;\n });\n }\n async findStepByPrompt(prompt, scenarioName, url = '') {\n apiLogger.debug(`Finding step by prompt: ${prompt} and scenario: ${scenarioName}`);\n return this.requestWithRetry('findStepByPrompt', async () => {\n const response = await fetch(`${this.apiUrl}/step-runners/find-step-by-prompt/`, {\n method: 'POST',\n headers: this.getHeaders(),\n body: JSON.stringify({\n prompt: prompt,\n scenario_name: scenarioName,\n url: url\n }),\n });\n try {\n const data = await this.handleResponse(response);\n return {\n step: data.step,\n total_count: data.total_count\n };\n }\n catch (error) {\n // If we get a 404, the step doesn't exist\n if (error instanceof ApiError && error.status === 404) {\n return null;\n }\n // For any other error, rethrow\n throw error;\n }\n });\n }\n async resetStep(stepId) {\n return this.requestWithRetry('resetStep', async () => {\n const response = await fetch(`${this.apiUrl}/steps/${stepId}/reset/`, {\n method: 'POST',\n headers: this.getHeaders(),\n });\n const data = await this.handleResponse(response);\n return data;\n });\n }\n async interactionToStep(scenarioId, interaction, position = -1) {\n // Use POST /interaction-to-step/ endpoint\n // Backend will create new step or update existing one based on interaction_id\n apiLogger.debug(`converting interaction #${interaction.interactionId} to step`);\n return this.requestWithRetry('interactionToStep', async () => {\n var _a, _b, _c, _d;\n const response = await fetch(`${this.apiUrl}/interaction-to-step/`, {\n method: 'POST',\n headers: this.getHeaders(),\n body: JSON.stringify({\n scenario_id: scenarioId,\n position,\n interaction_id: interaction.interactionId,\n action: interaction.action,\n argument: interaction.argument,\n element_css_selector: ((_a = interaction.elementInfo) === null || _a === void 0 ? void 0 : _a.css_selector) || '',\n iframe_selector: ((_b = interaction.elementInfo) === null || _b === void 0 ? void 0 : _b.iframe_selector) || '',\n smart_selector: ((_c = interaction.elementInfo) === null || _c === void 0 ? void 0 : _c.smart_selector) || null,\n smart_iframe_selector: ((_d = interaction.elementInfo) === null || _d === void 0 ? void 0 : _d.smart_iframe_selector) || null,\n prompt: interaction.nativeDescription,\n vanilla_prompt: interaction.nativeDescription,\n is_vanilla_prompt_robust: interaction.isNativeDescriptionElaborate || false,\n target_element_name: interaction.nativeName,\n target_element_info: interaction.elementInfo,\n url: interaction.url,\n is_secret: interaction.isSecret || false,\n })\n });\n const data = await this.handleResponse(response);\n return [data.result.step_id, data.result.matched_step, data.scenario_id];\n });\n }\n async actionToPrompt(action2promptInput, aiModel) {\n // Use POST /action-to-prompt/ endpoint\n apiLogger.debug(`running action2prompt for step #${action2promptInput.step_id}`);\n return this.requestWithRetry('actionToPrompt', async () => {\n const response = await fetch(`${this.apiUrl}/steps/${action2promptInput.step_id}/action_to_prompt/`, {\n method: 'POST',\n headers: this.getHeaders(),\n body: JSON.stringify({ ...action2promptInput, 'model': aiModel })\n });\n const data = await this.handleResponse(response);\n return data;\n });\n }\n async summarizeScenario(scenarioId, aiModel) {\n return this.requestWithRetry('summarizeScenario', async () => {\n const response = await fetch(`${this.apiUrl}/api/scenarios/${scenarioId}/summary`, {\n method: 'POST',\n headers: this.getHeaders(),\n body: JSON.stringify({ 'model': aiModel })\n });\n const data = await this.handleResponse(response);\n return data;\n });\n }\n async askAI(question, scenarioName, screenshot, aiModel) {\n apiLogger.debug(`Asking AI question: \"${question}\", scenarioName: ${scenarioName}`);\n apiLogger.debug(`headers: ${JSON.stringify(this.getHeaders())}`);\n return this.requestWithRetry('askAI', async () => {\n const response = await fetch(`${this.apiUrl}/api/ask-ai/`, {\n method: 'POST',\n headers: this.getHeaders(),\n body: JSON.stringify({\n question: question,\n scenario_name: scenarioName,\n screenshot: screenshot,\n model: aiModel\n }),\n });\n const data = await this.handleResponse(response);\n return data;\n });\n }\n async screenshotReasoning(stepId, prompt, aiModel) {\n apiLogger.debug(`Performing screenshot reasoning for step: ${stepId}`);\n return this.requestWithRetry('screenshotReasoning', async () => {\n const response = await fetch(`${this.apiUrl}/steps/${stepId}/screenshot_reasoning/`, {\n method: 'POST',\n headers: this.getHeaders(),\n body: JSON.stringify({\n prompt: prompt,\n model: aiModel\n }),\n });\n const data = await this.handleResponse(response);\n return data.action;\n });\n }\n async findBestCandidateElement(stepId, candidatesScreenshotUrl, candidateElements, aiModel) {\n apiLogger.debug(`Finding best candidate element for step: ${stepId}`);\n return this.requestWithRetry('findBestCandidateElement', async () => {\n const response = await fetch(`${this.apiUrl}/steps/${stepId}/find_best_candidate_element/`, {\n method: 'POST',\n headers: this.getHeaders(),\n body: JSON.stringify({\n screenshot_url: candidatesScreenshotUrl,\n candidate_elements: candidateElements,\n model: aiModel\n }),\n });\n const data = await this.handleResponse(response);\n return data.index;\n });\n }\n} /* ApiClient */\n//# sourceMappingURL=api-client.js.map","/**\n * Available AI models for LLM operations\n */\nexport var AIModel;\n(function (AIModel) {\n AIModel[\"AZURE_GPT4\"] = \"azure-gpt4\";\n AIModel[\"AZURE_GPT4_MINI\"] = \"azure-gpt4-mini\";\n AIModel[\"GEMINI_1_5_FLASH\"] = \"gemini-1.5-flash\";\n AIModel[\"GEMINI_2_5_FLASH\"] = \"gemini-2.5-flash\";\n AIModel[\"GPT4\"] = \"gpt4\";\n AIModel[\"GPT4_MINI\"] = \"gpt4-mini\";\n AIModel[\"CLAUDE_3_5\"] = \"claude-3.5\";\n AIModel[\"CLAUDE_SONNET_4_5\"] = \"claude-sonnet-4.5\";\n AIModel[\"CLAUDE_HAIKU_4_5\"] = \"claude-haiku-4.5\";\n AIModel[\"CLAUDE_OPUS_4_1\"] = \"claude-opus-4.1\";\n AIModel[\"GROK_2\"] = \"grok-2\";\n AIModel[\"LLAMA_4_SCOUT\"] = \"llama-4-scout\";\n AIModel[\"DEEPSEEK_V3\"] = \"deepseek-v3\";\n})(AIModel || (AIModel = {}));\n//# sourceMappingURL=AIModel.js.map","export const DEFAULT_PLAYWRIGHT_TIMEOUT_CONFIG = {\n highlightTimeout: 300,\n playwrightActionTimeout: 5000,\n playwrightNavigationTimeout: 10000,\n playwrightLocatorTimeout: 2000,\n // mutation observer\n mutationsTimeout: 500,\n mutationsInitTimeout: 1000,\n // wait for navigation\n waitForNavigationInitialTimeout: 2000,\n waitForNavigationNavigationTimeout: 7000,\n waitForNavigationGlobalTimeout: 15000,\n // wait for stability\n waitForStabilityQuietTimeout: 2000,\n waitForStabilityInitialDelay: 100,\n waitForStabilityGlobalTimeout: 15000,\n waitForStabilityVerbose: false,\n scriptTimeout: 120000, // 2 minutes\n};\n//# sourceMappingURL=PlaywrightTimeoutConfig.js.map","import { DEFAULT_PLAYWRIGHT_TIMEOUT_CONFIG } from './PlaywrightTimeoutConfig.js';\nexport const DEFAULT_RECORDER_SETTINGS = {\n // API Configuration\n apiKey: '',\n apiEndPoint: 'https://api.probolabs.ai',\n frontendUrl: 'https://app.probolabs.ai',\n baseUrl: undefined,\n // Scenario Configuration\n scenarioName: 'new recording',\n scenarioId: undefined,\n aiModel: 'azure-gpt4-mini',\n activeParamSet: 0,\n // Browser Configuration\n resetBrowserBeforeReplay: true,\n enableSmartSelectors: true, // Smart selectors always enabled\n // Script Configuration\n scriptTimeout: DEFAULT_PLAYWRIGHT_TIMEOUT_CONFIG.scriptTimeout,\n // Logging Configuration\n enableConsoleLogs: true,\n debugLevel: 'DEBUG',\n // Timeout Configuration (spread from PlaywrightTimeoutConfig)\n ...DEFAULT_PLAYWRIGHT_TIMEOUT_CONFIG,\n};\n//# sourceMappingURL=RecorderSettings.js.map","// --- Code generation utilities for Probo Labs Playwright scripts ---\nimport { isParameterizable, isAI, singleQuoteString, PlaywrightAction, getReturnValueParameterName, hasReturnValue, AIModel } from \"./index.js\";\n/**\n * Extracts environment variable names from parameter table rows\n * by parsing ${process.env.VAR_NAME} patterns from parameter values\n *\n * @param rows - Array of parameter table rows (Record<string, string>)\n * @returns Set of unique environment variable names (in uppercase)\n */\nexport function extractRequiredEnvVars(rows) {\n const envVars = new Set();\n // Return empty set if rows are not provided or empty\n if (!rows || !Array.isArray(rows) || rows.length === 0) {\n return envVars;\n }\n // Regex to match both escaped and unescaped process.env patterns\n // Matches: ${process.env.VAR_NAME} or \\${process.env.VAR_NAME}\n // Pattern: optional backslash (\\\\), then ${ (escaped as \\$\\{), then process.env., then variable name\n const envVarPattern = /\\\\?\\$\\{process\\.env\\.([a-zA-Z_][a-zA-Z0-9_]*)\\}/g;\n // Scan all parameter values in all rows for env var patterns\n rows.forEach((row) => {\n if (row && typeof row === 'object') {\n Object.values(row).forEach((value) => {\n if (typeof value === 'string') {\n let match;\n while ((match = envVarPattern.exec(value)) !== null) {\n const varName = match[1].toUpperCase(); // Ensure uppercase for consistency\n envVars.add(varName);\n }\n // Reset regex lastIndex for next iteration\n envVarPattern.lastIndex = 0;\n }\n });\n }\n });\n return envVars;\n}\n/**\n * Extracts the list of required environment variable names from parameter table rows\n * @param rows - Array of parameter table rows (Record<string, string>)\n * @returns Array of required environment variable names (sorted)\n */\nexport function getRequiredEnvVars(rows) {\n const envVars = extractRequiredEnvVars(rows);\n return Array.from(envVars).sort();\n}\n/**\n * Generates Playwright native code for a given interaction.\n *\n * @param interaction - The interaction object containing action, element info, and other metadata.\n * @returns A string of Playwright code that performs the specified interaction.\n */\nfunction interactionToNativeCode(interaction) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;\n const selector = ((_a = interaction.elementInfo) === null || _a === void 0 ? void 0 : _a.css_selector) || '';\n const iframe = ((_b = interaction.elementInfo) === null || _b === void 0 ? void 0 : _b.iframe_selector) || '';\n const smartSelector = ((_c = interaction.elementInfo) === null || _c === void 0 ? void 0 : _c.smart_selector) || null;\n const smartIFrameSelector = ((_d = interaction.elementInfo) === null || _d === void 0 ? void 0 : _d.smart_iframe_selector) || null;\n const argument = isParameterizable(interaction) ? `param.${interaction.parameterName}` : singleQuoteString(interaction.argument);\n // Escape the nativeDescription for use in test.step() string literal\n const escapedStepName = interaction.nativeDescription.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"');\n const comment = `\n // ${interaction.nativeDescription}${interaction.annotation ? `\\n // annotation: ${interaction.annotation}` : ''}`;\n switch (interaction.action) {\n case PlaywrightAction.CLICK:\n case PlaywrightAction.CHECK_CHECKBOX:\n case PlaywrightAction.SELECT_RADIO:\n case PlaywrightAction.FILL_IN:\n case PlaywrightAction.TYPE_KEYS:\n case PlaywrightAction.SET_SLIDER:\n case PlaywrightAction.SELECT_DROPDOWN:\n case PlaywrightAction.ASSERT_CONTAINS_VALUE:\n case PlaywrightAction.ASSERT_EXACT_VALUE:\n case PlaywrightAction.HOVER:\n case PlaywrightAction.SCROLL_TO_ELEMENT:\n case PlaywrightAction.UPLOAD_FILES:\n case PlaywrightAction.VISIT_URL:\n case PlaywrightAction.VISIT_BASE_URL:\n case PlaywrightAction.ASSERT_URL:\n case PlaywrightAction.WAIT_FOR:\n case PlaywrightAction.WAIT_FOR_OTP:\n case PlaywrightAction.GEN_TOTP:\n const args = [\n `action: PlaywrightAction.${interaction.action}`,\n ...(argument ? [`argument: ${argument}`] : []),\n ...(iframe ? [`iframeSelector: '${iframe}'`] : []),\n ...(selector ? [`elementSelector: '${selector}'`] : []),\n ...(smartSelector ? [`smartSelector: ${JSON.stringify(smartSelector)}`] : []),\n ...(smartIFrameSelector ? [`smartIFrameSelector: ${JSON.stringify(smartIFrameSelector)}`] : []),\n ...(interaction.annotation ? [`annotation: '${interaction.annotation}'`] : []),\n ...(((_e = interaction.waitForConfig) === null || _e === void 0 ? void 0 : _e.pollingInterval) ? [`pollingInterval: ${(_f = interaction.waitForConfig) === null || _f === void 0 ? void 0 : _f.pollingInterval}`] : []),\n ...(((_g = interaction.waitForConfig) === null || _g === void 0 ? void 0 : _g.timeout) ? [`timeout: ${(_h = interaction.waitForConfig) === null || _h === void 0 ? void 0 : _h.timeout}`] : []),\n // Always include totpConfig for GEN_TOTP actions, using defaults if not present in interaction\n ...(interaction.action === PlaywrightAction.GEN_TOTP ? [`totpConfig: { digits: ${((_j = interaction.totpConfig) === null || _j === void 0 ? void 0 : _j.digits) || 6}, algorithm: '${((_k = interaction.totpConfig) === null || _k === void 0 ? void 0 : _k.algorithm) || 'SHA1'}' }`] : [])\n ];\n return `${comment}\n await test.step(\"${escapedStepName}\", async () => {\n await ppw.runStep({\n ${args.join(',\\n ')}\n });\n });`;\n case PlaywrightAction.EXTRACT_VALUE:\n const extractVarName = getReturnValueParameterName(interaction);\n return `${comment}\n await test.step(\"${escapedStepName}\", async () => {\n const ${extractVarName} = await ppw.runStep({\n iframeSelector: '${iframe}',\n elementSelector: '${selector}',\n smartSelector: ${JSON.stringify(smartSelector)},\n smartIFrameSelector: ${JSON.stringify(smartIFrameSelector)},\n action: '${interaction.action}', \n annotation: '${(_l = interaction.annotation) !== null && _l !== void 0 ? _l : \"\"}',\n });\n param['${extractVarName}'] = ${extractVarName};\n });`;\n case PlaywrightAction.EXECUTE_SCRIPT:\n return generateExecuteScriptCode(interaction, comment, escapedStepName);\n default:\n return `// Unhandled action: ${interaction.action}!!!`;\n }\n}\nfunction interactionToProboLib(interaction) {\n var _a, _b, _c;\n const escapedPrompt = (_c = (_b = (_a = interaction.serverResponse) === null || _a === void 0 ? void 0 : _a.result) === null || _b === void 0 ? void 0 : _b.prompt) === null || _c === void 0 ? void 0 : _c.replace(/'/g, \"\\\\'\");\n const argument = isParameterizable(interaction) ? `param.${interaction.parameterName}` : `'${interaction.argument}'`;\n // Escape the nativeDescription for use in test.step() string literal\n const escapedStepName = interaction.nativeDescription.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"');\n const comment = `\n // ${interaction.nativeDescription}${interaction.annotation ? `\\n // annotation: ${interaction.annotation}` : ''}`;\n if (interaction.action === PlaywrightAction.EXTRACT_VALUE) {\n const extractVarName = getReturnValueParameterName(interaction);\n return `${comment}\n await test.step(\"${escapedStepName}\", async () => {\n const ${extractVarName} = await probo.runStep(page, '${escapedPrompt}', null, { stepId: ${interaction.stepId} });\n param['${extractVarName}'] = ${extractVarName};\n });`;\n }\n else if (interaction.action === PlaywrightAction.ASSERT_CONTAINS_VALUE ||\n interaction.action === PlaywrightAction.ASSERT_EXACT_VALUE) {\n return `${comment}\n await test.step(\"${escapedStepName}\", async () => {\n await probo.runStep(page, '${escapedPrompt}', ${argument}, { stepId: ${interaction.stepId} });\n });`;\n }\n else if (interaction.action === PlaywrightAction.VISIT_URL) {\n return `${comment}\n await test.step(\"${escapedStepName}\", async () => {\n await probo.runStep(page, '${interaction.nativeDescription}', ${argument}, { stepId: ${interaction.stepId} });\n });`;\n }\n else if (interaction.action === PlaywrightAction.ASK_AI) {\n const escapedQuestion = interaction.nativeDescription.replace(/'/g, \"\\\\'\");\n const aiVarName = getReturnValueParameterName(interaction);\n // const assertion = interaction.argument ? ` \n const askAIOptions = interaction.stepId ? `{ stepId: ${interaction.stepId} }` : '{}';\n return `${comment}\n await test.step(\"${escapedStepName}\", async () => {\n const ${aiVarName} = await probo.askAI(page, '${escapedQuestion}', ${askAIOptions}${argument ? `, ${argument}` : ''});\n param['${aiVarName}'] = ${aiVarName};\n });`;\n }\n else if (interaction.action === PlaywrightAction.EXECUTE_SCRIPT) {\n return generateExecuteScriptCode(interaction, comment, escapedStepName);\n }\n else {\n return `${comment}\n await test.step(\"${escapedStepName}\", async () => {\n ${argument ? `await probo.runStep(page, '${escapedPrompt}', ${argument}, { stepId: ${interaction.stepId} });` : `await probo.runStep(page, '${escapedPrompt}', null, { stepId: ${interaction.stepId} });`}\n });`;\n }\n}\nfunction generateExecuteScriptCode(interaction, comment, escapedStepName) {\n let scriptCode = Array.isArray(interaction.argument) ? interaction.argument[0] : interaction.argument;\n const scriptVarName = getReturnValueParameterName(interaction);\n // Replace returnValue(x) with 'const param = x;'\n scriptCode = scriptCode.replace(/returnValue\\((.*)\\);?/, `${scriptVarName} = $1;`);\n // Trim trailing whitespace\n scriptCode = scriptCode.trimEnd();\n // If scriptCode doesn't end with a semicolon add one\n if (!/\\s*;\\s*$/.test(scriptCode))\n scriptCode = scriptCode + ';';\n // Indent the code (extra indent for test.step wrapper)\n const indentedCode = scriptCode.split('\\n').map((line, idx) => idx === 0 ? line : ` ${line}`).join('\\n');\n return `${comment}\n await test.step(\"${escapedStepName}\", async () => {\n let ${scriptVarName} = null;\n try {\n ${indentedCode}\n } catch (error) {\n console.error('❌ Workspace script execution failed:', error.message);\n throw error;\n }\n param['${scriptVarName}'] = ${scriptVarName};\n });`;\n}\nfunction scriptTemplate(options, settings, viewPort) {\n var _a, _b, _c, _d;\n const areActionsParameterized = options.rows.length > 0;\n const hasAiInteractions = options.interactions.some((interaction) => isAI(interaction));\n const hasScriptInteractions = options.interactions.some((interaction) => interaction.action === PlaywrightAction.EXECUTE_SCRIPT);\n // const uniquelyParameterizedInteractions = uniquifyInteractionParameters(options.interactions);\n const steps = options.interactions.map((interaction) => {\n if (isAI(interaction))\n return interactionToProboLib(interaction);\n return interactionToNativeCode(interaction);\n }).join('\\n');\n // Get list of all extracted value parameter names to filter them out from the parameter table\n const extractedValueNames = new Set();\n options.interactions.forEach((interaction) => {\n if (hasReturnValue(interaction)) {\n const retName = getReturnValueParameterName(interaction);\n if (retName) {\n extractedValueNames.add(retName);\n }\n }\n });\n // Escape apostrophes and backslashes for single-quoted strings\n const escapeForSingleQuotes = (value) => {\n if (!value || typeof value !== 'string')\n return ''; //check for null, undefined, or non-string values\n //escape backslashes and single quotes\n return value.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\");\n };\n // Lookup value from settings \n const aiModelKey = Object.keys(AIModel).find(key => AIModel[key] === settings.aiModel);\n // Check if any interactions have the isSecret flag set\n const hasSecrets = options.interactions.some(interaction => interaction.isSecret === true);\n // Extract required environment variable names from parameter table rows\n const requiredEnvVars = extractRequiredEnvVars(options.rows);\n const requiredEnvVarsArray = Array.from(requiredEnvVars).sort();\n // generate the parameter table (exclude extracted values as they are declared as const in the steps)\n const parameterTable = areActionsParameterized ? `\n const parameterTable: Record<string, any>[] = [\n ${options.rows.map((row) => {\n // Filter out extracted value columns from the parameter table\n const filteredRow = Object.fromEntries(Object.entries(row).filter(([key]) => !extractedValueNames.has(key)));\n return `{ ${Object.entries(filteredRow).map(([key, value]) => `${key}: '${escapeForSingleQuotes(value)}'`).join(', ')} }`;\n }).join(',\\n ')}\n ];\n ` : '';\n const proboConstructor = hasAiInteractions ? `\n const probo = new Probo({\n scenarioName: '${options.scenarioName}',\n enableSmartSelectors: ${settings.enableSmartSelectors},\n debugLevel: ProboLogLevel.${settings.debugLevel},\n aiModel: AIModel.${aiModelKey},\n timeoutConfig: {\n waitForStabilityQuietTimeout: ${(_a = settings.waitForStabilityQuietTimeout) !== null && _a !== void 0 ? _a : 2000},\n waitForStabilityInitialDelay: ${(_b = settings.waitForStabilityInitialDelay) !== null && _b !== void 0 ? _b : 500},\n waitForStabilityGlobalTimeout: ${(_c = settings.waitForStabilityGlobalTimeout) !== null && _c !== void 0 ? _c : 15000},\n waitForStabilityVerbose: ${(_d = settings.waitForStabilityVerbose) !== null && _d !== void 0 ? _d : false}\n }\n });` : '';\n return `\n /*\n * Probo Labs Playwright Script\n * Scenario: ${options.scenarioName}\n * Auto generated on ${new Date().toLocaleDateString()} ${new Date().toLocaleTimeString()}\n * \n * HOW TO INTEGRATE THIS SCRIPT INTO YOUR EXISTING PROJECT:\n * 1. Install dependencies: npm install @playwright/test @probolabs/playwright@latest${hasSecrets ? ' dotenv' : ''}\n * 2. copy and paste the code below into your test file${hasSecrets ? '\\n * 3. Ensure a .env file exists in your project root (or ~/.probium/.env) or set environment variables manually' : ''}\n */\n \n // launch chromium with pre-installed extensions\n import { test, expect} from '@probolabs/playwright/fixtures';\n import { ProboPlaywright, Probo, PlaywrightAction, ProboLogLevel, AIModel } from '@probolabs/playwright';${hasScriptInteractions ? `\n import { execSync } from 'child_process';\n import * as fs from 'fs';\n import * as path from 'path';\n import * as os from 'os';` : ''}${hasSecrets && !hasScriptInteractions ? `\n import * as path from 'path';\n import * as os from 'os';\n import * as fs from 'fs';` : ''}\n \n${hasSecrets ? `import { config } from 'dotenv';\n // Load secrets: first try local .env (project root), then fallback to ~/.probium/.env\n const localEnvPath = path.join(process.cwd(), '.env');\n const homeEnvPath = path.join(os.homedir(), '.probium', '.env');\n \n if (fs.existsSync(localEnvPath)) {\n config({ path: localEnvPath });\n console.log('✅ Loaded env vars from project .env:', localEnvPath);\n } else if (fs.existsSync(homeEnvPath)) {\n config({ path: homeEnvPath });\n console.log('✅ Loaded env vars from home .env:', homeEnvPath);\n } else {\n console.warn('⚠️ .env not found at', localEnvPath, 'or', homeEnvPath, '- ensure environment variables are set before running tests');\n }\n \n // Validate that all required secrets are set\n const requiredSecrets: string[] = ${JSON.stringify(requiredEnvVarsArray)};\n const missingSecrets = requiredSecrets.filter(varName => !process.env[varName] || process.env[varName].trim() === '');\n if (missingSecrets.length > 0) {\n throw new Error(\\`Missing required environment variables: \\${missingSecrets.join(', ')}. Please set them in your .env file or as environment variables.\\`);\n }\n console.log(\\`✅ All required secrets are set: \\${requiredSecrets.join(', ')}\\`);\n ` : ''}\n \n ${parameterTable} \n ${proboConstructor}\n const ppw = new ProboPlaywright({\n enableSmartSelectors: ${settings.enableSmartSelectors},\n debugLevel: ProboLogLevel.${settings.debugLevel},\n timeoutConfig: {\n waitForStabilityQuietTimeout: ${settings.waitForStabilityQuietTimeout},\n waitForStabilityInitialDelay: ${settings.waitForStabilityInitialDelay},\n waitForStabilityGlobalTimeout: ${settings.waitForStabilityGlobalTimeout},\n waitForStabilityVerbose: ${settings.waitForStabilityVerbose},\n highlightTimeout: ${settings.highlightTimeout},\n playwrightActionTimeout: ${settings.playwrightActionTimeout},\n playwrightNavigationTimeout: ${settings.playwrightNavigationTimeout},\n playwrightLocatorTimeout: ${settings.playwrightLocatorTimeout}\n }\n });\n\n test.describe('${options.scenarioName}', () => {\n test.beforeEach(async ({ page }) => {\n // set the ProboPlaywright instance to the current page\n ppw.setPage(page); \n // set the viewport dimensions to be identical to their values during recording\n await page.setViewportSize({ width: ${viewPort.width}, height: ${viewPort.height} });\n });\n\n for (const param of parameterTable) {\n test(param.testName, async ({ page }) => {\n ${hasAiInteractions ? `probo.setParams(param);` : ''}\n ppw.setParams(param);\n ${steps}\n });\n }\n });\n `;\n}\n/**\n * Generates Playwright code for a scenario\n * @param options - Code generation options (scenarioName, interactions, rows)\n * @param settings - Recorder settings (timeouts, AI model, etc.)\n * @param viewPort - Viewport dimensions {width, height}\n * @returns Generated Playwright test code as a string\n */\nexport function generateCode(options, settings, viewPort) {\n return scriptTemplate(options, settings, viewPort);\n}\n// Custom function to create a URL-friendly slug\nexport const createUrlSlug = (url) => {\n try {\n const urlObj = new URL(url);\n // Extract hostname and path\n const hostname = urlObj.hostname;\n const path = urlObj.pathname;\n // Create a more readable name\n let name = hostname;\n // Add path segments if they exist and are meaningful\n if (path && path !== '/') {\n // Remove leading slash and split by slashes\n const pathSegments = path.substring(1).split('/').filter(segment => segment);\n // Add meaningful path segments to the name\n if (pathSegments.length > 0) {\n // Take up to 2 path segments to keep the name reasonable\n const relevantSegments = pathSegments.slice(0, 2);\n name += '-' + relevantSegments.join('-');\n }\n }\n // Replace any remaining special characters with hyphens\n return name\n .toLowerCase()\n .replace(/[^a-z0-9-]/g, '-') // Replace non-alphanumeric chars with hyphens\n .replace(/-+/g, '-') // Replace multiple hyphens with a single hyphen\n .replace(/^-+|-+$/g, ''); // Remove leading/trailing hyphens\n }\n catch (error) {\n // If URL parsing fails, create a simple slug\n // proboLog('❌ Error parsing URL:', error); // Don't log here, just fallback\n return url\n .toLowerCase()\n .replace(/[^a-z0-9-]/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-+|-+$/g, '');\n }\n};\n/**\n * Generate package.json content for a Playwright test project\n */\nexport function generatePackageJson(options) {\n const { name, hasSecrets = false, testScript = 'npx playwright test' } = options;\n return `{\n \"name\": \"${name}\",\n \"version\": \"1.0.0\",\n \"description\": \"Probo Labs Playwright Script\",\n \"type\": \"module\",\n \"scripts\": {\n \"test\": \"${testScript}\"\n },\n \"dependencies\": {\n \"@playwright/test\": \"^1.40.0\",\n \"@probolabs/playwright\": \"latest\"${hasSecrets ? ',\\n \"dotenv\": \"latest\"' : ''}\n }\n}`;\n}\n/**\n * Generate playwright.config.ts content\n */\nexport function generatePlaywrightConfig(includeReporter = true, runId) {\n const reporters = [\n ['list'],\n ['html', { open: 'never' }],\n ];\n // Configure run-specific output directories if runId is provided\n if (runId !== undefined) {\n reporters[1] = ['html', { open: 'never', outputFolder: `playwright-report/run-${runId}` }];\n }\n if (includeReporter) {\n reporters.push(['./probo-reporter.ts']);\n }\n // Configure outputDir for run-specific test results if runId is provided\n const outputDirConfig = runId !== undefined ? `\\n outputDir: 'test-results/run-${runId}',` : '';\n return `import { defineConfig } from '@playwright/test';\n\nexport default defineConfig({\n testDir: 'tests',\n testMatch: /.*\\\\.(ts|js)$/,\n timeout: 600000,${outputDirConfig}\n // Keep Playwright's default console output, plus HTML report${includeReporter ? ', plus Probo live progress reporter' : ''}.\n reporter: ${JSON.stringify(reporters)},\n use: {\n headless: true,\n ignoreHTTPSErrors: true,\n actionTimeout: 30000,\n navigationTimeout: 30000,\n video: 'off',\n screenshot: 'on',\n trace: 'on',\n },\n retries: 0,\n workers: 1,\n});\n`;\n}\n/**\n * Generate a Playwright reporter that emits structured events to stdout.\n *\n * The recorder app runner can parse these lines and broadcast them to the UI.\n */\nexport function generateProboReporter() {\n // NOTE: Keep this file dependency-free; it runs inside the generated test suite project.\n // It prints one JSON payload per line, prefixed for easy extraction from stdout.\n return `import type { Reporter, FullConfig, Suite, TestCase, TestResult, TestStep } from '@playwright/test/reporter';\n\nconst PREFIX = '__PROBO_REPORTER_EVENT__';\n\ntype ProboReporterEvent =\n | {\n v: 1;\n ts: number;\n eventType: 'runBegin';\n config: { workers: number; retries: number; projects: string[] };\n }\n | {\n v: 1;\n ts: number;\n eventType: 'runEnd';\n status: 'passed' | 'failed' | 'timedout' | 'interrupted';\n }\n | {\n v: 1;\n ts: number;\n eventType: 'testBegin';\n test: ProboTestRef;\n }\n | {\n v: 1;\n ts: number;\n eventType: 'testEnd';\n test: ProboTestRef;\n result: {\n status: 'passed' | 'failed' | 'timedout' | 'skipped' | 'interrupted';\n expectedStatus: 'passed' | 'failed' | 'timedout' | 'skipped';\n duration: number;\n errors: string[];\n };\n }\n | {\n v: 1;\n ts: number;\n eventType: 'stepBegin';\n test: ProboTestRef;\n step: ProboStepRef & { title: string; category?: string; depth: number };\n }\n | {\n v: 1;\n ts: number;\n eventType: 'stepEnd';\n test: ProboTestRef;\n step: ProboStepRef & { duration?: number; error?: string | null };\n };\n\ntype ProboLocation = { file?: string; line?: number; column?: number };\ntype ProboTestRef = {\n id?: string;\n title: string;\n titlePath: string[];\n location?: ProboLocation;\n};\ntype ProboStepRef = {\n id: number;\n location?: ProboLocation;\n};\n\nfunction safeLocation(loc: any): ProboLocation | undefined {\n if (!loc || typeof loc !== 'object') return undefined;\n const file = typeof loc.file === 'string' ? loc.file : undefined;\n const line = typeof loc.line === 'number' ? loc.line : undefined;\n const column = typeof loc.column === 'number' ? loc.column : undefined;\n return file || line || column ? { file, line, column } : undefined;\n}\n\nfunction safeTitlePath(test: TestCase): string[] {\n try {\n // titlePath() exists on TestCase and includes describe blocks.\n return test.titlePath();\n } catch {\n return [test.title];\n }\n}\n\nfunction testRef(test: TestCase): ProboTestRef {\n return {\n // @ts-expect-error: Playwright has test.id at runtime; keep optional for forward/back compat.\n id: (test as any).id,\n title: test.title,\n titlePath: safeTitlePath(test),\n location: safeLocation((test as any).location),\n };\n}\n\nfunction serializeErrors(result: TestResult): string[] {\n const errors: any[] = (result as any).errors || [];\n if (!Array.isArray(errors)) return [];\n return errors\n .map((e) => {\n if (!e) return null;\n if (typeof e === 'string') return e;\n if (typeof e.message === 'string') return e.message;\n if (typeof e.value === 'string') return e.value;\n try {\n return JSON.stringify(e);\n } catch {\n return String(e);\n }\n })\n .filter(Boolean) as string[];\n}\n\nfunction emit(event: ProboReporterEvent) {\n try {\n process.stdout.write(PREFIX + JSON.stringify(event) + '\\\\n');\n } catch {\n // Ignore reporter failures; never break the run.\n }\n}\n\n/**\n * Check if a step should be included in the output.\n * Filters out hooks, fixtures, and internal Playwright operations.\n */\nfunction shouldIncludeStep(step: TestStep): boolean {\n const category = (step as any).category;\n const title = step.title?.toLowerCase() || '';\n \n // Filter out hooks (beforeAll, beforeEach, afterAll, afterEach)\n if (category === 'hook') {\n return false;\n }\n \n // Filter out fixtures\n if (category === 'fixture') {\n return false;\n }\n \n // Filter out internal waiting/timeout operations\n if (title.includes('waiting for') || \n title.includes('wait for') ||\n title.includes('timeout') ||\n title.includes('attaching') ||\n title.startsWith('attach')) {\n return false;\n }\n \n // Include user-defined steps and assertions only (exclude pw:api like click, evaluate, etc.)\n return category === 'test.step' || \n category === 'expect' ||\n !category; // Include steps without category (likely user actions)\n}\n\nexport default class ProboReporter implements Reporter {\n private stepIds = new WeakMap<TestStep, number>();\n private stepDepths = new WeakMap<TestStep, number>();\n private nextStepId = 1;\n\n onBegin(config: FullConfig, suite: Suite) {\n emit({\n v: 1,\n ts: Date.now(),\n eventType: 'runBegin',\n config: {\n workers: config.workers,\n retries: config.retries,\n projects: (config.projects || []).map((p) => p.name || 'project'),\n },\n });\n }\n\n onEnd(result: any) {\n emit({\n v: 1,\n ts: Date.now(),\n eventType: 'runEnd',\n status: result?.status || 'failed',\n });\n }\n\n onTestBegin(test: TestCase, result: TestResult) {\n emit({\n v: 1,\n ts: Date.now(),\n eventType: 'testBegin',\n test: testRef(test),\n });\n }\n\n onTestEnd(test: TestCase, result: TestResult) {\n emit({\n v: 1,\n ts: Date.now(),\n eventType: 'testEnd',\n test: testRef(test),\n result: {\n status: result.status,\n expectedStatus: result.expectedStatus,\n duration: result.duration,\n errors: serializeErrors(result),\n },\n });\n }\n\n onStepBegin(test: TestCase, result: TestResult, step: TestStep) {\n // Filter out hooks, fixtures, and internal operations\n if (!shouldIncludeStep(step)) {\n return;\n }\n\n const id = this.stepIds.get(step) ?? this.nextStepId++;\n this.stepIds.set(step, id);\n\n const depth = this.stepDepths.get(step) ?? (step.parent ? (this.stepDepths.get(step.parent) ?? 0) + 1 : 0);\n this.stepDepths.set(step, depth);\n\n emit({\n v: 1,\n ts: Date.now(),\n eventType: 'stepBegin',\n test: testRef(test),\n step: {\n id,\n title: step.title,\n category: (step as any).category,\n depth,\n location: safeLocation((step as any).location),\n },\n });\n }\n\n onStepEnd(test: TestCase, result: TestResult, step: TestStep) {\n // Filter out hooks, fixtures, and internal operations\n if (!shouldIncludeStep(step)) {\n return;\n }\n\n const id = this.stepIds.get(step) ?? this.nextStepId++;\n this.stepIds.set(step, id);\n\n const err = (step as any).error;\n emit({\n v: 1,\n ts: Date.now(),\n eventType: 'stepEnd',\n test: testRef(test),\n step: {\n id,\n duration: (step as any).duration,\n error: err ? (typeof err.message === 'string' ? err.message : String(err)) : null,\n location: safeLocation((step as any).location),\n },\n });\n }\n}\n`;\n}\n//# sourceMappingURL=codegen.js.map","// --- Code generation API utilities for Probo Labs Playwright scripts ---\nimport { \n ApiClient, \n Interaction, \n ElementInfo,\n RecorderSettings,\n DEFAULT_RECORDER_SETTINGS,\n generateCode,\n CodeGeneratorOptions,\n PlaywrightAction,\n ServerResponse,\n ApplyAIStatus,\n ScrollableContainer,\n WaitForConfig,\n TotpConfig,\n SmartSelector\n} from '@probolabs/probo-shared';\n\n/**\n * Options for code generation\n */\nexport interface CodeGenOptions {\n useDefaultSettings?: boolean;\n recorderSettings?: RecorderSettings;\n viewPort?: { width: number; height: number };\n}\n\n/**\n * Result of generating code for a test suite\n */\nexport interface TestSuiteCodeGenResult {\n testSuiteId: number;\n testSuiteName: string;\n scenarios: Array<{\n scenarioId: number;\n scenarioName: string;\n code: string;\n }>;\n}\n\n/**\n * Backend API response format for scenario interactions\n */\ninterface BackendScenarioResponse {\n id: number;\n name: string;\n interactions: BackendInteraction[];\n parameterTable?: Record<string, string>[];\n viewPort?: { width: number; height: number };\n}\n\n/**\n * Backend API response format for test suite\n */\ninterface BackendTestSuiteResponse {\n id: number;\n name: string;\n scenarios: Array<{\n id: number;\n name: string;\n }>;\n}\n\n/**\n * Backend interaction format (from RecorderInteractionSerializer)\n */\ninterface BackendInteraction {\n interactionId: string;\n nativeDescription: string;\n isNativeDescriptionElaborate: boolean;\n action: string;\n argument: string | string[] | null;\n text?: string;\n css_selector?: string;\n iframe_selector?: string;\n smart_selector?: SmartSelector | null;\n smart_iframe_selector?: SmartSelector | null;\n nativeName: string;\n parameterName: string;\n elementInfo?: ElementInfo | null;\n stepId: number;\n base_screenshot_url?: string | null;\n candidates_screenshot_url?: string | null;\n actual_interaction_screenshot_url?: string | null;\n url: string;\n candidate_elements?: ElementInfo[];\n html?: string;\n replay_status?: string | null;\n apply_ai_status?: string | null;\n syncStatus: string;\n recordingId?: string | null;\n last_replay_timestamp?: number | null;\n index?: number;\n serverResponse?: ServerResponse | null;\n annotation?: string;\n scrollableContainers?: ScrollableContainer[];\n waitForConfig?: WaitForConfig;\n totpConfig?: TotpConfig;\n isSecret?: boolean;\n}\n\n/**\n * ProboCodeGenerator - Handles fetching test suite/scenario data and generating Playwright code\n */\nexport class ProboCodeGenerator {\n /**\n * Normalize API URL by removing trailing slash\n */\n private static normalizeApiUrl(apiUrl: string): string {\n return apiUrl.replace(/\\/+$/, '');\n }\n\n private static async readResponseErrorText(response: Response): Promise<string> {\n try {\n const contentType = response.headers.get('content-type');\n if (contentType && contentType.includes('application/json')) {\n const errorData: any = await response.json();\n return errorData.error || errorData.detail || JSON.stringify(errorData);\n }\n\n let errorText = await response.text();\n // Truncate HTML error pages to first 200 chars\n if (errorText.length > 200) {\n errorText = errorText.substring(0, 200) + '...';\n }\n return errorText;\n } catch (e) {\n // Best-effort fallback\n return `HTTP ${response.status}`;\n }\n }\n\n /**\n * Fetch scenario data from the backend API\n */\n private static async fetchScenarioData(\n scenarioId: number,\n apiToken: string,\n apiUrl: string\n ): Promise<BackendScenarioResponse> {\n const normalizedUrl = this.normalizeApiUrl(apiUrl);\n const url = `${normalizedUrl}/api/scenarios/${scenarioId}/interactions`;\n \n const response = await fetch(url, {\n method: 'GET',\n headers: {\n 'Authorization': `Token ${apiToken}`,\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n const errorText = await this.readResponseErrorText(response);\n throw new Error(`Failed to fetch scenario ${scenarioId}: ${response.status} ${errorText}`);\n }\n\n return response.json();\n }\n\n /**\n * Fetch test suite data from the backend API\n */\n private static async fetchTestSuiteData(\n testSuiteId: number,\n apiToken: string,\n apiUrl: string\n ): Promise<BackendTestSuiteResponse> {\n const normalizedUrl = this.normalizeApiUrl(apiUrl);\n // Note: test-suites endpoint doesn't have /api/ prefix (it's from the router at root level)\n const url = `${normalizedUrl}/test-suites/${testSuiteId}/`;\n \n const response = await fetch(url, {\n method: 'GET',\n headers: {\n 'Authorization': `Token ${apiToken}`,\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n const errorText = await this.readResponseErrorText(response);\n throw new Error(`Failed to fetch test suite ${testSuiteId}: ${response.status} ${errorText}`);\n }\n\n return response.json();\n }\n\n /**\n * Convert backend interaction format to Interaction[] format\n */\n private static convertBackendInteractionsToInteractionFormat(\n backendInteractions: BackendInteraction[]\n ): Interaction[] {\n return backendInteractions.map((backendInteraction) => {\n // Convert action string to PlaywrightAction enum\n const action = backendInteraction.action as PlaywrightAction;\n \n // Convert apply_ai_status string to enum if present\n let applyAiStatus: ApplyAIStatus | null = null;\n if (backendInteraction.apply_ai_status) {\n applyAiStatus = backendInteraction.apply_ai_status as ApplyAIStatus;\n }\n\n // Build elementInfo from backend data\n const elementInfo: ElementInfo | null = backendInteraction.elementInfo || null;\n\n // Build interaction object\n const interaction: Interaction = {\n interactionId: backendInteraction.interactionId,\n action: action,\n argument: backendInteraction.argument || '',\n elementInfo: elementInfo,\n iframe_selector: backendInteraction.iframe_selector,\n css_selector: backendInteraction.css_selector,\n smart_selector: backendInteraction.smart_selector || undefined,\n smart_iframe_selector: backendInteraction.smart_iframe_selector || undefined,\n url: backendInteraction.url,\n timestamp: backendInteraction.last_replay_timestamp || Date.now(),\n base_screenshot_url: backendInteraction.base_screenshot_url,\n actual_interaction_screenshot_url: backendInteraction.actual_interaction_screenshot_url,\n candidates_screenshot_url: backendInteraction.candidates_screenshot_url,\n candidate_elements: backendInteraction.candidate_elements || [],\n recordingId: backendInteraction.recordingId,\n syncStatus: backendInteraction.syncStatus,\n serverResponse: backendInteraction.serverResponse || null,\n nativeName: backendInteraction.nativeName,\n nativeDescription: backendInteraction.nativeDescription,\n isNativeDescriptionElaborate: backendInteraction.isNativeDescriptionElaborate,\n parameterName: backendInteraction.parameterName,\n annotation: backendInteraction.annotation,\n last_replay_timestamp: backendInteraction.last_replay_timestamp,\n replay_status: backendInteraction.replay_status,\n apply_ai_status: applyAiStatus,\n error: null,\n index: backendInteraction.index,\n html: backendInteraction.html,\n stepId: backendInteraction.stepId,\n scrollableContainers: backendInteraction.scrollableContainers,\n stdout: undefined,\n waitForConfig: backendInteraction.waitForConfig,\n totpConfig: backendInteraction.totpConfig,\n isSecret: backendInteraction.isSecret || false,\n };\n\n return interaction;\n });\n }\n\n /**\n * Get default recorder settings for code generation\n */\n private static getDefaultRecorderSettings(): RecorderSettings {\n return {\n ...DEFAULT_RECORDER_SETTINGS,\n // Override with sensible defaults for code generation\n enableSmartSelectors: true,\n debugLevel: 'INFO',\n enableConsoleLogs: false,\n };\n }\n\n /**\n * Get default viewport dimensions\n */\n private static getDefaultViewPort(): { width: number; height: number } {\n return { width: 1280, height: 720 };\n }\n\n /**\n * Generate code for a single scenario\n * Fetches scenario data, converts to Interaction[], generates code\n */\n static async generateCodeForScenario(\n scenarioId: number,\n apiToken: string,\n apiUrl: string,\n options?: CodeGenOptions\n ): Promise<string> {\n // Validate inputs\n if (!apiToken) {\n throw new Error('API token is required');\n }\n if (!apiUrl) {\n throw new Error('API URL is required');\n }\n\n // Fetch scenario data\n const scenarioData = await this.fetchScenarioData(scenarioId, apiToken, apiUrl);\n\n // Convert backend interactions to Interaction[] format\n const interactions = this.convertBackendInteractionsToInteractionFormat(scenarioData.interactions || []);\n\n // Get settings and viewport\n const settings = options?.recorderSettings || this.getDefaultRecorderSettings();\n const viewPort = options?.viewPort || scenarioData.viewPort || this.getDefaultViewPort();\n\n // Get parameter table rows\n const rows = scenarioData.parameterTable || [];\n\n // Generate code\n const codeOptions: CodeGeneratorOptions = {\n scenarioName: scenarioData.name,\n interactions: interactions,\n rows: rows,\n };\n\n return generateCode(codeOptions, settings, viewPort);\n }\n\n /**\n * Generate code for all scenarios in a test suite\n * Returns map of scenario names to generated code\n */\n static async generateCodeForTestSuite(\n testSuiteId: number,\n apiToken: string,\n apiUrl: string,\n options?: CodeGenOptions\n ): Promise<TestSuiteCodeGenResult> {\n // Validate inputs\n if (!apiToken) {\n throw new Error('API token is required');\n }\n if (!apiUrl) {\n throw new Error('API URL is required');\n }\n\n // Fetch test suite data\n const testSuiteData = await this.fetchTestSuiteData(testSuiteId, apiToken, apiUrl);\n\n // Generate code for each scenario\n const scenarioResults = await Promise.all(\n testSuiteData.scenarios.map(async (scenario) => {\n try {\n const code = await this.generateCodeForScenario(\n scenario.id,\n apiToken,\n apiUrl,\n options\n );\n return {\n scenarioId: scenario.id,\n scenarioName: scenario.name,\n code: code,\n };\n } catch (error: any) {\n // Log error but continue with other scenarios\n console.error(`Failed to generate code for scenario ${scenario.id}: ${error.message}`);\n throw error; // Re-throw to fail fast for now\n }\n })\n );\n\n return {\n testSuiteId: testSuiteData.id,\n testSuiteName: testSuiteData.name,\n scenarios: scenarioResults,\n };\n }\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\nimport { exec, spawn } from 'child_process';\nimport { promisify } from 'util';\nimport AdmZip from 'adm-zip';\nimport fetch from 'node-fetch';\nimport { ProboCodeGenerator, TestSuiteCodeGenResult } from './codegen-api.js';\nimport { generatePackageJson, generatePlaywrightConfig, generateProboReporter, slugify } from '@probolabs/probo-shared';\n\nconst execAsync = promisify(exec);\n\n/**\n * Result of running a test suite\n */\nexport interface TestSuiteRunResult {\n success: boolean;\n exitCode: number;\n stdout: string;\n stderr: string;\n error?: string;\n runId?: number;\n}\n\n/**\n * Test statistics parsed from Playwright output\n */\nexport interface TestStatistics {\n passed: number;\n failed: number;\n skipped: number;\n}\n\n/**\n * Options for running a test suite\n */\nexport interface TestSuiteRunOptions {\n outputDir?: string;\n includeReporter?: boolean;\n onStatusUpdate?: (updates: Partial<{\n status: string;\n exit_code: number;\n error_message: string;\n stdout: string;\n stderr: string;\n tests_total: number;\n tests_passed: number;\n tests_failed: number;\n tests_skipped: number;\n }>) => void | Promise<void>;\n onStdout?: (chunk: string) => void | Promise<void>;\n onStderr?: (chunk: string) => void | Promise<void>;\n onReporterEvent?: (event: any) => void | Promise<void>;\n}\n\n/**\n * Ensures a directory exists, creating it recursively if needed\n */\nfunction ensureDirectoryExists(dir: string): void {\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n}\n\n/**\n * Gets the default test suite directory path\n */\nfunction getDefaultTestSuiteDir(testSuiteId: number, testSuiteName?: string): string {\n const baseDir = path.join(os.homedir(), '.probium', 'test-suites');\n if (testSuiteName) {\n const sanitizedName = slugify(testSuiteName);\n return path.join(baseDir, `${testSuiteId}-${sanitizedName}`);\n }\n return path.join(baseDir, testSuiteId.toString());\n}\n\n/**\n * Count total tests by scanning spec files\n */\nfunction countTotalTests(testSuiteDir: string): number {\n const testsDir = path.join(testSuiteDir, 'tests');\n if (!fs.existsSync(testsDir)) {\n return 0;\n }\n \n let totalTests = 0;\n const specFiles = fs.readdirSync(testsDir).filter(f => f.endsWith('.spec.ts'));\n \n for (const specFile of specFiles) {\n const filePath = path.join(testsDir, specFile);\n const content = fs.readFileSync(filePath, 'utf-8');\n \n // Count test() and it() calls\n const testMatches = content.match(/\\btest\\s*\\(/g);\n const itMatches = content.match(/\\bit\\s*\\(/g);\n \n if (testMatches) totalTests += testMatches.length;\n if (itMatches) totalTests += itMatches.length;\n \n // If no matches, assume at least 1 test per file\n if (!testMatches && !itMatches) {\n totalTests += 1;\n }\n }\n \n return totalTests;\n}\n\n/**\n * Parse Playwright statistics from stdout\n */\nfunction parsePlaywrightStatistics(stdout: string): TestStatistics {\n // Try to find final summary line: \"X passed\" or \"X passed, Y failed\" etc.\n const summaryMatch = stdout.match(/(\\d+)\\s+passed(?:,\\s*(\\d+)\\s+failed)?(?:,\\s*(\\d+)\\s+skipped)?/);\n \n if (summaryMatch) {\n return {\n passed: parseInt(summaryMatch[1]) || 0,\n failed: parseInt(summaryMatch[2]) || 0,\n skipped: parseInt(summaryMatch[3]) || 0,\n };\n }\n \n // Fallback: count individual test results\n const passed = (stdout.match(/✓/g) || []).length;\n const failed = (stdout.match(/✘/g) || []).length;\n const skipped = (stdout.match(/-\\s+test/g) || []).length;\n \n return { passed, failed, skipped };\n}\n\n/**\n * Parse statistics from Playwright HTML report metadata (most reliable)\n */\nfunction parseStatisticsFromMetadata(testSuiteDir: string): TestStatistics | null {\n try {\n const reportDir = path.join(testSuiteDir, 'playwright-report');\n const metadataPath = path.join(reportDir, 'data', 'metadata.json');\n if (!fs.existsSync(metadataPath)) {\n return null;\n }\n \n const metadata = JSON.parse(fs.readFileSync(metadataPath, 'utf-8'));\n return {\n passed: metadata.passed || 0,\n failed: metadata.failed || 0,\n skipped: metadata.skipped || 0,\n };\n } catch (error) {\n console.warn('⚠️ Could not parse metadata.json:', error);\n return null;\n }\n}\n\n/**\n * Zip a directory using adm-zip\n */\nasync function zipDirectory(sourceDir: string, outputPath: string): Promise<void> {\n try {\n const zip = new AdmZip();\n \n // Add all files from the source directory recursively\n zip.addLocalFolder(sourceDir);\n \n // Write zip file\n zip.writeZip(outputPath);\n \n const stats = fs.statSync(outputPath);\n console.log(`✅ Zipped ${stats.size} bytes`);\n } catch (error) {\n console.error(`❌ Error zipping directory: ${error}`);\n throw error;\n }\n}\n\n/**\n * Upload artifact to backend\n */\nasync function uploadArtifact(\n runId: number,\n testSuiteId: number,\n filePath: string,\n artifactType: string,\n name: string,\n apiToken: string,\n apiUrl: string\n): Promise<void> {\n const fileStats = fs.statSync(filePath);\n const fileSize = fileStats.size;\n \n // Determine content type\n const contentTypes: { [key: string]: string } = {\n 'html_report': 'application/zip',\n 'test_results': 'application/zip',\n 'log_file': 'text/plain',\n 'video': 'video/webm',\n 'screenshot': 'image/png',\n };\n const contentType = contentTypes[artifactType] || 'application/octet-stream';\n \n // Read file as buffer (like screenshot uploads)\n const fileBuffer = fs.readFileSync(filePath);\n \n // Upload directly to Django backend (like screenshots - raw binary)\n // FileUploadParser requires Content-Disposition header with filename\n const response = await fetch(`${apiUrl}/test-suites/${testSuiteId}/runs/${runId}/upload_artifact/`, {\n method: 'POST',\n headers: {\n 'Authorization': `Token ${apiToken}`,\n 'Content-Type': contentType,\n 'Content-Disposition': `attachment; filename=\"${name}\"`,\n 'X-Artifact-Type': artifactType,\n 'X-Artifact-Name': name,\n },\n body: fileBuffer,\n });\n \n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Failed to upload artifact: ${response.status} ${errorText}`);\n }\n \n console.log(`✅ Uploaded artifact: ${name} (${(fileSize / 1024 / 1024).toFixed(2)} MB)`);\n}\n\n/**\n * Update run status via API\n */\nasync function updateRunStatus(\n runId: number,\n testSuiteId: number,\n updates: Partial<{\n status: string;\n exit_code: number;\n error_message: string;\n stdout: string;\n stderr: string;\n steps: Array<{\n id: number;\n title: string;\n depth: number;\n status: 'running' | 'passed' | 'failed';\n error?: string | null;\n }>;\n tests_total: number;\n tests_passed: number;\n tests_failed: number;\n tests_skipped: number;\n }>,\n apiToken: string,\n apiUrl: string\n): Promise<void> {\n // Ensure apiUrl doesn't have trailing slash\n const baseUrl = apiUrl.endsWith('/') ? apiUrl.slice(0, -1) : apiUrl;\n const url = `${baseUrl}/test-suites/${testSuiteId}/runs/${runId}/`;\n const body = JSON.stringify(updates);\n \n const headers: Record<string, string> = {\n 'Authorization': `Token ${apiToken}`,\n 'Content-Type': 'application/json',\n };\n \n try {\n const response = await fetch(url, {\n method: 'PATCH',\n headers: headers,\n body: body,\n });\n \n if (!response.ok) {\n const errorText = await response.text();\n console.warn(`⚠️ Failed to update run status: ${response.status} ${errorText}`);\n }\n } catch (error) {\n console.error(`❌ Error updating run status:`, error);\n }\n}\n\n/**\n * TestSuiteRunner - Handles test suite file generation and execution\n */\nexport class TestSuiteRunner {\n /**\n * Lookup test suite ID by name and project\n */\n static async lookupTestSuiteByName(\n testSuiteName: string,\n projectName: string,\n apiToken: string,\n apiUrl: string\n ): Promise<number> {\n const baseUrl = apiUrl.endsWith('/') ? apiUrl.slice(0, -1) : apiUrl;\n const url = `${baseUrl}/test-suites/?name=${encodeURIComponent(testSuiteName)}&project=${encodeURIComponent(projectName)}`;\n \n const response = await fetch(url, {\n method: 'GET',\n headers: {\n 'Authorization': `Token ${apiToken}`,\n 'Content-Type': 'application/json',\n },\n });\n \n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Failed to lookup test suite: ${response.status} ${errorText}`);\n }\n \n const data = await response.json();\n if (Array.isArray(data) && data.length > 0) {\n return data[0].id;\n }\n \n if (data.results && Array.isArray(data.results) && data.results.length > 0) {\n return data.results[0].id;\n }\n \n throw new Error(`Test suite \"${testSuiteName}\" not found in project \"${projectName}\"`);\n }\n\n /**\n * Generate all files for a test suite\n */\n static async generateTestSuiteFiles(\n testSuiteId: number,\n apiToken: string,\n apiUrl: string,\n outputDir?: string,\n testSuiteName?: string,\n includeReporter: boolean = true,\n runId?: number\n ): Promise<void> {\n const testSuiteDir = outputDir || getDefaultTestSuiteDir(testSuiteId, testSuiteName);\n \n // Generate code for all scenarios\n const codeGenResult = await ProboCodeGenerator.generateCodeForTestSuite(\n testSuiteId,\n apiToken,\n apiUrl\n );\n\n // Ensure directories exist\n ensureDirectoryExists(testSuiteDir);\n const testsDir = path.join(testSuiteDir, 'tests');\n ensureDirectoryExists(testsDir);\n\n // Save each scenario's code to a .spec.ts file\n for (const scenario of codeGenResult.scenarios) {\n const fileName = `${slugify(scenario.scenarioName)}.spec.ts`;\n const filePath = path.join(testsDir, fileName);\n fs.writeFileSync(filePath, scenario.code, 'utf-8');\n console.log(`✅ Generated test file: ${filePath}`);\n }\n\n // Generate package.json\n await this.generatePackageJson(testSuiteDir, codeGenResult);\n\n // Generate playwright.config.ts with runId if available\n await this.generatePlaywrightConfig(testSuiteDir, includeReporter, runId);\n\n // Generate custom reporter file for live progress streaming (only if requested)\n if (includeReporter) {\n await this.generateProboReporter(testSuiteDir);\n }\n }\n\n /**\n * Generate package.json file\n */\n static async generatePackageJson(\n outputDir: string,\n codeGenResult: TestSuiteCodeGenResult\n ): Promise<void> {\n // Check if any scenario has secrets by examining the generated code\n // We'll check for dotenv imports in the generated code\n const hasSecrets = codeGenResult.scenarios.some(scenario => \n scenario.code.includes(\"import { config } from 'dotenv'\")\n );\n\n const sanitizedName = slugify(codeGenResult.testSuiteName);\n \n const packageJsonContent = generatePackageJson({\n name: sanitizedName,\n hasSecrets: hasSecrets,\n testScript: 'npx playwright test'\n });\n\n const filePath = path.join(outputDir, 'package.json');\n fs.writeFileSync(filePath, packageJsonContent, 'utf-8');\n console.log(`✅ Generated package.json: ${filePath}`);\n }\n\n /**\n * Generate playwright.config.ts file\n */\n static async generatePlaywrightConfig(outputDir: string, includeReporter: boolean = true, runId?: number): Promise<void> {\n const configContent = generatePlaywrightConfig(includeReporter, runId);\n\n const filePath = path.join(outputDir, 'playwright.config.ts');\n fs.writeFileSync(filePath, configContent, 'utf-8');\n console.log(`✅ Generated playwright.config.ts: ${filePath}`);\n }\n\n /**\n * Generate Probo custom Playwright reporter (for live step/test events)\n */\n static async generateProboReporter(outputDir: string): Promise<void> {\n const reporterContent = generateProboReporter();\n const filePath = path.join(outputDir, 'probo-reporter.ts');\n fs.writeFileSync(filePath, reporterContent, 'utf-8');\n console.log(`✅ Generated probo-reporter.ts: ${filePath}`);\n }\n\n /**\n * Run a test suite\n * Generates files, installs dependencies, and executes tests\n */\n static async runTestSuite(\n testSuiteId: number,\n apiToken: string,\n apiUrl: string,\n testSuiteName?: string,\n runId?: number,\n options: TestSuiteRunOptions = {}\n ): Promise<TestSuiteRunResult> {\n const {\n outputDir,\n includeReporter = true,\n onStatusUpdate,\n onStdout,\n onStderr,\n onReporterEvent,\n } = options;\n \n const testSuiteDir = outputDir || getDefaultTestSuiteDir(testSuiteId, testSuiteName);\n let currentRunId = runId;\n\n try {\n // Create run record if not provided (needed for run-specific report directories)\n if (!currentRunId) {\n try {\n const createResponse = await fetch(`${apiUrl}/test-suites/${testSuiteId}/runs/`, {\n method: 'POST',\n headers: {\n 'Authorization': `Token ${apiToken}`,\n 'Content-Type': 'application/json',\n },\n });\n \n if (createResponse.ok) {\n const runData = await createResponse.json();\n currentRunId = runData.id;\n console.log(`✅ Created test suite run: ${currentRunId}`);\n } else {\n console.warn('⚠️ Failed to create run record, continuing without tracking');\n }\n } catch (error) {\n console.warn('⚠️ Failed to create run record:', error);\n }\n }\n\n // Generate all files (with runId if available for run-specific report directories)\n console.log(`📝 Generating test suite files for test suite ${testSuiteId}...`);\n await this.generateTestSuiteFiles(testSuiteId, apiToken, apiUrl, testSuiteDir, testSuiteName, includeReporter, currentRunId);\n\n // Count total tests\n const testsTotal = countTotalTests(testSuiteDir);\n if (currentRunId && testsTotal > 0) {\n await updateRunStatus(currentRunId, testSuiteId, { tests_total: testsTotal }, apiToken, apiUrl);\n if (onStatusUpdate) {\n await onStatusUpdate({ tests_total: testsTotal });\n }\n }\n\n // Install dependencies\n console.log(`📦 Installing dependencies in ${testSuiteDir}...`);\n try {\n const { stdout: installStdout, stderr: installStderr } = await execAsync(\n 'npm install',\n { cwd: testSuiteDir, timeout: 300000 } // 5 minute timeout for install\n );\n console.log('✅ Dependencies installed successfully');\n if (installStdout) console.log(installStdout);\n if (installStderr) console.warn(installStderr);\n } catch (installError: any) {\n console.error('❌ Failed to install dependencies:', installError);\n const errorMsg = `Failed to install dependencies: ${installError.message}`;\n if (currentRunId) {\n await updateRunStatus(\n currentRunId,\n testSuiteId,\n {\n status: 'error',\n exit_code: installError.code || 1,\n error_message: errorMsg,\n stderr: installError.stderr || installError.message || '',\n },\n apiToken,\n apiUrl\n );\n if (onStatusUpdate) {\n await onStatusUpdate({\n status: 'error',\n exit_code: installError.code || 1,\n error_message: errorMsg,\n stderr: installError.stderr || installError.message || '',\n });\n }\n }\n return {\n success: false,\n exitCode: installError.code || 1,\n stdout: installError.stdout || '',\n stderr: installError.stderr || installError.message || '',\n error: errorMsg,\n runId: currentRunId,\n };\n }\n\n // Run Playwright tests with streaming output\n console.log(`🚀 Running Playwright tests in ${testSuiteDir}...`);\n\n return new Promise<TestSuiteRunResult>(async (resolve) => {\n let stdout = '';\n let stderr = '';\n let hasResolved = false;\n let lastStatsUpdate = 0;\n let stdoutLineBuffer = '';\n const PROBO_REPORTER_PREFIX = '__PROBO_REPORTER_EVENT__';\n const reporterStats: TestStatistics = { passed: 0, failed: 0, skipped: 0 };\n let lastReporterStatsUpdate = 0;\n const REPORTER_STATS_UPDATE_INTERVAL = 1500; // throttle API updates from reporter events\n const STATS_UPDATE_INTERVAL = 10000; // Update stats every 10 seconds\n const STEPS_UPDATE_INTERVAL = 2000; // Update steps every 2 seconds\n let lastStepsUpdate = 0;\n const collectedSteps: Array<{\n id: number;\n title: string;\n depth: number;\n status: 'running' | 'passed' | 'failed';\n error?: string | null;\n }> = [];\n\n // Use spawn for streaming output\n const testProcess = spawn('npx', ['playwright', 'test'], {\n cwd: testSuiteDir,\n shell: true,\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n\n // Stream stdout line by line\n testProcess.stdout?.on('data', async (data: Buffer) => {\n const chunk = data.toString();\n stdoutLineBuffer += chunk;\n\n // Process complete lines so we can intercept reporter events without polluting logs.\n const parts = stdoutLineBuffer.split(/\\n/);\n stdoutLineBuffer = parts.pop() ?? '';\n\n let forwarded = '';\n\n for (const rawLine of parts) {\n const line = rawLine.endsWith('\\r') ? rawLine.slice(0, -1) : rawLine;\n if (line.startsWith(PROBO_REPORTER_PREFIX)) {\n const jsonPart = line.slice(PROBO_REPORTER_PREFIX.length);\n try {\n const reporterEvent = JSON.parse(jsonPart);\n\n // Call reporter event callback if provided\n if (onReporterEvent) {\n await onReporterEvent(reporterEvent);\n }\n\n // Collect steps from reporter events\n if (reporterEvent?.eventType === 'stepBegin') {\n const step = reporterEvent?.step;\n const id = typeof step?.id === 'number' ? step.id : null;\n const title = typeof step?.title === 'string' ? step.title : null;\n const depth = typeof step?.depth === 'number' ? step.depth : 0;\n if (id && title) {\n // Check if step already exists (update) or add new\n const existingIndex = collectedSteps.findIndex(s => s.id === id);\n if (existingIndex === -1) {\n collectedSteps.push({ id, title, depth, status: 'running' });\n }\n }\n }\n\n if (reporterEvent?.eventType === 'stepEnd') {\n const step = reporterEvent?.step;\n const id = typeof step?.id === 'number' ? step.id : null;\n if (id) {\n const error = typeof step?.error === 'string' ? step.error : null;\n const existingIndex = collectedSteps.findIndex(s => s.id === id);\n if (existingIndex !== -1) {\n // Update existing step with final status\n collectedSteps[existingIndex] = {\n ...collectedSteps[existingIndex],\n status: error ? 'failed' : 'passed',\n error: error || null,\n };\n }\n // If step doesn't exist, ignore (stepBegin should have been called first)\n }\n }\n\n // Save steps periodically\n if (currentRunId) {\n const now = Date.now();\n if (now - lastStepsUpdate > STEPS_UPDATE_INTERVAL) {\n lastStepsUpdate = now;\n await updateRunStatus(\n currentRunId,\n testSuiteId,\n { steps: [...collectedSteps] },\n apiToken,\n apiUrl\n );\n }\n }\n\n // Keep a more reliable running tally than parsing stdout.\n if (currentRunId && reporterEvent?.eventType === 'testEnd' && reporterEvent?.result?.status) {\n const status = reporterEvent.result.status as string;\n if (status === 'passed') reporterStats.passed += 1;\n else if (status === 'failed' || status === 'timedout' || status === 'interrupted') reporterStats.failed += 1;\n else if (status === 'skipped') reporterStats.skipped += 1;\n\n const now = Date.now();\n if (now - lastReporterStatsUpdate > REPORTER_STATS_UPDATE_INTERVAL) {\n lastReporterStatsUpdate = now;\n await updateRunStatus(\n currentRunId,\n testSuiteId,\n {\n tests_passed: reporterStats.passed,\n tests_failed: reporterStats.failed,\n tests_skipped: reporterStats.skipped,\n },\n apiToken,\n apiUrl\n );\n if (onStatusUpdate) {\n await onStatusUpdate({\n tests_passed: reporterStats.passed,\n tests_failed: reporterStats.failed,\n tests_skipped: reporterStats.skipped,\n });\n }\n }\n }\n } catch {\n // If parsing fails, ignore and don't forward to logs.\n }\n continue;\n }\n\n forwarded += rawLine + '\\n';\n }\n\n if (forwarded) {\n stdout += forwarded;\n // Call stdout callback if provided\n if (onStdout) {\n await onStdout(forwarded);\n }\n }\n\n // Parse and update statistics periodically\n if (currentRunId) {\n const now = Date.now();\n // Only use stdout parsing as a fallback (in case reporter isn't loaded).\n if (now - lastStatsUpdate > STATS_UPDATE_INTERVAL && now - lastReporterStatsUpdate > REPORTER_STATS_UPDATE_INTERVAL) {\n lastStatsUpdate = now;\n const stats = parsePlaywrightStatistics(stdout);\n await updateRunStatus(\n currentRunId,\n testSuiteId,\n {\n tests_passed: stats.passed,\n tests_failed: stats.failed,\n tests_skipped: stats.skipped,\n },\n apiToken,\n apiUrl\n );\n if (onStatusUpdate) {\n await onStatusUpdate({\n tests_passed: stats.passed,\n tests_failed: stats.failed,\n tests_skipped: stats.skipped,\n });\n }\n }\n }\n });\n\n // Stream stderr line by line\n testProcess.stderr?.on('data', async (data: Buffer) => {\n const chunk = data.toString();\n stderr += chunk;\n // Call stderr callback if provided\n if (onStderr) {\n await onStderr(chunk);\n }\n });\n\n // Handle process completion\n testProcess.on('close', async (code) => {\n if (hasResolved) return;\n hasResolved = true;\n\n // Flush any remaining buffered stdout (may be a partial last line)\n if (stdoutLineBuffer) {\n const remaining = stdoutLineBuffer;\n stdoutLineBuffer = '';\n if (remaining.startsWith(PROBO_REPORTER_PREFIX)) {\n try {\n const reporterEvent = JSON.parse(remaining.slice(PROBO_REPORTER_PREFIX.length));\n if (onReporterEvent) {\n await onReporterEvent(reporterEvent);\n }\n if (currentRunId && reporterEvent?.eventType === 'testEnd' && reporterEvent?.result?.status) {\n const status = reporterEvent.result.status as string;\n if (status === 'passed') reporterStats.passed += 1;\n else if (status === 'failed' || status === 'timedout' || status === 'interrupted') reporterStats.failed += 1;\n else if (status === 'skipped') reporterStats.skipped += 1;\n }\n } catch {\n // ignore\n }\n } else {\n stdout += remaining;\n if (onStdout) {\n await onStdout(remaining);\n }\n }\n }\n\n const exitCode = code ?? 1;\n const success = exitCode === 0;\n const isTestFailure = exitCode === 1 && stdout.length > 0;\n\n console.log(success ? '✅ Tests completed successfully' : (isTestFailure ? '⚠️ Tests completed with failures' : '❌ Test execution failed'));\n\n // Parse final statistics from metadata/stdout as fallback\n let parsedStats: TestStatistics | null = null;\n if (fs.existsSync(path.join(testSuiteDir, 'playwright-report'))) {\n parsedStats = parseStatisticsFromMetadata(testSuiteDir);\n }\n if (!parsedStats) {\n parsedStats = parsePlaywrightStatistics(stdout);\n }\n\n // Use reporterStats as source of truth (tracked from real-time events)\n // Fall back to parsed stats only if reporterStats is empty\n const totalFromReporter = reporterStats.passed + reporterStats.failed + reporterStats.skipped;\n const finalStats = totalFromReporter > 0 ? reporterStats : (parsedStats || { passed: 0, failed: 0, skipped: 0 });\n\n // Update run status with final steps\n if (currentRunId) {\n const finalStatus = success ? 'success' : 'error';\n await updateRunStatus(\n currentRunId,\n testSuiteId,\n {\n status: finalStatus,\n exit_code: exitCode,\n stdout: stdout,\n stderr: stderr,\n steps: [...collectedSteps], // Save final steps state\n error_message: success || isTestFailure ? undefined : `Test execution failed with exit code ${exitCode}`,\n tests_passed: finalStats.passed,\n tests_failed: finalStats.failed,\n tests_skipped: finalStats.skipped,\n },\n apiToken,\n apiUrl\n );\n if (onStatusUpdate) {\n await onStatusUpdate({\n status: finalStatus,\n exit_code: exitCode,\n stdout: stdout,\n stderr: stderr,\n tests_passed: finalStats.passed,\n tests_failed: finalStats.failed,\n tests_skipped: finalStats.skipped,\n });\n }\n\n // Artifact uploads disabled - reports are now accessed locally via trace viewer\n // Upload artifacts functionality preserved but disabled\n // await this.uploadArtifacts(currentRunId, testSuiteId, testSuiteDir, apiToken, apiUrl);\n }\n\n resolve({\n success: success,\n exitCode: exitCode,\n stdout: stdout,\n stderr: stderr,\n // Only set error if it's not a success and not a test failure (i.e., real execution error)\n error: success || isTestFailure ? undefined : `Test execution failed with exit code ${exitCode}`,\n runId: currentRunId,\n });\n });\n\n // Handle process errors\n testProcess.on('error', async (error: Error) => {\n if (hasResolved) return;\n hasResolved = true;\n\n const errorMessage = error.message || String(error);\n stderr += errorMessage;\n \n console.error('❌ Test execution failed:', error);\n\n // Update run status\n if (currentRunId) {\n await updateRunStatus(\n currentRunId,\n testSuiteId,\n {\n status: 'error',\n exit_code: 1,\n error_message: `Test execution failed: ${errorMessage}`,\n stderr: stderr,\n },\n apiToken,\n apiUrl\n );\n if (onStatusUpdate) {\n await onStatusUpdate({\n status: 'error',\n exit_code: 1,\n error_message: `Test execution failed: ${errorMessage}`,\n stderr: stderr,\n });\n }\n }\n\n resolve({\n success: false,\n exitCode: 1,\n stdout: stdout,\n stderr: stderr,\n error: `Test execution failed: ${errorMessage}`,\n runId: currentRunId,\n });\n });\n\n // Set timeout (1 hour)\n setTimeout(async () => {\n if (!hasResolved) {\n hasResolved = true;\n testProcess.kill();\n \n const errorMessage = 'Test execution timed out after 1 hour';\n stderr += errorMessage;\n \n // Update run status\n if (currentRunId) {\n await updateRunStatus(\n currentRunId,\n testSuiteId,\n {\n status: 'error',\n exit_code: 1,\n error_message: errorMessage,\n stderr: stderr,\n },\n apiToken,\n apiUrl\n );\n if (onStatusUpdate) {\n await onStatusUpdate({\n status: 'error',\n exit_code: 1,\n error_message: errorMessage,\n stderr: stderr,\n });\n }\n }\n\n resolve({\n success: false,\n exitCode: 1,\n stdout: stdout,\n stderr: stderr,\n error: errorMessage,\n runId: currentRunId,\n });\n }\n }, 3600000); // 1 hour timeout\n });\n } catch (error: any) {\n console.error('❌ Error running test suite:', error);\n const errorMsg = error.message || String(error);\n if (currentRunId) {\n await updateRunStatus(\n currentRunId,\n testSuiteId,\n {\n status: 'error',\n exit_code: 1,\n error_message: errorMsg,\n },\n apiToken,\n apiUrl\n ).catch(() => {}); // Ignore errors updating status\n if (onStatusUpdate) {\n try {\n const result = onStatusUpdate({\n status: 'error',\n exit_code: 1,\n error_message: errorMsg,\n });\n if (result && typeof result.then === 'function') {\n await result.catch(() => {});\n }\n } catch {\n // Ignore errors in status update callback\n }\n }\n }\n return {\n success: false,\n exitCode: 1,\n stdout: '',\n stderr: errorMsg,\n error: errorMsg,\n runId: currentRunId,\n };\n }\n }\n\n /**\n * Upload artifacts for a test suite run\n * \n * NOTE: This method is preserved for potential future use but is currently disabled.\n * Artifacts are now accessed locally via the trace viewer instead of being uploaded to the backend.\n */\n static async uploadArtifacts(\n runId: number,\n testSuiteId: number,\n testSuiteDir: string,\n apiToken: string,\n apiUrl: string\n ): Promise<void> {\n // Artifact uploads disabled - reports are now accessed locally via trace viewer\n // Method signature preserved for potential future re-enablement\n return;\n }\n}\n","import { TestSuiteRunner } from './test-suite-runner.js';\n\nexport interface CLIOptions {\n testSuiteId?: number;\n testSuiteName?: string;\n project?: string;\n outputDir?: string;\n apiKey?: string;\n apiEndpoint?: string;\n}\n\nexport async function runCLI(options: CLIOptions): Promise<void> {\n const apiToken = options.apiKey || process.env.PROBO_API_KEY;\n if (!apiToken) {\n console.error('❌ Error: PROBO_API_KEY environment variable or --api-key flag is required');\n process.exit(1);\n }\n\n const apiUrl = options.apiEndpoint || process.env.PROBO_API_ENDPOINT || 'https://api.probolabs.ai';\n \n let testSuiteId: number;\n \n // Resolve test suite ID\n if (options.testSuiteId) {\n testSuiteId = options.testSuiteId;\n } else if (options.testSuiteName) {\n if (!options.project) {\n console.error('❌ Error: --project is required when using --test-suite-name');\n process.exit(1);\n }\n try {\n console.log(`🔍 Looking up test suite \"${options.testSuiteName}\" in project \"${options.project}\"...`);\n testSuiteId = await TestSuiteRunner.lookupTestSuiteByName(\n options.testSuiteName,\n options.project,\n apiToken,\n apiUrl\n );\n console.log(`✅ Found test suite ID: ${testSuiteId}`);\n } catch (error: any) {\n console.error(`❌ Error looking up test suite: ${error.message}`);\n process.exit(1);\n }\n } else {\n console.error('❌ Error: Either --test-suite-id or --test-suite-name must be provided');\n process.exit(1);\n }\n\n // Run the test suite\n try {\n const result = await TestSuiteRunner.runTestSuite(\n testSuiteId,\n apiToken,\n apiUrl,\n options.testSuiteName,\n undefined, // runId - will be created automatically\n {\n outputDir: options.outputDir,\n includeReporter: false, // CI/CD mode - no custom reporter\n }\n );\n\n if (result.success) {\n console.log('✅ Test suite completed successfully');\n process.exit(0);\n } else {\n console.error(`❌ Test suite failed with exit code ${result.exitCode}`);\n if (result.error) {\n console.error(`Error: ${result.error}`);\n }\n process.exit(result.exitCode || 1);\n }\n } catch (error: any) {\n console.error(`❌ Error running test suite: ${error.message}`);\n process.exit(1);\n }\n}\n"],"names":["fetch"],"mappings":";;;;;;;;AAAO,IAAI,aAAa,CAAC;AACzB,CAAC,UAAU,aAAa,EAAE;AAC1B,IAAI,aAAa,CAAC,eAAe,CAAC,GAAG,eAAe,CAAC;AACrD,IAAI,aAAa,CAAC,iBAAiB,CAAC,GAAG,iBAAiB,CAAC;AACzD,IAAI,aAAa,CAAC,eAAe,CAAC,GAAG,eAAe,CAAC;AACrD,IAAI,aAAa,CAAC,YAAY,CAAC,GAAG,YAAY,CAAC;AAC/C,IAAI,aAAa,CAAC,cAAc,CAAC,GAAG,cAAc,CAAC;AACnD,IAAI,aAAa,CAAC,YAAY,CAAC,GAAG,YAAY,CAAC;AAC/C,IAAI,aAAa,CAAC,gBAAgB,CAAC,GAAG,gBAAgB,CAAC;AACvD,IAAI,aAAa,CAAC,oBAAoB,CAAC,GAAG,oBAAoB,CAAC;AAC/D,IAAI,aAAa,CAAC,mBAAmB,CAAC,GAAG,mBAAmB,CAAC;AAC7D,IAAI,aAAa,CAAC,eAAe,CAAC,GAAG,eAAe,CAAC;AACrD,CAAC,EAAE,aAAa,KAAK,aAAa,GAAG,EAAE,CAAC,CAAC,CAAC;AACnC,IAAI,YAAY,CAAC;AACxB,CAAC,UAAU,YAAY,EAAE;AACzB,IAAI,YAAY,CAAC,cAAc,CAAC,GAAG,cAAc,CAAC;AAClD,IAAI,YAAY,CAAC,gBAAgB,CAAC,GAAG,gBAAgB,CAAC;AACtD,IAAI,YAAY,CAAC,cAAc,CAAC,GAAG,cAAc,CAAC;AAClD,IAAI,YAAY,CAAC,kBAAkB,CAAC,GAAG,kBAAkB,CAAC;AAC1D,CAAC,EAAE,YAAY,KAAK,YAAY,GAAG,EAAE,CAAC,CAAC;;ACnBvC;AACO,IAAI,gBAAgB,CAAC;AAC5B,CAAC,UAAU,gBAAgB,EAAE;AAC7B,IAAI,gBAAgB,CAAC,gBAAgB,CAAC,GAAG,gBAAgB,CAAC;AAC1D,IAAI,gBAAgB,CAAC,WAAW,CAAC,GAAG,WAAW,CAAC;AAChD,IAAI,gBAAgB,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;AACxC,IAAI,gBAAgB,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC;AAC5C,IAAI,gBAAgB,CAAC,iBAAiB,CAAC,GAAG,iBAAiB,CAAC;AAC5D,IAAI,gBAAgB,CAAC,0BAA0B,CAAC,GAAG,0BAA0B,CAAC;AAC9E,IAAI,gBAAgB,CAAC,gBAAgB,CAAC,GAAG,gBAAgB,CAAC;AAC1D,IAAI,gBAAgB,CAAC,cAAc,CAAC,GAAG,cAAc,CAAC;AACtD,IAAI,gBAAgB,CAAC,eAAe,CAAC,GAAG,eAAe,CAAC;AACxD,IAAI,gBAAgB,CAAC,YAAY,CAAC,GAAG,YAAY,CAAC;AAClD,IAAI,gBAAgB,CAAC,WAAW,CAAC,GAAG,WAAW,CAAC;AAChD,IAAI,gBAAgB,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;AACxC,IAAI,gBAAgB,CAAC,oBAAoB,CAAC,GAAG,oBAAoB,CAAC;AAClE,IAAI,gBAAgB,CAAC,uBAAuB,CAAC,GAAG,uBAAuB,CAAC;AACxE,IAAI,gBAAgB,CAAC,YAAY,CAAC,GAAG,YAAY,CAAC;AAClD,IAAI,gBAAgB,CAAC,mBAAmB,CAAC,GAAG,mBAAmB,CAAC;AAChE,IAAI,gBAAgB,CAAC,eAAe,CAAC,GAAG,eAAe,CAAC;AACxD,IAAI,gBAAgB,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC;AAC1C,IAAI,gBAAgB,CAAC,gBAAgB,CAAC,GAAG,gBAAgB,CAAC;AAC1D,IAAI,gBAAgB,CAAC,cAAc,CAAC,GAAG,cAAc,CAAC;AACtD,IAAI,gBAAgB,CAAC,UAAU,CAAC,GAAG,UAAU,CAAC;AAC9C,IAAI,gBAAgB,CAAC,cAAc,CAAC,GAAG,cAAc,CAAC;AACtD,IAAI,gBAAgB,CAAC,UAAU,CAAC,GAAG,UAAU,CAAC;AAC9C;AACA,IAAI,gBAAgB,CAAC,gBAAgB,CAAC,GAAG,gBAAgB,CAAC;AAC1D,IAAI,gBAAgB,CAAC,cAAc,CAAC,GAAG,cAAc,CAAC;AACtD,CAAC,EAAE,gBAAgB,KAAK,gBAAgB,GAAG,EAAE,CAAC,CAAC;;ACiH/C;AACA,IAAI,WAAW,CAAC;AAChB,CAAC,UAAU,WAAW,EAAE;AACxB,IAAI,WAAW,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;AAC/B,IAAI,WAAW,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAC7B,IAAI,WAAW,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;AACnC,CAAC,EAAE,WAAW,KAAK,WAAW,GAAG,EAAE,CAAC,CAAC;;ACpJrC;AACO,IAAI,qBAAqB,CAAC;AACjC,CAAC,UAAU,qBAAqB,EAAE;AAClC,IAAI,qBAAqB,CAAC,oCAAoC,CAAC,GAAG,oCAAoC,CAAC;AACvG,IAAI,qBAAqB,CAAC,sCAAsC,CAAC,GAAG,sCAAsC,CAAC;AAC3G,IAAI,qBAAqB,CAAC,oCAAoC,CAAC,GAAG,oCAAoC,CAAC;AACvG,IAAI,qBAAqB,CAAC,wCAAwC,CAAC,GAAG,wCAAwC,CAAC;AAC/G,IAAI,qBAAqB,CAAC,0CAA0C,CAAC,GAAG,0CAA0C,CAAC;AACnH,IAAI,qBAAqB,CAAC,wCAAwC,CAAC,GAAG,wCAAwC,CAAC;AAC/G,IAAI,qBAAqB,CAAC,0BAA0B,CAAC,GAAG,0BAA0B,CAAC;AACnF,IAAI,qBAAqB,CAAC,4BAA4B,CAAC,GAAG,4BAA4B,CAAC;AACvF,IAAI,qBAAqB,CAAC,0BAA0B,CAAC,GAAG,0BAA0B,CAAC;AACnF,IAAI,qBAAqB,CAAC,8BAA8B,CAAC,GAAG,8BAA8B,CAAC;AAC3F,IAAI,qBAAqB,CAAC,gCAAgC,CAAC,GAAG,gCAAgC,CAAC;AAC/F,IAAI,qBAAqB,CAAC,4BAA4B,CAAC,GAAG,4BAA4B,CAAC;AACvF,IAAI,qBAAqB,CAAC,0BAA0B,CAAC,GAAG,0BAA0B,CAAC;AACnF,IAAI,qBAAqB,CAAC,wCAAwC,CAAC,GAAG,wCAAwC,CAAC;AAC/G,IAAI,qBAAqB,CAAC,oCAAoC,CAAC,GAAG,oCAAoC,CAAC;AACvG,IAAI,qBAAqB,CAAC,eAAe,CAAC,GAAG,eAAe,CAAC;AAC7D,IAAI,qBAAqB,CAAC,sBAAsB,CAAC,GAAG,sBAAsB,CAAC;AAC3E,IAAI,qBAAqB,CAAC,oBAAoB,CAAC,GAAG,oBAAoB,CAAC;AACvE,IAAI,qBAAqB,CAAC,yBAAyB,CAAC,GAAG,yBAAyB,CAAC;AACjF,IAAI,qBAAqB,CAAC,sBAAsB,CAAC,GAAG,sBAAsB,CAAC;AAC3E,IAAI,qBAAqB,CAAC,+BAA+B,CAAC,GAAG,+BAA+B,CAAC;AAC7F,CAAC,EAAE,qBAAqB,KAAK,qBAAqB,GAAG,EAAE,CAAC,CAAC;;ACvBzD;AACA;AACA;AACO,IAAI,aAAa,CAAC;AACzB,CAAC,UAAU,aAAa,EAAE;AAC1B,IAAI,aAAa,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;AACrC,IAAI,aAAa,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;AACnC,IAAI,aAAa,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;AACjC,IAAI,aAAa,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;AACnC,IAAI,aAAa,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;AACrC,CAAC,EAAE,aAAa,KAAK,aAAa,GAAG,EAAE,CAAC,CAAC,CAAC;AAC1C,MAAM,aAAa,GAAG;AACtB,IAAI,CAAC,aAAa,CAAC,KAAK,GAAG,CAAC;AAC5B,IAAI,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC;AAC3B,IAAI,CAAC,aAAa,CAAC,GAAG,GAAG,CAAC;AAC1B,IAAI,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC;AAC3B,IAAI,CAAC,aAAa,CAAC,KAAK,GAAG,CAAC;AAC5B,CAAC,CAAC;AACK,MAAM,WAAW,CAAC;AACzB,IAAI,WAAW,CAAC,MAAM,EAAE,KAAK,GAAG,aAAa,CAAC,IAAI,EAAE;AACpD,QAAQ,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;AAC7B,QAAQ,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;AAC3B,KAAK;AACL,IAAI,WAAW,CAAC,KAAK,EAAE;AACvB,QAAQ,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,wBAAwB,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5F,QAAQ,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;AAC3B,KAAK;AACL,IAAI,SAAS,CAAC,KAAK,EAAE;AACrB,QAAQ,OAAO,aAAa,CAAC,KAAK,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACjE,KAAK;AACL,IAAI,QAAQ,CAAC,KAAK,EAAE;AACpB,QAAQ,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;AAC/B,QAAQ,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAC9D,QAAQ,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAClE,QAAQ,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAClE,QAAQ,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAC5E,QAAQ,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;AAC9F,KAAK;AACL,IAAI,KAAK,CAAC,GAAG,IAAI,EAAE,EAAE,IAAI,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC;AAC5D,QAAQ,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,EAAE;AACrE,IAAI,IAAI,CAAC,GAAG,IAAI,EAAE,EAAE,IAAI,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC;AAC1D,QAAQ,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,EAAE;AACnE,IAAI,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE,IAAI,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,GAAG,CAAC;AACxD,QAAQ,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,EAAE;AACjE,IAAI,IAAI,CAAC,GAAG,IAAI,EAAE,EAAE,IAAI,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC;AAC1D,QAAQ,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,EAAE;AACnE,IAAI,KAAK,CAAC,GAAG,IAAI,EAAE,EAAE,IAAI,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC;AAC5D,QAAQ,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,EAAE;AACrE,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK;AACrC,IAAI,OAAO;AACX,QAAQ,gBAAgB,CAAC,aAAa;AACtC,QAAQ,gBAAgB,CAAC,MAAM;AAC/B,QAAQ,gBAAgB,CAAC,cAAc;AACvC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AACzB,CAAC,CAAC;AACK,MAAM,2BAA2B,GAAG,CAAC,CAAC,KAAK;AAClD,IAAI,QAAQ,CAAC,CAAC,MAAM;AACpB,QAAQ,KAAK,gBAAgB,CAAC,aAAa,CAAC;AAC5C,QAAQ,KAAK,gBAAgB,CAAC,cAAc;AAC5C,YAAY,OAAO,CAAC,CAAC,aAAa,CAAC;AACnC,QAAQ,KAAK,gBAAgB,CAAC,MAAM;AACpC,YAAY,OAAO,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;AAC3D,QAAQ;AACR,YAAY,OAAO,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,CAAC;AACpE,YAAY,OAAO,EAAE,CAAC;AACtB,KAAK;AACL,CAAC,CAAC;AACF;AACO,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK;AACxC,IAAI,MAAM,sBAAsB,GAAG;AACnC,QAAQ,gBAAgB,CAAC,OAAO;AAChC,QAAQ,gBAAgB,CAAC,eAAe;AACxC,QAAQ,gBAAgB,CAAC,UAAU;AACnC,QAAQ,gBAAgB,CAAC,qBAAqB;AAC9C,QAAQ,gBAAgB,CAAC,kBAAkB;AAC3C,QAAQ,gBAAgB,CAAC,SAAS;AAClC,QAAQ,gBAAgB,CAAC,UAAU;AACnC,QAAQ,gBAAgB,CAAC,YAAY;AACrC,QAAQ,gBAAgB,CAAC,QAAQ;AACjC,QAAQ,gBAAgB,CAAC,QAAQ;AACjC,QAAQ,gBAAgB,CAAC,YAAY;AACrC,KAAK,CAAC;AACN,IAAI,OAAO,sBAAsB,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,gBAAgB,CAAC,MAAM,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC;AAC7G,CAAC,CAAC;AACF;AACO,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK;AAC3B,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;AAC/B,IAAI,OAAO,CAAC,CAAC,WAAW,EAAE,WAAW,EAAE,gBAAgB,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;AAC3E,SAAS,CAAC,CAAC,MAAM,KAAK,gBAAgB,CAAC,MAAM;AAC7C,aAAa,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,cAAc,MAAM,IAAI,IAAI,EAAE,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,MAAM,MAAM,IAAI,IAAI,EAAE,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,MAAM,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,cAAc,MAAM,IAAI,IAAI,EAAE,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,MAAM,MAAM,IAAI,IAAI,EAAE,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,cAAc,MAAM,IAAI,IAAI,EAAE,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,MAAM,MAAM,IAAI,IAAI,EAAE,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1Z,CAAC,CAAC;AAmBK,SAAS,iBAAiB,CAAC,GAAG,EAAE;AACvC,IAAI,IAAI,CAAC,GAAG;AACZ,QAAQ,OAAO,EAAE,CAAC;AAClB,IAAI,OAAO,CAAC,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3C,CAAC;AAMD;AACA;AACA;AACA;AACO,SAAS,OAAO,CAAC,IAAI,EAAE;AAC9B,IAAI,IAAI,CAAC,IAAI;AACb,QAAQ,OAAO,UAAU,CAAC;AAC1B,IAAI,OAAO,IAAI;AACf,SAAS,WAAW,EAAE;AACtB,SAAS,IAAI,EAAE;AACf,SAAS,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC;AACxC,SAAS,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;AAC5B,SAAS,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;AAC9B,SAAS,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAC3B;;ACvLyB,IAAI,WAAW,CAAC,WAAW;;ACFpD;AACA;AACA;AACO,IAAI,OAAO,CAAC;AACnB,CAAC,UAAU,OAAO,EAAE;AACpB,IAAI,OAAO,CAAC,YAAY,CAAC,GAAG,YAAY,CAAC;AACzC,IAAI,OAAO,CAAC,iBAAiB,CAAC,GAAG,iBAAiB,CAAC;AACnD,IAAI,OAAO,CAAC,kBAAkB,CAAC,GAAG,kBAAkB,CAAC;AACrD,IAAI,OAAO,CAAC,kBAAkB,CAAC,GAAG,kBAAkB,CAAC;AACrD,IAAI,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;AAC7B,IAAI,OAAO,CAAC,WAAW,CAAC,GAAG,WAAW,CAAC;AACvC,IAAI,OAAO,CAAC,YAAY,CAAC,GAAG,YAAY,CAAC;AACzC,IAAI,OAAO,CAAC,mBAAmB,CAAC,GAAG,mBAAmB,CAAC;AACvD,IAAI,OAAO,CAAC,kBAAkB,CAAC,GAAG,kBAAkB,CAAC;AACrD,IAAI,OAAO,CAAC,iBAAiB,CAAC,GAAG,iBAAiB,CAAC;AACnD,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC;AACjC,IAAI,OAAO,CAAC,eAAe,CAAC,GAAG,eAAe,CAAC;AAC/C,IAAI,OAAO,CAAC,aAAa,CAAC,GAAG,aAAa,CAAC;AAC3C,CAAC,EAAE,OAAO,KAAK,OAAO,GAAG,EAAE,CAAC,CAAC;;AClBtB,MAAM,iCAAiC,GAAG;AACjD,IAAI,gBAAgB,EAAE,GAAG;AACzB,IAAI,uBAAuB,EAAE,IAAI;AACjC,IAAI,2BAA2B,EAAE,KAAK;AACtC,IAAI,wBAAwB,EAAE,IAAI;AAClC;AACA,IAAI,gBAAgB,EAAE,GAAG;AACzB,IAAI,oBAAoB,EAAE,IAAI;AAC9B;AACA,IAAI,+BAA+B,EAAE,IAAI;AACzC,IAAI,kCAAkC,EAAE,IAAI;AAC5C,IAAI,8BAA8B,EAAE,KAAK;AACzC;AACA,IAAI,4BAA4B,EAAE,IAAI;AACtC,IAAI,4BAA4B,EAAE,GAAG;AACrC,IAAI,6BAA6B,EAAE,KAAK;AACxC,IAAI,uBAAuB,EAAE,KAAK;AAClC,IAAI,aAAa,EAAE,MAAM;AACzB,CAAC;;ACjBM,MAAM,yBAAyB,GAAG;AACzC;AACA,IAAI,MAAM,EAAE,EAAE;AACd,IAAI,WAAW,EAAE,0BAA0B;AAC3C,IAAI,WAAW,EAAE,0BAA0B;AAC3C,IAAI,OAAO,EAAE,SAAS;AACtB;AACA,IAAI,YAAY,EAAE,eAAe;AACjC,IAAI,UAAU,EAAE,SAAS;AACzB,IAAI,OAAO,EAAE,iBAAiB;AAC9B,IAAI,cAAc,EAAE,CAAC;AACrB;AACA,IAAI,wBAAwB,EAAE,IAAI;AAClC,IAAI,oBAAoB,EAAE,IAAI;AAC9B;AACA,IAAI,aAAa,EAAE,iCAAiC,CAAC,aAAa;AAClE;AACA,IAAI,iBAAiB,EAAE,IAAI;AAC3B,IAAI,UAAU,EAAE,OAAO;AACvB;AACA,IAAI,GAAG,iCAAiC;AACxC,CAAC;;ACtBD;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,sBAAsB,CAAC,IAAI,EAAE;AAC7C,IAAI,MAAM,OAAO,GAAG,IAAI,GAAG,EAAE,CAAC;AAC9B;AACA,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;AAC5D,QAAQ,OAAO,OAAO,CAAC;AACvB,KAAK;AACL;AACA;AACA;AACA,IAAI,MAAM,aAAa,GAAG,kDAAkD,CAAC;AAC7E;AACA,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,KAAK;AAC1B,QAAQ,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;AAC5C,YAAY,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,KAAK;AAClD,gBAAgB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AAC/C,oBAAoB,IAAI,KAAK,CAAC;AAC9B,oBAAoB,OAAO,CAAC,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE;AACzE,wBAAwB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;AAC/D,wBAAwB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAC7C,qBAAqB;AACrB;AACA,oBAAoB,aAAa,CAAC,SAAS,GAAG,CAAC,CAAC;AAChD,iBAAiB;AACjB,aAAa,CAAC,CAAC;AACf,SAAS;AACT,KAAK,CAAC,CAAC;AACP,IAAI,OAAO,OAAO,CAAC;AACnB,CAAC;AAUD;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,uBAAuB,CAAC,WAAW,EAAE;AAC9C,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;AACnD,IAAI,MAAM,QAAQ,GAAG,CAAC,CAAC,EAAE,GAAG,WAAW,CAAC,WAAW,MAAM,IAAI,IAAI,EAAE,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,YAAY,KAAK,EAAE,CAAC;AACjH,IAAI,MAAM,MAAM,GAAG,CAAC,CAAC,EAAE,GAAG,WAAW,CAAC,WAAW,MAAM,IAAI,IAAI,EAAE,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,eAAe,KAAK,EAAE,CAAC;AAClH,IAAI,MAAM,aAAa,GAAG,CAAC,CAAC,EAAE,GAAG,WAAW,CAAC,WAAW,MAAM,IAAI,IAAI,EAAE,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,cAAc,KAAK,IAAI,CAAC;AAC1H,IAAI,MAAM,mBAAmB,GAAG,CAAC,CAAC,EAAE,GAAG,WAAW,CAAC,WAAW,MAAM,IAAI,IAAI,EAAE,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,qBAAqB,KAAK,IAAI,CAAC;AACvI,IAAI,MAAM,QAAQ,GAAG,iBAAiB,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,aAAa,CAAC,CAAC,GAAG,iBAAiB,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;AACrI;AACA,IAAI,MAAM,eAAe,GAAG,WAAW,CAAC,iBAAiB,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AACtG,IAAI,MAAM,OAAO,GAAG,CAAC;AACrB,WAAW,EAAE,WAAW,CAAC,iBAAiB,CAAC,EAAE,WAAW,CAAC,UAAU,GAAG,CAAC,yBAAyB,EAAE,WAAW,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;AAClI,IAAI,QAAQ,WAAW,CAAC,MAAM;AAC9B,QAAQ,KAAK,gBAAgB,CAAC,KAAK,CAAC;AACpC,QAAQ,KAAK,gBAAgB,CAAC,cAAc,CAAC;AAC7C,QAAQ,KAAK,gBAAgB,CAAC,YAAY,CAAC;AAC3C,QAAQ,KAAK,gBAAgB,CAAC,OAAO,CAAC;AACtC,QAAQ,KAAK,gBAAgB,CAAC,SAAS,CAAC;AACxC,QAAQ,KAAK,gBAAgB,CAAC,UAAU,CAAC;AACzC,QAAQ,KAAK,gBAAgB,CAAC,eAAe,CAAC;AAC9C,QAAQ,KAAK,gBAAgB,CAAC,qBAAqB,CAAC;AACpD,QAAQ,KAAK,gBAAgB,CAAC,kBAAkB,CAAC;AACjD,QAAQ,KAAK,gBAAgB,CAAC,KAAK,CAAC;AACpC,QAAQ,KAAK,gBAAgB,CAAC,iBAAiB,CAAC;AAChD,QAAQ,KAAK,gBAAgB,CAAC,YAAY,CAAC;AAC3C,QAAQ,KAAK,gBAAgB,CAAC,SAAS,CAAC;AACxC,QAAQ,KAAK,gBAAgB,CAAC,cAAc,CAAC;AAC7C,QAAQ,KAAK,gBAAgB,CAAC,UAAU,CAAC;AACzC,QAAQ,KAAK,gBAAgB,CAAC,QAAQ,CAAC;AACvC,QAAQ,KAAK,gBAAgB,CAAC,YAAY,CAAC;AAC3C,QAAQ,KAAK,gBAAgB,CAAC,QAAQ;AACtC,YAAY,MAAM,IAAI,GAAG;AACzB,gBAAgB,CAAC,yBAAyB,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;AAChE,gBAAgB,IAAI,QAAQ,GAAG,CAAC,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;AAC9D,gBAAgB,IAAI,MAAM,GAAG,CAAC,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;AAClE,gBAAgB,IAAI,QAAQ,GAAG,CAAC,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;AACvE,gBAAgB,IAAI,aAAa,GAAG,CAAC,CAAC,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;AAC7F,gBAAgB,IAAI,mBAAmB,GAAG,CAAC,CAAC,qBAAqB,EAAE,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;AAC/G,gBAAgB,IAAI,WAAW,CAAC,UAAU,GAAG,CAAC,CAAC,aAAa,EAAE,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;AAC9F,gBAAgB,IAAI,CAAC,CAAC,EAAE,GAAG,WAAW,CAAC,aAAa,MAAM,IAAI,IAAI,EAAE,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,eAAe,IAAI,CAAC,CAAC,iBAAiB,EAAE,CAAC,EAAE,GAAG,WAAW,CAAC,aAAa,MAAM,IAAI,IAAI,EAAE,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;AACvO,gBAAgB,IAAI,CAAC,CAAC,EAAE,GAAG,WAAW,CAAC,aAAa,MAAM,IAAI,IAAI,EAAE,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC,EAAE,GAAG,WAAW,CAAC,aAAa,MAAM,IAAI,IAAI,EAAE,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;AAC/M;AACA,gBAAgB,IAAI,WAAW,CAAC,MAAM,KAAK,gBAAgB,CAAC,QAAQ,GAAG,CAAC,CAAC,sBAAsB,EAAE,CAAC,CAAC,EAAE,GAAG,WAAW,CAAC,UAAU,MAAM,IAAI,IAAI,EAAE,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,MAAM,KAAK,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,GAAG,WAAW,CAAC,UAAU,MAAM,IAAI,IAAI,EAAE,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,KAAK,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;AAC5S,aAAa,CAAC;AACd,YAAY,OAAO,CAAC,EAAE,OAAO,CAAC;AAC9B,yBAAyB,EAAE,eAAe,CAAC;AAC3C;AACA,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;AAC3C;AACA,WAAW,CAAC,CAAC;AACb,QAAQ,KAAK,gBAAgB,CAAC,aAAa;AAC3C,YAAY,MAAM,cAAc,GAAG,2BAA2B,CAAC,WAAW,CAAC,CAAC;AAC5E,YAAY,OAAO,CAAC,EAAE,OAAO,CAAC;AAC9B,yBAAyB,EAAE,eAAe,CAAC;AAC3C,gBAAgB,EAAE,cAAc,CAAC;AACjC,6BAA6B,EAAE,MAAM,CAAC;AACtC,8BAA8B,EAAE,QAAQ,CAAC;AACzC,2BAA2B,EAAE,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;AAC3D,iCAAiC,EAAE,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;AACvE,qBAAqB,EAAE,WAAW,CAAC,MAAM,CAAC;AAC1C,yBAAyB,EAAE,CAAC,EAAE,GAAG,WAAW,CAAC,UAAU,MAAM,IAAI,IAAI,EAAE,KAAK,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;AAC7F;AACA,iBAAiB,EAAE,cAAc,CAAC,KAAK,EAAE,cAAc,CAAC;AACxD,WAAW,CAAC,CAAC;AACb,QAAQ,KAAK,gBAAgB,CAAC,cAAc;AAC5C,YAAY,OAAO,yBAAyB,CAAC,WAAW,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC;AACpF,QAAQ;AACR,YAAY,OAAO,CAAC,qBAAqB,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AACnE,KAAK;AACL,CAAC;AACD,SAAS,qBAAqB,CAAC,WAAW,EAAE;AAC5C,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;AACnB,IAAI,MAAM,aAAa,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,WAAW,CAAC,cAAc,MAAM,IAAI,IAAI,EAAE,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,MAAM,MAAM,IAAI,IAAI,EAAE,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,MAAM,MAAM,IAAI,IAAI,EAAE,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AACrO,IAAI,MAAM,QAAQ,GAAG,iBAAiB,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AACzH;AACA,IAAI,MAAM,eAAe,GAAG,WAAW,CAAC,iBAAiB,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AACtG,IAAI,MAAM,OAAO,GAAG,CAAC;AACrB,WAAW,EAAE,WAAW,CAAC,iBAAiB,CAAC,EAAE,WAAW,CAAC,UAAU,GAAG,CAAC,yBAAyB,EAAE,WAAW,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;AAClI,IAAI,IAAI,WAAW,CAAC,MAAM,KAAK,gBAAgB,CAAC,aAAa,EAAE;AAC/D,QAAQ,MAAM,cAAc,GAAG,2BAA2B,CAAC,WAAW,CAAC,CAAC;AACxE,QAAQ,OAAO,CAAC,EAAE,OAAO,CAAC;AAC1B,uBAAuB,EAAE,eAAe,CAAC;AACzC,cAAc,EAAE,cAAc,CAAC,8BAA8B,EAAE,aAAa,CAAC,mBAAmB,EAAE,WAAW,CAAC,MAAM,CAAC;AACrH,eAAe,EAAE,cAAc,CAAC,KAAK,EAAE,cAAc,CAAC;AACtD,SAAS,CAAC,CAAC;AACX,KAAK;AACL,SAAS,IAAI,WAAW,CAAC,MAAM,KAAK,gBAAgB,CAAC,qBAAqB;AAC1E,QAAQ,WAAW,CAAC,MAAM,KAAK,gBAAgB,CAAC,kBAAkB,EAAE;AACpE,QAAQ,OAAO,CAAC,EAAE,OAAO,CAAC;AAC1B,uBAAuB,EAAE,eAAe,CAAC;AACzC,mCAAmC,EAAE,aAAa,CAAC,GAAG,EAAE,QAAQ,CAAC,YAAY,EAAE,WAAW,CAAC,MAAM,CAAC;AAClG,SAAS,CAAC,CAAC;AACX,KAAK;AACL,SAAS,IAAI,WAAW,CAAC,MAAM,KAAK,gBAAgB,CAAC,SAAS,EAAE;AAChE,QAAQ,OAAO,CAAC,EAAE,OAAO,CAAC;AAC1B,uBAAuB,EAAE,eAAe,CAAC;AACzC,mCAAmC,EAAE,WAAW,CAAC,iBAAiB,CAAC,GAAG,EAAE,QAAQ,CAAC,YAAY,EAAE,WAAW,CAAC,MAAM,CAAC;AAClH,SAAS,CAAC,CAAC;AACX,KAAK;AACL,SAAS,IAAI,WAAW,CAAC,MAAM,KAAK,gBAAgB,CAAC,MAAM,EAAE;AAC7D,QAAQ,MAAM,eAAe,GAAG,WAAW,CAAC,iBAAiB,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AACnF,QAAQ,MAAM,SAAS,GAAG,2BAA2B,CAAC,WAAW,CAAC,CAAC;AACnE;AACA,QAAQ,MAAM,YAAY,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;AAC7F,QAAQ,OAAO,CAAC,EAAE,OAAO,CAAC;AAC1B,yBAAyB,EAAE,eAAe,CAAC;AAC3C,gBAAgB,EAAE,SAAS,CAAC,4BAA4B,EAAE,eAAe,CAAC,GAAG,EAAE,YAAY,CAAC,EAAE,QAAQ,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC,GAAG,EAAE,CAAC;AAC9H,iBAAiB,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC;AAC9C,WAAW,CAAC,CAAC;AACb,KAAK;AACL,SAAS,IAAI,WAAW,CAAC,MAAM,KAAK,gBAAgB,CAAC,cAAc,EAAE;AACrE,QAAQ,OAAO,yBAAyB,CAAC,WAAW,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC;AAChF,KAAK;AACL,SAAS;AACT,QAAQ,OAAO,CAAC,EAAE,OAAO,CAAC;AAC1B,uBAAuB,EAAE,eAAe,CAAC;AACzC,QAAQ,EAAE,QAAQ,GAAG,CAAC,2BAA2B,EAAE,aAAa,CAAC,GAAG,EAAE,QAAQ,CAAC,YAAY,EAAE,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,2BAA2B,EAAE,aAAa,CAAC,mBAAmB,EAAE,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAClN,SAAS,CAAC,CAAC;AACX,KAAK;AACL,CAAC;AACD,SAAS,yBAAyB,CAAC,WAAW,EAAE,OAAO,EAAE,eAAe,EAAE;AAC1E,IAAI,IAAI,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,QAAQ,CAAC;AAC1G,IAAI,MAAM,aAAa,GAAG,2BAA2B,CAAC,WAAW,CAAC,CAAC;AACnE;AACA,IAAI,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,uBAAuB,EAAE,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;AACvF;AACA,IAAI,UAAU,GAAG,UAAU,CAAC,OAAO,EAAE,CAAC;AACtC;AACA,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC;AACpC,QAAQ,UAAU,GAAG,UAAU,GAAG,GAAG,CAAC;AACtC;AACA,IAAI,MAAM,YAAY,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,KAAK,GAAG,KAAK,CAAC,GAAG,IAAI,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACxH,IAAI,OAAO,CAAC,EAAE,OAAO,CAAC;AACtB,yBAAyB,EAAE,eAAe,CAAC;AAC3C,cAAc,EAAE,aAAa,CAAC;AAC9B;AACA,YAAY,EAAE,YAAY,CAAC;AAC3B;AACA;AACA;AACA;AACA,iBAAiB,EAAE,aAAa,CAAC,KAAK,EAAE,aAAa,CAAC;AACtD,WAAW,CAAC,CAAC;AACb,CAAC;AACD,SAAS,cAAc,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE;AACrD,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;AACvB,IAAI,MAAM,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;AAC5D,IAAI,MAAM,iBAAiB,GAAG,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,WAAW,KAAK,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;AAC5F,IAAI,MAAM,qBAAqB,GAAG,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,WAAW,KAAK,WAAW,CAAC,MAAM,KAAK,gBAAgB,CAAC,cAAc,CAAC,CAAC;AACrI;AACA,IAAI,MAAM,KAAK,GAAG,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,WAAW,KAAK;AAC5D,QAAQ,IAAI,IAAI,CAAC,WAAW,CAAC;AAC7B,YAAY,OAAO,qBAAqB,CAAC,WAAW,CAAC,CAAC;AACtD,QAAQ,OAAO,uBAAuB,CAAC,WAAW,CAAC,CAAC;AACpD,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAClB;AACA,IAAI,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAAE,CAAC;AAC1C,IAAI,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,WAAW,KAAK;AAClD,QAAQ,IAAI,cAAc,CAAC,WAAW,CAAC,EAAE;AACzC,YAAY,MAAM,OAAO,GAAG,2BAA2B,CAAC,WAAW,CAAC,CAAC;AACrE,YAAY,IAAI,OAAO,EAAE;AACzB,gBAAgB,mBAAmB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AACjD,aAAa;AACb,SAAS;AACT,KAAK,CAAC,CAAC;AACP;AACA,IAAI,MAAM,qBAAqB,GAAG,CAAC,KAAK,KAAK;AAC7C,QAAQ,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;AAC/C,YAAY,OAAO,EAAE,CAAC;AACtB;AACA,QAAQ,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AACjE,KAAK,CAAC;AACN;AACA,IAAI,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,QAAQ,CAAC,OAAO,CAAC,CAAC;AAC3F;AACA,IAAI,MAAM,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC;AAC/F;AACA,IAAI,MAAM,eAAe,GAAG,sBAAsB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AACjE,IAAI,MAAM,oBAAoB,GAAG,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,IAAI,EAAE,CAAC;AACpE;AACA,IAAI,MAAM,cAAc,GAAG,uBAAuB,GAAG,CAAC;AACtD;AACA,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK;AAChC;AACA,QAAQ,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,mBAAmB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACrH,QAAQ,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,GAAG,EAAE,qBAAqB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;AAClI,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AACvB;AACA,EAAE,CAAC,GAAG,EAAE,CAAC;AACT,IAAI,MAAM,gBAAgB,GAAG,iBAAiB,GAAG,CAAC;AAClD;AACA,mBAAmB,EAAE,OAAO,CAAC,YAAY,CAAC;AAC1C,0BAA0B,EAAE,QAAQ,CAAC,oBAAoB,CAAC;AAC1D,8BAA8B,EAAE,QAAQ,CAAC,UAAU,CAAC;AACpD,qBAAqB,EAAE,UAAU,CAAC;AAClC;AACA,oCAAoC,EAAE,CAAC,EAAE,GAAG,QAAQ,CAAC,4BAA4B,MAAM,IAAI,IAAI,EAAE,KAAK,KAAK,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AACzH,oCAAoC,EAAE,CAAC,EAAE,GAAG,QAAQ,CAAC,4BAA4B,MAAM,IAAI,IAAI,EAAE,KAAK,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC;AACxH,qCAAqC,EAAE,CAAC,EAAE,GAAG,QAAQ,CAAC,6BAA6B,MAAM,IAAI,IAAI,EAAE,KAAK,KAAK,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;AAC5H,+BAA+B,EAAE,CAAC,EAAE,GAAG,QAAQ,CAAC,uBAAuB,MAAM,IAAI,IAAI,EAAE,KAAK,KAAK,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;AAChH;AACA,KAAK,CAAC,GAAG,EAAE,CAAC;AACZ,IAAI,OAAO,CAAC;AACZ;AACA;AACA,eAAe,EAAE,OAAO,CAAC,YAAY,CAAC;AACtC,uBAAuB,EAAE,IAAI,IAAI,EAAE,CAAC,kBAAkB,EAAE,CAAC,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC,kBAAkB,EAAE,CAAC;AAC5F;AACA;AACA,sFAAsF,EAAE,UAAU,GAAG,SAAS,GAAG,EAAE,CAAC;AACpH,wDAAwD,EAAE,UAAU,GAAG,qHAAqH,GAAG,EAAE,CAAC;AAClM;AACA;AACA;AACA;AACA,2GAA2G,EAAE,qBAAqB,GAAG,CAAC;AACtI;AACA;AACA;AACA,2BAA2B,CAAC,GAAG,EAAE,CAAC,EAAE,UAAU,IAAI,CAAC,qBAAqB,GAAG,CAAC;AAC5E;AACA;AACA,2BAA2B,CAAC,GAAG,EAAE,CAAC;AAClC;AACA,EAAE,UAAU,GAAG,CAAC;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,EAAE,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;AAC3E;AACA;AACA;AACA;AACA;AACA,EAAE,CAAC,GAAG,EAAE,CAAC;AACT;AACA,EAAE,EAAE,cAAc,CAAC;AACnB,EAAE,EAAE,gBAAgB,CAAC;AACrB;AACA,8BAA8B,EAAE,QAAQ,CAAC,oBAAoB,CAAC;AAC9D,kCAAkC,EAAE,QAAQ,CAAC,UAAU,CAAC;AACxD;AACA,wCAAwC,EAAE,QAAQ,CAAC,4BAA4B,CAAC;AAChF,wCAAwC,EAAE,QAAQ,CAAC,4BAA4B,CAAC;AAChF,yCAAyC,EAAE,QAAQ,CAAC,6BAA6B,CAAC;AAClF,mCAAmC,EAAE,QAAQ,CAAC,uBAAuB,CAAC;AACtE,4BAA4B,EAAE,QAAQ,CAAC,gBAAgB,CAAC;AACxD,mCAAmC,EAAE,QAAQ,CAAC,uBAAuB,CAAC;AACtE,uCAAuC,EAAE,QAAQ,CAAC,2BAA2B,CAAC;AAC9E,oCAAoC,EAAE,QAAQ,CAAC,wBAAwB,CAAC;AACxE;AACA;AACA;AACA,iBAAiB,EAAE,OAAO,CAAC,YAAY,CAAC;AACxC;AACA;AACA;AACA;AACA,0CAA0C,EAAE,QAAQ,CAAC,KAAK,CAAC,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC;AACvF;AACA;AACA;AACA;AACA,QAAQ,EAAE,iBAAiB,GAAG,CAAC,uBAAuB,CAAC,GAAG,EAAE,CAAC;AAC7D;AACA,QAAQ,EAAE,KAAK,CAAC;AAChB;AACA;AACA;AACA,EAAE,CAAC,CAAC;AACJ,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,YAAY,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE;AAC1D,IAAI,OAAO,cAAc,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;AACvD,CAAC;AAsCD;AACA;AACA;AACO,SAAS,mBAAmB,CAAC,OAAO,EAAE;AAC7C,IAAI,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,KAAK,EAAE,UAAU,GAAG,qBAAqB,EAAE,GAAG,OAAO,CAAC;AACrF,IAAI,OAAO,CAAC;AACZ,WAAW,EAAE,IAAI,CAAC;AAClB;AACA;AACA;AACA;AACA,aAAa,EAAE,UAAU,CAAC;AAC1B;AACA;AACA;AACA,qCAAqC,EAAE,UAAU,GAAG,2BAA2B,GAAG,EAAE,CAAC;AACrF;AACA,CAAC,CAAC,CAAC;AACH,CAAC;AACD;AACA;AACA;AACO,SAAS,wBAAwB,CAAC,eAAe,GAAG,IAAI,EAAE,KAAK,EAAE;AACxE,IAAI,MAAM,SAAS,GAAG;AACtB,QAAQ,CAAC,MAAM,CAAC;AAChB,QAAQ,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AACnC,KAAK,CAAC;AACN;AACA,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE;AAC7B,QAAQ,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;AACnG,KAAK;AACL,IAAI,IAAI,eAAe,EAAE;AACzB,QAAQ,SAAS,CAAC,IAAI,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC;AAChD,KAAK;AACL;AACA,IAAI,MAAM,eAAe,GAAG,KAAK,KAAK,SAAS,GAAG,CAAC,iCAAiC,EAAE,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC;AACrG,IAAI,OAAO,CAAC;AACZ;AACA;AACA;AACA;AACA,kBAAkB,EAAE,eAAe,CAAC;AACpC,+DAA+D,EAAE,eAAe,GAAG,qCAAqC,GAAG,EAAE,CAAC;AAC9H,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,CAAC;AACF,CAAC;AACD;AACA;AACA;AACA;AACA;AACO,SAAS,qBAAqB,GAAG;AACxC;AACA;AACA,IAAI,OAAO,CAAC;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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"}
|
|
1
|
+
{"version":3,"file":"cli.js","sources":["../../probo-shared/dist/Interaction.js","../../probo-shared/dist/PlaywrightAction.js","../../probo-shared/dist/element-utils.js","../../probo-shared/dist/MessageType.js","../../probo-shared/dist/utils.js","../../probo-shared/dist/api-client.js","../../probo-shared/dist/AIModel.js","../../probo-shared/dist/PlaywrightTimeoutConfig.js","../../probo-shared/dist/RecorderSettings.js","../../probo-shared/dist/codegen.js","../src/codegen-api.ts","../src/test-suite-runner.ts","../src/cli.ts"],"sourcesContent":["export var ApplyAIStatus;\n(function (ApplyAIStatus) {\n ApplyAIStatus[\"PREPARE_START\"] = \"PREPARE_START\";\n ApplyAIStatus[\"PREPARE_SUCCESS\"] = \"PREPARE_SUCCESS\";\n ApplyAIStatus[\"PREPARE_ERROR\"] = \"PREPARE_ERROR\";\n ApplyAIStatus[\"SEND_START\"] = \"SEND_START\";\n ApplyAIStatus[\"SEND_SUCCESS\"] = \"SEND_SUCCESS\";\n ApplyAIStatus[\"SEND_ERROR\"] = \"SEND_ERROR\";\n ApplyAIStatus[\"APPLY_AI_ERROR\"] = \"APPLY_AI_ERROR\";\n ApplyAIStatus[\"APPLY_AI_CANCELLED\"] = \"APPLY_AI_CANCELLED\";\n ApplyAIStatus[\"SUMMARY_COMPLETED\"] = \"SUMMARY_COMPLETED\";\n ApplyAIStatus[\"SUMMARY_ERROR\"] = \"SUMMARY_ERROR\";\n})(ApplyAIStatus || (ApplyAIStatus = {}));\nexport var ReplayStatus;\n(function (ReplayStatus) {\n ReplayStatus[\"REPLAY_START\"] = \"REPLAY_START\";\n ReplayStatus[\"REPLAY_SUCCESS\"] = \"REPLAY_SUCCESS\";\n ReplayStatus[\"REPLAY_ERROR\"] = \"REPLAY_ERROR\";\n ReplayStatus[\"REPLAY_CANCELLED\"] = \"REPLAY_CANCELLED\";\n})(ReplayStatus || (ReplayStatus = {}));\n//# sourceMappingURL=Interaction.js.map","// Action constants\nexport var PlaywrightAction;\n(function (PlaywrightAction) {\n PlaywrightAction[\"VISIT_BASE_URL\"] = \"VISIT_BASE_URL\";\n PlaywrightAction[\"VISIT_URL\"] = \"VISIT_URL\";\n PlaywrightAction[\"CLICK\"] = \"CLICK\";\n PlaywrightAction[\"FILL_IN\"] = \"FILL_IN\";\n PlaywrightAction[\"SELECT_DROPDOWN\"] = \"SELECT_DROPDOWN\";\n PlaywrightAction[\"SELECT_MULTIPLE_DROPDOWN\"] = \"SELECT_MULTIPLE_DROPDOWN\";\n PlaywrightAction[\"CHECK_CHECKBOX\"] = \"CHECK_CHECKBOX\";\n PlaywrightAction[\"SELECT_RADIO\"] = \"SELECT_RADIO\";\n PlaywrightAction[\"TOGGLE_SWITCH\"] = \"TOGGLE_SWITCH\";\n PlaywrightAction[\"SET_SLIDER\"] = \"SET_SLIDER\";\n PlaywrightAction[\"TYPE_KEYS\"] = \"TYPE_KEYS\";\n PlaywrightAction[\"HOVER\"] = \"HOVER\";\n PlaywrightAction[\"ASSERT_EXACT_VALUE\"] = \"ASSERT_EXACT_VALUE\";\n PlaywrightAction[\"ASSERT_CONTAINS_VALUE\"] = \"ASSERT_CONTAINS_VALUE\";\n PlaywrightAction[\"ASSERT_URL\"] = \"ASSERT_URL\";\n PlaywrightAction[\"SCROLL_TO_ELEMENT\"] = \"SCROLL_TO_ELEMENT\";\n PlaywrightAction[\"EXTRACT_VALUE\"] = \"EXTRACT_VALUE\";\n PlaywrightAction[\"ASK_AI\"] = \"ASK_AI\";\n PlaywrightAction[\"EXECUTE_SCRIPT\"] = \"EXECUTE_SCRIPT\";\n PlaywrightAction[\"UPLOAD_FILES\"] = \"UPLOAD_FILES\";\n PlaywrightAction[\"WAIT_FOR\"] = \"WAIT_FOR\";\n PlaywrightAction[\"WAIT_FOR_OTP\"] = \"WAIT_FOR_OTP\";\n PlaywrightAction[\"GEN_TOTP\"] = \"GEN_TOTP\";\n // Sequence marker actions (not real interactions, used only for grouping)\n PlaywrightAction[\"SEQUENCE_START\"] = \"SEQUENCE_START\";\n PlaywrightAction[\"SEQUENCE_END\"] = \"SEQUENCE_END\";\n})(PlaywrightAction || (PlaywrightAction = {}));\n//# sourceMappingURL=PlaywrightAction.js.map","import { ElementTag } from \"./ElementTag.js\";\nimport { PlaywrightAction } from \"./PlaywrightAction.js\";\n/**\n * Resolves an action type to the corresponding ElementTag\n *\n * @param action The action type (CLICK, FILL_IN, SELECT_DROPDOWN)\n * @returns The corresponding ElementTag\n */\nexport function resolveElementTag(action) {\n switch (action) {\n case PlaywrightAction.CLICK:\n return [ElementTag.CLICKABLE, ElementTag.FILLABLE];\n case PlaywrightAction.FILL_IN:\n return [ElementTag.FILLABLE];\n case PlaywrightAction.SELECT_DROPDOWN:\n return [ElementTag.SELECTABLE];\n case PlaywrightAction.HOVER:\n return [ElementTag.CLICKABLE, ElementTag.FILLABLE, ElementTag.NON_INTERACTIVE_ELEMENT];\n case PlaywrightAction.ASSERT_EXACT_VALUE:\n case PlaywrightAction.ASSERT_CONTAINS_VALUE:\n case PlaywrightAction.EXTRACT_VALUE:\n case PlaywrightAction.WAIT_FOR:\n return [ElementTag.CLICKABLE, ElementTag.FILLABLE, ElementTag.NON_INTERACTIVE_ELEMENT];\n case PlaywrightAction.WAIT_FOR_OTP:\n case PlaywrightAction.GEN_TOTP:\n return [ElementTag.FILLABLE];\n default:\n console.error(`Unknown action: ${action}`);\n throw new Error(`Unknown action: ${action}`);\n }\n}\nexport function getElementText(element) {\n var _a;\n return element.textContent || element.innerText || element.value || ((_a = element.querySelector('input')) === null || _a === void 0 ? void 0 : _a.value) || '';\n}\n/**\n * Checks if any string in the array matches the given regular expression pattern.\n *\n * @param array - Array of strings to test.\n * @param pattern - Regular expression to test against each string.\n * @returns true if at least one string matches the pattern, false otherwise.\n */\nfunction testArray(array, pattern) {\n return array.some(item => pattern.test(item));\n}\n/**\n * Determines if an element is fillable (can accept text input)\n *\n * @param element The DOM element to check\n * @returns boolean indicating if the element is fillable\n */\nexport function isFillableElement(element) {\n var _a;\n if (!element)\n return false;\n // Check if it's an input element\n if (element.tagName === 'INPUT') {\n const inputType = (_a = element.type) === null || _a === void 0 ? void 0 : _a.toLowerCase();\n const isOTPInput = element.getAttribute('data-input-otp') === 'true' ||\n element.getAttribute('autocomplete') === 'one-time-code';\n // if it's an OTP input, don't consider it fillable as it's handled by OTP logic\n if (isOTPInput)\n return false;\n // Include text, password, email, number, tel, url, search, date, datetime-local, month, week, time\n const fillableTypes = [\n 'text', 'password', 'email', 'number', 'tel', 'url', 'search',\n 'date', 'datetime-local', 'month', 'week', 'time'\n ];\n return fillableTypes.includes(inputType);\n }\n // Check if it's a textarea\n if (element.tagName === 'TEXTAREA') {\n return true;\n }\n // Check if it's a contenteditable element\n if (element.getAttribute('contenteditable') === 'true') {\n return true;\n }\n return false;\n}\n/**\n * Determines if an element is a selectable dropdown element\n *\n * @param element The DOM element to check\n * @returns boolean indicating if the element is a select element\n */\nexport function isSelectableElement(element) {\n return element && element.tagName === 'SELECT';\n}\n/**\n * Determines if an element is a non-interactive element (not clickable, fillable, or selectable)\n *\n * @param element The DOM element to check\n * @returns boolean indicating if the element is non-interactive\n */\nexport function isSliderElement(element) {\n if (!element)\n return false;\n // check for <input type=\"range\">\n if (element.tagName === 'INPUT' && element.getAttribute('type') === 'range')\n return true;\n // check for role and additional attributes\n const sliderAttributes = ['aria-valuenow', 'aria-valuemin', 'aria-valuemax'];\n if (element.getAttribute('role') === 'slider' || sliderAttributes.some(attr => element.hasAttribute(attr)))\n return true;\n // check for class names\n const classNames = Array.from(element.classList);\n const sliderClassPattern = /^MuiSlider|mat-slider|mdl-slider|ui-slider|carousel/;\n if (testArray(classNames, sliderClassPattern))\n return true;\n return false;\n}\n/**\n * Determines if an element is an <input type=\"file\"> element.\n *\n * @param element The DOM element to check\n * @returns boolean indicating if the element is an input file element\n */\nexport function isInputFileElement(element) {\n return element && element.tagName === 'INPUT' && element.getAttribute('type') === 'file';\n}\n/**\n * Determines if an element is clickable\n *\n * @param element The DOM element to check\n * @returns boolean indicating if the element is fillable\n */\nexport function isClickableElement(element) {\n if (!element)\n return false;\n let depth = 0;\n while (depth < 5 && element && element.nodeType === Node.ELEMENT_NODE) {\n if (isClickableElementHelper(element) === IsClickable.YES)\n return true;\n if (isClickableElementHelper(element) === IsClickable.NO)\n return false;\n // if maybe, continue searching up to 5 levels up the DOM tree\n element = element.parentNode;\n depth++;\n }\n return false;\n}\n// clickable element detection result\nvar IsClickable;\n(function (IsClickable) {\n IsClickable[\"YES\"] = \"YES\";\n IsClickable[\"NO\"] = \"NO\";\n IsClickable[\"MAYBE\"] = \"MAYBE\";\n})(IsClickable || (IsClickable = {}));\nfunction isClickableElementHelper(element) {\n var _a, _b;\n if (!element)\n return IsClickable.NO;\n //check for tag name\n const tagName = element.tagName.toLowerCase();\n const clickableTags = [\n 'a', 'button',\n ];\n if (clickableTags.includes(tagName))\n return IsClickable.YES;\n //check for clickable <input>\n const inputType = (_a = element.type) === null || _a === void 0 ? void 0 : _a.toLowerCase();\n const clickableTypes = [\n 'button', 'submit', 'reset', 'checkbox', 'radio',\n ];\n const ariaAutocompleteValues = [\n 'list', 'both',\n ];\n if (tagName === 'input') {\n if (clickableTypes.includes(inputType) || ariaAutocompleteValues.includes((_b = element.getAttribute('aria-autocomplete')) !== null && _b !== void 0 ? _b : ''))\n return IsClickable.YES;\n if (['date', 'number', 'range'].includes(inputType))\n return IsClickable.NO; //don't record the click as a change event will be generated for elements that generate an input change event\n }\n // check for cursor type\n const style = window.getComputedStyle(element);\n if (style.cursor === 'pointer')\n return IsClickable.YES;\n // check for attributes\n const clickableRoles = [\n 'button', 'combobox', 'listbox', 'dropdown', 'option', 'menu', 'menuitem',\n 'navigation', 'checkbox', 'switch', 'toggle', 'slider', 'textbox', 'listitem',\n 'presentation',\n ];\n const ariaPopupValues = [\n 'true', 'listbox', 'menu',\n ];\n if (element.hasAttribute('onclick') ||\n clickableRoles.includes(element.getAttribute('role') || '') ||\n ariaPopupValues.includes(element.getAttribute('aria-haspopup') || ''))\n return IsClickable.YES;\n // check for tabindex (means element is focusable and therefore clickable)\n if (parseInt(element.getAttribute('tabindex') || '-1') >= 0)\n return IsClickable.YES;\n // extract class names\n const classNames = Array.from(element.classList);\n // check for checkbox/radio-like class name - TODO: check if can be removed\n const checkboxPattern = /checkbox|switch|toggle|slider/i;\n if (testArray(classNames, checkboxPattern))\n return IsClickable.YES;\n // check for Material UI class names\n const muiClickableClassPattern = /MuiButton|MuiIconButton|MuiChip|MuiMenuItem|MuiListItem|MuiInputBase|MuiOutlinedInput|MuiSelect|MuiAutocomplete|MuiToggleButton|MuiBackdrop-root|MuiBackdrop-invisible/;\n if (testArray(classNames, muiClickableClassPattern))\n return IsClickable.YES;\n // check for SalesForce class names\n const sfClassPattern = /slds-button|slds-dropdown|slds-combobox|slds-picklist|slds-tabs|slds-pill|slds-action|slds-row-action|slds-context-bar|slds-input|slds-rich-text-area|slds-radio|slds-checkbox|slds-toggle|slds-link|slds-accordion|slds-tree/;\n if (testArray(classNames, sfClassPattern))\n return IsClickable.YES;\n // check for chart dots\n const chartClickableClassPattern = /recharts-dot/;\n if (testArray(classNames, chartClickableClassPattern))\n return IsClickable.YES;\n // check for React component classes\n const reactClickableClassPattern = /react-select|ant-select|rc-select|react-dropdown|react-autocomplete|react-datepicker|react-modal|react-tooltip|react-popover|react-menu|react-tabs|react-accordion|react-collapse|react-toggle|react-switch|react-checkbox|react-radio|react-button|react-link|react-card|react-list-item|react-menu-item|react-option|react-tab|react-panel|react-drawer|react-sidebar|react-nav|react-breadcrumb|react-pagination|react-stepper|react-wizard|react-carousel|react-slider|react-range|react-progress|react-badge|react-chip|react-tag|react-avatar|react-icon|react-fab|react-speed-dial|react-floating|react-sticky|react-affix|react-backdrop|react-overlay|react-portal|react-transition|react-animate|react-spring|react-framer|react-gesture|react-drag|react-drop|react-sortable|react-resizable|react-split|react-grid|react-table|react-datagrid|react-tree|react-treeview|react-file|react-upload|react-cropper|react-image|react-gallery|react-lightbox|react-player|react-video|react-audio|react-chart|react-graph|react-diagram|react-flow|react-d3|react-plotly|react-vega|react-vis|react-nivo|react-recharts|react-victory|react-echarts|react-highcharts|react-google-charts|react-fusioncharts|react-apexcharts|react-chartjs|react-chartkick|react-sparklines|react-trend|react-smooth|react-animated|react-lottie|react-spring|react-framer-motion|react-pose|react-motion|react-transition-group|react-router|react-navigation/i;\n if (testArray(classNames, reactClickableClassPattern))\n return IsClickable.YES;\n //check for cloudinary class names\n const cloudinaryClickableClassPattern = /cld-combobox|cld-upload-button|cld-controls|cld-player|cld-tab|cld-menu-item|cld-close|cld-play|cld-pause|cld-fullscreen|cld-browse|cld-cancel|cld-retry/;\n if (testArray(classNames, cloudinaryClickableClassPattern))\n return IsClickable.YES;\n return IsClickable.MAYBE;\n}\nexport function isTextInputElement(element) {\n return (element.tagName === 'INPUT' && element.getAttribute('type') !== 'checkbox' && element.getAttribute('type') !== 'radio') ||\n element.tagName === 'TEXTAREA' ||\n element.getAttribute('contenteditable') === 'true' ||\n element.getAttribute('role') === 'textbox';\n}\nexport function getParentNode(element) {\n if (!element || element.nodeType !== Node.ELEMENT_NODE)\n return null;\n let parent = null;\n // SF is using slots and shadow DOM heavily\n // However, there might be slots in the light DOM which shouldn't be traversed\n if (element.assignedSlot && element.getRootNode() instanceof ShadowRoot)\n parent = element.assignedSlot;\n else\n parent = element.parentNode;\n // Check if we're at a shadow root\n if (parent && parent.nodeType !== Node.ELEMENT_NODE && parent.getRootNode() instanceof ShadowRoot)\n parent = parent.getRootNode().host;\n return parent;\n}\nexport function getElementDepth(element) {\n let depth = 0;\n let currentElement = element;\n while ((currentElement === null || currentElement === void 0 ? void 0 : currentElement.nodeType) === Node.ELEMENT_NODE) {\n depth++;\n currentElement = getParentNode(currentElement);\n }\n return depth;\n}\n//# sourceMappingURL=element-utils.js.map","// WebSocketsMessageType enum for WebSocket and event message types shared across the app\nexport var WebSocketsMessageType;\n(function (WebSocketsMessageType) {\n WebSocketsMessageType[\"INTERACTION_APPLY_AI_PREPARE_START\"] = \"INTERACTION_APPLY_AI_PREPARE_START\";\n WebSocketsMessageType[\"INTERACTION_APPLY_AI_PREPARE_SUCCESS\"] = \"INTERACTION_APPLY_AI_PREPARE_SUCCESS\";\n WebSocketsMessageType[\"INTERACTION_APPLY_AI_PREPARE_ERROR\"] = \"INTERACTION_APPLY_AI_PREPARE_ERROR\";\n WebSocketsMessageType[\"INTERACTION_APPLY_AI_SEND_TO_LLM_START\"] = \"INTERACTION_APPLY_AI_SEND_TO_LLM_START\";\n WebSocketsMessageType[\"INTERACTION_APPLY_AI_SEND_TO_LLM_SUCCESS\"] = \"INTERACTION_APPLY_AI_SEND_TO_LLM_SUCCESS\";\n WebSocketsMessageType[\"INTERACTION_APPLY_AI_SEND_TO_LLM_ERROR\"] = \"INTERACTION_APPLY_AI_SEND_TO_LLM_ERROR\";\n WebSocketsMessageType[\"INTERACTION_REPLAY_START\"] = \"INTERACTION_REPLAY_START\";\n WebSocketsMessageType[\"INTERACTION_REPLAY_SUCCESS\"] = \"INTERACTION_REPLAY_SUCCESS\";\n WebSocketsMessageType[\"INTERACTION_REPLAY_ERROR\"] = \"INTERACTION_REPLAY_ERROR\";\n WebSocketsMessageType[\"INTERACTION_REPLAY_CANCELLED\"] = \"INTERACTION_REPLAY_CANCELLED\";\n WebSocketsMessageType[\"INTERACTION_APPLY_AI_CANCELLED\"] = \"INTERACTION_APPLY_AI_CANCELLED\";\n WebSocketsMessageType[\"INTERACTION_APPLY_AI_ERROR\"] = \"INTERACTION_APPLY_AI_ERROR\";\n WebSocketsMessageType[\"INTERACTION_STEP_CREATED\"] = \"INTERACTION_STEP_CREATED\";\n WebSocketsMessageType[\"INTERACTION_APPLY_AI_SUMMARY_COMPLETED\"] = \"INTERACTION_APPLY_AI_SUMMARY_COMPLETED\";\n WebSocketsMessageType[\"INTERACTION_APPLY_AI_SUMMARY_ERROR\"] = \"INTERACTION_APPLY_AI_SUMMARY_ERROR\";\n WebSocketsMessageType[\"OTP_RETRIEVED\"] = \"OTP_RETRIEVED\";\n WebSocketsMessageType[\"TEST_SUITE_RUN_START\"] = \"TEST_SUITE_RUN_START\";\n WebSocketsMessageType[\"TEST_SUITE_RUN_LOG\"] = \"TEST_SUITE_RUN_LOG\";\n WebSocketsMessageType[\"TEST_SUITE_RUN_COMPLETE\"] = \"TEST_SUITE_RUN_COMPLETE\";\n WebSocketsMessageType[\"TEST_SUITE_RUN_ERROR\"] = \"TEST_SUITE_RUN_ERROR\";\n WebSocketsMessageType[\"TEST_SUITE_RUN_REPORTER_EVENT\"] = \"TEST_SUITE_RUN_REPORTER_EVENT\";\n})(WebSocketsMessageType || (WebSocketsMessageType = {}));\n//# sourceMappingURL=MessageType.js.map","import { PlaywrightAction } from './PlaywrightAction.js';\n/**\n * Logging levels for Probo\n */\nexport var ProboLogLevel;\n(function (ProboLogLevel) {\n ProboLogLevel[\"DEBUG\"] = \"DEBUG\";\n ProboLogLevel[\"INFO\"] = \"INFO\";\n ProboLogLevel[\"LOG\"] = \"LOG\";\n ProboLogLevel[\"WARN\"] = \"WARN\";\n ProboLogLevel[\"ERROR\"] = \"ERROR\";\n})(ProboLogLevel || (ProboLogLevel = {}));\nconst logLevelOrder = {\n [ProboLogLevel.DEBUG]: 0,\n [ProboLogLevel.INFO]: 1,\n [ProboLogLevel.LOG]: 2,\n [ProboLogLevel.WARN]: 3,\n [ProboLogLevel.ERROR]: 4,\n};\nexport class ProboLogger {\n constructor(prefix, level = ProboLogLevel.INFO) {\n this.prefix = prefix;\n this.level = level;\n }\n setLogLevel(level) {\n console.log(`[${this.prefix}] Setting log level to: ${level} (was: ${this.level})`);\n this.level = level;\n }\n shouldLog(level) {\n return logLevelOrder[level] >= logLevelOrder[this.level];\n }\n preamble(level) {\n const now = new Date();\n const hours = String(now.getHours()).padStart(2, '0');\n const minutes = String(now.getMinutes()).padStart(2, '0');\n const seconds = String(now.getSeconds()).padStart(2, '0');\n const milliseconds = String(now.getMilliseconds()).padStart(3, '0');\n return `[${hours}:${minutes}:${seconds}.${milliseconds}] [${this.prefix}] [${level}]`;\n }\n debug(...args) { if (this.shouldLog(ProboLogLevel.DEBUG))\n console.debug(this.preamble(ProboLogLevel.DEBUG), ...args); }\n info(...args) { if (this.shouldLog(ProboLogLevel.INFO))\n console.info(this.preamble(ProboLogLevel.INFO), ...args); }\n log(...args) { if (this.shouldLog(ProboLogLevel.LOG))\n console.log(this.preamble(ProboLogLevel.LOG), ...args); }\n warn(...args) { if (this.shouldLog(ProboLogLevel.WARN))\n console.warn(this.preamble(ProboLogLevel.WARN), ...args); }\n error(...args) { if (this.shouldLog(ProboLogLevel.ERROR))\n console.error(this.preamble(ProboLogLevel.ERROR), ...args); }\n}\n// Element cleaner logging\n// const elementLogger = new ProboLogger('element-cleaner');\n/**\n * Cleans and returns a minimal element info structure.\n */\n//TODO: is this needed?\n/* export function cleanupElementInfo(elementInfo: ElementInfo): CleanElementInfo {\n elementLogger.debug(\n `Cleaning up element info for ${elementInfo.tag} at index ${elementInfo.index}`\n );\n const depth = elementInfo.depth ?? elementInfo.getDepth();\n const cleanEl = {\n index: elementInfo.index,\n tag: elementInfo.tag,\n type: elementInfo.type,\n text: elementInfo.text,\n html: elementInfo.html,\n xpath: elementInfo.xpath,\n css_selector: elementInfo.css_selector,\n iframe_selector: elementInfo.iframe_selector,\n bounding_box: elementInfo.bounding_box,\n depth\n };\n elementLogger.debug(`Cleaned element: ${JSON.stringify(cleanEl)}`);\n return cleanEl;\n} */\n/**\n * Cleans highlighted elements in an instruction payload.\n */\n/* export function cleanupInstructionElements(instruction: any): any {\n if (!instruction?.result?.highlighted_elements) {\n elementLogger.debug('No highlighted elements to clean');\n return instruction;\n }\n elementLogger.debug(\n `Cleaning ${instruction.result.highlighted_elements.length} highlighted elements`\n );\n const cleaned = {\n ...instruction,\n result: {\n ...instruction.result,\n highlighted_elements: instruction.result.highlighted_elements.map(\n (el: ElementInfo) => cleanupElementInfo(el)\n )\n }\n };\n elementLogger.debug('Instruction cleaning completed');\n return cleaned;\n} */\n// Determine whether an interaction can return a value\nexport const hasReturnValue = (i) => {\n return [\n PlaywrightAction.EXTRACT_VALUE,\n PlaywrightAction.ASK_AI,\n PlaywrightAction.EXECUTE_SCRIPT\n ].includes(i.action);\n};\nexport const getReturnValueParameterName = (i) => {\n switch (i.action) {\n case PlaywrightAction.EXTRACT_VALUE:\n case PlaywrightAction.EXECUTE_SCRIPT:\n return i.parameterName;\n case PlaywrightAction.ASK_AI:\n return i.parameterName.replace(/^assert_/, '');\n default:\n console.error(`Action ${i.action} has no return value`);\n return '';\n }\n};\n// Determine whether an interaction can be parameterized\nexport const isParameterizable = (i) => {\n const parameterizableActions = [\n PlaywrightAction.FILL_IN,\n PlaywrightAction.SELECT_DROPDOWN,\n PlaywrightAction.SET_SLIDER,\n PlaywrightAction.ASSERT_CONTAINS_VALUE,\n PlaywrightAction.ASSERT_EXACT_VALUE,\n PlaywrightAction.VISIT_URL,\n PlaywrightAction.ASSERT_URL,\n PlaywrightAction.UPLOAD_FILES,\n PlaywrightAction.WAIT_FOR,\n PlaywrightAction.GEN_TOTP,\n PlaywrightAction.WAIT_FOR_OTP\n ];\n return parameterizableActions.includes(i.action) || (i.action === PlaywrightAction.ASK_AI && i.argument);\n};\n// Determine whether an interaction is AI-related\nexport const isAI = (i) => {\n var _a, _b, _c, _d, _e, _f;\n return !['TYPE_KEYS', 'VISIT_URL', 'EXECUTE_SCRIPT'].includes(i.action) &&\n (i.action === PlaywrightAction.ASK_AI ||\n (((_b = (_a = i.serverResponse) === null || _a === void 0 ? void 0 : _a.result) === null || _b === void 0 ? void 0 : _b.prompt) && (((_d = (_c = i.serverResponse) === null || _c === void 0 ? void 0 : _c.result) === null || _d === void 0 ? void 0 : _d.error) === \"\" || !((_f = (_e = i.serverResponse) === null || _e === void 0 ? void 0 : _e.result) === null || _f === void 0 ? void 0 : _f.error))));\n};\n// Determine whether an interaction is fortified (doesn't need AI processing)\nexport const isFortifiedInteraction = (i) => {\n return [\n PlaywrightAction.VISIT_URL,\n PlaywrightAction.ASSERT_URL,\n PlaywrightAction.TYPE_KEYS,\n PlaywrightAction.EXECUTE_SCRIPT,\n PlaywrightAction.ASK_AI\n ].includes(i.action);\n};\n/**\n * Check if an interaction is a sequence marker (SEQUENCE_START or SEQUENCE_END)\n * @param action - The PlaywrightAction to check\n * @returns true if the action is a sequence marker\n */\nexport function isSequenceMarker(action) {\n return action === PlaywrightAction.SEQUENCE_START || action === PlaywrightAction.SEQUENCE_END;\n}\nexport function singleQuoteString(str) {\n if (!str)\n return '';\n return `'${str.replace(/'/g, \"\\\\'\")}'`;\n}\nexport function doubleQuoteString(str) {\n if (!str)\n return '';\n return `\"${str.replace(/\"/g, '\\\\\"')}\"`;\n}\n/**\n * Extract unique process.env variable names from a parameter table.\n * Looks for ${process.env.VAR_NAME} patterns in string values.\n */\nexport function extractEnvVarsFromParameterTable(parameterTable) {\n if (!Array.isArray(parameterTable) || parameterTable.length === 0) {\n return [];\n }\n const envVars = new Set();\n const pattern = /\\$\\{process\\.env\\.([a-zA-Z_][a-zA-Z0-9_]*)\\}/g;\n parameterTable.forEach((row) => {\n Object.values(row).forEach((value) => {\n if (typeof value !== 'string')\n return;\n let match;\n while ((match = pattern.exec(value)) !== null) {\n envVars.add(match[1]);\n }\n });\n });\n return Array.from(envVars).sort();\n}\n/**\n * Converts a string to a filesystem-safe slug.\n * Used for filenames/package names (not URL parsing).\n */\nexport function slugify(text) {\n if (!text)\n return 'scenario';\n return text\n .toLowerCase()\n .trim()\n .replace(/[^a-zA-Z0-9-_]/g, '-') // Replace non-alphanumeric chars with hyphens\n .replace(/-+/g, '-') // Replace multiple hyphens with single hyphen\n .replace(/^-|-$/g, '') // Remove leading/trailing hyphens\n .substring(0, 100); // Limit length to 100 chars\n}\n// Normalize a parameter name to a legal JS identifier\nexport function normalizeParameterName(name) {\n // 0. Remove leading/trailing spaces\n // 1. Replace invalid characters with underscores\n // 2. collapse multiple underscores\n // 3. Remove trailing underscores\n // 4. If starts with a digit, prepend '_'\n // 5. Convert to lowercase\n name = name.trim();\n name = name.replace(/[^a-zA-Z0-9_$]/g, '_');\n name = name.replace(/_+/g, '_');\n name = name.replace(/_+$/, ''); // Remove trailing underscores\n if (/^[0-9]/.test(name)) {\n name = '_' + name;\n }\n name = name.toLowerCase();\n // Ensure we never return an empty string or just underscores\n if (!name || name === '_' || /^_+$/.test(name)) {\n name = 'param_' + Date.now();\n }\n return name;\n}\nexport function matchRegex(str, regex) {\n //parse the regex string\n const match = regex.match(/^\\/(.+)\\/([gimsuy]*)$/);\n if (!match) // normal string\n return str.includes(regex);\n else { // regex string\n const pattern = match[1].replace(/\\\\/g, '\\\\');\n const flags = match[2];\n console.log(`Matching ${str} against ${pattern} with flags ${flags}`);\n return new RegExp(pattern, flags).test(str);\n }\n}\n/**\n * Truncates a URL by replacing query parameters (everything after ?) with three dots.\n * @param url The URL to truncate\n * @returns The truncated URL with three dots replacing query parameters\n */\nexport function truncateUrl(url) {\n if (!url)\n return '';\n const questionMarkIndex = url.indexOf('?');\n if (questionMarkIndex === -1) {\n // No query parameters found, return the original URL\n return url;\n }\n const baseUrl = url.substring(0, questionMarkIndex);\n return `${baseUrl}...`;\n}\n/**\n * Sets up browser console logging on a Playwright page.\n * This function removes all existing console listeners and optionally adds a new one.\n * @param page The Playwright page instance\n * @param enableConsoleLogs Whether to enable console logging\n * @param logger Optional logger instance to use for output (defaults to console.log)\n */\nexport const setupBrowserConsoleLogs = (page, enableConsoleLogs, logger = null) => {\n // Always remove all existing console listeners first\n page.removeAllListeners('console');\n // Always add a listener, but filter output based on enableConsoleLogs\n const listener = (msg) => {\n if (enableConsoleLogs) {\n const type = msg.type();\n const text = msg.text();\n if (logger) {\n logger.log(`[Browser-${type}]: ${text}`);\n }\n else {\n console.log(`[Browser-${type}]: ${text}`);\n }\n }\n // If disabled, do nothing (silently ignore the console message)\n };\n page.on('console', listener);\n};\n/**\n * Safely interpolates template literals in a string using the provided context.\n * Similar to JavaScript template literals, but executed safely at runtime.\n * Recursively interpolates until no more template literals remain.\n *\n * This function only interpolates the argument string itself, not the entire context.\n * When a template literal resolves to another string containing template literals,\n * it recursively interpolates that result.\n *\n * @param str The string containing template literal syntax (e.g., \"Hello ${name}\")\n * @param context The context object containing variables for interpolation\n * @param maxDepth Maximum recursion depth to prevent infinite loops (default: 10)\n * @returns The interpolated string, or the original string if no interpolation is needed\n */\nexport function interpolateTemplate(str, context, maxDepth = 10) {\n if (typeof str !== 'string' || !str.includes('${')) {\n return str;\n }\n if (maxDepth <= 0) {\n console.warn('⚠️ Maximum interpolation depth reached, returning partially interpolated string');\n return str;\n }\n try {\n // Escape backticks in the template to prevent template literal injection\n const escapedTemplate = str.replace(/\\\\/g, '\\\\\\\\').replace(/`/g, '\\\\`');\n // Create a safe template execution function\n // Assign all context properties to variables so they're accessible in the template\n // This works for both simple values and nested objects like process.env\n const contextKeys = Object.keys(context);\n const assignments = contextKeys.map(key => `const ${key} = ctx.${key};`).join('\\n');\n const functionBody = `\n const ctx = arguments[0];\n ${assignments}\n return \\`${escapedTemplate}\\`;\n `;\n const compiled = new Function(functionBody);\n const rendered = compiled(context);\n // If the result still contains template literals, recursively interpolate\n if (rendered.includes('${') && rendered !== str) {\n return interpolateTemplate(rendered, context, maxDepth - 1);\n }\n return rendered;\n }\n catch (e) {\n const error = e instanceof Error ? e : new Error(String(e));\n console.error('⚠️ Template evaluation failed:', error);\n throw error;\n }\n}\nexport class Mutex {\n constructor() {\n this._locked = false;\n this._waiters = [];\n }\n lock() {\n return new Promise((resolve) => {\n const unlock = () => {\n if (this._waiters.length > 0) {\n const nextResolve = this._waiters.shift();\n if (nextResolve) {\n nextResolve(unlock);\n }\n }\n else {\n this._locked = false;\n }\n };\n if (this._locked) {\n this._waiters.push(resolve);\n }\n else {\n this._locked = true;\n resolve(unlock);\n }\n });\n }\n async withLock(fn) {\n const unlock = await this.lock();\n try {\n return await fn();\n }\n finally {\n unlock();\n }\n }\n}\n//# sourceMappingURL=utils.js.map","import pRetry from 'p-retry';\nimport { ProboLogger } from './utils.js';\nexport const apiLogger = new ProboLogger('apiclient');\nexport class ApiError extends Error {\n constructor(status, message, data) {\n super(message);\n this.status = status;\n this.data = data;\n this.name = 'ApiError';\n // Remove stack trace for cleaner error messages\n this.stack = undefined;\n }\n toString() {\n return `${this.message} (Status: ${this.status})`;\n }\n}\nexport class ApiClient {\n constructor(apiUrl, token, maxRetries = 3, initialBackoff = 1000) {\n this.apiUrl = apiUrl;\n this.token = token;\n this.maxRetries = maxRetries;\n this.initialBackoff = initialBackoff;\n }\n /**\n * Determines if an error should be retried.\n * Only retries on timeout and network errors, not on client/server errors.\n */\n isRetryableError(error) {\n var _a, _b, _c, _d, _e;\n // Network/connection errors should be retried\n if ((_a = error.message) === null || _a === void 0 ? void 0 : _a.includes('fetch failed'))\n return true;\n if ((_b = error.message) === null || _b === void 0 ? void 0 : _b.includes('network'))\n return true;\n if ((_c = error.message) === null || _c === void 0 ? void 0 : _c.includes('ETIMEDOUT'))\n return true;\n if ((_d = error.message) === null || _d === void 0 ? void 0 : _d.includes('ECONNRESET'))\n return true;\n if ((_e = error.message) === null || _e === void 0 ? void 0 : _e.includes('ECONNREFUSED'))\n return true;\n if (error.code === 'ETIMEDOUT')\n return true;\n if (error.code === 'ECONNRESET')\n return true;\n if (error.code === 'ECONNREFUSED')\n return true;\n // If it's an ApiError, check the status code\n if (error instanceof ApiError) {\n // Retry on timeout-related status codes\n if (error.status === 408)\n return true; // Request Timeout\n if (error.status === 502)\n return true; // Bad Gateway (temporary)\n if (error.status === 503)\n return true; // Service Unavailable (temporary)\n if (error.status === 504)\n return true; // Gateway Timeout\n if (error.status === 0)\n return true; // Network error\n // Don't retry on client errors (4xx) or server errors (5xx)\n // These indicate problems that won't be fixed by retrying\n return false;\n }\n // For unknown errors, don't retry to avoid masking issues\n return false;\n }\n /**\n * Generic helper to wrap API requests with retry logic and consistent error handling.\n */\n async requestWithRetry(operationName, operation) {\n return pRetry(operation, {\n retries: this.maxRetries,\n minTimeout: this.initialBackoff,\n shouldRetry: (error) => {\n const shouldRetry = this.isRetryableError(error);\n if (!shouldRetry) {\n apiLogger.error(`${operationName} failed with non-retryable error: ${error.message || error}`);\n }\n return shouldRetry;\n },\n onFailedAttempt: error => {\n apiLogger.warn(`${operationName} failed (retryable), attempt ${error.attemptNumber} of ${error.retriesLeft + error.attemptNumber}. Error: ${error.message}`);\n }\n });\n }\n async handleResponse(response) {\n var _a;\n try {\n const data = await response.json();\n const error = `${(data === null || data === void 0 ? void 0 : data.error) || 'Unknown error'}`;\n apiLogger.debug(`API response: ${JSON.stringify(data)}`);\n if (!response.ok) {\n switch (response.status) {\n case 401:\n throw new ApiError(401, `Unauthorized - Invalid or missing authentication token: ${error}`);\n case 403:\n throw new ApiError(403, `Forbidden - You do not have permission to perform this action: ${error}`);\n case 400:\n throw new ApiError(400, `Bad Request: ${error}`);\n case 404:\n throw new ApiError(404, `Not Found: ${error}`);\n case 500:\n throw new ApiError(500, `Internal Server Error: ${error}`);\n default:\n throw new ApiError(response.status, `API Error: ${error}`);\n }\n }\n return data;\n }\n catch (error) {\n // Only throw the original error if it's not a network error\n if (!((_a = error.message) === null || _a === void 0 ? void 0 : _a.includes('fetch failed'))) {\n throw error;\n }\n throw new ApiError(0, 'Network error: fetch failed');\n }\n }\n getHeaders() {\n const headers = {\n 'Content-Type': 'application/json',\n };\n // Always include token in headers now that we have a default\n headers['Authorization'] = `Token ${this.token}`;\n return headers;\n }\n async createStep(options) {\n apiLogger.debug('creating step ', options.stepPrompt);\n return this.requestWithRetry('createStep', async () => {\n const response = await fetch(`${this.apiUrl}/step-runners/`, {\n method: 'POST',\n headers: this.getHeaders(),\n body: JSON.stringify({\n step_id: options.stepIdFromServer,\n scenario_name: options.scenarioName,\n step_prompt: options.stepPrompt,\n argument: options.argument,\n initial_screenshot: options.initial_screenshot_url,\n initial_html_content: options.initial_html_content,\n use_cache: options.use_cache,\n url: options.url,\n action: options.action,\n vanilla_prompt: options.vanilla_prompt,\n is_vanilla_prompt_robust: options.is_vanilla_prompt_robust,\n target_element_name: options.target_element_name,\n position: options.position\n }),\n });\n const data = await this.handleResponse(response);\n return data.step.id;\n });\n }\n async patchStep(stepId, fields) {\n // Use PATCH /steps/:id/ endpoint with partial=true\n apiLogger.debug(`patching step #${stepId} with fields:`, Object.keys(fields));\n return this.requestWithRetry('patchStep', async () => {\n const response = await fetch(`${this.apiUrl}/steps/${stepId}/`, {\n method: 'PATCH',\n headers: this.getHeaders(),\n body: JSON.stringify(fields)\n });\n const data = await this.handleResponse(response);\n return;\n });\n }\n /* async resolveNextInstruction(stepId: string, instruction: Instruction | null, aiModel?: string) {\n apiLogger.debug(`resolving next instruction: ${instruction}`);\n return this.requestWithRetry('resolveNextInstruction', async () => {\n apiLogger.debug(`API client: Resolving next instruction for step ${stepId}`);\n \n const cleanInstruction = cleanupInstructionElements(instruction);\n \n const response = await fetch(`${this.apiUrl}/step-runners/${stepId}/run/`, {\n method: 'POST',\n headers: this.getHeaders(),\n body: JSON.stringify({\n executed_instruction: cleanInstruction,\n ai_model: aiModel\n }),\n });\n \n const data = await this.handleResponse(response);\n return data.instruction;\n });\n } */\n async uploadScreenshot(screenshot_bytes) {\n return this.requestWithRetry('uploadScreenshot', async () => {\n const response = await fetch(`${this.apiUrl}/upload-screenshots/`, {\n method: 'POST',\n headers: {\n 'Authorization': `Token ${this.token}`\n },\n body: screenshot_bytes,\n });\n const data = await this.handleResponse(response);\n return data.screenshot_url;\n });\n }\n async findStepById(stepId) {\n apiLogger.debug(`Finding step by id: ${stepId}`);\n return this.requestWithRetry('findStepById', async () => {\n const response = await fetch(`${this.apiUrl}/steps/${stepId}/`, {\n method: 'GET',\n headers: this.getHeaders(),\n });\n const data = await this.handleResponse(response);\n return data.step;\n });\n }\n async findStepByPrompt(prompt, scenarioName, url = '') {\n apiLogger.debug(`Finding step by prompt: ${prompt} and scenario: ${scenarioName}`);\n return this.requestWithRetry('findStepByPrompt', async () => {\n const response = await fetch(`${this.apiUrl}/step-runners/find-step-by-prompt/`, {\n method: 'POST',\n headers: this.getHeaders(),\n body: JSON.stringify({\n prompt: prompt,\n scenario_name: scenarioName,\n url: url\n }),\n });\n try {\n const data = await this.handleResponse(response);\n return {\n step: data.step,\n total_count: data.total_count\n };\n }\n catch (error) {\n // If we get a 404, the step doesn't exist\n if (error instanceof ApiError && error.status === 404) {\n return null;\n }\n // For any other error, rethrow\n throw error;\n }\n });\n }\n async resetStep(stepId) {\n return this.requestWithRetry('resetStep', async () => {\n const response = await fetch(`${this.apiUrl}/steps/${stepId}/reset/`, {\n method: 'POST',\n headers: this.getHeaders(),\n });\n const data = await this.handleResponse(response);\n return data;\n });\n }\n async interactionToStep(scenarioId, interaction, position = -1) {\n // Use POST /interaction-to-step/ endpoint\n // Backend will create new step or update existing one based on interaction_id\n apiLogger.debug(`converting interaction #${interaction.interactionId} to step`);\n return this.requestWithRetry('interactionToStep', async () => {\n var _a, _b, _c, _d;\n const response = await fetch(`${this.apiUrl}/interaction-to-step/`, {\n method: 'POST',\n headers: this.getHeaders(),\n body: JSON.stringify({\n scenario_id: scenarioId,\n position,\n interaction_id: interaction.interactionId,\n action: interaction.action,\n argument: interaction.argument,\n element_css_selector: ((_a = interaction.elementInfo) === null || _a === void 0 ? void 0 : _a.css_selector) || '',\n iframe_selector: ((_b = interaction.elementInfo) === null || _b === void 0 ? void 0 : _b.iframe_selector) || '',\n smart_selector: ((_c = interaction.elementInfo) === null || _c === void 0 ? void 0 : _c.smart_selector) || null,\n smart_iframe_selector: ((_d = interaction.elementInfo) === null || _d === void 0 ? void 0 : _d.smart_iframe_selector) || null,\n prompt: interaction.nativeDescription,\n vanilla_prompt: interaction.nativeDescription,\n is_vanilla_prompt_robust: interaction.isNativeDescriptionElaborate || false,\n target_element_name: interaction.nativeName,\n target_element_info: interaction.elementInfo,\n url: interaction.url,\n is_secret: interaction.isSecret || false,\n })\n });\n const data = await this.handleResponse(response);\n return [data.result.step_id, data.result.matched_step, data.scenario_id];\n });\n }\n async actionToPrompt(action2promptInput, aiModel) {\n // Use POST /action-to-prompt/ endpoint\n apiLogger.debug(`running action2prompt for step #${action2promptInput.step_id}`);\n return this.requestWithRetry('actionToPrompt', async () => {\n const response = await fetch(`${this.apiUrl}/steps/${action2promptInput.step_id}/action_to_prompt/`, {\n method: 'POST',\n headers: this.getHeaders(),\n body: JSON.stringify({ ...action2promptInput, 'model': aiModel })\n });\n const data = await this.handleResponse(response);\n return data;\n });\n }\n async summarizeScenario(scenarioId, aiModel) {\n return this.requestWithRetry('summarizeScenario', async () => {\n const response = await fetch(`${this.apiUrl}/api/scenarios/${scenarioId}/summary`, {\n method: 'POST',\n headers: this.getHeaders(),\n body: JSON.stringify({ 'model': aiModel })\n });\n const data = await this.handleResponse(response);\n return data;\n });\n }\n async askAI(question, scenarioName, screenshot, aiModel) {\n apiLogger.debug(`Asking AI question: \"${question}\", scenarioName: ${scenarioName}`);\n apiLogger.debug(`headers: ${JSON.stringify(this.getHeaders())}`);\n return this.requestWithRetry('askAI', async () => {\n const response = await fetch(`${this.apiUrl}/api/ask-ai/`, {\n method: 'POST',\n headers: this.getHeaders(),\n body: JSON.stringify({\n question: question,\n scenario_name: scenarioName,\n screenshot: screenshot,\n model: aiModel\n }),\n });\n const data = await this.handleResponse(response);\n return data;\n });\n }\n async screenshotReasoning(stepId, prompt, aiModel) {\n apiLogger.debug(`Performing screenshot reasoning for step: ${stepId}`);\n return this.requestWithRetry('screenshotReasoning', async () => {\n const response = await fetch(`${this.apiUrl}/steps/${stepId}/screenshot_reasoning/`, {\n method: 'POST',\n headers: this.getHeaders(),\n body: JSON.stringify({\n prompt: prompt,\n model: aiModel\n }),\n });\n const data = await this.handleResponse(response);\n return data.action;\n });\n }\n async findBestCandidateElement(stepId, candidatesScreenshotUrl, candidateElements, aiModel) {\n apiLogger.debug(`Finding best candidate element for step: ${stepId}`);\n return this.requestWithRetry('findBestCandidateElement', async () => {\n const response = await fetch(`${this.apiUrl}/steps/${stepId}/find_best_candidate_element/`, {\n method: 'POST',\n headers: this.getHeaders(),\n body: JSON.stringify({\n screenshot_url: candidatesScreenshotUrl,\n candidate_elements: candidateElements,\n model: aiModel\n }),\n });\n const data = await this.handleResponse(response);\n return data.index;\n });\n }\n} /* ApiClient */\n//# sourceMappingURL=api-client.js.map","/**\n * Available AI models for LLM operations\n */\nexport var AIModel;\n(function (AIModel) {\n AIModel[\"AZURE_GPT4\"] = \"azure-gpt4\";\n AIModel[\"AZURE_GPT4_MINI\"] = \"azure-gpt4-mini\";\n AIModel[\"GEMINI_1_5_FLASH\"] = \"gemini-1.5-flash\";\n AIModel[\"GEMINI_2_5_FLASH\"] = \"gemini-2.5-flash\";\n AIModel[\"GPT4\"] = \"gpt4\";\n AIModel[\"GPT4_MINI\"] = \"gpt4-mini\";\n AIModel[\"CLAUDE_3_5\"] = \"claude-3.5\";\n AIModel[\"CLAUDE_SONNET_4_5\"] = \"claude-sonnet-4.5\";\n AIModel[\"CLAUDE_HAIKU_4_5\"] = \"claude-haiku-4.5\";\n AIModel[\"CLAUDE_OPUS_4_1\"] = \"claude-opus-4.1\";\n AIModel[\"GROK_2\"] = \"grok-2\";\n AIModel[\"LLAMA_4_SCOUT\"] = \"llama-4-scout\";\n AIModel[\"DEEPSEEK_V3\"] = \"deepseek-v3\";\n})(AIModel || (AIModel = {}));\n//# sourceMappingURL=AIModel.js.map","export const DEFAULT_PLAYWRIGHT_TIMEOUT_CONFIG = {\n highlightTimeout: 300,\n playwrightActionTimeout: 5000,\n playwrightNavigationTimeout: 10000,\n playwrightLocatorTimeout: 2000,\n // mutation observer\n mutationsTimeout: 500,\n mutationsInitTimeout: 1000,\n // wait for navigation\n waitForNavigationInitialTimeout: 2000,\n waitForNavigationNavigationTimeout: 7000,\n waitForNavigationGlobalTimeout: 15000,\n // wait for stability\n waitForStabilityQuietTimeout: 2000,\n waitForStabilityInitialDelay: 100,\n waitForStabilityGlobalTimeout: 15000,\n waitForStabilityVerbose: false,\n scriptTimeout: 120000, // 2 minutes\n};\n//# sourceMappingURL=PlaywrightTimeoutConfig.js.map","import { DEFAULT_PLAYWRIGHT_TIMEOUT_CONFIG } from './PlaywrightTimeoutConfig.js';\nexport const DEFAULT_RECORDER_SETTINGS = {\n // API Configuration\n apiKey: '',\n apiEndPoint: 'https://api.probolabs.ai',\n frontendUrl: 'https://app.probolabs.ai',\n baseUrl: undefined,\n // Scenario Configuration\n scenarioName: 'new recording',\n scenarioId: undefined,\n aiModel: 'azure-gpt4-mini',\n activeParamSet: 0,\n // Browser Configuration\n resetBrowserBeforeReplay: true,\n enableSmartSelectors: true, // Smart selectors always enabled\n // Script Configuration\n scriptTimeout: DEFAULT_PLAYWRIGHT_TIMEOUT_CONFIG.scriptTimeout,\n // Logging Configuration\n enableConsoleLogs: true,\n debugLevel: 'DEBUG',\n // Timeout Configuration (spread from PlaywrightTimeoutConfig)\n ...DEFAULT_PLAYWRIGHT_TIMEOUT_CONFIG,\n};\n//# sourceMappingURL=RecorderSettings.js.map","// --- Code generation utilities for Probo Labs Playwright scripts ---\nimport { isParameterizable, isAI, singleQuoteString, PlaywrightAction, getReturnValueParameterName, hasReturnValue, AIModel } from \"./index.js\";\n/**\n * Extracts environment variable names from parameter table rows\n * by parsing ${process.env.VAR_NAME} patterns from parameter values\n *\n * @param rows - Array of parameter table rows (Record<string, string>)\n * @returns Set of unique environment variable names (in uppercase)\n */\nexport function extractRequiredEnvVars(rows) {\n const envVars = new Set();\n // Return empty set if rows are not provided or empty\n if (!rows || !Array.isArray(rows) || rows.length === 0) {\n return envVars;\n }\n // Regex to match both escaped and unescaped process.env patterns\n // Matches: ${process.env.VAR_NAME} or \\${process.env.VAR_NAME}\n // Pattern: optional backslash (\\\\), then ${ (escaped as \\$\\{), then process.env., then variable name\n const envVarPattern = /\\\\?\\$\\{process\\.env\\.([a-zA-Z_][a-zA-Z0-9_]*)\\}/g;\n // Scan all parameter values in all rows for env var patterns\n rows.forEach((row) => {\n if (row && typeof row === 'object') {\n Object.values(row).forEach((value) => {\n if (typeof value === 'string') {\n let match;\n while ((match = envVarPattern.exec(value)) !== null) {\n const varName = match[1].toUpperCase(); // Ensure uppercase for consistency\n envVars.add(varName);\n }\n // Reset regex lastIndex for next iteration\n envVarPattern.lastIndex = 0;\n }\n });\n }\n });\n return envVars;\n}\n/**\n * Extracts the list of required environment variable names from parameter table rows\n * @param rows - Array of parameter table rows (Record<string, string>)\n * @returns Array of required environment variable names (sorted)\n */\nexport function getRequiredEnvVars(rows) {\n const envVars = extractRequiredEnvVars(rows);\n return Array.from(envVars).sort();\n}\n/**\n * Generates Playwright native code for a given interaction.\n *\n * @param interaction - The interaction object containing action, element info, and other metadata.\n * @returns A string of Playwright code that performs the specified interaction.\n */\nfunction interactionToNativeCode(interaction) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;\n const selector = ((_a = interaction.elementInfo) === null || _a === void 0 ? void 0 : _a.css_selector) || '';\n const iframe = ((_b = interaction.elementInfo) === null || _b === void 0 ? void 0 : _b.iframe_selector) || '';\n const smartSelector = ((_c = interaction.elementInfo) === null || _c === void 0 ? void 0 : _c.smart_selector) || null;\n const smartIFrameSelector = ((_d = interaction.elementInfo) === null || _d === void 0 ? void 0 : _d.smart_iframe_selector) || null;\n const argument = isParameterizable(interaction) ? `param.${interaction.parameterName}` : singleQuoteString(interaction.argument);\n // Escape the nativeDescription for use in test.step() string literal\n const escapedStepName = interaction.nativeDescription.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"');\n const comment = `\n // ${interaction.nativeDescription}${interaction.annotation ? `\\n // annotation: ${interaction.annotation}` : ''}`;\n switch (interaction.action) {\n case PlaywrightAction.CLICK:\n case PlaywrightAction.CHECK_CHECKBOX:\n case PlaywrightAction.SELECT_RADIO:\n case PlaywrightAction.FILL_IN:\n case PlaywrightAction.TYPE_KEYS:\n case PlaywrightAction.SET_SLIDER:\n case PlaywrightAction.SELECT_DROPDOWN:\n case PlaywrightAction.ASSERT_CONTAINS_VALUE:\n case PlaywrightAction.ASSERT_EXACT_VALUE:\n case PlaywrightAction.HOVER:\n case PlaywrightAction.SCROLL_TO_ELEMENT:\n case PlaywrightAction.UPLOAD_FILES:\n case PlaywrightAction.VISIT_URL:\n case PlaywrightAction.VISIT_BASE_URL:\n case PlaywrightAction.ASSERT_URL:\n case PlaywrightAction.WAIT_FOR:\n case PlaywrightAction.WAIT_FOR_OTP:\n case PlaywrightAction.GEN_TOTP:\n const args = [\n `action: PlaywrightAction.${interaction.action}`,\n ...(argument ? [`argument: ${argument}`] : []),\n ...(iframe ? [`iframeSelector: '${iframe}'`] : []),\n ...(selector ? [`elementSelector: '${selector}'`] : []),\n ...(smartSelector ? [`smartSelector: ${JSON.stringify(smartSelector)}`] : []),\n ...(smartIFrameSelector ? [`smartIFrameSelector: ${JSON.stringify(smartIFrameSelector)}`] : []),\n ...(interaction.annotation ? [`annotation: '${interaction.annotation}'`] : []),\n ...(((_e = interaction.waitForConfig) === null || _e === void 0 ? void 0 : _e.pollingInterval) ? [`pollingInterval: ${(_f = interaction.waitForConfig) === null || _f === void 0 ? void 0 : _f.pollingInterval}`] : []),\n ...(((_g = interaction.waitForConfig) === null || _g === void 0 ? void 0 : _g.timeout) ? [`timeout: ${(_h = interaction.waitForConfig) === null || _h === void 0 ? void 0 : _h.timeout}`] : []),\n // Always include totpConfig for GEN_TOTP actions, using defaults if not present in interaction\n ...(interaction.action === PlaywrightAction.GEN_TOTP ? [`totpConfig: { digits: ${((_j = interaction.totpConfig) === null || _j === void 0 ? void 0 : _j.digits) || 6}, algorithm: '${((_k = interaction.totpConfig) === null || _k === void 0 ? void 0 : _k.algorithm) || 'SHA1'}' }`] : [])\n ];\n return `${comment}\n await test.step(\"${escapedStepName}\", async () => {\n await ppw.runStep({\n ${args.join(',\\n ')}\n });\n });`;\n case PlaywrightAction.EXTRACT_VALUE:\n const extractVarName = getReturnValueParameterName(interaction);\n return `${comment}\n await test.step(\"${escapedStepName}\", async () => {\n const ${extractVarName} = await ppw.runStep({\n iframeSelector: '${iframe}',\n elementSelector: '${selector}',\n smartSelector: ${JSON.stringify(smartSelector)},\n smartIFrameSelector: ${JSON.stringify(smartIFrameSelector)},\n action: '${interaction.action}', \n annotation: '${(_l = interaction.annotation) !== null && _l !== void 0 ? _l : \"\"}',\n });\n param['${extractVarName}'] = ${extractVarName};\n });`;\n case PlaywrightAction.EXECUTE_SCRIPT:\n return generateExecuteScriptCode(interaction, comment, escapedStepName);\n default:\n return `// Unhandled action: ${interaction.action}!!!`;\n }\n}\nfunction interactionToProboLib(interaction) {\n var _a, _b, _c;\n const escapedPrompt = (_c = (_b = (_a = interaction.serverResponse) === null || _a === void 0 ? void 0 : _a.result) === null || _b === void 0 ? void 0 : _b.prompt) === null || _c === void 0 ? void 0 : _c.replace(/'/g, \"\\\\'\");\n const argument = isParameterizable(interaction) ? `param.${interaction.parameterName}` : `'${interaction.argument}'`;\n // Escape the nativeDescription for use in test.step() string literal\n const escapedStepName = interaction.nativeDescription.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"');\n const comment = `\n // ${interaction.nativeDescription}${interaction.annotation ? `\\n // annotation: ${interaction.annotation}` : ''}`;\n if (interaction.action === PlaywrightAction.EXTRACT_VALUE) {\n const extractVarName = getReturnValueParameterName(interaction);\n return `${comment}\n await test.step(\"${escapedStepName}\", async () => {\n const ${extractVarName} = await probo.runStep(page, '${escapedPrompt}', null, { stepId: ${interaction.stepId} });\n param['${extractVarName}'] = ${extractVarName};\n });`;\n }\n else if (interaction.action === PlaywrightAction.ASSERT_CONTAINS_VALUE ||\n interaction.action === PlaywrightAction.ASSERT_EXACT_VALUE) {\n return `${comment}\n await test.step(\"${escapedStepName}\", async () => {\n await probo.runStep(page, '${escapedPrompt}', ${argument}, { stepId: ${interaction.stepId} });\n });`;\n }\n else if (interaction.action === PlaywrightAction.VISIT_URL) {\n return `${comment}\n await test.step(\"${escapedStepName}\", async () => {\n await probo.runStep(page, '${interaction.nativeDescription}', ${argument}, { stepId: ${interaction.stepId} });\n });`;\n }\n else if (interaction.action === PlaywrightAction.ASK_AI) {\n const escapedQuestion = interaction.nativeDescription.replace(/'/g, \"\\\\'\");\n const aiVarName = getReturnValueParameterName(interaction);\n // const assertion = interaction.argument ? ` \n const askAIOptions = interaction.stepId ? `{ stepId: ${interaction.stepId} }` : '{}';\n return `${comment}\n await test.step(\"${escapedStepName}\", async () => {\n const ${aiVarName} = await probo.askAI(page, '${escapedQuestion}', ${askAIOptions}${argument ? `, ${argument}` : ''});\n param['${aiVarName}'] = ${aiVarName};\n });`;\n }\n else if (interaction.action === PlaywrightAction.EXECUTE_SCRIPT) {\n return generateExecuteScriptCode(interaction, comment, escapedStepName);\n }\n else {\n return `${comment}\n await test.step(\"${escapedStepName}\", async () => {\n ${argument ? `await probo.runStep(page, '${escapedPrompt}', ${argument}, { stepId: ${interaction.stepId} });` : `await probo.runStep(page, '${escapedPrompt}', null, { stepId: ${interaction.stepId} });`}\n });`;\n }\n}\nfunction generateExecuteScriptCode(interaction, comment, escapedStepName) {\n let scriptCode = Array.isArray(interaction.argument) ? interaction.argument[0] : interaction.argument;\n const scriptVarName = getReturnValueParameterName(interaction);\n // Replace returnValue(x) with 'const param = x;'\n scriptCode = scriptCode.replace(/returnValue\\((.*)\\);?/, `${scriptVarName} = $1;`);\n // Trim trailing whitespace\n scriptCode = scriptCode.trimEnd();\n // If scriptCode doesn't end with a semicolon add one\n if (!/\\s*;\\s*$/.test(scriptCode))\n scriptCode = scriptCode + ';';\n // Indent the code (extra indent for test.step wrapper)\n const indentedCode = scriptCode.split('\\n').map((line, idx) => idx === 0 ? line : ` ${line}`).join('\\n');\n return `${comment}\n await test.step(\"${escapedStepName}\", async () => {\n let ${scriptVarName} = null;\n try {\n ${indentedCode}\n } catch (error) {\n console.error('❌ Workspace script execution failed:', error.message);\n throw error;\n }\n param['${scriptVarName}'] = ${scriptVarName};\n });`;\n}\nfunction scriptTemplate(options, settings, viewPort) {\n var _a, _b, _c, _d;\n const areActionsParameterized = options.rows.length > 0;\n const hasAiInteractions = options.interactions.some((interaction) => isAI(interaction));\n const hasScriptInteractions = options.interactions.some((interaction) => interaction.action === PlaywrightAction.EXECUTE_SCRIPT);\n // const uniquelyParameterizedInteractions = uniquifyInteractionParameters(options.interactions);\n const steps = options.interactions.map((interaction) => {\n if (isAI(interaction))\n return interactionToProboLib(interaction);\n return interactionToNativeCode(interaction);\n }).join('\\n');\n // Get list of all extracted value parameter names to filter them out from the parameter table\n const extractedValueNames = new Set();\n options.interactions.forEach((interaction) => {\n if (hasReturnValue(interaction)) {\n const retName = getReturnValueParameterName(interaction);\n if (retName) {\n extractedValueNames.add(retName);\n }\n }\n });\n // Escape apostrophes and backslashes for single-quoted strings\n const escapeForSingleQuotes = (value) => {\n if (!value || typeof value !== 'string')\n return ''; //check for null, undefined, or non-string values\n //escape backslashes and single quotes\n return value.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\");\n };\n // Lookup value from settings \n const aiModelKey = Object.keys(AIModel).find(key => AIModel[key] === settings.aiModel);\n // Check if any interactions have the isSecret flag set\n const hasSecrets = options.interactions.some(interaction => interaction.isSecret === true);\n // Extract required environment variable names from parameter table rows\n const requiredEnvVars = extractRequiredEnvVars(options.rows);\n const requiredEnvVarsArray = Array.from(requiredEnvVars).sort();\n // generate the parameter table (exclude extracted values as they are declared as const in the steps)\n const parameterTable = areActionsParameterized ? `\n const parameterTable: Record<string, any>[] = [\n ${options.rows.map((row) => {\n // Filter out extracted value columns from the parameter table\n const filteredRow = Object.fromEntries(Object.entries(row).filter(([key]) => !extractedValueNames.has(key)));\n return `{ ${Object.entries(filteredRow).map(([key, value]) => `${key}: '${escapeForSingleQuotes(value)}'`).join(', ')} }`;\n }).join(',\\n ')}\n ];\n ` : '';\n const proboConstructor = hasAiInteractions ? `\n const probo = new Probo({\n scenarioName: '${options.scenarioName}',\n enableSmartSelectors: ${settings.enableSmartSelectors},\n debugLevel: ProboLogLevel.${settings.debugLevel},\n aiModel: AIModel.${aiModelKey},\n timeoutConfig: {\n waitForStabilityQuietTimeout: ${(_a = settings.waitForStabilityQuietTimeout) !== null && _a !== void 0 ? _a : 2000},\n waitForStabilityInitialDelay: ${(_b = settings.waitForStabilityInitialDelay) !== null && _b !== void 0 ? _b : 500},\n waitForStabilityGlobalTimeout: ${(_c = settings.waitForStabilityGlobalTimeout) !== null && _c !== void 0 ? _c : 15000},\n waitForStabilityVerbose: ${(_d = settings.waitForStabilityVerbose) !== null && _d !== void 0 ? _d : false}\n }\n });` : '';\n return `\n /*\n * Probo Labs Playwright Script\n * Scenario: ${options.scenarioName}\n * Auto generated on ${new Date().toLocaleDateString()} ${new Date().toLocaleTimeString()}\n * \n * HOW TO INTEGRATE THIS SCRIPT INTO YOUR EXISTING PROJECT:\n * 1. Install dependencies: npm install @playwright/test @probolabs/playwright@latest${hasSecrets ? ' dotenv' : ''}\n * 2. copy and paste the code below into your test file${hasSecrets ? '\\n * 3. Ensure a .env file exists in your project root (or ~/.probium/.env) or set environment variables manually' : ''}\n */\n \n // launch chromium with pre-installed extensions\n import { test, expect} from '@probolabs/playwright/fixtures';\n import { ProboPlaywright, Probo, PlaywrightAction, ProboLogLevel, AIModel } from '@probolabs/playwright';${hasScriptInteractions ? `\n import { execSync } from 'child_process';\n import * as fs from 'fs';\n import * as path from 'path';\n import * as os from 'os';` : ''}${hasSecrets && !hasScriptInteractions ? `\n import * as path from 'path';\n import * as os from 'os';\n import * as fs from 'fs';` : ''}\n \n${hasSecrets ? `import { config } from 'dotenv';\n // Load secrets: first try local .env (project root), then fallback to ~/.probium/.env\n const localEnvPath = path.join(process.cwd(), '.env');\n const homeEnvPath = path.join(os.homedir(), '.probium', '.env');\n \n if (fs.existsSync(localEnvPath)) {\n config({ path: localEnvPath });\n console.log('✅ Loaded env vars from project .env:', localEnvPath);\n } else if (fs.existsSync(homeEnvPath)) {\n config({ path: homeEnvPath });\n console.log('✅ Loaded env vars from home .env:', homeEnvPath);\n } else {\n console.warn('⚠️ .env not found at', localEnvPath, 'or', homeEnvPath, '- ensure environment variables are set before running tests');\n }\n \n // Validate that all required secrets are set\n const requiredSecrets: string[] = ${JSON.stringify(requiredEnvVarsArray)};\n const missingSecrets = requiredSecrets.filter(varName => !process.env[varName] || process.env[varName].trim() === '');\n if (missingSecrets.length > 0) {\n throw new Error(\\`Missing required environment variables: \\${missingSecrets.join(', ')}. Please set them in your .env file or as environment variables.\\`);\n }\n console.log(\\`✅ All required secrets are set: \\${requiredSecrets.join(', ')}\\`);\n ` : ''}\n \n ${parameterTable} \n ${proboConstructor}\n const ppw = new ProboPlaywright({\n enableSmartSelectors: ${settings.enableSmartSelectors},\n debugLevel: ProboLogLevel.${settings.debugLevel},\n timeoutConfig: {\n waitForStabilityQuietTimeout: ${settings.waitForStabilityQuietTimeout},\n waitForStabilityInitialDelay: ${settings.waitForStabilityInitialDelay},\n waitForStabilityGlobalTimeout: ${settings.waitForStabilityGlobalTimeout},\n waitForStabilityVerbose: ${settings.waitForStabilityVerbose},\n highlightTimeout: ${settings.highlightTimeout},\n playwrightActionTimeout: ${settings.playwrightActionTimeout},\n playwrightNavigationTimeout: ${settings.playwrightNavigationTimeout},\n playwrightLocatorTimeout: ${settings.playwrightLocatorTimeout}\n }\n });\n\n test.describe('${options.scenarioName}', () => {\n test.beforeEach(async ({ page }) => {\n // set the ProboPlaywright instance to the current page\n ppw.setPage(page); \n // set the viewport dimensions to be identical to their values during recording\n await page.setViewportSize({ width: ${viewPort.width}, height: ${viewPort.height} });\n });\n\n for (const param of parameterTable) {\n test(param.testName, async ({ page }) => {\n ${hasAiInteractions ? `probo.setParams(param);` : ''}\n ppw.setParams(param);\n ${steps}\n });\n }\n });\n `;\n}\n/**\n * Generates Playwright code for a scenario\n * @param options - Code generation options (scenarioName, interactions, rows)\n * @param settings - Recorder settings (timeouts, AI model, etc.)\n * @param viewPort - Viewport dimensions {width, height}\n * @returns Generated Playwright test code as a string\n */\nexport function generateCode(options, settings, viewPort) {\n return scriptTemplate(options, settings, viewPort);\n}\n// Custom function to create a URL-friendly slug\nexport const createUrlSlug = (url) => {\n try {\n const urlObj = new URL(url);\n // Extract hostname and path\n const hostname = urlObj.hostname;\n const path = urlObj.pathname;\n // Create a more readable name\n let name = hostname;\n // Add path segments if they exist and are meaningful\n if (path && path !== '/') {\n // Remove leading slash and split by slashes\n const pathSegments = path.substring(1).split('/').filter(segment => segment);\n // Add meaningful path segments to the name\n if (pathSegments.length > 0) {\n // Take up to 2 path segments to keep the name reasonable\n const relevantSegments = pathSegments.slice(0, 2);\n name += '-' + relevantSegments.join('-');\n }\n }\n // Replace any remaining special characters with hyphens\n return name\n .toLowerCase()\n .replace(/[^a-z0-9-]/g, '-') // Replace non-alphanumeric chars with hyphens\n .replace(/-+/g, '-') // Replace multiple hyphens with a single hyphen\n .replace(/^-+|-+$/g, ''); // Remove leading/trailing hyphens\n }\n catch (error) {\n // If URL parsing fails, create a simple slug\n // proboLog('❌ Error parsing URL:', error); // Don't log here, just fallback\n return url\n .toLowerCase()\n .replace(/[^a-z0-9-]/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-+|-+$/g, '');\n }\n};\n/**\n * Generate package.json content for a Playwright test project\n */\nexport function generatePackageJson(options) {\n const { name, hasSecrets = false, testScript = 'npx playwright test' } = options;\n return `{\n \"name\": \"${name}\",\n \"version\": \"1.0.0\",\n \"description\": \"Probo Labs Playwright Script\",\n \"type\": \"module\",\n \"scripts\": {\n \"test\": \"${testScript}\"\n },\n \"dependencies\": {\n \"@playwright/test\": \"^1.40.0\",\n \"@probolabs/playwright\": \"latest\"${hasSecrets ? ',\\n \"dotenv\": \"latest\"' : ''}\n }\n}`;\n}\n/**\n * Generate playwright.config.ts content\n */\nexport function generatePlaywrightConfig(includeReporter = true, runId) {\n const reporters = [\n ['list'],\n ['html', { open: 'never' }],\n ];\n // Configure run-specific output directories if runId is provided\n if (runId !== undefined) {\n reporters[1] = ['html', { open: 'never', outputFolder: `playwright-report/run-${runId}` }];\n }\n if (includeReporter) {\n reporters.push(['./probo-reporter.ts']);\n }\n // Configure outputDir for run-specific test results if runId is provided\n const outputDirConfig = runId !== undefined ? `\\n outputDir: 'test-results/run-${runId}',` : '';\n return `import { defineConfig } from '@playwright/test';\n\nexport default defineConfig({\n testDir: 'tests',\n testMatch: /.*\\\\.(ts|js)$/,\n timeout: 600000,${outputDirConfig}\n // Keep Playwright's default console output, plus HTML report${includeReporter ? ', plus Probo live progress reporter' : ''}.\n reporter: ${JSON.stringify(reporters)},\n use: {\n ignoreHTTPSErrors: true,\n actionTimeout: 30000,\n navigationTimeout: 30000,\n video: 'off',\n screenshot: 'on',\n trace: 'on',\n },\n retries: 0,\n});\n`;\n}\n/**\n * Generate a Playwright reporter that emits structured events to stdout.\n *\n * The recorder app runner can parse these lines and broadcast them to the UI.\n */\nexport function generateProboReporter() {\n // NOTE: Keep this file dependency-free; it runs inside the generated test suite project.\n // It prints one JSON payload per line, prefixed for easy extraction from stdout.\n return `import type { Reporter, FullConfig, Suite, TestCase, TestResult, TestStep } from '@playwright/test/reporter';\n\nconst PREFIX = '__PROBO_REPORTER_EVENT__';\n\ntype ProboReporterEvent =\n | {\n v: 1;\n ts: number;\n eventType: 'runBegin';\n config: { workers: number; retries: number; projects: string[] };\n }\n | {\n v: 1;\n ts: number;\n eventType: 'runEnd';\n status: 'passed' | 'failed' | 'timedout' | 'interrupted';\n }\n | {\n v: 1;\n ts: number;\n eventType: 'testBegin';\n test: ProboTestRef;\n }\n | {\n v: 1;\n ts: number;\n eventType: 'testEnd';\n test: ProboTestRef;\n result: {\n status: 'passed' | 'failed' | 'timedout' | 'skipped' | 'interrupted';\n expectedStatus: 'passed' | 'failed' | 'timedout' | 'skipped';\n duration: number;\n errors: string[];\n };\n }\n | {\n v: 1;\n ts: number;\n eventType: 'stepBegin';\n test: ProboTestRef;\n step: ProboStepRef & { title: string; category?: string; depth: number };\n }\n | {\n v: 1;\n ts: number;\n eventType: 'stepEnd';\n test: ProboTestRef;\n step: ProboStepRef & { duration?: number; error?: string | null };\n };\n\ntype ProboLocation = { file?: string; line?: number; column?: number };\ntype ProboTestRef = {\n id?: string;\n title: string;\n titlePath: string[];\n location?: ProboLocation;\n};\ntype ProboStepRef = {\n id: number;\n location?: ProboLocation;\n};\n\nfunction safeLocation(loc: any): ProboLocation | undefined {\n if (!loc || typeof loc !== 'object') return undefined;\n const file = typeof loc.file === 'string' ? loc.file : undefined;\n const line = typeof loc.line === 'number' ? loc.line : undefined;\n const column = typeof loc.column === 'number' ? loc.column : undefined;\n return file || line || column ? { file, line, column } : undefined;\n}\n\nfunction safeTitlePath(test: TestCase): string[] {\n try {\n // titlePath() exists on TestCase and includes describe blocks.\n return test.titlePath();\n } catch {\n return [test.title];\n }\n}\n\nfunction testRef(test: TestCase): ProboTestRef {\n return {\n // @ts-expect-error: Playwright has test.id at runtime; keep optional for forward/back compat.\n id: (test as any).id,\n title: test.title,\n titlePath: safeTitlePath(test),\n location: safeLocation((test as any).location),\n };\n}\n\nfunction serializeErrors(result: TestResult): string[] {\n const errors: any[] = (result as any).errors || [];\n if (!Array.isArray(errors)) return [];\n return errors\n .map((e) => {\n if (!e) return null;\n if (typeof e === 'string') return e;\n if (typeof e.message === 'string') return e.message;\n if (typeof e.value === 'string') return e.value;\n try {\n return JSON.stringify(e);\n } catch {\n return String(e);\n }\n })\n .filter(Boolean) as string[];\n}\n\nfunction emit(event: ProboReporterEvent) {\n try {\n process.stdout.write(PREFIX + JSON.stringify(event) + '\\\\n');\n } catch {\n // Ignore reporter failures; never break the run.\n }\n}\n\n/**\n * Check if a step should be included in the output.\n * Filters out hooks, fixtures, and internal Playwright operations.\n */\nfunction shouldIncludeStep(step: TestStep): boolean {\n const category = (step as any).category;\n const title = step.title?.toLowerCase() || '';\n \n // Filter out hooks (beforeAll, beforeEach, afterAll, afterEach)\n if (category === 'hook') {\n return false;\n }\n \n // Filter out fixtures\n if (category === 'fixture') {\n return false;\n }\n \n // Filter out internal waiting/timeout operations\n if (title.includes('waiting for') || \n title.includes('wait for') ||\n title.includes('timeout') ||\n title.includes('attaching') ||\n title.startsWith('attach')) {\n return false;\n }\n \n // Include user-defined steps and assertions only (exclude pw:api like click, evaluate, etc.)\n return category === 'test.step' || \n category === 'expect' ||\n !category; // Include steps without category (likely user actions)\n}\n\nexport default class ProboReporter implements Reporter {\n private stepIds = new WeakMap<TestStep, number>();\n private stepDepths = new WeakMap<TestStep, number>();\n private nextStepId = 1;\n\n onBegin(config: FullConfig, suite: Suite) {\n emit({\n v: 1,\n ts: Date.now(),\n eventType: 'runBegin',\n config: {\n workers: config.workers,\n retries: config.retries,\n projects: (config.projects || []).map((p) => p.name || 'project'),\n },\n });\n }\n\n onEnd(result: any) {\n emit({\n v: 1,\n ts: Date.now(),\n eventType: 'runEnd',\n status: result?.status || 'failed',\n });\n }\n\n onTestBegin(test: TestCase, result: TestResult) {\n emit({\n v: 1,\n ts: Date.now(),\n eventType: 'testBegin',\n test: testRef(test),\n });\n }\n\n onTestEnd(test: TestCase, result: TestResult) {\n emit({\n v: 1,\n ts: Date.now(),\n eventType: 'testEnd',\n test: testRef(test),\n result: {\n status: result.status,\n expectedStatus: result.expectedStatus,\n duration: result.duration,\n errors: serializeErrors(result),\n },\n });\n }\n\n onStepBegin(test: TestCase, result: TestResult, step: TestStep) {\n // Filter out hooks, fixtures, and internal operations\n if (!shouldIncludeStep(step)) {\n return;\n }\n\n const id = this.stepIds.get(step) ?? this.nextStepId++;\n this.stepIds.set(step, id);\n\n const depth = this.stepDepths.get(step) ?? (step.parent ? (this.stepDepths.get(step.parent) ?? 0) + 1 : 0);\n this.stepDepths.set(step, depth);\n\n emit({\n v: 1,\n ts: Date.now(),\n eventType: 'stepBegin',\n test: testRef(test),\n step: {\n id,\n title: step.title,\n category: (step as any).category,\n depth,\n location: safeLocation((step as any).location),\n },\n });\n }\n\n onStepEnd(test: TestCase, result: TestResult, step: TestStep) {\n // Filter out hooks, fixtures, and internal operations\n if (!shouldIncludeStep(step)) {\n return;\n }\n\n const id = this.stepIds.get(step) ?? this.nextStepId++;\n this.stepIds.set(step, id);\n\n const err = (step as any).error;\n emit({\n v: 1,\n ts: Date.now(),\n eventType: 'stepEnd',\n test: testRef(test),\n step: {\n id,\n duration: (step as any).duration,\n error: err ? (typeof err.message === 'string' ? err.message : String(err)) : null,\n location: safeLocation((step as any).location),\n },\n });\n }\n}\n`;\n}\n//# sourceMappingURL=codegen.js.map","// --- Code generation API utilities for Probo Labs Playwright scripts ---\nimport { \n ApiClient, \n Interaction, \n ElementInfo,\n RecorderSettings,\n DEFAULT_RECORDER_SETTINGS,\n generateCode,\n CodeGeneratorOptions,\n PlaywrightAction,\n ServerResponse,\n ApplyAIStatus,\n ScrollableContainer,\n WaitForConfig,\n TotpConfig,\n SmartSelector\n} from '@probolabs/probo-shared';\n\n/**\n * Options for code generation\n */\nexport interface CodeGenOptions {\n useDefaultSettings?: boolean;\n recorderSettings?: RecorderSettings;\n viewPort?: { width: number; height: number };\n}\n\n/**\n * Result of generating code for a test suite\n */\nexport interface TestSuiteCodeGenResult {\n testSuiteId: number;\n testSuiteName: string;\n scenarios: Array<{\n scenarioId: number;\n scenarioName: string;\n code: string;\n }>;\n}\n\n/**\n * Backend API response format for scenario interactions\n */\ninterface BackendScenarioResponse {\n id: number;\n name: string;\n interactions: BackendInteraction[];\n parameterTable?: Record<string, string>[];\n viewPort?: { width: number; height: number };\n}\n\n/**\n * Backend API response format for test suite\n */\ninterface BackendTestSuiteResponse {\n id: number;\n name: string;\n scenarios: Array<{\n id: number;\n name: string;\n }>;\n}\n\n/**\n * Backend interaction format (from RecorderInteractionSerializer)\n */\ninterface BackendInteraction {\n interactionId: string;\n nativeDescription: string;\n isNativeDescriptionElaborate: boolean;\n action: string;\n argument: string | string[] | null;\n text?: string;\n css_selector?: string;\n iframe_selector?: string;\n smart_selector?: SmartSelector | null;\n smart_iframe_selector?: SmartSelector | null;\n nativeName: string;\n parameterName: string;\n elementInfo?: ElementInfo | null;\n stepId: number;\n base_screenshot_url?: string | null;\n candidates_screenshot_url?: string | null;\n actual_interaction_screenshot_url?: string | null;\n url: string;\n candidate_elements?: ElementInfo[];\n html?: string;\n replay_status?: string | null;\n apply_ai_status?: string | null;\n syncStatus: string;\n recordingId?: string | null;\n last_replay_timestamp?: number | null;\n index?: number;\n serverResponse?: ServerResponse | null;\n annotation?: string;\n scrollableContainers?: ScrollableContainer[];\n waitForConfig?: WaitForConfig;\n totpConfig?: TotpConfig;\n isSecret?: boolean;\n}\n\n/**\n * ProboCodeGenerator - Handles fetching test suite/scenario data and generating Playwright code\n */\nexport class ProboCodeGenerator {\n /**\n * Normalize API URL by removing trailing slash\n */\n private static normalizeApiUrl(apiUrl: string): string {\n return apiUrl.replace(/\\/+$/, '');\n }\n\n private static async readResponseErrorText(response: Response): Promise<string> {\n try {\n const contentType = response.headers.get('content-type');\n if (contentType && contentType.includes('application/json')) {\n const errorData: any = await response.json();\n return errorData.error || errorData.detail || JSON.stringify(errorData);\n }\n\n let errorText = await response.text();\n // Truncate HTML error pages to first 200 chars\n if (errorText.length > 200) {\n errorText = errorText.substring(0, 200) + '...';\n }\n return errorText;\n } catch (e) {\n // Best-effort fallback\n return `HTTP ${response.status}`;\n }\n }\n\n /**\n * Fetch scenario data from the backend API\n */\n private static async fetchScenarioData(\n scenarioId: number,\n apiToken: string,\n apiUrl: string\n ): Promise<BackendScenarioResponse> {\n const normalizedUrl = this.normalizeApiUrl(apiUrl);\n const url = `${normalizedUrl}/api/scenarios/${scenarioId}/interactions`;\n \n const response = await fetch(url, {\n method: 'GET',\n headers: {\n 'Authorization': `Token ${apiToken}`,\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n const errorText = await this.readResponseErrorText(response);\n throw new Error(`Failed to fetch scenario ${scenarioId}: ${response.status} ${errorText}`);\n }\n\n return response.json();\n }\n\n /**\n * Fetch test suite data from the backend API\n */\n private static async fetchTestSuiteData(\n testSuiteId: number,\n apiToken: string,\n apiUrl: string\n ): Promise<BackendTestSuiteResponse> {\n const normalizedUrl = this.normalizeApiUrl(apiUrl);\n // Note: test-suites endpoint doesn't have /api/ prefix (it's from the router at root level)\n const url = `${normalizedUrl}/test-suites/${testSuiteId}/`;\n \n const response = await fetch(url, {\n method: 'GET',\n headers: {\n 'Authorization': `Token ${apiToken}`,\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n const errorText = await this.readResponseErrorText(response);\n throw new Error(`Failed to fetch test suite ${testSuiteId}: ${response.status} ${errorText}`);\n }\n\n return response.json();\n }\n\n /**\n * Convert backend interaction format to Interaction[] format\n */\n private static convertBackendInteractionsToInteractionFormat(\n backendInteractions: BackendInteraction[]\n ): Interaction[] {\n return backendInteractions.map((backendInteraction) => {\n // Convert action string to PlaywrightAction enum\n const action = backendInteraction.action as PlaywrightAction;\n \n // Convert apply_ai_status string to enum if present\n let applyAiStatus: ApplyAIStatus | null = null;\n if (backendInteraction.apply_ai_status) {\n applyAiStatus = backendInteraction.apply_ai_status as ApplyAIStatus;\n }\n\n // Build elementInfo from backend data\n const elementInfo: ElementInfo | null = backendInteraction.elementInfo || null;\n\n // Build interaction object\n const interaction: Interaction = {\n interactionId: backendInteraction.interactionId,\n action: action,\n argument: backendInteraction.argument || '',\n elementInfo: elementInfo,\n iframe_selector: backendInteraction.iframe_selector,\n css_selector: backendInteraction.css_selector,\n smart_selector: backendInteraction.smart_selector || undefined,\n smart_iframe_selector: backendInteraction.smart_iframe_selector || undefined,\n url: backendInteraction.url,\n timestamp: backendInteraction.last_replay_timestamp || Date.now(),\n base_screenshot_url: backendInteraction.base_screenshot_url,\n actual_interaction_screenshot_url: backendInteraction.actual_interaction_screenshot_url,\n candidates_screenshot_url: backendInteraction.candidates_screenshot_url,\n candidate_elements: backendInteraction.candidate_elements || [],\n recordingId: backendInteraction.recordingId,\n syncStatus: backendInteraction.syncStatus,\n serverResponse: backendInteraction.serverResponse || null,\n nativeName: backendInteraction.nativeName,\n nativeDescription: backendInteraction.nativeDescription,\n isNativeDescriptionElaborate: backendInteraction.isNativeDescriptionElaborate,\n parameterName: backendInteraction.parameterName,\n annotation: backendInteraction.annotation,\n last_replay_timestamp: backendInteraction.last_replay_timestamp,\n replay_status: backendInteraction.replay_status,\n apply_ai_status: applyAiStatus,\n error: null,\n index: backendInteraction.index,\n html: backendInteraction.html,\n stepId: backendInteraction.stepId,\n scrollableContainers: backendInteraction.scrollableContainers,\n stdout: undefined,\n waitForConfig: backendInteraction.waitForConfig,\n totpConfig: backendInteraction.totpConfig,\n isSecret: backendInteraction.isSecret || false,\n };\n\n return interaction;\n });\n }\n\n /**\n * Get default recorder settings for code generation\n */\n private static getDefaultRecorderSettings(): RecorderSettings {\n return {\n ...DEFAULT_RECORDER_SETTINGS,\n // Override with sensible defaults for code generation\n enableSmartSelectors: true,\n debugLevel: 'INFO',\n enableConsoleLogs: false,\n };\n }\n\n /**\n * Get default viewport dimensions\n */\n private static getDefaultViewPort(): { width: number; height: number } {\n return { width: 1280, height: 720 };\n }\n\n /**\n * Generate code for a single scenario\n * Fetches scenario data, converts to Interaction[], generates code\n */\n static async generateCodeForScenario(\n scenarioId: number,\n apiToken: string,\n apiUrl: string,\n options?: CodeGenOptions\n ): Promise<string> {\n // Validate inputs\n if (!apiToken) {\n throw new Error('API token is required');\n }\n if (!apiUrl) {\n throw new Error('API URL is required');\n }\n\n // Fetch scenario data\n const scenarioData = await this.fetchScenarioData(scenarioId, apiToken, apiUrl);\n\n // Convert backend interactions to Interaction[] format\n const interactions = this.convertBackendInteractionsToInteractionFormat(scenarioData.interactions || []);\n\n // Get settings and viewport\n const settings = options?.recorderSettings || this.getDefaultRecorderSettings();\n const viewPort = options?.viewPort || scenarioData.viewPort || this.getDefaultViewPort();\n\n // Get parameter table rows\n const rows = scenarioData.parameterTable || [];\n\n // Generate code\n const codeOptions: CodeGeneratorOptions = {\n scenarioName: scenarioData.name,\n interactions: interactions,\n rows: rows,\n };\n\n return generateCode(codeOptions, settings, viewPort);\n }\n\n /**\n * Generate code for all scenarios in a test suite\n * Returns map of scenario names to generated code\n */\n static async generateCodeForTestSuite(\n testSuiteId: number,\n apiToken: string,\n apiUrl: string,\n options?: CodeGenOptions\n ): Promise<TestSuiteCodeGenResult> {\n // Validate inputs\n if (!apiToken) {\n throw new Error('API token is required');\n }\n if (!apiUrl) {\n throw new Error('API URL is required');\n }\n\n // Fetch test suite data\n const testSuiteData = await this.fetchTestSuiteData(testSuiteId, apiToken, apiUrl);\n\n // Generate code for each scenario\n const scenarioResults = await Promise.all(\n testSuiteData.scenarios.map(async (scenario) => {\n try {\n const code = await this.generateCodeForScenario(\n scenario.id,\n apiToken,\n apiUrl,\n options\n );\n return {\n scenarioId: scenario.id,\n scenarioName: scenario.name,\n code: code,\n };\n } catch (error: any) {\n // Log error but continue with other scenarios\n console.error(`Failed to generate code for scenario ${scenario.id}: ${error.message}`);\n throw error; // Re-throw to fail fast for now\n }\n })\n );\n\n return {\n testSuiteId: testSuiteData.id,\n testSuiteName: testSuiteData.name,\n scenarios: scenarioResults,\n };\n }\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\nimport { exec, spawn } from 'child_process';\nimport { promisify } from 'util';\nimport AdmZip from 'adm-zip';\nimport fetch from 'node-fetch';\nimport { ProboCodeGenerator, TestSuiteCodeGenResult } from './codegen-api.js';\nimport { generatePackageJson, generatePlaywrightConfig, generateProboReporter, slugify } from '@probolabs/probo-shared';\n\nconst execAsync = promisify(exec);\n\n/**\n * Result of running a test suite\n */\nexport interface TestSuiteRunResult {\n success: boolean;\n exitCode: number;\n stdout: string;\n stderr: string;\n error?: string;\n runId?: number;\n}\n\n/**\n * Test statistics parsed from Playwright output\n */\nexport interface TestStatistics {\n passed: number;\n failed: number;\n skipped: number;\n}\n\n/**\n * Options for running a test suite\n */\nexport interface TestSuiteRunOptions {\n outputDir?: string;\n includeReporter?: boolean;\n playwrightArgs?: string[];\n onStatusUpdate?: (updates: Partial<{\n status: string;\n exit_code: number;\n error_message: string;\n stdout: string;\n stderr: string;\n tests_total: number;\n tests_passed: number;\n tests_failed: number;\n tests_skipped: number;\n }>) => void | Promise<void>;\n onStdout?: (chunk: string) => void | Promise<void>;\n onStderr?: (chunk: string) => void | Promise<void>;\n onReporterEvent?: (event: any) => void | Promise<void>;\n}\n\n/**\n * Ensures a directory exists, creating it recursively if needed\n */\nfunction ensureDirectoryExists(dir: string): void {\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n}\n\n/**\n * Gets the default test suite directory path\n */\nfunction getDefaultTestSuiteDir(testSuiteId: number, testSuiteName?: string): string {\n const baseDir = path.join(os.homedir(), '.probium', 'test-suites');\n if (testSuiteName) {\n const sanitizedName = slugify(testSuiteName);\n return path.join(baseDir, `${testSuiteId}-${sanitizedName}`);\n }\n return path.join(baseDir, testSuiteId.toString());\n}\n\n/**\n * Count total tests by scanning spec files\n */\nfunction countTotalTests(testSuiteDir: string): number {\n const testsDir = path.join(testSuiteDir, 'tests');\n if (!fs.existsSync(testsDir)) {\n return 0;\n }\n \n let totalTests = 0;\n const specFiles = fs.readdirSync(testsDir).filter(f => f.endsWith('.spec.ts'));\n \n for (const specFile of specFiles) {\n const filePath = path.join(testsDir, specFile);\n const content = fs.readFileSync(filePath, 'utf-8');\n \n // Count test() and it() calls\n const testMatches = content.match(/\\btest\\s*\\(/g);\n const itMatches = content.match(/\\bit\\s*\\(/g);\n \n if (testMatches) totalTests += testMatches.length;\n if (itMatches) totalTests += itMatches.length;\n \n // If no matches, assume at least 1 test per file\n if (!testMatches && !itMatches) {\n totalTests += 1;\n }\n }\n \n return totalTests;\n}\n\n/**\n * Parse Playwright statistics from stdout\n */\nfunction parsePlaywrightStatistics(stdout: string): TestStatistics {\n // Try to find final summary line: \"X passed\" or \"X passed, Y failed\" etc.\n const summaryMatch = stdout.match(/(\\d+)\\s+passed(?:,\\s*(\\d+)\\s+failed)?(?:,\\s*(\\d+)\\s+skipped)?/);\n \n if (summaryMatch) {\n return {\n passed: parseInt(summaryMatch[1]) || 0,\n failed: parseInt(summaryMatch[2]) || 0,\n skipped: parseInt(summaryMatch[3]) || 0,\n };\n }\n \n // Fallback: count individual test results\n const passed = (stdout.match(/✓/g) || []).length;\n const failed = (stdout.match(/✘/g) || []).length;\n const skipped = (stdout.match(/-\\s+test/g) || []).length;\n \n return { passed, failed, skipped };\n}\n\n/**\n * Parse statistics from Playwright HTML report metadata (most reliable)\n */\nfunction parseStatisticsFromMetadata(testSuiteDir: string): TestStatistics | null {\n try {\n const reportDir = path.join(testSuiteDir, 'playwright-report');\n const metadataPath = path.join(reportDir, 'data', 'metadata.json');\n if (!fs.existsSync(metadataPath)) {\n return null;\n }\n \n const metadata = JSON.parse(fs.readFileSync(metadataPath, 'utf-8'));\n return {\n passed: metadata.passed || 0,\n failed: metadata.failed || 0,\n skipped: metadata.skipped || 0,\n };\n } catch (error) {\n console.warn('⚠️ Could not parse metadata.json:', error);\n return null;\n }\n}\n\n/**\n * Zip a directory using adm-zip\n */\nasync function zipDirectory(sourceDir: string, outputPath: string): Promise<void> {\n try {\n const zip = new AdmZip();\n \n // Add all files from the source directory recursively\n zip.addLocalFolder(sourceDir);\n \n // Write zip file\n zip.writeZip(outputPath);\n \n const stats = fs.statSync(outputPath);\n console.log(`✅ Zipped ${stats.size} bytes`);\n } catch (error) {\n console.error(`❌ Error zipping directory: ${error}`);\n throw error;\n }\n}\n\n/**\n * Upload artifact to backend\n */\nasync function uploadArtifact(\n runId: number,\n testSuiteId: number,\n filePath: string,\n artifactType: string,\n name: string,\n apiToken: string,\n apiUrl: string\n): Promise<void> {\n const fileStats = fs.statSync(filePath);\n const fileSize = fileStats.size;\n \n // Determine content type\n const contentTypes: { [key: string]: string } = {\n 'html_report': 'application/zip',\n 'test_results': 'application/zip',\n 'log_file': 'text/plain',\n 'video': 'video/webm',\n 'screenshot': 'image/png',\n };\n const contentType = contentTypes[artifactType] || 'application/octet-stream';\n \n // Read file as buffer (like screenshot uploads)\n const fileBuffer = fs.readFileSync(filePath);\n \n // Upload directly to Django backend (like screenshots - raw binary)\n // FileUploadParser requires Content-Disposition header with filename\n const response = await fetch(`${apiUrl}/test-suites/${testSuiteId}/runs/${runId}/upload_artifact/`, {\n method: 'POST',\n headers: {\n 'Authorization': `Token ${apiToken}`,\n 'Content-Type': contentType,\n 'Content-Disposition': `attachment; filename=\"${name}\"`,\n 'X-Artifact-Type': artifactType,\n 'X-Artifact-Name': name,\n },\n body: fileBuffer,\n });\n \n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Failed to upload artifact: ${response.status} ${errorText}`);\n }\n \n console.log(`✅ Uploaded artifact: ${name} (${(fileSize / 1024 / 1024).toFixed(2)} MB)`);\n}\n\n/**\n * Update run status via API\n */\nasync function updateRunStatus(\n runId: number,\n testSuiteId: number,\n updates: Partial<{\n status: string;\n exit_code: number;\n error_message: string;\n stdout: string;\n stderr: string;\n steps: Array<{\n id: number;\n title: string;\n depth: number;\n status: 'running' | 'passed' | 'failed';\n error?: string | null;\n }>;\n tests_total: number;\n tests_passed: number;\n tests_failed: number;\n tests_skipped: number;\n }>,\n apiToken: string,\n apiUrl: string\n): Promise<void> {\n // Ensure apiUrl doesn't have trailing slash\n const baseUrl = apiUrl.endsWith('/') ? apiUrl.slice(0, -1) : apiUrl;\n const url = `${baseUrl}/test-suites/${testSuiteId}/runs/${runId}/`;\n const body = JSON.stringify(updates);\n \n const headers: Record<string, string> = {\n 'Authorization': `Token ${apiToken}`,\n 'Content-Type': 'application/json',\n };\n \n try {\n const response = await fetch(url, {\n method: 'PATCH',\n headers: headers,\n body: body,\n });\n \n if (!response.ok) {\n const errorText = await response.text();\n console.warn(`⚠️ Failed to update run status: ${response.status} ${errorText}`);\n }\n } catch (error) {\n console.error(`❌ Error updating run status:`, error);\n }\n}\n\n/**\n * TestSuiteRunner - Handles test suite file generation and execution\n */\nexport class TestSuiteRunner {\n /**\n * Lookup test suite ID by name and project\n */\n static async lookupTestSuiteByName(\n testSuiteName: string,\n projectName: string,\n apiToken: string,\n apiUrl: string\n ): Promise<number> {\n const baseUrl = apiUrl.endsWith('/') ? apiUrl.slice(0, -1) : apiUrl;\n const url = `${baseUrl}/test-suites/?name=${encodeURIComponent(testSuiteName)}&project=${encodeURIComponent(projectName)}`;\n \n const response = await fetch(url, {\n method: 'GET',\n headers: {\n 'Authorization': `Token ${apiToken}`,\n 'Content-Type': 'application/json',\n },\n });\n \n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Failed to lookup test suite: ${response.status} ${errorText}`);\n }\n \n const data = await response.json();\n if (Array.isArray(data) && data.length > 0) {\n return data[0].id;\n }\n \n if (data.results && Array.isArray(data.results) && data.results.length > 0) {\n return data.results[0].id;\n }\n \n throw new Error(`Test suite \"${testSuiteName}\" not found in project \"${projectName}\"`);\n }\n\n /**\n * Generate all files for a test suite\n */\n static async generateTestSuiteFiles(\n testSuiteId: number,\n apiToken: string,\n apiUrl: string,\n outputDir?: string,\n testSuiteName?: string,\n includeReporter: boolean = true,\n runId?: number\n ): Promise<void> {\n const testSuiteDir = outputDir || getDefaultTestSuiteDir(testSuiteId, testSuiteName);\n \n // Generate code for all scenarios\n const codeGenResult = await ProboCodeGenerator.generateCodeForTestSuite(\n testSuiteId,\n apiToken,\n apiUrl\n );\n\n if (codeGenResult.scenarios.length === 0) {\n throw new Error(`No scenarios found in test suite ${testSuiteId}. Cannot generate test files.`);\n }\n\n // Ensure directories exist\n ensureDirectoryExists(testSuiteDir);\n const testsDir = path.join(testSuiteDir, 'tests');\n ensureDirectoryExists(testsDir);\n\n // Save each scenario's code to a .spec.ts file\n for (const scenario of codeGenResult.scenarios) {\n const fileName = `${slugify(scenario.scenarioName)}.spec.ts`;\n const filePath = path.join(testsDir, fileName);\n fs.writeFileSync(filePath, scenario.code, 'utf-8');\n console.log(`✅ Generated test file: ${filePath}`);\n }\n\n // Generate package.json\n await this.generatePackageJson(testSuiteDir, codeGenResult);\n\n // Generate playwright.config.ts with runId if available\n await this.generatePlaywrightConfig(testSuiteDir, includeReporter, runId);\n\n // Generate custom reporter file for live progress streaming (only if requested)\n if (includeReporter) {\n await this.generateProboReporter(testSuiteDir);\n }\n }\n\n /**\n * Generate package.json file\n */\n static async generatePackageJson(\n outputDir: string,\n codeGenResult: TestSuiteCodeGenResult\n ): Promise<void> {\n // Check if any scenario has secrets by examining the generated code\n // We'll check for dotenv imports in the generated code (check for multiple patterns to be robust)\n let hasSecrets = codeGenResult.scenarios.some(scenario => {\n const code = scenario.code;\n return code.includes(\"from 'dotenv'\") || \n code.includes('from \"dotenv\"') ||\n code.includes(\"import { config } from 'dotenv'\") ||\n code.includes('import { config } from \"dotenv\"') ||\n code.includes(\"require('dotenv')\") ||\n code.includes('require(\"dotenv\")');\n });\n \n // Fallback: if not detected in codeGenResult, check the actual written files\n // This handles edge cases where the code might have been modified or generated differently\n if (!hasSecrets) {\n const testsDir = path.join(outputDir, 'tests');\n if (fs.existsSync(testsDir)) {\n const specFiles = fs.readdirSync(testsDir).filter(f => f.endsWith('.spec.ts'));\n for (const specFile of specFiles) {\n const filePath = path.join(testsDir, specFile);\n const content = fs.readFileSync(filePath, 'utf-8');\n if (content.includes(\"from 'dotenv'\") || \n content.includes('from \"dotenv\"') ||\n content.includes(\"import { config } from 'dotenv'\") ||\n content.includes('import { config } from \"dotenv\"')) {\n hasSecrets = true;\n break;\n }\n }\n }\n }\n\n const sanitizedName = slugify(codeGenResult.testSuiteName);\n \n const packageJsonContent = generatePackageJson({\n name: sanitizedName,\n hasSecrets: hasSecrets,\n testScript: 'npx playwright test'\n });\n\n const filePath = path.join(outputDir, 'package.json');\n fs.writeFileSync(filePath, packageJsonContent, 'utf-8');\n console.log(`✅ Generated package.json: ${filePath}`);\n }\n\n /**\n * Generate playwright.config.ts file\n */\n static async generatePlaywrightConfig(outputDir: string, includeReporter: boolean = true, runId?: number): Promise<void> {\n const configContent = generatePlaywrightConfig(includeReporter, runId);\n\n const filePath = path.join(outputDir, 'playwright.config.ts');\n fs.writeFileSync(filePath, configContent, 'utf-8');\n console.log(`✅ Generated playwright.config.ts: ${filePath}`);\n }\n\n /**\n * Generate Probo custom Playwright reporter (for live step/test events)\n */\n static async generateProboReporter(outputDir: string): Promise<void> {\n const reporterContent = generateProboReporter();\n const filePath = path.join(outputDir, 'probo-reporter.ts');\n fs.writeFileSync(filePath, reporterContent, 'utf-8');\n console.log(`✅ Generated probo-reporter.ts: ${filePath}`);\n }\n\n /**\n * Run a test suite\n * Generates files, installs dependencies, and executes tests\n */\n static async runTestSuite(\n testSuiteId: number,\n apiToken: string,\n apiUrl: string,\n testSuiteName?: string,\n runId?: number,\n options: TestSuiteRunOptions = {}\n ): Promise<TestSuiteRunResult> {\n const {\n outputDir,\n includeReporter = true,\n playwrightArgs = [],\n onStatusUpdate,\n onStdout,\n onStderr,\n onReporterEvent,\n } = options;\n \n const testSuiteDir = outputDir || getDefaultTestSuiteDir(testSuiteId, testSuiteName);\n let currentRunId = runId;\n\n try {\n // Create run record if not provided (needed for run-specific report directories)\n if (!currentRunId) {\n try {\n const createResponse = await fetch(`${apiUrl}/test-suites/${testSuiteId}/runs/`, {\n method: 'POST',\n headers: {\n 'Authorization': `Token ${apiToken}`,\n 'Content-Type': 'application/json',\n },\n });\n \n if (createResponse.ok) {\n const runData = await createResponse.json();\n currentRunId = runData.id;\n console.log(`✅ Created test suite run: ${currentRunId}`);\n } else {\n console.warn('⚠️ Failed to create run record, continuing without tracking');\n }\n } catch (error) {\n console.warn('⚠️ Failed to create run record:', error);\n }\n }\n\n // Generate all files (with runId if available for run-specific report directories)\n console.log(`📝 Generating test suite files for test suite ${testSuiteId}...`);\n await this.generateTestSuiteFiles(testSuiteId, apiToken, apiUrl, testSuiteDir, testSuiteName, includeReporter, currentRunId);\n\n // Count total tests\n const testsTotal = countTotalTests(testSuiteDir);\n if (currentRunId && testsTotal > 0) {\n await updateRunStatus(currentRunId, testSuiteId, { tests_total: testsTotal }, apiToken, apiUrl);\n if (onStatusUpdate) {\n await onStatusUpdate({ tests_total: testsTotal });\n }\n }\n\n // Install dependencies\n console.log(`📦 Installing dependencies in ${testSuiteDir}...`);\n try {\n const { stdout: installStdout, stderr: installStderr } = await execAsync(\n 'npm install',\n { cwd: testSuiteDir, timeout: 300000 } // 5 minute timeout for install\n );\n console.log('✅ Dependencies installed successfully');\n if (installStdout) console.log(installStdout);\n if (installStderr) console.warn(installStderr);\n } catch (installError: any) {\n console.error('❌ Failed to install dependencies:', installError);\n const errorMsg = `Failed to install dependencies: ${installError.message}`;\n if (currentRunId) {\n await updateRunStatus(\n currentRunId,\n testSuiteId,\n {\n status: 'error',\n exit_code: installError.code || 1,\n error_message: errorMsg,\n stderr: installError.stderr || installError.message || '',\n },\n apiToken,\n apiUrl\n );\n if (onStatusUpdate) {\n await onStatusUpdate({\n status: 'error',\n exit_code: installError.code || 1,\n error_message: errorMsg,\n stderr: installError.stderr || installError.message || '',\n });\n }\n }\n return {\n success: false,\n exitCode: installError.code || 1,\n stdout: installError.stdout || '',\n stderr: installError.stderr || installError.message || '',\n error: errorMsg,\n runId: currentRunId,\n };\n }\n\n // Run Playwright tests with streaming output\n console.log(`🚀 Running Playwright tests in ${testSuiteDir}...`);\n if (playwrightArgs.length > 0) {\n console.log(`🧪 Playwright extra args: ${playwrightArgs.join(' ')}`);\n }\n\n return new Promise<TestSuiteRunResult>(async (resolve) => {\n let stdout = '';\n let stderr = '';\n let hasResolved = false;\n let lastStatsUpdate = 0;\n let stdoutLineBuffer = '';\n const PROBO_REPORTER_PREFIX = '__PROBO_REPORTER_EVENT__';\n const reporterStats: TestStatistics = { passed: 0, failed: 0, skipped: 0 };\n let lastReporterStatsUpdate = 0;\n const REPORTER_STATS_UPDATE_INTERVAL = 1500; // throttle API updates from reporter events\n const STATS_UPDATE_INTERVAL = 10000; // Update stats every 10 seconds\n const STEPS_UPDATE_INTERVAL = 2000; // Update steps every 2 seconds\n let lastStepsUpdate = 0;\n const collectedSteps: Array<{\n id: number;\n title: string;\n depth: number;\n status: 'running' | 'passed' | 'failed';\n error?: string | null;\n }> = [];\n\n // Use spawn for streaming output\n const testProcess = spawn('npx', ['playwright', 'test', ...playwrightArgs], {\n cwd: testSuiteDir,\n shell: true,\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n\n // Stream stdout line by line\n testProcess.stdout?.on('data', async (data: Buffer) => {\n const chunk = data.toString();\n stdoutLineBuffer += chunk;\n\n // Process complete lines so we can intercept reporter events without polluting logs.\n const parts = stdoutLineBuffer.split(/\\n/);\n stdoutLineBuffer = parts.pop() ?? '';\n\n let forwarded = '';\n\n for (const rawLine of parts) {\n const line = rawLine.endsWith('\\r') ? rawLine.slice(0, -1) : rawLine;\n if (line.startsWith(PROBO_REPORTER_PREFIX)) {\n const jsonPart = line.slice(PROBO_REPORTER_PREFIX.length);\n try {\n const reporterEvent = JSON.parse(jsonPart);\n\n // Call reporter event callback if provided\n if (onReporterEvent) {\n await onReporterEvent(reporterEvent);\n }\n\n // Collect steps from reporter events\n if (reporterEvent?.eventType === 'stepBegin') {\n const step = reporterEvent?.step;\n const id = typeof step?.id === 'number' ? step.id : null;\n const title = typeof step?.title === 'string' ? step.title : null;\n const depth = typeof step?.depth === 'number' ? step.depth : 0;\n if (id && title) {\n // Check if step already exists (update) or add new\n const existingIndex = collectedSteps.findIndex(s => s.id === id);\n if (existingIndex === -1) {\n collectedSteps.push({ id, title, depth, status: 'running' });\n }\n }\n }\n\n if (reporterEvent?.eventType === 'stepEnd') {\n const step = reporterEvent?.step;\n const id = typeof step?.id === 'number' ? step.id : null;\n if (id) {\n const error = typeof step?.error === 'string' ? step.error : null;\n const existingIndex = collectedSteps.findIndex(s => s.id === id);\n if (existingIndex !== -1) {\n // Update existing step with final status\n collectedSteps[existingIndex] = {\n ...collectedSteps[existingIndex],\n status: error ? 'failed' : 'passed',\n error: error || null,\n };\n }\n // If step doesn't exist, ignore (stepBegin should have been called first)\n }\n }\n\n // Save steps periodically\n if (currentRunId) {\n const now = Date.now();\n if (now - lastStepsUpdate > STEPS_UPDATE_INTERVAL) {\n lastStepsUpdate = now;\n await updateRunStatus(\n currentRunId,\n testSuiteId,\n { steps: [...collectedSteps] },\n apiToken,\n apiUrl\n );\n }\n }\n\n // Keep a more reliable running tally than parsing stdout.\n if (currentRunId && reporterEvent?.eventType === 'testEnd' && reporterEvent?.result?.status) {\n const status = reporterEvent.result.status as string;\n if (status === 'passed') reporterStats.passed += 1;\n else if (status === 'failed' || status === 'timedout' || status === 'interrupted') reporterStats.failed += 1;\n else if (status === 'skipped') reporterStats.skipped += 1;\n\n const now = Date.now();\n if (now - lastReporterStatsUpdate > REPORTER_STATS_UPDATE_INTERVAL) {\n lastReporterStatsUpdate = now;\n await updateRunStatus(\n currentRunId,\n testSuiteId,\n {\n tests_passed: reporterStats.passed,\n tests_failed: reporterStats.failed,\n tests_skipped: reporterStats.skipped,\n },\n apiToken,\n apiUrl\n );\n if (onStatusUpdate) {\n await onStatusUpdate({\n tests_passed: reporterStats.passed,\n tests_failed: reporterStats.failed,\n tests_skipped: reporterStats.skipped,\n });\n }\n }\n }\n } catch {\n // If parsing fails, ignore and don't forward to logs.\n }\n continue;\n }\n\n forwarded += rawLine + '\\n';\n }\n\n if (forwarded) {\n stdout += forwarded;\n // Call stdout callback if provided\n if (onStdout) {\n await onStdout(forwarded);\n }\n }\n\n // Parse and update statistics periodically\n if (currentRunId) {\n const now = Date.now();\n // Only use stdout parsing as a fallback (in case reporter isn't loaded).\n if (now - lastStatsUpdate > STATS_UPDATE_INTERVAL && now - lastReporterStatsUpdate > REPORTER_STATS_UPDATE_INTERVAL) {\n lastStatsUpdate = now;\n const stats = parsePlaywrightStatistics(stdout);\n await updateRunStatus(\n currentRunId,\n testSuiteId,\n {\n tests_passed: stats.passed,\n tests_failed: stats.failed,\n tests_skipped: stats.skipped,\n },\n apiToken,\n apiUrl\n );\n if (onStatusUpdate) {\n await onStatusUpdate({\n tests_passed: stats.passed,\n tests_failed: stats.failed,\n tests_skipped: stats.skipped,\n });\n }\n }\n }\n });\n\n // Stream stderr line by line\n testProcess.stderr?.on('data', async (data: Buffer) => {\n const chunk = data.toString();\n stderr += chunk;\n // Call stderr callback if provided\n if (onStderr) {\n await onStderr(chunk);\n }\n });\n\n // Handle process completion\n testProcess.on('close', async (code) => {\n if (hasResolved) return;\n hasResolved = true;\n\n // Flush any remaining buffered stdout (may be a partial last line)\n if (stdoutLineBuffer) {\n const remaining = stdoutLineBuffer;\n stdoutLineBuffer = '';\n if (remaining.startsWith(PROBO_REPORTER_PREFIX)) {\n try {\n const reporterEvent = JSON.parse(remaining.slice(PROBO_REPORTER_PREFIX.length));\n if (onReporterEvent) {\n await onReporterEvent(reporterEvent);\n }\n if (currentRunId && reporterEvent?.eventType === 'testEnd' && reporterEvent?.result?.status) {\n const status = reporterEvent.result.status as string;\n if (status === 'passed') reporterStats.passed += 1;\n else if (status === 'failed' || status === 'timedout' || status === 'interrupted') reporterStats.failed += 1;\n else if (status === 'skipped') reporterStats.skipped += 1;\n }\n } catch {\n // ignore\n }\n } else {\n stdout += remaining;\n if (onStdout) {\n await onStdout(remaining);\n }\n }\n }\n\n const exitCode = code ?? 1;\n const success = exitCode === 0;\n const isTestFailure = exitCode === 1 && stdout.length > 0;\n\n console.log(success ? '✅ Tests completed successfully' : (isTestFailure ? '⚠️ Tests completed with failures' : '❌ Test execution failed'));\n\n // Parse final statistics from metadata/stdout as fallback\n let parsedStats: TestStatistics | null = null;\n if (fs.existsSync(path.join(testSuiteDir, 'playwright-report'))) {\n parsedStats = parseStatisticsFromMetadata(testSuiteDir);\n }\n if (!parsedStats) {\n parsedStats = parsePlaywrightStatistics(stdout);\n }\n\n // Use reporterStats as source of truth (tracked from real-time events)\n // Fall back to parsed stats only if reporterStats is empty\n const totalFromReporter = reporterStats.passed + reporterStats.failed + reporterStats.skipped;\n const finalStats = totalFromReporter > 0 ? reporterStats : (parsedStats || { passed: 0, failed: 0, skipped: 0 });\n\n // Update run status with final steps\n if (currentRunId) {\n const finalStatus = success ? 'success' : 'error';\n await updateRunStatus(\n currentRunId,\n testSuiteId,\n {\n status: finalStatus,\n exit_code: exitCode,\n stdout: stdout,\n stderr: stderr,\n steps: [...collectedSteps], // Save final steps state\n error_message: success || isTestFailure ? undefined : `Test execution failed with exit code ${exitCode}`,\n tests_passed: finalStats.passed,\n tests_failed: finalStats.failed,\n tests_skipped: finalStats.skipped,\n },\n apiToken,\n apiUrl\n );\n if (onStatusUpdate) {\n await onStatusUpdate({\n status: finalStatus,\n exit_code: exitCode,\n stdout: stdout,\n stderr: stderr,\n tests_passed: finalStats.passed,\n tests_failed: finalStats.failed,\n tests_skipped: finalStats.skipped,\n });\n }\n\n // Artifact uploads disabled - reports are now accessed locally via trace viewer\n // Upload artifacts functionality preserved but disabled\n // await this.uploadArtifacts(currentRunId, testSuiteId, testSuiteDir, apiToken, apiUrl);\n }\n\n resolve({\n success: success,\n exitCode: exitCode,\n stdout: stdout,\n stderr: stderr,\n // Only set error if it's not a success and not a test failure (i.e., real execution error)\n error: success || isTestFailure ? undefined : `Test execution failed with exit code ${exitCode}`,\n runId: currentRunId,\n });\n });\n\n // Handle process errors\n testProcess.on('error', async (error: Error) => {\n if (hasResolved) return;\n hasResolved = true;\n\n const errorMessage = error.message || String(error);\n stderr += errorMessage;\n \n console.error('❌ Test execution failed:', error);\n\n // Update run status\n if (currentRunId) {\n await updateRunStatus(\n currentRunId,\n testSuiteId,\n {\n status: 'error',\n exit_code: 1,\n error_message: `Test execution failed: ${errorMessage}`,\n stderr: stderr,\n },\n apiToken,\n apiUrl\n );\n if (onStatusUpdate) {\n await onStatusUpdate({\n status: 'error',\n exit_code: 1,\n error_message: `Test execution failed: ${errorMessage}`,\n stderr: stderr,\n });\n }\n }\n\n resolve({\n success: false,\n exitCode: 1,\n stdout: stdout,\n stderr: stderr,\n error: `Test execution failed: ${errorMessage}`,\n runId: currentRunId,\n });\n });\n\n // Set timeout (1 hour)\n setTimeout(async () => {\n if (!hasResolved) {\n hasResolved = true;\n testProcess.kill();\n \n const errorMessage = 'Test execution timed out after 1 hour';\n stderr += errorMessage;\n \n // Update run status\n if (currentRunId) {\n await updateRunStatus(\n currentRunId,\n testSuiteId,\n {\n status: 'error',\n exit_code: 1,\n error_message: errorMessage,\n stderr: stderr,\n },\n apiToken,\n apiUrl\n );\n if (onStatusUpdate) {\n await onStatusUpdate({\n status: 'error',\n exit_code: 1,\n error_message: errorMessage,\n stderr: stderr,\n });\n }\n }\n\n resolve({\n success: false,\n exitCode: 1,\n stdout: stdout,\n stderr: stderr,\n error: errorMessage,\n runId: currentRunId,\n });\n }\n }, 3600000); // 1 hour timeout\n });\n } catch (error: any) {\n console.error('❌ Error running test suite:', error);\n const errorMsg = error.message || String(error);\n if (currentRunId) {\n await updateRunStatus(\n currentRunId,\n testSuiteId,\n {\n status: 'error',\n exit_code: 1,\n error_message: errorMsg,\n },\n apiToken,\n apiUrl\n ).catch(() => {}); // Ignore errors updating status\n if (onStatusUpdate) {\n try {\n const result = onStatusUpdate({\n status: 'error',\n exit_code: 1,\n error_message: errorMsg,\n });\n if (result && typeof result.then === 'function') {\n await result.catch(() => {});\n }\n } catch {\n // Ignore errors in status update callback\n }\n }\n }\n return {\n success: false,\n exitCode: 1,\n stdout: '',\n stderr: errorMsg,\n error: errorMsg,\n runId: currentRunId,\n };\n }\n }\n\n /**\n * Upload artifacts for a test suite run\n * \n * NOTE: This method is preserved for potential future use but is currently disabled.\n * Artifacts are now accessed locally via the trace viewer instead of being uploaded to the backend.\n */\n static async uploadArtifacts(\n runId: number,\n testSuiteId: number,\n testSuiteDir: string,\n apiToken: string,\n apiUrl: string\n ): Promise<void> {\n // Artifact uploads disabled - reports are now accessed locally via trace viewer\n // Method signature preserved for potential future re-enablement\n return;\n }\n}\n","import { TestSuiteRunner } from './test-suite-runner.js';\n\nexport interface CLIOptions {\n testSuiteId?: number;\n testSuiteName?: string;\n project?: string;\n outputDir?: string;\n apiKey?: string;\n apiEndpoint?: string;\n playwrightArgs?: string[];\n}\n\nexport async function runCLI(options: CLIOptions): Promise<void> {\n const apiToken = options.apiKey || process.env.PROBO_API_KEY;\n if (!apiToken) {\n console.error('❌ Error: PROBO_API_KEY environment variable or --api-key flag is required');\n process.exit(1);\n }\n\n const apiUrl = options.apiEndpoint || process.env.PROBO_API_ENDPOINT || 'https://api.probolabs.ai';\n \n let testSuiteId: number;\n \n // Resolve test suite ID\n if (options.testSuiteId) {\n testSuiteId = options.testSuiteId;\n } else if (options.testSuiteName) {\n if (!options.project) {\n console.error('❌ Error: --project is required when using --test-suite-name');\n process.exit(1);\n }\n try {\n console.log(`🔍 Looking up test suite \"${options.testSuiteName}\" in project \"${options.project}\"...`);\n testSuiteId = await TestSuiteRunner.lookupTestSuiteByName(\n options.testSuiteName,\n options.project,\n apiToken,\n apiUrl\n );\n console.log(`✅ Found test suite ID: ${testSuiteId}`);\n } catch (error: any) {\n console.error(`❌ Error looking up test suite: ${error.message}`);\n process.exit(1);\n }\n } else {\n console.error('❌ Error: Either --test-suite-id or --test-suite-name must be provided');\n process.exit(1);\n }\n\n // Run the test suite\n try {\n const result = await TestSuiteRunner.runTestSuite(\n testSuiteId,\n apiToken,\n apiUrl,\n options.testSuiteName,\n undefined, // runId - will be created automatically\n {\n outputDir: options.outputDir,\n includeReporter: false, // CI/CD mode - no custom reporter\n playwrightArgs: options.playwrightArgs,\n // Stream stdout/stderr to console in real-time\n onStdout: (chunk: string) => {\n process.stdout.write(chunk);\n },\n onStderr: (chunk: string) => {\n process.stderr.write(chunk);\n },\n }\n );\n\n if (result.success) {\n console.log('✅ Test suite completed successfully');\n process.exit(0);\n } else {\n console.error(`❌ Test suite failed with exit code ${result.exitCode}`);\n if (result.error) {\n console.error(`Error: ${result.error}`);\n }\n \n // Print stdout/stderr to help debug failures\n // Always print to see what was captured, even if empty\n console.log(`\\n--- STDOUT (${result.stdout.length} chars) ---`);\n if (result.stdout.trim()) {\n console.log(result.stdout);\n } else {\n console.log('(empty)');\n }\n \n console.error(`\\n--- STDERR (${result.stderr.length} chars) ---`);\n if (result.stderr.trim()) {\n console.error(result.stderr);\n } else {\n console.error('(empty)');\n }\n \n process.exit(result.exitCode || 1);\n }\n } catch (error: any) {\n console.error(`❌ Error running test suite: ${error.message}`);\n process.exit(1);\n }\n}\n"],"names":["fetch"],"mappings":";;;;;;;;AAAO,IAAI,aAAa,CAAC;AACzB,CAAC,UAAU,aAAa,EAAE;AAC1B,IAAI,aAAa,CAAC,eAAe,CAAC,GAAG,eAAe,CAAC;AACrD,IAAI,aAAa,CAAC,iBAAiB,CAAC,GAAG,iBAAiB,CAAC;AACzD,IAAI,aAAa,CAAC,eAAe,CAAC,GAAG,eAAe,CAAC;AACrD,IAAI,aAAa,CAAC,YAAY,CAAC,GAAG,YAAY,CAAC;AAC/C,IAAI,aAAa,CAAC,cAAc,CAAC,GAAG,cAAc,CAAC;AACnD,IAAI,aAAa,CAAC,YAAY,CAAC,GAAG,YAAY,CAAC;AAC/C,IAAI,aAAa,CAAC,gBAAgB,CAAC,GAAG,gBAAgB,CAAC;AACvD,IAAI,aAAa,CAAC,oBAAoB,CAAC,GAAG,oBAAoB,CAAC;AAC/D,IAAI,aAAa,CAAC,mBAAmB,CAAC,GAAG,mBAAmB,CAAC;AAC7D,IAAI,aAAa,CAAC,eAAe,CAAC,GAAG,eAAe,CAAC;AACrD,CAAC,EAAE,aAAa,KAAK,aAAa,GAAG,EAAE,CAAC,CAAC,CAAC;AACnC,IAAI,YAAY,CAAC;AACxB,CAAC,UAAU,YAAY,EAAE;AACzB,IAAI,YAAY,CAAC,cAAc,CAAC,GAAG,cAAc,CAAC;AAClD,IAAI,YAAY,CAAC,gBAAgB,CAAC,GAAG,gBAAgB,CAAC;AACtD,IAAI,YAAY,CAAC,cAAc,CAAC,GAAG,cAAc,CAAC;AAClD,IAAI,YAAY,CAAC,kBAAkB,CAAC,GAAG,kBAAkB,CAAC;AAC1D,CAAC,EAAE,YAAY,KAAK,YAAY,GAAG,EAAE,CAAC,CAAC;;ACnBvC;AACO,IAAI,gBAAgB,CAAC;AAC5B,CAAC,UAAU,gBAAgB,EAAE;AAC7B,IAAI,gBAAgB,CAAC,gBAAgB,CAAC,GAAG,gBAAgB,CAAC;AAC1D,IAAI,gBAAgB,CAAC,WAAW,CAAC,GAAG,WAAW,CAAC;AAChD,IAAI,gBAAgB,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;AACxC,IAAI,gBAAgB,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC;AAC5C,IAAI,gBAAgB,CAAC,iBAAiB,CAAC,GAAG,iBAAiB,CAAC;AAC5D,IAAI,gBAAgB,CAAC,0BAA0B,CAAC,GAAG,0BAA0B,CAAC;AAC9E,IAAI,gBAAgB,CAAC,gBAAgB,CAAC,GAAG,gBAAgB,CAAC;AAC1D,IAAI,gBAAgB,CAAC,cAAc,CAAC,GAAG,cAAc,CAAC;AACtD,IAAI,gBAAgB,CAAC,eAAe,CAAC,GAAG,eAAe,CAAC;AACxD,IAAI,gBAAgB,CAAC,YAAY,CAAC,GAAG,YAAY,CAAC;AAClD,IAAI,gBAAgB,CAAC,WAAW,CAAC,GAAG,WAAW,CAAC;AAChD,IAAI,gBAAgB,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;AACxC,IAAI,gBAAgB,CAAC,oBAAoB,CAAC,GAAG,oBAAoB,CAAC;AAClE,IAAI,gBAAgB,CAAC,uBAAuB,CAAC,GAAG,uBAAuB,CAAC;AACxE,IAAI,gBAAgB,CAAC,YAAY,CAAC,GAAG,YAAY,CAAC;AAClD,IAAI,gBAAgB,CAAC,mBAAmB,CAAC,GAAG,mBAAmB,CAAC;AAChE,IAAI,gBAAgB,CAAC,eAAe,CAAC,GAAG,eAAe,CAAC;AACxD,IAAI,gBAAgB,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC;AAC1C,IAAI,gBAAgB,CAAC,gBAAgB,CAAC,GAAG,gBAAgB,CAAC;AAC1D,IAAI,gBAAgB,CAAC,cAAc,CAAC,GAAG,cAAc,CAAC;AACtD,IAAI,gBAAgB,CAAC,UAAU,CAAC,GAAG,UAAU,CAAC;AAC9C,IAAI,gBAAgB,CAAC,cAAc,CAAC,GAAG,cAAc,CAAC;AACtD,IAAI,gBAAgB,CAAC,UAAU,CAAC,GAAG,UAAU,CAAC;AAC9C;AACA,IAAI,gBAAgB,CAAC,gBAAgB,CAAC,GAAG,gBAAgB,CAAC;AAC1D,IAAI,gBAAgB,CAAC,cAAc,CAAC,GAAG,cAAc,CAAC;AACtD,CAAC,EAAE,gBAAgB,KAAK,gBAAgB,GAAG,EAAE,CAAC,CAAC;;ACiH/C;AACA,IAAI,WAAW,CAAC;AAChB,CAAC,UAAU,WAAW,EAAE;AACxB,IAAI,WAAW,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;AAC/B,IAAI,WAAW,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAC7B,IAAI,WAAW,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;AACnC,CAAC,EAAE,WAAW,KAAK,WAAW,GAAG,EAAE,CAAC,CAAC;;ACpJrC;AACO,IAAI,qBAAqB,CAAC;AACjC,CAAC,UAAU,qBAAqB,EAAE;AAClC,IAAI,qBAAqB,CAAC,oCAAoC,CAAC,GAAG,oCAAoC,CAAC;AACvG,IAAI,qBAAqB,CAAC,sCAAsC,CAAC,GAAG,sCAAsC,CAAC;AAC3G,IAAI,qBAAqB,CAAC,oCAAoC,CAAC,GAAG,oCAAoC,CAAC;AACvG,IAAI,qBAAqB,CAAC,wCAAwC,CAAC,GAAG,wCAAwC,CAAC;AAC/G,IAAI,qBAAqB,CAAC,0CAA0C,CAAC,GAAG,0CAA0C,CAAC;AACnH,IAAI,qBAAqB,CAAC,wCAAwC,CAAC,GAAG,wCAAwC,CAAC;AAC/G,IAAI,qBAAqB,CAAC,0BAA0B,CAAC,GAAG,0BAA0B,CAAC;AACnF,IAAI,qBAAqB,CAAC,4BAA4B,CAAC,GAAG,4BAA4B,CAAC;AACvF,IAAI,qBAAqB,CAAC,0BAA0B,CAAC,GAAG,0BAA0B,CAAC;AACnF,IAAI,qBAAqB,CAAC,8BAA8B,CAAC,GAAG,8BAA8B,CAAC;AAC3F,IAAI,qBAAqB,CAAC,gCAAgC,CAAC,GAAG,gCAAgC,CAAC;AAC/F,IAAI,qBAAqB,CAAC,4BAA4B,CAAC,GAAG,4BAA4B,CAAC;AACvF,IAAI,qBAAqB,CAAC,0BAA0B,CAAC,GAAG,0BAA0B,CAAC;AACnF,IAAI,qBAAqB,CAAC,wCAAwC,CAAC,GAAG,wCAAwC,CAAC;AAC/G,IAAI,qBAAqB,CAAC,oCAAoC,CAAC,GAAG,oCAAoC,CAAC;AACvG,IAAI,qBAAqB,CAAC,eAAe,CAAC,GAAG,eAAe,CAAC;AAC7D,IAAI,qBAAqB,CAAC,sBAAsB,CAAC,GAAG,sBAAsB,CAAC;AAC3E,IAAI,qBAAqB,CAAC,oBAAoB,CAAC,GAAG,oBAAoB,CAAC;AACvE,IAAI,qBAAqB,CAAC,yBAAyB,CAAC,GAAG,yBAAyB,CAAC;AACjF,IAAI,qBAAqB,CAAC,sBAAsB,CAAC,GAAG,sBAAsB,CAAC;AAC3E,IAAI,qBAAqB,CAAC,+BAA+B,CAAC,GAAG,+BAA+B,CAAC;AAC7F,CAAC,EAAE,qBAAqB,KAAK,qBAAqB,GAAG,EAAE,CAAC,CAAC;;ACvBzD;AACA;AACA;AACO,IAAI,aAAa,CAAC;AACzB,CAAC,UAAU,aAAa,EAAE;AAC1B,IAAI,aAAa,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;AACrC,IAAI,aAAa,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;AACnC,IAAI,aAAa,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;AACjC,IAAI,aAAa,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;AACnC,IAAI,aAAa,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;AACrC,CAAC,EAAE,aAAa,KAAK,aAAa,GAAG,EAAE,CAAC,CAAC,CAAC;AAC1C,MAAM,aAAa,GAAG;AACtB,IAAI,CAAC,aAAa,CAAC,KAAK,GAAG,CAAC;AAC5B,IAAI,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC;AAC3B,IAAI,CAAC,aAAa,CAAC,GAAG,GAAG,CAAC;AAC1B,IAAI,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC;AAC3B,IAAI,CAAC,aAAa,CAAC,KAAK,GAAG,CAAC;AAC5B,CAAC,CAAC;AACK,MAAM,WAAW,CAAC;AACzB,IAAI,WAAW,CAAC,MAAM,EAAE,KAAK,GAAG,aAAa,CAAC,IAAI,EAAE;AACpD,QAAQ,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;AAC7B,QAAQ,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;AAC3B,KAAK;AACL,IAAI,WAAW,CAAC,KAAK,EAAE;AACvB,QAAQ,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,wBAAwB,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5F,QAAQ,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;AAC3B,KAAK;AACL,IAAI,SAAS,CAAC,KAAK,EAAE;AACrB,QAAQ,OAAO,aAAa,CAAC,KAAK,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACjE,KAAK;AACL,IAAI,QAAQ,CAAC,KAAK,EAAE;AACpB,QAAQ,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;AAC/B,QAAQ,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAC9D,QAAQ,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAClE,QAAQ,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAClE,QAAQ,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAC5E,QAAQ,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;AAC9F,KAAK;AACL,IAAI,KAAK,CAAC,GAAG,IAAI,EAAE,EAAE,IAAI,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC;AAC5D,QAAQ,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,EAAE;AACrE,IAAI,IAAI,CAAC,GAAG,IAAI,EAAE,EAAE,IAAI,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC;AAC1D,QAAQ,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,EAAE;AACnE,IAAI,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE,IAAI,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,GAAG,CAAC;AACxD,QAAQ,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,EAAE;AACjE,IAAI,IAAI,CAAC,GAAG,IAAI,EAAE,EAAE,IAAI,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC;AAC1D,QAAQ,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,EAAE;AACnE,IAAI,KAAK,CAAC,GAAG,IAAI,EAAE,EAAE,IAAI,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC;AAC5D,QAAQ,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,EAAE;AACrE,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK;AACrC,IAAI,OAAO;AACX,QAAQ,gBAAgB,CAAC,aAAa;AACtC,QAAQ,gBAAgB,CAAC,MAAM;AAC/B,QAAQ,gBAAgB,CAAC,cAAc;AACvC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AACzB,CAAC,CAAC;AACK,MAAM,2BAA2B,GAAG,CAAC,CAAC,KAAK;AAClD,IAAI,QAAQ,CAAC,CAAC,MAAM;AACpB,QAAQ,KAAK,gBAAgB,CAAC,aAAa,CAAC;AAC5C,QAAQ,KAAK,gBAAgB,CAAC,cAAc;AAC5C,YAAY,OAAO,CAAC,CAAC,aAAa,CAAC;AACnC,QAAQ,KAAK,gBAAgB,CAAC,MAAM;AACpC,YAAY,OAAO,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;AAC3D,QAAQ;AACR,YAAY,OAAO,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,CAAC;AACpE,YAAY,OAAO,EAAE,CAAC;AACtB,KAAK;AACL,CAAC,CAAC;AACF;AACO,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK;AACxC,IAAI,MAAM,sBAAsB,GAAG;AACnC,QAAQ,gBAAgB,CAAC,OAAO;AAChC,QAAQ,gBAAgB,CAAC,eAAe;AACxC,QAAQ,gBAAgB,CAAC,UAAU;AACnC,QAAQ,gBAAgB,CAAC,qBAAqB;AAC9C,QAAQ,gBAAgB,CAAC,kBAAkB;AAC3C,QAAQ,gBAAgB,CAAC,SAAS;AAClC,QAAQ,gBAAgB,CAAC,UAAU;AACnC,QAAQ,gBAAgB,CAAC,YAAY;AACrC,QAAQ,gBAAgB,CAAC,QAAQ;AACjC,QAAQ,gBAAgB,CAAC,QAAQ;AACjC,QAAQ,gBAAgB,CAAC,YAAY;AACrC,KAAK,CAAC;AACN,IAAI,OAAO,sBAAsB,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,gBAAgB,CAAC,MAAM,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC;AAC7G,CAAC,CAAC;AACF;AACO,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK;AAC3B,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;AAC/B,IAAI,OAAO,CAAC,CAAC,WAAW,EAAE,WAAW,EAAE,gBAAgB,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;AAC3E,SAAS,CAAC,CAAC,MAAM,KAAK,gBAAgB,CAAC,MAAM;AAC7C,aAAa,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,cAAc,MAAM,IAAI,IAAI,EAAE,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,MAAM,MAAM,IAAI,IAAI,EAAE,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,MAAM,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,cAAc,MAAM,IAAI,IAAI,EAAE,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,MAAM,MAAM,IAAI,IAAI,EAAE,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,cAAc,MAAM,IAAI,IAAI,EAAE,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,MAAM,MAAM,IAAI,IAAI,EAAE,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1Z,CAAC,CAAC;AAmBK,SAAS,iBAAiB,CAAC,GAAG,EAAE;AACvC,IAAI,IAAI,CAAC,GAAG;AACZ,QAAQ,OAAO,EAAE,CAAC;AAClB,IAAI,OAAO,CAAC,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3C,CAAC;AA4BD;AACA;AACA;AACA;AACO,SAAS,OAAO,CAAC,IAAI,EAAE;AAC9B,IAAI,IAAI,CAAC,IAAI;AACb,QAAQ,OAAO,UAAU,CAAC;AAC1B,IAAI,OAAO,IAAI;AACf,SAAS,WAAW,EAAE;AACtB,SAAS,IAAI,EAAE;AACf,SAAS,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC;AACxC,SAAS,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;AAC5B,SAAS,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;AAC9B,SAAS,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAC3B;;AC7MyB,IAAI,WAAW,CAAC,WAAW;;ACFpD;AACA;AACA;AACO,IAAI,OAAO,CAAC;AACnB,CAAC,UAAU,OAAO,EAAE;AACpB,IAAI,OAAO,CAAC,YAAY,CAAC,GAAG,YAAY,CAAC;AACzC,IAAI,OAAO,CAAC,iBAAiB,CAAC,GAAG,iBAAiB,CAAC;AACnD,IAAI,OAAO,CAAC,kBAAkB,CAAC,GAAG,kBAAkB,CAAC;AACrD,IAAI,OAAO,CAAC,kBAAkB,CAAC,GAAG,kBAAkB,CAAC;AACrD,IAAI,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;AAC7B,IAAI,OAAO,CAAC,WAAW,CAAC,GAAG,WAAW,CAAC;AACvC,IAAI,OAAO,CAAC,YAAY,CAAC,GAAG,YAAY,CAAC;AACzC,IAAI,OAAO,CAAC,mBAAmB,CAAC,GAAG,mBAAmB,CAAC;AACvD,IAAI,OAAO,CAAC,kBAAkB,CAAC,GAAG,kBAAkB,CAAC;AACrD,IAAI,OAAO,CAAC,iBAAiB,CAAC,GAAG,iBAAiB,CAAC;AACnD,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC;AACjC,IAAI,OAAO,CAAC,eAAe,CAAC,GAAG,eAAe,CAAC;AAC/C,IAAI,OAAO,CAAC,aAAa,CAAC,GAAG,aAAa,CAAC;AAC3C,CAAC,EAAE,OAAO,KAAK,OAAO,GAAG,EAAE,CAAC,CAAC;;AClBtB,MAAM,iCAAiC,GAAG;AACjD,IAAI,gBAAgB,EAAE,GAAG;AACzB,IAAI,uBAAuB,EAAE,IAAI;AACjC,IAAI,2BAA2B,EAAE,KAAK;AACtC,IAAI,wBAAwB,EAAE,IAAI;AAClC;AACA,IAAI,gBAAgB,EAAE,GAAG;AACzB,IAAI,oBAAoB,EAAE,IAAI;AAC9B;AACA,IAAI,+BAA+B,EAAE,IAAI;AACzC,IAAI,kCAAkC,EAAE,IAAI;AAC5C,IAAI,8BAA8B,EAAE,KAAK;AACzC;AACA,IAAI,4BAA4B,EAAE,IAAI;AACtC,IAAI,4BAA4B,EAAE,GAAG;AACrC,IAAI,6BAA6B,EAAE,KAAK;AACxC,IAAI,uBAAuB,EAAE,KAAK;AAClC,IAAI,aAAa,EAAE,MAAM;AACzB,CAAC;;ACjBM,MAAM,yBAAyB,GAAG;AACzC;AACA,IAAI,MAAM,EAAE,EAAE;AACd,IAAI,WAAW,EAAE,0BAA0B;AAC3C,IAAI,WAAW,EAAE,0BAA0B;AAC3C,IAAI,OAAO,EAAE,SAAS;AACtB;AACA,IAAI,YAAY,EAAE,eAAe;AACjC,IAAI,UAAU,EAAE,SAAS;AACzB,IAAI,OAAO,EAAE,iBAAiB;AAC9B,IAAI,cAAc,EAAE,CAAC;AACrB;AACA,IAAI,wBAAwB,EAAE,IAAI;AAClC,IAAI,oBAAoB,EAAE,IAAI;AAC9B;AACA,IAAI,aAAa,EAAE,iCAAiC,CAAC,aAAa;AAClE;AACA,IAAI,iBAAiB,EAAE,IAAI;AAC3B,IAAI,UAAU,EAAE,OAAO;AACvB;AACA,IAAI,GAAG,iCAAiC;AACxC,CAAC;;ACtBD;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,sBAAsB,CAAC,IAAI,EAAE;AAC7C,IAAI,MAAM,OAAO,GAAG,IAAI,GAAG,EAAE,CAAC;AAC9B;AACA,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;AAC5D,QAAQ,OAAO,OAAO,CAAC;AACvB,KAAK;AACL;AACA;AACA;AACA,IAAI,MAAM,aAAa,GAAG,kDAAkD,CAAC;AAC7E;AACA,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,KAAK;AAC1B,QAAQ,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;AAC5C,YAAY,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,KAAK;AAClD,gBAAgB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AAC/C,oBAAoB,IAAI,KAAK,CAAC;AAC9B,oBAAoB,OAAO,CAAC,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE;AACzE,wBAAwB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;AAC/D,wBAAwB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAC7C,qBAAqB;AACrB;AACA,oBAAoB,aAAa,CAAC,SAAS,GAAG,CAAC,CAAC;AAChD,iBAAiB;AACjB,aAAa,CAAC,CAAC;AACf,SAAS;AACT,KAAK,CAAC,CAAC;AACP,IAAI,OAAO,OAAO,CAAC;AACnB,CAAC;AAUD;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,uBAAuB,CAAC,WAAW,EAAE;AAC9C,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;AACnD,IAAI,MAAM,QAAQ,GAAG,CAAC,CAAC,EAAE,GAAG,WAAW,CAAC,WAAW,MAAM,IAAI,IAAI,EAAE,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,YAAY,KAAK,EAAE,CAAC;AACjH,IAAI,MAAM,MAAM,GAAG,CAAC,CAAC,EAAE,GAAG,WAAW,CAAC,WAAW,MAAM,IAAI,IAAI,EAAE,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,eAAe,KAAK,EAAE,CAAC;AAClH,IAAI,MAAM,aAAa,GAAG,CAAC,CAAC,EAAE,GAAG,WAAW,CAAC,WAAW,MAAM,IAAI,IAAI,EAAE,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,cAAc,KAAK,IAAI,CAAC;AAC1H,IAAI,MAAM,mBAAmB,GAAG,CAAC,CAAC,EAAE,GAAG,WAAW,CAAC,WAAW,MAAM,IAAI,IAAI,EAAE,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,qBAAqB,KAAK,IAAI,CAAC;AACvI,IAAI,MAAM,QAAQ,GAAG,iBAAiB,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,aAAa,CAAC,CAAC,GAAG,iBAAiB,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;AACrI;AACA,IAAI,MAAM,eAAe,GAAG,WAAW,CAAC,iBAAiB,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AACtG,IAAI,MAAM,OAAO,GAAG,CAAC;AACrB,WAAW,EAAE,WAAW,CAAC,iBAAiB,CAAC,EAAE,WAAW,CAAC,UAAU,GAAG,CAAC,yBAAyB,EAAE,WAAW,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;AAClI,IAAI,QAAQ,WAAW,CAAC,MAAM;AAC9B,QAAQ,KAAK,gBAAgB,CAAC,KAAK,CAAC;AACpC,QAAQ,KAAK,gBAAgB,CAAC,cAAc,CAAC;AAC7C,QAAQ,KAAK,gBAAgB,CAAC,YAAY,CAAC;AAC3C,QAAQ,KAAK,gBAAgB,CAAC,OAAO,CAAC;AACtC,QAAQ,KAAK,gBAAgB,CAAC,SAAS,CAAC;AACxC,QAAQ,KAAK,gBAAgB,CAAC,UAAU,CAAC;AACzC,QAAQ,KAAK,gBAAgB,CAAC,eAAe,CAAC;AAC9C,QAAQ,KAAK,gBAAgB,CAAC,qBAAqB,CAAC;AACpD,QAAQ,KAAK,gBAAgB,CAAC,kBAAkB,CAAC;AACjD,QAAQ,KAAK,gBAAgB,CAAC,KAAK,CAAC;AACpC,QAAQ,KAAK,gBAAgB,CAAC,iBAAiB,CAAC;AAChD,QAAQ,KAAK,gBAAgB,CAAC,YAAY,CAAC;AAC3C,QAAQ,KAAK,gBAAgB,CAAC,SAAS,CAAC;AACxC,QAAQ,KAAK,gBAAgB,CAAC,cAAc,CAAC;AAC7C,QAAQ,KAAK,gBAAgB,CAAC,UAAU,CAAC;AACzC,QAAQ,KAAK,gBAAgB,CAAC,QAAQ,CAAC;AACvC,QAAQ,KAAK,gBAAgB,CAAC,YAAY,CAAC;AAC3C,QAAQ,KAAK,gBAAgB,CAAC,QAAQ;AACtC,YAAY,MAAM,IAAI,GAAG;AACzB,gBAAgB,CAAC,yBAAyB,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;AAChE,gBAAgB,IAAI,QAAQ,GAAG,CAAC,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;AAC9D,gBAAgB,IAAI,MAAM,GAAG,CAAC,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;AAClE,gBAAgB,IAAI,QAAQ,GAAG,CAAC,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;AACvE,gBAAgB,IAAI,aAAa,GAAG,CAAC,CAAC,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;AAC7F,gBAAgB,IAAI,mBAAmB,GAAG,CAAC,CAAC,qBAAqB,EAAE,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;AAC/G,gBAAgB,IAAI,WAAW,CAAC,UAAU,GAAG,CAAC,CAAC,aAAa,EAAE,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;AAC9F,gBAAgB,IAAI,CAAC,CAAC,EAAE,GAAG,WAAW,CAAC,aAAa,MAAM,IAAI,IAAI,EAAE,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,eAAe,IAAI,CAAC,CAAC,iBAAiB,EAAE,CAAC,EAAE,GAAG,WAAW,CAAC,aAAa,MAAM,IAAI,IAAI,EAAE,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;AACvO,gBAAgB,IAAI,CAAC,CAAC,EAAE,GAAG,WAAW,CAAC,aAAa,MAAM,IAAI,IAAI,EAAE,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC,EAAE,GAAG,WAAW,CAAC,aAAa,MAAM,IAAI,IAAI,EAAE,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;AAC/M;AACA,gBAAgB,IAAI,WAAW,CAAC,MAAM,KAAK,gBAAgB,CAAC,QAAQ,GAAG,CAAC,CAAC,sBAAsB,EAAE,CAAC,CAAC,EAAE,GAAG,WAAW,CAAC,UAAU,MAAM,IAAI,IAAI,EAAE,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,MAAM,KAAK,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,GAAG,WAAW,CAAC,UAAU,MAAM,IAAI,IAAI,EAAE,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,KAAK,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;AAC5S,aAAa,CAAC;AACd,YAAY,OAAO,CAAC,EAAE,OAAO,CAAC;AAC9B,yBAAyB,EAAE,eAAe,CAAC;AAC3C;AACA,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;AAC3C;AACA,WAAW,CAAC,CAAC;AACb,QAAQ,KAAK,gBAAgB,CAAC,aAAa;AAC3C,YAAY,MAAM,cAAc,GAAG,2BAA2B,CAAC,WAAW,CAAC,CAAC;AAC5E,YAAY,OAAO,CAAC,EAAE,OAAO,CAAC;AAC9B,yBAAyB,EAAE,eAAe,CAAC;AAC3C,gBAAgB,EAAE,cAAc,CAAC;AACjC,6BAA6B,EAAE,MAAM,CAAC;AACtC,8BAA8B,EAAE,QAAQ,CAAC;AACzC,2BAA2B,EAAE,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;AAC3D,iCAAiC,EAAE,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;AACvE,qBAAqB,EAAE,WAAW,CAAC,MAAM,CAAC;AAC1C,yBAAyB,EAAE,CAAC,EAAE,GAAG,WAAW,CAAC,UAAU,MAAM,IAAI,IAAI,EAAE,KAAK,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;AAC7F;AACA,iBAAiB,EAAE,cAAc,CAAC,KAAK,EAAE,cAAc,CAAC;AACxD,WAAW,CAAC,CAAC;AACb,QAAQ,KAAK,gBAAgB,CAAC,cAAc;AAC5C,YAAY,OAAO,yBAAyB,CAAC,WAAW,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC;AACpF,QAAQ;AACR,YAAY,OAAO,CAAC,qBAAqB,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AACnE,KAAK;AACL,CAAC;AACD,SAAS,qBAAqB,CAAC,WAAW,EAAE;AAC5C,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;AACnB,IAAI,MAAM,aAAa,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,WAAW,CAAC,cAAc,MAAM,IAAI,IAAI,EAAE,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,MAAM,MAAM,IAAI,IAAI,EAAE,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,MAAM,MAAM,IAAI,IAAI,EAAE,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AACrO,IAAI,MAAM,QAAQ,GAAG,iBAAiB,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AACzH;AACA,IAAI,MAAM,eAAe,GAAG,WAAW,CAAC,iBAAiB,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AACtG,IAAI,MAAM,OAAO,GAAG,CAAC;AACrB,WAAW,EAAE,WAAW,CAAC,iBAAiB,CAAC,EAAE,WAAW,CAAC,UAAU,GAAG,CAAC,yBAAyB,EAAE,WAAW,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;AAClI,IAAI,IAAI,WAAW,CAAC,MAAM,KAAK,gBAAgB,CAAC,aAAa,EAAE;AAC/D,QAAQ,MAAM,cAAc,GAAG,2BAA2B,CAAC,WAAW,CAAC,CAAC;AACxE,QAAQ,OAAO,CAAC,EAAE,OAAO,CAAC;AAC1B,uBAAuB,EAAE,eAAe,CAAC;AACzC,cAAc,EAAE,cAAc,CAAC,8BAA8B,EAAE,aAAa,CAAC,mBAAmB,EAAE,WAAW,CAAC,MAAM,CAAC;AACrH,eAAe,EAAE,cAAc,CAAC,KAAK,EAAE,cAAc,CAAC;AACtD,SAAS,CAAC,CAAC;AACX,KAAK;AACL,SAAS,IAAI,WAAW,CAAC,MAAM,KAAK,gBAAgB,CAAC,qBAAqB;AAC1E,QAAQ,WAAW,CAAC,MAAM,KAAK,gBAAgB,CAAC,kBAAkB,EAAE;AACpE,QAAQ,OAAO,CAAC,EAAE,OAAO,CAAC;AAC1B,uBAAuB,EAAE,eAAe,CAAC;AACzC,mCAAmC,EAAE,aAAa,CAAC,GAAG,EAAE,QAAQ,CAAC,YAAY,EAAE,WAAW,CAAC,MAAM,CAAC;AAClG,SAAS,CAAC,CAAC;AACX,KAAK;AACL,SAAS,IAAI,WAAW,CAAC,MAAM,KAAK,gBAAgB,CAAC,SAAS,EAAE;AAChE,QAAQ,OAAO,CAAC,EAAE,OAAO,CAAC;AAC1B,uBAAuB,EAAE,eAAe,CAAC;AACzC,mCAAmC,EAAE,WAAW,CAAC,iBAAiB,CAAC,GAAG,EAAE,QAAQ,CAAC,YAAY,EAAE,WAAW,CAAC,MAAM,CAAC;AAClH,SAAS,CAAC,CAAC;AACX,KAAK;AACL,SAAS,IAAI,WAAW,CAAC,MAAM,KAAK,gBAAgB,CAAC,MAAM,EAAE;AAC7D,QAAQ,MAAM,eAAe,GAAG,WAAW,CAAC,iBAAiB,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AACnF,QAAQ,MAAM,SAAS,GAAG,2BAA2B,CAAC,WAAW,CAAC,CAAC;AACnE;AACA,QAAQ,MAAM,YAAY,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;AAC7F,QAAQ,OAAO,CAAC,EAAE,OAAO,CAAC;AAC1B,yBAAyB,EAAE,eAAe,CAAC;AAC3C,gBAAgB,EAAE,SAAS,CAAC,4BAA4B,EAAE,eAAe,CAAC,GAAG,EAAE,YAAY,CAAC,EAAE,QAAQ,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC,GAAG,EAAE,CAAC;AAC9H,iBAAiB,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC;AAC9C,WAAW,CAAC,CAAC;AACb,KAAK;AACL,SAAS,IAAI,WAAW,CAAC,MAAM,KAAK,gBAAgB,CAAC,cAAc,EAAE;AACrE,QAAQ,OAAO,yBAAyB,CAAC,WAAW,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC;AAChF,KAAK;AACL,SAAS;AACT,QAAQ,OAAO,CAAC,EAAE,OAAO,CAAC;AAC1B,uBAAuB,EAAE,eAAe,CAAC;AACzC,QAAQ,EAAE,QAAQ,GAAG,CAAC,2BAA2B,EAAE,aAAa,CAAC,GAAG,EAAE,QAAQ,CAAC,YAAY,EAAE,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,2BAA2B,EAAE,aAAa,CAAC,mBAAmB,EAAE,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAClN,SAAS,CAAC,CAAC;AACX,KAAK;AACL,CAAC;AACD,SAAS,yBAAyB,CAAC,WAAW,EAAE,OAAO,EAAE,eAAe,EAAE;AAC1E,IAAI,IAAI,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,QAAQ,CAAC;AAC1G,IAAI,MAAM,aAAa,GAAG,2BAA2B,CAAC,WAAW,CAAC,CAAC;AACnE;AACA,IAAI,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,uBAAuB,EAAE,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;AACvF;AACA,IAAI,UAAU,GAAG,UAAU,CAAC,OAAO,EAAE,CAAC;AACtC;AACA,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC;AACpC,QAAQ,UAAU,GAAG,UAAU,GAAG,GAAG,CAAC;AACtC;AACA,IAAI,MAAM,YAAY,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,KAAK,GAAG,KAAK,CAAC,GAAG,IAAI,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACxH,IAAI,OAAO,CAAC,EAAE,OAAO,CAAC;AACtB,yBAAyB,EAAE,eAAe,CAAC;AAC3C,cAAc,EAAE,aAAa,CAAC;AAC9B;AACA,YAAY,EAAE,YAAY,CAAC;AAC3B;AACA;AACA;AACA;AACA,iBAAiB,EAAE,aAAa,CAAC,KAAK,EAAE,aAAa,CAAC;AACtD,WAAW,CAAC,CAAC;AACb,CAAC;AACD,SAAS,cAAc,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE;AACrD,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;AACvB,IAAI,MAAM,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;AAC5D,IAAI,MAAM,iBAAiB,GAAG,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,WAAW,KAAK,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;AAC5F,IAAI,MAAM,qBAAqB,GAAG,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,WAAW,KAAK,WAAW,CAAC,MAAM,KAAK,gBAAgB,CAAC,cAAc,CAAC,CAAC;AACrI;AACA,IAAI,MAAM,KAAK,GAAG,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,WAAW,KAAK;AAC5D,QAAQ,IAAI,IAAI,CAAC,WAAW,CAAC;AAC7B,YAAY,OAAO,qBAAqB,CAAC,WAAW,CAAC,CAAC;AACtD,QAAQ,OAAO,uBAAuB,CAAC,WAAW,CAAC,CAAC;AACpD,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAClB;AACA,IAAI,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAAE,CAAC;AAC1C,IAAI,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,WAAW,KAAK;AAClD,QAAQ,IAAI,cAAc,CAAC,WAAW,CAAC,EAAE;AACzC,YAAY,MAAM,OAAO,GAAG,2BAA2B,CAAC,WAAW,CAAC,CAAC;AACrE,YAAY,IAAI,OAAO,EAAE;AACzB,gBAAgB,mBAAmB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AACjD,aAAa;AACb,SAAS;AACT,KAAK,CAAC,CAAC;AACP;AACA,IAAI,MAAM,qBAAqB,GAAG,CAAC,KAAK,KAAK;AAC7C,QAAQ,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;AAC/C,YAAY,OAAO,EAAE,CAAC;AACtB;AACA,QAAQ,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AACjE,KAAK,CAAC;AACN;AACA,IAAI,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,QAAQ,CAAC,OAAO,CAAC,CAAC;AAC3F;AACA,IAAI,MAAM,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC;AAC/F;AACA,IAAI,MAAM,eAAe,GAAG,sBAAsB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AACjE,IAAI,MAAM,oBAAoB,GAAG,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,IAAI,EAAE,CAAC;AACpE;AACA,IAAI,MAAM,cAAc,GAAG,uBAAuB,GAAG,CAAC;AACtD;AACA,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK;AAChC;AACA,QAAQ,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,mBAAmB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACrH,QAAQ,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,GAAG,EAAE,qBAAqB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;AAClI,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AACvB;AACA,EAAE,CAAC,GAAG,EAAE,CAAC;AACT,IAAI,MAAM,gBAAgB,GAAG,iBAAiB,GAAG,CAAC;AAClD;AACA,mBAAmB,EAAE,OAAO,CAAC,YAAY,CAAC;AAC1C,0BAA0B,EAAE,QAAQ,CAAC,oBAAoB,CAAC;AAC1D,8BAA8B,EAAE,QAAQ,CAAC,UAAU,CAAC;AACpD,qBAAqB,EAAE,UAAU,CAAC;AAClC;AACA,oCAAoC,EAAE,CAAC,EAAE,GAAG,QAAQ,CAAC,4BAA4B,MAAM,IAAI,IAAI,EAAE,KAAK,KAAK,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AACzH,oCAAoC,EAAE,CAAC,EAAE,GAAG,QAAQ,CAAC,4BAA4B,MAAM,IAAI,IAAI,EAAE,KAAK,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC;AACxH,qCAAqC,EAAE,CAAC,EAAE,GAAG,QAAQ,CAAC,6BAA6B,MAAM,IAAI,IAAI,EAAE,KAAK,KAAK,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;AAC5H,+BAA+B,EAAE,CAAC,EAAE,GAAG,QAAQ,CAAC,uBAAuB,MAAM,IAAI,IAAI,EAAE,KAAK,KAAK,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;AAChH;AACA,KAAK,CAAC,GAAG,EAAE,CAAC;AACZ,IAAI,OAAO,CAAC;AACZ;AACA;AACA,eAAe,EAAE,OAAO,CAAC,YAAY,CAAC;AACtC,uBAAuB,EAAE,IAAI,IAAI,EAAE,CAAC,kBAAkB,EAAE,CAAC,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC,kBAAkB,EAAE,CAAC;AAC5F;AACA;AACA,sFAAsF,EAAE,UAAU,GAAG,SAAS,GAAG,EAAE,CAAC;AACpH,wDAAwD,EAAE,UAAU,GAAG,qHAAqH,GAAG,EAAE,CAAC;AAClM;AACA;AACA;AACA;AACA,2GAA2G,EAAE,qBAAqB,GAAG,CAAC;AACtI;AACA;AACA;AACA,2BAA2B,CAAC,GAAG,EAAE,CAAC,EAAE,UAAU,IAAI,CAAC,qBAAqB,GAAG,CAAC;AAC5E;AACA;AACA,2BAA2B,CAAC,GAAG,EAAE,CAAC;AAClC;AACA,EAAE,UAAU,GAAG,CAAC;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,EAAE,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;AAC3E;AACA;AACA;AACA;AACA;AACA,EAAE,CAAC,GAAG,EAAE,CAAC;AACT;AACA,EAAE,EAAE,cAAc,CAAC;AACnB,EAAE,EAAE,gBAAgB,CAAC;AACrB;AACA,8BAA8B,EAAE,QAAQ,CAAC,oBAAoB,CAAC;AAC9D,kCAAkC,EAAE,QAAQ,CAAC,UAAU,CAAC;AACxD;AACA,wCAAwC,EAAE,QAAQ,CAAC,4BAA4B,CAAC;AAChF,wCAAwC,EAAE,QAAQ,CAAC,4BAA4B,CAAC;AAChF,yCAAyC,EAAE,QAAQ,CAAC,6BAA6B,CAAC;AAClF,mCAAmC,EAAE,QAAQ,CAAC,uBAAuB,CAAC;AACtE,4BAA4B,EAAE,QAAQ,CAAC,gBAAgB,CAAC;AACxD,mCAAmC,EAAE,QAAQ,CAAC,uBAAuB,CAAC;AACtE,uCAAuC,EAAE,QAAQ,CAAC,2BAA2B,CAAC;AAC9E,oCAAoC,EAAE,QAAQ,CAAC,wBAAwB,CAAC;AACxE;AACA;AACA;AACA,iBAAiB,EAAE,OAAO,CAAC,YAAY,CAAC;AACxC;AACA;AACA;AACA;AACA,0CAA0C,EAAE,QAAQ,CAAC,KAAK,CAAC,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC;AACvF;AACA;AACA;AACA;AACA,QAAQ,EAAE,iBAAiB,GAAG,CAAC,uBAAuB,CAAC,GAAG,EAAE,CAAC;AAC7D;AACA,QAAQ,EAAE,KAAK,CAAC;AAChB;AACA;AACA;AACA,EAAE,CAAC,CAAC;AACJ,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,YAAY,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE;AAC1D,IAAI,OAAO,cAAc,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;AACvD,CAAC;AAsCD;AACA;AACA;AACO,SAAS,mBAAmB,CAAC,OAAO,EAAE;AAC7C,IAAI,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,KAAK,EAAE,UAAU,GAAG,qBAAqB,EAAE,GAAG,OAAO,CAAC;AACrF,IAAI,OAAO,CAAC;AACZ,WAAW,EAAE,IAAI,CAAC;AAClB;AACA;AACA;AACA;AACA,aAAa,EAAE,UAAU,CAAC;AAC1B;AACA;AACA;AACA,qCAAqC,EAAE,UAAU,GAAG,2BAA2B,GAAG,EAAE,CAAC;AACrF;AACA,CAAC,CAAC,CAAC;AACH,CAAC;AACD;AACA;AACA;AACO,SAAS,wBAAwB,CAAC,eAAe,GAAG,IAAI,EAAE,KAAK,EAAE;AACxE,IAAI,MAAM,SAAS,GAAG;AACtB,QAAQ,CAAC,MAAM,CAAC;AAChB,QAAQ,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AACnC,KAAK,CAAC;AACN;AACA,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE;AAC7B,QAAQ,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;AACnG,KAAK;AACL,IAAI,IAAI,eAAe,EAAE;AACzB,QAAQ,SAAS,CAAC,IAAI,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC;AAChD,KAAK;AACL;AACA,IAAI,MAAM,eAAe,GAAG,KAAK,KAAK,SAAS,GAAG,CAAC,iCAAiC,EAAE,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC;AACrG,IAAI,OAAO,CAAC;AACZ;AACA;AACA;AACA;AACA,kBAAkB,EAAE,eAAe,CAAC;AACpC,+DAA+D,EAAE,eAAe,GAAG,qCAAqC,GAAG,EAAE,CAAC;AAC9H,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,CAAC;AACF,CAAC;AACD;AACA;AACA;AACA;AACA;AACO,SAAS,qBAAqB,GAAG;AACxC;AACA;AACA,IAAI,OAAO,CAAC;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA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"}
|