{"version":3,"sources":["../src/web/scripts/shadowDOMInputAdapter.js","../src/ai/baml_client/config.ts","../src/ai/baml_client/globals.ts","../src/ai/baml_client/inlinedbaml.ts","../src/logger.ts","../src/agent/index.ts","../src/ai/util.ts","../src/ai/baml_client/index.ts","../src/ai/baml_client/async_client.ts","../src/ai/baml_client/async_request.ts","../src/ai/baml_client/parser.ts","../src/ai/baml_client/tracing.ts","../src/ai/modelHarness.ts","../src/ai/baml_client/type_builder.ts","../src/actions/util.ts","../src/util.ts","../src/memory/context.ts","../src/memory/image.ts","../src/memory/serde.ts","../src/memory/observation.ts","../src/agent/errors.ts","../src/memory/index.ts","../src/actions/index.ts","../src/actions/taskActions.ts","../src/web/stability.ts","../src/web/util.ts","../src/web/visualizer.ts","../src/web/tabs.ts","../src/web/transformer.ts","../src/web/harness.ts","../src/actions/webActions.ts","../src/web/browserProvider.ts","../src/ai/grounding.ts","../src/common/util.ts","../src/connectors/browserConnector.ts","../src/agent/narrator.ts","../src/agent/browserAgent.ts","../src/telemetry/index.ts","../src/version.ts","../src/telemetry/events.ts","../src/index.ts"],"sourcesContent":["// Custom Shadow DOM Input Adapter script for browser injection\nmodule.exports = function getShadowDOMInputAdapterScript() {\n  return function() {\n    if (typeof window.magnitudeShadowDOMAdapter !== 'undefined') {\n      console.warn('magnitudeShadowDOMAdapter already defined. Cleaning up old one.');\n      if(typeof window.magnitudeShadowDOMAdapter.cleanup === 'function') {\n        window.magnitudeShadowDOMAdapter.cleanup();\n      }\n    }\n\n    window.magnitudeShadowDOMAdapter = {\n      activePopup: null, // Generic reference to the currently open popup/dropdown\n      activePopupType: null, // 'select', 'date', 'color'\n      activePopupOriginalElement: null, // The element that triggered the popup\n      boundHandleDocumentMousedown: null,\n      boundHandleDocumentClick: null, // For click event prevention\n      boundHandleOutsidePopupClick: null,\n      boundHandleDocumentKeydown: null, // For select typeahead\n      searchString: '', // For select typeahead\n      searchTimeoutId: null, // For select typeahead\n\n      // --- Initialization and Cleanup ---\n      init: function() {\n        this.boundHandleDocumentMousedown = this.handleDocumentMousedown.bind(this);\n        document.addEventListener('mousedown', this.boundHandleDocumentMousedown, true);\n        \n        this.boundHandleDocumentClick = this.handleDocumentClick.bind(this);\n        document.addEventListener('click', this.boundHandleDocumentClick, true);\n        \n        this.boundHandleDocumentKeydown = this.handleDocumentKeydown.bind(this); // Added for select typeahead\n\n        console.log('Shadow DOM Input Adapter mousedown, click, and keydown listeners prepared.');\n      },\n\n      cleanup: function() {\n        this.closeActivePopup(); // This will also remove keydown listener if active\n        if (this.boundHandleDocumentMousedown) {\n          document.removeEventListener('mousedown', this.boundHandleDocumentMousedown, true);\n          this.boundHandleDocumentMousedown = null;\n        }\n        if (this.boundHandleDocumentClick) {\n          document.removeEventListener('click', this.boundHandleDocumentClick, true);\n          this.boundHandleDocumentClick = null;\n        }\n        // Ensure keydown listener is removed if it was somehow left active\n        if (this.boundHandleDocumentKeydown && this.activePopupType !== 'select') { // Only if not handled by closeActivePopup\n             document.removeEventListener('keydown', this.boundHandleDocumentKeydown, true);\n        }\n        console.log('Shadow DOM Input Adapter cleaned up.');\n      },\n\n      // --- Main Mousedown & Click Handlers ---\n      handleDocumentMousedown: function(e) {\n        const target = e.target;\n        if (!target || typeof target.tagName !== 'string') return;\n\n        // If mousedown is inside an active custom popup, let its internal handlers manage it.\n        if (this.activePopup && this.activePopup.contains(target)) {\n            return;\n        }\n\n        if (target.tagName === 'SELECT' || (target.tagName === 'OPTION' && target.parentElement && target.parentElement.tagName === 'SELECT')) {\n          this.handleSelectInteraction(target.tagName === 'SELECT' ? target : target.parentElement, e);\n        } else if (target.tagName === 'INPUT' && target.type === 'date') {\n          this.handleDateInputInteraction(target, e);\n        } else if (target.tagName === 'INPUT' && target.type === 'color') {\n          this.handleColorInputInteraction(target, e);\n        }\n        // Note: The outside click listener (_setupOutsideClickListener) is responsible for closing popups\n        // when clicking outside. This main mousedown handler focuses on opening/toggling them.\n      },\n\n      handleDocumentClick: function(e) {\n        const target = e.target;\n        if (!target || typeof target.tagName !== 'string') return;\n\n        // If the click target is one of the elements we manage (select, date input, color input),\n        // and the click is NOT inside an active custom popup UI that we've created,\n        // then prevent the default action of the click. This is a secondary measure\n        // to stop native pickers or behaviors if mousedown prevention wasn't enough.\n        if ( (target.tagName === 'INPUT' && (target.type === 'date' || target.type === 'color')) ||\n             (target.tagName === 'SELECT') ||\n             (target.tagName === 'OPTION' && target.parentElement && target.parentElement.tagName === 'SELECT')\n           ) {\n          \n          if (this.activePopup && this.activePopup.contains(target)) {\n            // Click is inside our active custom popup. Do nothing here.\n            // Let the popup's own event handlers manage it.\n            return;\n          }\n          \n          // If the click is on the original element (or an option within a select),\n          // prevent its default action. Our mousedown handler should have already\n          // initiated the custom UI if applicable.\n          e.preventDefault();\n          e.stopPropagation();\n          // console.log(`Default click action prevented for: ${target.tagName} (type: ${target.type || 'N/A'})`);\n        }\n      },\n      \n      // --- Generic Popup Management ---\n      closeActivePopup: function() {\n        if (this.activePopup) {\n          this.activePopup.remove();\n          this.activePopup = null;\n        }\n        this.activePopupType = null;\n        this.activePopupOriginalElement = null;\n        if (this.boundHandleOutsidePopupClick) {\n          document.removeEventListener('mousedown', this.boundHandleOutsidePopupClick, true);\n          this.boundHandleOutsidePopupClick = null;\n        }\n        if (this.activePopupType === 'select' && this.boundHandleDocumentKeydown) {\n          document.removeEventListener('keydown', this.boundHandleDocumentKeydown, true);\n        }\n        clearTimeout(this.searchTimeoutId);\n        this.searchString = '';\n        this.searchTimeoutId = null;\n      },\n\n      _setupOutsideClickListener: function() {\n        // Use setTimeout to ensure the mousedown event that opened the popup doesn't immediately close it\n        setTimeout(() => {\n          this.boundHandleOutsidePopupClick = (event) => {\n            if (this.activePopup && \n                !this.activePopup.contains(event.target) && \n                event.target !== this.activePopupOriginalElement &&\n                (!this.activePopupOriginalElement || !this.activePopupOriginalElement.contains(event.target)) // Also check if click is on children of original element\n               ) {\n              this.closeActivePopup();\n            }\n          };\n          document.addEventListener('mousedown', this.boundHandleOutsidePopupClick, true);\n        }, 0);\n      },\n      \n      _createPopupElement: function(originalElement, type) { // Added type for specific styling/content\n        const rect = originalElement.getBoundingClientRect();\n        const popup = document.createElement('div');\n        popup.dataset.popupType = type;\n        this._setStyles(popup, {\n          position: 'fixed',\n          left: `${rect.left}px`,\n          top: `${rect.bottom + 2}px`,\n          minWidth: `${rect.width}px`,\n          background: 'white',\n          border: '1px solid #ccc',\n          boxShadow: '0 2px 10px rgba(0,0,0,0.15)',\n          zIndex: '2147483647',\n          padding: '10px',\n          borderRadius: '4px',\n          display: 'flex',\n          flexDirection: 'column',\n          gap: '5px', \n        });\n        return popup;\n      },\n\n      _updateInputValidationIndicator: function(inputElementContainer, isValid) {\n        let indicatorSpan = inputElementContainer.querySelector('.validation-indicator');\n        if (!indicatorSpan) {\n          indicatorSpan = document.createElement('span');\n          indicatorSpan.className = 'validation-indicator';\n          this._setStyles(indicatorSpan, {\n            marginLeft: '5px',\n            display: 'inline-flex',\n            alignItems: 'center',\n            width: '16px', // Fixed width for the indicator\n            height: '16px', // Fixed height\n            justifyContent: 'center',\n          });\n          inputElementContainer.appendChild(indicatorSpan); // Append next to the input\n        }\n\n        if (isValid === true) {\n          indicatorSpan.textContent = '✔';\n          indicatorSpan.style.color = 'green';\n        } else if (isValid === false) {\n          indicatorSpan.textContent = '✖';\n          indicatorSpan.style.color = 'red';\n        } else { // null or undefined or empty string\n          indicatorSpan.textContent = '';\n        }\n      },\n\n      // --- SELECT Element Specific Logic ---\n      handleSelectInteraction: function(selectElement, event) {\n        event.preventDefault();\n        event.stopPropagation();\n        \n        if (this.activePopupType === 'select' && this.activePopupOriginalElement === selectElement) {\n          this.closeActivePopup();\n          return;\n        }\n        this.closeActivePopup();\n        this.createAndShowSelectDropdown(selectElement);\n      },\n\n      createAndShowSelectDropdown: function(select) {\n        const dropdown = this._createPopupElement(select, 'select');\n        this._setStyles(dropdown, { \n            padding: '0', \n            maxHeight: `${Math.min(300, window.innerHeight - select.getBoundingClientRect().bottom - 20)}px`,\n            overflowY: 'auto',\n            gap: '0', // Select doesn't need the main popup gap\n        });\n\n        const contentWrapper = document.createElement('div'); \n        this._setStyles(contentWrapper, { padding: '5px 0' });\n        \n        Array.from(select.options).forEach((option, index) => {\n          const div = document.createElement('div');\n          div.textContent = option.text;\n          this._setStyles(div, {\n            padding: '8px 12px', margin: '0', cursor: 'pointer',\n            backgroundColor: index === select.selectedIndex ? '#e0e0e0' : 'white',\n            whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis',\n          });\n          div.setAttribute('data-index', index.toString());\n          div.onmouseenter = function() { this.style.backgroundColor = index === select.selectedIndex ? '#d0d0d0' : '#f0f0f0'; };\n          div.onmouseleave = function() { this.style.backgroundColor = index === select.selectedIndex ? '#e0e0e0' : 'white'; };\n          div.onclick = () => {\n            select.selectedIndex = index;\n            select.dispatchEvent(new Event('input', { bubbles: true }));\n            select.dispatchEvent(new Event('change', { bubbles: true }));\n            this.closeActivePopup();\n          };\n          contentWrapper.appendChild(div);\n        });\n\n        dropdown.appendChild(contentWrapper);\n        \n        const rootNode = select.getRootNode() instanceof ShadowRoot ? select.getRootNode() : document.body;\n        rootNode.appendChild(dropdown);\n\n        this.activePopup = dropdown;\n        this.activePopupType = 'select';\n        this.activePopupOriginalElement = select;\n        select.blur();\n        this._setupOutsideClickListener();\n\n        // For typeahead\n        this.searchString = '';\n        clearTimeout(this.searchTimeoutId);\n        document.addEventListener('keydown', this.boundHandleDocumentKeydown, true);\n\n        console.log('Custom select dropdown created for:', select.id || select.name);\n      },\n\n      // --- Keydown Handler for Select Typeahead ---\n      handleDocumentKeydown: function(e) {\n        if (!this.activePopup || this.activePopupType !== 'select' || !this.activePopupOriginalElement) {\n          return;\n        }\n\n        // Ignore modifier keys, navigation keys, Escape, Tab (but handle Enter)\n        if (e.metaKey || e.ctrlKey || e.altKey || \n            ['Shift', 'Control', 'Alt', 'Meta', 'Escape', 'Tab', \n             'ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight', \n             'Home', 'End', 'PageUp', 'PageDown'].includes(e.key)) {\n          if (e.key === 'Escape') {\n            this.closeActivePopup();\n          }\n          return;\n        }\n\n        if (e.key === 'Enter') {\n          e.preventDefault();\n          e.stopImmediatePropagation(); // Changed to stopImmediatePropagation\n          const options = Array.from(this.activePopup.querySelectorAll('[data-index]'));\n          const highlightedOption = options.find(opt => opt.style.backgroundColor === 'rgb(173, 216, 230)'); // Light blue in rgb\n\n          if (highlightedOption) {\n            const index = parseInt(highlightedOption.getAttribute('data-index'));\n            const select = this.activePopupOriginalElement;\n            select.selectedIndex = index;\n            select.dispatchEvent(new Event('input', { bubbles: true }));\n            select.dispatchEvent(new Event('change', { bubbles: true }));\n            this.closeActivePopup();\n          }\n          return;\n        }\n        \n        // Prevent default browser behavior for printable characters when dropdown is open\n        // e.g. page search\n        if (e.key.length === 1) {\n            e.preventDefault();\n            e.stopPropagation();\n        }\n\n\n        clearTimeout(this.searchTimeoutId);\n        this.searchString += e.key.toLowerCase();\n\n        this.searchTimeoutId = setTimeout(() => {\n          this.searchString = '';\n        }, 800); // Reset search string after 800ms of inactivity\n\n        const options = Array.from(this.activePopup.querySelectorAll('[data-index]'));\n        let matchedOption = null;\n\n        for (const optionElement of options) {\n          if (optionElement.textContent.toLowerCase().startsWith(this.searchString)) {\n            matchedOption = optionElement;\n            break;\n          }\n        }\n\n        if (matchedOption) {\n          options.forEach(opt => {\n            // Reset background for all options, considering original selected state\n            const optIndex = parseInt(opt.getAttribute('data-index'));\n            const originalSelect = this.activePopupOriginalElement;\n            opt.style.backgroundColor = optIndex === originalSelect.selectedIndex ? '#e0e0e0' : 'white';\n            // Reset hover effect styles if any were applied directly\n            opt.onmouseenter = function() { this.style.backgroundColor = optIndex === originalSelect.selectedIndex ? '#d0d0d0' : '#f0f0f0'; };\n            opt.onmouseleave = function() { this.style.backgroundColor = optIndex === originalSelect.selectedIndex ? '#e0e0e0' : 'white'; };\n          });\n          \n          // Highlight the matched option\n          matchedOption.style.backgroundColor = '#add8e6'; // Light blue for highlight\n          // Temporarily override hover for matched item to keep highlight\n          matchedOption.onmouseenter = function() { this.style.backgroundColor = '#add8e6'; }; \n          \n          matchedOption.scrollIntoView({ block: 'nearest' });\n        }\n      },\n      \n      // --- DATE Input Specific Logic ---\n      handleDateInputInteraction: function(dateInputElement, event) {\n        event.preventDefault();\n        event.stopPropagation();\n        if (this.activePopupType === 'date' && this.activePopupOriginalElement === dateInputElement) {\n          this.closeActivePopup();\n          return;\n        }\n        this.closeActivePopup();\n        this.createAndShowDatePopup(dateInputElement);\n      },\n\n      createAndShowDatePopup: function(originalDateInput) {\n        const popup = this._createPopupElement(originalDateInput, 'date');\n        this._setStyles(popup, { flexDirection: 'row', alignItems: 'center', gap: '0' }); // Override for side-by-side\n\n        const textInput = document.createElement('input');\n        textInput.type = 'text';\n        textInput.placeholder = 'MM/DD/YYYY';\n        this._setStyles(textInput, { flexGrow: '1', padding: '8px', border: '1px solid #ccc', borderRadius: '3px' });\n        if (originalDateInput.value) { // YYYY-MM-DD\n          const parts = originalDateInput.value.split('-');\n          if (parts.length === 3) textInput.value = `${parts[1]}/${parts[2]}/${parts[0]}`;\n          else textInput.value = originalDateInput.value;\n        }\n        \n        popup.appendChild(textInput);\n        this._updateInputValidationIndicator(popup, null); // Create indicator span\n\n        const self = this;\n        textInput.addEventListener('input', function() {\n          const inputValue = this.value;\n          if (!inputValue) {\n            self._updateInputValidationIndicator(popup, null);\n            return;\n          }\n          const dateParts = inputValue.match(/^(\\d{1,2})\\/(\\d{1,2})\\/(\\d{4})$/);\n          if (dateParts) {\n            const month = parseInt(dateParts[1], 10);\n            const day = parseInt(dateParts[2], 10);\n            const year = parseInt(dateParts[3], 10);\n            if (month >= 1 && month <= 12 && day >= 1 && day <= 31) { // Basic validation\n              self._updateInputValidationIndicator(popup, true);\n              originalDateInput.value = `${year}-${String(month).padStart(2, '0')}-${String(day).padStart(2, '0')}`;\n              originalDateInput.dispatchEvent(new Event('input', { bubbles: true }));\n              originalDateInput.dispatchEvent(new Event('change', { bubbles: true }));\n              // Do NOT close popup here, wait for Enter or outside click\n            } else {\n              self._updateInputValidationIndicator(popup, false);\n            }\n          } else {\n            self._updateInputValidationIndicator(popup, false);\n          }\n        });\n        \n        textInput.addEventListener('keydown', function(e) {\n            if (e.key === 'Enter') {\n                e.preventDefault();\n                // Perform final validation and close if valid\n                const inputValue = this.value;\n                const dateParts = inputValue.match(/^(\\d{1,2})\\/(\\d{1,2})\\/(\\d{4})$/);\n                if (dateParts) {\n                    const month = parseInt(dateParts[1], 10);\n                    const day = parseInt(dateParts[2], 10);\n                    const year = parseInt(dateParts[3], 10);\n                    if (month >= 1 && month <= 12 && day >= 1 && day <= 31) {\n                        // Value is already set by input listener, just close\n                        self.closeActivePopup();\n                    }\n                }\n                // If not valid, popup stays open, indicator shows '✖'\n            }\n        });\n\n        const rootNode = originalDateInput.getRootNode() instanceof ShadowRoot ? originalDateInput.getRootNode() : document.body;\n        rootNode.appendChild(popup);\n\n        this.activePopup = popup;\n        this.activePopupType = 'date';\n        this.activePopupOriginalElement = originalDateInput;\n        originalDateInput.blur();\n        this._setupOutsideClickListener();\n        setTimeout(() => {\n          textInput.focus();\n          textInput.select();\n        }, 0);\n        console.log('Custom date popup created for:', originalDateInput.id || originalDateInput.name);\n      },\n\n      // --- COLOR Input Specific Logic ---\n      handleColorInputInteraction: function(colorInputElement, event) {\n        event.preventDefault();\n        event.stopPropagation();\n        if (this.activePopupType === 'color' && this.activePopupOriginalElement === colorInputElement) {\n          this.closeActivePopup();\n          return;\n        }\n        this.closeActivePopup();\n        this.createAndShowColorPopup(colorInputElement);\n      },\n\n      createAndShowColorPopup: function(originalColorInput) {\n        const popup = this._createPopupElement(originalColorInput, 'color');\n        this._setStyles(popup, { flexDirection: 'row', alignItems: 'center', gap: '0' });\n\n        const textInput = document.createElement('input');\n        textInput.type = 'text';\n        textInput.placeholder = '#RRGGBB';\n        this._setStyles(textInput, { flexGrow: '1', padding: '8px', border: '1px solid #ccc', borderRadius: '3px', marginRight: '5px'});\n        if (originalColorInput.value) textInput.value = originalColorInput.value;\n\n        const previewSpan = document.createElement('span');\n        this._setStyles(previewSpan, {\n          width: '28px', height: '28px', display: 'inline-block', border: '1px solid #ccc',\n          backgroundColor: originalColorInput.value || '#ffffff', borderRadius: '3px', flexShrink: '0',\n          marginRight: '5px', // Space before validation indicator\n        });\n        \n        popup.appendChild(textInput);\n        popup.appendChild(previewSpan);\n        this._updateInputValidationIndicator(popup, null); // Create indicator span\n\n        const self = this;\n        textInput.addEventListener('input', function() {\n          const inputValue = this.value.trim();\n          if (!inputValue) {\n            self._updateInputValidationIndicator(popup, null);\n            previewSpan.style.backgroundColor = '#ffffff';\n            return;\n          }\n\n          let finalColor = '';\n          if (/^#([0-9A-Fa-f]{3}){1,2}$/.test(inputValue)) {\n            finalColor = inputValue;\n          } else if (/^[0-9A-Fa-f]{6}$/.test(inputValue) || /^[0-9A-Fa-f]{3}$/.test(inputValue)) {\n            finalColor = '#' + inputValue;\n          }\n\n          if (finalColor) {\n            previewSpan.style.backgroundColor = finalColor;\n            self._updateInputValidationIndicator(popup, true);\n            originalColorInput.value = finalColor;\n            originalColorInput.dispatchEvent(new Event('input', { bubbles: true }));\n            originalColorInput.dispatchEvent(new Event('change', { bubbles: true }));\n            // Do NOT close popup here, wait for Enter or outside click\n          } else {\n            previewSpan.style.backgroundColor = '#ffffff';\n            self._updateInputValidationIndicator(popup, false);\n          }\n        });\n        if(textInput.value) textInput.dispatchEvent(new Event('input')); // Trigger initial validation/preview\n\n        textInput.addEventListener('keydown', function(e) {\n            if (e.key === 'Enter') {\n                e.preventDefault();\n                // Perform final validation and close if valid\n                const inputValue = this.value.trim();\n                let finalColor = '';\n                if (/^#([0-9A-Fa-f]{3}){1,2}$/.test(inputValue)) {\n                    finalColor = inputValue;\n                } else if (/^[0-9A-Fa-f]{6}$/.test(inputValue) || /^[0-9A-Fa-f]{3}$/.test(inputValue)) {\n                    finalColor = '#' + inputValue;\n                }\n                if (finalColor) {\n                    // Value is already set by input listener, just close\n                    self.closeActivePopup();\n                }\n                // If not valid, popup stays open, indicator shows '✖'\n            }\n        });\n        \n        const rootNode = originalColorInput.getRootNode() instanceof ShadowRoot ? originalColorInput.getRootNode() : document.body;\n        rootNode.appendChild(popup);\n        \n        this.activePopup = popup;\n        this.activePopupType = 'color';\n        this.activePopupOriginalElement = originalColorInput;\n        originalColorInput.blur();\n        this._setupOutsideClickListener();\n        setTimeout(() => {\n          textInput.focus();\n          textInput.select();\n        }, 0);\n        console.log('Custom color popup created for:', originalColorInput.id || originalColorInput.name);\n      },\n\n      // --- Helper Functions ---\n      _setStyles: function(element, styles) {\n        for (const property in styles) {\n          element.style[property] = styles[property];\n        }\n      }\n      // _copyAttributes is not used in this version as we are not replacing elements.\n    };\n\n    window.magnitudeShadowDOMAdapter.init();\n  }.toString();\n}\n","/*************************************************************************************************\n\nWelcome to Baml! To use this generated code, please run one of the following:\n\n$ npm install @boundaryml/baml\n$ yarn add @boundaryml/baml\n$ pnpm add @boundaryml/baml\n\n*************************************************************************************************/\n\n// This file was generated by BAML: do not edit it. Instead, edit the BAML\n// files and re-generate this code.\n//\n/* eslint-disable */\n// tslint:disable\n// @ts-nocheck\n// biome-ignore format: autogenerated code\nexport { setLogLevel, getLogLevel, setLogJsonMode as setLogJson } from \"@boundaryml/baml/logging\";\nexport { resetBamlEnvVars } from \"./globals\";","/*************************************************************************************************\n\nWelcome to Baml! To use this generated code, please run one of the following:\n\n$ npm install @boundaryml/baml\n$ yarn add @boundaryml/baml\n$ pnpm add @boundaryml/baml\n\n*************************************************************************************************/\n\n// This file was generated by BAML: do not edit it. Instead, edit the BAML\n// files and re-generate this code.\n//\n/* eslint-disable */\n// tslint:disable\n// @ts-nocheck\n// biome-ignore format: autogenerated code\nimport { BamlRuntime, BamlCtxManager } from '@boundaryml/baml'\nimport { getBamlFiles } from './inlinedbaml'\n\n// Create a copy of process.env to avoid mutations\nconst env = { ...process.env }\n\nexport const DO_NOT_USE_DIRECTLY_UNLESS_YOU_KNOW_WHAT_YOURE_DOING_RUNTIME = BamlRuntime.fromFiles(\n  'baml_src',\n  getBamlFiles(),\n  env\n)\nexport const DO_NOT_USE_DIRECTLY_UNLESS_YOU_KNOW_WHAT_YOURE_DOING_CTX = new BamlCtxManager(DO_NOT_USE_DIRECTLY_UNLESS_YOU_KNOW_WHAT_YOURE_DOING_RUNTIME)\n\n/**\n * @deprecated resetBamlEnvVars is deprecated and is safe to remove, since environment variables are now lazily loaded on each function call\n */\nexport function resetBamlEnvVars(envVars: Record<string, string | undefined>) {\n  if (DO_NOT_USE_DIRECTLY_UNLESS_YOU_KNOW_WHAT_YOURE_DOING_CTX.allowResets()) {\n    const envVarsToReset = Object.fromEntries(Object.entries(envVars).filter((kv): kv is [string, string] => kv[1] !== undefined));\n    DO_NOT_USE_DIRECTLY_UNLESS_YOU_KNOW_WHAT_YOURE_DOING_RUNTIME.reset('baml_src', getBamlFiles(), envVarsToReset)\n    DO_NOT_USE_DIRECTLY_UNLESS_YOU_KNOW_WHAT_YOURE_DOING_CTX.reset()\n  } else {\n    throw new Error('BamlError: Cannot reset BAML environment variables while there are active BAML contexts.')\n  }\n}","/*************************************************************************************************\n\nWelcome to Baml! To use this generated code, please run one of the following:\n\n$ npm install @boundaryml/baml\n$ yarn add @boundaryml/baml\n$ pnpm add @boundaryml/baml\n\n*************************************************************************************************/\n\n// This file was generated by BAML: do not edit it. Instead, edit the BAML\n// files and re-generate this code.\n//\n/* eslint-disable */\n// tslint:disable\n// @ts-nocheck\n// biome-ignore format: autogenerated code\nconst fileMap = {\n  \n  \"behaviorTests.baml\": \"\\ntest DoNotOverplan1 {\\n    functions [CreatePartialRecipe]\\n    args {\\n        screenshot {\\n            url \\\"https://magnitude-test-screenshots.s3.us-east-1.amazonaws.com/do_not_overplan_1.png\\\"\\n        }\\n        step {\\n            description #\\\"Create a new company\\\"#\\n            checks [\\n                #\\\"Company added successfully\\\"#\\n            ]\\n            testData {\\n                data [\\n\\n                ]\\n                other #\\\"Make up the first 2 values and use defaults for the rest\\\"#\\n            }\\n        }\\n        previousActions [\\n\\n        ]\\n    }\\n    @@assert( one_action, {{ this.actions|length == 1 }} )\\n    @@assert( not_marked_finished, {{ this.finished == false }} )\\n}\\n\\n\\ntest DoNotOverplan2 {\\n    // Especially with the test data, planner might be tempted to click create company and also plan to fill form fields.\\n    // BUT we do not want it to do that - it should only click the button.\\n    functions [CreatePartialRecipe]\\n    args {\\n        screenshot {\\n            url \\\"https://magnitude-test-screenshots.s3.us-east-1.amazonaws.com/do_not_overplan_2.png\\\"\\n        }\\n        step {\\n            description #\\\"Create a new company\\\"#\\n            checks [\\n                #\\\"Company added successfully\\\"#\\n            ]\\n            testData {\\n                data [\\n\\n                ]\\n                other #\\\"Make up the first 2 values and use defaults for the rest\\\"#\\n            }\\n        }\\n        previousActions [\\n            #\\\"\\n            {\\n                \\\"variant\\\": \\\"click\\\",\\n                \\\"target\\\": \\\"Companies option in the left sidebar menu\\\"\\n            }\\n            \\\"#\\n        ]\\n    }\\n    @@assert( one_action, {{ this.actions|length == 1 }} )\\n    @@assert( not_marked_finished, {{ this.finished == false }} )\\n}\\n\\ntest OptimalPlanning1 {\\n    functions [CreatePartialRecipe]\\n    args {\\n        screenshot {\\n            url \\\"https://magnitude-test-screenshots.s3.us-east-1.amazonaws.com/do_not_underplan_1.png\\\"\\n        }\\n        step {\\n            description #\\\"Create a new company\\\"#\\n            checks [\\n                #\\\"Company added successfully\\\"#\\n            ]\\n            testData {\\n                data [\\n\\n                ]\\n                other #\\\"Make up the first 2 values and use defaults for the rest\\\"#\\n            }\\n        }\\n        previousActions [\\n        #\\\"\\n            {\\n                \\\"variant\\\": \\\"click\\\",\\n                \\\"target\\\": \\\"Companies option in the left sidebar menu\\\"\\n            }\\n        \\\"#,\\n        #\\\"\\n            {\\n                \\\"variant\\\": \\\"click\\\",\\n                \\\"target\\\": \\\"Add Company button in the top right corner\\\"\\n            }\\n        \\\"#\\n        ]\\n        \\n    }\\n    // optimal is type name, type domain, click save, mark finished\\n    @@assert( optimal_actions, {{ this.actions|length == 3 }} )\\n    // @@assert( not_marked_finished, {{ this.finished == false }} )\\n}\\n\\n\\n\\n// test CheckContextRemove1 {\\n//     // Manual for now - ideally we'd want to verify that executor can check the returned description successfully\\n//     functions [RemoveImplicitCheckContext]\\n//     args {\\n//         screenshot {\\n//             url \\\"https://magnitude-test-screenshots.s3.us-east-1.amazonaws.com/check_context_remove_1.png\\\"\\n//         }\\n//         check #\\\"Company added successfully\\\"#\\n//         previousActions [\\n//             #\\\"\\n//                 {\\n//                     \\\"variant\\\": \\\"click\\\",\\n//                     \\\"target\\\": \\\"Companies option in the left sidebar menu\\\"\\n//                 }\\n//             \\\"#,\\n//             #\\\"\\n//                 {\\n//                     \\\"variant\\\": \\\"click\\\",\\n//                     \\\"target\\\": \\\"'Add Company' button in the top right corner of the Companies page\\\"\\n//                 }\\n//             \\\"#,\\n//             #\\\"\\n//                 {\\n//                     \\\"variant\\\": \\\"type\\\",\\n//                     \\\"target\\\": \\\"Name input field\\\",\\n//                     \\\"content\\\": \\\"Acme Solutions\\\"\\n//                 }\\n//             \\\"#,\\n//             #\\\"\\n//                 {\\n//                     \\\"variant\\\": \\\"type\\\",\\n//                     \\\"target\\\": \\\"Domain input field\\\",\\n//                     \\\"content\\\": \\\"acmesolutions.com\\\"\\n//                 }\\n//             \\\"#,\\n//             #\\\"\\n//                 {\\n//                     \\\"variant\\\": \\\"type\\\",\\n//                     \\\"target\\\": \\\"Logo URL input field\\\",\\n//                     \\\"content\\\": \\\"https://example.com/image.jpg\\\"\\n//                 }\\n//             \\\"#,\\n//             #\\\"\\n//                 {\\n//                     \\\"variant\\\": \\\"type\\\",\\n//                     \\\"target\\\": \\\"Industry input field\\\",\\n//                     \\\"content\\\": \\\"Technology\\\"\\n//                 }\\n//             \\\"#,\\n//             #\\\"\\n//                 {\\n//                     \\\"variant\\\": \\\"click\\\",\\n//                     \\\"target\\\": \\\"Size dropdown menu\\\"\\n//                 }\\n//             \\\"#,\\n//             #\\\"\\n//                 {\\n//                     \\\"variant\\\": \\\"click\\\",\\n//                     \\\"target\\\": \\\"1-10 option in the Size dropdown\\\"\\n//                 }\\n//             \\\"#,\\n//             #\\\"\\n//                 {\\n//                     \\\"variant\\\": \\\"click\\\",\\n//                     \\\"target\\\": \\\"Revenue dropdown menu\\\"\\n//                 }\\n//             \\\"#,\\n//             #\\\"\\n//                 {\\n//                     \\\"variant\\\": \\\"click\\\",\\n//                     \\\"target\\\": \\\"<$100K option in the Revenue dropdown\\\"\\n//                 }\\n//             \\\"#,\\n//             #\\\"\\n//                 {\\n//                     \\\"variant\\\": \\\"click\\\",\\n//                     \\\"target\\\": \\\"ICP Fit dropdown menu\\\"\\n//                 }\\n//             \\\"#,\\n//             #\\\"\\n//                 {\\n//                     \\\"variant\\\": \\\"click\\\",\\n//                     \\\"target\\\": \\\"Medium option in the ICP Fit dropdown\\\"\\n//                 }\\n//             \\\"#,\\n//             #\\\"\\n//                 {\\n//                     \\\"variant\\\": \\\"click\\\",\\n//                     \\\"target\\\": \\\"Est. ARR dropdown menu\\\"\\n//                 }\\n//             \\\"#,\\n//             #\\\"\\n//                 {\\n//                     \\\"variant\\\": \\\"click\\\",\\n//                     \\\"target\\\": \\\"<$10K option in the Est. ARR dropdown\\\"\\n//                 }\\n//             \\\"#,\\n//             #\\\"\\n//                 {\\n//                     \\\"variant\\\": \\\"click\\\",\\n//                     \\\"target\\\": \\\"Connection Strength dropdown menu\\\"\\n//                 }\\n//             \\\"#,\\n//             #\\\"\\n//                 {\\n//                     \\\"variant\\\": \\\"click\\\",\\n//                     \\\"target\\\": \\\"Weak option in the Connection Strength dropdown\\\"\\n//                 }\\n//             \\\"#,\\n//             #\\\"\\n//                 {\\n//                     \\\"variant\\\": \\\"click\\\",\\n//                     \\\"target\\\": \\\"Save button\\\"\\n//                 }\\n//             \\\"#\\n//         ]\\n//     }\\n// }\\n\\ntest TargetGrounding1 {\\n    // This test is a screenshot of Magnitude dasboard. Goal is to go to test playground.\\n    // Originally failed because target was described as \\\"TC-0 Playground Test Case button\\\"\\n    // This aligns more with the card shown rather that the specific button that actually needs to be clicked\\n    // which has text \\\"Experiment Now (Free!)\\\"\\n    // We want the planner to ground the targets in very specific details when available, such as the text on a button.\\n    // This test asserts that the generated target includes specific text from the button, at least \\\"Experiment Now\\\"\\n    functions [CreatePartialRecipe]\\n    args {\\n        screenshot {\\n            url \\\"https://magnitude-test-screenshots.s3.us-east-1.amazonaws.com/target_grounding_1.png\\\"\\n        }\\n        step {\\n            description #\\\"Go to test playground\\\"#\\n            checks [\\n            ]\\n            testData {\\n                data [\\n\\n                ]\\n                other \\\"\\\"\\n            }\\n        }\\n        previousActions [\\n        ]\\n    }\\n    @@assert( includes_button_text, {{ \\\"Experiment Now (Free!)\\\" in this.actions[0].target }} )\\n}\",\n  \"clients.baml\": \"// Learn more about clients at https://docs.boundaryml.com/docs/snippets/clients/overview\\n\\nclient<llm> SonnetBedrock {\\n    provider aws-bedrock\\n    retry_policy Exponential\\n    options {\\n        inference_configuration {\\n            temperature 0.0\\n        }\\n        model_id \\\"anthropic.claude-3-5-sonnet-20240620-v1:0\\\"\\n    }\\n}\\n\\nclient<llm> SonnetAnthropic {\\n    provider anthropic\\n    retry_policy Exponential\\n    options {\\n        model \\\"claude-3-5-sonnet-20240620\\\"\\n        api_key env.ANTHROPIC_API_KEY\\n        temperature 0.0\\n    }\\n}\\n\\nclient<llm> GeminiPro {\\n    provider \\\"google-ai\\\"\\n    options {\\n        api_key env.GOOGLE_API_KEY\\n        model \\\"gemini-2.5-pro-preview-05-06\\\"\\n        generationConfig {\\n            temperature 0.0\\n        }\\n    }\\n}\\n\\nclient<llm> GeminiProOpenRouter {\\n    provider \\\"openai-generic\\\"\\n    options {\\n        base_url \\\"https://openrouter.ai/api/v1\\\"\\n        api_key env.OPENROUTER_API_KEY\\n        model \\\"google/gemini-2.5-pro-preview-03-25\\\"\\n        temperature 0.0\\n    }\\n}\\n\\nclient<llm> GeminiFlash {\\n    provider \\\"openai-generic\\\"\\n    options {\\n        base_url \\\"https://openrouter.ai/api/v1\\\"\\n        api_key env.OPENROUTER_API_KEY\\n        model \\\"google/gemini-2.5-flash-preview\\\"\\n        temperature 0.0\\n    }\\n}\\n\\nclient<llm> GPT {\\n    provider openai\\n    options {\\n        model \\\"gpt-4.1-2025-04-14\\\"\\n        api_key env.OPENAI_API_KEY\\n        temperature 0.0\\n    }\\n}\\n\\n// client<llm> Macro {\\n//     provider openai\\n//     options {\\n//         model \\\"gpt-4o\\\"\\n//         api_key env.OPENAI_API_KEY\\n//         temperature 0.0\\n//     }\\n// }\\n\\nclient<llm> NovitaLlamaMaverick {\\n    provider \\\"openai-generic\\\"\\n    retry_policy Exponential\\n    options {\\n        base_url \\\"https://api.novita.ai/v3/openai\\\"\\n        api_key env.NOVITA_API_KEY\\n        model \\\"meta-llama/llama-4-maverick-17b-128e-instruct-fp8\\\"\\n        temperature 0.0\\n        logprobs true\\n    }\\n}\\n\\nclient<llm> Molmo {\\n    provider \\\"openai-generic\\\"\\n    retry_policy Exponential\\n    options {\\n        base_url env.MOLMO_VLLM_BASE_URL\\n        api_key env.MOLMO_VLLM_API_KEY\\n        model \\\"Molmo-7B-D-0924\\\"\\n        temperature 0.0\\n        logprobs true\\n    }\\n}\\n\\nretry_policy Exponential {\\n    max_retries 5\\n    strategy {\\n        type exponential_backoff\\n        delay_ms 500\\n        multiplier 2.0\\n        max_delay_ms 10000\\n    }\\n}\\n\\n// Default used by macro.ts\\nretry_policy DefaultRetryPolicy {\\n    max_retries 5\\n    strategy {\\n        type exponential_backoff\\n        delay_ms 500\\n        multiplier 2.0\\n        max_delay_ms 10000\\n    }\\n}\\n\",\n  \"diagnosis.baml\": \"\\n// class FailureClassification {\\n//     classification \\\"bug\\\" | \\\"misalignment\\\"\\n// }\\n\\nclass BugFailureClassification {\\n    reasoning string\\n    classification \\\"bug\\\"\\n    title string\\n    expectedResult string\\n    actualResult string\\n    severity \\\"critical\\\" | \\\"high\\\" | \\\"medium\\\" | \\\"low\\\"\\n}\\n\\nclass MisalignmentClassification {\\n    reasoning string\\n    classification \\\"misalignment\\\"\\n\\n    fault \\\"test\\\" | \\\"agent\\\" @description(#\\\"\\n        Is this likely a problem with the test case or some issue with the agent?\\n    \\\"#)\\n    \\n    message string @description(#\\\"\\n        If fault of test case:\\n        Message to the developer who wrote the test case to help them understand what may have happened and how they might be able to fix it.\\n        Be simple, direct, and informative.\\n        If fault of agent:\\n        Message to the developer who wrote the test case (not the person who wrote the agent) to help them understand what may have happened, and suggest possible ways to adjust the test case to accommodate the issue.\\n    \\\"#)\\n}\\n\\n// class FailureClassification {\\n//     reasoning\\n//     classification \\\"bug\\\" | \\\"misalignment\\\"\\n// }\\n\\ntemplate_string BaseMeta #\\\"\\n    You are observing the execution of an LLM agent that runs test cases.\\n    This agent executes test cases by observing screenshots from the browser, acting out steps, and verifying checks.\\n\\\"#\\n\\n// should this be given the original or adjusted check?\\n// should this be given more ctx of the overall step or test case?\\n// this is a tricky prompt, but its not as critical to get right as others\\n// it does become more important if we rely on classify as bug/misalign then correct minor misaligns only if not bug\\n// ^ if we need this then we should think of a more isolated/logical prompt to detect misalignments\\n// function ClassifyCheckFailure (context: BrowserExecutionContext, check: string) -> BugFailureClassification | MisalignmentClassification {\\n//     client SonnetAnthropic\\n//     prompt #\\\"\\n//         {{ _.role(\\\"system\\\") }}\\n//         {{ BaseMeta() }}\\n\\n//         The agent just marked a check as failed. Your job is to figure out why.\\n\\n//         Either:\\n//         (1) The web application actually has a bug in it\\n//         or\\n//         (2) There's some misalignment between the test case and what is in the interface\\n\\n//         If there is a bug, please break it down in detail.\\n//         If it is a misalignment, please describe what you think happened.\\n\\n//         Use the provided history of actions the agent took as well as the most recent screenshot to help you identify what happened.\\n\\n//         {{ ctx.output_format }}\\n\\n//         {{ _.role(\\\"user\\\") }}\\n\\n//         The \\\"check\\\" that was marked as failed:\\n//         {{ check }}\\n\\n//         {{ DescribeBrowserExecutionContext(context) }}\\n//     \\\"#\\n// }\\n\\n// function DiagnoseTargetNotFound (screenshot: image, step: TestStep, target: string, previousActions: string[]) -> BugFailureClassification | MisalignmentClassification {\\n//     client SonnetAnthropic\\n//     prompt #\\\"\\n//         {{ _.role(\\\"system\\\") }}\\n//         {{ BaseMeta() }}\\n\\n//         The agent had an issue acting out a step because it could not find a target. Your job is to figure out why.\\n\\n//         Either:\\n//         (1) The web application actually has a bug in it\\n//         or\\n//         (2) There's some misalignment between the test case and what is in the interface\\n\\n//         If there is a bug, please break it down in detail.\\n//         If it is a misalignment, please describe what you think happened.\\n\\n//         Use the provided history of actions the agent took as well as the most recent screenshot to help you identify what happened.\\n\\n//         {{ ctx.output_format }}\\n\\n//         {{ _.role(\\\"user\\\") }}\\n\\n//         The history of previous actions:\\n//         {%if previousActions %}\\n//         (there are none)\\n//         {%endif%}\\n//         {%for action in previousActions%}\\n//         {{ action }}\\n//         {%endfor%}\\n        \\n//         The step that failed: <step>{{ step.description }}</step>\\n//         Target that could not be found: <target>{{ target }}</target>\\n        \\n\\n//         Current screenshot:\\n//         {{screenshot}}\\n//     \\\"#\\n// }\",\n  \"extract.baml\": \"// if primitive, populate key \\\"data\\\"\\n// if array, populate key data with that array\\n// else fill with object fields\\nclass ExtractedData {\\n    @@dynamic\\n}\\n\\nfunction ExtractData (instructions: string, screenshot: image, domContent: string) -> ExtractedData {\\n    client GeminiPro\\n    prompt #\\\"\\n        {{ _.role(\\\"system\\\") }}\\n        Based on the browser screenshot and page content, extract data according to these instructions:\\n        <instructions>{{ instructions }}</instructions>\\n        \\n        {{ ctx.output_format }}\\n\\n        {{ _.role(\\\"user\\\") }}\\n\\n        {{ domContent }}\\n\\n        {{ screenshot }}\\n    \\\"#\\n}\",\n  \"generators.baml\": \"// This helps use auto generate libraries you can use in the language of\\n// your choice. You can have multiple generators if you use multiple languages.\\n// Just ensure that the output_dir is different for each generator.\\ngenerator target {\\n    // Valid values: \\\"python/pydantic\\\", \\\"typescript\\\", \\\"ruby/sorbet\\\", \\\"rest/openapi\\\"\\n    output_type \\\"typescript\\\"\\n\\n    // Where the generated code will be saved (relative to baml_src/)\\n    output_dir \\\"../src/ai\\\"\\n\\n    // The version of the BAML package you have installed (e.g. same version as your baml-py or @boundaryml/baml).\\n    // The BAML VSCode extension version should also match this version.\\n    version \\\"0.90.2\\\"\\n\\n    // Valid values: \\\"sync\\\", \\\"async\\\"\\n    // This controls what `b.FunctionName()` will be (sync or async).\\n    default_client_mode async\\n}\\n\",\n  \"memory.baml\": \"// BamlImage class is assumed to be defined and available from your BAML setup\\n// For example, it might be part of a core BAML library or generated separately.\\n// If not, you might need to define it or import it if it's in another baml file.\\n// For now, we assume 'Image' is a known type to BAML.\\n\\n// class BamlThought {\\n//   variant \\\"thought\\\"\\n//   timestamp string\\n//   message string\\n// }\\n\\n// class BamlTurn {\\n//   variant \\\"turn\\\"\\n//   timestamp string\\n//   action string \\n//   content (string | image)[] // multimedia content \\\"chunks\\\"\\n// }\\n\\n\\n// class Observation {\\n//     source string\\n//     content (string | image)[] // multimedia content \\\"chunks\\\"\\n// }\\n\\nclass ConnectorInstructions {\\n    connectorId string\\n    instructions string\\n    //content (string | image)[]\\n}\\n\\nclass ModularMemoryContext {\\n    instructions string? // additional task-level or agent-level instructions\\n    //history (BamlThought | BamlTurn)[]\\n    //observations Observation[]\\n    observationContent (string | image)[] // complete rendered observation content as multimedia content \\\"chunks\\\"\\n    //currentTimestamp string\\n    connectorInstructions ConnectorInstructions[]\\n}\\n\",\n  \"planner.baml\": \"class PartialRecipe {\\n    // this CoT pipeline is not thoroughly tested against alternatives\\n    // observations string? @description(#\\\"Any key observations about past actions or current state\\\"#)\\n    // meta_reasoning string @description(#\\\"Reflect on the current state of task execution with respect to your own abilities as an agent\\\"#)\\n    // reasoning string @description(#\\\"Consider what you can see right now and what actions you can plan without guessing\\\"#)\\n\\n    // Simplifying CoT - seemed to be causing underplanning on Claude\\n    //observations string @description(#\\\"What important clues or key information are worth considering?\\\"#)\\n    reasoning string @description(#\\\"What is the most actions you can safely take at once?\\\"#)\\n\\n    //actions ActionIntent[]\\n    @@dynamic\\n    //finished bool\\n}\\n\\n\\n// render \\\"chunked\\\" multimedia content of strings or images with no added whitespace between\\ntemplate_string RenderContent(content: (string | image)[]) #\\\"\\n    {% for chunk in content -%}{{chunk}}{%- endfor %}\\n\\\"#\\n\\n\\n// template_string DescribeModularMemoryContext(context: ModularMemoryContext) #\\\"\\n//     {% for entry in context.history %}\\n//         {% if entry.variant == \\\"thought\\\" %}\\n//             [{{entry.timestamp}}] {{entry.message}}\\n//         {% elif entry.variant == \\\"turn\\\" %}\\n//             [{{entry.timestamp}}] {{entry.action}}\\n//             {{ RenderContent(entry.content) }}\\n//         {% endif %}\\n//     {% endfor %}\\n// \\\"#\\n\\n// unused\\ntemplate_string HybridMeta #\\\"\\n    <meta>\\n    You are a web agent powered by (1) a powerful LLM (you) and (2) a small vision model (Moondream).\\n    You operate by planning out actions over time to try and complete a certain task.\\n    To do this successfully you may need to consider and adjust for your own limitations as an agent, so here is some information about how you work:\\n    - You plan several actions ahead of time without trying to guess, which are then executed\\n    - You are then given a new screenshot of the webpage which is the result of all actions taken\\n    - This occurs in a loop until you complete your task\\n    - Mouse movements require a \\\"target\\\", which is located by Moondream as a specific coordinate on the page\\n    - Moondream may sometimes fail to locate the target you expected it to.\\n    - Therefore, actions may not always be completely successful and you may need to try different variations\\n    </meta>\\n\\\"#\\n\\ntemplate_string DescribeConnectorInstructions(memory: ModularMemoryContext) #\\\"\\n    {% for conn in memory.connectorInstructions %}\\n    <{{ conn.connectorId }}>\\n    {{- conn.instructions -}}\\n    </{{ conn.connectorId }}>\\n    {% endfor %}\\n\\\"#\\n\\ntemplate_string InstructionsWithContext(memory: ModularMemoryContext, instructions: string) #\\\"\\n    {{ _.role(\\\"system\\\") }}\\n    <instructions>\\n    {{ instructions }}\\n    {%if memory.instructions %}\\n\\n    {{ memory.instructions }}\\n    {%endif%}\\n    </instructions>\\n    {{ DescribeConnectorInstructions(memory) }}\\n    {{ ctx.output_format }}\\n\\n    {{ _.role(\\\"user\\\") }}\\n\\n    {{ RenderContent(memory.observationContent) }}\\n\\\"# \\n\\ntemplate_string TaskInstructions(task: string) #\\\"\\n    Plan out actions that should be executed in order to complete the task:\\n    <task>\\n    {{ task }}\\n    </task>\\n\\n    Execute the task serially.\\n\\n    Plan out as many actions as possible, but stopping at the point where you will need to observe to plan further.\\n\\\"#\\n\\n// TODO: connector system instructions\\nfunction CreatePartialRecipe (memory: ModularMemoryContext, task: string) -> PartialRecipe {\\n    client GeminiPro\\n    prompt #\\\"\\n        {{ InstructionsWithContext(memory, TaskInstructions(task)) }}\\n    \\\"# \\n}\\n\\n// class EvaluatedCheck {\\n//     reasoning string\\n//     passes bool\\n// }\\nclass QueryResponse {\\n    @@dynamic\\n}\\n\\nfunction QueryMemory(memory: ModularMemoryContext, query: string) -> QueryResponse {\\n    client GeminiPro\\n    prompt #\\\"\\n        {{ InstructionsWithContext(memory, query) }}\\n    \\\"#\\n}\\n\\n\\n// template_string CheckInstructions(check: string) #\\\"\\n//     Given the actions of an LLM agent executing a test case, and a screenshot taken afterwards, evaluate whether the provided check \\\"passes\\\" i.e. holds true or not.\\n\\n//     Check to evaluate:\\n//     <check>{{ check }}</check>\\n// \\\"#\\n\\n// function EvaluateCheck (context: ModularMemoryContext, check: string) -> EvaluatedCheck {\\n//     client GeminiPro\\n//     prompt #\\\"\\n//         {{ InstructionsWithContext(context, CheckInstructions(check)) }}\\n//     \\\"#\\n// }\\n\\n// Moondream struggles to handle converted check, this is a bypass to use big model to evaluate check directly\\n// function EvaluateCheck (context: BrowserExecutionContext, check: string) -> EvaluatedCheck {\\n//     client GeminiPro\\n//     prompt #\\\"\\n//         {{ _.role(\\\"system\\\") }}\\n//         Given the actions of an LLM agent executing a test case, and a screenshot taken afterwards, evaluate whether the provided check \\\"passes\\\" i.e. holds true or not.\\n//         {{ ctx.output_format }}\\n\\n//         {{ _.role(\\\"user\\\")}}\\n//         Check to evaluate:\\n//         <check>{{ check }}</check>\\n\\n//         {{ DescribeBrowserExecutionContext(context) }}\\n//     \\\"# \\n// }\\n\",\n}\nexport const getBamlFiles = () => {\n    return fileMap;\n}","import pino from 'pino';\n\nexport const logger = pino({\n    level: process.env.MAGNITUDE_LOG_LEVEL || 'warn',\n    transport: process.stdout.isTTY ? {\n        target: 'pino-pretty',\n        options: {\n            colorize: !process.env.NO_COLOR,\n            translateTime: 'SYS:HH:MM:ss.l',\n            ignore: 'pid,hostname'\n        }\n    } : undefined\n}).child({\n    name: \"agent\"\n});\n\nexport default logger;\n","import logger from '@/logger';\nimport EventEmitter from \"eventemitter3\";\nimport z from \"zod\";\n\nimport { Action } from \"@/actions/types\";\nimport { ModelHarness } from \"@/ai/modelHarness\";\nimport { AgentEvents } from \"@/common/events\";\nimport { AgentConnector } from '@/connectors';\nimport { Observation } from '@/memory/observation';\nimport { LLMClient } from \"@/ai/types\";\nimport { AgentError } from \"@/agent/errors\";\nimport { AgentMemory } from \"@/memory\";\nimport { ActionDefinition } from \"@/actions\";\nimport { taskActions } from \"@/actions/taskActions\";\nimport { traceAsync } from \"@/ai/baml_client\";\nimport { telemetrifyAgent } from '@/telemetry/events';\n\n\nexport interface AgentOptions {\n    llm?: LLMClient;\n    connectors?: AgentConnector[];\n    actions?: ActionDefinition<any>[]; // any additional actions not provided by connectors\n    prompt?: string | null; // additional agent-level system prompt instructions\n    telemetry?: boolean;\n    //executor?: GroundingClient;\n}\n\nexport interface ActOptions {\n    prompt?: string // additional task-level system prompt instructions\n    // TODO: reimpl, or maybe for tc agent specifically\n\tdata?: string | Record<string, string>\n}\n\n// Options for the startAgent helper function\n\nconst DEFAULT_CONFIG: Required<Omit<AgentOptions, 'actions'> & { actions: ActionDefinition<any>[] }> = {\n    actions: [...taskActions], // Default to taskActions; other actions come from connectors\n    connectors: [],\n    llm: {\n        provider: 'google-ai',\n        options: {\n            model: 'gemini-2.5-pro-preview-05-06',\n            apiKey: process.env.GOOGLE_API_KEY || \"YOUR_GOOGLE_API_KEY\"\n        }\n    } as LLMClient,\n    prompt: null,\n    telemetry: true,\n};\n\nexport class Agent {\n    // maybe remove conns/actions from options since stored sep\n    private options: Required<AgentOptions>//Omit<Required<AgentOptions>, 'actions'>;\n    private connectors: AgentConnector[];\n    private actions: ActionDefinition<any>[]; // actions from connectors + any other additional ones configured\n\n    public readonly model: ModelHarness;\n    //public readonly micro: GroundingService;\n    //public readonly events: EventEmitter<AgentEvents>;\n\n    //protected readonly _emitter: EventEmitter<AgentEvents>;\n    public readonly events: EventEmitter<AgentEvents> = new EventEmitter();\n    \n    //public readonly memory: AgentMemory;\n    private doneActing: boolean;\n\n    protected latestTaskMemory: AgentMemory;// | null = null;\n\n    constructor(baseConfig: Partial<AgentOptions> = {}) {\n        this.options = {\n            ...DEFAULT_CONFIG,\n            ...baseConfig,\n            connectors: baseConfig.connectors ?? [],\n            actions: [...(baseConfig.actions || DEFAULT_CONFIG.actions)], \n        } as Required<AgentOptions>;\n\n        this.connectors = this.options.connectors;\n\n        // Aggregate actions from connectors\n        //const aggregatedActions = [...this.options.actions];\n        this.actions = [...this.options.actions];\n        for (const connector of this.connectors) {\n            this.actions.push(...(connector.getActionSpace ? connector.getActionSpace() : []));\n        }\n        // Deduplicate actions by name\n        // TODO: maybe error instead, or automatically differentiate them?\n        //this.options.actions = Array.from(new Map(aggregatedActions.map(actDef => [actDef.name, actDef])).values());\n        \n        this.model = new ModelHarness({ llm: this.options.llm });\n        this.model.events.on('tokensUsed', (usage) => this.events.emit('tokensUsed', usage), this);\n        this.doneActing = false;\n\n        // Empty memory will get replaced on first act(), but this prevents errors from having undefined memory\n        this.latestTaskMemory = new AgentMemory();\n    }\n\n    public getConnector<C extends AgentConnector>(\n        connectorClass: new (...args: any[]) => C\n    ): C | undefined {\n        return this.connectors.find(c => c instanceof connectorClass) as C | undefined;\n    }\n\n    public require<C extends AgentConnector>(\n        connectorClass: new (...args: any[]) => C\n    ): C {\n        const connector = this.getConnector(connectorClass);\n        if (!connector) throw new Error(`Missing required connector ${connectorClass}`);\n        return connector;\n    }\n\n    async start(): Promise<void> { \n        // Register telemetry if enabled - do on start instead of cons to prevent weird subclass event issues\n        if (this.options.telemetry) telemetrifyAgent(this);\n\n        logger.info(\"Agent: Starting connectors...\");\n        for (const connector of this.connectors) {\n            if (connector.onStart) await connector.onStart(); \n        }\n        this.events.emit('start');\n        logger.info(\"Agent: All connectors started.\");\n\n        // logger.info(\"Making initial observations...\");\n        // await this._recordConnectorObservations();\n        // logger.info(\"Initial observations recorded\");\n        // Initial observations are handled by the first getObservations call in exec\n    }\n\n    identifyAction(action: Action) {\n        // Get definition corresponding to an action\n        const actionDefinition = this.actions.find(def => def.name === action.variant);\n\n        if (!actionDefinition) {\n            // It's possible the action name was from a connector that is no longer active,\n            // or the action space was not correctly aggregated.\n            throw new AgentError(`Undefined action type '${action.variant}'. Ensure agent is configured with appropriate action definitions from connectors.`);\n        }\n        return actionDefinition;\n    }\n    \n    async exec(action: Action, memory?: AgentMemory): Promise<void> {\n        /**\n         * Execute an action that belongs to this Agent's action space.\n         * Provide memory to record the action taken, its results, and any connector observations to that memory.\n         */\n        let actionDefinition = this.identifyAction(action);\n        \n        let input: any;\n        if (actionDefinition.schema instanceof z.ZodObject) {\n            let variant: string;\n            ({ variant, ...input } = action);\n        } else {\n            input = (action as any).input; \n        }\n\n        let parsed = actionDefinition.schema.safeParse(input);\n\n        if (!parsed.success) {\n            throw new AgentError(`Generated action '${action.variant}' violates input schema: ${parsed.error.message}`, { adaptable: true });\n        }\n\n        this.events.emit('actionStarted', action);\n        \n        const data = await actionDefinition.resolver(\n            { input: parsed.data, agent: this }\n        );\n\n        this.events.emit('actionDone', action);\n\n        if (memory) {\n            // Record action taken\n            memory.recordObservation(Observation.fromActionTaken(actionDefinition.name, JSON.stringify(action)));\n\n            // Record results of action\n            if (data) {\n                memory.recordObservation(Observation.fromActionResult(actionDefinition.name, data));\n            }\n\n            // Collect and record observations from connectors\n            await this._recordConnectorObservations(memory);\n        }\n    }\n\n    protected async _recordConnectorObservations(memory: AgentMemory) {\n        for (const connector of this.connectors) {\n            try {\n                // could do Promise.all if matters\n                const connObservations = connector.collectObservations ? await connector.collectObservations() : [];\n                //observations.push(...connObservations);\n                for (const obs of connObservations) {\n                    memory.recordObservation(obs);\n                }\n            } catch (error) {\n                logger.warn(`Agent: Error getting observations from connector ${connector.id}: ${error instanceof Error ? error.message : String(error)}`);\n            }\n        }\n    }\n\n    get memory(): AgentMemory {\n        //if (!this.latestTaskMemory) throw new Error(\"No memory available\");\n        return this.latestTaskMemory;\n    }\n\n    async act(taskOrSteps: string | string[], options: ActOptions = {}): Promise<void> {\n        const instructions = [\n            ...(this.options.prompt ? [this.options.prompt] : []),\n            ...(options.prompt ? [options.prompt] : []),\n        ].join('\\n');\n        const taskMemory = new AgentMemory(instructions === '' ? undefined : instructions);\n\n        if (Array.isArray(taskOrSteps)) {\n            const steps = taskOrSteps;\n\n            //this.events.emit('actStarted', steps.join(', '));\n\n            // trace overall task\n            await (traceAsync('multistep', async (steps: string[], options: ActOptions) => {\n                for (const step of steps) {\n                    this.events.emit('actStarted', step, options);\n                    await this._traceAct(step, taskMemory, options);\n                    this.events.emit('actDone', step, options);\n                }\n            })(steps, options));\n\n            //this.events.emit('actDone', steps.join(', '));\n        } else {\n            const task = taskOrSteps;\n\n            this.events.emit('actStarted', task, options);\n\n            await this._traceAct(task, taskMemory, options);\n            this.events.emit('actDone', task, options);\n        }\n    }\n\n    async _traceAct(task: string, memory: AgentMemory, options: ActOptions = {}) {\n        // memory not serializable to trace so bake it\n        await (traceAsync('act', async (task: string, options: ActOptions) => {\n            await this._act(task, memory, options);\n        })(task, options));\n    }\n\n    async _act(description: string, memory: AgentMemory, options: ActOptions = {}): Promise<void> {\n        this.doneActing = false;\n        logger.info(`Act: ${description}`);\n\n        // for now simply add data to task\n        if (options.data) {\n            //description += \"\\nUse the following data where appropriate:\\n\";\n            description += \"\\n<data>\\n\";\n            if (typeof options.data === 'string') {\n                description += options.data;\n            } else {\n                description += Object.entries(options.data).map(([k, v]) => `${k}: ${v}`).join(\"\\n\");\n            }\n            description += \"\\n</data>\";\n        }\n        //this.events.emit('stepStart', description);\n\n        //const testData = convertOptionsToTestData(options);\n\n        // Initialize task memory and record initial observations\n        // Combine any agent-level and task-level instructions\n        \n        this.latestTaskMemory = memory;\n\n        // record initial observations\n        logger.info(\"Making initial observations...\");\n        await this._recordConnectorObservations(memory);\n        logger.info(\"Initial observations recorded\");\n\n        while (true) {\n            // Removed direct screenshot/tabState access here; it's part of memoryContext via connectors\n            logger.info(`Creating partial recipe`);\n\n            let reasoning: string;\n            let actions: Action[];\n            try {\n                const memoryContext = await memory.buildContext(this.connectors);\n                ({ reasoning, actions } = await this.model.createPartialRecipe(\n                    memoryContext,\n                    description,\n                    this.actions \n                ));\n            } catch (error: unknown) {\n                logger.error(`Agent: Error creating partial recipe: ${error instanceof Error ? error.message : String(error)}`);\n                /**\n                 * (1) Failure to conform to JSON\n                 * (2) Misconfigured BAML client / bad API key\n                 * (3) Network error (past max retries)\n                 */\n                // this.fail({\n                //     variant: 'misalignment',\n                //     message: `Could not create partial recipe -> ${(error as Error).message}`\n                // });\n                throw new AgentError(\n                    `Could not create partial recipe -> ${(error as Error).message}`, { variant: 'misalignment' }\n                )\n            }\n\n            logger.info({ reasoning, actions }, `Partial recipe created`);\n            \n            // Could be emitted in memory and bubbled up instead of recordThought was called in more places\n            this.events.emit('thought', reasoning);\n            memory.recordThought(reasoning);\n\n            // Execute partial recipe\n            for (const action of actions) {\n                await this.exec(action, memory);\n\n                // const postActionScreenshot = await this.screenshot();\n                // const actionDescriptor: ActionDescriptor = { ...action, screenshot: postActionScreenshot.image } as ActionDescriptor;\n                // this.events.emit('action', actionDescriptor);\n                logger.info({ action }, `Action taken`);\n            }\n\n            // If macro expects these actions should complete the step, break\n            // if (finished) {\n            //     break;\n            // }\n            if (this.doneActing) {\n                break;\n            }\n        }\n\n        logger.info(`Done with step`);\n        //this.events.emit('stepSuccess');\n        //this.currentTaskMemory = null;\n    }\n\n    async query<T extends z.Schema>(query: string, schema: T): Promise<z.infer<T>> {\n        const memoryContext = await this.memory.buildContext(this.connectors);\n        return await this.model.query(memoryContext, query, schema);\n    }\n\n    async queueDone() {\n        this.doneActing = true;\n    }\n\n    async stop() {\n        /**\n         * Stop the agent and close the browser context.\n         * May be called asynchronously and interrupt an agent in the middle of a action sequence.\n         */\n        // set signal to cancelled?\n        logger.info(\"Agent: Stopping connectors...\");\n        for (const connector of this.connectors) {\n            try {\n                if (connector.onStop) await connector.onStop();\n            } catch (error) {\n                logger.warn(`Agent: Error stopping connector ${connector.id}: ${error instanceof Error ? error.message : String(error)}`);\n            }\n        }\n        this.events.emit('stop');\n        logger.info(\"Agent: All connectors stopped.\");\n        logger.info(\"Agent: Stopped successfully.\");\n    }\n\n    // async dumpMemoryJSON() {\n    //     return await this.memory.toJSON();\n    // }\n}\n","import { GroundingClient, type LLMClient } from '@/ai/types';\nimport { Agent, AgentOptions } from \"@/agent\";\nimport { BrowserConnector, BrowserConnectorOptions } from \"@/connectors/browserConnector\";\n\nfunction cleanNestedObject(obj: object): object {\n    // Remove null/undefined key values entirely\n    return Object.fromEntries(\n        Object.entries(obj)\n            // Filter out null/undefined values\n            .filter(([_, value]) => value !== null && value !== undefined)\n            // Process nested objects recursively\n            .map(([key, value]) => [\n                key,\n                typeof value === 'object' ? cleanNestedObject(value) : value\n            ])\n    );\n}\n\nexport function convertToBamlClientOptions(client: LLMClient): Record<string, any> {\n    // extract options compatible with https://docs.boundaryml.com/ref/llm-client-providers/overview\n\n    // Default to temperature 0.0\n    // Some client options (e.g. azure) do not have a temperature setting\n    const temp = 'temperature' in client.options ?\n        (client.options.temperature ?? 0.0) : 0.0;\n\n    let options: object;\n    if (client.provider === 'anthropic') {\n        options = {\n            api_key: client.options.apiKey,\n            model: client.options.model,\n            temperature: temp,\n        };\n    } else if (client.provider === 'aws-bedrock') {\n        options = {\n            model_id: client.options.model,\n            inference_configuration: {\n                temperature: temp,\n            }\n        };\n    } else if (client.provider === 'google-ai') {\n        options = {\n            base_url: client.options.baseUrl,\n            model: client.options.model,\n            api_key: client.options.apiKey,\n            generationConfig: {\n                temperature: temp,\n                //thinking_budget: 0\n            }\n        };\n    } else if (client.provider === 'vertex-ai') {\n        options = {\n            location: client.options.location,\n            base_url: client.options.baseUrl,\n            project_id: client.options.projectId,\n            credentials: client.options.credentials,\n            model: client.options.model,\n            generationConfig: {\n                temperature: temp,\n            }\n        };\n    } else if (client.provider === 'openai') {\n        options = {\n            api_key: client.options.apiKey,\n            model: client.options.model,\n            temperature: temp,\n        };\n    } else if (client.provider === 'openai-generic') {\n        options = {\n            base_url: client.options.baseUrl,\n            api_key: client.options.apiKey,\n            model: client.options.model,\n            temperature: temp,\n            headers: client.options.headers\n        };\n    } else if (client.provider === 'azure-openai') {\n        options = {\n            resource_name: client.options.resourceName,\n            deployment_id: client.options.deploymentId,\n            api_version: client.options.apiVersion,\n            api_key: client.options.apiKey\n        };\n    } else {\n        throw new Error(`Invalid provider: ${(client as any).provider}`)\n    }\n    return cleanNestedObject(options);\n}\n\n\nexport function tryDeriveUIGroundedClient(): LLMClient | null {\n    if (process.env.ANTHROPIC_API_KEY) {\n        return {\n            provider: 'anthropic',\n            options: {\n                // TODO: do more testing on best claude model for visuals\n                // model: 'claude-3-5-sonnet-20240620', // <- definitely not, pre computer use\n                // model: 'claude-3-5-sonnet-20241022', // <- not great on rescaling res\n                //model: 'claude-3-7-sonnet-latest', // <- underplans\n                model: 'claude-sonnet-4-20250514', // <- underplans, also supposedly worse at visual reasoning\n                apiKey: process.env.ANTHROPIC_API_KEY\n            }\n        }\n    } else {\n        return null;\n    }\n}\n\n\n// export function tryDeriveUIGroundedClients(): { llm: LLMClient | null, grounding: GroundingClient | null } {\n//     let llm: LLMClient | null = null;\n//     let grounding: GroundingClient | null = null;\n\n//     // Best: Solo Grounded Claude\n//     if (process.env.ANTHROPIC_API_KEY) {\n//         llm = {\n//             provider: 'anthropic',\n//             options: {\n//                 // TODO: do more testing on best claude model for visuals\n//                 // model: 'claude-3-5-sonnet-20240620', // <- definitely not, pre computer use\n//                 // model: 'claude-3-5-sonnet-20241022', // <- not great on rescaling res\n//                 //model: 'claude-3-7-sonnet-latest', // <- underplans\n//                 model: 'claude-sonnet-4-20250514', // <- underplans, also supposedly worse at visual reasoning\n//                 apiKey: process.env.ANTHROPIC_API_KEY\n//             }\n//         }\n//         return { llm, grounding: null };\n//     }\n\n//     // Solid: Solo Grounded Qwen 2.5 VL 72b\n//     if (process.env.OPENROUTER_API_KEY) {\n//         llm = {\n//             provider: 'openai-generic',\n//             options: {\n//                 baseUrl: \"https://openrouter.ai/api/v1\",\n//                 model: 'qwen/qwen2.5-vl-72b-instruct',\n//                 apiKey: process.env.OPENROUTER_API_KEY\n//             }\n//         }\n//         return { llm, grounding: null };\n//     }\n\n//     if (process.env.GOOGLE_API_KEY) {\n//         // Google AI Studio\n//         llm = {\n//             provider: 'google-ai',\n//             options: {\n//                 model: 'gemini-2.5-pro-preview-03-25',\n//                 apiKey: process.env.GOOGLE_API_KEY\n//             }\n//         }\n//     }\n\n//     if (process.env.OPENAI_API_KEY) {\n//         llm = {\n//             provider: 'openai',\n//             options: {\n//                 model: 'gpt-4.1-2025-04-14',\n//                 apiKey: process.env.OPENAI_API_KEY\n//             }\n//         }\n//     }\n\n//     if (process.env.MOONDREAM_API_KEY) {\n//         grounding = {\n//             provider: 'moondream',\n//             options: {\n//                 apiKey: process.env.MOONDREAM_API_KEY\n//             }\n//         }\n//     }\n\n//     return { llm , grounding };\n// }\n\n// export function isGroundedLlm(llm: LLMClient) {\n//     if (llm.provider === 'anthropic' || llm.provider === 'aws-bedrock' || llm.provider === 'vertex-ai') {\n//         const model = llm.options.model;\n//         const include = ['claude-sonnet', 'claude-opus', 'claude-3-5', 'claude-3-7', 'claude-4'];\n//         const exclude = ['claude-3-5-haiku'];\n//         for (const substr of exclude) {\n//             if (model.includes(substr)) return false;\n//         }\n//         for (const substr of include) {\n//             if (model.includes(substr)) return true;\n//         }\n//     }\n//     if (llm.provider === 'openai-generic') {\n//         const model = llm.options.model;\n//         // models known to be grounded\n//         const include = ['molmo', 'ui-tars', 'qwen2.5-vl', 'holo1', 'jedi'];\n//         for (const substr of include) {\n//             if (model.toLowerCase().includes(substr)) return true;\n//         }\n//     }\n//     return false;\n// }\n\nexport function isClaude(llm: LLMClient) {\n    if ('model' in llm.options) {//if (llm.provider === 'anthropic' || llm.provider === 'aws-bedrock' || llm.provider === 'vertex-ai') {\n        const model = llm.options.model;\n        if (model.includes('claude')) return true;\n    }\n    return false;\n}\n\nconst DEFAULT_BROWSER_AGENT_TEMP = 0.2;\n\nexport function buildDefaultBrowserAgentOptions(\n    { agentOptions, browserOptions }: { agentOptions: AgentOptions, browserOptions: BrowserConnectorOptions }\n): { agentOptions: AgentOptions, browserOptions: BrowserConnectorOptions } {\n    /**\n     * Given any provided options for agent or browser connector, fill out additional key fields using environment,\n     * or any model-specific constraints (e.g. Claude needing 1024x768 virtual screen space)\n     */\n    //const { llm: envLlm, grounding: envGrounding } = tryDeriveUIGroundedClients();\n    const envLlm = tryDeriveUIGroundedClient();\n    \n    let llm: LLMClient | null = agentOptions.llm ?? envLlm;\n    const grounding = browserOptions.grounding;//(llm && isGroundedLlm(llm)) ? null : (browserOptions.grounding ?? envGrounding);\n    \n    if (!llm) {\n        throw new Error(\"No LLM configured or available from environment. Set environment variable ANTHROPIC_API_KEY and try again. See https://docs.magnitude.run/customizing/llm-configuration for details\");\n    }\n    // else if (!isGroundedLlm(llm) && !grounding) {\n    //     throw new Error(\"Ungrounded LLM is configured without Moondream. Either use Anthropic (set ANTHROPIC_API_KEY) or provide a MOONDREAM_API_KEY\");\n    // }\n\n    // Set reasonable temp if not provided\n    let llmOptions: LLMClient['options'] = { temperature: DEFAULT_BROWSER_AGENT_TEMP, ...(llm?.options ?? {}) };\n    llm = {...llm, options: llmOptions as any }\n\n    let virtualScreenDimensions = null;\n    if (isClaude(llm)) {\n        // Claude grounding only really works on 1024x768 screenshots\n        virtualScreenDimensions = { width: 1024, height: 768 };\n    }\n\n    return {\n        agentOptions: {...agentOptions, llm: llm },\n        browserOptions: {...browserOptions, grounding: grounding ?? undefined, virtualScreenDimensions: virtualScreenDimensions ?? undefined }\n    };\n}","/*************************************************************************************************\n\nWelcome to Baml! To use this generated code, please run one of the following:\n\n$ npm install @boundaryml/baml\n$ yarn add @boundaryml/baml\n$ pnpm add @boundaryml/baml\n\n*************************************************************************************************/\n\n// This file was generated by BAML: do not edit it. Instead, edit the BAML\n// files and re-generate this code.\n//\n/* eslint-disable */\n// tslint:disable\n// @ts-nocheck\n// biome-ignore format: autogenerated code\n/**\n * If this import fails, you may need to upgrade @boundaryml/baml.\n * \n * Please upgrade @boundaryml/baml to 0.90.2.\n * \n * $ npm install @boundaryml/baml@0.90.2\n * $ yarn add @boundaryml/baml@0.90.2\n * $ pnpm add @boundaryml/baml@0.90.2\n * \n * If nothing else works, please ask for help:\n * \n * https://github.com/boundaryml/baml/issues\n * https://boundaryml.com/discord\n * \n **/\nimport { ThrowIfVersionMismatch } from \"@boundaryml/baml\";\n\nexport const version = \"0.90.2\";\n\nThrowIfVersionMismatch(version);\n\n\n\nexport { b } from \"./async_client\"\n\nexport * from \"./types\"\nexport type { partial_types } from \"./partial_types\"\nexport * from \"./tracing\"\nexport { resetBamlEnvVars } from \"./globals\"\nexport { BamlClientHttpError, BamlValidationError, BamlClientFinishReasonError } from \"@boundaryml/baml\"","/*************************************************************************************************\n\nWelcome to Baml! To use this generated code, please run one of the following:\n\n$ npm install @boundaryml/baml\n$ yarn add @boundaryml/baml\n$ pnpm add @boundaryml/baml\n\n*************************************************************************************************/\n\n// This file was generated by BAML: do not edit it. Instead, edit the BAML\n// files and re-generate this code.\n//\n/* eslint-disable */\n// tslint:disable\n// @ts-nocheck\n// biome-ignore format: autogenerated code\nimport type { BamlRuntime, FunctionResult, BamlCtxManager, ClientRegistry, Image, Audio, Collector } from \"@boundaryml/baml\"\nimport { toBamlError, BamlStream, type HTTPRequest } from \"@boundaryml/baml\"\nimport type { Checked, Check, RecursivePartialNull as MovedRecursivePartialNull } from \"./types\"\nimport type { partial_types } from \"./partial_types\"\nimport type * as types from \"./types\"\nimport type {BugFailureClassification, ConnectorInstructions, ExtractedData, MisalignmentClassification, ModularMemoryContext, PartialRecipe, QueryResponse} from \"./types\"\nimport type TypeBuilder from \"./type_builder\"\nimport { AsyncHttpRequest, AsyncHttpStreamRequest } from \"./async_request\"\nimport { LlmResponseParser, LlmStreamParser } from \"./parser\"\nimport { DO_NOT_USE_DIRECTLY_UNLESS_YOU_KNOW_WHAT_YOURE_DOING_CTX, DO_NOT_USE_DIRECTLY_UNLESS_YOU_KNOW_WHAT_YOURE_DOING_RUNTIME } from \"./globals\"\n\n/**\n * @deprecated Use RecursivePartialNull from 'baml_client/types' instead.\n */\nexport type RecursivePartialNull<T> = MovedRecursivePartialNull<T>\n\ntype BamlCallOptions = {\n  tb?: TypeBuilder\n  clientRegistry?: ClientRegistry\n  collector?: Collector | Collector[]\n  env?: Record<string, string | undefined>\n}\n\nexport class BamlAsyncClient {\n  private runtime: BamlRuntime\n  private ctxManager: BamlCtxManager\n  private streamClient: BamlStreamClient\n  private httpRequest: AsyncHttpRequest\n  private httpStreamRequest: AsyncHttpStreamRequest\n  private llmResponseParser: LlmResponseParser\n  private llmStreamParser: LlmStreamParser\n  private bamlOptions: BamlCallOptions\n\n  constructor(runtime: BamlRuntime, ctxManager: BamlCtxManager, bamlOptions?: BamlCallOptions) {\n    this.runtime = runtime\n    this.ctxManager = ctxManager\n    this.streamClient = new BamlStreamClient(runtime, ctxManager, bamlOptions)\n    this.httpRequest = new AsyncHttpRequest(runtime, ctxManager)\n    this.httpStreamRequest = new AsyncHttpStreamRequest(runtime, ctxManager)\n    this.llmResponseParser = new LlmResponseParser(runtime, ctxManager)\n    this.llmStreamParser = new LlmStreamParser(runtime, ctxManager)\n    this.bamlOptions = bamlOptions || {}\n  }\n\n  withOptions(bamlOptions: BamlCallOptions) {\n    return new BamlAsyncClient(this.runtime, this.ctxManager, bamlOptions)\n  }\n\n  get stream() {\n    return this.streamClient\n  }\n\n  get request() {\n    return this.httpRequest\n  }\n\n  get streamRequest() {\n    return this.httpStreamRequest\n  }\n\n  get parse() {\n    return this.llmResponseParser\n  }\n\n  get parseStream() {\n    return this.llmStreamParser\n  }\n\n  \n  async CreatePartialRecipe(\n      memory: ModularMemoryContext,task: string,\n      __baml_options__?: BamlCallOptions\n  ): Promise<PartialRecipe> {\n    try {\n      const options = { ...this.bamlOptions, ...(__baml_options__ || {}) }\n      const collector = options.collector ? (Array.isArray(options.collector) ? options.collector : [options.collector]) : [];\n      const env = options.env ? { ...process.env, ...options.env } : { ...process.env };\n      const raw = await this.runtime.callFunction(\n        \"CreatePartialRecipe\",\n        {\n          \"memory\": memory,\"task\": task\n        },\n        this.ctxManager.cloneContext(),\n        options.tb?.__tb(),\n        options.clientRegistry,\n        collector,\n        env,\n      )\n      return raw.parsed(false) as PartialRecipe\n    } catch (error) {\n      throw toBamlError(error);\n    }\n  }\n  \n  async ExtractData(\n      instructions: string,screenshot: Image,domContent: string,\n      __baml_options__?: BamlCallOptions\n  ): Promise<ExtractedData> {\n    try {\n      const options = { ...this.bamlOptions, ...(__baml_options__ || {}) }\n      const collector = options.collector ? (Array.isArray(options.collector) ? options.collector : [options.collector]) : [];\n      const env = options.env ? { ...process.env, ...options.env } : { ...process.env };\n      const raw = await this.runtime.callFunction(\n        \"ExtractData\",\n        {\n          \"instructions\": instructions,\"screenshot\": screenshot,\"domContent\": domContent\n        },\n        this.ctxManager.cloneContext(),\n        options.tb?.__tb(),\n        options.clientRegistry,\n        collector,\n        env,\n      )\n      return raw.parsed(false) as ExtractedData\n    } catch (error) {\n      throw toBamlError(error);\n    }\n  }\n  \n  async QueryMemory(\n      memory: ModularMemoryContext,query: string,\n      __baml_options__?: BamlCallOptions\n  ): Promise<QueryResponse> {\n    try {\n      const options = { ...this.bamlOptions, ...(__baml_options__ || {}) }\n      const collector = options.collector ? (Array.isArray(options.collector) ? options.collector : [options.collector]) : [];\n      const env = options.env ? { ...process.env, ...options.env } : { ...process.env };\n      const raw = await this.runtime.callFunction(\n        \"QueryMemory\",\n        {\n          \"memory\": memory,\"query\": query\n        },\n        this.ctxManager.cloneContext(),\n        options.tb?.__tb(),\n        options.clientRegistry,\n        collector,\n        env,\n      )\n      return raw.parsed(false) as QueryResponse\n    } catch (error) {\n      throw toBamlError(error);\n    }\n  }\n  \n}\n\nclass BamlStreamClient {\n  private runtime: BamlRuntime\n  private ctxManager: BamlCtxManager\n  private bamlOptions: BamlCallOptions\n\n  constructor(runtime: BamlRuntime, ctxManager: BamlCtxManager, bamlOptions?: BamlCallOptions) {\n    this.runtime = runtime\n    this.ctxManager = ctxManager\n    this.bamlOptions = bamlOptions || { env: { ...process.env } }\n  }\n\n  \n  CreatePartialRecipe(\n      memory: ModularMemoryContext,task: string,\n      __baml_options__?: { tb?: TypeBuilder, clientRegistry?: ClientRegistry, collector?: Collector | Collector[], env?: Record<string, string | undefined> }\n  ): BamlStream<partial_types.PartialRecipe, PartialRecipe> {\n    try {\n      const options = { ...this.bamlOptions, ...(__baml_options__ || {}) }\n      const collector = options.collector ? (Array.isArray(options.collector) ? options.collector : [options.collector]) : [];\n      const env = options.env ? { ...process.env, ...options.env } : { ...process.env };\n      const raw = this.runtime.streamFunction(\n        \"CreatePartialRecipe\",\n        {\n          \"memory\": memory,\"task\": task\n        },\n        undefined,\n        this.ctxManager.cloneContext(),\n        options.tb?.__tb(),\n        options.clientRegistry,\n        collector,\n        env,\n      )\n      return new BamlStream<partial_types.PartialRecipe, PartialRecipe>(\n        raw,\n        (a): partial_types.PartialRecipe => a,\n        (a): PartialRecipe => a,\n        this.ctxManager.cloneContext(),\n      )\n    } catch (error) {\n      throw toBamlError(error);\n    }\n  }\n  \n  ExtractData(\n      instructions: string,screenshot: Image,domContent: string,\n      __baml_options__?: { tb?: TypeBuilder, clientRegistry?: ClientRegistry, collector?: Collector | Collector[], env?: Record<string, string | undefined> }\n  ): BamlStream<partial_types.ExtractedData, ExtractedData> {\n    try {\n      const options = { ...this.bamlOptions, ...(__baml_options__ || {}) }\n      const collector = options.collector ? (Array.isArray(options.collector) ? options.collector : [options.collector]) : [];\n      const env = options.env ? { ...process.env, ...options.env } : { ...process.env };\n      const raw = this.runtime.streamFunction(\n        \"ExtractData\",\n        {\n          \"instructions\": instructions,\"screenshot\": screenshot,\"domContent\": domContent\n        },\n        undefined,\n        this.ctxManager.cloneContext(),\n        options.tb?.__tb(),\n        options.clientRegistry,\n        collector,\n        env,\n      )\n      return new BamlStream<partial_types.ExtractedData, ExtractedData>(\n        raw,\n        (a): partial_types.ExtractedData => a,\n        (a): ExtractedData => a,\n        this.ctxManager.cloneContext(),\n      )\n    } catch (error) {\n      throw toBamlError(error);\n    }\n  }\n  \n  QueryMemory(\n      memory: ModularMemoryContext,query: string,\n      __baml_options__?: { tb?: TypeBuilder, clientRegistry?: ClientRegistry, collector?: Collector | Collector[], env?: Record<string, string | undefined> }\n  ): BamlStream<partial_types.QueryResponse, QueryResponse> {\n    try {\n      const options = { ...this.bamlOptions, ...(__baml_options__ || {}) }\n      const collector = options.collector ? (Array.isArray(options.collector) ? options.collector : [options.collector]) : [];\n      const env = options.env ? { ...process.env, ...options.env } : { ...process.env };\n      const raw = this.runtime.streamFunction(\n        \"QueryMemory\",\n        {\n          \"memory\": memory,\"query\": query\n        },\n        undefined,\n        this.ctxManager.cloneContext(),\n        options.tb?.__tb(),\n        options.clientRegistry,\n        collector,\n        env,\n      )\n      return new BamlStream<partial_types.QueryResponse, QueryResponse>(\n        raw,\n        (a): partial_types.QueryResponse => a,\n        (a): QueryResponse => a,\n        this.ctxManager.cloneContext(),\n      )\n    } catch (error) {\n      throw toBamlError(error);\n    }\n  }\n  \n}\n\nexport const b = new BamlAsyncClient(DO_NOT_USE_DIRECTLY_UNLESS_YOU_KNOW_WHAT_YOURE_DOING_RUNTIME, DO_NOT_USE_DIRECTLY_UNLESS_YOU_KNOW_WHAT_YOURE_DOING_CTX)","/*************************************************************************************************\n\nWelcome to Baml! To use this generated code, please run one of the following:\n\n$ npm install @boundaryml/baml\n$ yarn add @boundaryml/baml\n$ pnpm add @boundaryml/baml\n\n*************************************************************************************************/\n\n// This file was generated by BAML: do not edit it. Instead, edit the BAML\n// files and re-generate this code.\n//\n/* eslint-disable */\n// tslint:disable\n// @ts-nocheck\n// biome-ignore format: autogenerated code\nimport type { BamlRuntime, BamlCtxManager, ClientRegistry, Image, Audio } from \"@boundaryml/baml\"\nimport { toBamlError, HTTPRequest } from \"@boundaryml/baml\"\nimport type { Checked, Check } from \"./types\"\nimport type * as types from \"./types\"\nimport type {BugFailureClassification, ConnectorInstructions, ExtractedData, MisalignmentClassification, ModularMemoryContext, PartialRecipe, QueryResponse} from \"./types\"\nimport type TypeBuilder from \"./type_builder\"\n\ntype BamlCallOptions = {\n  tb?: TypeBuilder\n  clientRegistry?: ClientRegistry\n  env?: Record<string, string | undefined>\n}\n\nexport class AsyncHttpRequest {\n  constructor(private runtime: BamlRuntime, private ctxManager: BamlCtxManager) {}\n\n  \n  async CreatePartialRecipe(\n      memory: ModularMemoryContext,task: string,\n      __baml_options__?: BamlCallOptions\n  ): Promise<HTTPRequest> {\n    try {\n      const env = __baml_options__?.env ? { ...process.env, ...__baml_options__.env } : { ...process.env };\n      return await this.runtime.buildRequest(\n        \"CreatePartialRecipe\",\n        {\n          \"memory\": memory,\"task\": task\n        },\n        this.ctxManager.cloneContext(),\n        __baml_options__?.tb?.__tb(),\n        __baml_options__?.clientRegistry,\n        false,\n        env\n      )\n    } catch (error) {\n      throw toBamlError(error);\n    }\n  }\n  \n  async ExtractData(\n      instructions: string,screenshot: Image,domContent: string,\n      __baml_options__?: BamlCallOptions\n  ): Promise<HTTPRequest> {\n    try {\n      const env = __baml_options__?.env ? { ...process.env, ...__baml_options__.env } : { ...process.env };\n      return await this.runtime.buildRequest(\n        \"ExtractData\",\n        {\n          \"instructions\": instructions,\"screenshot\": screenshot,\"domContent\": domContent\n        },\n        this.ctxManager.cloneContext(),\n        __baml_options__?.tb?.__tb(),\n        __baml_options__?.clientRegistry,\n        false,\n        env\n      )\n    } catch (error) {\n      throw toBamlError(error);\n    }\n  }\n  \n  async QueryMemory(\n      memory: ModularMemoryContext,query: string,\n      __baml_options__?: BamlCallOptions\n  ): Promise<HTTPRequest> {\n    try {\n      const env = __baml_options__?.env ? { ...process.env, ...__baml_options__.env } : { ...process.env };\n      return await this.runtime.buildRequest(\n        \"QueryMemory\",\n        {\n          \"memory\": memory,\"query\": query\n        },\n        this.ctxManager.cloneContext(),\n        __baml_options__?.tb?.__tb(),\n        __baml_options__?.clientRegistry,\n        false,\n        env\n      )\n    } catch (error) {\n      throw toBamlError(error);\n    }\n  }\n  \n}\n\nexport class AsyncHttpStreamRequest {\n  constructor(private runtime: BamlRuntime, private ctxManager: BamlCtxManager) {}\n\n  \n  async CreatePartialRecipe(\n      memory: ModularMemoryContext,task: string,\n      __baml_options__?: BamlCallOptions\n  ): Promise<HTTPRequest> {\n    try {\n      const env = __baml_options__?.env ? { ...process.env, ...__baml_options__.env } : { ...process.env };\n      return await this.runtime.buildRequest(\n        \"CreatePartialRecipe\",\n        {\n          \"memory\": memory,\"task\": task\n        },\n        this.ctxManager.cloneContext(),\n        __baml_options__?.tb?.__tb(),\n        __baml_options__?.clientRegistry,\n        true,\n        env\n      )\n    } catch (error) {\n      throw toBamlError(error);\n    }\n  }\n  \n  async ExtractData(\n      instructions: string,screenshot: Image,domContent: string,\n      __baml_options__?: BamlCallOptions\n  ): Promise<HTTPRequest> {\n    try {\n      const env = __baml_options__?.env ? { ...process.env, ...__baml_options__.env } : { ...process.env };\n      return await this.runtime.buildRequest(\n        \"ExtractData\",\n        {\n          \"instructions\": instructions,\"screenshot\": screenshot,\"domContent\": domContent\n        },\n        this.ctxManager.cloneContext(),\n        __baml_options__?.tb?.__tb(),\n        __baml_options__?.clientRegistry,\n        true,\n        env\n      )\n    } catch (error) {\n      throw toBamlError(error);\n    }\n  }\n  \n  async QueryMemory(\n      memory: ModularMemoryContext,query: string,\n      __baml_options__?: BamlCallOptions\n  ): Promise<HTTPRequest> {\n    try {\n      const env = __baml_options__?.env ? { ...process.env, ...__baml_options__.env } : { ...process.env };\n      return await this.runtime.buildRequest(\n        \"QueryMemory\",\n        {\n          \"memory\": memory,\"query\": query\n        },\n        this.ctxManager.cloneContext(),\n        __baml_options__?.tb?.__tb(),\n        __baml_options__?.clientRegistry,\n        true,\n        env\n      )\n    } catch (error) {\n      throw toBamlError(error);\n    }\n  }\n  \n}","/*************************************************************************************************\n\nWelcome to Baml! To use this generated code, please run one of the following:\n\n$ npm install @boundaryml/baml\n$ yarn add @boundaryml/baml\n$ pnpm add @boundaryml/baml\n\n*************************************************************************************************/\n\n// This file was generated by BAML: do not edit it. Instead, edit the BAML\n// files and re-generate this code.\n//\n/* eslint-disable */\n// tslint:disable\n// @ts-nocheck\n// biome-ignore format: autogenerated code\nimport type { BamlRuntime, BamlCtxManager, ClientRegistry, Image, Audio, Collector } from \"@boundaryml/baml\"\nimport { toBamlError } from \"@boundaryml/baml\"\nimport type { Checked, Check } from \"./types\"\nimport type { partial_types } from \"./partial_types\"\nimport type * as types from \"./types\"\nimport type {BugFailureClassification, ConnectorInstructions, ExtractedData, MisalignmentClassification, ModularMemoryContext, PartialRecipe, QueryResponse} from \"./types\"\nimport type TypeBuilder from \"./type_builder\"\n\nexport class LlmResponseParser {\n  constructor(private runtime: BamlRuntime, private ctxManager: BamlCtxManager) {}\n\n  \n  CreatePartialRecipe(\n      llmResponse: string,\n      __baml_options__?: { tb?: TypeBuilder, clientRegistry?: ClientRegistry }\n  ): PartialRecipe {\n    try {\n      const env = __baml_options__?.env ? { ...process.env, ...__baml_options__.env } : { ...process.env };\n      return this.runtime.parseLlmResponse(\n        \"CreatePartialRecipe\",\n        llmResponse,\n        false,\n        this.ctxManager.cloneContext(),\n        __baml_options__?.tb?.__tb(),\n        __baml_options__?.clientRegistry,\n        env,\n      ) as PartialRecipe\n    } catch (error) {\n      throw toBamlError(error);\n    }\n  }\n  \n  ExtractData(\n      llmResponse: string,\n      __baml_options__?: { tb?: TypeBuilder, clientRegistry?: ClientRegistry }\n  ): ExtractedData {\n    try {\n      const env = __baml_options__?.env ? { ...process.env, ...__baml_options__.env } : { ...process.env };\n      return this.runtime.parseLlmResponse(\n        \"ExtractData\",\n        llmResponse,\n        false,\n        this.ctxManager.cloneContext(),\n        __baml_options__?.tb?.__tb(),\n        __baml_options__?.clientRegistry,\n        env,\n      ) as ExtractedData\n    } catch (error) {\n      throw toBamlError(error);\n    }\n  }\n  \n  QueryMemory(\n      llmResponse: string,\n      __baml_options__?: { tb?: TypeBuilder, clientRegistry?: ClientRegistry }\n  ): QueryResponse {\n    try {\n      const env = __baml_options__?.env ? { ...process.env, ...__baml_options__.env } : { ...process.env };\n      return this.runtime.parseLlmResponse(\n        \"QueryMemory\",\n        llmResponse,\n        false,\n        this.ctxManager.cloneContext(),\n        __baml_options__?.tb?.__tb(),\n        __baml_options__?.clientRegistry,\n        env,\n      ) as QueryResponse\n    } catch (error) {\n      throw toBamlError(error);\n    }\n  }\n  \n}\n\nexport class LlmStreamParser {\n  constructor(private runtime: BamlRuntime, private ctxManager: BamlCtxManager) {}\n\n  \n  CreatePartialRecipe(\n      llmResponse: string,\n      __baml_options__?: { tb?: TypeBuilder, clientRegistry?: ClientRegistry }\n  ): partial_types.PartialRecipe {\n    try {\n      const env = __baml_options__?.env ? { ...process.env, ...__baml_options__.env } : { ...process.env };\n      return this.runtime.parseLlmResponse(\n        \"CreatePartialRecipe\",\n        llmResponse,\n        true,\n        this.ctxManager.cloneContext(),\n        __baml_options__?.tb?.__tb(),\n        __baml_options__?.clientRegistry,\n        env,\n      ) as partial_types.PartialRecipe\n    } catch (error) {\n      throw toBamlError(error);\n    }\n  }\n  \n  ExtractData(\n      llmResponse: string,\n      __baml_options__?: { tb?: TypeBuilder, clientRegistry?: ClientRegistry }\n  ): partial_types.ExtractedData {\n    try {\n      const env = __baml_options__?.env ? { ...process.env, ...__baml_options__.env } : { ...process.env };\n      return this.runtime.parseLlmResponse(\n        \"ExtractData\",\n        llmResponse,\n        true,\n        this.ctxManager.cloneContext(),\n        __baml_options__?.tb?.__tb(),\n        __baml_options__?.clientRegistry,\n        env,\n      ) as partial_types.ExtractedData\n    } catch (error) {\n      throw toBamlError(error);\n    }\n  }\n  \n  QueryMemory(\n      llmResponse: string,\n      __baml_options__?: { tb?: TypeBuilder, clientRegistry?: ClientRegistry }\n  ): partial_types.QueryResponse {\n    try {\n      const env = __baml_options__?.env ? { ...process.env, ...__baml_options__.env } : { ...process.env };\n      return this.runtime.parseLlmResponse(\n        \"QueryMemory\",\n        llmResponse,\n        true,\n        this.ctxManager.cloneContext(),\n        __baml_options__?.tb?.__tb(),\n        __baml_options__?.clientRegistry,\n        env,\n      ) as partial_types.QueryResponse\n    } catch (error) {\n      throw toBamlError(error);\n    }\n  }\n  \n}","/*************************************************************************************************\n\nWelcome to Baml! To use this generated code, please run one of the following:\n\n$ npm install @boundaryml/baml\n$ yarn add @boundaryml/baml\n$ pnpm add @boundaryml/baml\n\n*************************************************************************************************/\n\n// This file was generated by BAML: do not edit it. Instead, edit the BAML\n// files and re-generate this code.\n//\n/* eslint-disable */\n// tslint:disable\n// @ts-nocheck\n// biome-ignore format: autogenerated code\nimport type { BamlLogEvent } from '@boundaryml/baml';\nimport { DO_NOT_USE_DIRECTLY_UNLESS_YOU_KNOW_WHAT_YOURE_DOING_CTX } from './globals';\n\nconst traceAsync =\nDO_NOT_USE_DIRECTLY_UNLESS_YOU_KNOW_WHAT_YOURE_DOING_CTX.traceFnAsync.bind(DO_NOT_USE_DIRECTLY_UNLESS_YOU_KNOW_WHAT_YOURE_DOING_CTX)\nconst traceSync =\nDO_NOT_USE_DIRECTLY_UNLESS_YOU_KNOW_WHAT_YOURE_DOING_CTX.traceFnSync.bind(DO_NOT_USE_DIRECTLY_UNLESS_YOU_KNOW_WHAT_YOURE_DOING_CTX)\nconst setTags =\nDO_NOT_USE_DIRECTLY_UNLESS_YOU_KNOW_WHAT_YOURE_DOING_CTX.upsertTags.bind(DO_NOT_USE_DIRECTLY_UNLESS_YOU_KNOW_WHAT_YOURE_DOING_CTX)\nconst flush = () => {\n  DO_NOT_USE_DIRECTLY_UNLESS_YOU_KNOW_WHAT_YOURE_DOING_CTX.flush.bind(DO_NOT_USE_DIRECTLY_UNLESS_YOU_KNOW_WHAT_YOURE_DOING_CTX)()\n}\nconst onLogEvent = (callback: undefined | ((event: BamlLogEvent) => void)) =>\nDO_NOT_USE_DIRECTLY_UNLESS_YOU_KNOW_WHAT_YOURE_DOING_CTX.onLogEvent(callback)\n\nexport { traceAsync, traceSync, setTags, flush, onLogEvent }","import { convertToBamlClientOptions } from \"./util\";\n// Import ModularMemoryContext instead of old MemoryContext\nimport { b, ModularMemoryContext } from \"@/ai/baml_client\"; \nimport { Image as BamlImage, Collector, ClientRegistry } from \"@boundaryml/baml\";\nimport { Action, ActionIntent, Intent } from \"@/actions/types\";\nimport { TestStepDefinition } from \"@/types\";\nimport { BamlAsyncClient } from \"./baml_client/async_client\";\nimport logger from \"@/logger\";\nimport { Logger } from 'pino';\nimport { BugDetectedFailure, MisalignmentFailure } from \"@/common\";\nimport { LLMClient, ModelUsage } from \"@/ai/types\";\nimport { TabState } from \"@/web/tabs\";\nimport { ActionDefinition } from \"@/actions\";\nimport TypeBuilder from \"./baml_client/type_builder\";\nimport { Schema, z } from 'zod';\nimport { convertActionDefinitionsToBaml, convertZodToBaml } from \"@/actions/util\";\nimport { Image } from '@/memory/image';\nimport EventEmitter from \"eventemitter3\";\n\ninterface ModelHarnessOptions {\n    llm: LLMClient;\n}\n\n// export interface ModelUsage {\n//     provider: string,\n//     model: string,\n//     inputTokens: number,\n//     outputTokens: number,\n//     numCalls: number\n// }\n\nexport interface ModelHarnessEvents {\n    'tokensUsed': (usage: ModelUsage) => {}\n}\n\nexport class ModelHarness {\n    /**\n     * Strong reasoning agent for high level strategy and planning.\n     */\n    public readonly events: EventEmitter<ModelHarnessEvents> = new EventEmitter();\n    private options: ModelHarnessOptions;\n    private collector: Collector;\n    private cr: ClientRegistry;\n    private baml: BamlAsyncClient;\n    private logger: Logger;\n    private prevTotalInputTokens: number = 0;\n    private prevTotalOutputTokens: number = 0;\n\n    constructor(options: { llm: LLMClient } & Partial<ModelHarnessOptions>) {\n        this.options = options;\n        //this.llm = options.llm\n        this.collector = new Collector(\"macro\");\n        this.cr = new ClientRegistry();\n        const client = this.options.llm;\n        let bamlClientOptions = convertToBamlClientOptions(this.options.llm);\n        this.cr.addLlmClient('Macro', client.provider, bamlClientOptions, 'DefaultRetryPolicy');\n        this.cr.setPrimary('Macro');\n\n        this.baml = b.withOptions({ collector: this.collector, clientRegistry: this.cr });\n        this.logger = logger.child({ name: 'llm' });\n    }\n\n    // getInfo(): ModelUsage {\n    //     return {\n    //         provider: this.options.client.provider,\n    //         model: 'model' in this.options.client.options ?\n    //             this.options.client.options.model : 'unknown',\n    //         inputTokens: this.collector.usage.inputTokens ?? 0,\n    //         outputTokens: this.collector.usage.outputTokens ?? 0,\n    //         numCalls: this.collector.logs.length\n    //     }\n    // }\n\n    reportUsage(): void {\n        // Get tokens used since last call to reportUsage\n        const inputTokens = (this.collector.usage.inputTokens ?? 0) - this.prevTotalInputTokens;\n        const outputTokens = (this.collector.usage.outputTokens ?? 0) - this.prevTotalOutputTokens;\n\n        const usage: ModelUsage = {\n            llm: {\n                provider: this.options.llm.provider,\n                model: (this.options.llm.options as any).model ?? 'unknown'\n            },//this.options.llm,\n            inputTokens: inputTokens,\n            outputTokens: outputTokens\n        };\n        this.events.emit('tokensUsed', usage);\n\n        this.prevTotalInputTokens = inputTokens;\n        this.prevTotalOutputTokens = outputTokens;\n    }\n\n    async createPartialRecipe<T>(\n        context: ModularMemoryContext, // Changed to ModularMemoryContext\n        task: string,\n        actionVocabulary: ActionDefinition<T>[]\n    ): Promise<{ reasoning: string, actions: Action[] }> {\n        const tb = new TypeBuilder();\n\n        tb.PartialRecipe.addProperty('actions', tb.list(convertActionDefinitionsToBaml(tb, actionVocabulary)));\n\n        const start = Date.now();\n        // Assuming this.baml.CreatePartialRecipe is now typed to accept ModularMemoryContext\n        // after BAML generation picked up changes in planner.baml\n        const response = await this.baml.CreatePartialRecipe( \n            context,\n            task,\n            { tb }\n        );\n        this.logger.trace(`createPartialRecipe took ${Date.now()-start}ms`);\n        // BAML does not carry over action type to @@dynamic of PartialRecipe, so forced cast necssary\n        //return response as unknown as { actions: z.infer<ActionDefinition<T>['schema']>[] };//, finished: boolean };\n        this.reportUsage();\n        return {\n            reasoning: response.reasoning,//(response.observations ? response.observations + \" \" : \"\") + response.meta_reasoning + \" \" + response.reasoning,\n            actions: response.actions// as z.infer<ActionDefinition<T>['schema']>[]\n        }\n    }\n\n    async extract<T extends Schema>(instructions: string, schema: T, screenshot: Image, domContent: string): Promise<z.infer<T>> {\n        const tb = new TypeBuilder();\n\n        if (schema instanceof z.ZodObject) {\n            // populate ExtractedData with schema KVs instead of wrapping in data key unnecessarily\n            for (const [key, fieldSchema] of Object.entries(schema.shape)) {\n                tb.ExtractedData.addProperty(key, convertZodToBaml(tb, fieldSchema as any));\n            }\n        } else {\n            // for array or primitive have to wrap data key\n            tb.ExtractedData.addProperty('data', convertZodToBaml(tb, schema));\n        }\n        // } else if (schema instanceof z.ZodArray) {\n\n        // }\n\n        const resp = await this.baml.ExtractData(instructions, await screenshot.toBaml(), domContent, { tb });\n        this.reportUsage();\n\n        if (schema instanceof z.ZodObject) {\n            return resp;\n        } else {\n            return resp.data;\n        }\n    }\n    // ^ extract could prob be a subset of query w trimmed mem\n\n    async query<T extends Schema>(context: ModularMemoryContext, query: string, schema: T): Promise<z.infer<T>> {\n        const tb = new TypeBuilder();\n\n        if (schema instanceof z.ZodObject) {\n            // populate ExtractedData with schema KVs instead of wrapping in data key unnecessarily\n            for (const [key, fieldSchema] of Object.entries(schema.shape)) {\n                tb.QueryResponse.addProperty(key, convertZodToBaml(tb, fieldSchema as any));\n            }\n        } else {\n            // for array or primitive have to wrap data key\n            tb.QueryResponse.addProperty('data', convertZodToBaml(tb, schema));\n        }\n\n        const resp = await this.baml.QueryMemory(\n            context,\n            query,\n            { tb }\n        );\n        this.reportUsage();\n        \n        if (schema instanceof z.ZodObject) {\n            return resp;\n        } else {\n            return resp.data;\n        }\n    }\n\n    // async classifyCheckFailure(screenshot: Image, check: string, existingRecipe: Action[], tabState: TabState): Promise<BugDetectedFailure | MisalignmentFailure> {\n    //     const stringifiedExistingRecipe = [];\n    //     for (const action of existingRecipe) {\n    //         stringifiedExistingRecipe.push(JSON.stringify(action, null, 4))\n    //     }\n\n    //     const start = Date.now();\n    //     const response = await this.baml.ClassifyCheckFailure(\n    //         {\n    //             screenshot: await screenshot.toBaml(),//Image.fromBase64('image/png', screenshot.image),\n    //             actionHistory: stringifiedExistingRecipe,\n    //             tabState: tabState\n    //         },\n    //         check\n    //     );\n    //     this.logger.trace(`classifyCheckFailure took ${Date.now()-start}ms`);\n    //     //return response.check;\n\n    //     if (response.classification === 'bug') {\n    //         return {\n    //             variant: 'bug',\n    //             title: response.title,\n    //             expectedResult: response.expectedResult,\n    //             actualResult: response.actualResult,\n    //             severity: response.severity\n    //         }\n    //     }\n    //     else {\n    //         return {\n    //             variant: 'misalignment',\n    //             message: response.message\n    //         }\n    //     }\n    // }\n\n    \n\n    // async diagnoseTargetNotFound(\n    //     screenshot: Screenshot,\n    //     step: TestStepDefinition,\n    //     target: string,\n    //     existingRecipe: ActionIngredient[]\n    // ): Promise<BugDetectedFailure | MisalignmentFailure> {\n    //     const downscaledScreenshot = await this.transformScreenshot(screenshot);\n\n    //     const stringifiedExistingRecipe = [];\n    //     for (const action of existingRecipe) {\n    //         stringifiedExistingRecipe.push(JSON.stringify(action, null, 4))\n    //     }\n\n    //     const start = Date.now();\n    //     const response = await this.baml.DiagnoseTargetNotFound(\n    //         Image.fromBase64('image/png', downscaledScreenshot.image),\n    //         step,\n    //         target,\n    //         //action.target,\n    //         //JSON.stringify(action, null, 4),//action,\n    //         stringifiedExistingRecipe\n    //     );\n    //     this.logger.trace(`classifyStepActionFailure took ${Date.now()-start}ms`);\n\n    //     if (response.classification === 'bug') {\n    //         return {\n    //             variant: 'bug',\n    //             title: response.title,\n    //             expectedResult: response.expectedResult,\n    //             actualResult: response.actualResult,\n    //             severity: response.severity\n    //         }\n    //     }\n    //     else {\n    //         return {\n    //             variant: 'misalignment',\n    //             message: response.message\n    //         }\n    //     }\n    // }\n}\n","/*************************************************************************************************\n\nWelcome to Baml! To use this generated code, please run one of the following:\n\n$ npm install @boundaryml/baml\n$ yarn add @boundaryml/baml\n$ pnpm add @boundaryml/baml\n\n*************************************************************************************************/\n\n// This file was generated by BAML: do not edit it. Instead, edit the BAML\n// files and re-generate this code.\n//\n/* eslint-disable */\n// tslint:disable\n// @ts-nocheck\n// biome-ignore format: autogenerated code\nimport { FieldType } from '@boundaryml/baml/native'\nimport { TypeBuilder as _TypeBuilder, EnumBuilder, EnumViewer, ClassBuilder, ClassViewer } from '@boundaryml/baml/type_builder'\nimport { DO_NOT_USE_DIRECTLY_UNLESS_YOU_KNOW_WHAT_YOURE_DOING_RUNTIME } from \"./globals\"\n\nexport default class TypeBuilder {\n    private tb: _TypeBuilder;\n    \n    BugFailureClassification: ClassViewer<'BugFailureClassification', \"reasoning\" | \"classification\" | \"title\" | \"expectedResult\" | \"actualResult\" | \"severity\">;\n    \n    ConnectorInstructions: ClassViewer<'ConnectorInstructions', \"connectorId\" | \"instructions\">;\n    \n    ExtractedData: ClassBuilder<'ExtractedData'>;\n    \n    MisalignmentClassification: ClassViewer<'MisalignmentClassification', \"reasoning\" | \"classification\" | \"fault\" | \"message\">;\n    \n    ModularMemoryContext: ClassViewer<'ModularMemoryContext', \"instructions\" | \"observationContent\" | \"connectorInstructions\">;\n    \n    PartialRecipe: ClassBuilder<'PartialRecipe', \"reasoning\">;\n    \n    QueryResponse: ClassBuilder<'QueryResponse'>;\n    \n    \n\n    constructor() {\n        this.tb = new _TypeBuilder({\n          classes: new Set([\n            \"BugFailureClassification\",\"ConnectorInstructions\",\"ExtractedData\",\"MisalignmentClassification\",\"ModularMemoryContext\",\"PartialRecipe\",\"QueryResponse\",\n          ]),\n          enums: new Set([\n            \n          ]),\n          runtime: DO_NOT_USE_DIRECTLY_UNLESS_YOU_KNOW_WHAT_YOURE_DOING_RUNTIME\n        });\n        \n        this.BugFailureClassification = this.tb.classViewer(\"BugFailureClassification\", [\n          \"reasoning\",\"classification\",\"title\",\"expectedResult\",\"actualResult\",\"severity\",\n        ]);\n        \n        this.ConnectorInstructions = this.tb.classViewer(\"ConnectorInstructions\", [\n          \"connectorId\",\"instructions\",\n        ]);\n        \n        this.ExtractedData = this.tb.classBuilder(\"ExtractedData\", [\n          \n        ]);\n        \n        this.MisalignmentClassification = this.tb.classViewer(\"MisalignmentClassification\", [\n          \"reasoning\",\"classification\",\"fault\",\"message\",\n        ]);\n        \n        this.ModularMemoryContext = this.tb.classViewer(\"ModularMemoryContext\", [\n          \"instructions\",\"observationContent\",\"connectorInstructions\",\n        ]);\n        \n        this.PartialRecipe = this.tb.classBuilder(\"PartialRecipe\", [\n          \"reasoning\",\n        ]);\n        \n        this.QueryResponse = this.tb.classBuilder(\"QueryResponse\", [\n          \n        ]);\n        \n        \n    }\n\n    __tb() {\n      return this.tb._tb();\n    }\n\n    string(): FieldType {\n        return this.tb.string()\n    }\n\n    literalString(value: string): FieldType {\n        return this.tb.literalString(value)\n    }\n\n    literalInt(value: number): FieldType {\n        return this.tb.literalInt(value)\n    }\n\n    literalBool(value: boolean): FieldType {\n        return this.tb.literalBool(value)\n    }\n\n    int(): FieldType {\n        return this.tb.int()\n    }\n\n    float(): FieldType {\n        return this.tb.float()\n    }\n\n    bool(): FieldType {\n        return this.tb.bool()\n    }\n\n    list(type: FieldType): FieldType {\n        return this.tb.list(type)\n    }\n\n    null(): FieldType {\n        return this.tb.null()\n    }\n\n    map(key: FieldType, value: FieldType): FieldType {\n        return this.tb.map(key, value)\n    }\n\n    union(types: FieldType[]): FieldType {\n        return this.tb.union(types)\n    }\n\n    addClass<Name extends string>(name: Name): ClassBuilder<Name> {\n        return this.tb.addClass(name);\n    }\n\n    addEnum<Name extends string>(name: Name): EnumBuilder<Name> {\n        return this.tb.addEnum(name);\n    }\n\n    addBaml(baml: string): void {\n        this.tb.addBaml(baml);\n    }\n}","import { ActionDefinition } from \".\";\nimport { zodToJsonSchema } from \"zod-to-json-schema\";\nimport TypeBuilder from \"@/ai/baml_client/type_builder\";\nimport { FieldType, ClassBuilder, ClassPropertyBuilder, EnumBuilder, EnumValueBuilder } from \"@boundaryml/baml/native\";\nimport { Schema, z, ZodObject, ZodSchema } from \"zod\";\n\nexport interface JsonSchema {\n    type?: string;\n    title?: string;\n    description?: string; // This description at the schema's top level is NOT used for Class or Enum descriptions by the Python script\n    default?: any;\n\n    properties?: Record<string, JsonSchema>;\n    required?: string[];\n    additionalProperties?: boolean | JsonSchema;\n\n    items?: JsonSchema;\n\n    enum?: any[];\n\n    $ref?: string;\n\n    anyOf?: JsonSchema[];\n\n    [key: string]: any;\n}\n\nfunction randomName(): string {\n    const chars = 'abcdefghijklmnopqrstuvwxyz';\n    let result = '';\n    for (let i = 0; i < 12; i++) {\n        result += chars.charAt(Math.floor(Math.random() * chars.length));\n    }\n    return result;\n}\n\nclass SchemaAdder {\n    private tb: TypeBuilder;\n    private rootSchema: JsonSchema;\n    private refCache: Record<string, FieldType> = {};\n\n    constructor(tb: TypeBuilder, rootSchema: JsonSchema) {\n        this.tb = tb;\n        this.rootSchema = rootSchema;\n    }\n\n    private _parseObject(jsonSchema: JsonSchema): FieldType {\n        if (jsonSchema.type !== \"object\") {\n            throw new Error(`_parseObject called with non-object type: ${jsonSchema.type}`);\n        }\n        let name = jsonSchema.title;\n        if (name === undefined || typeof name !== 'string') {\n            // Name doesn't actually affect much if field used as return value anyway, just needs to be unique\n            name = randomName();\n            //throw new Error(\"Title (string) is required in JSON schema for object type that becomes a BAML class.\");\n        }\n\n        const newCls = this.tb.addClass(name);\n\n        const requiredFields = jsonSchema.required || [];\n        if (!Array.isArray(requiredFields) || !requiredFields.every(rf => typeof rf === 'string')) {\n            throw new Error(`'required' property in object '${name}' must be an array of strings.`);\n        }\n\n        const properties = jsonSchema.properties;\n        if (properties && typeof properties === 'object') {\n            for (const [fieldName, fieldSchemaUntyped] of Object.entries(properties)) {\n                if (typeof fieldSchemaUntyped !== 'object' || fieldSchemaUntyped === null) {\n                    console.warn(`Property schema for '${fieldName}' in class '${name}' is not a valid object/schema. Skipping.`);\n                    continue;\n                }\n                const fieldSchema = fieldSchemaUntyped as JsonSchema;\n\n                const defaultValue = fieldSchema.default;\n                let fieldType: FieldType;\n\n                if (fieldSchema.properties === undefined && fieldSchema.type === \"object\") {\n                    console.warn(\n                        `Field '${fieldName}' in class '${name}' uses generic dict type (object without properties) ` +\n                        `which defaults to map<string, string>. ` +\n                        \"If a more specific type is needed, please provide a specific schema with properties.\",\n                    );\n                    fieldType = this.tb.map(this.tb.string(), this.tb.string());\n                } else {\n                    fieldType = this.parse(fieldSchema);\n                }\n\n                if (!requiredFields.includes(fieldName)) {\n                    if (defaultValue === undefined) {\n                        fieldType = fieldType.optional();\n                    }\n                }\n                const propertyBuilder = newCls.addProperty(fieldName, fieldType);\n\n                let fieldDescription = fieldSchema.description;\n                if (typeof fieldDescription === 'string') {\n                    let finalDescription = fieldDescription.trim();\n                    if (defaultValue !== undefined) {\n                        finalDescription = `${finalDescription}\\nDefault: ${JSON.stringify(defaultValue)}`;\n                        finalDescription = finalDescription.trim();\n                    }\n                    if (finalDescription.length > 0) {\n                        propertyBuilder.description(finalDescription);\n                    }\n                } else if (defaultValue !== undefined) {\n                    const defaultDesc = `Default: ${JSON.stringify(defaultValue)}`;\n                    propertyBuilder.description(defaultDesc.trim());\n                }\n            }\n        }\n        return newCls.type();\n    }\n\n    private _parseString(jsonSchema: JsonSchema): FieldType {\n        if (jsonSchema.type !== \"string\") {\n            throw new Error(`_parseString called with non-string type: ${jsonSchema.type}`);\n        }\n\n        const title = jsonSchema.title;\n        const enumValues = jsonSchema.enum;\n\n        if (enumValues) {\n            if (!Array.isArray(enumValues)) {\n                throw new Error(`'enum' property for string type '${title || \"anonymous\"}' must be an array.`);\n            }\n\n            const stringEnumValues: string[] = [];\n            for (const val of enumValues) {\n                stringEnumValues.push(String(val));\n            }\n\n            if (title === undefined || typeof title !== 'string') {\n                if (stringEnumValues.length === 0) {\n                    console.warn(`Anonymous enum (string type with 'enum' but no 'title') has no values. Defaulting to plain string type.`);\n                    return this.tb.string();\n                }\n                return this.tb.union(stringEnumValues.map(value => this.tb.literalString(value)));\n            }\n\n            const newEnum = this.tb.addEnum(title);\n\n            if (stringEnumValues.length === 0) {\n                console.warn(`Enum '${title}' has no values. An empty enum was created.`);\n            }\n            for (const value of stringEnumValues) {\n                newEnum.addValue(value);\n            }\n            return newEnum.type();\n        }\n        return this.tb.string();\n    }\n\n    private _parseArray(jsonSchema: JsonSchema): FieldType {\n        if (jsonSchema.type !== \"array\") {\n            throw new Error(`_parseArray called with non-array type: ${jsonSchema.type}`);\n        }\n\n        const itemsSchema = jsonSchema.items;\n        if (itemsSchema === undefined) {\n            throw new Error(`Array field '${jsonSchema.title || \"untitled array\"}' is missing 'items' definition.`);\n        }\n\n        if (Array.isArray(itemsSchema) || typeof itemsSchema !== 'object' || itemsSchema === null) {\n            throw new Error(`'items' property for array '${jsonSchema.title || \"untitled array\"}' must be a single schema object. Tuple/array types for 'items' are not supported by this converter (matching Python script's direct parsing of items).`);\n        }\n\n        return this.parse(itemsSchema as JsonSchema).list();\n    }\n\n\n    private _loadRef(ref: string): FieldType {\n        if (!ref.startsWith(\"#/\")) {\n            throw new Error(`Only local references are supported: ${ref}`);\n        }\n\n        if (this.refCache[ref]) {\n            return this.refCache[ref];\n        }\n\n        const pathParts = ref.substring(2).split('/');\n\n        if (pathParts.length !== 2 || !pathParts[0] || !pathParts[1]) {\n            throw new Error(`Unsupported $ref format: '${ref}'. Expected format like '#/collectionKey/definitionKey' matching Python logic.`);\n        }\n\n        const collectionKey = pathParts[0];\n        const definitionKey = pathParts[1];\n\n        const collection = (this.rootSchema as any)[collectionKey];\n        if (typeof collection !== 'object' || collection === null) {\n            throw new Error(`Reference collection '${collectionKey}' for $ref '${ref}' not found or not an object in the root schema.`);\n        }\n\n        if (!collection.hasOwnProperty(definitionKey)) {\n            throw new Error(`Reference item '${definitionKey}' for $ref '${ref}' not found in collection '${collectionKey}'.`);\n        }\n\n        const targetSchema = collection[definitionKey];\n        if (typeof targetSchema !== 'object' || targetSchema === null) {\n            throw new Error(`Resolved $ref '${ref}' points to a non-object schema.`);\n        }\n\n        const fieldType = this.parse(targetSchema as JsonSchema);\n        this.refCache[ref] = fieldType;\n        return fieldType;\n    }\n\n    parse(jsonSchema: JsonSchema): FieldType {\n        if (jsonSchema.$ref) {\n            if (typeof jsonSchema.$ref !== 'string') {\n                throw new Error(\"'$ref' property must be a string.\");\n            }\n            return this._loadRef(jsonSchema.$ref);\n        }\n\n        // Handle 'const' next, as it's a very specific assertion\n        if (jsonSchema.const !== undefined) {\n            const constValue = jsonSchema.const;\n            if (typeof constValue === 'string') {\n                return this.tb.literalString(constValue);\n            } else if (typeof constValue === 'number') {\n                if (Number.isInteger(constValue)) {\n                    return this.tb.literalInt(constValue);\n                } else {\n                    // BAML does not appear to have a literalFloat, based on available information.\n                    // The 'const' value itself isn't captured as a literal in the BAML type for floats.\n                    console.warn(\n                        `JSON Schema 'const' with float value '${constValue}' encountered. ` +\n                        `BAML will use base type (float) as literalFloat is not available. Title: '${jsonSchema.title || \"anonymous\"}'`\n                    );\n                    return this.tb.float();\n                }\n            } else if (typeof constValue === 'boolean') {\n                return this.tb.literalBool(constValue);\n            } else if (constValue === null) {\n                return this.tb.null();\n            }\n            if (typeof constValue === 'object' && (jsonSchema.type !== 'object' && jsonSchema.type !== 'array')) {\n                 console.warn(\n                    `JSON Schema 'const' with complex value '${JSON.stringify(constValue)}' ` +\n                    `encountered. Title: '${jsonSchema.title || \"anonymous\"}'. ` +\n                    `Expected 'type: \"object\"' or 'type: \"array\"' if this const is to be further processed as such. ` +\n                    `Falling back to standard type parsing based on 'jsonSchema.type' (if present).`\n                );\n            }\n        }\n\n        if (jsonSchema.anyOf) {\n            if (!Array.isArray(jsonSchema.anyOf)) {\n                throw new Error(\"'anyOf' property must be an array of schema objects.\");\n            }\n            if (!jsonSchema.anyOf.every(s => typeof s === 'object' && s !== null)) {\n                throw new Error(\"'anyOf' array must contain valid schema objects.\");\n            }\n            if (jsonSchema.anyOf.length === 0) {\n                console.warn(\"'anyOf' is an empty array. Defaulting to string (Python script has no specific handling).\");\n                return this.tb.string();\n            }\n            return this.tb.union(jsonSchema.anyOf.map(subSchema => this.parse(subSchema as JsonSchema)));\n        }\n\n        const additionalProperties = jsonSchema.additionalProperties;\n        if (additionalProperties && typeof additionalProperties === 'object' && (additionalProperties as JsonSchema).anyOf) {\n            const apSchema = additionalProperties as JsonSchema;\n            const anyOfInAp = apSchema.anyOf;\n            if (!Array.isArray(anyOfInAp)) {\n                throw new Error(\"'anyOf' in 'additionalProperties' must be an array of schema objects.\");\n            }\n            if (!anyOfInAp.every(s => typeof s === 'object' && s !== null)) {\n                throw new Error(\"'anyOf' in 'additionalProperties' must contain valid schema objects.\");\n            }\n            if (anyOfInAp.length === 0) {\n                console.warn(\"'anyOf' in 'additionalProperties' is empty. Defaulting map value to string.\");\n                return this.tb.map(this.tb.string(), this.tb.string());\n            }\n            const valueType = this.tb.union(anyOfInAp.map(subSchema => this.parse(subSchema as JsonSchema)));\n            return this.tb.map(this.tb.string(), valueType);\n        }\n\n        const type = jsonSchema.type;\n\n        if (type === undefined) {\n            console.warn(\"Type field is missing in JSON schema, defaulting to string (Python script behavior).\");\n            return this.tb.string();\n        }\n\n        if (typeof type !== 'string') {\n            throw new Error(`Unsupported 'type' format: Expected a string, got ${typeof type} (${JSON.stringify(type)}). Python script would raise ValueError.`);\n        }\n\n        let fieldType: FieldType;\n        switch (type) {\n            case \"string\":\n                fieldType = this._parseString(jsonSchema);\n                break;\n            case \"number\":\n                fieldType = this.tb.float();\n                break;\n            case \"integer\":\n                fieldType = this.tb.int();\n                break;\n            case \"object\":\n                fieldType = this._parseObject(jsonSchema);\n                break;\n            case \"array\":\n                fieldType = this._parseArray(jsonSchema);\n                break;\n            case \"boolean\":\n                fieldType = this.tb.bool();\n                break;\n            case \"null\":\n                fieldType = this.tb.null();\n                break;\n            default:\n                throw new Error(`Unsupported JSON Schema type: '${type}'`);\n        }\n        return fieldType;\n    }\n}\n\nfunction convertJsonSchemaToBaml(tb: TypeBuilder, jsonSchema: JsonSchema): FieldType {\n    if (typeof jsonSchema !== 'object' || jsonSchema === null) {\n        throw new Error(\"Invalid JSON schema provided. Must be an object.\");\n    }\n    const parser = new SchemaAdder(tb, jsonSchema);\n    return parser.parse(jsonSchema);\n}\n\nexport function convertZodToBaml(tb: TypeBuilder, schema: Schema) {\n    const jsonSchema = zodToJsonSchema(schema) as JsonSchema;\n    return convertJsonSchemaToBaml(tb, jsonSchema);\n}\n\nexport function convertActionDefinitionsToBaml<T>(\n    tb: TypeBuilder,\n    actionVocabulary: ActionDefinition<T>[]\n) {\n    /**\n     * Convert action definitions to BAML TypeBuilder union representing any one of the actions\n     */\n    const actionTypes = [];\n    for (const { name, description, schema } of actionVocabulary) {\n        // Need to augment the schema a bit:\n        // (1) if object, unpack and include variant as literal { variant: name, ...others }\n        // (2) if primitive, add as name input { variant: name, input: <primitive> }\n        let wrapperSchema: ZodSchema<any>;\n\n        const baseWrapperSchema = z.object({\n            variant: description ? z.literal(name).describe(description) : z.literal(name)\n        });\n\n        if (schema instanceof ZodObject) {\n            // Merge the variant field with the existing object schema\n            // The original schema's fields will be at the top level alongside 'variant'.\n            wrapperSchema = baseWrapperSchema.merge(schema as ZodObject<any, any>);\n        } else {\n            wrapperSchema = baseWrapperSchema.extend({\n                input: schema,\n            });\n        }\n\n        //if (description) wrapperSchema = wrapperSchema.describe(description);\n\n        actionTypes.push(convertZodToBaml(tb, wrapperSchema))\n    }\n    return tb.union(actionTypes);\n}\n\n\n//const tb = new TypeBuilder();\n//console.log(convertZodToBaml(tb, z.string()))\n//console.log(zodToJsonSchema(z.string()))\n","export function fnv1a32Hex(str: string, seed: number = 0x811c9dc5): string {\n    const FNV_PRIME_32 = 0x01000193;\n    let hash = seed;\n    const encoder = new TextEncoder();\n    const bytes = encoder.encode(str);\n\n    for (let i = 0; i < bytes.length; i++) {\n        hash ^= bytes[i];\n        hash = (hash * FNV_PRIME_32) | 0;\n    }\n\n    const hexString = (hash >>> 0).toString(16);\n    return hexString.padStart(8, '0');\n}\n","/**\n * Convert observations to form that can be passed as BAML context, rendered as a custom XML-like structure.\n */\nimport { Image as BamlImage } from '@boundaryml/baml';\nimport { ObservableData, ObservableDataObject, ObservableDataArray, ObservableDataPrimitive } from './observation';\nimport { Image } from './image'; // Our custom Image class\n\nexport type BamlRenderable = BamlImage | string;\n\nasync function buildXmlPartsRecursive(\n    data: ObservableData,\n    indentLevel: number,\n    partsList: BamlRenderable[],\n    isInsideList: boolean = false\n): Promise<void> {\n    const indent = '  '.repeat(indentLevel);\n\n    if (data instanceof Image) {\n        const bamlImg = await data.toBaml();\n        if (bamlImg) {\n            partsList.push(bamlImg);\n        }\n        return;\n    }\n    if (data instanceof BamlImage) {\n        partsList.push(data);\n        return;\n    }\n    if (typeof data === 'string' || typeof data === 'number' || typeof data === 'boolean' || data === null) {\n        partsList.push(String(data)); // No XML escaping, direct string conversion\n        return;\n    }\n    if (data === undefined) {\n        return; // Undefined values are omitted\n    }\n\n    if (Array.isArray(data)) {\n        // data.forEach(async (item, index) => {\n        //     await buildXmlPartsRecursive(item, indentLevel, partsList, true);\n        //     if (index < data.length - 1) {\n        //         partsList.push(\"\\n\");\n        //     }\n        // });\n        for (let index = 0; index < data.length; index++) {\n            await buildXmlPartsRecursive(data[index], indentLevel, partsList, true);\n            if (index < data.length - 1) {\n                partsList.push(\"\\n\");\n            }\n        }\n        return;\n    }\n\n    if (typeof data === 'object' && data !== null) {\n        const objectEntries = Object.entries(data as ObservableDataObject).filter(([, val]) => val !== undefined);\n        \n        objectEntries.forEach(async ([key, value], entryIndex) => {\n            const tagName = key; // Use key directly as tag name\n            const currentValueParts: BamlRenderable[] = [];\n            \n            await buildXmlPartsRecursive(value, indentLevel + 1, currentValueParts, false);\n\n            // Merge adjacent strings in currentValueParts for easier analysis\n            const mergedValueParts: BamlRenderable[] = [];\n            let currentStr = \"\";\n            for (const part of currentValueParts) {\n                if (typeof part === 'string') {\n                    currentStr += part;\n                } else {\n                    if (currentStr) mergedValueParts.push(currentStr);\n                    currentStr = \"\";\n                    mergedValueParts.push(part);\n                }\n            }\n            if (currentStr) mergedValueParts.push(currentStr);\n\n            // Apply styling rules\n            if (mergedValueParts.length === 1 && mergedValueParts[0] instanceof BamlImage) {\n                partsList.push(`${indent}<${tagName}>`);\n                partsList.push(mergedValueParts[0]); // The BamlImage\n                partsList.push(`</${tagName}>`);\n            } else if (mergedValueParts.length === 1 && typeof mergedValueParts[0] === 'string') {\n                const contentStr = mergedValueParts[0] as string;\n                if (contentStr.includes('\\n')) {\n                    partsList.push(`${indent}<${tagName}>\\n${contentStr}\\n${indent}</${tagName}>`);\n                } else {\n                    partsList.push(`${indent}<${tagName}>${contentStr}</${tagName}>`);\n                }\n            } else { // Empty content or multiple parts (complex/nested)\n                partsList.push(`${indent}<${tagName}>\\n`);\n                mergedValueParts.forEach((part, partIdx) => {\n                    partsList.push(part);\n                    if (partIdx < mergedValueParts.length - 1) {\n                        partsList.push(\"\\n\");\n                    }\n                });\n                partsList.push(`\\n${indent}</${tagName}>`);\n            }\n\n            if (entryIndex < objectEntries.length - 1) {\n                partsList.push(\"\\n\"); // Newline between sibling XML elements\n            }\n        });\n        return;\n    }\n\n    throw new Error(`Object type not supported for LLM context: ${typeof data}`);\n}\n\nexport async function observableDataToContext(data: ObservableData): Promise<BamlRenderable[]> {\n    const rawList: BamlRenderable[] = [];\n    await buildXmlPartsRecursive(data, 0, rawList);\n\n    // Merge adjacent strings\n    if (rawList.length === 0) {\n        return [];\n    }\n\n    const mergedList: BamlRenderable[] = [];\n    let currentString = \"\";\n\n    for (const item of rawList) {\n        if (typeof item === 'string') {\n            currentString += item;\n        } else { // It's a BamlImage\n            if (currentString.length > 0) {\n                mergedList.push(currentString);\n            }\n            currentString = \"\"; // Reset accumulator\n            mergedList.push(item); // Push the BamlImage\n        }\n    }\n    // Add any trailing string\n    if (currentString.length > 0) {\n        mergedList.push(currentString);\n    }\n    \n    return mergedList;\n}\n","import { Image as BamlImage } from '@boundaryml/baml';\nimport { StoredMedia } from './serde';\nimport { Sharp } from 'sharp';\nimport sharp from 'sharp';\n\nexport type ImageMediaType = `image/${string}`;//'png' | 'jpeg';\n\nexport class Image {\n    /**\n     * Wrapper for a Sharp image with conveniences to go to/from base64, convert to BAML, or serialize as JSON\n     */\n    private img: Sharp;\n    // Cached metadata property for sync access + required width/height properties\n    //private metadata: Sharp['metadata'] & { width: number, height: number };\n    //private content: string;\n    //private mediaType: ImageMediaType;\n\n    //constructor(type: 'url' | 'base64', content: string, mediaType: ImageMediaType) {\n    constructor(img: Sharp) {\n        this.img = img;\n    }\n\n    static fromBase64(base64: string) {\n        // if (!mediaType) {\n        //     const match = base64.match(/^data:(.*?);base64,/);\n        //     mediaType = match ? `image/${match[1]}` : undefined;\n        // }\n        // if (!mediaType) {\n        //     throw new Error(\"Image media type must be specified either in base64 encoded string or in mediaType parameter\");\n        // }\n        const base64Data = base64.replace(/^data:.*?;base64,/, '');\n        //return new Image('base64', base64Data, mediaType);\n        return new Image(sharp(Buffer.from(base64Data, 'base64')));\n    }\n\n    async getFormat(): Promise<keyof sharp.FormatEnum> {\n        const format = (await this.img.metadata()).format;\n        if (!format) throw new Error(\"Unable to get image format\");\n        return format;\n    }\n\n    /**\n     * Convert the image to a JSON representation\n     */\n    async toJson(): Promise<StoredMedia> {\n        // if (this.type === 'url') {\n        //     return {\n        //         type: 'media',\n        //         mediaType: this.mediaType,//`image/${this.mediaType}`,\n        //         storageType: 'url',\n        //         url: this.content\n        //     };\n        // } else {\n        return {\n            type: 'media',\n            //mediaType: this.mediaType,//`image/${this.mediaType}`,\n            format: await this.getFormat(),\n            storage: 'base64',\n            base64: await this.toBase64()//this.content\n        };\n        //}\n    }\n\n    async toBase64(): Promise<string> {\n       const base64data = (await this.img.toBuffer()).toString('base64');\n       //console.log(\"DATA (Image):\", base64data.substring(0, 100));\n       return base64data;\n       //return `data:image/png;base64,${base64data}`;\n    }\n\n    async toBaml(): Promise<BamlImage> {\n        // if (this.type === 'url') {\n        //     return BamlImage.fromUrl(this.content, this.mediaType);\n        // }\n        // else {//if (this.type === 'base64') {\n        //     return BamlImage.fromBase64(this.mediaType, this.content);\n        // }\n        const format = await this.getFormat();\n        const data = await this.toBase64();\n        //console.log(\"FORMAT:\", format);\n        //console.log(\"DATA:\", data.substring(0, 100));\n        return BamlImage.fromBase64(`image/${format}`, data);\n\n    }\n\n    async getDimensions(): Promise<{ width: number, height: number }> {\n        const { width, height } = await this.img.metadata();\n        if (!width || !height) throw new Error(\"Unable to get dimensions from image\");\n        return { width, height };\n    }\n\n    async resize(width: number, height: number): Promise<Image> {\n        // if (this.type != 'base64') throw new Error(\"Only base64 images can be resized\");\n        // const img = sharp(Buffer.from(this.content));\n        // const metadata = await img.metadata();\n        \n        // if (!metadata.width || !metadata.height)\n        return new Image(await this.img.resize({\n            // Round width/height since sometimes they are floats due to rounding errors - sharp will throw if not integers\n            width: Math.round(width),\n            height: Math.round(height),\n            fit: 'fill', // exact size, no cropping\n            kernel: sharp.kernel.lanczos3\n        }));\n    }\n}","/**\n * Utilities for converting multi-media observation data to/from JSON\n */\nimport { Base64Image } from \"@/web/types\";\nimport { ObservableData, ObservableDataObject } from \"./observation\";\nimport { Image } from './image';\n\n\n\n// JSON primitives for the custom multi-media dialect\n// export type StoredMedia = {\n//     type: 'media',\n//     mediaType: string, // e.g. image/png mime type\n//     storageType: 'url',\n//     url: string\n// } | {\n//     type: 'media',\n//     mediaType: string,\n//     storageType: 'base64',\n//     base64: string//Base64Image\n// }; // TODO: add file storage type\nexport type StoredMedia = {\n    type: 'media',\n    format: string,\n    storage: 'base64',\n    base64: string\n}\n\nexport interface StoredPrimitive {\n    type: 'primitive',\n    //data: string\n    content: string | boolean | number\n}\n\ntype MultiMediaPrimitive = StoredMedia | StoredPrimitive | undefined | null;\ntype MultiMediaArray = Array<MultiMediaJson>;\nexport type MultiMediaObject = {\n    [key: string]: MultiMediaJson;\n};\n\nexport type MultiMediaJson = MultiMediaPrimitive | MultiMediaArray | MultiMediaObject;\n\nexport async function observableDataToJson(data: ObservableData): Promise<MultiMediaJson> {\n    if (data instanceof Image) {\n        return await data.toJson();//return imageToJson(data);\n    }\n\n    if (typeof data === 'string' || typeof data === 'number' || typeof data === 'boolean') {\n        return { type: \"primitive\", content: data };\n    }\n\n    if (data === undefined) {\n        return undefined; // JSON.stringify will omit keys with this value or handle standalone undefined\n    }\n\n    if (data === null) {\n        return null;\n    }\n\n    if (Array.isArray(data)) {\n        // Filter out undefined items first, then map and process the rest.\n        return Promise.all(data\n            .filter(item => item !== undefined)\n            .map(item => observableDataToJson(item))\n        );\n    }\n\n    if (typeof data === 'object') { // Known not to be null or array here\n        const processedObject: { [key: string]: any } = {};\n        for (const key in data) {\n            if (Object.prototype.hasOwnProperty.call(data, key)) {\n                const value = (data as ObservableDataObject)[key];\n                const processedValue = observableDataToJson(value);\n\n                // Only add the key to the new object if its processed value is not undefined\n                if (processedValue !== undefined) {\n                    processedObject[key] = processedValue;\n                }\n            }\n        }\n        return processedObject;\n    }\n\n    // Fallback for any unexpected data types not covered by ObservableData.\n    // Returning undefined is consistent with how unrepresentable values are handled.\n    return undefined;\n}\n\n// TODO: Implement deserialization, and actually leverage serde for logging stuff\n","/**\n * Observations and declarations for what kind of data is \"observable\" - i.e. can be processed into BAML context or JSON.\n */\nimport { fnv1a32Hex } from '@/util';\nimport { BamlRenderable, observableDataToContext } from './context';\nimport { Image } from './image';\nimport { MultiMediaJson, observableDataToJson } from './serde';\n\n// undefined in JSON is either removed if k/v or removed from array, not actually JSON-compatible technically\nexport type ObservableDataPrimitive = Image | string | number | boolean | null | undefined; // | Observation\n\nexport type ObservableDataArray = Array<ObservableData>;\n\nexport type ObservableDataObject = {\n    [key: string]: ObservableData;\n};\n\nexport type ObservableData = ObservableDataPrimitive | ObservableDataArray | ObservableDataObject;\n\n\nexport interface ObservationOptions {\n    //timestamp?: // TOOD: impl but default to now\n    type: string;\n    limit?: number;\n    dedupe?: boolean; // dedupe adjacent identical observations of the same type\n}\n\n// consider limiting media based on source - e.g. thought is only text\nexport type ObservationSource = `connector:${string}` | `action:taken:${string}` | `action:result:${string}` | `thought`;\n\nexport class Observation {\n    public readonly source: ObservationSource;\n    public readonly timestamp: number;\n    public readonly data: ObservableData;\n    public readonly options?: ObservationOptions;\n\n    constructor(source: ObservationSource, data: ObservableData, options?: ObservationOptions) {\n        this.source = source;\n        this.data = data;\n        this.timestamp = Date.now();\n        this.options = options;\n    }\n\n    static fromConnector(connectorId: string, data: ObservableData, options?: ObservationOptions): Observation {\n        return new Observation(`connector:${connectorId}`, data, options);\n    }\n\n    static fromActionTaken(actionId: string, data: ObservableData, options?: ObservationOptions): Observation {\n        return new Observation(`action:taken:${actionId}`, data, options);\n    }\n\n    static fromActionResult(actionId: string, data: ObservableData, options?: ObservationOptions): Observation {\n        return new Observation(`action:result:${actionId}`, data, options);\n    }\n\n    static fromThought(data: ObservableData, options?: ObservationOptions): Observation {\n        return new Observation(`thought`, data, options);\n    }\n\n    toString() {\n        // will be pretty ugly usually\n        return JSON.stringify(this.data);\n    }\n\n    async toJson(): Promise<MultiMediaJson> {\n        return await observableDataToJson(this.data);\n    }\n\n    async toContext(): Promise<BamlRenderable[]> {\n        return await observableDataToContext(this.data);\n    }\n\n    async hash(): Promise<string> {\n        // build str of all text+img content\n        const stringifiedContent = JSON.stringify(await this.toJson());\n        return fnv1a32Hex(stringifiedContent);\n    }\n\n    async equals(obs: Observation): Promise<boolean> {\n        // TODO: deep eq for both text and img content\n        return (await this.hash()) == (await obs.hash());\n    }\n}\n\nasync function filterObservations(observations: Observation[]): Promise<Observation[]> {\n    /**\n     * (LLM)\n     * Filters an array of Observations based on type-specific `dedupe` and `limit` options\n     * specified in `obs.options`. For each type:\n     * 1. If `dedupe` is true, removes older adjacent identical observations (checked via `obs.equals()`),\n     *    keeping the last in such a sequence.\n     * 2. If `limit` is set, keeps only the last N observations of that type.\n     * Deduplication is applied before limiting for each type.\n     * Untyped observations (no `obs.options.type`) are passed through unfiltered.\n     * The function preserves the original relative order of the surviving observations.\n     */\n    const observationsByType = new Map<string, {\n        obsList: Observation[];\n        limit?: number;\n        dedupe?: boolean;\n    }>();\n\n    const untypedObservations: Observation[] = [];\n\n    for (const obs of observations) {\n        if (obs.options && obs.options.type) {\n            const type = obs.options.type;\n            if (!observationsByType.has(type)) {\n                observationsByType.set(type, {\n                    obsList: [],\n                    limit: obs.options.limit,\n                    dedupe: obs.options.dedupe,\n                });\n            }\n            observationsByType.get(type)!.obsList.push(obs);\n        } else {\n            untypedObservations.push(obs);\n        }\n    }\n\n    for (const data of observationsByType.values()) {\n        let currentTypedObservations = data.obsList;\n\n        if (data.dedupe && currentTypedObservations.length > 1) {\n            const dedupedList: Observation[] = [];\n            dedupedList.unshift(currentTypedObservations[currentTypedObservations.length - 1]);\n\n            for (let i = currentTypedObservations.length - 2; i >= 0; i--) {\n                const currentObs = currentTypedObservations[i];\n                const lastKeptObs = dedupedList[0];\n                \n                if (!(await currentObs.equals(lastKeptObs))) {\n                    dedupedList.unshift(currentObs);\n                }\n            }\n            currentTypedObservations = dedupedList;\n        }\n\n        if (data.limit !== undefined && data.limit >= 0) {\n            if (data.limit === 0) {\n                currentTypedObservations = [];\n            } else {\n                currentTypedObservations = currentTypedObservations.slice(-data.limit);\n            }\n        }\n        data.obsList = currentTypedObservations;\n    }\n\n    const finalObservationsToRender: Observation[] = [];\n    const survivorSets = new Map<string, Set<Observation>>();\n    for (const [type, data] of observationsByType.entries()) {\n        survivorSets.set(type, new Set(data.obsList));\n    }\n\n    for (const originalObs of observations) {\n        if (originalObs.options && originalObs.options.type) {\n            if (survivorSets.get(originalObs.options.type)?.has(originalObs)) {\n                finalObservationsToRender.push(originalObs);\n            }\n        } else {\n            finalObservationsToRender.push(originalObs);\n        }\n    }\n    return finalObservationsToRender;\n}\n\n\nexport async function renderObservations(observations: Observation[]): Promise<BamlRenderable[]> {\n    /**\n     * Refines observations (according to observation culling options) and converts to BAML-renderable content\n     */\n    const filteredObservations = await filterObservations(observations);\n\n    let content: BamlRenderable[] = [];\n    for (const obs of filteredObservations) {\n        if (obs.source.startsWith('action:taken') || obs.source.startsWith('thought')) {\n            content.push(`[${new Date(obs.timestamp).toTimeString().split(' ')[0]}]: `);\n        }\n        content = [...content, ...await obs.toContext(), \"\\n\"];\n    }\n\n    return content;\n}","import { FailureDescriptor } from \"../common\";\n\nexport interface AgentErrorOptions {\n    variant?: string,\n    // Whether the LLM may be able to try something else to avoid this error\n    adaptable?: boolean\n}\n\n// export class AgentError extends Error {\n//     public readonly failure: FailureDescriptor;\n//     public readonly options: Required<AgentErrorOptions>;\n\n//     constructor(failure: FailureDescriptor, options: AgentErrorOptions = {}) {\n//         super(`${failure.variant}: ${JSON.stringify(failure.variant, null, 4)}`);\n\n//         this.options = {\n//             adaptable: options.adaptable ?? false\n//         };\n\n//         this.failure = failure;\n//     }\n// }\n\nexport class AgentError extends Error {\n    //public readonly failure: FailureDescriptor;\n    public readonly options: Required<AgentErrorOptions>;\n\n    constructor(message: string, options: AgentErrorOptions = {}) {\n        // super(`${failure.variant}: ${JSON.stringify(failure.variant, null, 4)}`);\n        super(message);\n        this.options = {\n            variant: options.variant ?? 'unknown',\n            adaptable: options.adaptable ?? false,\n        };\n\n        \n\n        // if (options.variant !== 'unknown') {\n        //     super(`${failure.variant}: ${JSON.stringify(failure.variant, null, 4)}`);\n        // }\n\n        //this.options = options;\n\n        //this.failure = failure;\n    }\n}\n\n// // Agent will only throw these types of errors\n\n// import { ActionIngredient } from \"./recipe/types\";\n// import { WebAction } from \"./web/types\";\n\n// export class TestCaseError extends Error {};\n\n// // Base class for wrapping errors\n// class WrapperError extends TestCaseError {\n//     public readonly originalError: Error;\n\n//     constructor(message: string, originalError: Error) {\n//         super(`${message} - ${originalError.message}`);\n//         this.name = this.constructor.name;\n//         this.originalError = originalError;\n\n//         // Preserve the stack trace\n//         if (Error.captureStackTrace) {\n//             Error.captureStackTrace(this, this.constructor);\n//         }\n//     }\n// }\n\n// export class NavigationError extends WrapperError {\n//     public readonly url: string;\n\n//     constructor(url: string, originalError: Error) {\n//         super(`Failed to navigate to URL: ${url}`, originalError);\n//         this.url = url;\n//     }\n// }\n\n// export class ActionExecutionError extends WrapperError {\n//     public readonly action: WebAction;\n//     public readonly statusCode?: number;\n\n//     constructor(action: WebAction, originalError: Error) {\n//         super(`Browser encountered error while executing action: ${action}`, originalError);\n//         this.action = action;\n//     }\n// }\n\n// export class ActionConversionError extends WrapperError {\n//     public readonly action: ActionIngredient;\n//     public readonly statusCode?: number;\n\n//     constructor(action: ActionIngredient, originalError: Error) {\n//         super(`Micro failed to convert action (does the target line up with the screenshot?): ${action}`, originalError);\n//         this.action = action;\n//     }\n// }\n","import { Action } from '@/actions/types';\nimport { AgentConnector } from '@/connectors';\nimport { \n    ModularMemoryContext, \n    // BamlThought, \n    // BamlTurn, \n    ConnectorInstructions \n} from '@/ai/baml_client';\nimport { Observation, ObservationOptions, ObservationSource, renderObservations } from './observation';\nimport { BamlRenderable, observableDataToContext } from './context';\nimport z from 'zod';\nimport EventEmitter from 'eventemitter3';\nimport { MultiMediaJson, observableDataToJson } from './serde';\n\n// export interface AgentMemoryEvents {\n//     'thought': (thought: string) => void;\n// }\n\nexport interface SerializedAgentMemory {\n    instructions?: string;\n    observations: {\n        source: ObservationSource,\n        timestamp: number,\n        data: MultiMediaJson,\n        options?: ObservationOptions,\n    }[];\n}\n\nexport class AgentMemory {\n    //public readonly events: EventEmitter<AgentMemoryEvents> = new EventEmitter();\n    //private options: Required<MemoryOptions>;\n    //private history: StoredHistoryEntry[] = [];\n\n    // Custom instructions relating to this memory instance (e.g. agent-level and/or task-level instructions)\n    public readonly instructions: string | null;\n\n    private observations: Observation[] = [];\n    //private tasks: { task: string, observations: Observation[] }[] = [];\n\n    constructor(instructions?: string) {\n        this.instructions = instructions ?? null;\n    }\n\n    // get observations(): Observation[] {\n    //     if (this.tasks.length === 0) {\n            \n    //     }\n    //     return this.tasks.at(-1).observations\n    // }\n\n    // public newTask(task: string): void {\n    //     // Mark start of task for a new isolated memory window\n    // }\n\n    public isEmpty(): boolean {\n        return this.observations.length === 0;\n    }\n\n    public recordThought(content: string): void {\n        this.observations.push(\n            Observation.fromThought(content)\n        );\n        //this.events.emit('thought', content);\n    }\n\n    public recordObservation(obs: Observation): void {\n        this.observations.push(obs);\n    }\n\n    public getLastThoughtMessage(): string | null {\n        for (let i = this.observations.length - 1; i >= 0; i--) {\n            const obs = this.observations[i];\n            // toString() is a little funky here, or the idea that thought might not just be text\n            if (obs.source.startsWith('thought')) return obs.toString();\n        }\n        return null;\n    }\n\n    public async buildContext(activeConnectors: AgentConnector[]): Promise<ModularMemoryContext> {\n        const content = await renderObservations(this.observations);\n\n        // TODO: doesn't really make sense for memory to be responsible for current state and instruction render logic\n        const connectorInstructions: ConnectorInstructions[] = [];\n\n        for (const connector of activeConnectors) {\n            if (connector.getInstructions) {\n                const instructions = await connector.getInstructions();\n\n                if (instructions) {\n                    connectorInstructions.push({\n                        connectorId: connector.id,\n                        instructions: instructions\n                    });\n                }\n            }\n        }\n\n        return {\n            instructions: this.instructions,\n            observationContent: content,\n            connectorInstructions: connectorInstructions\n        };\n    }\n\n    public async toJSON(): Promise<SerializedAgentMemory> {\n        const observations = [];\n        for (const observation of this.observations) {\n            observations.push({\n                source: observation.source,\n                timestamp: observation.timestamp,\n                data: await observableDataToJson(observation.data),\n                options: observation.options,\n            });\n        }\n        return {\n            ...(this.instructions ? { instructions: this.instructions } : {}),\n            observations: observations\n        };\n    }\n}\n","import { Agent } from \"@/agent\"\nimport { ObservableData } from \"@/memory/observation\";\nimport { z, Schema, ZodTypeAny } from \"zod\"\n\nexport interface ActionDefinition<T> {\n    name: string;\n    description?: string;\n    schema: Schema<T>;\n    resolver: ({ input, agent }: { input: T, agent: Agent }) => Promise<void | ObservableData>;\n    render: (action: T) => string\n}\n\nexport function createAction<S extends ZodTypeAny>(\n    action: {\n        name: string;\n        description?: string;\n        schema?: S;\n        resolver: ({ input, agent }: { input: z.infer<S>; agent: Agent }) => Promise<void | ObservableData>;\n        render?: (action: z.infer<S>) => string\n    }\n): ActionDefinition<z.infer<S>> {\n    // Just a helper for automatic schema typing\n    return {\n        name: action.name,\n        description: action.description,\n        schema: action.schema ?? z.object({}),\n        resolver: action.resolver,\n        render: action.render ?? ((action) => JSON.stringify(action))\n    };\n}\n\n\n\n// 2. Create a helper type to extract the payload structure for a single action\n// This payload combines the 'name' (as a literal type) and the inferred schema.\nexport type ActionPayload<A extends ActionDefinition<any>> = { name: A['name'] } & z.infer<A['schema']>;\n\n","import { AgentError } from \"@/agent/errors\";\nimport { ActionDefinition, ActionPayload, createAction } from \".\";\nimport { z } from \"zod\";\n\nexport const doneAction = createAction({\n    name: 'task:done',\n    description: \"ONLY once you have seen sufficient evidence of the task's completion, mark it as done\",//Use once sure that task is finished',//'Designate current task as finished',// Do not use until you can verify the task is completed.\n    schema: z.object({\n        evidence: z.string().describe(`Specific observed evidence that verifies the task's completion. Do NOT predict this evidence.`)\n    }),\n    resolver: async ({ agent }) => {\n        agent.queueDone();\n    },\n    render: () => `✓ done`\n});\n\nexport const failAction = createAction({\n    name: 'task:fail',\n    description: 'Use if task was attempted but does not seem possible. Use common sense',//'Designate current task as infeasible',\n    schema: z.object({}),\n    resolver: async ({ agent }) => {\n        throw new AgentError(`Task failed: ${agent.memory.getLastThoughtMessage() ?? \"No thought recorded\"}`);\n    },\n    render: () => `✕ fail`\n});\n\nexport const taskActions = [\n    doneAction,\n    failAction\n] as const;\n","import { Page, Request, Response } from 'playwright';\nimport sharp from 'sharp';\nimport logger from '@/logger';\nimport { Logger } from 'pino';\n\n// Maximum wait time for page stability in ms\nconst DEFAULT_PAGE_STABILITY_TIMEOUT = 5000;\n// Default minimum wait time for page load\nconst DEFAULT_MINIMUM_WAIT_PAGE_LOAD_TIME = 500;\n// Default time to wait for network requests to finish\nconst DEFAULT_WAIT_FOR_NETWORK_IDLE_TIME = 500;\n// Default maximum time to wait for page load\nconst DEFAULT_MAXIMUM_WAIT_PAGE_LOAD_TIME = 5000;\n\nexport interface ImageDiff {\n    /** Difference score between 0-1, where 0 means identical */\n    difference: number;\n    /** Optional error message if comparison failed */\n    error?: string;\n}\n\nexport interface PageStabilityOptions {\n    /** Threshold below which screenshots are considered similar (0-1) */\n    differenceThreshold?: number;\n    /** Number of consecutive stable checks required to confirm stability */\n    requiredStableChecks?: number;\n    /** Interval between stability checks in ms */\n    checkInterval?: number;\n    /** Whether to log detailed stability information */\n    //debug?: boolean;\n    /** Minimum time to wait before getting page state */\n    minimumWaitPageLoadTime?: number;\n    /** Time to wait for network requests to finish before getting page state */\n    waitForNetworkIdleTime?: number;\n    /** Maximum time to wait for page load before proceeding anyway */\n    maximumWaitPageLoadTime?: number;\n}\n\n/**\n * Utility class to check for visual stability of a page\n */\nexport class PageStabilityAnalyzer {\n    private page!: Page;\n    private options: Required<PageStabilityOptions>;\n    private lastStart: number;\n    private logger: Logger;\n\n    constructor(options: PageStabilityOptions = {}) {\n        //this.page = page;\n        this.options = {\n            differenceThreshold: options.differenceThreshold ?? 0.01,\n            requiredStableChecks: options.requiredStableChecks ?? 3,\n            checkInterval: options.checkInterval ?? 100, // 200ms\n            minimumWaitPageLoadTime: options.minimumWaitPageLoadTime ?? DEFAULT_MINIMUM_WAIT_PAGE_LOAD_TIME,\n            waitForNetworkIdleTime: options.waitForNetworkIdleTime ?? DEFAULT_WAIT_FOR_NETWORK_IDLE_TIME,\n            maximumWaitPageLoadTime: options.maximumWaitPageLoadTime ?? DEFAULT_MAXIMUM_WAIT_PAGE_LOAD_TIME\n        };\n        this.lastStart = Date.now();\n        this.logger = logger.child(\n            { name: 'magnus.stability' }\n        );\n    }\n\n    setActivePage(page: Page) {\n        this.page = page;\n    }\n\n    private log(message: string): void {\n        this.logger.trace(`[${Date.now() - this.lastStart}ms] ${message}`);\n    }\n\n    /**\n     * Compare two screenshots and return their difference score\n     * @returns Difference as float between 0-1, where 0 means identical\n     */\n    private async compareScreenshots(screenshot1: Buffer, screenshot2: Buffer): Promise<ImageDiff> {\n        try {\n            // Convert screenshots to raw pixel data using Sharp\n            const img1 = await sharp(screenshot1).raw().toBuffer({ resolveWithObject: true });\n            const img2 = await sharp(screenshot2).raw().toBuffer({ resolveWithObject: true });\n\n            // Check for size mismatch\n            if (img1.info.width !== img2.info.width || img1.info.height !== img2.info.height) {\n                return {\n                    difference: 1.0,\n                    error: \"Image sizes don't match\"\n                };\n            }\n\n            // Calculate pixel differences\n            let diffSum = 0;\n            for (let i = 0; i < img1.data.length; i++) {\n                diffSum += Math.abs(img1.data[i] - img2.data[i]);\n            }\n\n            // Calculate mean difference and normalize\n            const mse = diffSum / img1.data.length;\n\n            // Normalize to 0-1 range (assuming 8-bit color depth)\n            const maxDiff = 255.0 * (img1.info.channels || 3); // Multiply by number of channels\n            const normalizedDiff = mse / maxDiff;\n\n            return { difference: normalizedDiff };\n        } catch (e) {\n            return {\n                difference: 1.0,\n                error: `Comparison failed: ${e instanceof Error ? e.message : String(e)}`\n            };\n        }\n    }\n\n    /**\n     * Wait for the network to become stable\n     * This monitors network requests and waits until there's a period of inactivity\n     * @param timeout Maximum time to wait for network stability\n     */\n    async waitForNetworkStability(timeout?: number): Promise<void> {\n        const maxWaitTime = timeout ?? this.options.maximumWaitPageLoadTime;\n        const start = Date.now();\n        this.log(\"Checking network stability\");\n\n        const pendingRequests = new Set<Request>();\n        let lastActivity = Date.now();\n\n        // Define relevant resource types and content types\n        const RELEVANT_RESOURCE_TYPES = new Set([\n            'document',\n            'stylesheet',\n            'image',\n            'font',\n            'script',\n            'fetch',\n            'xhr',\n            'iframe'\n        ]);\n\n        const RELEVANT_CONTENT_TYPES = [\n            'text/html',\n            'text/css',\n            'application/javascript',\n            'image/',\n            'font/',\n            'application/json'\n        ];\n\n        // Additional patterns to filter out\n        const IGNORED_URL_PATTERNS = [\n            // Analytics and tracking\n            'analytics',\n            'tracking',\n            'telemetry',\n            'beacon',\n            'metrics',\n            // Ad-related\n            'doubleclick',\n            'adsystem',\n            'adserver',\n            'advertising',\n            // Social media widgets\n            'facebook.com/plugins',\n            'platform.twitter',\n            'linkedin.com/embed',\n            // Live chat and support\n            'livechat',\n            'zendesk',\n            'intercom',\n            'crisp.chat',\n            'hotjar',\n            // Push notifications\n            'push-notifications',\n            'onesignal',\n            'pushwoosh',\n            // Background sync/heartbeat\n            'heartbeat',\n            'ping',\n            'alive',\n            // WebRTC and streaming\n            'webrtc',\n            'rtmp://',\n            'wss://',\n            // Common CDNs for dynamic content\n            'cloudfront.net',\n            'fastly.net'\n        ];\n\n        // Setup request handler\n        const onRequest = (request: Request) => {\n            // Filter by resource type\n            if (!RELEVANT_RESOURCE_TYPES.has(request.resourceType())) {\n                return;\n            }\n\n            // Filter out streaming, websocket, and other real-time requests\n            if (['websocket', 'media', 'eventsource', 'manifest', 'other'].includes(request.resourceType())) {\n                return;\n            }\n\n            // Filter out by URL patterns\n            const url = request.url().toLowerCase();\n            if (IGNORED_URL_PATTERNS.some(pattern => url.includes(pattern))) {\n                return;\n            }\n\n            // Filter out data URLs and blob URLs\n            if (url.startsWith('data:') || url.startsWith('blob:')) {\n                return;\n            }\n\n            pendingRequests.add(request);\n            lastActivity = Date.now();\n            this.log(`Request started: ${request.url()}`);\n        };\n\n        // Setup response handler\n        const onResponse = (response: Response) => {\n            const request = response.request();\n            if (!pendingRequests.has(request)) {\n                return;\n            }\n\n            // Filter by content type if available\n            const contentType = response.headers()['content-type'] || '';\n\n            // Skip if content type indicates streaming or real-time data\n            if (['streaming', 'video', 'audio', 'webm', 'mp4', 'event-stream', 'websocket', 'protobuf']\n                .some(t => contentType.includes(t))) {\n                pendingRequests.delete(request);\n                return;\n            }\n\n            // Only process relevant content types\n            if (!RELEVANT_CONTENT_TYPES.some(ct => contentType.includes(ct))) {\n                pendingRequests.delete(request);\n                return;\n            }\n\n            // Skip if response is too large (likely not essential for page load)\n            const contentLength = parseInt(response.headers()['content-length'] || '0', 10);\n            if (contentLength > 5 * 1024 * 1024) { // 5MB\n                pendingRequests.delete(request);\n                return;\n            }\n\n            pendingRequests.delete(request);\n            lastActivity = Date.now();\n            this.log(`Request resolved: ${request.url()}`);\n        };\n\n        // Add event listeners\n        this.page.on('request', onRequest);\n        this.page.on('response', onResponse);\n\n        try {\n            // Wait for idle time\n            const startTime = Date.now();\n            while (true) {\n                await new Promise(resolve => setTimeout(resolve, 100)); // Sleep 100ms\n                const now = Date.now();\n\n                if (pendingRequests.size === 0 &&\n                    (now - lastActivity) >= this.options.waitForNetworkIdleTime) {\n                    break;\n                }\n\n                if (now - startTime > maxWaitTime) {\n                    this.log(`Network timeout after ${maxWaitTime}ms with ${pendingRequests.size} pending requests`);\n                    break;\n                }\n            }\n        } finally {\n            // Clean up event listeners\n            this.page.removeListener('request', onRequest);\n            this.page.removeListener('response', onResponse);\n        }\n\n        const totalTime = (Date.now() - start) / 1000;\n        this.log(`Network stabilized in ${totalTime.toFixed(2)}s`);\n    }\n\n    /**\n     * Wait for the page to become visually stable\n     * @param timeout Maximum time to wait for stability in ms\n     */\n    async waitForVisualStability(timeout: number = DEFAULT_PAGE_STABILITY_TIMEOUT): Promise<void> {\n        const start = Date.now();\n\n        this.log(\"Checking visual stability\");\n\n        try {\n            let lastScreenshot = await this.page.screenshot();\n            let stabilityCount = 0;\n            \n            \n            const deadline = start + timeout;\n            while (Date.now() < deadline) {\n                this.log(`Waiting for ${this.options.checkInterval}`);\n                await this.page.waitForTimeout(this.options.checkInterval);\n                this.log(`Done waiting`);\n\n                try {\n                    this.log(\"Taking screenshot...\");\n                    const currentScreenshot = await this.page.screenshot();\n                    this.log(\"Comparing screenshots...\");\n                    const diffResult = await this.compareScreenshots(lastScreenshot, currentScreenshot);\n\n                    if (diffResult.error) {\n                        this.log(`Comparison error: ${diffResult.error}`);\n                        stabilityCount = 0;\n                    } else {\n                        this.log(`Screenshot difference: ${diffResult.difference.toFixed(4)}`);\n\n                        if (diffResult.difference < this.options.differenceThreshold) {\n                            stabilityCount++;\n                            if (stabilityCount >= this.options.requiredStableChecks) {\n                                this.log(`Visual stability achieved (difference: ${diffResult.difference.toFixed(4)})`);\n                                return;\n                            }\n                        } else {\n                            stabilityCount = 0;\n                        }\n                    }\n\n                    lastScreenshot = currentScreenshot;\n                } catch (e) {\n                    this.log(`Screenshot/comparison error: ${e instanceof Error ? e.message : String(e)}`);\n                    stabilityCount = 0;\n                }\n            }\n\n            // If we exit the loop without returning, we timed out\n            this.log(\"Visual stability check timed out\");\n        } catch (e) {\n            this.log(`Visual stability check error: ${e instanceof Error ? e.message : String(e)}`);\n        } finally {\n            const totalTime = (Date.now() - start) / 1000;\n            this.log(`Visual stability check took ${totalTime.toFixed(2)}s`);\n        }\n    }\n\n    /**\n     * Wait for both network and visual stability\n     * @param timeout Maximum time to wait for page load\n     */\n    async waitForStability(timeout?: number): Promise<void> {\n        const maxWaitTime = timeout ?? this.options.maximumWaitPageLoadTime;\n        const startTime = Date.now();\n        this.lastStart = startTime;\n\n        // Track our deadlines\n        const minWaitDeadline = startTime + this.options.minimumWaitPageLoadTime;\n        const maxWaitDeadline = startTime + maxWaitTime;\n\n        this.log(`Starting stability wait (min: ${this.options.minimumWaitPageLoadTime}ms, max: ${maxWaitTime}ms)`);\n\n        try {\n            // Wait for network stability, but don't exceed max wait time\n            const remainingForNetwork = Math.max(0, maxWaitDeadline - Date.now());\n            if (remainingForNetwork > 0) {\n                await this.waitForNetworkStability(remainingForNetwork);\n            }\n\n            // Wait for visual stability with whatever time remains, but don't exceed max wait time\n            const remainingForVisual = Math.max(0, maxWaitDeadline - Date.now());\n            if (remainingForVisual > 0) {\n                await this.waitForVisualStability(remainingForVisual);\n            }\n\n            // Ensure we've waited at least the minimum time\n            const now = Date.now();\n            if (now < minWaitDeadline) {\n                const remainingMinWait = minWaitDeadline - now;\n                this.log(`Waiting additional ${remainingMinWait}ms to meet minimum wait time`);\n                await new Promise(resolve => setTimeout(resolve, remainingMinWait));\n            }\n\n            const totalTime = Date.now() - startTime;\n            this.log(`Page stability wait completed in ${totalTime}ms`);\n\n        } catch (e) {\n            this.log(`Error during stability wait: ${e instanceof Error ? e.message : String(e)}`);\n        }\n    }\n}","export type KeypressIndicator = '<enter>' | '<tab>';\n\nexport function parseTypeContent(content: string): (string | KeypressIndicator)[] {\n    // Parse content sequence potentially with special indicators <enter> or <tab> into components\n    const regex = /<enter>|<tab>/g;\n    const result: string[] = [];\n    let lastIndex = 0;\n\n    content.replace(regex, (match, offset) => {\n        // Grab the text before the match and trim surrounding whitespace\n        const text = content.slice(lastIndex, offset).trim();\n        if (text) result.push(text);\n\n        // Add the matched special indicator\n        result.push(match);\n        lastIndex = offset + match.length;\n        return match;\n    });\n\n    // Add any remaining text after the last match\n    const remaining = content.slice(lastIndex).trim();\n    if (remaining) result.push(remaining);\n\n    return result;\n}\n\nexport function renderMinimalAccessibilityTree(node: any): string {\n    // Escapes newlines for safe inline printing, and trims whitespace.\n    const sanitize = (text: string | number | boolean): string => {\n        return String(text).trim().replace(/\\n/g, '\\\\n');\n    }\n\n    // Inner recursive function to handle state like indentation\n    function recursiveFlatten(node: any, indent: string): string {\n        const isTextLike = (n: any) =>\n            n && (n.role === 'StaticText' || n.role === 'text') && n.name && n.name.trim();\n\n        let childrenOutput = '';\n        if (node.children) {\n            const newChildren = [];\n            let currentTextBuffer = [];\n\n            for (const child of node.children) {\n                if (isTextLike(child)) {\n                    currentTextBuffer.push(sanitize(child.name));\n                } else {\n                    if (currentTextBuffer.length > 0) {\n                        newChildren.push({ role: 'coalesced-text', name: currentTextBuffer.join(' ') });\n                        currentTextBuffer = [];\n                    }\n                    newChildren.push(child);\n                }\n            }\n            if (currentTextBuffer.length > 0) {\n                newChildren.push({ role: 'coalesced-text', name: currentTextBuffer.join(' ') });\n            }\n\n            for (const child of newChildren) {\n                if (child.role === 'coalesced-text') {\n                    childrenOutput += `${indent}  ${child.name}\\n`;\n                } else {\n                    childrenOutput += recursiveFlatten(child, indent + '  ');\n                }\n            }\n        }\n\n        const isBoringContainer = (node.role === 'generic' || node.role === 'div') && !node.name;\n        if (isBoringContainer) {\n            return childrenOutput;\n        }\n\n        let line = '';\n        if (node.role && !['StaticText', 'text', 'RootWebArea'].includes(node.role)) {\n            line = `${indent}[${node.role}]`;\n            \n            if (node.name && sanitize(node.name)) {\n                line += ` ${sanitize(node.name)}`;\n            }\n            \n            if (node.value !== undefined && sanitize(node.value)) {\n                line += ` (value: ${sanitize(node.value)})`;\n            }\n\n            if (node.checked !== undefined) line += ` (checked: ${node.checked})`;\n            if (node.disabled) line += ` (disabled)`;\n            line += '\\n';\n        }\n\n        return line + childrenOutput;\n    }\n    \n    const rawFlattened = recursiveFlatten(node, '');\n    return rawFlattened.split('\\n').filter(line => line.trim() !== '').join('\\n');\n}","import logger from \"@/logger\";\nimport { Page } from \"playwright\";\n\nexport class ActionVisualizer {\n    /**\n     * Manages the visual indicator for actions on a page\n     */\n    private page!: Page;\n    private visualElementId: string = 'action-visual-indicator';\n    private lastPosition: { x: number; y: number } | null = null;\n\n    constructor() {\n        //this.page = page;\n    }\n\n    setActivePage(page: Page) {\n        this.page = page;\n\n        page.on('load', async () => {\n            // Use a try-catch as page navigation might interrupt this\n            try {\n                await this.redrawLastPosition();\n            } catch (error) {\n                // Ignore errors that might occur during navigation races\n                // console.warn(\"Error redrawing visualizer on load:\", error);\n            }\n        });\n    }\n\n    async visualizeAction(x: number, y: number): Promise<void> {\n        // Store the position\n        this.lastPosition = { x, y };\n        // Create or update the mouse pointer visual, showing the click effect\n        await this._drawVisual(x, y, true);\n        // The pointer visual takes 0.3s on the transition, but awaiting script evaluation does not wait for this to complete.\n        // So we wait 300ms manually.\n        await this.page.waitForTimeout(300);\n    }\n\n    async redrawLastPosition(): Promise<void> {\n        if (this.lastPosition) {\n            // Redraw the visual without the click effect\n            await this._drawVisual(this.lastPosition.x, this.lastPosition.y, false);\n        }\n    }\n\n    // Internal method to handle the actual drawing logic\n    private async _drawVisual(x: number, y: number, showClickEffect: boolean): Promise<void> {\n        try {\n            await this.page.evaluate(\n                ({ x, y, id, showClickEffect }) => {\n                    // Adjust coordinates for scroll position first, as they are needed for both effects\n                    const docX = x + window.scrollX;\n                    const docY = y + window.scrollY;\n\n                    // --- Create Expanding/Fading Circle (Optional) ---\n                    if (showClickEffect) {\n                        const circle = document.createElement('div');\n                        circle.style.position = 'absolute';\n                        circle.style.left = `${docX}px`;\n                        circle.style.top = `${docY}px`;\n                        circle.style.borderRadius = '50%';\n                        circle.style.backgroundColor = '#026aa1'; // Blue color\n                        circle.style.width = '0px';\n                        circle.style.height = '0px';\n                        circle.style.transform = 'translate(-50%, -50%)'; // Center on (x, y)\n                        circle.style.pointerEvents = 'none';\n                        circle.style.zIndex = '9998'; // Below the pointer\n                        circle.style.opacity = '0.7'; // Initial opacity\n                        document.body.appendChild(circle);\n\n                        // Animate the circle\n                        const animation = circle.animate([\n                            { width: '0px', height: '0px', opacity: 0.7 }, // Start state\n                            { width: '50px', height: '50px', opacity: 0 }  // End state\n                        ], {\n                            duration: 500, // 500ms duration\n                            easing: 'ease-out'\n                        });\n\n                        // Remove circle after animation\n                        animation.onfinish = () => {\n                            circle.remove();\n                        };\n                    }\n\n                    // --- Pointer Logic (Always runs) ---\n                    // Check if the visual indicator already exists\n                    let pointerElement = document.getElementById(id);\n                    \n                    // If it doesn't exist, create it with all necessary styling\n                    if (!pointerElement) {\n                        pointerElement = document.createElement('div');\n                        pointerElement.id = id;\n                        pointerElement.style.position = 'absolute';\n                        pointerElement.style.zIndex = '9999';\n                        pointerElement.style.pointerEvents = 'none'; // Don't interfere with actual clicks\n                        // Notice that transition is 300ms\n                        pointerElement.style.transition = 'left 0.3s cubic-bezier(0.25, 0.1, 0.25, 1), top 0.3s cubic-bezier(0.25, 0.1, 0.25, 1)';\n\n                        // Set the innerHTML to the new SVG\n                        pointerElement.innerHTML = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<svg\n   width=\"32\"\n   height=\"32\"\n   viewBox=\"0 0 113.50408 99.837555\"\n   version=\"1.1\"\n   id=\"svg1\"\n   xmlns=\"http://www.w3.org/2000/svg\"\n   xmlns:svg=\"http://www.w3.org/2000/svg\">\n  <defs\n     id=\"defs1\" />\n  <g\n     id=\"layer1\"\n     transform=\"translate(-413.10686,-501.19661)\">\n    <path\n       style=\"fill:#026aa1;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-dasharray:none;stroke-opacity:1\"\n       d=\"m 416.1069,504.1966 52.47697,93.83813 8.33253,-57.61019 z\"\n       id=\"path14-1\" />\n    <path\n       style=\"fill:#0384c7;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-dasharray:none;stroke-opacity:1\"\n       d=\"m 416.1069,504.1966 60.8095,36.22794 46.69517,-34.75524 z\"\n       id=\"path15-8\" />\n    <path\n       style=\"fill:#0384c7;fill-opacity:0;stroke:#000000;stroke-width:6;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1\"\n       d=\"m 416.1069,504.19658 52.47698,93.83813 8.33252,-57.61019 46.69517,-34.75521 -107.50467,-1.47273\"\n       id=\"path16\" />\n  </g>\n</svg>`;\n\n                        document.body.appendChild(pointerElement);\n                    }\n                    \n                    \n                    // Update position - adjust coordinates for scroll position so the tip of the pointer is at (x,y) relative to the document\n                    // Set the top-left corner to (docX, docY) and then translate by (-1px, -3px)\n                    // to align the pointer tip (approx. at 1.27, 4.17 within the SVG) with (docX, docY).\n                    pointerElement.style.left = `${docX}px`;\n                    pointerElement.style.top = `${docY}px`;\n                    pointerElement.style.transform = 'translate(-1px, -3px)';\n                },\n                { x, y, id: this.visualElementId, showClickEffect }\n            );\n        } catch (error: unknown) {\n            // For example when:\n            // TypeError: Failed to set the 'innerHTML' property on 'Element': This document requires 'TrustedHTML' assignment.\n            logger.trace(`Failed to draw visual: ${(error as Error).message}`);\n        }\n    }\n\n    // async removeActionVisuals(): Promise<void> {\n    //     // Remove the visual indicator\n    //     await this.page.evaluate((id) => {\n    //         const element = document.getElementById(id);\n    //         if (element) {\n    //             element.remove();\n    //         }\n    //     }, this.visualElementId);\n    // }\n}\n","// Keeps track of current tab, enables describing open tabs, and switching between open tabs\n\nimport logger from \"@/logger\";\nimport EventEmitter from \"eventemitter3\";\nimport { BrowserContext, Page } from \"playwright\";\n\nexport interface TabEvents {\n    'tabChanged': (page: Page) => void\n}\n\nexport interface TabState {\n    activeTab: number,\n    tabs: {\n        title: string,\n        url: string,\n        // causes issues with circular references, and we don't need it\n        //page: Page\n    }[]\n}\n\nexport class TabManager {\n    /**\n     * Page / tab manager\n     */\n    //private state!: TabState;\n    private context: BrowserContext;\n    private activePage!: Page; // the page the agent currently sees and acts on\n    public readonly events: EventEmitter<TabEvents>;\n\n    constructor(context: BrowserContext) {\n        this.context = context;\n        this.events = new EventEmitter();\n\n        // By default when a new page is created\n        // (for any reason - just started, agent clicked something, user did new page), set it to active\n        this.context.on('page', this.onPageCreated.bind(this));\n    }\n\n    private async onPageCreated(page: Page) {\n        // set active page immediately since agent and helpers expect it to exist\n        this.setActivePage(page);\n    }\n\n    private setActivePage(page: Page) {\n        this.activePage = page;\n        this.events.emit('tabChanged', page);\n    }\n\n    async switchTab(index: number) {\n        const pages = this.context.pages();\n        if (index < 0 || index >= pages.length) {\n            throw new Error(`Invalid tab index: ${index}`);\n        }\n        const page = pages[index];\n        await page.bringToFront();\n        this.setActivePage(page);\n    }\n\n    getActivePage() {\n        return this.activePage;\n    }\n\n    getPages(): Page[] {\n        return this.context.pages();\n    }\n    \n    async retrieveState(): Promise<TabState> {\n        //return this.state;\n        let activeIndex = -1;\n        let tabs = [];\n        for (const [i, page] of this.context.pages().entries()) {\n            if (page == this.activePage) {\n                activeIndex = i;\n            }\n            // may need retries\n            let title: string;\n            try {\n                title = await page.title();\n            } catch {\n                logger.warn('Could not load page title while retrieving tab state');\n                title = '(could not load title)';\n            }\n            \n            const url = page.url();\n            tabs.push({ title, url });//, page });\n        }\n        return {\n            activeTab: activeIndex,\n            tabs: tabs\n        };\n    }\n}","import type { Page } from 'playwright';\nimport getShadowDOMInputAdapterScript from './scripts/shadowDOMInputAdapter';\nimport logger from '@/logger';\n\nexport class DOMTransformer {\n    private initializedPages = new WeakSet<Page>(); // Track pages for which 'load' listener is set\n\n    constructor() {}\n\n    public setActivePage(newPage: Page) {\n        // Only add the 'load' listener if we haven't done so for this specific Page object instance.\n        if (!this.initializedPages.has(newPage)) {\n            newPage.on('load', async () => {\n                // Pass 'newPage' (the page that triggered the 'load' event) to setupScriptForPage.\n                await this.setupScriptForPage(newPage);\n            });\n            this.initializedPages.add(newPage); // Mark this Page object as having its 'load' listener set up.\n        }\n    }\n\n    public async setupScriptForPage(targetPage: Page) {\n        try {\n            // Check if a marker for the script already exists on the page for this load cycle.\n            const scriptAlreadyInjected = await targetPage.evaluate(() => {\n                return (window as any).__magnitudeShadowDOMAdapterInjected === true;\n            }).catch(() => false); // If evaluate fails (e.g., page closed), assume not injected.\n\n            if (scriptAlreadyInjected) {\n                logger.trace('Select manager script already present on this page load.');\n                return;\n            }\n\n            // Get the script as a string from the separate file\n            const scriptFnString = getShadowDOMInputAdapterScript();\n\n            // Evaluate the script function in the browser and set the marker.\n            // We need to wrap it in a self-executing function\n            await targetPage.evaluate(`\n                (${scriptFnString})();\n                window.__magnitudeShadowDOMAdapterInjected = true;\n            `);\n\n            logger.trace(`Script injected into page: ${targetPage.url()}`);\n        } catch (error) {\n            const url = targetPage.isClosed() ? '[closed page]' : targetPage.url();\n            logger.warn(`Error injecting script into ${url}: ${(error as Error).message}`);\n        }\n    }\n}\n","import { Page, Browser, BrowserContext, PageScreenshotOptions } from \"playwright\";\nimport { ClickWebAction, ScrollWebAction, SwitchTabWebAction, TypeWebAction, WebAction } from '@/web/types';\nimport { PageStabilityAnalyzer } from \"./stability\";\nimport { parseTypeContent } from \"./util\";\nimport { ActionVisualizer } from \"./visualizer\";\nimport logger from \"@/logger\";\nimport { TabManager, TabState } from \"./tabs\";\nimport { DOMTransformer } from \"./transformer\";\nimport { Image } from '@/memory/image';\n//import { StateComponent } from \"@/facets\";\n\n\nexport interface WebHarnessOptions {\n    // Some LLM operate best on certain screen dims\n    virtualScreenDimensions?: { width: number, height: number }\n}\n\nexport class WebHarness { // implements StateComponent\n    /**\n     * Executes web actions on a page\n     * Not responsible for browser lifecycle\n     */\n    public readonly context: BrowserContext;\n    private options: WebHarnessOptions;\n    private stability: PageStabilityAnalyzer;\n    public readonly visualizer: ActionVisualizer;\n    private transformer: DOMTransformer;\n    private tabs: TabManager;\n\n    constructor(context: BrowserContext, options: WebHarnessOptions = {}) {\n        //this.page = page;\n        this.context = context;\n        this.options = options;\n        this.stability = new PageStabilityAnalyzer();\n        this.visualizer = new ActionVisualizer();\n        this.transformer = new DOMTransformer();\n        this.tabs = new TabManager(context);\n\n        // this.context.on('page', (page: Page) => {\n        //     this.setActivePage(page);\n        //     //logger.info('ayo we got a new page');\n        // });\n        this.tabs.events.on('tabChanged', async (page: Page) => {\n            this.stability.setActivePage(page);\n            this.visualizer.setActivePage(page);\n            this.transformer.setActivePage(page);\n            // need to wait for page to load before evaluating a script\n            //page.on('load', () => { this.transformer.setActivePage(page); });\n            \n            //console.log('tabs:', await this.tabs.getState())\n\n        });\n    }\n\n    async retrieveTabState(): Promise<TabState> {\n        return this.tabs.retrieveState();\n    }\n\n    // setActivePage(page: Page) {\n    //     this.page = page;\n    //     this.stability.setActivePage(this.page);\n    //     this.visualizer.setActivePage(this.page);\n    // }\n\n    async start() {\n        await this.context.newPage();\n        // Other logic for page tracking is automatically handled by TabManager\n    }\n\n    get page() {\n        return this.tabs.getActivePage();\n    }\n\n    async screenshot(options: PageScreenshotOptions = {}): Promise<Image> {\n        /**\n         * Get b64 encoded string of screenshot (PNG) with screen dimensions\n         */\n        const dpr = await this.page.evaluate(() => window.devicePixelRatio);\n        //const viewportSize = this.page.viewportSize();\n        const buffer = await this.page.screenshot({ type: 'png', ...options }, );\n\n        // if (!viewportSize) {\n        //     throw Error(\"Invalid viewport for screenshot\");\n        // }\n\n        const base64data = buffer.toString('base64');\n\n        //console.log(\"Screenshot DATA:\", base64data.substring(0, 100));\n        const image = Image.fromBase64(base64data);\n\n        // Now, need to rescale the image based on DPR. This is so that:\n        // (1) Save on tokens, dont need huge high res images\n        // (2) More importantly, clicks happen in the standard resolution space, so need to do this for coordinates to be correct\n        //     for any agent not using a virtual screen space (e.g. those that aren't Claude)\n        const { width, height } = await image.getDimensions();\n        return image.resize(width / dpr, height / dpr);\n\n        // return {\n        //     image: `data:image/png;base64,${base64data}`,//buffer.toString('base64'),\n        //     dimensions: {\n        //         width: viewportSize.width,\n        //         height: viewportSize.height\n        //     }\n        // };\n    }\n \n    // async goto(url: string) {\n    //     // No need to redraw here anymore, the 'load' event listener handles it\n    //     await this.page.goto(url);\n    // }\n\n    async _type(content: string) {\n        /** Util for typing + keypresses */\n        const chunks = parseTypeContent(content);\n\n        // Total typing period to make typing more natural, in ms\n        const totalTextDelay = 500;\n\n        let totalTextLength = 0\n        for (const chunk of chunks) {\n            if (chunk != '<enter>' && chunk != '<tab>') {\n                totalTextLength += chunk.length;\n            }\n        }\n\n        for (const chunk of chunks) {\n            if (chunk == '<enter>') {\n                await this.page.keyboard.press('Enter');\n            } else if (chunk == '<tab>') {\n                await this.page.keyboard.press('Tab')\n            } else {\n                const chunkProportion = chunk.length / totalTextLength;\n                const chunkDelay = totalTextDelay * chunkProportion;\n                const chunkCharDelay = chunkDelay / chunk.length;\n                await this.page.keyboard.type(chunk, {delay: chunkCharDelay});\n            }\n        }\n    }\n\n    // safer might be Coordinate interface/obj tied to certain screen space dims\n    transformCoordinates({ x, y }: { x: number, y: number }): { x: number, y: number } {\n        const virtual = this.options.virtualScreenDimensions;\n        if (!virtual) {\n            return { x, y };\n        }\n        const vp = this.page.viewportSize();\n        if (!vp) throw new Error(\"Could not get viewport dimensions to transform coordinates\");\n        return {\n            x: x * (vp.width / virtual.width),\n            y: y * (vp.height / virtual.height),\n        };\n    }\n\n    async click({ x, y }: { x: number, y: number }) {\n        ({ x, y } = this.transformCoordinates({ x, y }));\n        // console.log(\"x:\", x);\n        // console.log(\"y:\", y);\n        await this.visualizer.visualizeAction(x, y);\n        await this.page.mouse.click(x, y);\n        await this.waitForStability();\n        //await this.visualizer.removeActionVisuals();\n    }\n\n    async rightClick({ x, y }: { x: number, y: number }) {\n        ({ x, y } = this.transformCoordinates({ x, y }));\n        await this.visualizer.visualizeAction(x, y);\n        await this.page.mouse.click(x, y, { button: \"right\" });\n        await this.waitForStability();\n    }\n\n    async doubleClick({ x, y }: { x: number, y: number }) {\n        ({ x, y } = this.transformCoordinates({ x, y }));\n        await this.visualizer.visualizeAction(x, y);\n        await this.page.mouse.dblclick(x, y);\n        await this.waitForStability();\n    }\n\n    async drag({ x1, y1, x2, y2 }: { x1: number, y1: number, x2: number, y2: number }) {\n        ({ x: x1, y: y1 } = this.transformCoordinates({ x: x1, y: y1 }));\n        ({ x: x2, y: y2 } = this.transformCoordinates({ x: x2, y: y2 }));\n\n        //console.log(`Dragging: (${x1}, ${y1}) -> (${x2}, ${y2})`);\n        \n        await this.page.mouse.move(x1, y1, { steps: 1 });\n        await this.page.mouse.down();\n        await this.visualizer.visualizeAction(x1, y1);\n        await this.page.waitForTimeout(500);\n        \n        await Promise.all([\n            this.page.mouse.move(x2, y2, { steps: 20 }),\n            this.visualizer.visualizeAction(x2, y2)\n        ]);\n        // await this.page.mouse.move(x2, y2, { steps: 100 });\n        // await this.visualizer.visualizeAction(x2, y2);\n        await this.page.mouse.up();\n        await this.waitForStability();\n        //await this.visualizer.removeActionVisuals();\n    }\n\n    async type({ content }: { content: string }) {\n        await this._type(content);\n        await this.waitForStability();\n    }\n\n    async clickAndType({ x, y, content }: { x: number, y: number, content: string }) {\n        // TODO: transforms incorrect for moondream grounding with virtual screen dims (claude) - unsure why\n        //console.log(`Pre transform: ${x}, ${y}`);\n        ({ x, y } = this.transformCoordinates({ x, y }));\n        //console.log(`Post transform: ${x}, ${y}`);\n        await this.visualizer.visualizeAction(x, y);\n        await this.page.mouse.click(x, y);\n        await this._type(content);\n        await this.waitForStability();\n    }\n    \n    async scroll({ x, y, deltaX, deltaY }: { x: number, y: number, deltaX: number, deltaY: number }) {\n        ({ x, y } = this.transformCoordinates({ x, y }));\n        await this.visualizer.visualizeAction(x, y);\n        await this.page.mouse.move(x, y);\n        await this.page.mouse.wheel(deltaX, deltaY);\n        await this.waitForStability();\n    }\n\n    async switchTab({ index }: { index: number }) {\n        await this.tabs.switchTab(index);\n        await this.waitForStability();\n    }\n\n    async newTab() {\n        await this.context.newPage();\n        // Reasonable default and less confusing than white about:blank page\n        await this.navigate(\"https://google.com\");\n    }\n\n    async navigate(url: string) {\n        // Only wait for DOM content on goto since we handle waiting for network idle etc ourselves\n        await this.page.goto(url, { waitUntil: 'domcontentloaded' });\n        await this.waitForStability();\n    }\n\n    async selectAll() {\n        await this.page.keyboard.down('ControlOrMeta');\n        await this.page.keyboard.press('KeyA');\n        await this.page.keyboard.up('ControlOrMeta');\n    }\n\n    async enter() {\n        await this.page.keyboard.press('Enter')\n    }\n\n    async backspace() {\n        await this.page.keyboard.press('Backspace')\n    }\n\n    async tab() {\n        await this.page.keyboard.press('Tab')\n    }\n\n    async goBack() {\n        await this.page.goBack();\n    }\n\n    async executeAction(action: WebAction) {\n        if (action.variant === 'click') {\n            await this.click(action);\n        } else if (action.variant === 'type') {\n            await this.clickAndType(action);\n        } else if (action.variant === 'scroll') {\n            await this.scroll(action);\n        } else if (action.variant === 'tab') {\n            await this.switchTab(action);\n        } else {\n            throw Error(`Unhandled web action variant: ${(action as any).variant}`);\n        }\n        //await this.stability.waitForStability();\n        //await this.visualizer.redrawLastPosition();\n    }\n\n    async waitForStability(timeout?: number): Promise<void> {\n        await this.stability.waitForStability(timeout);\n    }\n\n    // async applyTransformations() {\n    //     const start = Date.now();\n    //     await this.transformer.applyTransformations();\n    //     logger.trace(`DOM transformations took ${Date.now() - start}ms`);\n    // }\n\n    // async waitForStability(timeout?: number): Promise<void> {\n    //     await this.stability.waitForStability(timeout);\n    // }\n}\n","import { ActionDefinition, ActionPayload, createAction } from \".\";\nimport { z } from \"zod\";\nimport { BrowserConnector } from \"@/connectors/browserConnector\"; // Changed from WebInteractionFacet\nimport { AgentError } from \"@/agent/errors\"; // For error handling\nimport { Agent } from \"@/agent\"; // Import Agent type for agent parameter\n\n// For separate grounding\nexport const clickTargetAction = createAction({\n    name: 'mouse:click',\n    description: \"Click something\",\n    schema: z.object({\n        target: z.string().describe(\"Where exactly to click\"),\n    }),\n    resolver: async ({ input: { target }, agent }) => {\n        const web = agent.require(BrowserConnector);\n        const harness = web.getHarness();\n        const screenshot = await web.getLastScreenshot();\n        const { x, y } = await web.requireGrounding().locateTarget(screenshot, target);\n        await harness.click({ x, y });\n    },\n    //render: ({ x, y}) => `⊙ Clicked (${})`\n});\n\n// For separate grounding\n// export const clickTargetAndType = createAction({\n//     name: 'browser:type',\n//     description: \"Click something and type into it\",\n//     schema: z.object({\n//         target: z.string().describe(\"Where exactly to click before typing\"),\n//         content: z.string().describe(\"Content to type, insert sequences <enter> or <tab> for those keypresses respectively.\"),\n//     }),\n//     resolver: async ({ input: { target, content }, agent }) => {\n//         const web = agent.require(BrowserConnector);\n//         const harness = web.getHarness();\n//         const screenshot = await web.getLastScreenshot();\n//         const { x, y } = await web.requireGrounding().locateTarget(screenshot, target);\n//         await harness.clickAndType({ x, y, content });\n//     }\n// });\n\n// For separate grounding\nexport const scrollTargetAction = createAction({\n    name: 'mouse:scroll',\n    description: \"Hover mouse over target and scroll\",\n    schema: z.object({\n        target: z.string().describe(\"Somewhere specific inside the container to scroll in\"),\n        deltaX: z.number().int().describe(\"Pixels to scroll horizontally\"),\n        deltaY: z.number().int().describe(\"Pixels to scroll vertically\"),\n    }),\n    resolver: async ({ input: { target, deltaX, deltaY }, agent }) => {\n        const web = agent.require(BrowserConnector);\n        const harness = web.getHarness();\n        const screenshot = await web.getLastScreenshot();\n        const { x, y } = await web.requireGrounding().locateTarget(screenshot, target);\n        await harness.scroll({ x, y, deltaX, deltaY });\n    }\n});\n\n// For grounded planner\nexport const clickCoordAction = createAction({\n    name: 'mouse:click',\n    description: \"Click something\",\n    schema: z.object({\n        x: z.number().int(),\n        y: z.number().int(),\n    }),\n    resolver: async ({ input: { x, y }, agent }) => {\n        const web = agent.require(BrowserConnector);\n        const harness = web.getHarness();\n        await harness.click({ x, y });\n    },\n    render: ({ x, y }) => `⊙ click (${x}, ${y})`\n});\n\nexport const mouseDoubleClickAction = createAction({\n    name: 'mouse:double_click',\n    schema: z.object({\n        x: z.number().int(),\n        y: z.number().int(),\n    }),\n    resolver: async ({ input: { x, y }, agent }) => {\n        const web = agent.require(BrowserConnector);\n        const harness = web.getHarness();\n        await harness.doubleClick({ x, y });\n    },\n    render: ({ x, y }) => `⊙ double click (${x}, ${y})`\n});\n\nexport const mouseRightClickAction = createAction({\n    name: 'mouse:right_click',\n    schema: z.object({\n        x: z.number().int(),\n        y: z.number().int(),\n    }),\n    resolver: async ({ input: { x, y }, agent }) => {\n        await agent.require(BrowserConnector).getHarness().rightClick({ x, y });\n    },\n    render: ({ x, y }) => `⊙ right click (${x}, ${y})`\n});\n\nexport const mouseDragAction = createAction({\n    name: 'mouse:drag',\n    description: \"Click and hold mouse in one location and release in another\",\n    schema: z.object({\n        from: z.object({ x: z.number().int(), y: z.number().int() }),\n        to: z.object({ x: z.number().int(), y: z.number().int() })\n    }),\n    resolver: async ({ input: { from, to }, agent }) => {\n        const web = agent.require(BrowserConnector);\n        const harness = web.getHarness();\n        await harness.drag({ x1: from.x, y1: from.y, x2: to.x, y2: to.y });\n    },\n    render: ({ from, to }) => `⤡ drag (${from.x}, ${from.y}) -> (${to.x}, ${to.y})`\n});\n\nexport const typeAction = createAction({\n    name: 'keyboard:type',\n    description: \"Make sure to click where you need to type first\", // make sure you click into it first\n    schema: z.object({\n        content: z.string().describe(\"Content to type\"),\n    }),\n    resolver: async ({ input: { content }, agent }) => {\n        const webConnector = agent.require(BrowserConnector);\n        const harness = webConnector.getHarness();\n        await harness.type({ content });\n    },\n    render: ({ content }) => `⌨︎ type \"${content}\"`\n});\n\nexport const keyboardEnterAction = createAction({\n    name: 'keyboard:enter',\n    resolver: async ({ agent }) => {\n        await agent.require(BrowserConnector).getHarness().enter();\n    },\n    render: () => `⏎ press enter`\n});\n\nexport const keyboardTabAction = createAction({\n    name: 'keyboard:tab',\n    resolver: async ({ agent }) => {\n        await agent.require(BrowserConnector).getHarness().tab();\n    },\n    render: () => `⇥ press tab`\n});\n\nexport const keyboardBackspaceAction = createAction({\n    name: 'keyboard:backspace',\n    resolver: async ({ agent }) => {\n        await agent.require(BrowserConnector).getHarness().backspace();\n    },\n    render: () => `⌫ press backspace`\n});\n\nexport const keyboardSelectAllAction = createAction({\n    name: 'keyboard:select_all',\n    description: \"Select all content in the active text area (CTRL+A)\",\n    resolver: async ({ input: { content }, agent }) => {\n        await agent.require(BrowserConnector).getHarness().selectAll();\n    },\n    render: () => `⬚ select all`\n});\n\n// For grounded planner\nexport const scrollCoordAction = createAction({\n    name: 'mouse:scroll',\n    description: \"Hover mouse over target and scroll\",\n    schema: z.object({\n        x: z.number().int(),\n        y: z.number().int(),\n        deltaX: z.number().int().describe(\"Pixels to scroll horizontally\"),\n        deltaY: z.number().int().describe(\"Pixels to scroll vertically\"),\n    }),\n    resolver: async ({ input: { x, y, deltaX, deltaY }, agent }) => {\n        const webConnector = agent.require(BrowserConnector);\n        const harness = webConnector.getHarness();\n        await harness.scroll({ x, y, deltaX, deltaY });\n    },\n    render: ({ x, y, deltaX, deltaY }) => `↕ scroll (${deltaX}px, ${deltaY}px)`\n});\n\n// Grounding agnostic\nexport const switchTabAction = createAction({\n    name: 'browser:tab:switch',\n    description: \"Switch to a tab that is already open\",\n    schema: z.object({\n        index: z.number().int().describe(\"Index of tab to switch to\"),\n    }),\n    resolver: async ({ input: { index }, agent }) => {\n        const webConnector = agent.require(BrowserConnector);\n        const harness = webConnector.getHarness();\n        await harness.switchTab({ index });\n    },\n    render: ({ index }) => `⧉ switch to tab ${index}`\n});\n\nexport const newTabAction = createAction({\n    name: 'browser:tab:new',\n    description: \"Open and switch to a new tab\",\n    schema: z.object({}),\n    resolver: async ({ agent }) => {\n        const webConnector = agent.require(BrowserConnector);\n        const harness = webConnector.getHarness();\n        await harness.newTab();\n    },\n    render: () => `⊞ open new tab`\n});\n\nexport const navigateAction = createAction({\n    name: 'browser:nav',\n    description: \"Navigate to a URL directly\",\n    schema: z.object({\n        url: z.string().describe('URL to navigate to'),\n    }),\n    resolver: async ({ input: { url }, agent }) => {\n        const webConnector = agent.require(BrowserConnector);\n        const harness = webConnector.getHarness();\n        await harness.navigate(url);\n    },\n    render: ({ url }) => `⛓︎ navigate to ${url}`\n});\n\nexport const goBackAction = createAction({\n    name: 'browser:nav:back',\n    description: \"Go back\",\n    schema: z.object({}),\n    resolver: async ({ agent }) => {\n        const webConnector = agent.require(BrowserConnector);\n        const harness = webConnector.getHarness();\n        await harness.goBack();\n    },\n    render: () => `← navigate back`\n});\n\n// gets overused currently if we include this\nexport const waitAction = createAction({\n    name: 'wait',\n    description: \"Wait for some time\",\n    schema: z.object({\n        seconds: z.number()\n    }),\n    resolver: async ({ input: { seconds }, agent }) => {\n        await new Promise((resolve) => setTimeout(resolve, seconds * 1000));\n    },\n    render: ({ seconds }) => `◴ wait for ${seconds}s`\n});\n\n// export const webActions = [\n//     clickTargetAction,\n//     clickTargetAndType,\n//     scrollTargetAction,\n//     switchTabAction,\n// ] as const;\n\n\nexport const agnosticWebActions = [\n    newTabAction,\n    switchTabAction,\n    navigateAction,\n    typeAction,\n    keyboardEnterAction,\n    keyboardTabAction,\n    keyboardBackspaceAction,\n    keyboardSelectAllAction,\n    //waitAction,\n] as const;\n\nexport const coordWebActions = [\n    clickCoordAction,\n    mouseDoubleClickAction,\n    mouseRightClickAction,\n    scrollCoordAction,\n    mouseDragAction,\n    //typeAction\n] as const;\n\nexport const targetWebActions = [\n    clickTargetAction,\n    //typeAction,\n    //clickTargetAndType,\n    scrollTargetAction\n] as const;","import { Browser, BrowserContext, BrowserContextOptions, chromium, LaunchOptions, CDPSession } from \"playwright\";\nimport objectHash from 'object-hash';\nimport crypto from 'node:crypto';\nimport logger from \"@/logger\";\nimport { Logger } from 'pino';\n\nconst DEFAULT_BROWSER_OPTIONS: LaunchOptions = {\n    headless: false,\n    args: [\"--disable-gpu\", \"--disable-blink-features=AutomationControlled\"],\n};\n\nexport type BrowserOptions = ({ instance: Browser } | { cdp: string } | { launchOptions?: LaunchOptions }) & {\n    contextOptions?: BrowserContextOptions;\n};\n\ninterface ActiveBrowser {\n    // either a browser still being launched or already resolved and ready\n    browserPromise: Promise<Browser>;\n    activeContextsCount: number;\n}\n\nexport class BrowserProvider {\n    private activeBrowsers: Record<string, ActiveBrowser> = {};\n    private logger: Logger;\n\n    private constructor() {\n        this.logger = logger.child({ name: 'browser_provider' });\n    }\n\n    public static getInstance(): BrowserProvider {\n        if (!(globalThis as any).__magnitude__) {\n            (globalThis as any).__magnitude__ = {};\n        }\n\n        if (!(globalThis as any).__magnitude__.browserProvider) {\n            (globalThis as any).__magnitude__.browserProvider = new BrowserProvider();\n        }\n\n        return (globalThis as any).__magnitude__.browserProvider;\n    }\n\n    private async _launchOrReuseBrowser(options: LaunchOptions): Promise<ActiveBrowser> {\n        // hash options\n        const hash = objectHash({\n            ...options,\n            logger: options.logger ? crypto.randomUUID() : '' // replace unserializable logger - use UUID to force re-instance in case different loggers provided\n        });\n        \n        let activeBrowser: ActiveBrowser;\n        if (!(hash in this.activeBrowsers)) {\n            this.logger.trace(\"Launching new browser\");\n            // Launch new browser, get the PROMISE\n            const launchPromise = chromium.launch({ ...DEFAULT_BROWSER_OPTIONS, ...options });\n\n            activeBrowser = {\n                browserPromise: launchPromise,\n                activeContextsCount: 0\n            };\n            // add immediately in case others need to await the same one as well\n            this.activeBrowsers[hash] = activeBrowser;\n\n            // Wait for browser to fully start\n            const browser = await launchPromise;\n\n            browser.on('disconnected', () => {\n                delete this.activeBrowsers[hash];\n            });\n\n            return activeBrowser;\n        } else {\n            this.logger.trace(\"Browser with same launch options exists, reusing\");\n            return this.activeBrowsers[hash];\n        }\n    }\n\n    public async _createAndTrackContext(options: BrowserOptions): Promise<BrowserContext> {\n        const activeBrowserEntry = await this._launchOrReuseBrowser('launchOptions' in options ? options.launchOptions! : {});\n        const browser = await activeBrowserEntry.browserPromise;\n        // FROM HERE\n        const context = await browser.newContext(options.contextOptions);\n\n        // Get viewport dimensions from context options or use defaults\n        const viewport = options.contextOptions?.viewport || { width: 1024, height: 768 };\n        const deviceScaleFactor = options.contextOptions?.deviceScaleFactor || 1;\n\n        // Apply emulation settings to any new pages created\n        context.on('page', async (page) => {\n            const cdpSession = await page.context().newCDPSession(page);\n            await this._applyEmulationSettings(cdpSession, viewport.width, viewport.height, deviceScaleFactor);\n        });\n\n        activeBrowserEntry.activeContextsCount++;\n\n        context.on('close', async () => {\n            activeBrowserEntry.activeContextsCount--;\n            if (activeBrowserEntry.activeContextsCount <= 0 && browser.isConnected()) {\n                await browser.close();\n            }\n        });\n        return context;\n    }\n\n    public async newContext(options?: BrowserOptions): Promise<BrowserContext> {\n        if (process.env.MAGNTIUDE_PLAYGROUND) {\n            // this.logger.trace(\"MAGNITUDE_PLAYGROUND environment detected, connecting to browser via CDP\");\n            // Playground environment - force use CDP on 9222\n            //const browser = await chromium.connectOverCDP('http://localhost:9222');\n            //return browser.newContext(options?.contextOptions);\n            this.logger.trace(\"MAGNITUDE_PLAYGROUND environment detected, applying playground launch options\");\n            const playgroundLaunchOptions = {\n                args: [\n                    '--remote-debugging-port=9222',\n                    '--no-sandbox',\n                    '--disable-dev-shm-usage',\n                    '--disable-gpu'\n                ]\n            };\n            // Overwrite any launch options, instance, or cdp configuration with playground launch options\n            // Passthrough context options (?)\n            options = {\n                launchOptions: playgroundLaunchOptions,\n                contextOptions: options?.contextOptions,\n            };\n        }\n\n        if (options) {\n            if ('cdp' in options) {\n                const browser = await chromium.connectOverCDP(options.cdp);\n                return browser.newContext(options.contextOptions);\n            } else if ('instance' in options) {\n                return await options.instance.newContext(options.contextOptions);\n            } else if ('launchOptions' in options) {\n                this.logger.trace('Creating context with custom launch options');\n                return await this._createAndTrackContext(options);\n            } else {\n                // contextOptions might be passed but no instance | cdp | launchOptions\n                this.logger.trace('Creating context for default browser options');\n                return await this._createAndTrackContext(options);\n            }\n        } else {\n            // No options provided at all\n            this.logger.trace('Creating context for default browser options');\n            return await this._createAndTrackContext({});\n        }\n    }\n\n    private async _applyEmulationSettings(cdpSession: CDPSession, width: number, height: number, deviceScaleFactor: number) {\n        await cdpSession.send('Emulation.setDeviceMetricsOverride', {\n            width: width,\n            height: height,\n            deviceScaleFactor: deviceScaleFactor,\n            mobile: false,\n            screenWidth: width,\n            screenHeight: height,\n            positionX: 0,\n            positionY: 0,\n            screenOrientation: { angle: 0, type: 'portraitPrimary' }\n        });\n    }\n}","import { ClickWebAction, PixelCoordinate, ScrollWebAction, TypeWebAction, WebAction } from '@/web/types';\nimport { ActionIntent, CheckIntent, ClickIntent, Intent, ScrollIntent, TypeIntent } from '@/actions/types';\nimport logger from \"@/logger\";\nimport { Logger } from 'pino';\nimport { vl as MoondreamClient } from 'moondream';\nimport { GroundingClient } from './types';\nimport { retryOnError } from '@/common/util';\nimport { Image } from '@/memory/image';\n\n\ninterface GroundingServiceConfig {\n    // only supported executor client rn is moondream\n    client?: GroundingClient;\n}\n\n// TODO: if provider moondream, have default options e.g.\n// executor: {\n//     provider: 'moondream',\n//     options: {\n//         apiKey: process.env.MOONDREAM_API_KEY || \"YOUR_MOONDREAM_API_KEY\"\n//     }\n// } as GroundingClient,\n\nconst DEFAULT_CLIENT: GroundingClient = {\n    provider: 'moondream',\n    options: {\n        baseUrl: \"https://api.moondream.ai/v1\",\n        apiKey: process.env.MOONDREAM_API_KEY\n    }\n}\n\nexport interface GroundingServiceInfo {\n    provider: string,\n    numCalls: number\n}\n\nexport const moondreamTargetingInstructions = `\nTargets descriptions must be carefully chosen to be accurately picked up by Moondream, a small vision model.\nBuild a \"minimal unique identifier\" - a description that is as brief as possible that uniquely identifies the target on the page.\nUse only the information needed, and prioritize in this order:\n- specific text\n- specific shapes and colors\n- positional information\n- high level information (Moondream cannot always understand high level concepts)\n`;\n\nexport class GroundingService {\n    /**\n     * Small, fast, vision agent to translate high level web actions to precise, executable actions.\n     * Uses Moondream for pixel precision pointing.\n     */\n    private config: Required<GroundingServiceConfig>;\n    private info: GroundingServiceInfo;\n    private logger: Logger;\n    private moondream: MoondreamClient;\n\n    constructor(config: GroundingServiceConfig) {\n        //const clientOptions = { ...DEFAULT_CLIENT_OPTIONS, ...config.client };\n        const clientOptions = { ...DEFAULT_CLIENT.options, ...(config.client?.options ?? {}) };\n        const client = { ...DEFAULT_CLIENT, ...(config.client ?? {}), options: clientOptions };\n        this.config = {...config, client: client };\n        this.info = { provider: 'moondream', numCalls: 0 };\n        this.logger = logger.child({ name: 'agent.grounding' });\n        this.moondream = new MoondreamClient({ apiKey: this.config.client.options.apiKey, endpoint: this.config.client.options.baseUrl });\n    }\n\n    getInfo(): GroundingServiceInfo {\n        return this.info;\n    }\n\n    async locateTarget(screenshot: Image, target: string): Promise<PixelCoordinate> {\n        return await retryOnError(\n            async () => this._locateTarget(screenshot, target),\n            ['429', '503', '524'], 20, 1000\n        );\n    }\n\n    async _locateTarget(screenshot: Image, target: string): Promise<PixelCoordinate> {\n        const start = Date.now();\n\n        const response = await this.moondream.point({\n            image: { imageUrl: await screenshot.toBase64() },\n            object: target\n        });\n        this.info.numCalls++;\n        // Point API can return multiple, which we don't really want. We want one clear target.\n        // todo: actually handle these errors appropriately in caller\n        if (response.points.length > 1) {\n            logger.warn({ points: response.points }, \"Moondream returned multiple points for locateTarget\");\n            throw new Error(`Moondream returned multiple points (${response.points.length}), target '${target}' unclear`);\n        }\n        if (response.points.length === 0) {\n            logger.warn(\"Moondream returned no points\");\n            throw new Error(`Moondream returned no points, target unclear`);\n        }\n        const relCoords = response.points[0];\n        this.logger.trace(`locateTarget took ${Date.now()-start}ms`);\n\n        // Convert from [0,1] to screen space\n        const { width, height } = await screenshot.getDimensions();\n        return {\n            x: relCoords.x * width,\n            y: relCoords.y * height\n        }\n    }\n}","export async function retryOnError<T>(\n    fnToRetry: () => Promise<T>,\n    errorSubstrings: string[],\n    retryLimit: number,\n    delayMs: number = 200\n): Promise<T> {\n    let lastError: any;\n\n    if (retryLimit < 0) {\n        retryLimit = 0;\n    }\n\n    for (let attempt = 0; attempt <= retryLimit; attempt++) {\n        try {\n            return await fnToRetry();\n        } catch (error: any) {\n            lastError = error;\n\n            const errorMessage = String(error?.message ?? error);\n\n            const includesSubstring = errorSubstrings.some((substring) => errorMessage.includes(substring));\n\n            if (includesSubstring) {\n                if (attempt === retryLimit) {\n                    throw lastError;\n                }\n            } else {\n                // Error message does NOT contain the target substring. This error is not retryable.\n                throw lastError; // Throw this current error immediately.\n            }\n        }\n        await new Promise((resolve) => setTimeout(resolve, delayMs));\n    }\n\n    throw lastError;\n}\n\n/**\n * Performs a deep comparison between two values to determine if they are equivalent.\n *\n * @param a The first value to compare.\n * @param b The second value to compare.\n * @param cache A WeakMap to handle circular references. Should not be provided by the caller.\n * @returns `true` if the values are deeply equal, `false` otherwise.\n */\nexport function deepEquals(a: any, b: any, cache = new WeakMap<object, WeakSet<object>>()): boolean {\n    // 1. Strict equality check (handles primitives, same object references, null, undefined)\n    if (a === b) {\n        return true;\n    }\n\n    // 2. If a or b is null or not an object, and they weren't ===, they are not equal.\n    //    (This covers cases like comparing a primitive to an object, or one null and one object)\n    if (a == null || typeof a !== 'object' || b == null || typeof b !== 'object') {\n        return false;\n    }\n\n    // 3. Handle circular references:\n    //    If we've already started comparing 'a' and 'b' in the current path,\n    //    assume they are equal to break the cycle.\n    if (cache.has(a) && cache.get(a)!.has(b)) {\n        return true;\n    }\n    // Add to cache before recursive calls\n    if (!cache.has(a)) {\n        cache.set(a, new WeakSet());\n    }\n    cache.get(a)!.add(b);\n\n    // Symmetrically for b -> a to catch cycles like a.c = b; b.c = a;\n    if (!cache.has(b)) {\n        cache.set(b, new WeakSet());\n    }\n    cache.get(b)!.add(a);\n\n\n    // 4. Handle Dates\n    if (a instanceof Date && b instanceof Date) {\n        return a.getTime() === b.getTime();\n    }\n\n    // 5. Handle Regular Expressions\n    if (a instanceof RegExp && b instanceof RegExp) {\n        return a.source === b.source && a.flags === b.flags;\n    }\n\n    // 6. Handle Arrays\n    if (Array.isArray(a) && Array.isArray(b)) {\n        if (a.length !== b.length) {\n            return false;\n        }\n        for (let i = 0; i < a.length; i++) {\n            if (!deepEquals(a[i], b[i], cache)) {\n                return false;\n            }\n        }\n        return true;\n    }\n\n    // 7. Handle plain Objects\n    //    At this point, 'a' and 'b' are objects but not arrays, dates, or regexps.\n    //    If one is an array and the other an object, they are not equal.\n    if (Array.isArray(a) || Array.isArray(b)) {\n        return false;\n    }\n\n    const keysA = Object.keys(a);\n    const keysB = Object.keys(b);\n\n    if (keysA.length !== keysB.length) {\n        return false;\n    }\n\n    for (const key of keysA) {\n        // Check if key exists in B. `Object.keys` only returns own enumerable properties.\n        // `hasOwnProperty` is a more robust check if b might have non-enumerable properties from its prototype with the same name.\n        // However, since we compare keysA.length and keysB.length, if key is in keysA but not in keysB,\n        // lengths would mismatch or the loop over keysB (if we did that) would find a key in B not in A.\n        // The most crucial part is `Object.prototype.hasOwnProperty.call(b, key)`\n        if (!Object.prototype.hasOwnProperty.call(b, key)) {\n            return false;\n        }\n        if (!deepEquals(a[key], b[key], cache)) {\n            return false;\n        }\n    }\n\n    return true;\n}\n","import { AgentConnector } from \".\";\n//import { Observation, BamlRenderable } from \"@/memory\";\nimport { WebHarness } from \"@/web/harness\";\nimport { ActionDefinition } from '@/actions';\nimport { agnosticWebActions, coordWebActions, targetWebActions } from '@/actions/webActions';\nimport { Browser, BrowserContext, BrowserContextOptions, LaunchOptions } from \"playwright\";\nimport { BrowserOptions, BrowserProvider } from \"@/web/browserProvider\";\nimport logger from \"@/logger\";\nimport { Logger } from 'pino';\nimport { TabState } from '@/web/tabs';\nimport { Observation } from \"@/memory/observation\";\nimport { Image } from \"@/memory/image\";\nimport { GroundingClient } from \"@/ai/types\";\nimport { GroundingService, moondreamTargetingInstructions } from \"@/ai/grounding\";\n\n// export type BrowserOptions = ({ instance: Browser } | { launchOptions?: LaunchOptions }) & {\n//     contextOptions?: BrowserContextOptions;\n// };\n\n// const foo: BrowserOptions = {\n//     launchOptions: {},\n//     instance: {},\n\n// }\n\nexport interface BrowserConnectorOptions {\n    //browser?: Browser\n    browser?: BrowserOptions\n    url?: string\n    //browserContextOptions?: BrowserContextOptions\n    grounding?: GroundingClient\n    virtualScreenDimensions?: { width: number, height: number }\n}\n\nexport interface BrowserConnectorStateData {\n    screenshot: Image;\n    tabs: TabState;\n}\n\nexport class BrowserConnector implements AgentConnector {\n    public readonly id: string = \"web\";\n    private harness!: WebHarness;\n    private options: BrowserConnectorOptions;\n    private browser?: Browser;\n    private context!: BrowserContext;\n    private logger: Logger;\n    private grounding?: GroundingService;\n\n    constructor(options: BrowserConnectorOptions = {}) {\n        this.options = options;\n        this.logger = logger.child({\n            name: `connectors.${this.id}`\n        });\n        if (this.options.grounding) {\n            this.grounding = new GroundingService({ client: this.options.grounding });\n        }\n    }\n\n    requireGrounding(): GroundingService {\n        if (!this.grounding) throw new Error(\"Grounding not configured on web connector\");\n        return this.grounding;\n    }\n\n    async onStart(): Promise<void> {\n        this.logger.info(\"Starting...\");\n\n        const dpr = process.env.DEVICE_PIXEL_RATIO ?\n            parseInt(process.env.DEVICE_PIXEL_RATIO) :\n            process.platform === 'darwin' ? 2 : 1;\n        \n        const browserContextOptions: BrowserContextOptions = {\n            viewport: { width: 1024, height: 768 },\n            deviceScaleFactor: dpr,\n            ...this.options.browser?.contextOptions\n        };\n\n        const browserOptions = this.options.browser;\n        \n        this.logger.info(\"Creating new browser context.\");\n\n        this.context = await BrowserProvider.getInstance().newContext({\n            ...browserOptions,\n            contextOptions: browserContextOptions\n        });\n        // if (browserOptions) {\n        //     //let browserInstance: Browser;\n        //     if ('instance' in browserOptions) {\n        //         //browserInstance = browserOptions.instance;\n        //         this.context = await browserOptions.instance.newContext(browserContextOptions);\n        //     } else {\n        //         // todo: launch browser via browserprovider with these launch options\n        //     }\n        // } else {\n        //     //browserInstance = await BrowserProvider.getInstance();\n        //     this.context = await BrowserProvider.getInstance().newContext(browserContextOptions);\n        //     this.logger.info(\"Using singleton browser provider.\");\n        // }\n        //browserOptions.instance\n        \n        //let browserInstance = this.options.browser?.instance;\n        \n        \n        // if (browserInstance) {\n        //     this.context = await browserInstance.newContext(browserContextOptions)\n        // } else {\n        //     this.context = await BrowserProvider.getInstance().newContext(browserContextOptions);\n        //     this.logger.info(\"Using singleton browser provider.\");\n        // }\n        \n        this.harness = new WebHarness(this.context, {\n            virtualScreenDimensions: this.options.virtualScreenDimensions\n        });\n        await this.harness.start();\n        this.logger.info(\"WebHarness started.\");\n\n        if (this.options.url) {\n            this.logger.info(`Navigating to initial URL: ${this.options.url}`);\n            await this.harness.navigate(this.options.url);\n            //await this.harness.waitForStability();\n        }\n        this.logger.info(\"Started successfully.\");\n    }\n\n    async onStop(): Promise<void> {\n        this.logger.info(\"Stopping...\");\n        if (this.context) {\n            await this.context.close();\n            this.logger.info(\"Browser context closed.\");\n        }\n        // Note: We don't close this.browser here if obtained from BrowserProvider,\n        // as BrowserProvider manages the singleton browser lifecycle.\n        // If this.options.browser was provided, its lifecycle is managed externally.\n        this.logger.info(\"Stopped successfully.\");\n    }\n\n    getActionSpace(): ActionDefinition<any>[] {\n        if (this.grounding) {\n            // Separate grounding\n            return [...targetWebActions, ...agnosticWebActions];\n        } else {\n            // Planner is grounded\n            return [...coordWebActions, ...agnosticWebActions];\n        }\n    }\n    \n    // public get page(): Page {\n    //     if (!this.harness || !this.harness.page) {\n    //         throw new Error(\"WebInteractionConnector: Harness or Page is not available. Ensure onStart has completed.\");\n    //     }\n    //     return this.harness.page;\n    // }\n\n    public getHarness(): WebHarness {\n        if (!this.harness) {\n            throw new Error(\"WebInteractionConnector: Harness is not available. Ensure onStart has completed.\");\n        }\n        return this.harness;\n    }\n\n    private async captureCurrentState(): Promise<BrowserConnectorStateData> {\n        if (!this.harness || !this.harness.page) {\n            throw new Error(\"WebInteractionConnector: Harness or Page is not available for capturing state.\");\n        }\n        const [screenshot, tabs] = await Promise.all([\n            this.harness.screenshot(),\n            this.harness.retrieveTabState()\n        ]);\n        //const resizedScreenshot = await screenshot.resize()\n        // if (this.options.autoResize) {\n        //     return { screenshot: await screenshot.resize(this.options.autoResize.width, this.options.autoResize.height), tabs: tabs };\n        // }\n        return { screenshot: await this.transformScreenshot(screenshot), tabs: tabs };\n    }\n\n    async transformScreenshot(screenshot: Image): Promise<Image> {\n        if (this.options.virtualScreenDimensions) {\n            return await screenshot.resize(this.options.virtualScreenDimensions.width, this.options.virtualScreenDimensions.height);\n        } else {\n            return screenshot;\n        }\n    }\n\n    public async getLastScreenshot(): Promise<Image> {\n        //return { image: \"\", dimensions: { width: 0, height: 0 } };\n        // TODO: better to use last\n        return (await this.captureCurrentState()).screenshot;\n    }\n\n    async collectObservations(): Promise<Observation[]> {\n        const currentState = await this.captureCurrentState();\n        const observations: Observation[] = [];\n\n        const currentTabs = currentState.tabs;\n        let tabInfo = \"Open Tabs:\\n\";\n        currentTabs.tabs.forEach((tab, index) => {\n            tabInfo += `${index === currentTabs.activeTab ? '[ACTIVE] ' : ''}${tab.title} (${tab.url})`;\n        });\n\n        observations.push(\n            Observation.fromConnector(\n                this.id,\n                await this.transformScreenshot(currentState.screenshot),\n                { type: 'screenshot', limit: 3, dedupe: true }\n            )\n        );\n        observations.push(\n            Observation.fromConnector(\n                this.id,\n                tabInfo,\n                { type: 'tabinfo', limit: 1 }\n            )\n        );\n        return observations;\n    }\n\n    async getInstructions(): Promise<void | string> {\n        if (this.grounding) {\n            return moondreamTargetingInstructions;\n        }\n    }\n}\n","import { Action } from '@/actions/types';\nimport { ActOptions, Agent } from '@/agent';\nimport { blueBright, bold, cyanBright, gray } from 'ansis';\nimport { BrowserAgent } from './browserAgent';\nimport { z } from 'zod';\n\nexport function narrateAgent(agent: Agent) {\n    agent.events.on('start', () => {\n        console.log(bold(blueBright(`▶ [start] agent started`)));\n    });\n\n    agent.events.on('stop', () => {\n        console.log(bold(blueBright(`■ [stop] agent stopped`)));\n    });\n\n    agent.events.on('thought', (thought: string) => {\n        console.log(gray`${thought}`);\n        //console.log(gray`⚙︎ ${thought}`);\n    });\n\n    agent.events.on('actStarted', (task: string, options: ActOptions) => {\n        console.log(bold(cyanBright(`◆ [act] ${task}`)));\n    });\n\n    agent.events.on('actionStarted', (action: Action) => {\n        const actionDefinition = agent.identifyAction(action);\n        console.log(bold`  ${actionDefinition.render(action)}`);\n    });\n}\n\nexport function narrateBrowserAgent(agent: BrowserAgent) {\n    narrateAgent(agent);\n\n    agent.browserAgentEvents.on('nav', (url: string) => {\n        console.log(bold(cyanBright`⮊ [nav] ${url}`));\n    });\n\n    agent.browserAgentEvents.on('extractStarted', (instructions: string, schema: z.ZodSchema) => {\n        console.log(bold(cyanBright`⛏ [extract] ${instructions}`));\n    });\n    agent.browserAgentEvents.on('extractDone', (instructions, data) => {\n        // console.log has a decent default formatter for arbitrary data e.g. objects\n        console.log(data);\n        //console.log(blueBright`${JSON.stringify(data, null, 2)}`);\n    });\n}","import { BrowserContext, Page } from \"playwright\";\nimport { Agent, AgentOptions } from \".\";\nimport { BrowserConnector, BrowserConnectorOptions } from \"@/connectors/browserConnector\";\nimport { buildDefaultBrowserAgentOptions } from \"@/ai/util\";\nimport { LLMClient } from \"@/ai/types\";\nimport { Schema, ZodSchema } from \"zod\";\nimport z from \"zod\";\nimport { renderMinimalAccessibilityTree } from \"@/web/util\";\nimport { narrateAgent, narrateBrowserAgent } from \"./narrator\";\nimport EventEmitter from \"eventemitter3\";\n\n// export interface StartAgentWithWebOptions {\n//     agentBaseOptions?: Partial<AgentOptions>;\n//     webConnectorOptions?: BrowserConnectorOptions;\n// }\n\nconst DEFAULT_BROWSER_AGENT_TEMP = 0.2;\n\n// Helper function to start a web agent\nexport async function startBrowserAgent(\n    options?: AgentOptions & BrowserConnectorOptions & { narrate?: boolean }//StartAgentWithWebOptions = {}\n): Promise<BrowserAgent> {\n    const { agentOptions, browserOptions } = buildDefaultBrowserAgentOptions({ agentOptions: options ?? {}, browserOptions: options ?? {} });\n\n    const agent = new BrowserAgent({\n        agentOptions: agentOptions,\n        browserOptions: browserOptions,\n    });\n\n    if (options?.narrate || process.env.MAGNITUDE_NARRATE) {\n        narrateBrowserAgent(agent);\n        //agent.events.on('actionStarted', (action: any) => { console.log(action) })\n    }\n\n    await agent.start();\n    return agent;\n}\n\n// Anything that could be extracted with a zod schema\ntype ExtractedOutput =\n    | string\n    | number\n    | boolean\n    | bigint\n    | Date\n    | null\n    | undefined\n    | { [key: string]: ExtractedOutput }\n    | ExtractedOutput[];\n\nexport interface BrowserAgentEvents {\n    'nav': (url: string) => void;\n    'extractStarted': (instructions: string, schema: ZodSchema) => void;\n    'extractDone': (instructions: string, data: ExtractedOutput) => void;\n}\n\nexport class BrowserAgent extends Agent {\n    public readonly browserAgentEvents: EventEmitter<BrowserAgentEvents> = new EventEmitter();\n\n    constructor({ agentOptions, browserOptions }: { agentOptions?: Partial<AgentOptions>, browserOptions?: BrowserConnectorOptions }) {\n        //console.log(\"agent options:\", agent);\n        super({\n            ...agentOptions,\n            connectors: [new BrowserConnector(browserOptions || {}), ...(agentOptions?.connectors ?? [])]\n        });\n    }\n\n    get page(): Page {\n        return this.require(BrowserConnector).getHarness().page;\n    }\n\n    get context(): BrowserContext {\n        return this.require(BrowserConnector).getHarness().context;\n    }\n\n    async nav(url: string): Promise<void> {\n        this.browserAgentEvents.emit('nav', url);\n        await this.require(BrowserConnector).getHarness().navigate(url);\n    }\n\n    async extract<T extends Schema>(instructions: string, schema: T): Promise<z.infer<T>> {\n        this.browserAgentEvents.emit('extractStarted', instructions, schema);\n        //const htmlContent = await this.page.content();\n        const accessibilityTree = await this.page.accessibility.snapshot({ interestingOnly: true });\n        const pageRepr = renderMinimalAccessibilityTree(accessibilityTree);\n        const screenshot = await this.require(BrowserConnector).getHarness().screenshot();\n        const data = await this.model.extract(instructions, schema, screenshot, pageRepr);\n\n        this.browserAgentEvents.emit('extractDone', instructions, data);\n\n        return data;\n    }\n\n    // async check(description: string): Promise<boolean> {\n    //     //const screenshot = await this.require(BrowserConnector).getHarness().screenshot();\n    //     return await this.macro.check(description, screenshot);\n    // }\n}\n","import logger from '@/logger';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as os from 'node:os';\nimport { execSync } from 'node:child_process';\nimport cuid2 from '@paralleldrive/cuid2';\nimport { PostHog } from 'posthog-node';\nimport { VERSION } from '@/version';\nimport { createHash } from 'crypto';\n\nexport const createId = cuid2.init({ length: 12 });\n\nexport const posthog = new PostHog(\n    'phc_BTdnTtG68V5QG6sqUNGqGfmjXk8g0ePBRu9FIr9upNu',\n    {\n        host: 'https://us.i.posthog.com'\n    }\n);\n\nexport function getMachineId(): string {\n    // Define storage location\n    const dir = path.join(os.homedir(), '.magnitude');\n    const filePath = path.join(dir, 'user.json');\n\n    try {\n        // Read existing ID if available\n        if (fs.existsSync(filePath)) {\n            const data = JSON.parse(fs.readFileSync(filePath, 'utf8'));\n            if (data.id) return data.id;\n        }\n\n        // Generate new ID if needed\n        //console.log(`generating new ID in ${filePath}`)\n        fs.mkdirSync(dir, { recursive: true });\n        const id = createId();\n        fs.writeFileSync(filePath, JSON.stringify({ id }));\n        return id;\n    } catch {\n        // Fallback to temporary ID if storage fails\n        return createId();\n    }\n}\n\nexport function getCodebaseId(): string | undefined {\n    try {\n        const command = 'git rev-list --max-parents=0 HEAD';\n        const firstCommitHash = execSync(command, {\n            encoding: 'utf8',\n            stdio: 'pipe',\n        }).trim();\n\n        //return firstCommitHash;\n        return createHash('sha256').update(firstCommitHash).digest('hex').substring(0, 12);\n\n    } catch (error) {\n        // ID representing no git repo detected\n        return undefined;//'000000000000';\n    }\n}\n\nexport async function sendTelemetry(eventName: string, properties: Record<string, any>) {\n    /**\n     * Send telemetry to Posthog with given event name and properites\n     * - automatically grouped by codebase derived from SHA256 hash of first git commit if available\n     * - telemetryVersion, packageVersion, and codebase all added to properties automatically\n     */\n    const userId = getMachineId();\n    const codebaseId = getCodebaseId();\n    \n    if (codebaseId) {\n        try {\n            posthog.groupIdentify({\n                groupType: 'codebase',\n                groupKey: codebaseId,\n                //properties: {}\n            });\n        } catch (error) {\n            logger.warn(`Failed to identify group: ${(error as Error).message}`);\n        }\n    }\n\n    try {\n        const props = {\n            source: \"magnitude-core\",\n            packageVersion: VERSION,\n            //telemetryVersion: \"0.1\",\n            codebase: codebaseId,\n            ...properties,\n        };\n\n        posthog.capture({\n            distinctId: userId,\n            event: eventName,\n            properties: props,\n            ...(codebaseId ? { groups: { codebase: codebaseId }} : {})\n        });\n        await posthog.shutdown();\n    } catch (error) {\n        logger.warn(`Failed to send telemetry (may have timed out): ${(error as Error).message}`);\n    }\n}\n\n\n\n","import { createRequire } from 'node:module';\nconst require = createRequire(import.meta.url);\n\nexport const VERSION = require('../package.json').version;","import { Agent } from \"@/agent\";\nimport { BrowserAgent } from \"@/agent/browserAgent\";\nimport { LLMClientIdentifier, ModelUsage } from \"@/ai/types\";\nimport { createId, sendTelemetry } from \"@/telemetry\";\n\n\nexport type UsageReport = {\n    llm: LLMClientIdentifier,\n    inputTokens: number,\n    outputTokens: number,\n    numCalls: number\n}[]\n\n// kinda jank\nfunction addUsageToReport(report: UsageReport, usage: ModelUsage) {\n    const modelHash = JSON.stringify(usage.llm);\n    let exists = false;\n    for (const entry of report) {\n        const compare = JSON.stringify(usage.llm);\n        if (modelHash === compare) {\n            // merge with existing usage\n            exists = true;\n            entry.inputTokens += usage.inputTokens;\n            entry.outputTokens += usage.outputTokens;\n            entry.numCalls += 1;\n        }\n    }\n    if (!exists) {\n        report.push({ ...usage, numCalls: 1 })\n    }\n}\n\nexport function telemetrifyAgent(agent: Agent) {\n    // Generate ID here that will be used to represent this agent in all telemetry events\n    const agentId = createId();\n\n    agent.events.on('start', async () => {\n        await sendTelemetry('agent-start', { agentId }); \n    });\n\n    agent.events.on('stop', async () => {\n        await sendTelemetry('agent-stop', { agentId }); \n    });\n\n    agent.events.on('actStarted', async () => {\n        const startedAt = Date.now();\n        const report: UsageReport = [];\n        let actionCount = 0;\n        const tokenListener = (usage: ModelUsage) => {\n            addUsageToReport(report, usage);\n        }\n        agent.events.on('tokensUsed', tokenListener);\n        const actionListener = () => {\n            actionCount++;\n        }\n        agent.events.on('actionDone', actionListener);\n\n        agent.events.once('actDone', async () => {\n            agent.events.removeListener('tokensUsed', tokenListener);\n            agent.events.removeListener('actionDone', actionListener);\n            const doneAt = Date.now();\n\n            await sendTelemetry('agent-act', {\n                agentId,\n                startedAt,\n                doneAt,\n                actionCount,\n                modelUsage: report,\n            });\n        });\n    });\n\n    if (agent instanceof BrowserAgent) {\n        // Report nav and extract telemetry if browser agent\n        agent.browserAgentEvents.on('nav', async () => {\n            await sendTelemetry('agent-nav', { agentId }); \n        });\n\n        agent.browserAgentEvents.on('extractStarted', async () => {\n            const startedAt = Date.now();\n            const report: UsageReport = [];\n            const tokenListener = (usage: ModelUsage) => {\n                addUsageToReport(report, usage);\n            }\n            agent.events.on('tokensUsed', tokenListener);\n\n            agent.browserAgentEvents.once('extractDone', async () => {\n                agent.events.removeListener('tokensUsed', tokenListener);\n                const doneAt = Date.now();\n\n                await sendTelemetry('agent-extract', {\n                    agentId,\n                    startedAt,\n                    doneAt,\n                    modelUsage: report,\n                });\n            });\n        });\n    }\n}","process.env.BAML_LOG='off';\nimport { setLogLevel } from '@/ai/baml_client/config';\n\nexport { Agent } from \"@/agent\";\nexport { createAction } from '@/actions';\nexport { BrowserAgent, startBrowserAgent } from '@/agent/browserAgent';\n//export { Magnus } from \"@/agent/magnus\";\n//export type { AgentOptions as TestCaseAgentOptions } from \"@/agent\";\nexport * from \"@/agent\";\nexport * from \"@/actions\";\nexport * from \"@/connectors\";\nexport * from \"@/web/browserProvider\";\nexport * from \"@/connectors/browserConnector\";\nexport * from \"@/agent/errors\";\nexport * from \"@/types\";\nexport * from \"@/ai/types\";\nexport * from \"@/web/types\";\nexport * from \"@/actions/types\";\nexport * from '@/common';\nexport * from \"@/telemetry\";\nexport { buildDefaultBrowserAgentOptions } from \"@/ai/util\";\nexport { logger } from './logger';\n//export { ModelUsage } from '@/ai/modelHarness';\n\nsetLogLevel('OFF');"],"mappings":"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AA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EACtB,gBAAgB;AAAA,EAChB,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAClB,gBAAgB;AAAA,EAChB,mBAAmB;AAAA,EACnB,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA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","names":["getShadowDOMInputAdapterScript","options","EventEmitter","z","toBamlError","env","toBamlError","env","env","toBamlError","z","z","BamlImage","BamlImage","BamlImage","z","action","z","sharp","sharp","node","x","y","showClickEffect","EventEmitter","getShadowDOMInputAdapterScript","z","z","b","EventEmitter","EventEmitter","require","EventEmitter","z","steps","options","task"]}