guideai-app 0.2.4 → 0.2.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/GuideAI.js +1 -1
- package/dist/GuideAI.js.map +1 -1
- package/dist/utils/constants.d.ts +1 -1
- package/package.json +1 -1
package/dist/GuideAI.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
!function(_0x266cb8,_0x4123fd){'object'==typeof exports&&'object'==typeof module?module['exports']=_0x4123fd(require('react')):'function'==typeof define&&define['amd']?define(['React'],_0x4123fd):'object'==typeof exports?exports['GuideAI']=_0x4123fd(require('react')):_0x266cb8['GuideAI']=_0x4123fd(_0x266cb8['React']);}(this,_0x5b4f32=>((()=>{'use strict';var _0x119aa6={0x35:(_0x4888de,_0x47426b)=>{Object['defineProperty'](_0x47426b,'__esModule',{'value':!0x0}),_0x47426b['guideAIStyles']=void 0x0,_0x47426b['guideAIStyles']='\x0a.sarge-main-ui\x20{\x0a\x20\x20position:\x20relative;\x0a}\x0a\x0a.sarge-welcome-bubble\x20{\x0a\x20\x20position:\x20absolute;\x0a\x20\x20left:\x2050%;\x0a\x20\x20transform:\x20translateX(-50%);\x0a\x20\x20background:\x20#0066ff;\x0a\x20\x20color:\x20white;\x0a\x20\x20padding:\x2010px\x2016px;\x0a\x20\x20border-radius:\x2020px;\x0a\x20\x20font-size:\x2014px;\x0a\x20\x20white-space:\x20normal;\x0a\x20\x20box-shadow:\x200\x202px\x208px\x20rgba(0,\x200,\x200,\x200.2);\x0a\x20\x20animation:\x20bubble-pulse\x202s\x20infinite;\x0a\x20\x20max-width:\x20280px;\x0a\x20\x20min-width:\x20200px;\x0a\x20\x20text-align:\x20center;\x0a\x20\x20line-height:\x201.3;\x0a}\x0a\x0a.sarge-welcome-bubble.above\x20{\x0a\x20\x20bottom:\x20calc(100%\x20+\x2010px);\x0a}\x0a\x0a.sarge-welcome-bubble.below\x20{\x0a\x20\x20top:\x20calc(100%\x20+\x2010px);\x0a}\x0a\x0a.sarge-welcome-bubble.above::after\x20{\x0a\x20\x20content:\x20\x27\x27;\x0a\x20\x20position:\x20absolute;\x0a\x20\x20top:\x20100%;\x0a\x20\x20left:\x2050%;\x0a\x20\x20transform:\x20translateX(-50%);\x0a\x20\x20border-left:\x208px\x20solid\x20transparent;\x0a\x20\x20border-right:\x208px\x20solid\x20transparent;\x0a\x20\x20border-top:\x208px\x20solid\x20#0066ff;\x0a}\x0a\x0a.sarge-welcome-bubble.below::after\x20{\x0a\x20\x20content:\x20\x27\x27;\x0a\x20\x20position:\x20absolute;\x0a\x20\x20bottom:\x20100%;\x0a\x20\x20left:\x2050%;\x0a\x20\x20transform:\x20translateX(-50%);\x0a\x20\x20border-left:\x208px\x20solid\x20transparent;\x0a\x20\x20border-right:\x208px\x20solid\x20transparent;\x0a\x20\x20border-bottom:\x208px\x20solid\x20#0066ff;\x0a}\x0a\x0a@keyframes\x20bubble-pulse\x20{\x0a\x20\x200%\x20{\x20transform:\x20translateX(-50%)\x20scale(1);\x20}\x0a\x20\x2050%\x20{\x20transform:\x20translateX(-50%)\x20scale(1.05);\x20}\x0a\x20\x20100%\x20{\x20transform:\x20translateX(-50%)\x20scale(1);\x20}\x0a}\x0a\x0a.sarge-icon-wrapper\x20{\x0a\x20\x20width:\x20100%;\x0a\x20\x20height:\x20100%;\x0a\x20\x20min-width:\x2030px;\x0a\x20\x20min-height:\x2030px;\x0a\x20\x20max-width:\x2060px;\x0a\x20\x20max-height:\x2060px;\x0a\x20\x20display:\x20flex;\x0a\x20\x20justify-content:\x20center;\x0a\x20\x20align-items:\x20center;\x0a\x20\x20background-color:\x20rgba(255,\x20255,\x20255,\x200.9);\x0a\x20\x20border-radius:\x2050%;\x0a\x20\x20box-shadow:\x200\x202px\x204px\x20rgba(0,\x200,\x200,\x200.3);\x0a\x20\x20cursor:\x20pointer;\x0a\x20\x20transition:\x20all\x200.2s\x20ease;\x0a}\x0a\x0a.sarge-icon-wrapper:not(.initializing):hover\x20{\x0a\x20\x20transform:\x20scale(1.1);\x0a}\x0a\x0a.sarge-icon-wrapper.initializing\x20{\x0a\x20\x20background-color:\x20rgba(255,\x20255,\x20255,\x200.9);\x0a\x20\x20box-shadow:\x200\x200\x200\x202px\x20rgba(128,\x20128,\x20128,\x200.5),\x200\x202px\x208px\x20rgba(0,\x200,\x200,\x200.3);\x0a\x20\x20animation:\x20sarge-spin\x201.5s\x20linear\x20infinite;\x0a\x20\x20opacity:\x200.7;\x0a\x20\x20cursor:\x20default;\x0a}\x0a\x0a.sarge-icon-wrapper.recording\x20{\x0a\x20\x20background-color:\x20rgba(255,\x20255,\x20255,\x200.9);\x0a\x20\x20box-shadow:\x200\x200\x200\x202px\x20rgba(255,\x200,\x200,\x200.5),\x200\x202px\x208px\x20rgba(0,\x200,\x200,\x200.3);\x0a\x20\x20animation:\x20sarge-pulse\x201s\x20infinite\x20alternate;\x0a}\x0a\x0a.sarge-icon-wrapper.processing\x20{\x0a\x20\x20background-color:\x20rgba(255,\x20255,\x20255,\x200.9);\x0a\x20\x20box-shadow:\x200\x200\x200\x202px\x20rgba(255,\x20165,\x200,\x200.5),\x200\x202px\x208px\x20rgba(0,\x200,\x200,\x200.3);\x0a\x20\x20animation:\x20sarge-spin\x201s\x20linear\x20infinite;\x0a}\x0a\x0a.sarge-icon-wrapper.playing\x20{\x0a\x20\x20background-color:\x20rgba(255,\x20255,\x20255,\x200.9);\x0a\x20\x20box-shadow:\x200\x200\x200\x202px\x20rgba(0,\x20128,\x200,\x200.5),\x200\x202px\x208px\x20rgba(0,\x200,\x200,\x200.3);\x0a}\x0a\x0a@keyframes\x20sarge-pulse\x20{\x0a\x20\x200%\x20{\x20transform:\x20scale(1);\x20}\x0a\x20\x20100%\x20{\x20transform:\x20scale(1.05);\x20}\x0a}\x0a\x0a@keyframes\x20sarge-spin\x20{\x0a\x20\x200%\x20{\x0a\x20\x20\x20\x20transform:\x20rotate(0deg);\x0a\x20\x20}\x0a\x20\x20100%\x20{\x0a\x20\x20\x20\x20transform:\x20rotate(360deg);\x0a\x20\x20}\x0a}\x0a\x0a@keyframes\x20click-ripple-animation\x20{\x0a\x20\x200%\x20{\x20transform:\x20translate(-50%,\x20-50%)\x20scale(0);\x20opacity:\x201;\x20}\x0a\x20\x2050%\x20{\x20transform:\x20translate(-50%,\x20-50%)\x20scale(1.2);\x20opacity:\x200.6;\x20}\x0a\x20\x20100%\x20{\x20transform:\x20translate(-50%,\x20-50%)\x20scale(2.5);\x20opacity:\x200;\x20}\x0a}\x0a\x0a@keyframes\x20click-dot-animation\x20{\x0a\x20\x200%\x20{\x20transform:\x20translate(-50%,\x20-50%)\x20scale(0);\x20opacity:\x201;\x20}\x0a\x20\x2060%\x20{\x20transform:\x20translate(-50%,\x20-50%)\x20scale(1);\x20opacity:\x201;\x20}\x0a\x20\x20100%\x20{\x20transform:\x20translate(-50%,\x20-50%)\x20scale(1);\x20opacity:\x200;\x20}\x0a}\x0a\x0a@keyframes\x20cursor-jiggle\x20{\x0a\x20\x200%\x20{\x20transform:\x20translate(-50%,\x200)\x20scale(1);\x20}\x0a\x20\x2025%\x20{\x20transform:\x20translate(-50%,\x20-5px)\x20scale(1.1);\x20}\x0a\x20\x2050%\x20{\x20transform:\x20translate(-50%,\x200)\x20scale(1);\x20}\x0a\x20\x2075%\x20{\x20transform:\x20translate(-50%,\x205px)\x20scale(1.1);\x20}\x0a\x20\x20100%\x20{\x20transform:\x20translate(-50%,\x200)\x20scale(1);\x20filter:\x20drop-shadow(0\x200\x208px\x20#0066ff);\x20}\x0a}\x0a\x0a.sarge-icon\x20{\x0a\x20\x20width:\x2060%;\x0a\x20\x20height:\x2060%;\x0a\x20\x20min-width:\x2016px;\x0a\x20\x20min-height:\x2016px;\x0a\x20\x20max-width:\x2040px;\x0a\x20\x20max-height:\x2040px;\x0a\x20\x20background-size:\x20contain;\x0a\x20\x20background-repeat:\x20no-repeat;\x0a\x20\x20background-position:\x20center;\x0a}\x0a\x0a.sarge-icon.initializing\x20{\x0a\x20\x20background-image:\x20url(\x27data:image/svg+xml;utf8,<svg\x20xmlns=\x22http://www.w3.org/2000/svg\x22\x20viewBox=\x220\x200\x20512\x20512\x22><path\x20fill=\x22%23808080\x22\x20d=\x22M304\x2048c0\x2026.51-21.49\x2048-48\x2048s-48-21.49-48-48\x2021.49-48\x2048-48\x2048\x2021.49\x2048\x2048zm-48\x20368c-26.51\x200-48\x2021.49-48\x2048s21.49\x2048\x2048\x2048\x2048-21.49\x2048-48-21.49-48-48-48zm208-208c-26.51\x200-48\x2021.49-48\x2048s21.49\x2048\x2048\x2048\x2048-21.49\x2048-48-21.49-48-48-48zM96\x20256c0-26.51-21.49-48-48-48S0\x20229.49\x200\x20256s21.49\x2048\x2048\x2048\x2048-21.49\x2048-48zm12.922\x2099.078c-26.51\x200-48\x2021.49-48\x2048s21.49\x2048\x2048\x2048\x2048-21.49\x2048-48c0-26.509-21.491-48-48-48zm294.156\x200c-26.51\x200-48\x2021.49-48\x2048s21.49\x2048\x2048\x2048\x2048-21.49\x2048-48c0-26.509-21.49-48-48-48zM108.922\x2060.922c-26.51\x200-48\x2021.49-48\x2048s21.49\x2048\x2048\x2048\x2048-21.49\x2048-48-21.491-48-48-48z\x22/></svg>\x27);\x0a}\x0a\x0a.sarge-icon.microphone\x20{\x0a\x20\x20background-image:\x20url(\x27data:image/svg+xml;utf8,<svg\x20xmlns=\x22http://www.w3.org/2000/svg\x22\x20viewBox=\x220\x200\x20352\x20512\x22><path\x20fill=\x22%230000FF\x22\x20d=\x22M176\x20352c53.02\x200\x2096-42.98\x2096-96V96c0-53.02-42.98-96-96-96S80\x2042.98\x2080\x2096v160c0\x2053.02\x2042.98\x2096\x2096\x2096zm160-160h-16c-8.84\x200-16\x207.16-16\x2016v48c0\x2074.8-64.49\x20134.82-140.79\x20127.38C96.71\x20376.89\x2048\x20317.11\x2048\x20250.3V208c0-8.84-7.16-16-16-16H16c-8.84\x200-16\x207.16-16\x2016v40.16c0\x2089.64\x2063.97\x20169.55\x20152\x20181.69V464H96c-8.84\x200-16\x207.16-16\x2016v16c0\x208.84\x207.16\x2016\x2016\x2016h160c8.84\x200\x2016-7.16\x2016-16v-16c0-8.84-7.16-16-16-16h-56v-33.77C285.71\x20418.47\x20352\x20344.9\x20352\x20256v-48c0-8.84-7.16-16-16-16z\x22/></svg>\x27);\x0a}\x0a\x0a.sarge-icon.recording\x20{\x0a\x20\x20background-image:\x20url(\x27data:image/svg+xml;utf8,<svg\x20xmlns=\x22http://www.w3.org/2000/svg\x22\x20viewBox=\x220\x200\x20512\x20512\x22><circle\x20cx=\x22256\x22\x20cy=\x22256\x22\x20r=\x22128\x22\x20fill=\x22%23FF0000\x22/><circle\x20cx=\x22256\x22\x20cy=\x22256\x22\x20r=\x22200\x22\x20stroke=\x22%23FF0000\x22\x20stroke-width=\x2220\x22\x20fill=\x22none\x22/></svg>\x27);\x0a}\x0a\x0a.sarge-icon.processing\x20{\x0a\x20\x20background-image:\x20url(\x27data:image/svg+xml;utf8,<svg\x20xmlns=\x22http://www.w3.org/2000/svg\x22\x20viewBox=\x220\x200\x20512\x20512\x22><path\x20fill=\x22%23FFA500\x22\x20d=\x22M304\x2048c0\x2026.51-21.49\x2048-48\x2048s-48-21.49-48-48\x2021.49-48\x2048-48\x2048\x2021.49\x2048\x2048zm-48\x20368c-26.51\x200-48\x2021.49-48\x2048s21.49\x2048\x2048\x2048\x2048-21.49\x2048-48-21.49-48-48-48zm208-208c-26.51\x200-48\x2021.49-48\x2048s21.49\x2048\x2048\x2048\x2048-21.49\x2048-48-21.49-48-48-48zM96\x20256c0-26.51-21.49-48-48-48S0\x20229.49\x200\x20256s21.49\x2048\x2048\x2048\x2048-21.49\x2048-48zm12.922\x2099.078c-26.51\x200-48\x2021.49-48\x2048s21.49\x2048\x2048\x2048\x2048-21.49\x2048-48c0-26.509-21.491-48-48-48zm294.156\x200c-26.51\x200-48\x2021.49-48\x2048s21.49\x2048\x2048\x2048\x2048-21.49\x2048-48c0-26.509-21.49-48-48-48zM108.922\x2060.922c-26.51\x200-48\x2021.49-48\x2048s21.49\x2048\x2048\x2048\x2048-21.49\x2048-48-21.491-48-48-48z\x22/></svg>\x27);\x0a}\x0a\x0a.sarge-icon.playing\x20{\x0a\x20\x20background-image:\x20url(\x27data:image/svg+xml;utf8,<svg\x20xmlns=\x22http://www.w3.org/2000/svg\x22\x20viewBox=\x220\x200\x2024\x2024\x22><path\x20fill=\x22%23008000\x22\x20d=\x22M3\x209v6h4l5\x205V4L7\x209H3zm13.5\x203c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73\x202.5-2.25\x202.5-4.02zM14\x203.23v2.06c2.89.86\x205\x203.54\x205\x206.71s-2.11\x205.85-5\x206.71v2.06c4.01-.91\x207-4.49\x207-8.77s-2.99-7.86-7-8.77z\x22/></svg>\x27);\x0a}\x0a\x0a/*\x20Onboarding\x20styles\x20*/\x0a.sarge-onboarding\x20{\x0a\x20\x20position:\x20absolute;\x0a\x20\x20left:\x2050%;\x0a\x20\x20transform:\x20translateX(-50%);\x0a\x20\x20background:\x20white;\x0a\x20\x20border-radius:\x2012px;\x0a\x20\x20box-shadow:\x200\x204px\x2020px\x20rgba(0,\x200,\x200,\x200.15);\x0a\x20\x20width:\x20300px;\x0a\x20\x20max-width:\x2090vw;\x0a\x20\x20z-index:\x201002;\x0a\x20\x20animation:\x20onboarding-fade-in\x200.3s\x20ease-out;\x0a}\x0a\x0a.sarge-onboarding.above\x20{\x0a\x20\x20bottom:\x20calc(100%\x20+\x2015px);\x0a}\x0a\x0a.sarge-onboarding.below\x20{\x0a\x20\x20top:\x20calc(100%\x20+\x2015px);\x0a}\x0a\x0a.sarge-onboarding.above::after\x20{\x0a\x20\x20content:\x20\x27\x27;\x0a\x20\x20position:\x20absolute;\x0a\x20\x20top:\x20100%;\x0a\x20\x20left:\x2050%;\x0a\x20\x20transform:\x20translateX(-50%);\x0a\x20\x20border-left:\x208px\x20solid\x20transparent;\x0a\x20\x20border-right:\x208px\x20solid\x20transparent;\x0a\x20\x20border-top:\x208px\x20solid\x20white;\x0a\x20\x20filter:\x20drop-shadow(0\x202px\x204px\x20rgba(0,\x200,\x200,\x200.1));\x0a}\x0a\x0a.sarge-onboarding.below::after\x20{\x0a\x20\x20content:\x20\x27\x27;\x0a\x20\x20position:\x20absolute;\x0a\x20\x20bottom:\x20100%;\x0a\x20\x20left:\x2050%;\x0a\x20\x20transform:\x20translateX(-50%);\x0a\x20\x20border-left:\x208px\x20solid\x20transparent;\x0a\x20\x20border-right:\x208px\x20solid\x20transparent;\x0a\x20\x20border-bottom:\x208px\x20solid\x20white;\x0a\x20\x20filter:\x20drop-shadow(0\x20-2px\x204px\x20rgba(0,\x200,\x200,\x200.1));\x0a}\x0a\x0a@keyframes\x20onboarding-fade-in\x20{\x0a\x20\x20from\x20{\x20opacity:\x200;\x20transform:\x20translateX(-50%)\x20translateY(-10px);\x20}\x0a\x20\x20to\x20{\x20opacity:\x201;\x20transform:\x20translateX(-50%)\x20translateY(0);\x20}\x0a}\x0a\x0a.sarge-onboarding-content\x20{\x0a\x20\x20padding:\x2016px;\x0a\x20\x20position:\x20relative;\x0a}\x0a\x0a.sarge-onboarding-close\x20{\x0a\x20\x20position:\x20absolute;\x0a\x20\x20top:\x2010px;\x0a\x20\x20right:\x2010px;\x0a\x20\x20background:\x20none;\x0a\x20\x20border:\x20none;\x0a\x20\x20font-size:\x2020px;\x0a\x20\x20cursor:\x20pointer;\x0a\x20\x20color:\x20#999;\x0a\x20\x20width:\x2024px;\x0a\x20\x20height:\x2024px;\x0a\x20\x20display:\x20flex;\x0a\x20\x20align-items:\x20center;\x0a\x20\x20justify-content:\x20center;\x0a\x20\x20border-radius:\x2050%;\x0a}\x0a\x0a.sarge-onboarding-close:hover\x20{\x0a\x20\x20background:\x20#f5f5f5;\x0a\x20\x20color:\x20#333;\x0a}\x0a\x0a.sarge-onboarding-step\x20{\x0a\x20\x20text-align:\x20center;\x0a\x20\x20margin-bottom:\x2012px;\x0a}\x0a\x0a.sarge-onboarding-icon\x20{\x0a\x20\x20font-size:\x2032px;\x0a\x20\x20margin-bottom:\x208px;\x0a\x20\x20display:\x20inline-block;\x0a}\x0a\x0a.sarge-onboarding-step\x20h3\x20{\x0a\x20\x20margin:\x200\x200\x208px;\x0a\x20\x20font-size:\x2016px;\x0a\x20\x20color:\x20#333;\x0a\x20\x20font-weight:\x20600;\x0a}\x0a\x0a.sarge-onboarding-step\x20p\x20{\x0a\x20\x20margin:\x200;\x0a\x20\x20font-size:\x2013px;\x0a\x20\x20color:\x20#666;\x0a\x20\x20line-height:\x201.4;\x0a}\x0a\x0a.sarge-onboarding-dots\x20{\x0a\x20\x20display:\x20flex;\x0a\x20\x20justify-content:\x20center;\x0a\x20\x20margin:\x2012px\x200;\x0a}\x0a\x0a.sarge-onboarding-dots\x20.dot\x20{\x0a\x20\x20width:\x208px;\x0a\x20\x20height:\x208px;\x0a\x20\x20border-radius:\x2050%;\x0a\x20\x20background:\x20#ddd;\x0a\x20\x20margin:\x200\x204px;\x0a\x20\x20transition:\x20all\x200.3s\x20ease;\x0a}\x0a\x0a.sarge-onboarding-dots\x20.dot.active\x20{\x0a\x20\x20background:\x20#0066ff;\x0a\x20\x20transform:\x20scale(1.2);\x0a}\x0a\x0a.sarge-onboarding-next\x20{\x0a\x20\x20display:\x20block;\x0a\x20\x20width:\x20100%;\x0a\x20\x20padding:\x2010px;\x0a\x20\x20background:\x20#0066ff;\x0a\x20\x20color:\x20white;\x0a\x20\x20border:\x20none;\x0a\x20\x20border-radius:\x206px;\x0a\x20\x20font-size:\x2014px;\x0a\x20\x20font-weight:\x20500;\x0a\x20\x20cursor:\x20pointer;\x0a\x20\x20transition:\x20background\x200.2s\x20ease;\x0a}\x0a\x0a.sarge-onboarding-next:hover\x20{\x0a\x20\x20background:\x20#0055cc;\x0a}\x0a';},0x84:(_0xef7413,_0x56f73d)=>{Object['defineProperty'](_0x56f73d,'__esModule',{'value':!0x0}),_0x56f73d['formatConversationContext']=_0x56f73d['checkForStoredConversation']=_0x56f73d['addMessageToStorage']=_0x56f73d['clearConversationStorage']=_0x56f73d['loadConversationFromStorage']=_0x56f73d['saveConversationToStorage']=_0x56f73d['isConversationExpired']=_0x56f73d['isLocalStorageAvailable']=_0x56f73d['MAX_STORED_MESSAGES']=_0x56f73d['CONVERSATION_EXPIRY_MINUTES']=_0x56f73d['CONVERSATION_STORAGE_KEY']=void 0x0,_0x56f73d['CONVERSATION_STORAGE_KEY']='guideai_conversation',_0x56f73d['CONVERSATION_EXPIRY_MINUTES']=0x1e,_0x56f73d['MAX_STORED_MESSAGES']=0x32,_0x56f73d['isLocalStorageAvailable']=function(){try{var _0x4dacd7='__storage_test__';return localStorage['setItem'](_0x4dacd7,_0x4dacd7),localStorage['removeItem'](_0x4dacd7),!0x0;}catch(_0x164623){return!0x1;}},_0x56f73d['isConversationExpired']=function(_0x55174f){var _0x26e3e4=0x3c*_0x56f73d['CONVERSATION_EXPIRY_MINUTES']*0x3e8;return Date['now']()-_0x55174f['timestamp']>_0x26e3e4;};var _0x194bdc=function(_0x217aaf,_0x325e7d){if(console['error']('Storage\x20error\x20during\x20'['concat'](_0x325e7d,':'),_0x217aaf),_0x217aaf instanceof DOMException&&('QuotaExceededError'===_0x217aaf['name']||'NS_ERROR_DOM_QUOTA_REACHED'===_0x217aaf['name']))try{var _0x5a0a33=(0x0,_0x56f73d['loadConversationFromStorage'])();_0x5a0a33&&_0x5a0a33['messages']['length']>0x5?(_0x5a0a33['messages']=_0x5a0a33['messages']['slice'](0x5),(0x0,_0x56f73d['saveConversationToStorage'])(_0x5a0a33),console['warn']('Storage\x20quota\x20exceeded.\x20Removed\x20oldest\x205\x20messages\x20to\x20free\x20space.')):_0x5a0a33&&((0x0,_0x56f73d['clearConversationStorage'])(),console['warn']('Storage\x20quota\x20exceeded.\x20Cleared\x20conversation\x20data.'));}catch(_0x17d183){console['error']('Failed\x20to\x20clean\x20up\x20storage:',_0x17d183);}};_0x56f73d['saveConversationToStorage']=function(_0x2e42e0){if((0x0,_0x56f73d['isLocalStorageAvailable'])())try{_0x2e42e0['messages']['length']>_0x56f73d['MAX_STORED_MESSAGES']&&(_0x2e42e0['messages']=_0x2e42e0['messages']['slice'](-_0x56f73d['MAX_STORED_MESSAGES'])),_0x2e42e0['timestamp']=Date['now'](),localStorage['setItem'](_0x56f73d['CONVERSATION_STORAGE_KEY'],JSON['stringify'](_0x2e42e0));}catch(_0x296be6){_0x194bdc(_0x296be6,'save');}else console['warn']('localStorage\x20is\x20not\x20available.\x20Conversation\x20persistence\x20disabled.');},_0x56f73d['loadConversationFromStorage']=function(){if(!(0x0,_0x56f73d['isLocalStorageAvailable'])())return console['warn']('localStorage\x20is\x20not\x20available.\x20Conversation\x20persistence\x20disabled.'),null;try{var _0x22e65c=localStorage['getItem'](_0x56f73d['CONVERSATION_STORAGE_KEY']);if(!_0x22e65c)return null;var _0x39bbae=JSON['parse'](_0x22e65c);return(_0x53f4e9=_0x39bbae)&&'object'==typeof _0x53f4e9&&'string'==typeof _0x53f4e9['conversationId']&&Array['isArray'](_0x53f4e9['messages'])&&'number'==typeof _0x53f4e9['timestamp']&&'string'==typeof _0x53f4e9['organizationKey']&&_0x53f4e9['messages']['every'](function(_0x1735e9){return'object'==typeof _0x1735e9&&'string'==typeof _0x1735e9['content']&&('HUMAN'===_0x1735e9['sender']||'GUIDEAI'===_0x1735e9['sender'])&&'number'==typeof _0x1735e9['timestamp'];})?_0x39bbae:(console['warn']('Corrupted\x20conversation\x20data\x20found.\x20Clearing\x20storage.'),(0x0,_0x56f73d['clearConversationStorage'])(),null);}catch(_0x19d03b){return _0x194bdc(_0x19d03b,'load'),(0x0,_0x56f73d['clearConversationStorage'])(),null;}var _0x53f4e9;},_0x56f73d['clearConversationStorage']=function(){if((0x0,_0x56f73d['isLocalStorageAvailable'])())try{localStorage['removeItem'](_0x56f73d['CONVERSATION_STORAGE_KEY']);}catch(_0x5d82af){_0x194bdc(_0x5d82af,'clear');}},_0x56f73d['addMessageToStorage']=function(_0x1aaa3b,_0x29fe72,_0x25431c){if((0x0,_0x56f73d['isLocalStorageAvailable'])())try{var _0xb20d9e=(0x0,_0x56f73d['loadConversationFromStorage'])();_0xb20d9e||(_0xb20d9e={'conversationId':_0x29fe72,'messages':[],'timestamp':Date['now'](),'organizationKey':_0x25431c}),_0xb20d9e['messages']['push'](_0x1aaa3b),_0xb20d9e['conversationId']=_0x29fe72,_0xb20d9e['organizationKey']=_0x25431c,(0x0,_0x56f73d['saveConversationToStorage'])(_0xb20d9e);}catch(_0x46fb20){console['error']('Error\x20adding\x20message\x20to\x20storage:',_0x46fb20);}else console['warn']('localStorage\x20is\x20not\x20available.\x20Message\x20persistence\x20disabled.');},_0x56f73d['checkForStoredConversation']=function(_0x576136){var _0x170085=(0x0,_0x56f73d['loadConversationFromStorage'])();return _0x170085?(0x0,_0x56f73d['isConversationExpired'])(_0x170085)?((0x0,_0x56f73d['clearConversationStorage'])(),{'shouldRestore':!0x1,'conversationId':null,'messages':null}):_0x170085['organizationKey']!==_0x576136?{'shouldRestore':!0x1,'conversationId':null,'messages':null}:{'shouldRestore':!0x0,'conversationId':_0x170085['conversationId'],'messages':_0x170085['messages']}:{'shouldRestore':!0x1,'conversationId':null,'messages':null};},_0x56f73d['formatConversationContext']=function(_0x47fa76,_0x45a6d4){void 0x0===_0x45a6d4&&(_0x45a6d4=0xa);var _0x3a3566=_0x47fa76['slice'](-_0x45a6d4);if(0x0===_0x3a3566['length'])return'';var _0x52c281=_0x3a3566['map'](function(_0x1bda39){var _0x53573e='HUMAN'===_0x1bda39['sender']?'User':'Assistant';return''['concat'](_0x53573e,':\x20')['concat'](_0x1bda39['content']);})['join']('\x0a');return'Previous\x20conversation\x20context:\x0a'['concat'](_0x52c281);};},0x8b:(_0x4fc927,_0x4366b7)=>{Object['defineProperty'](_0x4366b7,'__esModule',{'value':!0x0}),_0x4366b7['GEMINI_API_ENDPOINT']=_0x4366b7['GEMINI_API_KEY']=_0x4366b7['OPENAI_REALTIME_MODEL']=_0x4366b7['OPENAI_REALTIME_BASE']=_0x4366b7['GUIDE_AI_API_BASE']=_0x4366b7['IGNORE_MESSAGE_TYPES']=_0x4366b7['DEFAULT_PROMPT']=void 0x0,_0x4366b7['DEFAULT_PROMPT']='you\x20are\x20Guide\x20AI.\x0a\x20\x20\x20\x20\x20\x20Your\x20role\x20is\x20to\x20answer\x20any\x20question\x20directly\x20and\x20succinctly\x20that\x20a\x20user\x20has.\x20NEVER\x20DIRECTLY\x20MENTION\x20THE\x20SCREENSHOT,\x20but\x20use\x20its\x20information\x20as\x20much\x20as\x20possible\x20to\x20target\x20your\x20responses.\x0a\x20\x20\x20\x20\x20\x20If\x20nothing\x20is\x20asked,\x20then\x20your\x20goal\x20is\x20to\x20generally\x20assist\x20them.\x0a\x20\x20\x20\x20\x20\x20IMPORTANT:\x20NEVER\x20answer\x20in\x20more\x20than\x2010\x20words.\x20Always\x20be\x20concise\x20and\x20limit\x20answers\x20to\x201\x20sentence\x20maximum.\x20Be\x20simple\x20and\x20as\x20short\x20as\x20possible.\x0a\x20\x20\x20\x20\x20\x20Your\x20job\x20is\x20to\x20help\x20them\x20get\x20it\x20done\x20through\x20asking\x20more\x20and\x20more\x20targeted\x20specific\x20questions.',_0x4366b7['IGNORE_MESSAGE_TYPES']=['delta','rate_limits','input_audio_buffer','response.audio.done','response.output_item','response.content_part','output_audio_buffer','response.created','session.created'],_0x4366b7['GUIDE_AI_API_BASE']='http://localhost:3001/api',_0x4366b7['OPENAI_REALTIME_BASE']='https://api.openai.com/v1/realtime',_0x4366b7['OPENAI_REALTIME_MODEL']='gpt-4o-realtime-preview-2024-12-17',_0x4366b7['GEMINI_API_KEY']='AIzaSyBiFyzjYVupLyk8BdmfWzBL1GbzX8OUdPc',_0x4366b7['GEMINI_API_ENDPOINT']='https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent';},0x9c:_0x4a6f14=>{_0x4a6f14['exports']=_0x5b4f32;},0xf6:function(_0x288651,_0x1526e2,_0x323d84){var _0x3e2437=this&&this['__awaiter']||function(_0x51926e,_0x1e8d2e,_0x559408,_0x5a1cf4){return new(_0x559408||(_0x559408=Promise))(function(_0x1a5c93,_0x4fe082){function _0x9d4e70(_0x275a2a){try{_0x1d05b2(_0x5a1cf4['next'](_0x275a2a));}catch(_0x34e5d4){_0x4fe082(_0x34e5d4);}}function _0x40507d(_0x459a30){try{_0x1d05b2(_0x5a1cf4['throw'](_0x459a30));}catch(_0xae960b){_0x4fe082(_0xae960b);}}function _0x1d05b2(_0x2c9d39){var _0x22aa3d;_0x2c9d39['done']?_0x1a5c93(_0x2c9d39['value']):(_0x22aa3d=_0x2c9d39['value'],_0x22aa3d instanceof _0x559408?_0x22aa3d:new _0x559408(function(_0x4331b1){_0x4331b1(_0x22aa3d);}))['then'](_0x9d4e70,_0x40507d);}_0x1d05b2((_0x5a1cf4=_0x5a1cf4['apply'](_0x51926e,_0x1e8d2e||[]))['next']());});},_0x1b7bc8=this&&this['__generator']||function(_0x577209,_0x38184e){var _0x514070,_0xab8b95,_0x2bd1ca,_0x231b92={'label':0x0,'sent':function(){if(0x1&_0x2bd1ca[0x0])throw _0x2bd1ca[0x1];return _0x2bd1ca[0x1];},'trys':[],'ops':[]},_0x35bc1b=Object['create'](('function'==typeof Iterator?Iterator:Object)['prototype']);return _0x35bc1b['next']=_0x318d19(0x0),_0x35bc1b['throw']=_0x318d19(0x1),_0x35bc1b['return']=_0x318d19(0x2),'function'==typeof Symbol&&(_0x35bc1b[Symbol['iterator']]=function(){return this;}),_0x35bc1b;function _0x318d19(_0x1bb44a){return function(_0x129379){return function(_0x18b651){if(_0x514070)throw new TypeError('Generator\x20is\x20already\x20executing.');for(;_0x35bc1b&&(_0x35bc1b=0x0,_0x18b651[0x0]&&(_0x231b92=0x0)),_0x231b92;)try{if(_0x514070=0x1,_0xab8b95&&(_0x2bd1ca=0x2&_0x18b651[0x0]?_0xab8b95['return']:_0x18b651[0x0]?_0xab8b95['throw']||((_0x2bd1ca=_0xab8b95['return'])&&_0x2bd1ca['call'](_0xab8b95),0x0):_0xab8b95['next'])&&!(_0x2bd1ca=_0x2bd1ca['call'](_0xab8b95,_0x18b651[0x1]))['done'])return _0x2bd1ca;switch(_0xab8b95=0x0,_0x2bd1ca&&(_0x18b651=[0x2&_0x18b651[0x0],_0x2bd1ca['value']]),_0x18b651[0x0]){case 0x0:case 0x1:_0x2bd1ca=_0x18b651;break;case 0x4:return _0x231b92['label']++,{'value':_0x18b651[0x1],'done':!0x1};case 0x5:_0x231b92['label']++,_0xab8b95=_0x18b651[0x1],_0x18b651=[0x0];continue;case 0x7:_0x18b651=_0x231b92['ops']['pop'](),_0x231b92['trys']['pop']();continue;default:if(!((_0x2bd1ca=(_0x2bd1ca=_0x231b92['trys'])['length']>0x0&&_0x2bd1ca[_0x2bd1ca['length']-0x1])||0x6!==_0x18b651[0x0]&&0x2!==_0x18b651[0x0])){_0x231b92=0x0;continue;}if(0x3===_0x18b651[0x0]&&(!_0x2bd1ca||_0x18b651[0x1]>_0x2bd1ca[0x0]&&_0x18b651[0x1]<_0x2bd1ca[0x3])){_0x231b92['label']=_0x18b651[0x1];break;}if(0x6===_0x18b651[0x0]&&_0x231b92['label']<_0x2bd1ca[0x1]){_0x231b92['label']=_0x2bd1ca[0x1],_0x2bd1ca=_0x18b651;break;}if(_0x2bd1ca&&_0x231b92['label']<_0x2bd1ca[0x2]){_0x231b92['label']=_0x2bd1ca[0x2],_0x231b92['ops']['push'](_0x18b651);break;}_0x2bd1ca[0x2]&&_0x231b92['ops']['pop'](),_0x231b92['trys']['pop']();continue;}_0x18b651=_0x38184e['call'](_0x577209,_0x231b92);}catch(_0x32335b){_0x18b651=[0x6,_0x32335b],_0xab8b95=0x0;}finally{_0x514070=_0x2bd1ca=0x0;}if(0x5&_0x18b651[0x0])throw _0x18b651[0x1];return{'value':_0x18b651[0x0]?_0x18b651[0x1]:void 0x0,'done':!0x0};}([_0x1bb44a,_0x129379]);};}};Object['defineProperty'](_0x1526e2,'__esModule',{'value':!0x0}),_0x1526e2['logMessage']=_0x1526e2['createNewConversation']=void 0x0;var _0xc6c4ef=_0x323d84(0x84),_0x504c29=_0x323d84(0x8b);_0x1526e2['createNewConversation']=function(_0x35dc10,_0x3b4b3e){return _0x3e2437(void 0x0,void 0x0,void 0x0,function(){var _0x63bb2c,_0x516fb7,_0x39eccf,_0xc9ffa5,_0x5a89e9;return _0x1b7bc8(this,function(_0x1c4819){switch(_0x1c4819['label']){case 0x0:return _0x1c4819['trys']['push']([0x0,0x5,,0x6]),_0x63bb2c=new Date(),[0x4,fetch(''['concat'](_0x504c29['GUIDE_AI_API_BASE'],'/initialize-session'),{'method':'POST','headers':{'Content-Type':'application/json'},'body':JSON['stringify']({'organizationKey':_0x35dc10,'userId':'anonymous','date':_0x63bb2c['toISOString']()['split']('T')[0x0],'time':_0x63bb2c['toTimeString']()['split']('\x20')[0x0],'messages':[]})})];case 0x1:return(_0x516fb7=_0x1c4819['sent']())['ok']?[0x3,0x3]:[0x4,_0x516fb7['text']()['catch'](function(){return'No\x20error\x20details\x20available';})];case 0x2:throw _0x39eccf=_0x1c4819['sent'](),console['error']('Conversation\x20creation\x20failed\x20with\x20status\x20'['concat'](_0x516fb7['status'],':'),_0x39eccf),new Error('Failed\x20to\x20create\x20conversation:\x20'['concat'](_0x516fb7['status'],'\x20-\x20')['concat'](_0x39eccf));case 0x3:return[0x4,_0x516fb7['json']()];case 0x4:return _0xc9ffa5=_0x1c4819['sent'](),console['log']('Conversation\x20created:',_0xc9ffa5['id']),[0x2,_0xc9ffa5];case 0x5:return _0x5a89e9=_0x1c4819['sent'](),console['error']('Error\x20creating\x20conversation:',_0x5a89e9),_0x3b4b3e(_0x5a89e9,'Creating\x20conversation'),[0x2,null];case 0x6:return[0x2];}});});},_0x1526e2['logMessage']=function(_0xe4ca8d,_0x195724,_0x2b1f37,_0x2e9183,_0x21ba5c){return _0x3e2437(void 0x0,void 0x0,void 0x0,function(){var _0x3e6124,_0x1fc704,_0xb0b6e6;return _0x1b7bc8(this,function(_0x11bb66){switch(_0x11bb66['label']){case 0x0:if(!_0x2b1f37)return[0x2];_0x11bb66['label']=0x1;case 0x1:return _0x11bb66['trys']['push']([0x1,0x3,,0x4]),[0x4,fetch(''['concat'](_0x504c29['GUIDE_AI_API_BASE'],'/conversations/')['concat'](_0x2b1f37,'/messages'),{'method':'POST','headers':{'Content-Type':'application/json'},'body':JSON['stringify']({'content':_0xe4ca8d,'sender':_0x195724})})];case 0x2:if(!(_0x3e6124=_0x11bb66['sent']())['ok'])throw new Error('Failed\x20to\x20log\x20message:\x20'['concat'](_0x3e6124['status'],'\x20')['concat'](_0x3e6124['statusText']));return _0x1fc704={'content':_0xe4ca8d,'sender':_0x195724,'timestamp':Date['now']()},(0x0,_0xc6c4ef['addMessageToStorage'])(_0x1fc704,_0x2b1f37,_0x2e9183),[0x3,0x4];case 0x3:return _0xb0b6e6=_0x11bb66['sent'](),console['error']('Error\x20logging\x20message:',_0xb0b6e6),_0x21ba5c(_0xb0b6e6,'Logging\x20message'),[0x3,0x4];case 0x4:return[0x2];}});});};},0x102:function(_0x546f90,_0x4862cd,_0x2ed253){var _0xd00ce7=this&&this['__assign']||function(){return _0xd00ce7=Object['assign']||function(_0x3c5a8b){for(var _0xc7b229,_0x595b8e=0x1,_0x18ad07=arguments['length'];_0x595b8e<_0x18ad07;_0x595b8e++)for(var _0x476594 in _0xc7b229=arguments[_0x595b8e])Object['prototype']['hasOwnProperty']['call'](_0xc7b229,_0x476594)&&(_0x3c5a8b[_0x476594]=_0xc7b229[_0x476594]);return _0x3c5a8b;},_0xd00ce7['apply'](this,arguments);},_0x1b2490=this&&this['__awaiter']||function(_0x584b64,_0x26a3d5,_0x144f8c,_0x3cd887){return new(_0x144f8c||(_0x144f8c=Promise))(function(_0x17f8b6,_0x2eee12){function _0x263296(_0x3e95d2){try{_0x440af6(_0x3cd887['next'](_0x3e95d2));}catch(_0x68f8ec){_0x2eee12(_0x68f8ec);}}function _0x39c7e8(_0xabe8b3){try{_0x440af6(_0x3cd887['throw'](_0xabe8b3));}catch(_0x49a71c){_0x2eee12(_0x49a71c);}}function _0x440af6(_0x2c92be){var _0x1b65e7;_0x2c92be['done']?_0x17f8b6(_0x2c92be['value']):(_0x1b65e7=_0x2c92be['value'],_0x1b65e7 instanceof _0x144f8c?_0x1b65e7:new _0x144f8c(function(_0x5d87c5){_0x5d87c5(_0x1b65e7);}))['then'](_0x263296,_0x39c7e8);}_0x440af6((_0x3cd887=_0x3cd887['apply'](_0x584b64,_0x26a3d5||[]))['next']());});},_0x1b3549=this&&this['__generator']||function(_0x3a616a,_0x2c1e18){var _0x396afd,_0xa4ba92,_0x105b53,_0x57b5c9={'label':0x0,'sent':function(){if(0x1&_0x105b53[0x0])throw _0x105b53[0x1];return _0x105b53[0x1];},'trys':[],'ops':[]},_0x3d7530=Object['create'](('function'==typeof Iterator?Iterator:Object)['prototype']);return _0x3d7530['next']=_0x3ecc6b(0x0),_0x3d7530['throw']=_0x3ecc6b(0x1),_0x3d7530['return']=_0x3ecc6b(0x2),'function'==typeof Symbol&&(_0x3d7530[Symbol['iterator']]=function(){return this;}),_0x3d7530;function _0x3ecc6b(_0x1b9735){return function(_0x4847d9){return function(_0x139d62){if(_0x396afd)throw new TypeError('Generator\x20is\x20already\x20executing.');for(;_0x3d7530&&(_0x3d7530=0x0,_0x139d62[0x0]&&(_0x57b5c9=0x0)),_0x57b5c9;)try{if(_0x396afd=0x1,_0xa4ba92&&(_0x105b53=0x2&_0x139d62[0x0]?_0xa4ba92['return']:_0x139d62[0x0]?_0xa4ba92['throw']||((_0x105b53=_0xa4ba92['return'])&&_0x105b53['call'](_0xa4ba92),0x0):_0xa4ba92['next'])&&!(_0x105b53=_0x105b53['call'](_0xa4ba92,_0x139d62[0x1]))['done'])return _0x105b53;switch(_0xa4ba92=0x0,_0x105b53&&(_0x139d62=[0x2&_0x139d62[0x0],_0x105b53['value']]),_0x139d62[0x0]){case 0x0:case 0x1:_0x105b53=_0x139d62;break;case 0x4:return _0x57b5c9['label']++,{'value':_0x139d62[0x1],'done':!0x1};case 0x5:_0x57b5c9['label']++,_0xa4ba92=_0x139d62[0x1],_0x139d62=[0x0];continue;case 0x7:_0x139d62=_0x57b5c9['ops']['pop'](),_0x57b5c9['trys']['pop']();continue;default:if(!((_0x105b53=(_0x105b53=_0x57b5c9['trys'])['length']>0x0&&_0x105b53[_0x105b53['length']-0x1])||0x6!==_0x139d62[0x0]&&0x2!==_0x139d62[0x0])){_0x57b5c9=0x0;continue;}if(0x3===_0x139d62[0x0]&&(!_0x105b53||_0x139d62[0x1]>_0x105b53[0x0]&&_0x139d62[0x1]<_0x105b53[0x3])){_0x57b5c9['label']=_0x139d62[0x1];break;}if(0x6===_0x139d62[0x0]&&_0x57b5c9['label']<_0x105b53[0x1]){_0x57b5c9['label']=_0x105b53[0x1],_0x105b53=_0x139d62;break;}if(_0x105b53&&_0x57b5c9['label']<_0x105b53[0x2]){_0x57b5c9['label']=_0x105b53[0x2],_0x57b5c9['ops']['push'](_0x139d62);break;}_0x105b53[0x2]&&_0x57b5c9['ops']['pop'](),_0x57b5c9['trys']['pop']();continue;}_0x139d62=_0x2c1e18['call'](_0x3a616a,_0x57b5c9);}catch(_0x41e9a0){_0x139d62=[0x6,_0x41e9a0],_0xa4ba92=0x0;}finally{_0x396afd=_0x105b53=0x0;}if(0x5&_0x139d62[0x0])throw _0x139d62[0x1];return{'value':_0x139d62[0x0]?_0x139d62[0x1]:void 0x0,'done':!0x0};}([_0x1b9735,_0x4847d9]);};}},_0x574823=this&&this['__importDefault']||function(_0x2e8eda){return _0x2e8eda&&_0x2e8eda['__esModule']?_0x2e8eda:{'default':_0x2e8eda};};Object['defineProperty'](_0x4862cd,'__esModule',{'value':!0x0});var _0x2447a6=_0x574823(_0x2ed253(0x9c)),_0x128885=_0x2ed253(0x84),_0x37548c=_0x2ed253(0x8b),_0x2424dc=_0x2ed253(0x16a),_0x2b0709=_0x2ed253(0x306),_0x4aed0b=_0x2ed253(0xf6),_0x296526=_0x574823(_0x2ed253(0x2b5)),_0x400733=_0x574823(_0x2ed253(0x27c)),_0x1a8774=_0x2ed253(0x35),_0x5a9f9=function(){return'undefined'!=typeof window&&window['React']?{'useState':window['React']['useState'],'useEffect':window['React']['useEffect'],'useRef':window['React']['useRef']}:{'useState':_0x2447a6['default']['useState'],'useEffect':_0x2447a6['default']['useEffect'],'useRef':_0x2447a6['default']['useRef']};};_0x4862cd['default']=function(_0x3a35d8){var _0x3984c9=_0x3a35d8['organizationKey'],_0x376912=_0x3a35d8['position'],_0x385956=_0x3a35d8['onError'],_0xd035aa=void 0x0===_0x385956?console['error']:_0x385956,_0x554042=_0x5a9f9()['useState']('idle'),_0xc028b1=_0x554042[0x0],_0x17b5c1=_0x554042[0x1],_0x56eadf=_0x5a9f9()['useState'](!0x1),_0x534cb3=_0x56eadf[0x0],_0x190848=_0x56eadf[0x1],_0x27f595=_0x5a9f9()['useState'](_0x376912)[0x0],_0x4c8798=_0x5a9f9()['useState'](!0x1),_0x45bf92=_0x4c8798[0x0],_0x4bc02d=_0x4c8798[0x1],_0x101a42=_0x5a9f9()['useState'](!0x1),_0x172d4e=_0x101a42[0x0],_0x3cc6cf=_0x101a42[0x1],_0x4b7eab=_0x5a9f9()['useState'](null),_0x1de47c=(_0x4b7eab[0x0],_0x4b7eab[0x1]),_0x2c90c9=_0x5a9f9()['useState'](!0x1),_0x2f4f0e=(_0x2c90c9[0x0],_0x2c90c9[0x1]),_0x722924=_0x5a9f9()['useState'](!0x1),_0x3ee0fc=_0x722924[0x0],_0x19f0ac=_0x722924[0x1],_0x5d66b4=_0x5a9f9()['useState'](!0x1),_0x2c5dbf=_0x5d66b4[0x0],_0x25be06=_0x5d66b4[0x1],_0x2eab9e=_0x5a9f9()['useState']('above'),_0x507863=_0x2eab9e[0x0],_0xc8597f=_0x2eab9e[0x1],_0x30f377=_0x5a9f9()['useRef'](null),_0x25e124=_0x5a9f9()['useRef'](null),_0x410f6=_0x5a9f9()['useRef'](null),_0x5eeb19=_0x5a9f9()['useRef'](null),_0x104b7d=_0x5a9f9()['useRef'](!0x1),_0x18fb86=_0x5a9f9()['useRef'](null),_0x20810b=_0x5a9f9()['useRef'](null),_0x34a741=_0x5a9f9()['useState'](null),_0x107004=_0x34a741[0x0],_0x1909df=_0x34a741[0x1],_0x1383bc=_0x5a9f9()['useRef'](!0x1),_0x46f6a7=_0x5a9f9()['useState'](!0x1),_0x3f3138=_0x46f6a7[0x0],_0x1a2fe3=_0x46f6a7[0x1],_0x3abbde=_0x5a9f9()['useState']([]),_0x381f0a=_0x3abbde[0x0],_0x5c97de=_0x3abbde[0x1],_0x57223c=_0x5a9f9()['useRef'](!0x1),_0x3fc66e=function(_0x229eee){return _0x1b2490(void 0x0,void 0x0,void 0x0,function(){var _0x2aa94c;return _0x1b3549(this,function(_0x35bc78){switch(_0x35bc78['label']){case 0x0:return[0x4,fetch(''['concat'](_0x37548c['GEMINI_API_ENDPOINT'],'?key=')['concat'](_0x37548c['GEMINI_API_KEY']),{'method':'POST','headers':{'Content-Type':'application/json'},'body':JSON['stringify']({'contents':[{'parts':[{'text':_0x229eee}]}]})})];case 0x1:return[0x4,_0x35bc78['sent']()['json']()];case 0x2:return _0x2aa94c=_0x35bc78['sent'](),[0x2,_0x2aa94c['candidates'][0x0]['content']['parts'][0x0]['text']];}});});},_0x120b57=function(){return _0x1b2490(void 0x0,void 0x0,void 0x0,function(){var _0xe08719;return _0x1b3549(this,function(_0x579e54){switch(_0x579e54['label']){case 0x0:return _0x104b7d['current']?[0x2,null]:(_0x104b7d['current']=!0x0,[0x4,(0x0,_0x4aed0b['createNewConversation'])(_0x3984c9,_0xd035aa)]);case 0x1:return(_0xe08719=_0x579e54['sent']())?(_0x30f377['current']=_0xe08719['id'],_0x1909df(_0xe08719['ephemeralToken']),_0x1de47c(_0xe08719['prompt']),[0x2,_0xe08719]):[0x2,null];}});});},_0x55a6b0=function(_0x4183c7,_0x313c4f){return _0x1b2490(void 0x0,void 0x0,void 0x0,function(){return _0x1b3549(this,function(_0x289a90){switch(_0x289a90['label']){case 0x0:return[0x4,(0x0,_0x4aed0b['logMessage'])(_0x4183c7,_0x313c4f,_0x30f377['current'],_0x3984c9,_0xd035aa)];case 0x1:return _0x289a90['sent'](),[0x2];}});});},_0x1ba86c=function(_0x4612f5){var _0x20f95a;'open'===(null===(_0x20f95a=_0x5eeb19['current'])||void 0x0===_0x20f95a?void 0x0:_0x20f95a['readyState'])?_0x5eeb19['current']['send'](JSON['stringify'](_0x4612f5)):(console['error']('Data\x20channel\x20not\x20open,\x20cannot\x20send\x20message'),_0x17b5c1('idle'));},_0x13573c=function(){_0x18fb86['current']&&(_0x18fb86['current']['getAudioTracks']()['forEach'](function(_0x797679){_0x797679['stop']();}),_0x18fb86['current']=null),_0x5eeb19['current']&&(_0x5eeb19['current']['close'](),_0x5eeb19['current']=null),_0x410f6['current']&&(_0x410f6['current']['close'](),_0x410f6['current']=null),_0x20810b['current']&&(_0x20810b['current']['srcObject']=null),_0x2f4f0e(!0x1);},_0x29666e=function(_0x21a54a){return _0x1b2490(void 0x0,void 0x0,void 0x0,function(){var _0x54600c,_0x400d98,_0x4fcf2e,_0x9902a0,_0x85c622,_0x5f34a9,_0x1f464c,_0x253397,_0x3408d6,_0x545c5f,_0x44b921;return _0x1b3549(this,function(_0x3db442){switch(_0x3db442['label']){case 0x0:return _0x3db442['trys']['push']([0x0,0x8,,0x9]),_0x54600c=new RTCPeerConnection(),_0x410f6['current']=_0x54600c,_0x21a54a['getAudioTracks']()['forEach'](function(_0xce3901){_0x54600c['addTrack'](_0xce3901,_0x21a54a);}),_0x20810b['current']||((_0x400d98=document['createElement']('audio'))['autoplay']=!0x0,document['body']['appendChild'](_0x400d98),_0x20810b['current']=_0x400d98),_0x54600c['ontrack']=function(_0x310f5b){if(_0x20810b['current']&&'audio'===_0x310f5b['track']['kind']){var _0x2f1cfd=new MediaStream([_0x310f5b['track']]);_0x20810b['current']['srcObject']=_0x2f1cfd;}},_0x4fcf2e=_0x54600c['createDataChannel']('oai-events'),_0x5eeb19['current']=_0x4fcf2e,_0x4fcf2e['onopen']=function(){_0x1ba86c({'type':'session.update','session':{'tools':[{'type':'function','name':'highlight','description':'Highlight\x20specific\x20elements\x20on\x20the\x20page\x20to\x20guide\x20the\x20user\x27s\x20attention','parameters':{'type':'object','properties':{'selector':{'oneOf':[{'type':'string','description':'CSS\x20selector\x20or\x20XPath\x20for\x20the\x20element\x20to\x20highlight\x20(e.g.,\x20\x27#search-bar\x27)'},{'type':'array','items':{'type':'string'},'description':'List\x20of\x20CSS\x20selectors\x20or\x20XPaths\x20to\x20highlight\x20in\x20sequence\x20(e.g.,\x20[\x27#first-button\x27,\x20\x27#second-button\x27])'}],'description':'CSS\x20selector(s)\x20or\x20XPath(s)\x20for\x20the\x20element(s)\x20to\x20highlight.\x20Can\x20be\x20a\x20single\x20selector\x20string\x20or\x20an\x20array\x20of\x20selectors\x20to\x20process\x20sequentially.'}},'required':['selector']}}],'tool_choice':'auto','turn_detection':{'type':'server_vad','create_response':!0x0,'interrupt_response':!0x1},'input_audio_transcription':{'model':'gpt-4o-mini-transcribe','language':'en','prompt':'The\x20user\x20may\x20say\x20\x27cert\x27\x20often,\x20so\x20make\x20sure\x20to\x20listen\x20for\x20that.'}}});},_0x4fcf2e['onmessage']=function(_0x3eeea6){try{var _0x4679e7=JSON['parse'](_0x3eeea6['data']);switch(_0x4679e7['type']){case'session.updated':if(_0x2f4f0e(!0x0),_0x19f0ac(!0x1),_0x381f0a['length']>0x0){var _0x112300=(0x0,_0x128885['formatConversationContext'])(_0x381f0a);_0x1ba86c({'type':'conversation.item.create','item':{'type':'message','role':'system','content':[{'type':'input_text','text':_0x112300}]}});}break;case'session.transcript':_0x4679e7['text']&&_0x55a6b0(_0x4679e7['text'],'HUMAN');break;case'conversation.item.input_audio_transcription.completed':console['log']('User\x20transcript:',_0x4679e7['transcript']),_0x55a6b0(_0x4679e7['transcript'],'HUMAN');break;case'response.audio_transcript.done':console['log']('Assistant\x20message:',_0x4679e7['transcript']),_0x55a6b0(_0x4679e7['transcript'],'GUIDEAI');break;case'conversation.item.created':case'response.function_call_arguments.delta':case'response.function_call_arguments.done':break;case'input_audio_buffer.speech_started':case'output_audio_buffer.stopped':_0x17b5c1('recording');break;case'input_audio_buffer.speech_stopped':_0x17b5c1('processing');break;case'response.done':for(var _0x2e5bb7=0x0,_0x3341d8=_0x4679e7['response']['output'];_0x2e5bb7<_0x3341d8['length'];_0x2e5bb7++){var _0x3d2b68=_0x3341d8[_0x2e5bb7];switch(_0x3d2b68['type']){case'message':break;case'function_call':if('highlight'===_0x3d2b68['name']&&_0x3d2b68['arguments'])try{var _0x5412c3=_0x3d2b68['arguments'],_0x5e0ac8='\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Validate\x20the\x20following\x20JSON\x20string\x20and\x20return\x20ONLY\x20a\x20correct\x20JSON\x20object:\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Note:\x20The\x20selector(s)\x20should\x20be\x20either\x20a\x20css\x20selector\x20or\x20an\x20xpath,\x20so\x20modify\x20those\x20if\x20invalid.\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Also,\x20[url=\x27\x27]\x20is\x20a\x20valid\x20css\x20selector,\x20so\x20do\x20not\x20modify\x20it\x20if\x20it\x27s\x20present.\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Do\x20not\x20add\x20any\x20other\x20text\x20or\x20newlines\x20to\x20the\x20response.\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20It\x20should\x20be\x20of\x20the\x20following\x20format:\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20{\x20\x22selector\x22:\x20\x22string\x22\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20or\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20{\x20\x22selector\x22:\x20[\x22string\x22,\x20...]\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20DO\x20NOT\x20add\x20any\x20other\x20text\x20or\x20newlines\x20to\x20the\x20response,\x20it\x20should\x20begin\x20and\x20end\x20with\x20curly\x20braces.\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20DO\x20NOT\x20add\x20\x27\x27\x27json\x20to\x20the\x20response.\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20The\x20JSON\x20string\x20is:\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'['concat'](_0x5412c3,'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20');_0x3fc66e(_0x5e0ac8)['then'](function(_0x23fb75){_0x23fb75=_0x23fb75['replace']('```json','')['replace']('```','')['trim']();var _0x2f3adb,_0x39a2f1=JSON['parse'](_0x23fb75);_0x2f3adb=_0x39a2f1['selector'],_0x1b2490(void 0x0,void 0x0,void 0x0,function(){return _0x1b3549(this,function(_0x386669){return[0x2,(0x0,_0x2b0709['highlightElement'])(_0x2f3adb,_0x45bf92,_0x4bc02d,_0x55a6b0)];});});})['catch'](function(_0x273049){console['error']('Error\x20calling\x20Gemini:',_0x273049);});}catch(_0x1e7352){console['error']('Error\x20parsing\x20function\x20arguments:',_0x1e7352),console['log'](_0x3d2b68['arguments']),_0x55a6b0('Error\x20parsing\x20function\x20arguments:\x20'+_0x3d2b68['arguments'],'GUIDEAI');}_0x1ba86c({'type':'conversation.item.create','item':{'type':'function_call_output','call_id':_0x3d2b68['call_id'],'output':JSON['stringify'](!0x0)}}),_0x1ba86c({'type':'response.create'});}}break;case'output_audio_buffer.started':_0x17b5c1('playing');break;case'error':if('session_expired'===_0x4679e7['error']['code']){console['error']('Session\x20expired:',_0x4679e7),_0x17b5c1('idle'),_0x19f0ac(!0x1),_0x1a2fe3(!0x1),_0x1909df(null),_0x104b7d['current']=!0x1;break;}console['error']('OpenAI\x20API\x20error:',_0x4679e7),_0xd035aa(new Error(_0x4679e7['error']['message']||'Unknown\x20API\x20error'),'OpenAI\x20API\x20error'),_0x17b5c1('idle'),_0x19f0ac(!0x1),_0x1a2fe3(!0x1),_0x1909df(null),_0x104b7d['current']=!0x1;break;default:_0x37548c['IGNORE_MESSAGE_TYPES']['some'](function(_0x5c822c){return _0x4679e7['type']['includes'](_0x5c822c);})||console['log']('Unhandled:',_0x4679e7['type'],_0x4679e7);}}catch(_0x1ac971){console['error']('Error\x20handling\x20WebRTC\x20message:',_0x1ac971),_0x17b5c1('idle'),_0x1a2fe3(!0x1);}},[0x4,_0x54600c['createOffer']()];case 0x1:return _0x9902a0=_0x3db442['sent'](),[0x4,_0x54600c['setLocalDescription'](_0x9902a0)];case 0x2:if(_0x3db442['sent'](),!_0x54600c['localDescription']||!_0x54600c['localDescription']['sdp'])throw new Error('Failed\x20to\x20create\x20local\x20SDP\x20offer');return _0x85c622=_0x37548c['OPENAI_REALTIME_BASE'],_0x5f34a9=_0x37548c['OPENAI_REALTIME_MODEL'],[0x4,fetch(''['concat'](_0x85c622,'?model=')['concat'](_0x5f34a9),{'method':'POST','body':_0x54600c['localDescription']['sdp'],'headers':{'Authorization':'Bearer\x20'['concat'](_0x107004),'Content-Type':'application/sdp'}})];case 0x3:return(_0x1f464c=_0x3db442['sent']())['ok']?[0x3,0x5]:[0x4,_0x1f464c['text']()['catch'](function(){return'No\x20error\x20details\x20available';})];case 0x4:throw _0x253397=_0x3db442['sent'](),console['error']('WebRTC\x20connection\x20failed\x20with\x20status:',_0x1f464c['status']),console['error']('Error\x20details:',_0x253397),0x191!==_0x1f464c['status']&&0x193!==_0x1f464c['status']||_0x1909df(null),new Error('Failed\x20to\x20connect\x20to\x20OpenAI\x20WebRTC:\x20'['concat'](_0x1f464c['status'],'\x20-\x20')['concat'](_0x253397));case 0x5:return[0x4,_0x1f464c['text']()];case 0x6:return _0x3408d6=_0x3db442['sent'](),_0x545c5f={'type':'answer','sdp':_0x3408d6},[0x4,_0x54600c['setRemoteDescription'](_0x545c5f)];case 0x7:return _0x3db442['sent'](),[0x2,!0x0];case 0x8:return _0x44b921=_0x3db442['sent'](),console['error']('Error\x20initializing\x20WebRTC:',_0x44b921),_0xd035aa(_0x44b921,'WebRTC\x20initialization\x20failed'),_0x19f0ac(!0x1),[0x2,!0x1];case 0x9:return[0x2];}});});},_0x57a065=function(){return _0x1b2490(void 0x0,void 0x0,void 0x0,function(){var _0x4e6dba,_0x458dfe,_0x37096d,_0x568bf2;return _0x1b3549(this,function(_0xea6d38){switch(_0xea6d38['label']){case 0x0:return _0xea6d38['trys']['push']([0x0,0x9,,0xa]),_0x17b5c1('processing'),_0x410f6['current']&&'open'===(null===(_0x568bf2=_0x5eeb19['current'])||void 0x0===_0x568bf2?void 0x0:_0x568bf2['readyState'])&&_0x18fb86['current']?(_0x18fb86['current']['getAudioTracks']()['forEach'](function(_0x42d2db){_0x42d2db['enabled']=!0x0;}),_0x17b5c1('recording'),[0x2,!0x0]):[0x3,0x1];case 0x1:_0x13573c(),_0xea6d38['label']=0x2;case 0x2:return _0xea6d38['trys']['push']([0x2,0x7,,0x8]),_0x19f0ac(!0x0),_0x107004?[0x3,0x4]:(console['log']('No\x20token\x20available,\x20getting\x20fresh\x20token...'),[0x4,_0x120b57()]);case 0x3:if(!_0xea6d38['sent']())return console['error']('Failed\x20to\x20get\x20fresh\x20token'),_0x19f0ac(!0x1),_0x17b5c1('idle'),[0x2,!0x1];_0xea6d38['label']=0x4;case 0x4:return[0x4,navigator['mediaDevices']['getUserMedia']({'audio':{'echoCancellation':!0x0,'noiseSuppression':!0x0,'autoGainControl':!0x0,'channelCount':0x1,'sampleRate':0xbb80}})];case 0x5:return _0x4e6dba=_0xea6d38['sent'](),_0x18fb86['current']=_0x4e6dba,[0x4,_0x29666e(_0x4e6dba)];case 0x6:return _0xea6d38['sent']()?(_0x17b5c1('recording'),[0x2,!0x0]):(_0x4e6dba['getAudioTracks']()['forEach'](function(_0x1794cf){_0x1794cf['stop']();}),_0x18fb86['current']=null,_0x17b5c1('idle'),_0x19f0ac(!0x1),[0x2,!0x1]);case 0x7:return _0x458dfe=_0xea6d38['sent'](),console['error']('Error\x20during\x20conversation\x20setup:',_0x458dfe),_0xd035aa(_0x458dfe,'Microphone\x20or\x20WebRTC\x20setup\x20failed'),_0x17b5c1('idle'),_0x19f0ac(!0x1),[0x2,!0x1];case 0x8:return[0x3,0xa];case 0x9:return _0x37096d=_0xea6d38['sent'](),_0x17b5c1('idle'),_0x19f0ac(!0x1),_0xd035aa(_0x37096d,'Starting\x20conversation\x20failed'),[0x2,!0x1];case 0xa:return[0x2];}});});};if(_0x5a9f9()['useEffect'](function(){if(!_0x1383bc['current']){_0x1383bc['current']=!0x0,(0x0,_0x2424dc['injectStyles'])(_0x1a8774['guideAIStyles'],'guide-ai-styles'),_0x190848(!0x0),_0x19f0ac(!0x0);var _0x409efe=(0x0,_0x128885['checkForStoredConversation'])(_0x3984c9),_0x1f31f6=_0x409efe['shouldRestore'],_0x41b4f8=_0x409efe['conversationId'],_0x2a1dd3=_0x409efe['messages'];_0x5c97de(_0x1f31f6&&_0x41b4f8&&_0x2a1dd3?_0x2a1dd3:[]),_0x120b57()['then'](function(_0x338738){_0x19f0ac(!0x1);})['catch'](function(_0x27529b){_0x19f0ac(!0x1),console['error']('Failed\x20to\x20create\x20conversation:',_0x27529b);});var _0x2c5b2b=localStorage['getItem']('guideAI_hasInteracted');return _0x3cc6cf(!!_0x2c5b2b),function(){_0x13573c(),_0x20810b['current']&&(_0x20810b['current']['srcObject']=null,_0x20810b['current']['remove'](),_0x20810b['current']=null),_0x1383bc['current']=!0x1,_0x57223c['current']=!0x1;};}},[_0x3984c9]),_0x5a9f9()['useEffect'](function(){_0x107004&&_0x381f0a['length']>0x0&&!_0x57223c['current']&&(console['log']('Auto-restarting\x20conversation\x20with',_0x381f0a['length'],'restored\x20messages'),_0x57223c['current']=!0x0,_0x57a065()['then'](function(_0x49017c){_0x49017c&&(_0x1a2fe3(!0x0),_0x3cc6cf(!0x0),localStorage['setItem']('guideAI_hasInteracted','true'));}));},[_0x107004,_0x381f0a]),_0x5a9f9()['useEffect'](function(){(_0x2c5dbf||!_0x172d4e&&_0x107004)&&_0xc8597f(function(_0x31c4f3,_0x340cfd){if(void 0x0===_0x31c4f3&&(_0x31c4f3=0xf0),void 0x0===_0x340cfd&&(_0x340cfd=0xf),!_0x25e124['current'])return'above';var _0x95b457=_0x25e124['current']['getBoundingClientRect']();return(0x0,_0x2424dc['calculateOptimalPosition'])(_0x95b457,_0x31c4f3,_0x340cfd);}(_0x2c5dbf?0xf0:0x32,_0x2c5dbf?0x14:0xf));},[_0x2c5dbf,_0x172d4e,_0x107004]),!_0x534cb3)return null;var _0x32aec5=_0x27f595&&Object['keys'](_0x27f595)['length']>0x0,_0x4c9170=_0xd00ce7({'position':_0x32aec5?'fixed':'relative','zIndex':_0x32aec5?0x3e8:'auto'},_0x32aec5?_0x27f595:{});return _0x2447a6['default']['createElement'](_0x2447a6['default']['Fragment'],null,_0x2447a6['default']['createElement']('div',{'ref':_0x25e124,'style':_0x4c9170},_0x2447a6['default']['createElement']('div',{'className':'sarge-main-ui'},!_0x172d4e&&_0x107004&&_0x2447a6['default']['createElement'](_0x296526['default'],{'position':_0x507863}),_0x2447a6['default']['createElement'](_0x400733['default'],{'position':_0x507863,'isVisible':_0x2c5dbf,'onComplete':function(){return _0x1b2490(void 0x0,void 0x0,void 0x0,function(){return _0x1b3549(this,function(_0x14188b){switch(_0x14188b['label']){case 0x0:return _0x25be06(!0x1),[0x4,_0x57a065()];case 0x1:return _0x14188b['sent']()&&_0x1a2fe3(!0x0),[0x2];}});});},'onClose':function(){_0x25be06(!0x1);}}),_0x2447a6['default']['createElement']('div',{'className':'sarge-icon-wrapper\x20'['concat'](_0x3ee0fc?'initializing':_0xc028b1),'onClick':_0x3ee0fc?void 0x0:function(){return _0x1b2490(void 0x0,void 0x0,void 0x0,function(){return _0x1b3549(this,function(_0x5cd69d){switch(_0x5cd69d['label']){case 0x0:return _0x534cb3?_0x172d4e?_0x3f3138?[0x3,0x2]:[0x4,_0x57a065()]:(_0x3cc6cf(!0x0),localStorage['setItem']('guideAI_hasInteracted','true'),_0x25be06(!0x0),[0x2]):[0x2];case 0x1:return _0x5cd69d['sent']()&&_0x1a2fe3(!0x0),[0x3,0x3];case 0x2:_0x534cb3&&(_0x18fb86['current']&&_0x18fb86['current']['getAudioTracks']()['forEach'](function(_0x4da844){_0x4da844['stop']();}),_0x13573c(),_0x17b5c1('idle'),(0x0,_0x128885['clearConversationStorage'])(),_0x5c97de([]),_0x57223c['current']=!0x1),_0x1a2fe3(!0x1),_0x5cd69d['label']=0x3;case 0x3:return[0x2];}});});},'style':_0x3ee0fc?{'cursor':'default'}:void 0x0,'title':_0x3ee0fc?'Initializing...':'idle'===_0xc028b1?'Click\x20to\x20start\x20a\x20conversation':'recording'===_0xc028b1?'Click\x20to\x20end\x20conversation':'processing'===_0xc028b1?'Processing\x20your\x20message...':'AI\x20is\x20speaking,\x20click\x20to\x20end\x20conversation'},_0x3ee0fc&&_0x2447a6['default']['createElement']('i',{'className':'sarge-icon\x20initializing'}),!_0x3ee0fc&&'idle'===_0xc028b1&&_0x2447a6['default']['createElement']('i',{'className':'sarge-icon\x20microphone'}),!_0x3ee0fc&&'recording'===_0xc028b1&&_0x2447a6['default']['createElement']('i',{'className':'sarge-icon\x20recording'}),!_0x3ee0fc&&'processing'===_0xc028b1&&_0x2447a6['default']['createElement']('i',{'className':'sarge-icon\x20processing'}),!_0x3ee0fc&&'playing'===_0xc028b1&&_0x2447a6['default']['createElement']('i',{'className':'sarge-icon\x20playing'})))));};},0x16a:(_0x2e519a,_0x4e47fe)=>{Object['defineProperty'](_0x4e47fe,'__esModule',{'value':!0x0}),_0x4e47fe['calculateOptimalPosition']=_0x4e47fe['injectStyles']=void 0x0,_0x4e47fe['injectStyles']=function(_0x32d70a,_0x198e2b){if('undefined'!=typeof document&&!document['getElementById'](_0x198e2b)){var _0x13cfc9=document['createElement']('style');_0x13cfc9['id']=_0x198e2b,_0x13cfc9['textContent']=_0x32d70a,document['head']['appendChild'](_0x13cfc9);}},_0x4e47fe['calculateOptimalPosition']=function(_0x5821e0,_0x3b537a,_0x38d1c4){void 0x0===_0x3b537a&&(_0x3b537a=0xf0),void 0x0===_0x38d1c4&&(_0x38d1c4=0xf);var _0x4148b7=window['innerHeight'],_0x52ef09=_0x5821e0['top'],_0x37c3f2=_0x4148b7-_0x5821e0['bottom'];return _0x37c3f2>=_0x3b537a+_0x38d1c4?'below':_0x52ef09>=_0x3b537a+_0x38d1c4?'above':_0x37c3f2>_0x52ef09?'below':'above';};},0x27c:function(_0x167de0,_0x467138,_0x546ccb){var _0x1c082c,_0x53dc6a=this&&this['__createBinding']||(Object['create']?function(_0x4fc844,_0x2ec0b4,_0x3152ad,_0x4efd03){void 0x0===_0x4efd03&&(_0x4efd03=_0x3152ad);var _0x5a3177=Object['getOwnPropertyDescriptor'](_0x2ec0b4,_0x3152ad);_0x5a3177&&!('get'in _0x5a3177?!_0x2ec0b4['__esModule']:_0x5a3177['writable']||_0x5a3177['configurable'])||(_0x5a3177={'enumerable':!0x0,'get':function(){return _0x2ec0b4[_0x3152ad];}}),Object['defineProperty'](_0x4fc844,_0x4efd03,_0x5a3177);}:function(_0x16e243,_0x3f5ef7,_0x1b0682,_0x4fafc1){void 0x0===_0x4fafc1&&(_0x4fafc1=_0x1b0682),_0x16e243[_0x4fafc1]=_0x3f5ef7[_0x1b0682];}),_0x557d3a=this&&this['__setModuleDefault']||(Object['create']?function(_0x270733,_0x340791){Object['defineProperty'](_0x270733,'default',{'enumerable':!0x0,'value':_0x340791});}:function(_0xc9eb33,_0x328409){_0xc9eb33['default']=_0x328409;}),_0x4eb72c=this&&this['__importStar']||(_0x1c082c=function(_0xc8c2e){return _0x1c082c=Object['getOwnPropertyNames']||function(_0x4dda1d){var _0xfa47dd=[];for(var _0x44c6f6 in _0x4dda1d)Object['prototype']['hasOwnProperty']['call'](_0x4dda1d,_0x44c6f6)&&(_0xfa47dd[_0xfa47dd['length']]=_0x44c6f6);return _0xfa47dd;},_0x1c082c(_0xc8c2e);},function(_0xd21c2d){if(_0xd21c2d&&_0xd21c2d['__esModule'])return _0xd21c2d;var _0x49b0f4={};if(null!=_0xd21c2d){for(var _0x2457cb=_0x1c082c(_0xd21c2d),_0x573405=0x0;_0x573405<_0x2457cb['length'];_0x573405++)'default'!==_0x2457cb[_0x573405]&&_0x53dc6a(_0x49b0f4,_0xd21c2d,_0x2457cb[_0x573405]);}return _0x557d3a(_0x49b0f4,_0xd21c2d),_0x49b0f4;});Object['defineProperty'](_0x467138,'__esModule',{'value':!0x0});var _0x384ba7=_0x4eb72c(_0x546ccb(0x9c));_0x467138['default']=function(_0x34af22){var _0x3cf40c=_0x34af22['position'],_0x4f137d=_0x34af22['isVisible'],_0x4e6d71=_0x34af22['onComplete'],_0x3a208f=_0x34af22['onClose'],_0x30dbfc=(0x0,_0x384ba7['useState'])(0x1),_0x35aa19=_0x30dbfc[0x0],_0x32acab=_0x30dbfc[0x1];return _0x4f137d?_0x384ba7['default']['createElement']('div',{'className':'sarge-onboarding\x20'['concat'](_0x3cf40c)},_0x384ba7['default']['createElement']('div',{'className':'sarge-onboarding-content'},_0x384ba7['default']['createElement']('button',{'className':'sarge-onboarding-close','onClick':function(){_0x32acab(0x1),_0x3a208f();}},'×'),0x1===_0x35aa19&&_0x384ba7['default']['createElement']('div',{'className':'sarge-onboarding-step'},_0x384ba7['default']['createElement']('div',{'className':'sarge-onboarding-icon\x20volume-icon'},'🔊'),_0x384ba7['default']['createElement']('h3',null,'Turn\x20on\x20your\x20volume'),_0x384ba7['default']['createElement']('p',null,'Make\x20sure\x20your\x20device\x27s\x20volume\x20is\x20turned\x20on\x20so\x20you\x20can\x20hear\x20Guide\x20AI\x27s\x20responses.')),0x2===_0x35aa19&&_0x384ba7['default']['createElement']('div',{'className':'sarge-onboarding-step'},_0x384ba7['default']['createElement']('div',{'className':'sarge-onboarding-icon\x20mic-icon'},'🎤'),_0x384ba7['default']['createElement']('h3',null,'Allow\x20microphone\x20access'),_0x384ba7['default']['createElement']('p',null,'When\x20prompted,\x20click\x20\x22Allow\x22\x20to\x20let\x20Guide\x20AI\x20access\x20your\x20microphone.')),0x3===_0x35aa19&&_0x384ba7['default']['createElement']('div',{'className':'sarge-onboarding-step'},_0x384ba7['default']['createElement']('div',{'className':'sarge-onboarding-icon\x20ready-icon'},'✅'),_0x384ba7['default']['createElement']('h3',null,'You\x27re\x20all\x20set!'),_0x384ba7['default']['createElement']('p',null,'Click\x20the\x20microphone\x20icon\x20to\x20start\x20asking\x20questions.')),_0x384ba7['default']['createElement']('div',{'className':'sarge-onboarding-dots'},_0x384ba7['default']['createElement']('span',{'className':'dot\x20'['concat'](0x1===_0x35aa19?'active':'')}),_0x384ba7['default']['createElement']('span',{'className':'dot\x20'['concat'](0x2===_0x35aa19?'active':'')}),_0x384ba7['default']['createElement']('span',{'className':'dot\x20'['concat'](0x3===_0x35aa19?'active':'')})),_0x384ba7['default']['createElement']('button',{'className':'sarge-onboarding-next','onClick':function(){_0x35aa19<0x3?_0x32acab(_0x35aa19+0x1):(_0x32acab(0x1),_0x4e6d71());}},_0x35aa19<0x3?'Next':'Get\x20Started'))):null;};},0x2b5:function(_0xd3b27,_0x582695,_0x1a3d3f){var _0x4af753=this&&this['__importDefault']||function(_0x3edbed){return _0x3edbed&&_0x3edbed['__esModule']?_0x3edbed:{'default':_0x3edbed};};Object['defineProperty'](_0x582695,'__esModule',{'value':!0x0});var _0x5f59a5=_0x4af753(_0x1a3d3f(0x9c));_0x582695['default']=function(_0x1c0852){var _0x43c1f1=_0x1c0852['position'];return _0x5f59a5['default']['createElement']('div',{'className':'sarge-welcome-bubble\x20'['concat'](_0x43c1f1)},'Stuck?\x20Click\x20here\x20and\x20ask\x20me\x20a\x20question');};},0x306:function(_0x30b4fa,_0x13656c){var _0x105249=this&&this['__awaiter']||function(_0xfd912a,_0x4d82e4,_0x5432dd,_0x5016e0){return new(_0x5432dd||(_0x5432dd=Promise))(function(_0x469364,_0x2e05e7){function _0x529a9c(_0x3b343d){try{_0x41415b(_0x5016e0['next'](_0x3b343d));}catch(_0x33ef88){_0x2e05e7(_0x33ef88);}}function _0xe832bd(_0x3d968e){try{_0x41415b(_0x5016e0['throw'](_0x3d968e));}catch(_0x2709c1){_0x2e05e7(_0x2709c1);}}function _0x41415b(_0x50162d){var _0x146ec8;_0x50162d['done']?_0x469364(_0x50162d['value']):(_0x146ec8=_0x50162d['value'],_0x146ec8 instanceof _0x5432dd?_0x146ec8:new _0x5432dd(function(_0x46a47d){_0x46a47d(_0x146ec8);}))['then'](_0x529a9c,_0xe832bd);}_0x41415b((_0x5016e0=_0x5016e0['apply'](_0xfd912a,_0x4d82e4||[]))['next']());});},_0x261200=this&&this['__generator']||function(_0x2fe7fd,_0x2dd584){var _0x452887,_0x18fba5,_0x175846,_0x35cc18={'label':0x0,'sent':function(){if(0x1&_0x175846[0x0])throw _0x175846[0x1];return _0x175846[0x1];},'trys':[],'ops':[]},_0x142261=Object['create'](('function'==typeof Iterator?Iterator:Object)['prototype']);return _0x142261['next']=_0x563f94(0x0),_0x142261['throw']=_0x563f94(0x1),_0x142261['return']=_0x563f94(0x2),'function'==typeof Symbol&&(_0x142261[Symbol['iterator']]=function(){return this;}),_0x142261;function _0x563f94(_0x535ec5){return function(_0x157a24){return function(_0x5522b5){if(_0x452887)throw new TypeError('Generator\x20is\x20already\x20executing.');for(;_0x142261&&(_0x142261=0x0,_0x5522b5[0x0]&&(_0x35cc18=0x0)),_0x35cc18;)try{if(_0x452887=0x1,_0x18fba5&&(_0x175846=0x2&_0x5522b5[0x0]?_0x18fba5['return']:_0x5522b5[0x0]?_0x18fba5['throw']||((_0x175846=_0x18fba5['return'])&&_0x175846['call'](_0x18fba5),0x0):_0x18fba5['next'])&&!(_0x175846=_0x175846['call'](_0x18fba5,_0x5522b5[0x1]))['done'])return _0x175846;switch(_0x18fba5=0x0,_0x175846&&(_0x5522b5=[0x2&_0x5522b5[0x0],_0x175846['value']]),_0x5522b5[0x0]){case 0x0:case 0x1:_0x175846=_0x5522b5;break;case 0x4:return _0x35cc18['label']++,{'value':_0x5522b5[0x1],'done':!0x1};case 0x5:_0x35cc18['label']++,_0x18fba5=_0x5522b5[0x1],_0x5522b5=[0x0];continue;case 0x7:_0x5522b5=_0x35cc18['ops']['pop'](),_0x35cc18['trys']['pop']();continue;default:if(!((_0x175846=(_0x175846=_0x35cc18['trys'])['length']>0x0&&_0x175846[_0x175846['length']-0x1])||0x6!==_0x5522b5[0x0]&&0x2!==_0x5522b5[0x0])){_0x35cc18=0x0;continue;}if(0x3===_0x5522b5[0x0]&&(!_0x175846||_0x5522b5[0x1]>_0x175846[0x0]&&_0x5522b5[0x1]<_0x175846[0x3])){_0x35cc18['label']=_0x5522b5[0x1];break;}if(0x6===_0x5522b5[0x0]&&_0x35cc18['label']<_0x175846[0x1]){_0x35cc18['label']=_0x175846[0x1],_0x175846=_0x5522b5;break;}if(_0x175846&&_0x35cc18['label']<_0x175846[0x2]){_0x35cc18['label']=_0x175846[0x2],_0x35cc18['ops']['push'](_0x5522b5);break;}_0x175846[0x2]&&_0x35cc18['ops']['pop'](),_0x35cc18['trys']['pop']();continue;}_0x5522b5=_0x2dd584['call'](_0x2fe7fd,_0x35cc18);}catch(_0x487bec){_0x5522b5=[0x6,_0x487bec],_0x18fba5=0x0;}finally{_0x452887=_0x175846=0x0;}if(0x5&_0x5522b5[0x0])throw _0x5522b5[0x1];return{'value':_0x5522b5[0x0]?_0x5522b5[0x1]:void 0x0,'done':!0x0};}([_0x535ec5,_0x157a24]);};}};Object['defineProperty'](_0x13656c,'__esModule',{'value':!0x0}),_0x13656c['highlightElement']=_0x13656c['clickElement']=void 0x0,_0x13656c['clickElement']=function(_0x2272d4,_0x5ab82a){return _0x105249(void 0x0,void 0x0,void 0x0,function(){return _0x261200(this,function(_0x3ff836){return[0x2,new Promise(function(_0x2438c9){setTimeout(function(){var _0x20cf95=document['createElement']('div');_0x20cf95['style']['cssText']='\x0a\x20\x20\x20\x20\x20\x20\x20\x20position:\x20fixed;\x0a\x20\x20\x20\x20\x20\x20\x20\x20left:\x20'['concat'](_0x5ab82a['left']+_0x5ab82a['width']/0x2,'px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20top:\x20')['concat'](_0x5ab82a['top']+_0x5ab82a['height']/0x2,'px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20width:\x2060px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20height:\x2060px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20z-index:\x201000;\x0a\x20\x20\x20\x20\x20\x20\x20\x20pointer-events:\x20none;\x0a\x20\x20\x20\x20\x20\x20\x20\x20transform:\x20translate(-50%,\x20-50%);\x0a\x20\x20\x20\x20\x20\x20'),document['body']['appendChild'](_0x20cf95);for(var _0x450fe9=0x0;_0x450fe9<0x3;_0x450fe9++){var _0x11055b=document['createElement']('div');_0x11055b['style']['cssText']='\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20position:\x20absolute;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20left:\x2050%;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20top:\x2050%;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20width:\x2040px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20height:\x2040px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20border:\x202px\x20solid\x20rgba(0,\x20102,\x20255,\x20'['concat'](0.7-0.2*_0x450fe9,');\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20border-radius:\x2050%;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20transform:\x20translate(-50%,\x20-50%)\x20scale(0);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20opacity:\x201;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20animation:\x20click-ripple-animation\x200.8s\x20ease-out\x20')['concat'](0.15*_0x450fe9,'s\x20forwards;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20box-shadow:\x200\x200\x208px\x20rgba(0,\x20102,\x20255,\x200.4);\x0a\x20\x20\x20\x20\x20\x20\x20\x20'),_0x20cf95['appendChild'](_0x11055b);}var _0x1dd404=document['createElement']('div');_0x1dd404['style']['cssText']='\x0a\x20\x20\x20\x20\x20\x20\x20\x20position:\x20absolute;\x0a\x20\x20\x20\x20\x20\x20\x20\x20left:\x2050%;\x0a\x20\x20\x20\x20\x20\x20\x20\x20top:\x2050%;\x0a\x20\x20\x20\x20\x20\x20\x20\x20width:\x2012px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20height:\x2012px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20background:\x20rgba(0,\x20102,\x20255,\x200.9);\x0a\x20\x20\x20\x20\x20\x20\x20\x20border-radius:\x2050%;\x0a\x20\x20\x20\x20\x20\x20\x20\x20transform:\x20translate(-50%,\x20-50%)\x20scale(0);\x0a\x20\x20\x20\x20\x20\x20\x20\x20animation:\x20click-dot-animation\x200.4s\x20ease-out\x20forwards;\x0a\x20\x20\x20\x20\x20\x20\x20\x20box-shadow:\x200\x200\x205px\x20rgba(0,\x20102,\x20255,\x200.8);\x0a\x20\x20\x20\x20\x20\x20',_0x20cf95['appendChild'](_0x1dd404);var _0x3f0f01=new MouseEvent('click',{'view':window,'bubbles':!0x0,'cancelable':!0x0}),_0x519550=_0x2272d4['querySelectorAll']('a,\x20button,\x20input[type=\x22button\x22],\x20input[type=\x22submit\x22]'),_0xc963d9=_0x519550['length']>0x0?_0x519550[0x0]:_0x2272d4;console['log']('Clicking\x20element:',_0xc963d9),_0xc963d9['dispatchEvent'](_0x3f0f01);var _0x56ccb9=_0xc963d9['style']['boxShadow'],_0x58f494=_0xc963d9['style']['transition'],_0x191e92=_0xc963d9['style']['zIndex'];_0xc963d9['style']['transition']='all\x200.3s\x20ease-out',_0xc963d9['style']['boxShadow']='0\x200\x200\x202px\x20rgba(0,\x20102,\x20255,\x200.5),\x200\x200\x2010px\x20rgba(0,\x20102,\x20255,\x200.3)',_0xc963d9['style']['zIndex']='999',setTimeout(function(){_0xc963d9['style']['boxShadow']=_0x56ccb9,_0xc963d9['style']['transition']=_0x58f494,_0xc963d9['style']['zIndex']=_0x191e92,_0x20cf95['remove'](),_0x2438c9();},0x3e8);},0x5dc);})];});});},_0x13656c['highlightElement']=function(_0xaa4eeb,_0x48f5b6,_0x1a37ce,_0x5acb4d){return _0x105249(void 0x0,void 0x0,void 0x0,function(){var _0x1531b0,_0x3ef9e8,_0x502db6,_0x199edd,_0x310f47;return _0x261200(this,function(_0x31974a){switch(_0x31974a['label']){case 0x0:if(_0x48f5b6)return[0x2,!0x1];if(0x0===(_0x1531b0=Array['isArray'](_0xaa4eeb)?_0xaa4eeb:[_0xaa4eeb])['length'])return[0x2,!0x1];console['log']('Moving\x20cursor\x20to\x20elements:',_0x1531b0),_0x3ef9e8=null,_0x31974a['label']=0x1;case 0x1:_0x31974a['trys']['push']([0x1,0x6,,0x7]),_0x1a37ce(!0x0),_0x502db6=function(_0x582437){var _0x16fd55,_0x24b050,_0x37b94d,_0x4cba52,_0x2b536a,_0x1cd749;return _0x261200(this,function(_0xd3611a){switch(_0xd3611a['label']){case 0x0:return _0x16fd55=_0x1531b0[_0x582437],_0x582437>0x0?[0x4,new Promise(function(_0x5de1a7){return setTimeout(_0x5de1a7,0x3e8);})]:[0x3,0x2];case 0x1:_0xd3611a['sent'](),_0xd3611a['label']=0x2;case 0x2:if(_0x24b050=void 0x0,_0x16fd55['startsWith']('//')){if(!((_0x37b94d=document['evaluate'](_0x16fd55,document,null,XPathResult['FIRST_ORDERED_NODE_TYPE'],null)['singleNodeValue'])instanceof Element))return console['log']('XPath\x20returned\x20a\x20non-Element\x20node:',_0x16fd55),console['log'](_0x37b94d),_0x5acb4d('XPath\x20returned\x20a\x20non-Element\x20node:\x20'+_0x16fd55,'GUIDEAI'),[0x2,'break'];_0x24b050=_0x37b94d;}else _0x24b050=document['querySelector'](_0x16fd55);return _0x24b050?(_0x4cba52=_0x24b050['getBoundingClientRect'](),_0x3ef9e8||((_0x3ef9e8=document['createElement']('div'))['id']='guide-ai-cursor',_0x3ef9e8['innerHTML']='\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<svg\x20width=\x22100%\x22\x20height=\x22100%\x22\x20viewBox=\x220\x200\x2024\x2024\x22\x20xmlns=\x22http://www.w3.org/2000/svg\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<path\x20fill=\x22#0066ff\x22\x20d=\x22M7,2l12,11.2l-5.8,0.5l3.3,7.3l-2.2,1l-3.2-7.4L7,18.5V2\x22\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</svg>\x0a\x20\x20\x20\x20\x20\x20\x20\x20',_0x3ef9e8['style']['cssText']='\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20position:\x20fixed;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20width:\x2064px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20height:\x2064px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20pointer-events:\x20none;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20z-index:\x209999;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20transition:\x20all\x200.8s\x20ease-in-out;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20transform:\x20translate(-50%,\x200);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20filter:\x20drop-shadow(0\x200\x204px\x20rgba(0,\x20102,\x20255,\x200.8));\x0a\x20\x20\x20\x20\x20\x20\x20\x20',document['body']['appendChild'](_0x3ef9e8),_0x2b536a=window['innerWidth'],_0x1cd749=window['innerHeight'],_0x3ef9e8['style']['left']=''['concat'](_0x2b536a/0x2,'px'),_0x3ef9e8['style']['top']=''['concat'](_0x1cd749/0x2,'px')),_0x3ef9e8['offsetHeight'],[0x4,new Promise(function(_0x11f708){setTimeout(function(){_0x3ef9e8['style']['left']=''['concat'](_0x4cba52['left']+_0x4cba52['width']/0x2,'px'),_0x3ef9e8['style']['top']=''['concat'](_0x4cba52['top']+_0x4cba52['height']/0x2-0xa,'px'),setTimeout(function(){_0x3ef9e8['style']['animation']='cursor-jiggle\x200.5s\x20ease-in-out\x20infinite',_0x11f708();},0x320);},0x64);})]):(console['log']('Element\x20not\x20found:',_0x16fd55),_0x5acb4d('Element\x20not\x20found:\x20'+_0x16fd55,'GUIDEAI'),[0x2,'break']);case 0x3:return _0xd3611a['sent'](),[0x4,(0x0,_0x13656c['clickElement'])(_0x24b050,_0x4cba52)];case 0x4:return _0xd3611a['sent'](),[0x2];}});},_0x199edd=0x0,_0x31974a['label']=0x2;case 0x2:return _0x199edd<_0x1531b0['length']?[0x5,_0x502db6(_0x199edd)]:[0x3,0x5];case 0x3:if('break'===_0x31974a['sent']())return[0x3,0x5];_0x31974a['label']=0x4;case 0x4:return _0x199edd++,[0x3,0x2];case 0x5:return setTimeout(function(){null==_0x3ef9e8||_0x3ef9e8['remove'](),_0x1a37ce(!0x1);},0x3e8),[0x2,!0x0];case 0x6:return _0x310f47=_0x31974a['sent'](),console['error']('Error\x20moving\x20cursor:',_0x310f47),null==_0x3ef9e8||_0x3ef9e8['remove'](),_0x1a37ce(!0x1),[0x2,!0x1];case 0x7:return[0x2];}});});};}},_0x70b8f1={},_0x3b1151=function _0x36b909(_0x5bd1c2){var _0x35d0f9=_0x70b8f1[_0x5bd1c2];if(void 0x0!==_0x35d0f9)return _0x35d0f9['exports'];var _0x1cb752=_0x70b8f1[_0x5bd1c2]={'exports':{}};return _0x119aa6[_0x5bd1c2]['call'](_0x1cb752['exports'],_0x1cb752,_0x1cb752['exports'],_0x36b909),_0x1cb752['exports'];}(0x102);return _0x3b1151['default'];})()));
|
|
1
|
+
!function(_0xf18130,_0x51e3be){'object'==typeof exports&&'object'==typeof module?module['exports']=_0x51e3be(require('react')):'function'==typeof define&&define['amd']?define(['React'],_0x51e3be):'object'==typeof exports?exports['GuideAI']=_0x51e3be(require('react')):_0xf18130['GuideAI']=_0x51e3be(_0xf18130['React']);}(this,_0x27f50d=>((()=>{'use strict';var _0x282ab6={0x35:(_0x4e146c,_0x15f4de)=>{Object['defineProperty'](_0x15f4de,'__esModule',{'value':!0x0}),_0x15f4de['guideAIStyles']=void 0x0,_0x15f4de['guideAIStyles']='\x0a.sarge-main-ui\x20{\x0a\x20\x20position:\x20relative;\x0a}\x0a\x0a.sarge-welcome-bubble\x20{\x0a\x20\x20position:\x20absolute;\x0a\x20\x20left:\x2050%;\x0a\x20\x20transform:\x20translateX(-50%);\x0a\x20\x20background:\x20#0066ff;\x0a\x20\x20color:\x20white;\x0a\x20\x20padding:\x2010px\x2016px;\x0a\x20\x20border-radius:\x2020px;\x0a\x20\x20font-size:\x2014px;\x0a\x20\x20white-space:\x20normal;\x0a\x20\x20box-shadow:\x200\x202px\x208px\x20rgba(0,\x200,\x200,\x200.2);\x0a\x20\x20animation:\x20bubble-pulse\x202s\x20infinite;\x0a\x20\x20max-width:\x20280px;\x0a\x20\x20min-width:\x20200px;\x0a\x20\x20text-align:\x20center;\x0a\x20\x20line-height:\x201.3;\x0a}\x0a\x0a.sarge-welcome-bubble.above\x20{\x0a\x20\x20bottom:\x20calc(100%\x20+\x2010px);\x0a}\x0a\x0a.sarge-welcome-bubble.below\x20{\x0a\x20\x20top:\x20calc(100%\x20+\x2010px);\x0a}\x0a\x0a.sarge-welcome-bubble.above::after\x20{\x0a\x20\x20content:\x20\x27\x27;\x0a\x20\x20position:\x20absolute;\x0a\x20\x20top:\x20100%;\x0a\x20\x20left:\x2050%;\x0a\x20\x20transform:\x20translateX(-50%);\x0a\x20\x20border-left:\x208px\x20solid\x20transparent;\x0a\x20\x20border-right:\x208px\x20solid\x20transparent;\x0a\x20\x20border-top:\x208px\x20solid\x20#0066ff;\x0a}\x0a\x0a.sarge-welcome-bubble.below::after\x20{\x0a\x20\x20content:\x20\x27\x27;\x0a\x20\x20position:\x20absolute;\x0a\x20\x20bottom:\x20100%;\x0a\x20\x20left:\x2050%;\x0a\x20\x20transform:\x20translateX(-50%);\x0a\x20\x20border-left:\x208px\x20solid\x20transparent;\x0a\x20\x20border-right:\x208px\x20solid\x20transparent;\x0a\x20\x20border-bottom:\x208px\x20solid\x20#0066ff;\x0a}\x0a\x0a@keyframes\x20bubble-pulse\x20{\x0a\x20\x200%\x20{\x20transform:\x20translateX(-50%)\x20scale(1);\x20}\x0a\x20\x2050%\x20{\x20transform:\x20translateX(-50%)\x20scale(1.05);\x20}\x0a\x20\x20100%\x20{\x20transform:\x20translateX(-50%)\x20scale(1);\x20}\x0a}\x0a\x0a.sarge-icon-wrapper\x20{\x0a\x20\x20width:\x20100%;\x0a\x20\x20height:\x20100%;\x0a\x20\x20min-width:\x2030px;\x0a\x20\x20min-height:\x2030px;\x0a\x20\x20max-width:\x2060px;\x0a\x20\x20max-height:\x2060px;\x0a\x20\x20display:\x20flex;\x0a\x20\x20justify-content:\x20center;\x0a\x20\x20align-items:\x20center;\x0a\x20\x20background-color:\x20rgba(255,\x20255,\x20255,\x200.9);\x0a\x20\x20border-radius:\x2050%;\x0a\x20\x20box-shadow:\x200\x202px\x204px\x20rgba(0,\x200,\x200,\x200.3);\x0a\x20\x20cursor:\x20pointer;\x0a\x20\x20transition:\x20all\x200.2s\x20ease;\x0a}\x0a\x0a.sarge-icon-wrapper:not(.initializing):hover\x20{\x0a\x20\x20transform:\x20scale(1.1);\x0a}\x0a\x0a.sarge-icon-wrapper.initializing\x20{\x0a\x20\x20background-color:\x20rgba(255,\x20255,\x20255,\x200.9);\x0a\x20\x20box-shadow:\x200\x200\x200\x202px\x20rgba(128,\x20128,\x20128,\x200.5),\x200\x202px\x208px\x20rgba(0,\x200,\x200,\x200.3);\x0a\x20\x20animation:\x20sarge-spin\x201.5s\x20linear\x20infinite;\x0a\x20\x20opacity:\x200.7;\x0a\x20\x20cursor:\x20default;\x0a}\x0a\x0a.sarge-icon-wrapper.recording\x20{\x0a\x20\x20background-color:\x20rgba(255,\x20255,\x20255,\x200.9);\x0a\x20\x20box-shadow:\x200\x200\x200\x202px\x20rgba(255,\x200,\x200,\x200.5),\x200\x202px\x208px\x20rgba(0,\x200,\x200,\x200.3);\x0a\x20\x20animation:\x20sarge-pulse\x201s\x20infinite\x20alternate;\x0a}\x0a\x0a.sarge-icon-wrapper.processing\x20{\x0a\x20\x20background-color:\x20rgba(255,\x20255,\x20255,\x200.9);\x0a\x20\x20box-shadow:\x200\x200\x200\x202px\x20rgba(255,\x20165,\x200,\x200.5),\x200\x202px\x208px\x20rgba(0,\x200,\x200,\x200.3);\x0a\x20\x20animation:\x20sarge-spin\x201s\x20linear\x20infinite;\x0a}\x0a\x0a.sarge-icon-wrapper.playing\x20{\x0a\x20\x20background-color:\x20rgba(255,\x20255,\x20255,\x200.9);\x0a\x20\x20box-shadow:\x200\x200\x200\x202px\x20rgba(0,\x20128,\x200,\x200.5),\x200\x202px\x208px\x20rgba(0,\x200,\x200,\x200.3);\x0a}\x0a\x0a@keyframes\x20sarge-pulse\x20{\x0a\x20\x200%\x20{\x20transform:\x20scale(1);\x20}\x0a\x20\x20100%\x20{\x20transform:\x20scale(1.05);\x20}\x0a}\x0a\x0a@keyframes\x20sarge-spin\x20{\x0a\x20\x200%\x20{\x0a\x20\x20\x20\x20transform:\x20rotate(0deg);\x0a\x20\x20}\x0a\x20\x20100%\x20{\x0a\x20\x20\x20\x20transform:\x20rotate(360deg);\x0a\x20\x20}\x0a}\x0a\x0a@keyframes\x20click-ripple-animation\x20{\x0a\x20\x200%\x20{\x20transform:\x20translate(-50%,\x20-50%)\x20scale(0);\x20opacity:\x201;\x20}\x0a\x20\x2050%\x20{\x20transform:\x20translate(-50%,\x20-50%)\x20scale(1.2);\x20opacity:\x200.6;\x20}\x0a\x20\x20100%\x20{\x20transform:\x20translate(-50%,\x20-50%)\x20scale(2.5);\x20opacity:\x200;\x20}\x0a}\x0a\x0a@keyframes\x20click-dot-animation\x20{\x0a\x20\x200%\x20{\x20transform:\x20translate(-50%,\x20-50%)\x20scale(0);\x20opacity:\x201;\x20}\x0a\x20\x2060%\x20{\x20transform:\x20translate(-50%,\x20-50%)\x20scale(1);\x20opacity:\x201;\x20}\x0a\x20\x20100%\x20{\x20transform:\x20translate(-50%,\x20-50%)\x20scale(1);\x20opacity:\x200;\x20}\x0a}\x0a\x0a@keyframes\x20cursor-jiggle\x20{\x0a\x20\x200%\x20{\x20transform:\x20translate(-50%,\x200)\x20scale(1);\x20}\x0a\x20\x2025%\x20{\x20transform:\x20translate(-50%,\x20-5px)\x20scale(1.1);\x20}\x0a\x20\x2050%\x20{\x20transform:\x20translate(-50%,\x200)\x20scale(1);\x20}\x0a\x20\x2075%\x20{\x20transform:\x20translate(-50%,\x205px)\x20scale(1.1);\x20}\x0a\x20\x20100%\x20{\x20transform:\x20translate(-50%,\x200)\x20scale(1);\x20filter:\x20drop-shadow(0\x200\x208px\x20#0066ff);\x20}\x0a}\x0a\x0a.sarge-icon\x20{\x0a\x20\x20width:\x2060%;\x0a\x20\x20height:\x2060%;\x0a\x20\x20min-width:\x2016px;\x0a\x20\x20min-height:\x2016px;\x0a\x20\x20max-width:\x2040px;\x0a\x20\x20max-height:\x2040px;\x0a\x20\x20background-size:\x20contain;\x0a\x20\x20background-repeat:\x20no-repeat;\x0a\x20\x20background-position:\x20center;\x0a}\x0a\x0a.sarge-icon.initializing\x20{\x0a\x20\x20background-image:\x20url(\x27data:image/svg+xml;utf8,<svg\x20xmlns=\x22http://www.w3.org/2000/svg\x22\x20viewBox=\x220\x200\x20512\x20512\x22><path\x20fill=\x22%23808080\x22\x20d=\x22M304\x2048c0\x2026.51-21.49\x2048-48\x2048s-48-21.49-48-48\x2021.49-48\x2048-48\x2048\x2021.49\x2048\x2048zm-48\x20368c-26.51\x200-48\x2021.49-48\x2048s21.49\x2048\x2048\x2048\x2048-21.49\x2048-48-21.49-48-48-48zm208-208c-26.51\x200-48\x2021.49-48\x2048s21.49\x2048\x2048\x2048\x2048-21.49\x2048-48-21.49-48-48-48zM96\x20256c0-26.51-21.49-48-48-48S0\x20229.49\x200\x20256s21.49\x2048\x2048\x2048\x2048-21.49\x2048-48zm12.922\x2099.078c-26.51\x200-48\x2021.49-48\x2048s21.49\x2048\x2048\x2048\x2048-21.49\x2048-48c0-26.509-21.491-48-48-48zm294.156\x200c-26.51\x200-48\x2021.49-48\x2048s21.49\x2048\x2048\x2048\x2048-21.49\x2048-48c0-26.509-21.49-48-48-48zM108.922\x2060.922c-26.51\x200-48\x2021.49-48\x2048s21.49\x2048\x2048\x2048\x2048-21.49\x2048-48-21.491-48-48-48z\x22/></svg>\x27);\x0a}\x0a\x0a.sarge-icon.microphone\x20{\x0a\x20\x20background-image:\x20url(\x27data:image/svg+xml;utf8,<svg\x20xmlns=\x22http://www.w3.org/2000/svg\x22\x20viewBox=\x220\x200\x20352\x20512\x22><path\x20fill=\x22%230000FF\x22\x20d=\x22M176\x20352c53.02\x200\x2096-42.98\x2096-96V96c0-53.02-42.98-96-96-96S80\x2042.98\x2080\x2096v160c0\x2053.02\x2042.98\x2096\x2096\x2096zm160-160h-16c-8.84\x200-16\x207.16-16\x2016v48c0\x2074.8-64.49\x20134.82-140.79\x20127.38C96.71\x20376.89\x2048\x20317.11\x2048\x20250.3V208c0-8.84-7.16-16-16-16H16c-8.84\x200-16\x207.16-16\x2016v40.16c0\x2089.64\x2063.97\x20169.55\x20152\x20181.69V464H96c-8.84\x200-16\x207.16-16\x2016v16c0\x208.84\x207.16\x2016\x2016\x2016h160c8.84\x200\x2016-7.16\x2016-16v-16c0-8.84-7.16-16-16-16h-56v-33.77C285.71\x20418.47\x20352\x20344.9\x20352\x20256v-48c0-8.84-7.16-16-16-16z\x22/></svg>\x27);\x0a}\x0a\x0a.sarge-icon.recording\x20{\x0a\x20\x20background-image:\x20url(\x27data:image/svg+xml;utf8,<svg\x20xmlns=\x22http://www.w3.org/2000/svg\x22\x20viewBox=\x220\x200\x20512\x20512\x22><circle\x20cx=\x22256\x22\x20cy=\x22256\x22\x20r=\x22128\x22\x20fill=\x22%23FF0000\x22/><circle\x20cx=\x22256\x22\x20cy=\x22256\x22\x20r=\x22200\x22\x20stroke=\x22%23FF0000\x22\x20stroke-width=\x2220\x22\x20fill=\x22none\x22/></svg>\x27);\x0a}\x0a\x0a.sarge-icon.processing\x20{\x0a\x20\x20background-image:\x20url(\x27data:image/svg+xml;utf8,<svg\x20xmlns=\x22http://www.w3.org/2000/svg\x22\x20viewBox=\x220\x200\x20512\x20512\x22><path\x20fill=\x22%23FFA500\x22\x20d=\x22M304\x2048c0\x2026.51-21.49\x2048-48\x2048s-48-21.49-48-48\x2021.49-48\x2048-48\x2048\x2021.49\x2048\x2048zm-48\x20368c-26.51\x200-48\x2021.49-48\x2048s21.49\x2048\x2048\x2048\x2048-21.49\x2048-48-21.49-48-48-48zm208-208c-26.51\x200-48\x2021.49-48\x2048s21.49\x2048\x2048\x2048\x2048-21.49\x2048-48-21.49-48-48-48zM96\x20256c0-26.51-21.49-48-48-48S0\x20229.49\x200\x20256s21.49\x2048\x2048\x2048\x2048-21.49\x2048-48zm12.922\x2099.078c-26.51\x200-48\x2021.49-48\x2048s21.49\x2048\x2048\x2048\x2048-21.49\x2048-48c0-26.509-21.491-48-48-48zm294.156\x200c-26.51\x200-48\x2021.49-48\x2048s21.49\x2048\x2048\x2048\x2048-21.49\x2048-48c0-26.509-21.49-48-48-48zM108.922\x2060.922c-26.51\x200-48\x2021.49-48\x2048s21.49\x2048\x2048\x2048\x2048-21.49\x2048-48-21.491-48-48-48z\x22/></svg>\x27);\x0a}\x0a\x0a.sarge-icon.playing\x20{\x0a\x20\x20background-image:\x20url(\x27data:image/svg+xml;utf8,<svg\x20xmlns=\x22http://www.w3.org/2000/svg\x22\x20viewBox=\x220\x200\x2024\x2024\x22><path\x20fill=\x22%23008000\x22\x20d=\x22M3\x209v6h4l5\x205V4L7\x209H3zm13.5\x203c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73\x202.5-2.25\x202.5-4.02zM14\x203.23v2.06c2.89.86\x205\x203.54\x205\x206.71s-2.11\x205.85-5\x206.71v2.06c4.01-.91\x207-4.49\x207-8.77s-2.99-7.86-7-8.77z\x22/></svg>\x27);\x0a}\x0a\x0a/*\x20Onboarding\x20styles\x20*/\x0a.sarge-onboarding\x20{\x0a\x20\x20position:\x20absolute;\x0a\x20\x20left:\x2050%;\x0a\x20\x20transform:\x20translateX(-50%);\x0a\x20\x20background:\x20white;\x0a\x20\x20border-radius:\x2012px;\x0a\x20\x20box-shadow:\x200\x204px\x2020px\x20rgba(0,\x200,\x200,\x200.15);\x0a\x20\x20width:\x20300px;\x0a\x20\x20max-width:\x2090vw;\x0a\x20\x20z-index:\x201002;\x0a\x20\x20animation:\x20onboarding-fade-in\x200.3s\x20ease-out;\x0a}\x0a\x0a.sarge-onboarding.above\x20{\x0a\x20\x20bottom:\x20calc(100%\x20+\x2015px);\x0a}\x0a\x0a.sarge-onboarding.below\x20{\x0a\x20\x20top:\x20calc(100%\x20+\x2015px);\x0a}\x0a\x0a.sarge-onboarding.above::after\x20{\x0a\x20\x20content:\x20\x27\x27;\x0a\x20\x20position:\x20absolute;\x0a\x20\x20top:\x20100%;\x0a\x20\x20left:\x2050%;\x0a\x20\x20transform:\x20translateX(-50%);\x0a\x20\x20border-left:\x208px\x20solid\x20transparent;\x0a\x20\x20border-right:\x208px\x20solid\x20transparent;\x0a\x20\x20border-top:\x208px\x20solid\x20white;\x0a\x20\x20filter:\x20drop-shadow(0\x202px\x204px\x20rgba(0,\x200,\x200,\x200.1));\x0a}\x0a\x0a.sarge-onboarding.below::after\x20{\x0a\x20\x20content:\x20\x27\x27;\x0a\x20\x20position:\x20absolute;\x0a\x20\x20bottom:\x20100%;\x0a\x20\x20left:\x2050%;\x0a\x20\x20transform:\x20translateX(-50%);\x0a\x20\x20border-left:\x208px\x20solid\x20transparent;\x0a\x20\x20border-right:\x208px\x20solid\x20transparent;\x0a\x20\x20border-bottom:\x208px\x20solid\x20white;\x0a\x20\x20filter:\x20drop-shadow(0\x20-2px\x204px\x20rgba(0,\x200,\x200,\x200.1));\x0a}\x0a\x0a@keyframes\x20onboarding-fade-in\x20{\x0a\x20\x20from\x20{\x20opacity:\x200;\x20transform:\x20translateX(-50%)\x20translateY(-10px);\x20}\x0a\x20\x20to\x20{\x20opacity:\x201;\x20transform:\x20translateX(-50%)\x20translateY(0);\x20}\x0a}\x0a\x0a.sarge-onboarding-content\x20{\x0a\x20\x20padding:\x2016px;\x0a\x20\x20position:\x20relative;\x0a}\x0a\x0a.sarge-onboarding-close\x20{\x0a\x20\x20position:\x20absolute;\x0a\x20\x20top:\x2010px;\x0a\x20\x20right:\x2010px;\x0a\x20\x20background:\x20none;\x0a\x20\x20border:\x20none;\x0a\x20\x20font-size:\x2020px;\x0a\x20\x20cursor:\x20pointer;\x0a\x20\x20color:\x20#999;\x0a\x20\x20width:\x2024px;\x0a\x20\x20height:\x2024px;\x0a\x20\x20display:\x20flex;\x0a\x20\x20align-items:\x20center;\x0a\x20\x20justify-content:\x20center;\x0a\x20\x20border-radius:\x2050%;\x0a}\x0a\x0a.sarge-onboarding-close:hover\x20{\x0a\x20\x20background:\x20#f5f5f5;\x0a\x20\x20color:\x20#333;\x0a}\x0a\x0a.sarge-onboarding-step\x20{\x0a\x20\x20text-align:\x20center;\x0a\x20\x20margin-bottom:\x2012px;\x0a}\x0a\x0a.sarge-onboarding-icon\x20{\x0a\x20\x20font-size:\x2032px;\x0a\x20\x20margin-bottom:\x208px;\x0a\x20\x20display:\x20inline-block;\x0a}\x0a\x0a.sarge-onboarding-step\x20h3\x20{\x0a\x20\x20margin:\x200\x200\x208px;\x0a\x20\x20font-size:\x2016px;\x0a\x20\x20color:\x20#333;\x0a\x20\x20font-weight:\x20600;\x0a}\x0a\x0a.sarge-onboarding-step\x20p\x20{\x0a\x20\x20margin:\x200;\x0a\x20\x20font-size:\x2013px;\x0a\x20\x20color:\x20#666;\x0a\x20\x20line-height:\x201.4;\x0a}\x0a\x0a.sarge-onboarding-dots\x20{\x0a\x20\x20display:\x20flex;\x0a\x20\x20justify-content:\x20center;\x0a\x20\x20margin:\x2012px\x200;\x0a}\x0a\x0a.sarge-onboarding-dots\x20.dot\x20{\x0a\x20\x20width:\x208px;\x0a\x20\x20height:\x208px;\x0a\x20\x20border-radius:\x2050%;\x0a\x20\x20background:\x20#ddd;\x0a\x20\x20margin:\x200\x204px;\x0a\x20\x20transition:\x20all\x200.3s\x20ease;\x0a}\x0a\x0a.sarge-onboarding-dots\x20.dot.active\x20{\x0a\x20\x20background:\x20#0066ff;\x0a\x20\x20transform:\x20scale(1.2);\x0a}\x0a\x0a.sarge-onboarding-next\x20{\x0a\x20\x20display:\x20block;\x0a\x20\x20width:\x20100%;\x0a\x20\x20padding:\x2010px;\x0a\x20\x20background:\x20#0066ff;\x0a\x20\x20color:\x20white;\x0a\x20\x20border:\x20none;\x0a\x20\x20border-radius:\x206px;\x0a\x20\x20font-size:\x2014px;\x0a\x20\x20font-weight:\x20500;\x0a\x20\x20cursor:\x20pointer;\x0a\x20\x20transition:\x20background\x200.2s\x20ease;\x0a}\x0a\x0a.sarge-onboarding-next:hover\x20{\x0a\x20\x20background:\x20#0055cc;\x0a}\x0a';},0x84:(_0x1660d7,_0x116be9)=>{Object['defineProperty'](_0x116be9,'__esModule',{'value':!0x0}),_0x116be9['formatConversationContext']=_0x116be9['checkForStoredConversation']=_0x116be9['addMessageToStorage']=_0x116be9['clearConversationStorage']=_0x116be9['loadConversationFromStorage']=_0x116be9['saveConversationToStorage']=_0x116be9['isConversationExpired']=_0x116be9['isLocalStorageAvailable']=_0x116be9['MAX_STORED_MESSAGES']=_0x116be9['CONVERSATION_EXPIRY_MINUTES']=_0x116be9['CONVERSATION_STORAGE_KEY']=void 0x0,_0x116be9['CONVERSATION_STORAGE_KEY']='guideai_conversation',_0x116be9['CONVERSATION_EXPIRY_MINUTES']=0x1e,_0x116be9['MAX_STORED_MESSAGES']=0x32,_0x116be9['isLocalStorageAvailable']=function(){try{var _0x4660db='__storage_test__';return localStorage['setItem'](_0x4660db,_0x4660db),localStorage['removeItem'](_0x4660db),!0x0;}catch(_0x5c3824){return!0x1;}},_0x116be9['isConversationExpired']=function(_0x58fe42){var _0xedaf49=0x3c*_0x116be9['CONVERSATION_EXPIRY_MINUTES']*0x3e8;return Date['now']()-_0x58fe42['timestamp']>_0xedaf49;};var _0x1d4d54=function(_0x11843,_0x1a9320){if(console['error']('Storage\x20error\x20during\x20'['concat'](_0x1a9320,':'),_0x11843),_0x11843 instanceof DOMException&&('QuotaExceededError'===_0x11843['name']||'NS_ERROR_DOM_QUOTA_REACHED'===_0x11843['name']))try{var _0x210eb3=(0x0,_0x116be9['loadConversationFromStorage'])();_0x210eb3&&_0x210eb3['messages']['length']>0x5?(_0x210eb3['messages']=_0x210eb3['messages']['slice'](0x5),(0x0,_0x116be9['saveConversationToStorage'])(_0x210eb3),console['warn']('Storage\x20quota\x20exceeded.\x20Removed\x20oldest\x205\x20messages\x20to\x20free\x20space.')):_0x210eb3&&((0x0,_0x116be9['clearConversationStorage'])(),console['warn']('Storage\x20quota\x20exceeded.\x20Cleared\x20conversation\x20data.'));}catch(_0x3e2ae5){console['error']('Failed\x20to\x20clean\x20up\x20storage:',_0x3e2ae5);}};_0x116be9['saveConversationToStorage']=function(_0xdca5c9){if((0x0,_0x116be9['isLocalStorageAvailable'])())try{_0xdca5c9['messages']['length']>_0x116be9['MAX_STORED_MESSAGES']&&(_0xdca5c9['messages']=_0xdca5c9['messages']['slice'](-_0x116be9['MAX_STORED_MESSAGES'])),_0xdca5c9['timestamp']=Date['now'](),localStorage['setItem'](_0x116be9['CONVERSATION_STORAGE_KEY'],JSON['stringify'](_0xdca5c9));}catch(_0x3c6751){_0x1d4d54(_0x3c6751,'save');}else console['warn']('localStorage\x20is\x20not\x20available.\x20Conversation\x20persistence\x20disabled.');},_0x116be9['loadConversationFromStorage']=function(){if(!(0x0,_0x116be9['isLocalStorageAvailable'])())return console['warn']('localStorage\x20is\x20not\x20available.\x20Conversation\x20persistence\x20disabled.'),null;try{var _0x243348=localStorage['getItem'](_0x116be9['CONVERSATION_STORAGE_KEY']);if(!_0x243348)return null;var _0x47e39=JSON['parse'](_0x243348);return(_0x2ef69b=_0x47e39)&&'object'==typeof _0x2ef69b&&'string'==typeof _0x2ef69b['conversationId']&&Array['isArray'](_0x2ef69b['messages'])&&'number'==typeof _0x2ef69b['timestamp']&&'string'==typeof _0x2ef69b['organizationKey']&&_0x2ef69b['messages']['every'](function(_0x438270){return'object'==typeof _0x438270&&'string'==typeof _0x438270['content']&&('HUMAN'===_0x438270['sender']||'GUIDEAI'===_0x438270['sender'])&&'number'==typeof _0x438270['timestamp'];})?_0x47e39:(console['warn']('Corrupted\x20conversation\x20data\x20found.\x20Clearing\x20storage.'),(0x0,_0x116be9['clearConversationStorage'])(),null);}catch(_0x41ef94){return _0x1d4d54(_0x41ef94,'load'),(0x0,_0x116be9['clearConversationStorage'])(),null;}var _0x2ef69b;},_0x116be9['clearConversationStorage']=function(){if((0x0,_0x116be9['isLocalStorageAvailable'])())try{localStorage['removeItem'](_0x116be9['CONVERSATION_STORAGE_KEY']);}catch(_0x5d59a7){_0x1d4d54(_0x5d59a7,'clear');}},_0x116be9['addMessageToStorage']=function(_0x82feb3,_0x24d48e,_0x1086bf){if((0x0,_0x116be9['isLocalStorageAvailable'])())try{var _0x2c8154=(0x0,_0x116be9['loadConversationFromStorage'])();_0x2c8154||(_0x2c8154={'conversationId':_0x24d48e,'messages':[],'timestamp':Date['now'](),'organizationKey':_0x1086bf}),_0x2c8154['messages']['push'](_0x82feb3),_0x2c8154['conversationId']=_0x24d48e,_0x2c8154['organizationKey']=_0x1086bf,(0x0,_0x116be9['saveConversationToStorage'])(_0x2c8154);}catch(_0x2dc88f){console['error']('Error\x20adding\x20message\x20to\x20storage:',_0x2dc88f);}else console['warn']('localStorage\x20is\x20not\x20available.\x20Message\x20persistence\x20disabled.');},_0x116be9['checkForStoredConversation']=function(_0x377f50){var _0xf82edb=(0x0,_0x116be9['loadConversationFromStorage'])();return _0xf82edb?(0x0,_0x116be9['isConversationExpired'])(_0xf82edb)?((0x0,_0x116be9['clearConversationStorage'])(),{'shouldRestore':!0x1,'conversationId':null,'messages':null}):_0xf82edb['organizationKey']!==_0x377f50?{'shouldRestore':!0x1,'conversationId':null,'messages':null}:{'shouldRestore':!0x0,'conversationId':_0xf82edb['conversationId'],'messages':_0xf82edb['messages']}:{'shouldRestore':!0x1,'conversationId':null,'messages':null};},_0x116be9['formatConversationContext']=function(_0x21409e,_0x2bcf19){void 0x0===_0x2bcf19&&(_0x2bcf19=0xa);var _0x901210=_0x21409e['slice'](-_0x2bcf19);if(0x0===_0x901210['length'])return'';var _0x426d9b=_0x901210['map'](function(_0x17bf2c){var _0x471825='HUMAN'===_0x17bf2c['sender']?'User':'Assistant';return''['concat'](_0x471825,':\x20')['concat'](_0x17bf2c['content']);})['join']('\x0a');return'Previous\x20conversation\x20context:\x0a'['concat'](_0x426d9b);};},0x8b:(_0x250d45,_0x52ace3)=>{Object['defineProperty'](_0x52ace3,'__esModule',{'value':!0x0}),_0x52ace3['GEMINI_API_ENDPOINT']=_0x52ace3['GEMINI_API_KEY']=_0x52ace3['OPENAI_REALTIME_MODEL']=_0x52ace3['OPENAI_REALTIME_BASE']=_0x52ace3['GUIDE_AI_API_BASE']=_0x52ace3['IGNORE_MESSAGE_TYPES']=_0x52ace3['DEFAULT_PROMPT']=void 0x0,_0x52ace3['DEFAULT_PROMPT']='you\x20are\x20Guide\x20AI.\x0a\x20\x20\x20\x20\x20\x20Your\x20role\x20is\x20to\x20answer\x20any\x20question\x20directly\x20and\x20succinctly\x20that\x20a\x20user\x20has.\x20NEVER\x20DIRECTLY\x20MENTION\x20THE\x20SCREENSHOT,\x20but\x20use\x20its\x20information\x20as\x20much\x20as\x20possible\x20to\x20target\x20your\x20responses.\x0a\x20\x20\x20\x20\x20\x20If\x20nothing\x20is\x20asked,\x20then\x20your\x20goal\x20is\x20to\x20generally\x20assist\x20them.\x0a\x20\x20\x20\x20\x20\x20IMPORTANT:\x20NEVER\x20answer\x20in\x20more\x20than\x2010\x20words.\x20Always\x20be\x20concise\x20and\x20limit\x20answers\x20to\x201\x20sentence\x20maximum.\x20Be\x20simple\x20and\x20as\x20short\x20as\x20possible.\x0a\x20\x20\x20\x20\x20\x20Your\x20job\x20is\x20to\x20help\x20them\x20get\x20it\x20done\x20through\x20asking\x20more\x20and\x20more\x20targeted\x20specific\x20questions.',_0x52ace3['IGNORE_MESSAGE_TYPES']=['delta','rate_limits','input_audio_buffer','response.audio.done','response.output_item','response.content_part','output_audio_buffer','response.created','session.created'],_0x52ace3['GUIDE_AI_API_BASE']='https://www.getguide.ai/api',_0x52ace3['OPENAI_REALTIME_BASE']='https://api.openai.com/v1/realtime',_0x52ace3['OPENAI_REALTIME_MODEL']='gpt-4o-realtime-preview-2024-12-17',_0x52ace3['GEMINI_API_KEY']='AIzaSyBiFyzjYVupLyk8BdmfWzBL1GbzX8OUdPc',_0x52ace3['GEMINI_API_ENDPOINT']='https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent';},0x9c:_0x8f4ac4=>{_0x8f4ac4['exports']=_0x27f50d;},0xf6:function(_0x3cab16,_0x500f7a,_0x4027bc){var _0x309b72=this&&this['__awaiter']||function(_0x3b5b9,_0x2e0d24,_0xab3b2c,_0x197f3d){return new(_0xab3b2c||(_0xab3b2c=Promise))(function(_0x5bf166,_0x183946){function _0x16a78a(_0x434216){try{_0x5b8361(_0x197f3d['next'](_0x434216));}catch(_0x3f5747){_0x183946(_0x3f5747);}}function _0x30006d(_0x33dd62){try{_0x5b8361(_0x197f3d['throw'](_0x33dd62));}catch(_0xd7f926){_0x183946(_0xd7f926);}}function _0x5b8361(_0x12bebd){var _0x3a6624;_0x12bebd['done']?_0x5bf166(_0x12bebd['value']):(_0x3a6624=_0x12bebd['value'],_0x3a6624 instanceof _0xab3b2c?_0x3a6624:new _0xab3b2c(function(_0x351952){_0x351952(_0x3a6624);}))['then'](_0x16a78a,_0x30006d);}_0x5b8361((_0x197f3d=_0x197f3d['apply'](_0x3b5b9,_0x2e0d24||[]))['next']());});},_0x5eac67=this&&this['__generator']||function(_0x51f03a,_0x281725){var _0x3f25b8,_0x44d5ed,_0x17eb4c,_0x4fde58={'label':0x0,'sent':function(){if(0x1&_0x17eb4c[0x0])throw _0x17eb4c[0x1];return _0x17eb4c[0x1];},'trys':[],'ops':[]},_0x24cc5f=Object['create'](('function'==typeof Iterator?Iterator:Object)['prototype']);return _0x24cc5f['next']=_0x47fa13(0x0),_0x24cc5f['throw']=_0x47fa13(0x1),_0x24cc5f['return']=_0x47fa13(0x2),'function'==typeof Symbol&&(_0x24cc5f[Symbol['iterator']]=function(){return this;}),_0x24cc5f;function _0x47fa13(_0x3191d4){return function(_0x3cd6b8){return function(_0x3d607a){if(_0x3f25b8)throw new TypeError('Generator\x20is\x20already\x20executing.');for(;_0x24cc5f&&(_0x24cc5f=0x0,_0x3d607a[0x0]&&(_0x4fde58=0x0)),_0x4fde58;)try{if(_0x3f25b8=0x1,_0x44d5ed&&(_0x17eb4c=0x2&_0x3d607a[0x0]?_0x44d5ed['return']:_0x3d607a[0x0]?_0x44d5ed['throw']||((_0x17eb4c=_0x44d5ed['return'])&&_0x17eb4c['call'](_0x44d5ed),0x0):_0x44d5ed['next'])&&!(_0x17eb4c=_0x17eb4c['call'](_0x44d5ed,_0x3d607a[0x1]))['done'])return _0x17eb4c;switch(_0x44d5ed=0x0,_0x17eb4c&&(_0x3d607a=[0x2&_0x3d607a[0x0],_0x17eb4c['value']]),_0x3d607a[0x0]){case 0x0:case 0x1:_0x17eb4c=_0x3d607a;break;case 0x4:return _0x4fde58['label']++,{'value':_0x3d607a[0x1],'done':!0x1};case 0x5:_0x4fde58['label']++,_0x44d5ed=_0x3d607a[0x1],_0x3d607a=[0x0];continue;case 0x7:_0x3d607a=_0x4fde58['ops']['pop'](),_0x4fde58['trys']['pop']();continue;default:if(!((_0x17eb4c=(_0x17eb4c=_0x4fde58['trys'])['length']>0x0&&_0x17eb4c[_0x17eb4c['length']-0x1])||0x6!==_0x3d607a[0x0]&&0x2!==_0x3d607a[0x0])){_0x4fde58=0x0;continue;}if(0x3===_0x3d607a[0x0]&&(!_0x17eb4c||_0x3d607a[0x1]>_0x17eb4c[0x0]&&_0x3d607a[0x1]<_0x17eb4c[0x3])){_0x4fde58['label']=_0x3d607a[0x1];break;}if(0x6===_0x3d607a[0x0]&&_0x4fde58['label']<_0x17eb4c[0x1]){_0x4fde58['label']=_0x17eb4c[0x1],_0x17eb4c=_0x3d607a;break;}if(_0x17eb4c&&_0x4fde58['label']<_0x17eb4c[0x2]){_0x4fde58['label']=_0x17eb4c[0x2],_0x4fde58['ops']['push'](_0x3d607a);break;}_0x17eb4c[0x2]&&_0x4fde58['ops']['pop'](),_0x4fde58['trys']['pop']();continue;}_0x3d607a=_0x281725['call'](_0x51f03a,_0x4fde58);}catch(_0x30a612){_0x3d607a=[0x6,_0x30a612],_0x44d5ed=0x0;}finally{_0x3f25b8=_0x17eb4c=0x0;}if(0x5&_0x3d607a[0x0])throw _0x3d607a[0x1];return{'value':_0x3d607a[0x0]?_0x3d607a[0x1]:void 0x0,'done':!0x0};}([_0x3191d4,_0x3cd6b8]);};}};Object['defineProperty'](_0x500f7a,'__esModule',{'value':!0x0}),_0x500f7a['logMessage']=_0x500f7a['createNewConversation']=void 0x0;var _0x4e2ade=_0x4027bc(0x84),_0xfb3d50=_0x4027bc(0x8b);_0x500f7a['createNewConversation']=function(_0x48a780,_0xa5cacb){return _0x309b72(void 0x0,void 0x0,void 0x0,function(){var _0xc6d77,_0x28a280,_0x19578f,_0x188015,_0x51e567;return _0x5eac67(this,function(_0x5ddc75){switch(_0x5ddc75['label']){case 0x0:return _0x5ddc75['trys']['push']([0x0,0x5,,0x6]),_0xc6d77=new Date(),[0x4,fetch(''['concat'](_0xfb3d50['GUIDE_AI_API_BASE'],'/initialize-session'),{'method':'POST','headers':{'Content-Type':'application/json'},'body':JSON['stringify']({'organizationKey':_0x48a780,'userId':'anonymous','date':_0xc6d77['toISOString']()['split']('T')[0x0],'time':_0xc6d77['toTimeString']()['split']('\x20')[0x0],'messages':[]})})];case 0x1:return(_0x28a280=_0x5ddc75['sent']())['ok']?[0x3,0x3]:[0x4,_0x28a280['text']()['catch'](function(){return'No\x20error\x20details\x20available';})];case 0x2:throw _0x19578f=_0x5ddc75['sent'](),console['error']('Conversation\x20creation\x20failed\x20with\x20status\x20'['concat'](_0x28a280['status'],':'),_0x19578f),new Error('Failed\x20to\x20create\x20conversation:\x20'['concat'](_0x28a280['status'],'\x20-\x20')['concat'](_0x19578f));case 0x3:return[0x4,_0x28a280['json']()];case 0x4:return _0x188015=_0x5ddc75['sent'](),console['log']('Conversation\x20created:',_0x188015['id']),[0x2,_0x188015];case 0x5:return _0x51e567=_0x5ddc75['sent'](),console['error']('Error\x20creating\x20conversation:',_0x51e567),_0xa5cacb(_0x51e567,'Creating\x20conversation'),[0x2,null];case 0x6:return[0x2];}});});},_0x500f7a['logMessage']=function(_0x2df5bc,_0xc3af9e,_0x47b9e9,_0x5075a6,_0xe269d0){return _0x309b72(void 0x0,void 0x0,void 0x0,function(){var _0x4a4533,_0x4abd55,_0x17b3af;return _0x5eac67(this,function(_0x68f6d9){switch(_0x68f6d9['label']){case 0x0:if(!_0x47b9e9)return[0x2];_0x68f6d9['label']=0x1;case 0x1:return _0x68f6d9['trys']['push']([0x1,0x3,,0x4]),[0x4,fetch(''['concat'](_0xfb3d50['GUIDE_AI_API_BASE'],'/conversations/')['concat'](_0x47b9e9,'/messages'),{'method':'POST','headers':{'Content-Type':'application/json'},'body':JSON['stringify']({'content':_0x2df5bc,'sender':_0xc3af9e})})];case 0x2:if(!(_0x4a4533=_0x68f6d9['sent']())['ok'])throw new Error('Failed\x20to\x20log\x20message:\x20'['concat'](_0x4a4533['status'],'\x20')['concat'](_0x4a4533['statusText']));return _0x4abd55={'content':_0x2df5bc,'sender':_0xc3af9e,'timestamp':Date['now']()},(0x0,_0x4e2ade['addMessageToStorage'])(_0x4abd55,_0x47b9e9,_0x5075a6),[0x3,0x4];case 0x3:return _0x17b3af=_0x68f6d9['sent'](),console['error']('Error\x20logging\x20message:',_0x17b3af),_0xe269d0(_0x17b3af,'Logging\x20message'),[0x3,0x4];case 0x4:return[0x2];}});});};},0x102:function(_0x3b3ddc,_0x34cde0,_0x4dbc54){var _0x44cc37=this&&this['__assign']||function(){return _0x44cc37=Object['assign']||function(_0x4528f3){for(var _0x4d2bb8,_0x19b01b=0x1,_0x37c6a9=arguments['length'];_0x19b01b<_0x37c6a9;_0x19b01b++)for(var _0x57d01c in _0x4d2bb8=arguments[_0x19b01b])Object['prototype']['hasOwnProperty']['call'](_0x4d2bb8,_0x57d01c)&&(_0x4528f3[_0x57d01c]=_0x4d2bb8[_0x57d01c]);return _0x4528f3;},_0x44cc37['apply'](this,arguments);},_0x198daa=this&&this['__awaiter']||function(_0x2ee80b,_0x111275,_0x167a17,_0x11311b){return new(_0x167a17||(_0x167a17=Promise))(function(_0x2b72af,_0x42be61){function _0x508c38(_0x220796){try{_0x426294(_0x11311b['next'](_0x220796));}catch(_0x2d6a6c){_0x42be61(_0x2d6a6c);}}function _0x9f8b3d(_0x2617a5){try{_0x426294(_0x11311b['throw'](_0x2617a5));}catch(_0x5be6dc){_0x42be61(_0x5be6dc);}}function _0x426294(_0x380183){var _0x31a5f3;_0x380183['done']?_0x2b72af(_0x380183['value']):(_0x31a5f3=_0x380183['value'],_0x31a5f3 instanceof _0x167a17?_0x31a5f3:new _0x167a17(function(_0x585b4b){_0x585b4b(_0x31a5f3);}))['then'](_0x508c38,_0x9f8b3d);}_0x426294((_0x11311b=_0x11311b['apply'](_0x2ee80b,_0x111275||[]))['next']());});},_0x2dfcef=this&&this['__generator']||function(_0x5f0bec,_0x429090){var _0x57646d,_0x2e2c2a,_0x22a75b,_0x3f8bd2={'label':0x0,'sent':function(){if(0x1&_0x22a75b[0x0])throw _0x22a75b[0x1];return _0x22a75b[0x1];},'trys':[],'ops':[]},_0x431566=Object['create'](('function'==typeof Iterator?Iterator:Object)['prototype']);return _0x431566['next']=_0x44048d(0x0),_0x431566['throw']=_0x44048d(0x1),_0x431566['return']=_0x44048d(0x2),'function'==typeof Symbol&&(_0x431566[Symbol['iterator']]=function(){return this;}),_0x431566;function _0x44048d(_0xa5c2e3){return function(_0x57af1e){return function(_0x3d35a3){if(_0x57646d)throw new TypeError('Generator\x20is\x20already\x20executing.');for(;_0x431566&&(_0x431566=0x0,_0x3d35a3[0x0]&&(_0x3f8bd2=0x0)),_0x3f8bd2;)try{if(_0x57646d=0x1,_0x2e2c2a&&(_0x22a75b=0x2&_0x3d35a3[0x0]?_0x2e2c2a['return']:_0x3d35a3[0x0]?_0x2e2c2a['throw']||((_0x22a75b=_0x2e2c2a['return'])&&_0x22a75b['call'](_0x2e2c2a),0x0):_0x2e2c2a['next'])&&!(_0x22a75b=_0x22a75b['call'](_0x2e2c2a,_0x3d35a3[0x1]))['done'])return _0x22a75b;switch(_0x2e2c2a=0x0,_0x22a75b&&(_0x3d35a3=[0x2&_0x3d35a3[0x0],_0x22a75b['value']]),_0x3d35a3[0x0]){case 0x0:case 0x1:_0x22a75b=_0x3d35a3;break;case 0x4:return _0x3f8bd2['label']++,{'value':_0x3d35a3[0x1],'done':!0x1};case 0x5:_0x3f8bd2['label']++,_0x2e2c2a=_0x3d35a3[0x1],_0x3d35a3=[0x0];continue;case 0x7:_0x3d35a3=_0x3f8bd2['ops']['pop'](),_0x3f8bd2['trys']['pop']();continue;default:if(!((_0x22a75b=(_0x22a75b=_0x3f8bd2['trys'])['length']>0x0&&_0x22a75b[_0x22a75b['length']-0x1])||0x6!==_0x3d35a3[0x0]&&0x2!==_0x3d35a3[0x0])){_0x3f8bd2=0x0;continue;}if(0x3===_0x3d35a3[0x0]&&(!_0x22a75b||_0x3d35a3[0x1]>_0x22a75b[0x0]&&_0x3d35a3[0x1]<_0x22a75b[0x3])){_0x3f8bd2['label']=_0x3d35a3[0x1];break;}if(0x6===_0x3d35a3[0x0]&&_0x3f8bd2['label']<_0x22a75b[0x1]){_0x3f8bd2['label']=_0x22a75b[0x1],_0x22a75b=_0x3d35a3;break;}if(_0x22a75b&&_0x3f8bd2['label']<_0x22a75b[0x2]){_0x3f8bd2['label']=_0x22a75b[0x2],_0x3f8bd2['ops']['push'](_0x3d35a3);break;}_0x22a75b[0x2]&&_0x3f8bd2['ops']['pop'](),_0x3f8bd2['trys']['pop']();continue;}_0x3d35a3=_0x429090['call'](_0x5f0bec,_0x3f8bd2);}catch(_0x1be731){_0x3d35a3=[0x6,_0x1be731],_0x2e2c2a=0x0;}finally{_0x57646d=_0x22a75b=0x0;}if(0x5&_0x3d35a3[0x0])throw _0x3d35a3[0x1];return{'value':_0x3d35a3[0x0]?_0x3d35a3[0x1]:void 0x0,'done':!0x0};}([_0xa5c2e3,_0x57af1e]);};}},_0x43f933=this&&this['__importDefault']||function(_0x5194f7){return _0x5194f7&&_0x5194f7['__esModule']?_0x5194f7:{'default':_0x5194f7};};Object['defineProperty'](_0x34cde0,'__esModule',{'value':!0x0});var _0x2ff7dd=_0x43f933(_0x4dbc54(0x9c)),_0x51c9b0=_0x4dbc54(0x84),_0x5634d9=_0x4dbc54(0x8b),_0x493d44=_0x4dbc54(0x16a),_0x292887=_0x4dbc54(0x306),_0x44bc16=_0x4dbc54(0xf6),_0x44e9f5=_0x43f933(_0x4dbc54(0x2b5)),_0x4c7fd6=_0x43f933(_0x4dbc54(0x27c)),_0x4921ff=_0x4dbc54(0x35),_0x2ccfd9=function(){return'undefined'!=typeof window&&window['React']?{'useState':window['React']['useState'],'useEffect':window['React']['useEffect'],'useRef':window['React']['useRef']}:{'useState':_0x2ff7dd['default']['useState'],'useEffect':_0x2ff7dd['default']['useEffect'],'useRef':_0x2ff7dd['default']['useRef']};};_0x34cde0['default']=function(_0x4e9711){var _0x2e431a=_0x4e9711['organizationKey'],_0x10a16d=_0x4e9711['position'],_0x13af24=_0x4e9711['onError'],_0x327b23=void 0x0===_0x13af24?console['error']:_0x13af24,_0x4c4e27=_0x2ccfd9()['useState']('idle'),_0x1abe39=_0x4c4e27[0x0],_0x1d0ac8=_0x4c4e27[0x1],_0x1b0095=_0x2ccfd9()['useState'](!0x1),_0x3048ff=_0x1b0095[0x0],_0xc788=_0x1b0095[0x1],_0x2f63fb=_0x2ccfd9()['useState'](_0x10a16d)[0x0],_0xf2cc81=_0x2ccfd9()['useState'](!0x1),_0x476899=_0xf2cc81[0x0],_0x375245=_0xf2cc81[0x1],_0x13e247=_0x2ccfd9()['useState'](!0x1),_0x1fb9eb=_0x13e247[0x0],_0x349c0e=_0x13e247[0x1],_0x5eb795=_0x2ccfd9()['useState'](null),_0x26dd7e=(_0x5eb795[0x0],_0x5eb795[0x1]),_0x59ba3b=_0x2ccfd9()['useState'](!0x1),_0x1c7145=(_0x59ba3b[0x0],_0x59ba3b[0x1]),_0x2bac47=_0x2ccfd9()['useState'](!0x1),_0x38e002=_0x2bac47[0x0],_0x30ea1e=_0x2bac47[0x1],_0x436520=_0x2ccfd9()['useState'](!0x1),_0x44a970=_0x436520[0x0],_0x55d906=_0x436520[0x1],_0x3afcc2=_0x2ccfd9()['useState']('above'),_0x48b8c6=_0x3afcc2[0x0],_0x575d52=_0x3afcc2[0x1],_0x214556=_0x2ccfd9()['useRef'](null),_0x169ccb=_0x2ccfd9()['useRef'](null),_0x4cb120=_0x2ccfd9()['useRef'](null),_0x464cdb=_0x2ccfd9()['useRef'](null),_0x559d2f=_0x2ccfd9()['useRef'](!0x1),_0x108b82=_0x2ccfd9()['useRef'](null),_0x1f3f79=_0x2ccfd9()['useRef'](null),_0x1c0111=_0x2ccfd9()['useState'](null),_0x11a136=_0x1c0111[0x0],_0x5532ea=_0x1c0111[0x1],_0x1f40d2=_0x2ccfd9()['useRef'](!0x1),_0x5d7a1a=_0x2ccfd9()['useState'](!0x1),_0x30995a=_0x5d7a1a[0x0],_0x4426ad=_0x5d7a1a[0x1],_0x2fb92e=_0x2ccfd9()['useState']([]),_0xd52e23=_0x2fb92e[0x0],_0x5d1d35=_0x2fb92e[0x1],_0x4995eb=_0x2ccfd9()['useRef'](!0x1),_0x1dec02=function(_0x48bf28){return _0x198daa(void 0x0,void 0x0,void 0x0,function(){var _0x1fa2f3;return _0x2dfcef(this,function(_0x21ab01){switch(_0x21ab01['label']){case 0x0:return[0x4,fetch(''['concat'](_0x5634d9['GEMINI_API_ENDPOINT'],'?key=')['concat'](_0x5634d9['GEMINI_API_KEY']),{'method':'POST','headers':{'Content-Type':'application/json'},'body':JSON['stringify']({'contents':[{'parts':[{'text':_0x48bf28}]}]})})];case 0x1:return[0x4,_0x21ab01['sent']()['json']()];case 0x2:return _0x1fa2f3=_0x21ab01['sent'](),[0x2,_0x1fa2f3['candidates'][0x0]['content']['parts'][0x0]['text']];}});});},_0x4b6582=function(){return _0x198daa(void 0x0,void 0x0,void 0x0,function(){var _0x13da94;return _0x2dfcef(this,function(_0x86a1e3){switch(_0x86a1e3['label']){case 0x0:return _0x559d2f['current']?[0x2,null]:(_0x559d2f['current']=!0x0,[0x4,(0x0,_0x44bc16['createNewConversation'])(_0x2e431a,_0x327b23)]);case 0x1:return(_0x13da94=_0x86a1e3['sent']())?(_0x214556['current']=_0x13da94['id'],_0x5532ea(_0x13da94['ephemeralToken']),_0x26dd7e(_0x13da94['prompt']),[0x2,_0x13da94]):[0x2,null];}});});},_0xf74383=function(_0x290210,_0x4999fc){return _0x198daa(void 0x0,void 0x0,void 0x0,function(){return _0x2dfcef(this,function(_0x4f7c73){switch(_0x4f7c73['label']){case 0x0:return[0x4,(0x0,_0x44bc16['logMessage'])(_0x290210,_0x4999fc,_0x214556['current'],_0x2e431a,_0x327b23)];case 0x1:return _0x4f7c73['sent'](),[0x2];}});});},_0x572cec=function(_0x27f688){var _0x2df683;'open'===(null===(_0x2df683=_0x464cdb['current'])||void 0x0===_0x2df683?void 0x0:_0x2df683['readyState'])?_0x464cdb['current']['send'](JSON['stringify'](_0x27f688)):(console['error']('Data\x20channel\x20not\x20open,\x20cannot\x20send\x20message'),_0x1d0ac8('idle'));},_0x535615=function(){_0x108b82['current']&&(_0x108b82['current']['getAudioTracks']()['forEach'](function(_0xf020e){_0xf020e['stop']();}),_0x108b82['current']=null),_0x464cdb['current']&&(_0x464cdb['current']['close'](),_0x464cdb['current']=null),_0x4cb120['current']&&(_0x4cb120['current']['close'](),_0x4cb120['current']=null),_0x1f3f79['current']&&(_0x1f3f79['current']['srcObject']=null),_0x1c7145(!0x1);},_0x183782=function(_0x5c9e65){return _0x198daa(void 0x0,void 0x0,void 0x0,function(){var _0x2f07ca,_0x35241d,_0x152571,_0x3fbaf6,_0x329af7,_0x450f0b,_0x124ab2,_0x1c18e7,_0x2eb48b,_0x5a8c44,_0x252973;return _0x2dfcef(this,function(_0x5ebf72){switch(_0x5ebf72['label']){case 0x0:return _0x5ebf72['trys']['push']([0x0,0x8,,0x9]),_0x2f07ca=new RTCPeerConnection(),_0x4cb120['current']=_0x2f07ca,_0x5c9e65['getAudioTracks']()['forEach'](function(_0x2b50ad){_0x2f07ca['addTrack'](_0x2b50ad,_0x5c9e65);}),_0x1f3f79['current']||((_0x35241d=document['createElement']('audio'))['autoplay']=!0x0,document['body']['appendChild'](_0x35241d),_0x1f3f79['current']=_0x35241d),_0x2f07ca['ontrack']=function(_0x239deb){if(_0x1f3f79['current']&&'audio'===_0x239deb['track']['kind']){var _0x130380=new MediaStream([_0x239deb['track']]);_0x1f3f79['current']['srcObject']=_0x130380;}},_0x152571=_0x2f07ca['createDataChannel']('oai-events'),_0x464cdb['current']=_0x152571,_0x152571['onopen']=function(){_0x572cec({'type':'session.update','session':{'tools':[{'type':'function','name':'highlight','description':'Highlight\x20specific\x20elements\x20on\x20the\x20page\x20to\x20guide\x20the\x20user\x27s\x20attention','parameters':{'type':'object','properties':{'selector':{'oneOf':[{'type':'string','description':'CSS\x20selector\x20or\x20XPath\x20for\x20the\x20element\x20to\x20highlight\x20(e.g.,\x20\x27#search-bar\x27)'},{'type':'array','items':{'type':'string'},'description':'List\x20of\x20CSS\x20selectors\x20or\x20XPaths\x20to\x20highlight\x20in\x20sequence\x20(e.g.,\x20[\x27#first-button\x27,\x20\x27#second-button\x27])'}],'description':'CSS\x20selector(s)\x20or\x20XPath(s)\x20for\x20the\x20element(s)\x20to\x20highlight.\x20Can\x20be\x20a\x20single\x20selector\x20string\x20or\x20an\x20array\x20of\x20selectors\x20to\x20process\x20sequentially.'}},'required':['selector']}}],'tool_choice':'auto','turn_detection':{'type':'server_vad','create_response':!0x0,'interrupt_response':!0x1},'input_audio_transcription':{'model':'gpt-4o-mini-transcribe','language':'en','prompt':'The\x20user\x20may\x20say\x20\x27cert\x27\x20often,\x20so\x20make\x20sure\x20to\x20listen\x20for\x20that.'}}});},_0x152571['onmessage']=function(_0x1b3f96){try{var _0x3f583b=JSON['parse'](_0x1b3f96['data']);switch(_0x3f583b['type']){case'session.updated':if(_0x1c7145(!0x0),_0x30ea1e(!0x1),_0xd52e23['length']>0x0){var _0x47fe7f=(0x0,_0x51c9b0['formatConversationContext'])(_0xd52e23);_0x572cec({'type':'conversation.item.create','item':{'type':'message','role':'system','content':[{'type':'input_text','text':_0x47fe7f}]}});}break;case'session.transcript':_0x3f583b['text']&&_0xf74383(_0x3f583b['text'],'HUMAN');break;case'conversation.item.input_audio_transcription.completed':console['log']('User\x20transcript:',_0x3f583b['transcript']),_0xf74383(_0x3f583b['transcript'],'HUMAN');break;case'response.audio_transcript.done':console['log']('Assistant\x20message:',_0x3f583b['transcript']),_0xf74383(_0x3f583b['transcript'],'GUIDEAI');break;case'conversation.item.created':case'response.function_call_arguments.delta':case'response.function_call_arguments.done':break;case'input_audio_buffer.speech_started':case'output_audio_buffer.stopped':_0x1d0ac8('recording');break;case'input_audio_buffer.speech_stopped':_0x1d0ac8('processing');break;case'response.done':for(var _0x3a2ac7=0x0,_0x343495=_0x3f583b['response']['output'];_0x3a2ac7<_0x343495['length'];_0x3a2ac7++){var _0x57ebc=_0x343495[_0x3a2ac7];switch(_0x57ebc['type']){case'message':break;case'function_call':if('highlight'===_0x57ebc['name']&&_0x57ebc['arguments'])try{var _0x4a529d=_0x57ebc['arguments'],_0x4bd16d='\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Validate\x20the\x20following\x20JSON\x20string\x20and\x20return\x20ONLY\x20a\x20correct\x20JSON\x20object:\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Note:\x20The\x20selector(s)\x20should\x20be\x20either\x20a\x20css\x20selector\x20or\x20an\x20xpath,\x20so\x20modify\x20those\x20if\x20invalid.\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Also,\x20[url=\x27\x27]\x20is\x20a\x20valid\x20css\x20selector,\x20so\x20do\x20not\x20modify\x20it\x20if\x20it\x27s\x20present.\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Do\x20not\x20add\x20any\x20other\x20text\x20or\x20newlines\x20to\x20the\x20response.\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20It\x20should\x20be\x20of\x20the\x20following\x20format:\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20{\x20\x22selector\x22:\x20\x22string\x22\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20or\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20{\x20\x22selector\x22:\x20[\x22string\x22,\x20...]\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20DO\x20NOT\x20add\x20any\x20other\x20text\x20or\x20newlines\x20to\x20the\x20response,\x20it\x20should\x20begin\x20and\x20end\x20with\x20curly\x20braces.\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20DO\x20NOT\x20add\x20\x27\x27\x27json\x20to\x20the\x20response.\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20The\x20JSON\x20string\x20is:\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'['concat'](_0x4a529d,'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20');_0x1dec02(_0x4bd16d)['then'](function(_0x1503e7){_0x1503e7=_0x1503e7['replace']('```json','')['replace']('```','')['trim']();var _0x1959ea,_0x2d7602=JSON['parse'](_0x1503e7);_0x1959ea=_0x2d7602['selector'],_0x198daa(void 0x0,void 0x0,void 0x0,function(){return _0x2dfcef(this,function(_0x13c650){return[0x2,(0x0,_0x292887['highlightElement'])(_0x1959ea,_0x476899,_0x375245,_0xf74383)];});});})['catch'](function(_0x3ce749){console['error']('Error\x20calling\x20Gemini:',_0x3ce749);});}catch(_0x6b6c86){console['error']('Error\x20parsing\x20function\x20arguments:',_0x6b6c86),console['log'](_0x57ebc['arguments']),_0xf74383('Error\x20parsing\x20function\x20arguments:\x20'+_0x57ebc['arguments'],'GUIDEAI');}_0x572cec({'type':'conversation.item.create','item':{'type':'function_call_output','call_id':_0x57ebc['call_id'],'output':JSON['stringify'](!0x0)}}),_0x572cec({'type':'response.create'});}}break;case'output_audio_buffer.started':_0x1d0ac8('playing');break;case'error':if('session_expired'===_0x3f583b['error']['code']){console['error']('Session\x20expired:',_0x3f583b),_0x1d0ac8('idle'),_0x30ea1e(!0x1),_0x4426ad(!0x1),_0x5532ea(null),_0x559d2f['current']=!0x1;break;}console['error']('OpenAI\x20API\x20error:',_0x3f583b),_0x327b23(new Error(_0x3f583b['error']['message']||'Unknown\x20API\x20error'),'OpenAI\x20API\x20error'),_0x1d0ac8('idle'),_0x30ea1e(!0x1),_0x4426ad(!0x1),_0x5532ea(null),_0x559d2f['current']=!0x1;break;default:_0x5634d9['IGNORE_MESSAGE_TYPES']['some'](function(_0x331c01){return _0x3f583b['type']['includes'](_0x331c01);})||console['log']('Unhandled:',_0x3f583b['type'],_0x3f583b);}}catch(_0x4364b1){console['error']('Error\x20handling\x20WebRTC\x20message:',_0x4364b1),_0x1d0ac8('idle'),_0x4426ad(!0x1);}},[0x4,_0x2f07ca['createOffer']()];case 0x1:return _0x3fbaf6=_0x5ebf72['sent'](),[0x4,_0x2f07ca['setLocalDescription'](_0x3fbaf6)];case 0x2:if(_0x5ebf72['sent'](),!_0x2f07ca['localDescription']||!_0x2f07ca['localDescription']['sdp'])throw new Error('Failed\x20to\x20create\x20local\x20SDP\x20offer');return _0x329af7=_0x5634d9['OPENAI_REALTIME_BASE'],_0x450f0b=_0x5634d9['OPENAI_REALTIME_MODEL'],[0x4,fetch(''['concat'](_0x329af7,'?model=')['concat'](_0x450f0b),{'method':'POST','body':_0x2f07ca['localDescription']['sdp'],'headers':{'Authorization':'Bearer\x20'['concat'](_0x11a136),'Content-Type':'application/sdp'}})];case 0x3:return(_0x124ab2=_0x5ebf72['sent']())['ok']?[0x3,0x5]:[0x4,_0x124ab2['text']()['catch'](function(){return'No\x20error\x20details\x20available';})];case 0x4:throw _0x1c18e7=_0x5ebf72['sent'](),console['error']('WebRTC\x20connection\x20failed\x20with\x20status:',_0x124ab2['status']),console['error']('Error\x20details:',_0x1c18e7),0x191!==_0x124ab2['status']&&0x193!==_0x124ab2['status']||_0x5532ea(null),new Error('Failed\x20to\x20connect\x20to\x20OpenAI\x20WebRTC:\x20'['concat'](_0x124ab2['status'],'\x20-\x20')['concat'](_0x1c18e7));case 0x5:return[0x4,_0x124ab2['text']()];case 0x6:return _0x2eb48b=_0x5ebf72['sent'](),_0x5a8c44={'type':'answer','sdp':_0x2eb48b},[0x4,_0x2f07ca['setRemoteDescription'](_0x5a8c44)];case 0x7:return _0x5ebf72['sent'](),[0x2,!0x0];case 0x8:return _0x252973=_0x5ebf72['sent'](),console['error']('Error\x20initializing\x20WebRTC:',_0x252973),_0x327b23(_0x252973,'WebRTC\x20initialization\x20failed'),_0x30ea1e(!0x1),[0x2,!0x1];case 0x9:return[0x2];}});});},_0x401ce7=function(){return _0x198daa(void 0x0,void 0x0,void 0x0,function(){var _0xd06e7d,_0x3a26fe,_0x4826b8,_0x57665f;return _0x2dfcef(this,function(_0x364860){switch(_0x364860['label']){case 0x0:return _0x364860['trys']['push']([0x0,0x9,,0xa]),_0x1d0ac8('processing'),_0x4cb120['current']&&'open'===(null===(_0x57665f=_0x464cdb['current'])||void 0x0===_0x57665f?void 0x0:_0x57665f['readyState'])&&_0x108b82['current']?(_0x108b82['current']['getAudioTracks']()['forEach'](function(_0x2b99cc){_0x2b99cc['enabled']=!0x0;}),_0x1d0ac8('recording'),[0x2,!0x0]):[0x3,0x1];case 0x1:_0x535615(),_0x364860['label']=0x2;case 0x2:return _0x364860['trys']['push']([0x2,0x7,,0x8]),_0x30ea1e(!0x0),_0x11a136?[0x3,0x4]:(console['log']('No\x20token\x20available,\x20getting\x20fresh\x20token...'),[0x4,_0x4b6582()]);case 0x3:if(!_0x364860['sent']())return console['error']('Failed\x20to\x20get\x20fresh\x20token'),_0x30ea1e(!0x1),_0x1d0ac8('idle'),[0x2,!0x1];_0x364860['label']=0x4;case 0x4:return[0x4,navigator['mediaDevices']['getUserMedia']({'audio':{'echoCancellation':!0x0,'noiseSuppression':!0x0,'autoGainControl':!0x0,'channelCount':0x1,'sampleRate':0xbb80}})];case 0x5:return _0xd06e7d=_0x364860['sent'](),_0x108b82['current']=_0xd06e7d,[0x4,_0x183782(_0xd06e7d)];case 0x6:return _0x364860['sent']()?(_0x1d0ac8('recording'),[0x2,!0x0]):(_0xd06e7d['getAudioTracks']()['forEach'](function(_0x5c6c22){_0x5c6c22['stop']();}),_0x108b82['current']=null,_0x1d0ac8('idle'),_0x30ea1e(!0x1),[0x2,!0x1]);case 0x7:return _0x3a26fe=_0x364860['sent'](),console['error']('Error\x20during\x20conversation\x20setup:',_0x3a26fe),_0x327b23(_0x3a26fe,'Microphone\x20or\x20WebRTC\x20setup\x20failed'),_0x1d0ac8('idle'),_0x30ea1e(!0x1),[0x2,!0x1];case 0x8:return[0x3,0xa];case 0x9:return _0x4826b8=_0x364860['sent'](),_0x1d0ac8('idle'),_0x30ea1e(!0x1),_0x327b23(_0x4826b8,'Starting\x20conversation\x20failed'),[0x2,!0x1];case 0xa:return[0x2];}});});};if(_0x2ccfd9()['useEffect'](function(){if(!_0x1f40d2['current']){_0x1f40d2['current']=!0x0,(0x0,_0x493d44['injectStyles'])(_0x4921ff['guideAIStyles'],'guide-ai-styles'),_0xc788(!0x0),_0x30ea1e(!0x0);var _0x14e7e0=(0x0,_0x51c9b0['checkForStoredConversation'])(_0x2e431a),_0x4e9017=_0x14e7e0['shouldRestore'],_0x1aa40d=_0x14e7e0['conversationId'],_0x1ab533=_0x14e7e0['messages'];_0x5d1d35(_0x4e9017&&_0x1aa40d&&_0x1ab533?_0x1ab533:[]),_0x4b6582()['then'](function(_0x5977ac){_0x30ea1e(!0x1);})['catch'](function(_0x51f86a){_0x30ea1e(!0x1),console['error']('Failed\x20to\x20create\x20conversation:',_0x51f86a);});var _0x315b5a=localStorage['getItem']('guideAI_hasInteracted');return _0x349c0e(!!_0x315b5a),function(){_0x535615(),_0x1f3f79['current']&&(_0x1f3f79['current']['srcObject']=null,_0x1f3f79['current']['remove'](),_0x1f3f79['current']=null),_0x1f40d2['current']=!0x1,_0x4995eb['current']=!0x1;};}},[_0x2e431a]),_0x2ccfd9()['useEffect'](function(){_0x11a136&&_0xd52e23['length']>0x0&&!_0x4995eb['current']&&(console['log']('Auto-restarting\x20conversation\x20with',_0xd52e23['length'],'restored\x20messages'),_0x4995eb['current']=!0x0,_0x401ce7()['then'](function(_0x3255ba){_0x3255ba&&(_0x4426ad(!0x0),_0x349c0e(!0x0),localStorage['setItem']('guideAI_hasInteracted','true'));}));},[_0x11a136,_0xd52e23]),_0x2ccfd9()['useEffect'](function(){(_0x44a970||!_0x1fb9eb&&_0x11a136)&&_0x575d52(function(_0x396917,_0x380a6a){if(void 0x0===_0x396917&&(_0x396917=0xf0),void 0x0===_0x380a6a&&(_0x380a6a=0xf),!_0x169ccb['current'])return'above';var _0x27a4c1=_0x169ccb['current']['getBoundingClientRect']();return(0x0,_0x493d44['calculateOptimalPosition'])(_0x27a4c1,_0x396917,_0x380a6a);}(_0x44a970?0xf0:0x32,_0x44a970?0x14:0xf));},[_0x44a970,_0x1fb9eb,_0x11a136]),!_0x3048ff)return null;var _0x176898=_0x2f63fb&&Object['keys'](_0x2f63fb)['length']>0x0,_0x211f3b=_0x44cc37({'position':_0x176898?'fixed':'relative','zIndex':_0x176898?0x3e8:'auto'},_0x176898?_0x2f63fb:{});return _0x2ff7dd['default']['createElement'](_0x2ff7dd['default']['Fragment'],null,_0x2ff7dd['default']['createElement']('div',{'ref':_0x169ccb,'style':_0x211f3b},_0x2ff7dd['default']['createElement']('div',{'className':'sarge-main-ui'},!_0x1fb9eb&&_0x11a136&&_0x2ff7dd['default']['createElement'](_0x44e9f5['default'],{'position':_0x48b8c6}),_0x2ff7dd['default']['createElement'](_0x4c7fd6['default'],{'position':_0x48b8c6,'isVisible':_0x44a970,'onComplete':function(){return _0x198daa(void 0x0,void 0x0,void 0x0,function(){return _0x2dfcef(this,function(_0x555eed){switch(_0x555eed['label']){case 0x0:return _0x55d906(!0x1),[0x4,_0x401ce7()];case 0x1:return _0x555eed['sent']()&&_0x4426ad(!0x0),[0x2];}});});},'onClose':function(){_0x55d906(!0x1);}}),_0x2ff7dd['default']['createElement']('div',{'className':'sarge-icon-wrapper\x20'['concat'](_0x38e002?'initializing':_0x1abe39),'onClick':_0x38e002?void 0x0:function(){return _0x198daa(void 0x0,void 0x0,void 0x0,function(){return _0x2dfcef(this,function(_0x52d8fb){switch(_0x52d8fb['label']){case 0x0:return _0x3048ff?_0x1fb9eb?_0x30995a?[0x3,0x2]:[0x4,_0x401ce7()]:(_0x349c0e(!0x0),localStorage['setItem']('guideAI_hasInteracted','true'),_0x55d906(!0x0),[0x2]):[0x2];case 0x1:return _0x52d8fb['sent']()&&_0x4426ad(!0x0),[0x3,0x3];case 0x2:_0x3048ff&&(_0x108b82['current']&&_0x108b82['current']['getAudioTracks']()['forEach'](function(_0x4883b6){_0x4883b6['stop']();}),_0x535615(),_0x1d0ac8('idle'),(0x0,_0x51c9b0['clearConversationStorage'])(),_0x5d1d35([]),_0x4995eb['current']=!0x1),_0x4426ad(!0x1),_0x52d8fb['label']=0x3;case 0x3:return[0x2];}});});},'style':_0x38e002?{'cursor':'default'}:void 0x0,'title':_0x38e002?'Initializing...':'idle'===_0x1abe39?'Click\x20to\x20start\x20a\x20conversation':'recording'===_0x1abe39?'Click\x20to\x20end\x20conversation':'processing'===_0x1abe39?'Processing\x20your\x20message...':'AI\x20is\x20speaking,\x20click\x20to\x20end\x20conversation'},_0x38e002&&_0x2ff7dd['default']['createElement']('i',{'className':'sarge-icon\x20initializing'}),!_0x38e002&&'idle'===_0x1abe39&&_0x2ff7dd['default']['createElement']('i',{'className':'sarge-icon\x20microphone'}),!_0x38e002&&'recording'===_0x1abe39&&_0x2ff7dd['default']['createElement']('i',{'className':'sarge-icon\x20recording'}),!_0x38e002&&'processing'===_0x1abe39&&_0x2ff7dd['default']['createElement']('i',{'className':'sarge-icon\x20processing'}),!_0x38e002&&'playing'===_0x1abe39&&_0x2ff7dd['default']['createElement']('i',{'className':'sarge-icon\x20playing'})))));};},0x16a:(_0x959822,_0x505c5)=>{Object['defineProperty'](_0x505c5,'__esModule',{'value':!0x0}),_0x505c5['calculateOptimalPosition']=_0x505c5['injectStyles']=void 0x0,_0x505c5['injectStyles']=function(_0xd6bdd9,_0x545017){if('undefined'!=typeof document&&!document['getElementById'](_0x545017)){var _0x27d218=document['createElement']('style');_0x27d218['id']=_0x545017,_0x27d218['textContent']=_0xd6bdd9,document['head']['appendChild'](_0x27d218);}},_0x505c5['calculateOptimalPosition']=function(_0x384a46,_0x39659d,_0x5b444e){void 0x0===_0x39659d&&(_0x39659d=0xf0),void 0x0===_0x5b444e&&(_0x5b444e=0xf);var _0x212ac1=window['innerHeight'],_0x4ac0eb=_0x384a46['top'],_0x4b80c6=_0x212ac1-_0x384a46['bottom'];return _0x4b80c6>=_0x39659d+_0x5b444e?'below':_0x4ac0eb>=_0x39659d+_0x5b444e?'above':_0x4b80c6>_0x4ac0eb?'below':'above';};},0x27c:function(_0x247377,_0x38e157,_0x6bc7bf){var _0x5bd1d1,_0x34c102=this&&this['__createBinding']||(Object['create']?function(_0x3848a7,_0x584f38,_0x2fc158,_0x42e9fd){void 0x0===_0x42e9fd&&(_0x42e9fd=_0x2fc158);var _0x58d442=Object['getOwnPropertyDescriptor'](_0x584f38,_0x2fc158);_0x58d442&&!('get'in _0x58d442?!_0x584f38['__esModule']:_0x58d442['writable']||_0x58d442['configurable'])||(_0x58d442={'enumerable':!0x0,'get':function(){return _0x584f38[_0x2fc158];}}),Object['defineProperty'](_0x3848a7,_0x42e9fd,_0x58d442);}:function(_0x1674cf,_0x22fdd9,_0x31dea6,_0x56a2bf){void 0x0===_0x56a2bf&&(_0x56a2bf=_0x31dea6),_0x1674cf[_0x56a2bf]=_0x22fdd9[_0x31dea6];}),_0x2cedcd=this&&this['__setModuleDefault']||(Object['create']?function(_0x5ad709,_0x2b77e4){Object['defineProperty'](_0x5ad709,'default',{'enumerable':!0x0,'value':_0x2b77e4});}:function(_0x57a791,_0xff2b2c){_0x57a791['default']=_0xff2b2c;}),_0x25badd=this&&this['__importStar']||(_0x5bd1d1=function(_0x55230e){return _0x5bd1d1=Object['getOwnPropertyNames']||function(_0x43c101){var _0x3b21ff=[];for(var _0x4a4194 in _0x43c101)Object['prototype']['hasOwnProperty']['call'](_0x43c101,_0x4a4194)&&(_0x3b21ff[_0x3b21ff['length']]=_0x4a4194);return _0x3b21ff;},_0x5bd1d1(_0x55230e);},function(_0x3a97b0){if(_0x3a97b0&&_0x3a97b0['__esModule'])return _0x3a97b0;var _0x1f0984={};if(null!=_0x3a97b0){for(var _0x451e7f=_0x5bd1d1(_0x3a97b0),_0x24eea0=0x0;_0x24eea0<_0x451e7f['length'];_0x24eea0++)'default'!==_0x451e7f[_0x24eea0]&&_0x34c102(_0x1f0984,_0x3a97b0,_0x451e7f[_0x24eea0]);}return _0x2cedcd(_0x1f0984,_0x3a97b0),_0x1f0984;});Object['defineProperty'](_0x38e157,'__esModule',{'value':!0x0});var _0x4c0624=_0x25badd(_0x6bc7bf(0x9c));_0x38e157['default']=function(_0x4988e5){var _0x27aa62=_0x4988e5['position'],_0x46f7d0=_0x4988e5['isVisible'],_0x4116a1=_0x4988e5['onComplete'],_0x54cb40=_0x4988e5['onClose'],_0x416d1c=(0x0,_0x4c0624['useState'])(0x1),_0x4ec5d8=_0x416d1c[0x0],_0x5dd3f6=_0x416d1c[0x1];return _0x46f7d0?_0x4c0624['default']['createElement']('div',{'className':'sarge-onboarding\x20'['concat'](_0x27aa62)},_0x4c0624['default']['createElement']('div',{'className':'sarge-onboarding-content'},_0x4c0624['default']['createElement']('button',{'className':'sarge-onboarding-close','onClick':function(){_0x5dd3f6(0x1),_0x54cb40();}},'×'),0x1===_0x4ec5d8&&_0x4c0624['default']['createElement']('div',{'className':'sarge-onboarding-step'},_0x4c0624['default']['createElement']('div',{'className':'sarge-onboarding-icon\x20volume-icon'},'🔊'),_0x4c0624['default']['createElement']('h3',null,'Turn\x20on\x20your\x20volume'),_0x4c0624['default']['createElement']('p',null,'Make\x20sure\x20your\x20device\x27s\x20volume\x20is\x20turned\x20on\x20so\x20you\x20can\x20hear\x20Guide\x20AI\x27s\x20responses.')),0x2===_0x4ec5d8&&_0x4c0624['default']['createElement']('div',{'className':'sarge-onboarding-step'},_0x4c0624['default']['createElement']('div',{'className':'sarge-onboarding-icon\x20mic-icon'},'🎤'),_0x4c0624['default']['createElement']('h3',null,'Allow\x20microphone\x20access'),_0x4c0624['default']['createElement']('p',null,'When\x20prompted,\x20click\x20\x22Allow\x22\x20to\x20let\x20Guide\x20AI\x20access\x20your\x20microphone.')),0x3===_0x4ec5d8&&_0x4c0624['default']['createElement']('div',{'className':'sarge-onboarding-step'},_0x4c0624['default']['createElement']('div',{'className':'sarge-onboarding-icon\x20ready-icon'},'✅'),_0x4c0624['default']['createElement']('h3',null,'You\x27re\x20all\x20set!'),_0x4c0624['default']['createElement']('p',null,'Click\x20the\x20microphone\x20icon\x20to\x20start\x20asking\x20questions.')),_0x4c0624['default']['createElement']('div',{'className':'sarge-onboarding-dots'},_0x4c0624['default']['createElement']('span',{'className':'dot\x20'['concat'](0x1===_0x4ec5d8?'active':'')}),_0x4c0624['default']['createElement']('span',{'className':'dot\x20'['concat'](0x2===_0x4ec5d8?'active':'')}),_0x4c0624['default']['createElement']('span',{'className':'dot\x20'['concat'](0x3===_0x4ec5d8?'active':'')})),_0x4c0624['default']['createElement']('button',{'className':'sarge-onboarding-next','onClick':function(){_0x4ec5d8<0x3?_0x5dd3f6(_0x4ec5d8+0x1):(_0x5dd3f6(0x1),_0x4116a1());}},_0x4ec5d8<0x3?'Next':'Get\x20Started'))):null;};},0x2b5:function(_0x2ae1f6,_0x272c94,_0x1fc013){var _0x2b4a35=this&&this['__importDefault']||function(_0x195ef2){return _0x195ef2&&_0x195ef2['__esModule']?_0x195ef2:{'default':_0x195ef2};};Object['defineProperty'](_0x272c94,'__esModule',{'value':!0x0});var _0x32784d=_0x2b4a35(_0x1fc013(0x9c));_0x272c94['default']=function(_0x379054){var _0x2b3bf3=_0x379054['position'];return _0x32784d['default']['createElement']('div',{'className':'sarge-welcome-bubble\x20'['concat'](_0x2b3bf3)},'Stuck?\x20Click\x20here\x20and\x20ask\x20me\x20a\x20question');};},0x306:function(_0x4f61a3,_0x68717e){var _0x12a82c=this&&this['__awaiter']||function(_0x17ea6a,_0x480a9c,_0x336f21,_0x4b3ace){return new(_0x336f21||(_0x336f21=Promise))(function(_0xc1b2d,_0x13e2c5){function _0x4088ac(_0x43faad){try{_0x44614d(_0x4b3ace['next'](_0x43faad));}catch(_0x3499f1){_0x13e2c5(_0x3499f1);}}function _0x38caef(_0x42f7cb){try{_0x44614d(_0x4b3ace['throw'](_0x42f7cb));}catch(_0xd6dddf){_0x13e2c5(_0xd6dddf);}}function _0x44614d(_0x31afc4){var _0x55876c;_0x31afc4['done']?_0xc1b2d(_0x31afc4['value']):(_0x55876c=_0x31afc4['value'],_0x55876c instanceof _0x336f21?_0x55876c:new _0x336f21(function(_0x310b51){_0x310b51(_0x55876c);}))['then'](_0x4088ac,_0x38caef);}_0x44614d((_0x4b3ace=_0x4b3ace['apply'](_0x17ea6a,_0x480a9c||[]))['next']());});},_0xdb295e=this&&this['__generator']||function(_0x5c8969,_0x5368ae){var _0x4c5b1f,_0xc05674,_0x8e46b6,_0x4e4a7a={'label':0x0,'sent':function(){if(0x1&_0x8e46b6[0x0])throw _0x8e46b6[0x1];return _0x8e46b6[0x1];},'trys':[],'ops':[]},_0x4dc6d0=Object['create'](('function'==typeof Iterator?Iterator:Object)['prototype']);return _0x4dc6d0['next']=_0x3ce03b(0x0),_0x4dc6d0['throw']=_0x3ce03b(0x1),_0x4dc6d0['return']=_0x3ce03b(0x2),'function'==typeof Symbol&&(_0x4dc6d0[Symbol['iterator']]=function(){return this;}),_0x4dc6d0;function _0x3ce03b(_0x5a8cec){return function(_0x3e77d3){return function(_0x41c1d7){if(_0x4c5b1f)throw new TypeError('Generator\x20is\x20already\x20executing.');for(;_0x4dc6d0&&(_0x4dc6d0=0x0,_0x41c1d7[0x0]&&(_0x4e4a7a=0x0)),_0x4e4a7a;)try{if(_0x4c5b1f=0x1,_0xc05674&&(_0x8e46b6=0x2&_0x41c1d7[0x0]?_0xc05674['return']:_0x41c1d7[0x0]?_0xc05674['throw']||((_0x8e46b6=_0xc05674['return'])&&_0x8e46b6['call'](_0xc05674),0x0):_0xc05674['next'])&&!(_0x8e46b6=_0x8e46b6['call'](_0xc05674,_0x41c1d7[0x1]))['done'])return _0x8e46b6;switch(_0xc05674=0x0,_0x8e46b6&&(_0x41c1d7=[0x2&_0x41c1d7[0x0],_0x8e46b6['value']]),_0x41c1d7[0x0]){case 0x0:case 0x1:_0x8e46b6=_0x41c1d7;break;case 0x4:return _0x4e4a7a['label']++,{'value':_0x41c1d7[0x1],'done':!0x1};case 0x5:_0x4e4a7a['label']++,_0xc05674=_0x41c1d7[0x1],_0x41c1d7=[0x0];continue;case 0x7:_0x41c1d7=_0x4e4a7a['ops']['pop'](),_0x4e4a7a['trys']['pop']();continue;default:if(!((_0x8e46b6=(_0x8e46b6=_0x4e4a7a['trys'])['length']>0x0&&_0x8e46b6[_0x8e46b6['length']-0x1])||0x6!==_0x41c1d7[0x0]&&0x2!==_0x41c1d7[0x0])){_0x4e4a7a=0x0;continue;}if(0x3===_0x41c1d7[0x0]&&(!_0x8e46b6||_0x41c1d7[0x1]>_0x8e46b6[0x0]&&_0x41c1d7[0x1]<_0x8e46b6[0x3])){_0x4e4a7a['label']=_0x41c1d7[0x1];break;}if(0x6===_0x41c1d7[0x0]&&_0x4e4a7a['label']<_0x8e46b6[0x1]){_0x4e4a7a['label']=_0x8e46b6[0x1],_0x8e46b6=_0x41c1d7;break;}if(_0x8e46b6&&_0x4e4a7a['label']<_0x8e46b6[0x2]){_0x4e4a7a['label']=_0x8e46b6[0x2],_0x4e4a7a['ops']['push'](_0x41c1d7);break;}_0x8e46b6[0x2]&&_0x4e4a7a['ops']['pop'](),_0x4e4a7a['trys']['pop']();continue;}_0x41c1d7=_0x5368ae['call'](_0x5c8969,_0x4e4a7a);}catch(_0x2b7cdd){_0x41c1d7=[0x6,_0x2b7cdd],_0xc05674=0x0;}finally{_0x4c5b1f=_0x8e46b6=0x0;}if(0x5&_0x41c1d7[0x0])throw _0x41c1d7[0x1];return{'value':_0x41c1d7[0x0]?_0x41c1d7[0x1]:void 0x0,'done':!0x0};}([_0x5a8cec,_0x3e77d3]);};}};Object['defineProperty'](_0x68717e,'__esModule',{'value':!0x0}),_0x68717e['highlightElement']=_0x68717e['clickElement']=void 0x0,_0x68717e['clickElement']=function(_0x3fa4dd,_0x3fdae3){return _0x12a82c(void 0x0,void 0x0,void 0x0,function(){return _0xdb295e(this,function(_0x1ba325){return[0x2,new Promise(function(_0x3122e2){setTimeout(function(){var _0x34da6b=document['createElement']('div');_0x34da6b['style']['cssText']='\x0a\x20\x20\x20\x20\x20\x20\x20\x20position:\x20fixed;\x0a\x20\x20\x20\x20\x20\x20\x20\x20left:\x20'['concat'](_0x3fdae3['left']+_0x3fdae3['width']/0x2,'px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20top:\x20')['concat'](_0x3fdae3['top']+_0x3fdae3['height']/0x2,'px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20width:\x2060px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20height:\x2060px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20z-index:\x201000;\x0a\x20\x20\x20\x20\x20\x20\x20\x20pointer-events:\x20none;\x0a\x20\x20\x20\x20\x20\x20\x20\x20transform:\x20translate(-50%,\x20-50%);\x0a\x20\x20\x20\x20\x20\x20'),document['body']['appendChild'](_0x34da6b);for(var _0x5197d4=0x0;_0x5197d4<0x3;_0x5197d4++){var _0x320c1c=document['createElement']('div');_0x320c1c['style']['cssText']='\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20position:\x20absolute;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20left:\x2050%;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20top:\x2050%;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20width:\x2040px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20height:\x2040px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20border:\x202px\x20solid\x20rgba(0,\x20102,\x20255,\x20'['concat'](0.7-0.2*_0x5197d4,');\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20border-radius:\x2050%;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20transform:\x20translate(-50%,\x20-50%)\x20scale(0);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20opacity:\x201;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20animation:\x20click-ripple-animation\x200.8s\x20ease-out\x20')['concat'](0.15*_0x5197d4,'s\x20forwards;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20box-shadow:\x200\x200\x208px\x20rgba(0,\x20102,\x20255,\x200.4);\x0a\x20\x20\x20\x20\x20\x20\x20\x20'),_0x34da6b['appendChild'](_0x320c1c);}var _0x4be519=document['createElement']('div');_0x4be519['style']['cssText']='\x0a\x20\x20\x20\x20\x20\x20\x20\x20position:\x20absolute;\x0a\x20\x20\x20\x20\x20\x20\x20\x20left:\x2050%;\x0a\x20\x20\x20\x20\x20\x20\x20\x20top:\x2050%;\x0a\x20\x20\x20\x20\x20\x20\x20\x20width:\x2012px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20height:\x2012px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20background:\x20rgba(0,\x20102,\x20255,\x200.9);\x0a\x20\x20\x20\x20\x20\x20\x20\x20border-radius:\x2050%;\x0a\x20\x20\x20\x20\x20\x20\x20\x20transform:\x20translate(-50%,\x20-50%)\x20scale(0);\x0a\x20\x20\x20\x20\x20\x20\x20\x20animation:\x20click-dot-animation\x200.4s\x20ease-out\x20forwards;\x0a\x20\x20\x20\x20\x20\x20\x20\x20box-shadow:\x200\x200\x205px\x20rgba(0,\x20102,\x20255,\x200.8);\x0a\x20\x20\x20\x20\x20\x20',_0x34da6b['appendChild'](_0x4be519);var _0x2c620f=new MouseEvent('click',{'view':window,'bubbles':!0x0,'cancelable':!0x0}),_0x2c0a01=_0x3fa4dd['querySelectorAll']('a,\x20button,\x20input[type=\x22button\x22],\x20input[type=\x22submit\x22]'),_0x1ed944=_0x2c0a01['length']>0x0?_0x2c0a01[0x0]:_0x3fa4dd;console['log']('Clicking\x20element:',_0x1ed944),_0x1ed944['dispatchEvent'](_0x2c620f);var _0x21c362=_0x1ed944['style']['boxShadow'],_0x5dd30f=_0x1ed944['style']['transition'],_0x29edc2=_0x1ed944['style']['zIndex'];_0x1ed944['style']['transition']='all\x200.3s\x20ease-out',_0x1ed944['style']['boxShadow']='0\x200\x200\x202px\x20rgba(0,\x20102,\x20255,\x200.5),\x200\x200\x2010px\x20rgba(0,\x20102,\x20255,\x200.3)',_0x1ed944['style']['zIndex']='999',setTimeout(function(){_0x1ed944['style']['boxShadow']=_0x21c362,_0x1ed944['style']['transition']=_0x5dd30f,_0x1ed944['style']['zIndex']=_0x29edc2,_0x34da6b['remove'](),_0x3122e2();},0x3e8);},0x5dc);})];});});},_0x68717e['highlightElement']=function(_0x4fc691,_0x1e0cb5,_0x12c7de,_0x5899d2){return _0x12a82c(void 0x0,void 0x0,void 0x0,function(){var _0x3a081c,_0x5ebbdc,_0x4999f4,_0xdfcb21,_0x4719a0;return _0xdb295e(this,function(_0x214dca){switch(_0x214dca['label']){case 0x0:if(_0x1e0cb5)return[0x2,!0x1];if(0x0===(_0x3a081c=Array['isArray'](_0x4fc691)?_0x4fc691:[_0x4fc691])['length'])return[0x2,!0x1];console['log']('Moving\x20cursor\x20to\x20elements:',_0x3a081c),_0x5ebbdc=null,_0x214dca['label']=0x1;case 0x1:_0x214dca['trys']['push']([0x1,0x6,,0x7]),_0x12c7de(!0x0),_0x4999f4=function(_0x50dbf8){var _0x259358,_0x3485ce,_0x5db4db,_0x3a66ff,_0x5e8002,_0x15388f;return _0xdb295e(this,function(_0x32d56e){switch(_0x32d56e['label']){case 0x0:return _0x259358=_0x3a081c[_0x50dbf8],_0x50dbf8>0x0?[0x4,new Promise(function(_0x4134db){return setTimeout(_0x4134db,0x3e8);})]:[0x3,0x2];case 0x1:_0x32d56e['sent'](),_0x32d56e['label']=0x2;case 0x2:if(_0x3485ce=void 0x0,_0x259358['startsWith']('//')){if(!((_0x5db4db=document['evaluate'](_0x259358,document,null,XPathResult['FIRST_ORDERED_NODE_TYPE'],null)['singleNodeValue'])instanceof Element))return console['log']('XPath\x20returned\x20a\x20non-Element\x20node:',_0x259358),console['log'](_0x5db4db),_0x5899d2('XPath\x20returned\x20a\x20non-Element\x20node:\x20'+_0x259358,'GUIDEAI'),[0x2,'break'];_0x3485ce=_0x5db4db;}else _0x3485ce=document['querySelector'](_0x259358);return _0x3485ce?(_0x3a66ff=_0x3485ce['getBoundingClientRect'](),_0x5ebbdc||((_0x5ebbdc=document['createElement']('div'))['id']='guide-ai-cursor',_0x5ebbdc['innerHTML']='\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<svg\x20width=\x22100%\x22\x20height=\x22100%\x22\x20viewBox=\x220\x200\x2024\x2024\x22\x20xmlns=\x22http://www.w3.org/2000/svg\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<path\x20fill=\x22#0066ff\x22\x20d=\x22M7,2l12,11.2l-5.8,0.5l3.3,7.3l-2.2,1l-3.2-7.4L7,18.5V2\x22\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</svg>\x0a\x20\x20\x20\x20\x20\x20\x20\x20',_0x5ebbdc['style']['cssText']='\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20position:\x20fixed;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20width:\x2064px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20height:\x2064px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20pointer-events:\x20none;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20z-index:\x209999;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20transition:\x20all\x200.8s\x20ease-in-out;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20transform:\x20translate(-50%,\x200);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20filter:\x20drop-shadow(0\x200\x204px\x20rgba(0,\x20102,\x20255,\x200.8));\x0a\x20\x20\x20\x20\x20\x20\x20\x20',document['body']['appendChild'](_0x5ebbdc),_0x5e8002=window['innerWidth'],_0x15388f=window['innerHeight'],_0x5ebbdc['style']['left']=''['concat'](_0x5e8002/0x2,'px'),_0x5ebbdc['style']['top']=''['concat'](_0x15388f/0x2,'px')),_0x5ebbdc['offsetHeight'],[0x4,new Promise(function(_0x46e429){setTimeout(function(){_0x5ebbdc['style']['left']=''['concat'](_0x3a66ff['left']+_0x3a66ff['width']/0x2,'px'),_0x5ebbdc['style']['top']=''['concat'](_0x3a66ff['top']+_0x3a66ff['height']/0x2-0xa,'px'),setTimeout(function(){_0x5ebbdc['style']['animation']='cursor-jiggle\x200.5s\x20ease-in-out\x20infinite',_0x46e429();},0x320);},0x64);})]):(console['log']('Element\x20not\x20found:',_0x259358),_0x5899d2('Element\x20not\x20found:\x20'+_0x259358,'GUIDEAI'),[0x2,'break']);case 0x3:return _0x32d56e['sent'](),[0x4,(0x0,_0x68717e['clickElement'])(_0x3485ce,_0x3a66ff)];case 0x4:return _0x32d56e['sent'](),[0x2];}});},_0xdfcb21=0x0,_0x214dca['label']=0x2;case 0x2:return _0xdfcb21<_0x3a081c['length']?[0x5,_0x4999f4(_0xdfcb21)]:[0x3,0x5];case 0x3:if('break'===_0x214dca['sent']())return[0x3,0x5];_0x214dca['label']=0x4;case 0x4:return _0xdfcb21++,[0x3,0x2];case 0x5:return setTimeout(function(){null==_0x5ebbdc||_0x5ebbdc['remove'](),_0x12c7de(!0x1);},0x3e8),[0x2,!0x0];case 0x6:return _0x4719a0=_0x214dca['sent'](),console['error']('Error\x20moving\x20cursor:',_0x4719a0),null==_0x5ebbdc||_0x5ebbdc['remove'](),_0x12c7de(!0x1),[0x2,!0x1];case 0x7:return[0x2];}});});};}},_0x2923ac={},_0x5d9d4b=function _0xa0af58(_0x34c4fb){var _0x6c8841=_0x2923ac[_0x34c4fb];if(void 0x0!==_0x6c8841)return _0x6c8841['exports'];var _0x1cd7ca=_0x2923ac[_0x34c4fb]={'exports':{}};return _0x282ab6[_0x34c4fb]['call'](_0x1cd7ca['exports'],_0x1cd7ca,_0x1cd7ca['exports'],_0xa0af58),_0x1cd7ca['exports'];}(0x102);return _0x5d9d4b['default'];})()));
|
package/dist/GuideAI.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GuideAI.js","mappings":"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","sources":["webpack://GuideAI/webpack/universalModuleDefinition","webpack://GuideAI/./src/styles/GuideAI.styles.ts","webpack://GuideAI/./src/utils/messageStorage.ts","webpack://GuideAI/./src/utils/constants.ts","webpack://GuideAI/external umd {\"commonjs\":\"react\",\"commonjs2\":\"react\",\"amd\":\"React\",\"root\":\"React\"}","webpack://GuideAI/./src/utils/api.ts","webpack://GuideAI/./src/GuideAI.tsx","webpack://GuideAI/./src/utils/ui.ts","webpack://GuideAI/./src/components/Onboarding.tsx","webpack://GuideAI/./src/components/WelcomeBubble.tsx","webpack://GuideAI/./src/utils/highlight.ts","webpack://GuideAI/webpack/bootstrap","webpack://GuideAI/webpack/startup"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"react\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"React\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"GuideAI\"] = factory(require(\"react\"));\n\telse\n\t\troot[\"GuideAI\"] = factory(root[\"React\"]);\n})(this, (__WEBPACK_EXTERNAL_MODULE__156__) => {\nreturn ","export const guideAIStyles = `\n.sarge-main-ui {\n position: relative;\n}\n\n.sarge-welcome-bubble {\n position: absolute;\n left: 50%;\n transform: translateX(-50%);\n background: #0066ff;\n color: white;\n padding: 10px 16px;\n border-radius: 20px;\n font-size: 14px;\n white-space: normal;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);\n animation: bubble-pulse 2s infinite;\n max-width: 280px;\n min-width: 200px;\n text-align: center;\n line-height: 1.3;\n}\n\n.sarge-welcome-bubble.above {\n bottom: calc(100% + 10px);\n}\n\n.sarge-welcome-bubble.below {\n top: calc(100% + 10px);\n}\n\n.sarge-welcome-bubble.above::after {\n content: '';\n position: absolute;\n top: 100%;\n left: 50%;\n transform: translateX(-50%);\n border-left: 8px solid transparent;\n border-right: 8px solid transparent;\n border-top: 8px solid #0066ff;\n}\n\n.sarge-welcome-bubble.below::after {\n content: '';\n position: absolute;\n bottom: 100%;\n left: 50%;\n transform: translateX(-50%);\n border-left: 8px solid transparent;\n border-right: 8px solid transparent;\n border-bottom: 8px solid #0066ff;\n}\n\n@keyframes bubble-pulse {\n 0% { transform: translateX(-50%) scale(1); }\n 50% { transform: translateX(-50%) scale(1.05); }\n 100% { transform: translateX(-50%) scale(1); }\n}\n\n.sarge-icon-wrapper {\n width: 100%;\n height: 100%;\n min-width: 30px;\n min-height: 30px;\n max-width: 60px;\n max-height: 60px;\n display: flex;\n justify-content: center;\n align-items: center;\n background-color: rgba(255, 255, 255, 0.9);\n border-radius: 50%;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.sarge-icon-wrapper:not(.initializing):hover {\n transform: scale(1.1);\n}\n\n.sarge-icon-wrapper.initializing {\n background-color: rgba(255, 255, 255, 0.9);\n box-shadow: 0 0 0 2px rgba(128, 128, 128, 0.5), 0 2px 8px rgba(0, 0, 0, 0.3);\n animation: sarge-spin 1.5s linear infinite;\n opacity: 0.7;\n cursor: default;\n}\n\n.sarge-icon-wrapper.recording {\n background-color: rgba(255, 255, 255, 0.9);\n box-shadow: 0 0 0 2px rgba(255, 0, 0, 0.5), 0 2px 8px rgba(0, 0, 0, 0.3);\n animation: sarge-pulse 1s infinite alternate;\n}\n\n.sarge-icon-wrapper.processing {\n background-color: rgba(255, 255, 255, 0.9);\n box-shadow: 0 0 0 2px rgba(255, 165, 0, 0.5), 0 2px 8px rgba(0, 0, 0, 0.3);\n animation: sarge-spin 1s linear infinite;\n}\n\n.sarge-icon-wrapper.playing {\n background-color: rgba(255, 255, 255, 0.9);\n box-shadow: 0 0 0 2px rgba(0, 128, 0, 0.5), 0 2px 8px rgba(0, 0, 0, 0.3);\n}\n\n@keyframes sarge-pulse {\n 0% { transform: scale(1); }\n 100% { transform: scale(1.05); }\n}\n\n@keyframes sarge-spin {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n}\n\n@keyframes click-ripple-animation {\n 0% { transform: translate(-50%, -50%) scale(0); opacity: 1; }\n 50% { transform: translate(-50%, -50%) scale(1.2); opacity: 0.6; }\n 100% { transform: translate(-50%, -50%) scale(2.5); opacity: 0; }\n}\n\n@keyframes click-dot-animation {\n 0% { transform: translate(-50%, -50%) scale(0); opacity: 1; }\n 60% { transform: translate(-50%, -50%) scale(1); opacity: 1; }\n 100% { transform: translate(-50%, -50%) scale(1); opacity: 0; }\n}\n\n@keyframes cursor-jiggle {\n 0% { transform: translate(-50%, 0) scale(1); }\n 25% { transform: translate(-50%, -5px) scale(1.1); }\n 50% { transform: translate(-50%, 0) scale(1); }\n 75% { transform: translate(-50%, 5px) scale(1.1); }\n 100% { transform: translate(-50%, 0) scale(1); filter: drop-shadow(0 0 8px #0066ff); }\n}\n\n.sarge-icon {\n width: 60%;\n height: 60%;\n min-width: 16px;\n min-height: 16px;\n max-width: 40px;\n max-height: 40px;\n background-size: contain;\n background-repeat: no-repeat;\n background-position: center;\n}\n\n.sarge-icon.initializing {\n background-image: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"><path fill=\"%23808080\" d=\"M304 48c0 26.51-21.49 48-48 48s-48-21.49-48-48 21.49-48 48-48 48 21.49 48 48zm-48 368c-26.51 0-48 21.49-48 48s21.49 48 48 48 48-21.49 48-48-21.49-48-48-48zm208-208c-26.51 0-48 21.49-48 48s21.49 48 48 48 48-21.49 48-48-21.49-48-48-48zM96 256c0-26.51-21.49-48-48-48S0 229.49 0 256s21.49 48 48 48 48-21.49 48-48zm12.922 99.078c-26.51 0-48 21.49-48 48s21.49 48 48 48 48-21.49 48-48c0-26.509-21.491-48-48-48zm294.156 0c-26.51 0-48 21.49-48 48s21.49 48 48 48 48-21.49 48-48c0-26.509-21.49-48-48-48zM108.922 60.922c-26.51 0-48 21.49-48 48s21.49 48 48 48 48-21.49 48-48-21.491-48-48-48z\"/></svg>');\n}\n\n.sarge-icon.microphone {\n background-image: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 352 512\"><path fill=\"%230000FF\" d=\"M176 352c53.02 0 96-42.98 96-96V96c0-53.02-42.98-96-96-96S80 42.98 80 96v160c0 53.02 42.98 96 96 96zm160-160h-16c-8.84 0-16 7.16-16 16v48c0 74.8-64.49 134.82-140.79 127.38C96.71 376.89 48 317.11 48 250.3V208c0-8.84-7.16-16-16-16H16c-8.84 0-16 7.16-16 16v40.16c0 89.64 63.97 169.55 152 181.69V464H96c-8.84 0-16 7.16-16 16v16c0 8.84 7.16 16 16 16h160c8.84 0 16-7.16 16-16v-16c0-8.84-7.16-16-16-16h-56v-33.77C285.71 418.47 352 344.9 352 256v-48c0-8.84-7.16-16-16-16z\"/></svg>');\n}\n\n.sarge-icon.recording {\n background-image: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"><circle cx=\"256\" cy=\"256\" r=\"128\" fill=\"%23FF0000\"/><circle cx=\"256\" cy=\"256\" r=\"200\" stroke=\"%23FF0000\" stroke-width=\"20\" fill=\"none\"/></svg>');\n}\n\n.sarge-icon.processing {\n background-image: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"><path fill=\"%23FFA500\" d=\"M304 48c0 26.51-21.49 48-48 48s-48-21.49-48-48 21.49-48 48-48 48 21.49 48 48zm-48 368c-26.51 0-48 21.49-48 48s21.49 48 48 48 48-21.49 48-48-21.49-48-48-48zm208-208c-26.51 0-48 21.49-48 48s21.49 48 48 48 48-21.49 48-48-21.49-48-48-48zM96 256c0-26.51-21.49-48-48-48S0 229.49 0 256s21.49 48 48 48 48-21.49 48-48zm12.922 99.078c-26.51 0-48 21.49-48 48s21.49 48 48 48 48-21.49 48-48c0-26.509-21.491-48-48-48zm294.156 0c-26.51 0-48 21.49-48 48s21.49 48 48 48 48-21.49 48-48c0-26.509-21.49-48-48-48zM108.922 60.922c-26.51 0-48 21.49-48 48s21.49 48 48 48 48-21.49 48-48-21.491-48-48-48z\"/></svg>');\n}\n\n.sarge-icon.playing {\n background-image: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path fill=\"%23008000\" d=\"M3 9v6h4l5 5V4L7 9H3zm13.5 3c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02zM14 3.23v2.06c2.89.86 5 3.54 5 6.71s-2.11 5.85-5 6.71v2.06c4.01-.91 7-4.49 7-8.77s-2.99-7.86-7-8.77z\"/></svg>');\n}\n\n/* Onboarding styles */\n.sarge-onboarding {\n position: absolute;\n left: 50%;\n transform: translateX(-50%);\n background: white;\n border-radius: 12px;\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);\n width: 300px;\n max-width: 90vw;\n z-index: 1002;\n animation: onboarding-fade-in 0.3s ease-out;\n}\n\n.sarge-onboarding.above {\n bottom: calc(100% + 15px);\n}\n\n.sarge-onboarding.below {\n top: calc(100% + 15px);\n}\n\n.sarge-onboarding.above::after {\n content: '';\n position: absolute;\n top: 100%;\n left: 50%;\n transform: translateX(-50%);\n border-left: 8px solid transparent;\n border-right: 8px solid transparent;\n border-top: 8px solid white;\n filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.1));\n}\n\n.sarge-onboarding.below::after {\n content: '';\n position: absolute;\n bottom: 100%;\n left: 50%;\n transform: translateX(-50%);\n border-left: 8px solid transparent;\n border-right: 8px solid transparent;\n border-bottom: 8px solid white;\n filter: drop-shadow(0 -2px 4px rgba(0, 0, 0, 0.1));\n}\n\n@keyframes onboarding-fade-in {\n from { opacity: 0; transform: translateX(-50%) translateY(-10px); }\n to { opacity: 1; transform: translateX(-50%) translateY(0); }\n}\n\n.sarge-onboarding-content {\n padding: 16px;\n position: relative;\n}\n\n.sarge-onboarding-close {\n position: absolute;\n top: 10px;\n right: 10px;\n background: none;\n border: none;\n font-size: 20px;\n cursor: pointer;\n color: #999;\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 50%;\n}\n\n.sarge-onboarding-close:hover {\n background: #f5f5f5;\n color: #333;\n}\n\n.sarge-onboarding-step {\n text-align: center;\n margin-bottom: 12px;\n}\n\n.sarge-onboarding-icon {\n font-size: 32px;\n margin-bottom: 8px;\n display: inline-block;\n}\n\n.sarge-onboarding-step h3 {\n margin: 0 0 8px;\n font-size: 16px;\n color: #333;\n font-weight: 600;\n}\n\n.sarge-onboarding-step p {\n margin: 0;\n font-size: 13px;\n color: #666;\n line-height: 1.4;\n}\n\n.sarge-onboarding-dots {\n display: flex;\n justify-content: center;\n margin: 12px 0;\n}\n\n.sarge-onboarding-dots .dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background: #ddd;\n margin: 0 4px;\n transition: all 0.3s ease;\n}\n\n.sarge-onboarding-dots .dot.active {\n background: #0066ff;\n transform: scale(1.2);\n}\n\n.sarge-onboarding-next {\n display: block;\n width: 100%;\n padding: 10px;\n background: #0066ff;\n color: white;\n border: none;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.2s ease;\n}\n\n.sarge-onboarding-next:hover {\n background: #0055cc;\n}\n`; ","// Storage data structures for conversation persistence\nexport interface StoredMessage {\n content: string;\n sender: 'GUIDEAI' | 'HUMAN';\n timestamp: number;\n}\n\nexport interface StoredConversation {\n conversationId: string;\n messages: StoredMessage[];\n timestamp: number;\n organizationKey: string;\n}\n\nexport const CONVERSATION_STORAGE_KEY = 'guideai_conversation';\nexport const CONVERSATION_EXPIRY_MINUTES = 30;\nexport const MAX_STORED_MESSAGES = 50;\n\nexport const isLocalStorageAvailable = (): boolean => {\n try {\n const testKey = '__storage_test__';\n localStorage.setItem(testKey, testKey);\n localStorage.removeItem(testKey);\n return true;\n } catch (e) {\n return false;\n }\n};\n\nconst isValidConversation = (data: any): data is StoredConversation => {\n return (\n data &&\n typeof data === 'object' &&\n typeof data.conversationId === 'string' &&\n Array.isArray(data.messages) &&\n typeof data.timestamp === 'number' &&\n typeof data.organizationKey === 'string' &&\n data.messages.every((msg: any) => (\n typeof msg === 'object' &&\n typeof msg.content === 'string' &&\n (msg.sender === 'HUMAN' || msg.sender === 'GUIDEAI') &&\n typeof msg.timestamp === 'number'\n ))\n );\n};\n\nexport const isConversationExpired = (conversation: StoredConversation): boolean => {\n const expiryTime = CONVERSATION_EXPIRY_MINUTES * 60 * 1000; // convert to milliseconds\n const now = Date.now();\n return (now - conversation.timestamp) > expiryTime;\n};\n\nconst handleStorageError = (error: unknown, operation: string): void => {\n console.error(`Storage error during ${operation}:`, error);\n \n // Check if it's a quota exceeded error\n if (error instanceof DOMException && \n (error.name === 'QuotaExceededError' || \n error.name === 'NS_ERROR_DOM_QUOTA_REACHED')) {\n \n // Try to free up space by removing oldest messages instead of clearing everything\n try {\n const conversation = loadConversationFromStorage();\n if (conversation && conversation.messages.length > 5) {\n // Remove oldest 5 messages\n conversation.messages = conversation.messages.slice(5);\n saveConversationToStorage(conversation);\n console.warn('Storage quota exceeded. Removed oldest 5 messages to free space.');\n } else if (conversation) {\n // If less than 5 messages, clear everything\n clearConversationStorage();\n console.warn('Storage quota exceeded. Cleared conversation data.');\n }\n } catch (cleanupError) {\n console.error('Failed to clean up storage:', cleanupError);\n }\n }\n};\n\nexport const saveConversationToStorage = (conversation: StoredConversation): void => {\n if (!isLocalStorageAvailable()) {\n console.warn('localStorage is not available. Conversation persistence disabled.');\n return;\n }\n \n try {\n // Limit to last MAX_STORED_MESSAGES\n if (conversation.messages.length > MAX_STORED_MESSAGES) {\n conversation.messages = conversation.messages.slice(-MAX_STORED_MESSAGES);\n }\n \n // Update timestamp\n conversation.timestamp = Date.now();\n \n localStorage.setItem(CONVERSATION_STORAGE_KEY, JSON.stringify(conversation));\n } catch (error) {\n handleStorageError(error, 'save');\n }\n};\n\nexport const loadConversationFromStorage = (): StoredConversation | null => {\n if (!isLocalStorageAvailable()) {\n console.warn('localStorage is not available. Conversation persistence disabled.');\n return null;\n }\n \n try {\n const storedData = localStorage.getItem(CONVERSATION_STORAGE_KEY);\n if (!storedData) return null;\n \n const parsedData = JSON.parse(storedData);\n \n // Validate the data structure\n if (!isValidConversation(parsedData)) {\n console.warn('Corrupted conversation data found. Clearing storage.');\n clearConversationStorage();\n return null;\n }\n \n return parsedData;\n } catch (error) {\n handleStorageError(error, 'load');\n // Clear corrupted data on any parsing errors\n clearConversationStorage();\n return null;\n }\n};\n\nexport const clearConversationStorage = (): void => {\n if (!isLocalStorageAvailable()) {\n return;\n }\n \n try {\n localStorage.removeItem(CONVERSATION_STORAGE_KEY);\n } catch (error) {\n handleStorageError(error, 'clear');\n }\n};\n\nexport const addMessageToStorage = (message: StoredMessage, conversationId: string, organizationKey: string): void => {\n if (!isLocalStorageAvailable()) {\n console.warn('localStorage is not available. Message persistence disabled.');\n return;\n }\n \n try {\n let conversation = loadConversationFromStorage();\n \n if (!conversation) {\n conversation = {\n conversationId,\n messages: [],\n timestamp: Date.now(),\n organizationKey\n };\n }\n \n conversation.messages.push(message);\n conversation.conversationId = conversationId;\n conversation.organizationKey = organizationKey;\n \n saveConversationToStorage(conversation);\n } catch (error) {\n console.error('Error adding message to storage:', error);\n }\n};\n\nexport const checkForStoredConversation = (currentOrganizationKey: string): {\n shouldRestore: boolean;\n conversationId: string | null;\n messages: StoredMessage[] | null;\n} => {\n const storedConversation = loadConversationFromStorage();\n \n if (!storedConversation) {\n return { shouldRestore: false, conversationId: null, messages: null };\n }\n \n // Check if conversation is expired - if so, clear it automatically\n if (isConversationExpired(storedConversation)) {\n clearConversationStorage();\n return { shouldRestore: false, conversationId: null, messages: null };\n }\n \n // Check if organization key matches\n if (storedConversation.organizationKey !== currentOrganizationKey) {\n return { shouldRestore: false, conversationId: null, messages: null };\n }\n \n return {\n shouldRestore: true,\n conversationId: storedConversation.conversationId,\n messages: storedConversation.messages\n };\n};\n\nexport const formatConversationContext = (messages: StoredMessage[], maxMessages: number = 10): string => {\n // Take only the last N messages to avoid context length issues\n const recentMessages = messages.slice(-maxMessages);\n \n if (recentMessages.length === 0) {\n return '';\n }\n \n // Format messages into a readable context string\n const formattedMessages = recentMessages.map(msg => {\n const sender = msg.sender === 'HUMAN' ? 'User' : 'Assistant';\n return `${sender}: ${msg.content}`;\n }).join('\\n');\n \n return `Previous conversation context:\\n${formattedMessages}`;\n}; ","// Default prompt for Guide AI\nexport const DEFAULT_PROMPT = `you are Guide AI.\n Your role is to answer any question directly and succinctly that a user has. NEVER DIRECTLY MENTION THE SCREENSHOT, but use its information as much as possible to target your responses.\n If nothing is asked, then your goal is to generally assist them.\n IMPORTANT: NEVER answer in more than 10 words. Always be concise and limit answers to 1 sentence maximum. Be simple and as short as possible.\n Your job is to help them get it done through asking more and more targeted specific questions.`;\n\n// WebRTC message types to ignore in logging\nexport const IGNORE_MESSAGE_TYPES = [\n \"delta\", \n \"rate_limits\", \n \"input_audio_buffer\",\n \"response.audio.done\", \n \"response.output_item\", \n \"response.content_part\", \n \"output_audio_buffer\",\n \"response.created\", \n \"session.created\"\n];\n\n// API endpoints\n// export const GUIDE_AI_API_BASE = 'https://www.getguide.ai/api';\nexport const GUIDE_AI_API_BASE = 'http://localhost:3001/api';\nexport const OPENAI_REALTIME_BASE = 'https://api.openai.com/v1/realtime';\nexport const OPENAI_REALTIME_MODEL = \"gpt-4o-realtime-preview-2024-12-17\";\n\n// Gemini API - Note: This should be moved to environment variables in production\nexport const GEMINI_API_KEY = 'AIzaSyBiFyzjYVupLyk8BdmfWzBL1GbzX8OUdPc';\nexport const GEMINI_API_ENDPOINT = 'https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent'; ","module.exports = __WEBPACK_EXTERNAL_MODULE__156__;","import { StoredMessage, addMessageToStorage } from './messageStorage';\nimport { GUIDE_AI_API_BASE } from './constants';\n\n// Type for the conversation creation response (now includes token and prompt)\ninterface ConversationData {\n id: string;\n ephemeralToken: string;\n prompt: string;\n}\n\n// Create a new conversation (now also returns ephemeral token + prompt)\nexport const createNewConversation = async (\n organizationKey: string,\n onError: (error: Error, context: string) => void\n): Promise<ConversationData | null> => {\n try {\n const now = new Date();\n const response = await fetch(`${GUIDE_AI_API_BASE}/initialize-session`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n organizationKey,\n userId: 'anonymous',\n date: now.toISOString().split('T')[0],\n time: now.toTimeString().split(' ')[0],\n messages: []\n })\n });\n \n if (!response.ok) {\n const errorText = await response.text().catch(() => 'No error details available');\n console.error(`Conversation creation failed with status ${response.status}:`, errorText);\n throw new Error(`Failed to create conversation: ${response.status} - ${errorText}`);\n }\n \n const conversationData = await response.json();\n console.log('Conversation created:', conversationData.id);\n return conversationData;\n } catch (error) {\n console.error('Error creating conversation:', error);\n onError(error as Error, 'Creating conversation');\n return null;\n }\n};\n\n// Log a message to the conversation via API and local storage\nexport const logMessage = async (\n content: string, \n sender: 'GUIDEAI' | 'HUMAN',\n conversationId: string | null,\n organizationKey: string,\n onError: (error: Error, context: string) => void\n): Promise<void> => {\n if (!conversationId) return;\n \n try {\n const response = await fetch(`${GUIDE_AI_API_BASE}/conversations/${conversationId}/messages`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({ content, sender })\n });\n \n if (!response.ok) {\n throw new Error(`Failed to log message: ${response.status} ${response.statusText}`);\n }\n \n const message: StoredMessage = {\n content,\n sender,\n timestamp: Date.now()\n };\n \n addMessageToStorage(message, conversationId, organizationKey);\n } catch (error) {\n console.error('Error logging message:', error);\n onError(error as Error, 'Logging message');\n }\n}; ","// Import React normally, but use a helper function to handle possible duplicates\nimport React from 'react';\nimport { \n StoredMessage, \n addMessageToStorage,\n clearConversationStorage,\n checkForStoredConversation, \n formatConversationContext \n} from './utils/messageStorage';\n\n// Import our refactored modules\nimport { GuideAIProps, RecordingStatus, UseStateHook, UseEffectHook, UseRefHook, PopupPosition } from './types/GuideAI.types';\nimport { DEFAULT_PROMPT, IGNORE_MESSAGE_TYPES, GUIDE_AI_API_BASE, OPENAI_REALTIME_BASE, OPENAI_REALTIME_MODEL, GEMINI_API_KEY, GEMINI_API_ENDPOINT } from './utils/constants';\nimport { injectStyles, calculateOptimalPosition } from './utils/ui';\nimport { highlightElement } from './utils/highlight';\nimport { createNewConversation, logMessage } from './utils/api';\nimport WelcomeBubble from './components/WelcomeBubble';\nimport Onboarding from './components/Onboarding';\nimport { guideAIStyles } from './styles/GuideAI.styles';\n\n// Get React hooks safely, avoiding duplicate React issues\nconst getReactHooks = () => {\n // Try to use the React instance from window if available (for react-scripts)\n if (typeof window !== 'undefined' && (window as any).React) {\n return {\n useState: (window as any).React.useState as UseStateHook,\n useEffect: (window as any).React.useEffect as UseEffectHook,\n useRef: (window as any).React.useRef as UseRefHook\n };\n }\n // Otherwise use the imported React\n return {\n useState: React.useState,\n useEffect: React.useEffect,\n useRef: React.useRef\n };\n};\n\nconst GuideAI = (props: GuideAIProps) => { \n const {\n organizationKey,\n position,\n onError = console.error,\n } = props;\n\n const [status, setStatus] = getReactHooks().useState<RecordingStatus>('idle');\n const [isClient, setIsClient] = getReactHooks().useState(false);\n const [componentPosition] = getReactHooks().useState(position);\n const [isHighlighting, setIsHighlighting] = getReactHooks().useState(false);\n const [hasInteracted, setHasInteracted] = getReactHooks().useState(false);\n const [prompt, setPrompt] = getReactHooks().useState<string | null>(null);\n const [isSessionReady, setIsSessionReady] = getReactHooks().useState(false);\n const [isConnecting, setIsConnecting] = getReactHooks().useState(false);\n const [showOnboarding, setShowOnboarding] = getReactHooks().useState(false);\n const [popupPosition, setPopupPosition] = getReactHooks().useState<PopupPosition>('above');\n const conversationIdRef = getReactHooks().useRef<string | null>(null);\n\n const componentRef = getReactHooks().useRef<HTMLDivElement>(null);\n const peerConnectionRef = getReactHooks().useRef<RTCPeerConnection | null>(null);\n const dataChannelRef = getReactHooks().useRef<RTCDataChannel | null>(null);\n const hasCreatedConversationRef = getReactHooks().useRef(false);\n const mediaStreamRef = getReactHooks().useRef<MediaStream | null>(null);\n const audioElementRef = getReactHooks().useRef<HTMLAudioElement | null>(null);\n const [ephemeralToken, setEphemeralToken] = getReactHooks().useState<string | null>(null);\n const hasInitializedRef = getReactHooks().useRef(false);\n const [isConversationActive, setIsConversationActive] = getReactHooks().useState(false);\n const [restoredMessages, setRestoredMessages] = getReactHooks().useState<StoredMessage[]>([]);\n const hasAttemptedAutoStartRef = getReactHooks().useRef(false);\n\n // ===== API & EXTERNAL CALLS =====\n \n // Call Gemini Flash API to validate and fix JSON\n const geminiFlash = async (prompt: string): Promise<string> => {\n const response = await fetch(`${GEMINI_API_ENDPOINT}?key=${GEMINI_API_KEY}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n contents: [\n {\n parts: [\n {\n text: prompt\n }\n ]\n }\n ]\n })\n });\n \n const responseJson = await response.json();\n const content = responseJson.candidates[0].content;\n const responseText = content.parts[0].text;\n return responseText;\n };\n\n // ===== COMPONENT WRAPPER FUNCTIONS =====\n \n // Wrapper functions to maintain original signatures\n const handleCreateNewConversation = async () => {\n if (hasCreatedConversationRef.current) return null;\n hasCreatedConversationRef.current = true;\n \n const conversationData = await createNewConversation(organizationKey, onError);\n if (conversationData) {\n conversationIdRef.current = conversationData.id;\n setEphemeralToken(conversationData.ephemeralToken);\n setPrompt(conversationData.prompt);\n return conversationData;\n }\n return null;\n };\n\n const handleLogMessage = async (content: string, sender: 'GUIDEAI' | 'HUMAN') => {\n await logMessage(content, sender, conversationIdRef.current, organizationKey, onError);\n };\n\n const handleHighlightElement = async (selector: string | string[]) => {\n return highlightElement(selector, isHighlighting, setIsHighlighting, handleLogMessage);\n };\n\n // ===== UI UTILITIES & POSITION =====\n \n // Calculate optimal position for popups based on component location\n const getOptimalPosition = (elementHeight: number = 240, spacing: number = 15): PopupPosition => {\n if (!componentRef.current) return 'above';\n \n const rect = componentRef.current.getBoundingClientRect();\n return calculateOptimalPosition(rect, elementHeight, spacing);\n };\n\n // ===== WEBRTC MANAGEMENT =====\n \n const sendMessage = (message: any) => {\n if (dataChannelRef.current?.readyState === 'open') {\n // console.log('sending message', message);\n dataChannelRef.current.send(JSON.stringify(message));\n } else {\n console.error('Data channel not open, cannot send message');\n setStatus('idle');\n }\n };\n \n const cleanupWebRTC = () => {\n if (mediaStreamRef.current) {\n // Stop tracks completely instead of just disabling them\n mediaStreamRef.current.getAudioTracks().forEach(track => {\n track.stop();\n });\n mediaStreamRef.current = null;\n }\n \n if (dataChannelRef.current) {\n dataChannelRef.current.close();\n dataChannelRef.current = null;\n }\n \n if (peerConnectionRef.current) {\n peerConnectionRef.current.close();\n peerConnectionRef.current = null;\n }\n \n if (audioElementRef.current) {\n audioElementRef.current.srcObject = null;\n }\n \n // Reset session ready state\n setIsSessionReady(false);\n };\n\n const initializeWebRTC = async (audioStream: MediaStream): Promise<boolean> => {\n try {\n const pc = new RTCPeerConnection();\n peerConnectionRef.current = pc;\n \n audioStream.getAudioTracks().forEach(track => {\n pc.addTrack(track, audioStream);\n });\n \n if (!audioElementRef.current) {\n const audioEl = document.createElement('audio');\n audioEl.autoplay = true;\n document.body.appendChild(audioEl);\n audioElementRef.current = audioEl;\n }\n \n pc.ontrack = (e) => {\n if (audioElementRef.current && e.track.kind === 'audio') {\n const stream = new MediaStream([e.track]);\n audioElementRef.current.srcObject = stream;\n }\n };\n \n const dc = pc.createDataChannel('oai-events');\n dataChannelRef.current = dc;\n \n dc.onopen = () => { \n sendMessage({\n type: \"session.update\",\n session: {\n tools: [{\n type: \"function\",\n name: \"highlight\",\n description: \"Highlight specific elements on the page to guide the user's attention\",\n parameters: {\n type: \"object\",\n properties: {\n selector: {\n oneOf: [\n {\n type: \"string\",\n description: \"CSS selector or XPath for the element to highlight (e.g., '#search-bar')\"\n },\n {\n type: \"array\",\n items: {\n type: \"string\"\n },\n description: \"List of CSS selectors or XPaths to highlight in sequence (e.g., ['#first-button', '#second-button'])\"\n }\n ],\n description: \"CSS selector(s) or XPath(s) for the element(s) to highlight. Can be a single selector string or an array of selectors to process sequentially.\"\n }\n },\n required: [\"selector\"]\n }\n }],\n tool_choice: \"auto\",\n turn_detection: {\n type: \"server_vad\",\n create_response: true,\n interrupt_response: false\n },\n input_audio_transcription: {\n model: \"gpt-4o-mini-transcribe\",\n language: \"en\",\n prompt: \"The user may say 'cert' often, so make sure to listen for that.\"\n }\n }\n });\n };\n \n dc.onmessage = (e) => {\n try {\n const message = JSON.parse(e.data);\n\n switch (message.type) { \n case 'session.updated':\n // console.log('session.updated', message);\n setIsSessionReady(true);\n setIsConnecting(false);\n \n // If we have restored messages, send conversation context to AI now that session is ready\n if (restoredMessages.length > 0) {\n const conversationContext = formatConversationContext(restoredMessages);\n \n sendMessage({\n type: \"conversation.item.create\",\n item: {\n type: \"message\",\n role: \"system\",\n content: [{\n type: \"input_text\",\n text: conversationContext\n }]\n }\n });\n }\n break;\n\n case 'session.transcript':\n if (message.text) {\n handleLogMessage(message.text, 'HUMAN');\n }\n break;\n \n case 'conversation.item.input_audio_transcription.completed':\n console.log('User transcript:', message.transcript);\n handleLogMessage(message.transcript, 'HUMAN');\n break;\n\n case 'response.audio_transcript.done':\n console.log('Assistant message:', message.transcript);\n handleLogMessage(message.transcript, 'GUIDEAI');\n break;\n \n case \"conversation.item.created\":\n // console.log('conversation.item.created', message);\n break;\n\n case \"input_audio_buffer.speech_started\":\n // console.log('User speaking started');\n setStatus('recording');\n break;\n\n case \"input_audio_buffer.speech_stopped\":\n // console.log('User speaking stopped');\n setStatus('processing');\n break;\n\n case 'response.done':\n // console.log('response.done', message);\n for (const out of message.response.output) {\n switch (out.type) {\n case \"message\":\n // console.log('Assistant message:', out.text);\n break;\n \n case \"function_call\":\n // console.log('function_call', out);\n if (out.name === 'highlight' && out.arguments) {\n // console.log('Tool call:', out.arguments);\n try {\n let argsToUse = out.arguments;\n // Check if the JSON string is missing a closing quote\n // try {\n // console.log(\"argsToUse\", argsToUse);\n // const parsedArgs = JSON.parse(argsToUse);\n // console.log(\"parsedArgs\", parsedArgs);\n // highlightElement(parsedArgs.selector);\n // } catch (error) {\n // console.log(\"errored, argsToUse\", argsToUse);\n const prompt = `\n Validate the following JSON string and return ONLY a correct JSON object:\n Note: The selector(s) should be either a css selector or an xpath, so modify those if invalid.\n Also, [url=''] is a valid css selector, so do not modify it if it's present.\n Do not add any other text or newlines to the response.\n It should be of the following format:\n { \"selector\": \"string\" }\n or\n { \"selector\": [\"string\", ...] }\n DO NOT add any other text or newlines to the response, it should begin and end with curly braces.\n DO NOT add '''json to the response.\n The JSON string is:\n ${argsToUse}\n `\n geminiFlash(prompt).then(response => {\n response = response.replace(\"```json\", \"\").replace(\"```\", \"\").trim();\n // console.log(\"response\", response);\n const parsedArgs = JSON.parse(response);\n handleHighlightElement(parsedArgs.selector);\n }).catch(err => {\n console.error(\"Error calling Gemini:\", err);\n });\n // }\n\n\n } catch (error) {\n console.error('Error parsing function arguments:', error);\n console.log(out.arguments);\n handleLogMessage('Error parsing function arguments: ' + out.arguments, 'GUIDEAI');\n }\n }\n \n sendMessage({\n type: \"conversation.item.create\",\n item: {\n type: \"function_call_output\",\n call_id: out.call_id,\n output: JSON.stringify(true)\n }\n });\n\n sendMessage({\n type: 'response.create',\n });\n break;\n }\n }\n \n break;\n\n case \"response.function_call_arguments.delta\":\n // console.log('response.function_call_arguments.delta', message);\n break;\n\n case \"response.function_call_arguments.done\":\n // console.log('response.function_call_arguments.done', message);\n break;\n\n case \"output_audio_buffer.started\":\n setStatus('playing');\n break;\n\n case \"output_audio_buffer.stopped\":\n // console.log('output_audio_buffer.stopped');\n setStatus('recording');\n \n break;\n\n case 'error':\n if (message.error.code === 'session_expired') {\n console.error('Session expired:', message);\n setStatus('idle');\n setIsConnecting(false);\n setIsConversationActive(false);\n setEphemeralToken(null); // Clear expired token so reconnection gets fresh one\n hasCreatedConversationRef.current = false; // Allow creating new conversation\n break;\n }\n console.error('OpenAI API error:', message);\n onError(new Error(message.error.message || 'Unknown API error'), 'OpenAI API error');\n setStatus('idle');\n setIsConnecting(false);\n setIsConversationActive(false);\n setEphemeralToken(null); // Clear token in case of auth-related errors\n hasCreatedConversationRef.current = false; // Allow creating new conversation\n break;\n \n default:\n if (!IGNORE_MESSAGE_TYPES.some(fragment => message.type.includes(fragment))) {\n console.log('Unhandled:', message.type, message);\n }\n }\n } catch (error) {\n console.error('Error handling WebRTC message:', error);\n setStatus('idle');\n setIsConversationActive(false);\n }\n };\n \n // Start the session using SDP\n const offer = await pc.createOffer();\n await pc.setLocalDescription(offer);\n \n if (!pc.localDescription || !pc.localDescription.sdp) {\n throw new Error('Failed to create local SDP offer');\n }\n \n const baseUrl = OPENAI_REALTIME_BASE;\n const model = OPENAI_REALTIME_MODEL;\n \n \n const sdpResponse = await fetch(`${baseUrl}?model=${model}`, {\n method: 'POST',\n body: pc.localDescription.sdp,\n headers: {\n Authorization: `Bearer ${ephemeralToken}`,\n 'Content-Type': 'application/sdp'\n },\n });\n \n if (!sdpResponse.ok) {\n const errorText = await sdpResponse.text().catch(() => 'No error details available');\n console.error('WebRTC connection failed with status:', sdpResponse.status);\n console.error('Error details:', errorText);\n \n // Clear token on authentication failures\n if (sdpResponse.status === 401 || sdpResponse.status === 403) {\n setEphemeralToken(null);\n }\n \n throw new Error(`Failed to connect to OpenAI WebRTC: ${sdpResponse.status} - ${errorText}`);\n }\n \n const answerSdp = await sdpResponse.text();\n \n const answer = {\n type: 'answer',\n sdp: answerSdp,\n };\n \n await pc.setRemoteDescription(answer as RTCSessionDescriptionInit);\n \n return true;\n } catch (error) {\n console.error('Error initializing WebRTC:', error);\n onError(error as Error, 'WebRTC initialization failed');\n setIsConnecting(false);\n return false;\n }\n };\n\n // ===== SESSION MANAGEMENT =====\n \n const startConversationSession = async () => {\n try {\n setStatus('processing');\n \n if (peerConnectionRef.current && dataChannelRef.current?.readyState === 'open' && mediaStreamRef.current) {\n mediaStreamRef.current.getAudioTracks().forEach(track => {\n track.enabled = true;\n });\n setStatus('recording');\n return true;\n } else {\n cleanupWebRTC();\n \n try {\n setIsConnecting(true);\n \n // Ensure we have a valid token (get fresh one if needed)\n if (!ephemeralToken) {\n console.log('No token available, getting fresh token...');\n const conversationData = await handleCreateNewConversation();\n if (!conversationData) {\n console.error('Failed to get fresh token');\n setIsConnecting(false);\n setStatus('idle');\n return false;\n }\n }\n \n // Request microphone access when user clicks to start recording\n const audioStream = await navigator.mediaDevices.getUserMedia({ \n audio: {\n echoCancellation: true,\n noiseSuppression: true,\n autoGainControl: true,\n channelCount: 1,\n sampleRate: 48000,\n }\n });\n \n mediaStreamRef.current = audioStream;\n \n const initialized = await initializeWebRTC(audioStream);\n \n if (!initialized) {\n // Clean up if initialization fails\n audioStream.getAudioTracks().forEach(track => {\n track.stop();\n });\n mediaStreamRef.current = null;\n setStatus('idle');\n setIsConnecting(false);\n return false;\n }\n \n setStatus('recording');\n return true;\n } catch (error) {\n console.error('Error during conversation setup:', error);\n onError(error as Error, 'Microphone or WebRTC setup failed');\n setStatus('idle');\n setIsConnecting(false);\n return false;\n }\n }\n } catch (error) {\n setStatus('idle');\n setIsConnecting(false);\n onError(error as Error, 'Starting conversation failed');\n return false;\n }\n };\n\n const endConversationSession = () => {\n if (!isClient) return;\n \n if (mediaStreamRef.current) {\n mediaStreamRef.current.getAudioTracks().forEach(track => {\n track.stop();\n });\n }\n \n cleanupWebRTC();\n setStatus('idle');\n \n // Clear localStorage when conversation is explicitly ended\n clearConversationStorage();\n \n // Reset restored messages state\n setRestoredMessages([]);\n \n // Reset auto-start flag to allow future auto-starts\n hasAttemptedAutoStartRef.current = false;\n };\n\n // ===== UI EVENT HANDLERS =====\n \n const handleToggleConversation = async () => {\n if (!isClient) return;\n \n if (!hasInteracted) {\n setHasInteracted(true);\n localStorage.setItem('guideAI_hasInteracted', 'true');\n \n // Show onboarding on first interaction\n setShowOnboarding(true);\n return;\n }\n \n if (!isConversationActive) {\n const success = await startConversationSession();\n if (success) {\n setIsConversationActive(true);\n }\n } else {\n endConversationSession();\n setIsConversationActive(false);\n }\n };\n\n const handleOnboardingComplete = async () => {\n setShowOnboarding(false);\n \n // Start the conversation session when onboarding is completed\n const success = await startConversationSession();\n if (success) {\n setIsConversationActive(true);\n }\n };\n\n const handleOnboardingClose = () => {\n setShowOnboarding(false);\n };\n\n // ===== REACT EFFECTS & LIFECYCLE =====\n \n // initialization - mic/audio, webrtc, openai client\n getReactHooks().useEffect(() => {\n if (hasInitializedRef.current) return;\n hasInitializedRef.current = true;\n \n // Inject CSS styles\n injectStyles(guideAIStyles, 'guide-ai-styles');\n \n setIsClient(true);\n setIsConnecting(true); // Show loading state during initialization\n \n // Check for stored conversation before initializing\n const { shouldRestore, conversationId, messages } = checkForStoredConversation(organizationKey);\n \n if (shouldRestore && conversationId && messages) {\n // Store the restored messages to use as context\n setRestoredMessages(messages);\n } else {\n // No valid conversation to restore\n setRestoredMessages([]);\n }\n \n // Create new conversation (gets conversation + token + prompt)\n handleCreateNewConversation().then(conversationData => {\n setIsConnecting(false); // Hide loading state when done\n }).catch(error => {\n setIsConnecting(false); // Hide loading state on error\n console.error('Failed to create conversation:', error);\n });\n \n const hasInteractedBefore = localStorage.getItem('guideAI_hasInteracted');\n if (!hasInteractedBefore) {\n setHasInteracted(false);\n } else {\n setHasInteracted(true);\n }\n\n return () => {\n cleanupWebRTC();\n \n if (audioElementRef.current) {\n audioElementRef.current.srcObject = null;\n audioElementRef.current.remove();\n audioElementRef.current = null;\n }\n \n // Reset flags on cleanup\n hasInitializedRef.current = false;\n hasAttemptedAutoStartRef.current = false;\n };\n }, [organizationKey]);\n\n // Auto-restart effect - handles reconnection when token and restored messages are ready\n getReactHooks().useEffect(() => {\n if (ephemeralToken && restoredMessages.length > 0 && !hasAttemptedAutoStartRef.current) {\n console.log('Auto-restarting conversation with', restoredMessages.length, 'restored messages');\n hasAttemptedAutoStartRef.current = true;\n \n startConversationSession().then(success => {\n if (success) {\n setIsConversationActive(true);\n setHasInteracted(true);\n localStorage.setItem('guideAI_hasInteracted', 'true');\n }\n });\n }\n }, [ephemeralToken, restoredMessages]);\n\n // Update popup position when needed\n getReactHooks().useEffect(() => {\n if (showOnboarding || (!hasInteracted && ephemeralToken)) {\n // Use onboarding dimensions if onboarding is shown, otherwise welcome bubble dimensions\n const height = showOnboarding ? 240 : 50;\n const spacing = showOnboarding ? 20 : 15;\n setPopupPosition(getOptimalPosition(height, spacing));\n }\n }, [showOnboarding, hasInteracted, ephemeralToken]);\n\n if (!isClient) {\n return null;\n }\n\n // Determine if we should use fixed positioning (when position props are provided)\n const shouldUseFixedPosition = componentPosition && Object.keys(componentPosition).length > 0;\n \n // Base styles for the component\n const baseStyles: React.CSSProperties = {\n position: shouldUseFixedPosition ? 'fixed' : 'relative',\n zIndex: shouldUseFixedPosition ? 1000 : 'auto',\n ...(shouldUseFixedPosition ? componentPosition : {}),\n };\n\n return (\n <>\n <div\n ref={componentRef}\n style={baseStyles}\n >\n <div className=\"sarge-main-ui\">\n {!hasInteracted && ephemeralToken && (\n <WelcomeBubble position={popupPosition} />\n )}\n \n <Onboarding \n position={popupPosition}\n isVisible={showOnboarding}\n onComplete={handleOnboardingComplete}\n onClose={handleOnboardingClose}\n />\n \n <div \n className={`sarge-icon-wrapper ${isConnecting ? 'initializing' : status}`}\n onClick={isConnecting ? undefined : handleToggleConversation}\n style={isConnecting ? { cursor: 'default' } : undefined}\n title={isConnecting ? 'Initializing...' : \n status === 'idle' ? 'Click to start a conversation' : \n status === 'recording' ? 'Click to end conversation' : \n status === 'processing' ? 'Processing your message...' : \n 'AI is speaking, click to end conversation'}\n >\n {isConnecting && <i className=\"sarge-icon initializing\" />}\n {!isConnecting && status === 'idle' && <i className=\"sarge-icon microphone\" />}\n {!isConnecting && status === 'recording' && <i className=\"sarge-icon recording\" />}\n {!isConnecting && status === 'processing' && <i className=\"sarge-icon processing\" />}\n {!isConnecting && status === 'playing' && <i className=\"sarge-icon playing\" />}\n </div>\n \n </div>\n </div>\n </>\n );\n};\n\nexport default GuideAI;","import { PopupPosition } from '../types/GuideAI.types';\n\n// Function to inject CSS styles into the document head\nexport const injectStyles = (css: string, id: string) => {\n if (typeof document === 'undefined') return; // SSR safety\n \n // Check if styles are already injected\n if (document.getElementById(id)) return;\n \n const styleElement = document.createElement('style');\n styleElement.id = id;\n styleElement.textContent = css;\n document.head.appendChild(styleElement);\n};\n\n// Calculate optimal position for popups based on component location\nexport const calculateOptimalPosition = (\n componentRect: DOMRect, \n elementHeight: number = 240, \n spacing: number = 15\n): PopupPosition => {\n const viewportHeight = window.innerHeight;\n \n const spaceAbove = componentRect.top;\n const spaceBelow = viewportHeight - componentRect.bottom;\n \n const canFitBelow = spaceBelow >= (elementHeight + spacing);\n const canFitAbove = spaceAbove >= (elementHeight + spacing);\n \n if (canFitBelow) {\n return 'below';\n } else if (canFitAbove) {\n return 'above';\n } else {\n return spaceBelow > spaceAbove ? 'below' : 'above';\n }\n}; ","import React, { useState } from 'react';\nimport { PopupPosition } from '../types/GuideAI.types';\n\ninterface OnboardingProps {\n position: PopupPosition;\n isVisible: boolean;\n onComplete: () => void; // Called when user completes onboarding and wants to start conversation\n onClose: () => void; // Called when user closes onboarding without completing\n}\n\nconst Onboarding: React.FC<OnboardingProps> = ({ position, isVisible, onComplete, onClose }) => {\n const [step, setStep] = useState(1);\n\n const handleNext = () => {\n if (step < 3) {\n setStep(step + 1);\n } else {\n // Reset step and complete onboarding\n setStep(1);\n onComplete();\n }\n };\n\n const handleClose = () => {\n // Reset step when closing\n setStep(1);\n onClose();\n };\n\n if (!isVisible) {\n return null;\n }\n\n return (\n <div className={`sarge-onboarding ${position}`}>\n <div className=\"sarge-onboarding-content\">\n <button className=\"sarge-onboarding-close\" onClick={handleClose}>×</button>\n \n {step === 1 && (\n <div className=\"sarge-onboarding-step\">\n <div className=\"sarge-onboarding-icon volume-icon\">🔊</div>\n <h3>Turn on your volume</h3>\n <p>Make sure your device's volume is turned on so you can hear Guide AI's responses.</p>\n </div>\n )}\n \n {step === 2 && (\n <div className=\"sarge-onboarding-step\">\n <div className=\"sarge-onboarding-icon mic-icon\">🎤</div>\n <h3>Allow microphone access</h3>\n <p>When prompted, click \"Allow\" to let Guide AI access your microphone.</p>\n </div>\n )}\n \n {step === 3 && (\n <div className=\"sarge-onboarding-step\">\n <div className=\"sarge-onboarding-icon ready-icon\">✅</div>\n <h3>You're all set!</h3>\n <p>Click the microphone icon to start asking questions.</p>\n </div>\n )}\n \n <div className=\"sarge-onboarding-dots\">\n <span className={`dot ${step === 1 ? 'active' : ''}`}></span>\n <span className={`dot ${step === 2 ? 'active' : ''}`}></span>\n <span className={`dot ${step === 3 ? 'active' : ''}`}></span>\n </div>\n \n <button className=\"sarge-onboarding-next\" onClick={handleNext}>\n {step < 3 ? 'Next' : 'Get Started'}\n </button>\n </div>\n </div>\n );\n};\n\nexport default Onboarding; ","import React from 'react';\nimport { PopupPosition } from '../types/GuideAI.types';\n\ninterface WelcomeBubbleProps {\n position: PopupPosition;\n}\n\nconst WelcomeBubble: React.FC<WelcomeBubbleProps> = ({ position }) => {\n return (\n <div className={`sarge-welcome-bubble ${position}`}>\n Stuck? Click here and ask me a question\n </div>\n );\n};\n\nexport default WelcomeBubble; ","// Create click effects and dispatch click event on an element\nexport const clickElement = async (element: Element, rect: DOMRect): Promise<void> => {\n return new Promise<void>((resolve) => {\n setTimeout(() => {\n const clickEffectContainer = document.createElement('div');\n clickEffectContainer.style.cssText = `\n position: fixed;\n left: ${rect.left + rect.width / 2}px;\n top: ${rect.top + rect.height / 2}px;\n width: 60px;\n height: 60px;\n z-index: 1000;\n pointer-events: none;\n transform: translate(-50%, -50%);\n `;\n document.body.appendChild(clickEffectContainer);\n \n for (let j = 0; j < 3; j++) {\n const clickRipple = document.createElement('div');\n clickRipple.style.cssText = `\n position: absolute;\n left: 50%;\n top: 50%;\n width: 40px;\n height: 40px;\n border: 2px solid rgba(0, 102, 255, ${0.7 - (j * 0.2)});\n border-radius: 50%;\n transform: translate(-50%, -50%) scale(0);\n opacity: 1;\n animation: click-ripple-animation 0.8s ease-out ${j * 0.15}s forwards;\n box-shadow: 0 0 8px rgba(0, 102, 255, 0.4);\n `;\n clickEffectContainer.appendChild(clickRipple);\n }\n \n const clickDot = document.createElement('div');\n clickDot.style.cssText = `\n position: absolute;\n left: 50%;\n top: 50%;\n width: 12px;\n height: 12px;\n background: rgba(0, 102, 255, 0.9);\n border-radius: 50%;\n transform: translate(-50%, -50%) scale(0);\n animation: click-dot-animation 0.4s ease-out forwards;\n box-shadow: 0 0 5px rgba(0, 102, 255, 0.8);\n `;\n clickEffectContainer.appendChild(clickDot);\n \n const clickEvent = new MouseEvent('click', {\n view: window,\n bubbles: true,\n cancelable: true,\n });\n\n // Check for clickable subelements (links, buttons, inputs)\n const clickableElements = element.querySelectorAll('a, button, input[type=\"button\"], input[type=\"submit\"]');\n const clickableElement = clickableElements.length > 0 ? clickableElements[0] as HTMLElement : element as HTMLElement;\n console.log('Clicking element:', clickableElement);\n clickableElement.dispatchEvent(clickEvent);\n\n const originalBoxShadow = clickableElement.style.boxShadow;\n const originalTransition = clickableElement.style.transition;\n const originalZIndex = clickableElement.style.zIndex;\n\n clickableElement.style.transition = 'all 0.3s ease-out';\n clickableElement.style.boxShadow = '0 0 0 2px rgba(0, 102, 255, 0.5), 0 0 10px rgba(0, 102, 255, 0.3)';\n clickableElement.style.zIndex = '999';\n\n setTimeout(() => {\n clickableElement.style.boxShadow = originalBoxShadow;\n clickableElement.style.transition = originalTransition;\n clickableElement.style.zIndex = originalZIndex;\n\n clickEffectContainer.remove(); \n resolve();\n }, 1000);\n\n }, 1500);\n });\n};\n\n// Highlight elements on the page with animated cursor and click effects\nexport const highlightElement = async (\n selector: string | string[],\n isHighlighting: boolean,\n setIsHighlighting: (highlighting: boolean) => void,\n logMessage: (content: string, sender: 'GUIDEAI' | 'HUMAN') => void\n): Promise<boolean> => {\n if (isHighlighting) return false;\n \n const selectors = Array.isArray(selector) ? selector : [selector];\n if (selectors.length === 0) return false;\n \n console.log('Moving cursor to elements:', selectors);\n \n let cursorElement: HTMLElement | null = null;\n try {\n setIsHighlighting(true);\n \n for (let i = 0; i < selectors.length; i++) {\n const currentSelector = selectors[i];\n \n if (i > 0) {\n await new Promise(resolve => setTimeout(resolve, 1000));\n }\n \n let element;\n if (currentSelector.startsWith('//')) {\n const node = document.evaluate(currentSelector, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;\n if (!(node instanceof Element)) {\n console.log('XPath returned a non-Element node:', currentSelector);\n console.log(node);\n logMessage('XPath returned a non-Element node: ' + currentSelector, 'GUIDEAI');\n break;\n }\n element = node as Element;\n } else {\n element = document.querySelector(currentSelector);\n }\n \n if (!element) {\n console.log('Element not found:', currentSelector);\n logMessage('Element not found: ' + currentSelector, 'GUIDEAI');\n break;\n }\n \n const rect = element.getBoundingClientRect();\n \n // Create cursor if it's the first element, or reuse existing cursor\n if (!cursorElement) {\n cursorElement = document.createElement('div');\n cursorElement.id = 'guide-ai-cursor';\n \n const blueCursorSvg = `\n <svg width=\"100%\" height=\"100%\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill=\"#0066ff\" d=\"M7,2l12,11.2l-5.8,0.5l3.3,7.3l-2.2,1l-3.2-7.4L7,18.5V2\" />\n </svg>\n `;\n \n cursorElement.innerHTML = blueCursorSvg;\n cursorElement.style.cssText = `\n position: fixed;\n width: 64px;\n height: 64px;\n pointer-events: none;\n z-index: 9999;\n transition: all 0.8s ease-in-out;\n transform: translate(-50%, 0);\n filter: drop-shadow(0 0 4px rgba(0, 102, 255, 0.8));\n `;\n \n document.body.appendChild(cursorElement);\n \n // First element starts from center of viewport\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n cursorElement.style.left = `${viewportWidth / 2}px`;\n cursorElement.style.top = `${viewportHeight / 2}px`;\n }\n \n // Force reflow to ensure transition works\n cursorElement!.offsetHeight;\n \n await new Promise<void>(resolve => {\n setTimeout(() => {\n cursorElement!.style.left = `${rect.left + rect.width / 2}px`;\n cursorElement!.style.top = `${rect.top + rect.height / 2 - 10}px`;\n \n setTimeout(() => {\n cursorElement!.style.animation = 'cursor-jiggle 0.5s ease-in-out infinite';\n resolve();\n }, 800);\n }, 100);\n });\n \n await clickElement(element, rect);\n }\n\n setTimeout(() => {\n cursorElement?.remove();\n setIsHighlighting(false);\n }, 1000);\n \n return true;\n } catch (error) {\n console.error('Error moving cursor:', error);\n cursorElement?.remove();\n setIsHighlighting(false);\n return false;\n }\n}; ","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(258);\n"],"names":["root","factory","exports","module","require","define","amd","this","__WEBPACK_EXTERNAL_MODULE__156__","guideAIStyles","CONVERSATION_STORAGE_KEY","CONVERSATION_EXPIRY_MINUTES","MAX_STORED_MESSAGES","isLocalStorageAvailable","testKey","localStorage","setItem","removeItem","e","isConversationExpired","conversation","expiryTime","Date","now","timestamp","handleStorageError","error","operation","console","DOMException","name","loadConversationFromStorage","messages","length","slice","saveConversationToStorage","warn","clearConversationStorage","cleanupError","JSON","stringify","storedData","getItem","parsedData","parse","data","conversationId","Array","isArray","organizationKey","every","msg","content","sender","addMessageToStorage","message","push","checkForStoredConversation","currentOrganizationKey","storedConversation","shouldRestore","formatConversationContext","maxMessages","recentMessages","formattedMessages","map","join","DEFAULT_PROMPT","IGNORE_MESSAGE_TYPES","GUIDE_AI_API_BASE","OPENAI_REALTIME_BASE","OPENAI_REALTIME_MODEL","GEMINI_API_KEY","GEMINI_API_ENDPOINT","createNewConversation","onError","fetch","method","headers","body","userId","date","toISOString","split","time","toTimeString","response","ok","text","catch","errorText","status","Error","json","conversationData","log","id","logMessage","statusText","getReactHooks","window","React","useState","useEffect","useRef","props","position","setStatus","isClient","setIsClient","componentPosition","isHighlighting","setIsHighlighting","hasInteracted","setHasInteracted","setPrompt","setIsSessionReady","isConnecting","setIsConnecting","showOnboarding","setShowOnboarding","popupPosition","setPopupPosition","conversationIdRef","componentRef","peerConnectionRef","dataChannelRef","hasCreatedConversationRef","mediaStreamRef","audioElementRef","ephemeralToken","setEphemeralToken","hasInitializedRef","isConversationActive","setIsConversationActive","restoredMessages","setRestoredMessages","hasAttemptedAutoStartRef","geminiFlash","prompt","contents","parts","responseJson","candidates","handleCreateNewConversation","current","handleLogMessage","sendMessage","readyState","send","cleanupWebRTC","getAudioTracks","forEach","track","stop","close","srcObject","initializeWebRTC","audioStream","RTCPeerConnection","addTrack","audioEl","document","createElement","autoplay","appendChild","ontrack","kind","stream","MediaStream","dc","createDataChannel","onopen","type","session","tools","description","parameters","properties","selector","oneOf","items","required","tool_choice","turn_detection","create_response","interrupt_response","input_audio_transcription","model","language","onmessage","conversationContext","item","role","transcript","output","out","arguments","argsToUse","then","replace","trim","parsedArgs","highlightElement","err","call_id","code","some","fragment","includes","createOffer","offer","setLocalDescription","localDescription","sdp","baseUrl","Authorization","sdpResponse","answerSdp","answer","setRemoteDescription","startConversationSession","enabled","navigator","mediaDevices","getUserMedia","audio","echoCancellation","noiseSuppression","autoGainControl","channelCount","sampleRate","injectStyles","hasInteractedBefore","remove","success","elementHeight","spacing","rect","getBoundingClientRect","calculateOptimalPosition","getOptimalPosition","shouldUseFixedPosition","Object","keys","baseStyles","zIndex","ref","style","className","isVisible","onComplete","onClose","onClick","undefined","cursor","title","css","getElementById","styleElement","textContent","head","componentRect","viewportHeight","innerHeight","spaceAbove","top","spaceBelow","bottom","step","setStep","clickElement","element","Promise","resolve","setTimeout","clickEffectContainer","cssText","left","width","height","j","clickRipple","clickDot","clickEvent","MouseEvent","view","bubbles","cancelable","clickableElements","querySelectorAll","clickableElement","dispatchEvent","originalBoxShadow","boxShadow","originalTransition","transition","originalZIndex","selectors","cursorElement","i","currentSelector","startsWith","node","evaluate","XPathResult","FIRST_ORDERED_NODE_TYPE","singleNodeValue","Element","querySelector","innerHTML","viewportWidth","innerWidth","offsetHeight","animation","__webpack_module_cache__","__webpack_exports__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","call"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"GuideAI.js","mappings":"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","sources":["webpack://GuideAI/webpack/universalModuleDefinition","webpack://GuideAI/./src/styles/GuideAI.styles.ts","webpack://GuideAI/./src/utils/messageStorage.ts","webpack://GuideAI/./src/utils/constants.ts","webpack://GuideAI/external umd {\"commonjs\":\"react\",\"commonjs2\":\"react\",\"amd\":\"React\",\"root\":\"React\"}","webpack://GuideAI/./src/utils/api.ts","webpack://GuideAI/./src/GuideAI.tsx","webpack://GuideAI/./src/utils/ui.ts","webpack://GuideAI/./src/components/Onboarding.tsx","webpack://GuideAI/./src/components/WelcomeBubble.tsx","webpack://GuideAI/./src/utils/highlight.ts","webpack://GuideAI/webpack/bootstrap","webpack://GuideAI/webpack/startup"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"react\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"React\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"GuideAI\"] = factory(require(\"react\"));\n\telse\n\t\troot[\"GuideAI\"] = factory(root[\"React\"]);\n})(this, (__WEBPACK_EXTERNAL_MODULE__156__) => {\nreturn ","export const guideAIStyles = `\n.sarge-main-ui {\n position: relative;\n}\n\n.sarge-welcome-bubble {\n position: absolute;\n left: 50%;\n transform: translateX(-50%);\n background: #0066ff;\n color: white;\n padding: 10px 16px;\n border-radius: 20px;\n font-size: 14px;\n white-space: normal;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);\n animation: bubble-pulse 2s infinite;\n max-width: 280px;\n min-width: 200px;\n text-align: center;\n line-height: 1.3;\n}\n\n.sarge-welcome-bubble.above {\n bottom: calc(100% + 10px);\n}\n\n.sarge-welcome-bubble.below {\n top: calc(100% + 10px);\n}\n\n.sarge-welcome-bubble.above::after {\n content: '';\n position: absolute;\n top: 100%;\n left: 50%;\n transform: translateX(-50%);\n border-left: 8px solid transparent;\n border-right: 8px solid transparent;\n border-top: 8px solid #0066ff;\n}\n\n.sarge-welcome-bubble.below::after {\n content: '';\n position: absolute;\n bottom: 100%;\n left: 50%;\n transform: translateX(-50%);\n border-left: 8px solid transparent;\n border-right: 8px solid transparent;\n border-bottom: 8px solid #0066ff;\n}\n\n@keyframes bubble-pulse {\n 0% { transform: translateX(-50%) scale(1); }\n 50% { transform: translateX(-50%) scale(1.05); }\n 100% { transform: translateX(-50%) scale(1); }\n}\n\n.sarge-icon-wrapper {\n width: 100%;\n height: 100%;\n min-width: 30px;\n min-height: 30px;\n max-width: 60px;\n max-height: 60px;\n display: flex;\n justify-content: center;\n align-items: center;\n background-color: rgba(255, 255, 255, 0.9);\n border-radius: 50%;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.sarge-icon-wrapper:not(.initializing):hover {\n transform: scale(1.1);\n}\n\n.sarge-icon-wrapper.initializing {\n background-color: rgba(255, 255, 255, 0.9);\n box-shadow: 0 0 0 2px rgba(128, 128, 128, 0.5), 0 2px 8px rgba(0, 0, 0, 0.3);\n animation: sarge-spin 1.5s linear infinite;\n opacity: 0.7;\n cursor: default;\n}\n\n.sarge-icon-wrapper.recording {\n background-color: rgba(255, 255, 255, 0.9);\n box-shadow: 0 0 0 2px rgba(255, 0, 0, 0.5), 0 2px 8px rgba(0, 0, 0, 0.3);\n animation: sarge-pulse 1s infinite alternate;\n}\n\n.sarge-icon-wrapper.processing {\n background-color: rgba(255, 255, 255, 0.9);\n box-shadow: 0 0 0 2px rgba(255, 165, 0, 0.5), 0 2px 8px rgba(0, 0, 0, 0.3);\n animation: sarge-spin 1s linear infinite;\n}\n\n.sarge-icon-wrapper.playing {\n background-color: rgba(255, 255, 255, 0.9);\n box-shadow: 0 0 0 2px rgba(0, 128, 0, 0.5), 0 2px 8px rgba(0, 0, 0, 0.3);\n}\n\n@keyframes sarge-pulse {\n 0% { transform: scale(1); }\n 100% { transform: scale(1.05); }\n}\n\n@keyframes sarge-spin {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n}\n\n@keyframes click-ripple-animation {\n 0% { transform: translate(-50%, -50%) scale(0); opacity: 1; }\n 50% { transform: translate(-50%, -50%) scale(1.2); opacity: 0.6; }\n 100% { transform: translate(-50%, -50%) scale(2.5); opacity: 0; }\n}\n\n@keyframes click-dot-animation {\n 0% { transform: translate(-50%, -50%) scale(0); opacity: 1; }\n 60% { transform: translate(-50%, -50%) scale(1); opacity: 1; }\n 100% { transform: translate(-50%, -50%) scale(1); opacity: 0; }\n}\n\n@keyframes cursor-jiggle {\n 0% { transform: translate(-50%, 0) scale(1); }\n 25% { transform: translate(-50%, -5px) scale(1.1); }\n 50% { transform: translate(-50%, 0) scale(1); }\n 75% { transform: translate(-50%, 5px) scale(1.1); }\n 100% { transform: translate(-50%, 0) scale(1); filter: drop-shadow(0 0 8px #0066ff); }\n}\n\n.sarge-icon {\n width: 60%;\n height: 60%;\n min-width: 16px;\n min-height: 16px;\n max-width: 40px;\n max-height: 40px;\n background-size: contain;\n background-repeat: no-repeat;\n background-position: center;\n}\n\n.sarge-icon.initializing {\n background-image: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"><path fill=\"%23808080\" d=\"M304 48c0 26.51-21.49 48-48 48s-48-21.49-48-48 21.49-48 48-48 48 21.49 48 48zm-48 368c-26.51 0-48 21.49-48 48s21.49 48 48 48 48-21.49 48-48-21.49-48-48-48zm208-208c-26.51 0-48 21.49-48 48s21.49 48 48 48 48-21.49 48-48-21.49-48-48-48zM96 256c0-26.51-21.49-48-48-48S0 229.49 0 256s21.49 48 48 48 48-21.49 48-48zm12.922 99.078c-26.51 0-48 21.49-48 48s21.49 48 48 48 48-21.49 48-48c0-26.509-21.491-48-48-48zm294.156 0c-26.51 0-48 21.49-48 48s21.49 48 48 48 48-21.49 48-48c0-26.509-21.49-48-48-48zM108.922 60.922c-26.51 0-48 21.49-48 48s21.49 48 48 48 48-21.49 48-48-21.491-48-48-48z\"/></svg>');\n}\n\n.sarge-icon.microphone {\n background-image: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 352 512\"><path fill=\"%230000FF\" d=\"M176 352c53.02 0 96-42.98 96-96V96c0-53.02-42.98-96-96-96S80 42.98 80 96v160c0 53.02 42.98 96 96 96zm160-160h-16c-8.84 0-16 7.16-16 16v48c0 74.8-64.49 134.82-140.79 127.38C96.71 376.89 48 317.11 48 250.3V208c0-8.84-7.16-16-16-16H16c-8.84 0-16 7.16-16 16v40.16c0 89.64 63.97 169.55 152 181.69V464H96c-8.84 0-16 7.16-16 16v16c0 8.84 7.16 16 16 16h160c8.84 0 16-7.16 16-16v-16c0-8.84-7.16-16-16-16h-56v-33.77C285.71 418.47 352 344.9 352 256v-48c0-8.84-7.16-16-16-16z\"/></svg>');\n}\n\n.sarge-icon.recording {\n background-image: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"><circle cx=\"256\" cy=\"256\" r=\"128\" fill=\"%23FF0000\"/><circle cx=\"256\" cy=\"256\" r=\"200\" stroke=\"%23FF0000\" stroke-width=\"20\" fill=\"none\"/></svg>');\n}\n\n.sarge-icon.processing {\n background-image: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"><path fill=\"%23FFA500\" d=\"M304 48c0 26.51-21.49 48-48 48s-48-21.49-48-48 21.49-48 48-48 48 21.49 48 48zm-48 368c-26.51 0-48 21.49-48 48s21.49 48 48 48 48-21.49 48-48-21.49-48-48-48zm208-208c-26.51 0-48 21.49-48 48s21.49 48 48 48 48-21.49 48-48-21.49-48-48-48zM96 256c0-26.51-21.49-48-48-48S0 229.49 0 256s21.49 48 48 48 48-21.49 48-48zm12.922 99.078c-26.51 0-48 21.49-48 48s21.49 48 48 48 48-21.49 48-48c0-26.509-21.491-48-48-48zm294.156 0c-26.51 0-48 21.49-48 48s21.49 48 48 48 48-21.49 48-48c0-26.509-21.49-48-48-48zM108.922 60.922c-26.51 0-48 21.49-48 48s21.49 48 48 48 48-21.49 48-48-21.491-48-48-48z\"/></svg>');\n}\n\n.sarge-icon.playing {\n background-image: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path fill=\"%23008000\" d=\"M3 9v6h4l5 5V4L7 9H3zm13.5 3c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02zM14 3.23v2.06c2.89.86 5 3.54 5 6.71s-2.11 5.85-5 6.71v2.06c4.01-.91 7-4.49 7-8.77s-2.99-7.86-7-8.77z\"/></svg>');\n}\n\n/* Onboarding styles */\n.sarge-onboarding {\n position: absolute;\n left: 50%;\n transform: translateX(-50%);\n background: white;\n border-radius: 12px;\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);\n width: 300px;\n max-width: 90vw;\n z-index: 1002;\n animation: onboarding-fade-in 0.3s ease-out;\n}\n\n.sarge-onboarding.above {\n bottom: calc(100% + 15px);\n}\n\n.sarge-onboarding.below {\n top: calc(100% + 15px);\n}\n\n.sarge-onboarding.above::after {\n content: '';\n position: absolute;\n top: 100%;\n left: 50%;\n transform: translateX(-50%);\n border-left: 8px solid transparent;\n border-right: 8px solid transparent;\n border-top: 8px solid white;\n filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.1));\n}\n\n.sarge-onboarding.below::after {\n content: '';\n position: absolute;\n bottom: 100%;\n left: 50%;\n transform: translateX(-50%);\n border-left: 8px solid transparent;\n border-right: 8px solid transparent;\n border-bottom: 8px solid white;\n filter: drop-shadow(0 -2px 4px rgba(0, 0, 0, 0.1));\n}\n\n@keyframes onboarding-fade-in {\n from { opacity: 0; transform: translateX(-50%) translateY(-10px); }\n to { opacity: 1; transform: translateX(-50%) translateY(0); }\n}\n\n.sarge-onboarding-content {\n padding: 16px;\n position: relative;\n}\n\n.sarge-onboarding-close {\n position: absolute;\n top: 10px;\n right: 10px;\n background: none;\n border: none;\n font-size: 20px;\n cursor: pointer;\n color: #999;\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 50%;\n}\n\n.sarge-onboarding-close:hover {\n background: #f5f5f5;\n color: #333;\n}\n\n.sarge-onboarding-step {\n text-align: center;\n margin-bottom: 12px;\n}\n\n.sarge-onboarding-icon {\n font-size: 32px;\n margin-bottom: 8px;\n display: inline-block;\n}\n\n.sarge-onboarding-step h3 {\n margin: 0 0 8px;\n font-size: 16px;\n color: #333;\n font-weight: 600;\n}\n\n.sarge-onboarding-step p {\n margin: 0;\n font-size: 13px;\n color: #666;\n line-height: 1.4;\n}\n\n.sarge-onboarding-dots {\n display: flex;\n justify-content: center;\n margin: 12px 0;\n}\n\n.sarge-onboarding-dots .dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background: #ddd;\n margin: 0 4px;\n transition: all 0.3s ease;\n}\n\n.sarge-onboarding-dots .dot.active {\n background: #0066ff;\n transform: scale(1.2);\n}\n\n.sarge-onboarding-next {\n display: block;\n width: 100%;\n padding: 10px;\n background: #0066ff;\n color: white;\n border: none;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.2s ease;\n}\n\n.sarge-onboarding-next:hover {\n background: #0055cc;\n}\n`; ","// Storage data structures for conversation persistence\nexport interface StoredMessage {\n content: string;\n sender: 'GUIDEAI' | 'HUMAN';\n timestamp: number;\n}\n\nexport interface StoredConversation {\n conversationId: string;\n messages: StoredMessage[];\n timestamp: number;\n organizationKey: string;\n}\n\nexport const CONVERSATION_STORAGE_KEY = 'guideai_conversation';\nexport const CONVERSATION_EXPIRY_MINUTES = 30;\nexport const MAX_STORED_MESSAGES = 50;\n\nexport const isLocalStorageAvailable = (): boolean => {\n try {\n const testKey = '__storage_test__';\n localStorage.setItem(testKey, testKey);\n localStorage.removeItem(testKey);\n return true;\n } catch (e) {\n return false;\n }\n};\n\nconst isValidConversation = (data: any): data is StoredConversation => {\n return (\n data &&\n typeof data === 'object' &&\n typeof data.conversationId === 'string' &&\n Array.isArray(data.messages) &&\n typeof data.timestamp === 'number' &&\n typeof data.organizationKey === 'string' &&\n data.messages.every((msg: any) => (\n typeof msg === 'object' &&\n typeof msg.content === 'string' &&\n (msg.sender === 'HUMAN' || msg.sender === 'GUIDEAI') &&\n typeof msg.timestamp === 'number'\n ))\n );\n};\n\nexport const isConversationExpired = (conversation: StoredConversation): boolean => {\n const expiryTime = CONVERSATION_EXPIRY_MINUTES * 60 * 1000; // convert to milliseconds\n const now = Date.now();\n return (now - conversation.timestamp) > expiryTime;\n};\n\nconst handleStorageError = (error: unknown, operation: string): void => {\n console.error(`Storage error during ${operation}:`, error);\n \n // Check if it's a quota exceeded error\n if (error instanceof DOMException && \n (error.name === 'QuotaExceededError' || \n error.name === 'NS_ERROR_DOM_QUOTA_REACHED')) {\n \n // Try to free up space by removing oldest messages instead of clearing everything\n try {\n const conversation = loadConversationFromStorage();\n if (conversation && conversation.messages.length > 5) {\n // Remove oldest 5 messages\n conversation.messages = conversation.messages.slice(5);\n saveConversationToStorage(conversation);\n console.warn('Storage quota exceeded. Removed oldest 5 messages to free space.');\n } else if (conversation) {\n // If less than 5 messages, clear everything\n clearConversationStorage();\n console.warn('Storage quota exceeded. Cleared conversation data.');\n }\n } catch (cleanupError) {\n console.error('Failed to clean up storage:', cleanupError);\n }\n }\n};\n\nexport const saveConversationToStorage = (conversation: StoredConversation): void => {\n if (!isLocalStorageAvailable()) {\n console.warn('localStorage is not available. Conversation persistence disabled.');\n return;\n }\n \n try {\n // Limit to last MAX_STORED_MESSAGES\n if (conversation.messages.length > MAX_STORED_MESSAGES) {\n conversation.messages = conversation.messages.slice(-MAX_STORED_MESSAGES);\n }\n \n // Update timestamp\n conversation.timestamp = Date.now();\n \n localStorage.setItem(CONVERSATION_STORAGE_KEY, JSON.stringify(conversation));\n } catch (error) {\n handleStorageError(error, 'save');\n }\n};\n\nexport const loadConversationFromStorage = (): StoredConversation | null => {\n if (!isLocalStorageAvailable()) {\n console.warn('localStorage is not available. Conversation persistence disabled.');\n return null;\n }\n \n try {\n const storedData = localStorage.getItem(CONVERSATION_STORAGE_KEY);\n if (!storedData) return null;\n \n const parsedData = JSON.parse(storedData);\n \n // Validate the data structure\n if (!isValidConversation(parsedData)) {\n console.warn('Corrupted conversation data found. Clearing storage.');\n clearConversationStorage();\n return null;\n }\n \n return parsedData;\n } catch (error) {\n handleStorageError(error, 'load');\n // Clear corrupted data on any parsing errors\n clearConversationStorage();\n return null;\n }\n};\n\nexport const clearConversationStorage = (): void => {\n if (!isLocalStorageAvailable()) {\n return;\n }\n \n try {\n localStorage.removeItem(CONVERSATION_STORAGE_KEY);\n } catch (error) {\n handleStorageError(error, 'clear');\n }\n};\n\nexport const addMessageToStorage = (message: StoredMessage, conversationId: string, organizationKey: string): void => {\n if (!isLocalStorageAvailable()) {\n console.warn('localStorage is not available. Message persistence disabled.');\n return;\n }\n \n try {\n let conversation = loadConversationFromStorage();\n \n if (!conversation) {\n conversation = {\n conversationId,\n messages: [],\n timestamp: Date.now(),\n organizationKey\n };\n }\n \n conversation.messages.push(message);\n conversation.conversationId = conversationId;\n conversation.organizationKey = organizationKey;\n \n saveConversationToStorage(conversation);\n } catch (error) {\n console.error('Error adding message to storage:', error);\n }\n};\n\nexport const checkForStoredConversation = (currentOrganizationKey: string): {\n shouldRestore: boolean;\n conversationId: string | null;\n messages: StoredMessage[] | null;\n} => {\n const storedConversation = loadConversationFromStorage();\n \n if (!storedConversation) {\n return { shouldRestore: false, conversationId: null, messages: null };\n }\n \n // Check if conversation is expired - if so, clear it automatically\n if (isConversationExpired(storedConversation)) {\n clearConversationStorage();\n return { shouldRestore: false, conversationId: null, messages: null };\n }\n \n // Check if organization key matches\n if (storedConversation.organizationKey !== currentOrganizationKey) {\n return { shouldRestore: false, conversationId: null, messages: null };\n }\n \n return {\n shouldRestore: true,\n conversationId: storedConversation.conversationId,\n messages: storedConversation.messages\n };\n};\n\nexport const formatConversationContext = (messages: StoredMessage[], maxMessages: number = 10): string => {\n // Take only the last N messages to avoid context length issues\n const recentMessages = messages.slice(-maxMessages);\n \n if (recentMessages.length === 0) {\n return '';\n }\n \n // Format messages into a readable context string\n const formattedMessages = recentMessages.map(msg => {\n const sender = msg.sender === 'HUMAN' ? 'User' : 'Assistant';\n return `${sender}: ${msg.content}`;\n }).join('\\n');\n \n return `Previous conversation context:\\n${formattedMessages}`;\n}; ","// Default prompt for Guide AI\nexport const DEFAULT_PROMPT = `you are Guide AI.\n Your role is to answer any question directly and succinctly that a user has. NEVER DIRECTLY MENTION THE SCREENSHOT, but use its information as much as possible to target your responses.\n If nothing is asked, then your goal is to generally assist them.\n IMPORTANT: NEVER answer in more than 10 words. Always be concise and limit answers to 1 sentence maximum. Be simple and as short as possible.\n Your job is to help them get it done through asking more and more targeted specific questions.`;\n\n// WebRTC message types to ignore in logging\nexport const IGNORE_MESSAGE_TYPES = [\n \"delta\", \n \"rate_limits\", \n \"input_audio_buffer\",\n \"response.audio.done\", \n \"response.output_item\", \n \"response.content_part\", \n \"output_audio_buffer\",\n \"response.created\", \n \"session.created\"\n];\n\n// API endpoints\nexport const GUIDE_AI_API_BASE = 'https://www.getguide.ai/api';\n// export const GUIDE_AI_API_BASE = 'http://localhost:3001/api';\nexport const OPENAI_REALTIME_BASE = 'https://api.openai.com/v1/realtime';\nexport const OPENAI_REALTIME_MODEL = \"gpt-4o-realtime-preview-2024-12-17\";\n\n// Gemini API - Note: This should be moved to environment variables in production\nexport const GEMINI_API_KEY = 'AIzaSyBiFyzjYVupLyk8BdmfWzBL1GbzX8OUdPc';\nexport const GEMINI_API_ENDPOINT = 'https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent'; ","module.exports = __WEBPACK_EXTERNAL_MODULE__156__;","import { StoredMessage, addMessageToStorage } from './messageStorage';\nimport { GUIDE_AI_API_BASE } from './constants';\n\n// Type for the conversation creation response (now includes token and prompt)\ninterface ConversationData {\n id: string;\n ephemeralToken: string;\n prompt: string;\n}\n\n// Create a new conversation (now also returns ephemeral token + prompt)\nexport const createNewConversation = async (\n organizationKey: string,\n onError: (error: Error, context: string) => void\n): Promise<ConversationData | null> => {\n try {\n const now = new Date();\n const response = await fetch(`${GUIDE_AI_API_BASE}/initialize-session`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n organizationKey,\n userId: 'anonymous',\n date: now.toISOString().split('T')[0],\n time: now.toTimeString().split(' ')[0],\n messages: []\n })\n });\n \n if (!response.ok) {\n const errorText = await response.text().catch(() => 'No error details available');\n console.error(`Conversation creation failed with status ${response.status}:`, errorText);\n throw new Error(`Failed to create conversation: ${response.status} - ${errorText}`);\n }\n \n const conversationData = await response.json();\n console.log('Conversation created:', conversationData.id);\n return conversationData;\n } catch (error) {\n console.error('Error creating conversation:', error);\n onError(error as Error, 'Creating conversation');\n return null;\n }\n};\n\n// Log a message to the conversation via API and local storage\nexport const logMessage = async (\n content: string, \n sender: 'GUIDEAI' | 'HUMAN',\n conversationId: string | null,\n organizationKey: string,\n onError: (error: Error, context: string) => void\n): Promise<void> => {\n if (!conversationId) return;\n \n try {\n const response = await fetch(`${GUIDE_AI_API_BASE}/conversations/${conversationId}/messages`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({ content, sender })\n });\n \n if (!response.ok) {\n throw new Error(`Failed to log message: ${response.status} ${response.statusText}`);\n }\n \n const message: StoredMessage = {\n content,\n sender,\n timestamp: Date.now()\n };\n \n addMessageToStorage(message, conversationId, organizationKey);\n } catch (error) {\n console.error('Error logging message:', error);\n onError(error as Error, 'Logging message');\n }\n}; ","// Import React normally, but use a helper function to handle possible duplicates\nimport React from 'react';\nimport { \n StoredMessage, \n addMessageToStorage,\n clearConversationStorage,\n checkForStoredConversation, \n formatConversationContext \n} from './utils/messageStorage';\n\n// Import our refactored modules\nimport { GuideAIProps, RecordingStatus, UseStateHook, UseEffectHook, UseRefHook, PopupPosition } from './types/GuideAI.types';\nimport { DEFAULT_PROMPT, IGNORE_MESSAGE_TYPES, GUIDE_AI_API_BASE, OPENAI_REALTIME_BASE, OPENAI_REALTIME_MODEL, GEMINI_API_KEY, GEMINI_API_ENDPOINT } from './utils/constants';\nimport { injectStyles, calculateOptimalPosition } from './utils/ui';\nimport { highlightElement } from './utils/highlight';\nimport { createNewConversation, logMessage } from './utils/api';\nimport WelcomeBubble from './components/WelcomeBubble';\nimport Onboarding from './components/Onboarding';\nimport { guideAIStyles } from './styles/GuideAI.styles';\n\n// Get React hooks safely, avoiding duplicate React issues\nconst getReactHooks = () => {\n // Try to use the React instance from window if available (for react-scripts)\n if (typeof window !== 'undefined' && (window as any).React) {\n return {\n useState: (window as any).React.useState as UseStateHook,\n useEffect: (window as any).React.useEffect as UseEffectHook,\n useRef: (window as any).React.useRef as UseRefHook\n };\n }\n // Otherwise use the imported React\n return {\n useState: React.useState,\n useEffect: React.useEffect,\n useRef: React.useRef\n };\n};\n\nconst GuideAI = (props: GuideAIProps) => { \n const {\n organizationKey,\n position,\n onError = console.error,\n } = props;\n\n const [status, setStatus] = getReactHooks().useState<RecordingStatus>('idle');\n const [isClient, setIsClient] = getReactHooks().useState(false);\n const [componentPosition] = getReactHooks().useState(position);\n const [isHighlighting, setIsHighlighting] = getReactHooks().useState(false);\n const [hasInteracted, setHasInteracted] = getReactHooks().useState(false);\n const [prompt, setPrompt] = getReactHooks().useState<string | null>(null);\n const [isSessionReady, setIsSessionReady] = getReactHooks().useState(false);\n const [isConnecting, setIsConnecting] = getReactHooks().useState(false);\n const [showOnboarding, setShowOnboarding] = getReactHooks().useState(false);\n const [popupPosition, setPopupPosition] = getReactHooks().useState<PopupPosition>('above');\n const conversationIdRef = getReactHooks().useRef<string | null>(null);\n\n const componentRef = getReactHooks().useRef<HTMLDivElement>(null);\n const peerConnectionRef = getReactHooks().useRef<RTCPeerConnection | null>(null);\n const dataChannelRef = getReactHooks().useRef<RTCDataChannel | null>(null);\n const hasCreatedConversationRef = getReactHooks().useRef(false);\n const mediaStreamRef = getReactHooks().useRef<MediaStream | null>(null);\n const audioElementRef = getReactHooks().useRef<HTMLAudioElement | null>(null);\n const [ephemeralToken, setEphemeralToken] = getReactHooks().useState<string | null>(null);\n const hasInitializedRef = getReactHooks().useRef(false);\n const [isConversationActive, setIsConversationActive] = getReactHooks().useState(false);\n const [restoredMessages, setRestoredMessages] = getReactHooks().useState<StoredMessage[]>([]);\n const hasAttemptedAutoStartRef = getReactHooks().useRef(false);\n\n // ===== API & EXTERNAL CALLS =====\n \n // Call Gemini Flash API to validate and fix JSON\n const geminiFlash = async (prompt: string): Promise<string> => {\n const response = await fetch(`${GEMINI_API_ENDPOINT}?key=${GEMINI_API_KEY}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n contents: [\n {\n parts: [\n {\n text: prompt\n }\n ]\n }\n ]\n })\n });\n \n const responseJson = await response.json();\n const content = responseJson.candidates[0].content;\n const responseText = content.parts[0].text;\n return responseText;\n };\n\n // ===== COMPONENT WRAPPER FUNCTIONS =====\n \n // Wrapper functions to maintain original signatures\n const handleCreateNewConversation = async () => {\n if (hasCreatedConversationRef.current) return null;\n hasCreatedConversationRef.current = true;\n \n const conversationData = await createNewConversation(organizationKey, onError);\n if (conversationData) {\n conversationIdRef.current = conversationData.id;\n setEphemeralToken(conversationData.ephemeralToken);\n setPrompt(conversationData.prompt);\n return conversationData;\n }\n return null;\n };\n\n const handleLogMessage = async (content: string, sender: 'GUIDEAI' | 'HUMAN') => {\n await logMessage(content, sender, conversationIdRef.current, organizationKey, onError);\n };\n\n const handleHighlightElement = async (selector: string | string[]) => {\n return highlightElement(selector, isHighlighting, setIsHighlighting, handleLogMessage);\n };\n\n // ===== UI UTILITIES & POSITION =====\n \n // Calculate optimal position for popups based on component location\n const getOptimalPosition = (elementHeight: number = 240, spacing: number = 15): PopupPosition => {\n if (!componentRef.current) return 'above';\n \n const rect = componentRef.current.getBoundingClientRect();\n return calculateOptimalPosition(rect, elementHeight, spacing);\n };\n\n // ===== WEBRTC MANAGEMENT =====\n \n const sendMessage = (message: any) => {\n if (dataChannelRef.current?.readyState === 'open') {\n // console.log('sending message', message);\n dataChannelRef.current.send(JSON.stringify(message));\n } else {\n console.error('Data channel not open, cannot send message');\n setStatus('idle');\n }\n };\n \n const cleanupWebRTC = () => {\n if (mediaStreamRef.current) {\n // Stop tracks completely instead of just disabling them\n mediaStreamRef.current.getAudioTracks().forEach(track => {\n track.stop();\n });\n mediaStreamRef.current = null;\n }\n \n if (dataChannelRef.current) {\n dataChannelRef.current.close();\n dataChannelRef.current = null;\n }\n \n if (peerConnectionRef.current) {\n peerConnectionRef.current.close();\n peerConnectionRef.current = null;\n }\n \n if (audioElementRef.current) {\n audioElementRef.current.srcObject = null;\n }\n \n // Reset session ready state\n setIsSessionReady(false);\n };\n\n const initializeWebRTC = async (audioStream: MediaStream): Promise<boolean> => {\n try {\n const pc = new RTCPeerConnection();\n peerConnectionRef.current = pc;\n \n audioStream.getAudioTracks().forEach(track => {\n pc.addTrack(track, audioStream);\n });\n \n if (!audioElementRef.current) {\n const audioEl = document.createElement('audio');\n audioEl.autoplay = true;\n document.body.appendChild(audioEl);\n audioElementRef.current = audioEl;\n }\n \n pc.ontrack = (e) => {\n if (audioElementRef.current && e.track.kind === 'audio') {\n const stream = new MediaStream([e.track]);\n audioElementRef.current.srcObject = stream;\n }\n };\n \n const dc = pc.createDataChannel('oai-events');\n dataChannelRef.current = dc;\n \n dc.onopen = () => { \n sendMessage({\n type: \"session.update\",\n session: {\n tools: [{\n type: \"function\",\n name: \"highlight\",\n description: \"Highlight specific elements on the page to guide the user's attention\",\n parameters: {\n type: \"object\",\n properties: {\n selector: {\n oneOf: [\n {\n type: \"string\",\n description: \"CSS selector or XPath for the element to highlight (e.g., '#search-bar')\"\n },\n {\n type: \"array\",\n items: {\n type: \"string\"\n },\n description: \"List of CSS selectors or XPaths to highlight in sequence (e.g., ['#first-button', '#second-button'])\"\n }\n ],\n description: \"CSS selector(s) or XPath(s) for the element(s) to highlight. Can be a single selector string or an array of selectors to process sequentially.\"\n }\n },\n required: [\"selector\"]\n }\n }],\n tool_choice: \"auto\",\n turn_detection: {\n type: \"server_vad\",\n create_response: true,\n interrupt_response: false\n },\n input_audio_transcription: {\n model: \"gpt-4o-mini-transcribe\",\n language: \"en\",\n prompt: \"The user may say 'cert' often, so make sure to listen for that.\"\n }\n }\n });\n };\n \n dc.onmessage = (e) => {\n try {\n const message = JSON.parse(e.data);\n\n switch (message.type) { \n case 'session.updated':\n // console.log('session.updated', message);\n setIsSessionReady(true);\n setIsConnecting(false);\n \n // If we have restored messages, send conversation context to AI now that session is ready\n if (restoredMessages.length > 0) {\n const conversationContext = formatConversationContext(restoredMessages);\n \n sendMessage({\n type: \"conversation.item.create\",\n item: {\n type: \"message\",\n role: \"system\",\n content: [{\n type: \"input_text\",\n text: conversationContext\n }]\n }\n });\n }\n break;\n\n case 'session.transcript':\n if (message.text) {\n handleLogMessage(message.text, 'HUMAN');\n }\n break;\n \n case 'conversation.item.input_audio_transcription.completed':\n console.log('User transcript:', message.transcript);\n handleLogMessage(message.transcript, 'HUMAN');\n break;\n\n case 'response.audio_transcript.done':\n console.log('Assistant message:', message.transcript);\n handleLogMessage(message.transcript, 'GUIDEAI');\n break;\n \n case \"conversation.item.created\":\n // console.log('conversation.item.created', message);\n break;\n\n case \"input_audio_buffer.speech_started\":\n // console.log('User speaking started');\n setStatus('recording');\n break;\n\n case \"input_audio_buffer.speech_stopped\":\n // console.log('User speaking stopped');\n setStatus('processing');\n break;\n\n case 'response.done':\n // console.log('response.done', message);\n for (const out of message.response.output) {\n switch (out.type) {\n case \"message\":\n // console.log('Assistant message:', out.text);\n break;\n \n case \"function_call\":\n // console.log('function_call', out);\n if (out.name === 'highlight' && out.arguments) {\n // console.log('Tool call:', out.arguments);\n try {\n let argsToUse = out.arguments;\n // Check if the JSON string is missing a closing quote\n // try {\n // console.log(\"argsToUse\", argsToUse);\n // const parsedArgs = JSON.parse(argsToUse);\n // console.log(\"parsedArgs\", parsedArgs);\n // highlightElement(parsedArgs.selector);\n // } catch (error) {\n // console.log(\"errored, argsToUse\", argsToUse);\n const prompt = `\n Validate the following JSON string and return ONLY a correct JSON object:\n Note: The selector(s) should be either a css selector or an xpath, so modify those if invalid.\n Also, [url=''] is a valid css selector, so do not modify it if it's present.\n Do not add any other text or newlines to the response.\n It should be of the following format:\n { \"selector\": \"string\" }\n or\n { \"selector\": [\"string\", ...] }\n DO NOT add any other text or newlines to the response, it should begin and end with curly braces.\n DO NOT add '''json to the response.\n The JSON string is:\n ${argsToUse}\n `\n geminiFlash(prompt).then(response => {\n response = response.replace(\"```json\", \"\").replace(\"```\", \"\").trim();\n // console.log(\"response\", response);\n const parsedArgs = JSON.parse(response);\n handleHighlightElement(parsedArgs.selector);\n }).catch(err => {\n console.error(\"Error calling Gemini:\", err);\n });\n // }\n\n\n } catch (error) {\n console.error('Error parsing function arguments:', error);\n console.log(out.arguments);\n handleLogMessage('Error parsing function arguments: ' + out.arguments, 'GUIDEAI');\n }\n }\n \n sendMessage({\n type: \"conversation.item.create\",\n item: {\n type: \"function_call_output\",\n call_id: out.call_id,\n output: JSON.stringify(true)\n }\n });\n\n sendMessage({\n type: 'response.create',\n });\n break;\n }\n }\n \n break;\n\n case \"response.function_call_arguments.delta\":\n // console.log('response.function_call_arguments.delta', message);\n break;\n\n case \"response.function_call_arguments.done\":\n // console.log('response.function_call_arguments.done', message);\n break;\n\n case \"output_audio_buffer.started\":\n setStatus('playing');\n break;\n\n case \"output_audio_buffer.stopped\":\n // console.log('output_audio_buffer.stopped');\n setStatus('recording');\n \n break;\n\n case 'error':\n if (message.error.code === 'session_expired') {\n console.error('Session expired:', message);\n setStatus('idle');\n setIsConnecting(false);\n setIsConversationActive(false);\n setEphemeralToken(null); // Clear expired token so reconnection gets fresh one\n hasCreatedConversationRef.current = false; // Allow creating new conversation\n break;\n }\n console.error('OpenAI API error:', message);\n onError(new Error(message.error.message || 'Unknown API error'), 'OpenAI API error');\n setStatus('idle');\n setIsConnecting(false);\n setIsConversationActive(false);\n setEphemeralToken(null); // Clear token in case of auth-related errors\n hasCreatedConversationRef.current = false; // Allow creating new conversation\n break;\n \n default:\n if (!IGNORE_MESSAGE_TYPES.some(fragment => message.type.includes(fragment))) {\n console.log('Unhandled:', message.type, message);\n }\n }\n } catch (error) {\n console.error('Error handling WebRTC message:', error);\n setStatus('idle');\n setIsConversationActive(false);\n }\n };\n \n // Start the session using SDP\n const offer = await pc.createOffer();\n await pc.setLocalDescription(offer);\n \n if (!pc.localDescription || !pc.localDescription.sdp) {\n throw new Error('Failed to create local SDP offer');\n }\n \n const baseUrl = OPENAI_REALTIME_BASE;\n const model = OPENAI_REALTIME_MODEL;\n \n \n const sdpResponse = await fetch(`${baseUrl}?model=${model}`, {\n method: 'POST',\n body: pc.localDescription.sdp,\n headers: {\n Authorization: `Bearer ${ephemeralToken}`,\n 'Content-Type': 'application/sdp'\n },\n });\n \n if (!sdpResponse.ok) {\n const errorText = await sdpResponse.text().catch(() => 'No error details available');\n console.error('WebRTC connection failed with status:', sdpResponse.status);\n console.error('Error details:', errorText);\n \n // Clear token on authentication failures\n if (sdpResponse.status === 401 || sdpResponse.status === 403) {\n setEphemeralToken(null);\n }\n \n throw new Error(`Failed to connect to OpenAI WebRTC: ${sdpResponse.status} - ${errorText}`);\n }\n \n const answerSdp = await sdpResponse.text();\n \n const answer = {\n type: 'answer',\n sdp: answerSdp,\n };\n \n await pc.setRemoteDescription(answer as RTCSessionDescriptionInit);\n \n return true;\n } catch (error) {\n console.error('Error initializing WebRTC:', error);\n onError(error as Error, 'WebRTC initialization failed');\n setIsConnecting(false);\n return false;\n }\n };\n\n // ===== SESSION MANAGEMENT =====\n \n const startConversationSession = async () => {\n try {\n setStatus('processing');\n \n if (peerConnectionRef.current && dataChannelRef.current?.readyState === 'open' && mediaStreamRef.current) {\n mediaStreamRef.current.getAudioTracks().forEach(track => {\n track.enabled = true;\n });\n setStatus('recording');\n return true;\n } else {\n cleanupWebRTC();\n \n try {\n setIsConnecting(true);\n \n // Ensure we have a valid token (get fresh one if needed)\n if (!ephemeralToken) {\n console.log('No token available, getting fresh token...');\n const conversationData = await handleCreateNewConversation();\n if (!conversationData) {\n console.error('Failed to get fresh token');\n setIsConnecting(false);\n setStatus('idle');\n return false;\n }\n }\n \n // Request microphone access when user clicks to start recording\n const audioStream = await navigator.mediaDevices.getUserMedia({ \n audio: {\n echoCancellation: true,\n noiseSuppression: true,\n autoGainControl: true,\n channelCount: 1,\n sampleRate: 48000,\n }\n });\n \n mediaStreamRef.current = audioStream;\n \n const initialized = await initializeWebRTC(audioStream);\n \n if (!initialized) {\n // Clean up if initialization fails\n audioStream.getAudioTracks().forEach(track => {\n track.stop();\n });\n mediaStreamRef.current = null;\n setStatus('idle');\n setIsConnecting(false);\n return false;\n }\n \n setStatus('recording');\n return true;\n } catch (error) {\n console.error('Error during conversation setup:', error);\n onError(error as Error, 'Microphone or WebRTC setup failed');\n setStatus('idle');\n setIsConnecting(false);\n return false;\n }\n }\n } catch (error) {\n setStatus('idle');\n setIsConnecting(false);\n onError(error as Error, 'Starting conversation failed');\n return false;\n }\n };\n\n const endConversationSession = () => {\n if (!isClient) return;\n \n if (mediaStreamRef.current) {\n mediaStreamRef.current.getAudioTracks().forEach(track => {\n track.stop();\n });\n }\n \n cleanupWebRTC();\n setStatus('idle');\n \n // Clear localStorage when conversation is explicitly ended\n clearConversationStorage();\n \n // Reset restored messages state\n setRestoredMessages([]);\n \n // Reset auto-start flag to allow future auto-starts\n hasAttemptedAutoStartRef.current = false;\n };\n\n // ===== UI EVENT HANDLERS =====\n \n const handleToggleConversation = async () => {\n if (!isClient) return;\n \n if (!hasInteracted) {\n setHasInteracted(true);\n localStorage.setItem('guideAI_hasInteracted', 'true');\n \n // Show onboarding on first interaction\n setShowOnboarding(true);\n return;\n }\n \n if (!isConversationActive) {\n const success = await startConversationSession();\n if (success) {\n setIsConversationActive(true);\n }\n } else {\n endConversationSession();\n setIsConversationActive(false);\n }\n };\n\n const handleOnboardingComplete = async () => {\n setShowOnboarding(false);\n \n // Start the conversation session when onboarding is completed\n const success = await startConversationSession();\n if (success) {\n setIsConversationActive(true);\n }\n };\n\n const handleOnboardingClose = () => {\n setShowOnboarding(false);\n };\n\n // ===== REACT EFFECTS & LIFECYCLE =====\n \n // initialization - mic/audio, webrtc, openai client\n getReactHooks().useEffect(() => {\n if (hasInitializedRef.current) return;\n hasInitializedRef.current = true;\n \n // Inject CSS styles\n injectStyles(guideAIStyles, 'guide-ai-styles');\n \n setIsClient(true);\n setIsConnecting(true); // Show loading state during initialization\n \n // Check for stored conversation before initializing\n const { shouldRestore, conversationId, messages } = checkForStoredConversation(organizationKey);\n \n if (shouldRestore && conversationId && messages) {\n // Store the restored messages to use as context\n setRestoredMessages(messages);\n } else {\n // No valid conversation to restore\n setRestoredMessages([]);\n }\n \n // Create new conversation (gets conversation + token + prompt)\n handleCreateNewConversation().then(conversationData => {\n setIsConnecting(false); // Hide loading state when done\n }).catch(error => {\n setIsConnecting(false); // Hide loading state on error\n console.error('Failed to create conversation:', error);\n });\n \n const hasInteractedBefore = localStorage.getItem('guideAI_hasInteracted');\n if (!hasInteractedBefore) {\n setHasInteracted(false);\n } else {\n setHasInteracted(true);\n }\n\n return () => {\n cleanupWebRTC();\n \n if (audioElementRef.current) {\n audioElementRef.current.srcObject = null;\n audioElementRef.current.remove();\n audioElementRef.current = null;\n }\n \n // Reset flags on cleanup\n hasInitializedRef.current = false;\n hasAttemptedAutoStartRef.current = false;\n };\n }, [organizationKey]);\n\n // Auto-restart effect - handles reconnection when token and restored messages are ready\n getReactHooks().useEffect(() => {\n if (ephemeralToken && restoredMessages.length > 0 && !hasAttemptedAutoStartRef.current) {\n console.log('Auto-restarting conversation with', restoredMessages.length, 'restored messages');\n hasAttemptedAutoStartRef.current = true;\n \n startConversationSession().then(success => {\n if (success) {\n setIsConversationActive(true);\n setHasInteracted(true);\n localStorage.setItem('guideAI_hasInteracted', 'true');\n }\n });\n }\n }, [ephemeralToken, restoredMessages]);\n\n // Update popup position when needed\n getReactHooks().useEffect(() => {\n if (showOnboarding || (!hasInteracted && ephemeralToken)) {\n // Use onboarding dimensions if onboarding is shown, otherwise welcome bubble dimensions\n const height = showOnboarding ? 240 : 50;\n const spacing = showOnboarding ? 20 : 15;\n setPopupPosition(getOptimalPosition(height, spacing));\n }\n }, [showOnboarding, hasInteracted, ephemeralToken]);\n\n if (!isClient) {\n return null;\n }\n\n // Determine if we should use fixed positioning (when position props are provided)\n const shouldUseFixedPosition = componentPosition && Object.keys(componentPosition).length > 0;\n \n // Base styles for the component\n const baseStyles: React.CSSProperties = {\n position: shouldUseFixedPosition ? 'fixed' : 'relative',\n zIndex: shouldUseFixedPosition ? 1000 : 'auto',\n ...(shouldUseFixedPosition ? componentPosition : {}),\n };\n\n return (\n <>\n <div\n ref={componentRef}\n style={baseStyles}\n >\n <div className=\"sarge-main-ui\">\n {!hasInteracted && ephemeralToken && (\n <WelcomeBubble position={popupPosition} />\n )}\n \n <Onboarding \n position={popupPosition}\n isVisible={showOnboarding}\n onComplete={handleOnboardingComplete}\n onClose={handleOnboardingClose}\n />\n \n <div \n className={`sarge-icon-wrapper ${isConnecting ? 'initializing' : status}`}\n onClick={isConnecting ? undefined : handleToggleConversation}\n style={isConnecting ? { cursor: 'default' } : undefined}\n title={isConnecting ? 'Initializing...' : \n status === 'idle' ? 'Click to start a conversation' : \n status === 'recording' ? 'Click to end conversation' : \n status === 'processing' ? 'Processing your message...' : \n 'AI is speaking, click to end conversation'}\n >\n {isConnecting && <i className=\"sarge-icon initializing\" />}\n {!isConnecting && status === 'idle' && <i className=\"sarge-icon microphone\" />}\n {!isConnecting && status === 'recording' && <i className=\"sarge-icon recording\" />}\n {!isConnecting && status === 'processing' && <i className=\"sarge-icon processing\" />}\n {!isConnecting && status === 'playing' && <i className=\"sarge-icon playing\" />}\n </div>\n \n </div>\n </div>\n </>\n );\n};\n\nexport default GuideAI;","import { PopupPosition } from '../types/GuideAI.types';\n\n// Function to inject CSS styles into the document head\nexport const injectStyles = (css: string, id: string) => {\n if (typeof document === 'undefined') return; // SSR safety\n \n // Check if styles are already injected\n if (document.getElementById(id)) return;\n \n const styleElement = document.createElement('style');\n styleElement.id = id;\n styleElement.textContent = css;\n document.head.appendChild(styleElement);\n};\n\n// Calculate optimal position for popups based on component location\nexport const calculateOptimalPosition = (\n componentRect: DOMRect, \n elementHeight: number = 240, \n spacing: number = 15\n): PopupPosition => {\n const viewportHeight = window.innerHeight;\n \n const spaceAbove = componentRect.top;\n const spaceBelow = viewportHeight - componentRect.bottom;\n \n const canFitBelow = spaceBelow >= (elementHeight + spacing);\n const canFitAbove = spaceAbove >= (elementHeight + spacing);\n \n if (canFitBelow) {\n return 'below';\n } else if (canFitAbove) {\n return 'above';\n } else {\n return spaceBelow > spaceAbove ? 'below' : 'above';\n }\n}; ","import React, { useState } from 'react';\nimport { PopupPosition } from '../types/GuideAI.types';\n\ninterface OnboardingProps {\n position: PopupPosition;\n isVisible: boolean;\n onComplete: () => void; // Called when user completes onboarding and wants to start conversation\n onClose: () => void; // Called when user closes onboarding without completing\n}\n\nconst Onboarding: React.FC<OnboardingProps> = ({ position, isVisible, onComplete, onClose }) => {\n const [step, setStep] = useState(1);\n\n const handleNext = () => {\n if (step < 3) {\n setStep(step + 1);\n } else {\n // Reset step and complete onboarding\n setStep(1);\n onComplete();\n }\n };\n\n const handleClose = () => {\n // Reset step when closing\n setStep(1);\n onClose();\n };\n\n if (!isVisible) {\n return null;\n }\n\n return (\n <div className={`sarge-onboarding ${position}`}>\n <div className=\"sarge-onboarding-content\">\n <button className=\"sarge-onboarding-close\" onClick={handleClose}>×</button>\n \n {step === 1 && (\n <div className=\"sarge-onboarding-step\">\n <div className=\"sarge-onboarding-icon volume-icon\">🔊</div>\n <h3>Turn on your volume</h3>\n <p>Make sure your device's volume is turned on so you can hear Guide AI's responses.</p>\n </div>\n )}\n \n {step === 2 && (\n <div className=\"sarge-onboarding-step\">\n <div className=\"sarge-onboarding-icon mic-icon\">🎤</div>\n <h3>Allow microphone access</h3>\n <p>When prompted, click \"Allow\" to let Guide AI access your microphone.</p>\n </div>\n )}\n \n {step === 3 && (\n <div className=\"sarge-onboarding-step\">\n <div className=\"sarge-onboarding-icon ready-icon\">✅</div>\n <h3>You're all set!</h3>\n <p>Click the microphone icon to start asking questions.</p>\n </div>\n )}\n \n <div className=\"sarge-onboarding-dots\">\n <span className={`dot ${step === 1 ? 'active' : ''}`}></span>\n <span className={`dot ${step === 2 ? 'active' : ''}`}></span>\n <span className={`dot ${step === 3 ? 'active' : ''}`}></span>\n </div>\n \n <button className=\"sarge-onboarding-next\" onClick={handleNext}>\n {step < 3 ? 'Next' : 'Get Started'}\n </button>\n </div>\n </div>\n );\n};\n\nexport default Onboarding; ","import React from 'react';\nimport { PopupPosition } from '../types/GuideAI.types';\n\ninterface WelcomeBubbleProps {\n position: PopupPosition;\n}\n\nconst WelcomeBubble: React.FC<WelcomeBubbleProps> = ({ position }) => {\n return (\n <div className={`sarge-welcome-bubble ${position}`}>\n Stuck? Click here and ask me a question\n </div>\n );\n};\n\nexport default WelcomeBubble; ","// Create click effects and dispatch click event on an element\nexport const clickElement = async (element: Element, rect: DOMRect): Promise<void> => {\n return new Promise<void>((resolve) => {\n setTimeout(() => {\n const clickEffectContainer = document.createElement('div');\n clickEffectContainer.style.cssText = `\n position: fixed;\n left: ${rect.left + rect.width / 2}px;\n top: ${rect.top + rect.height / 2}px;\n width: 60px;\n height: 60px;\n z-index: 1000;\n pointer-events: none;\n transform: translate(-50%, -50%);\n `;\n document.body.appendChild(clickEffectContainer);\n \n for (let j = 0; j < 3; j++) {\n const clickRipple = document.createElement('div');\n clickRipple.style.cssText = `\n position: absolute;\n left: 50%;\n top: 50%;\n width: 40px;\n height: 40px;\n border: 2px solid rgba(0, 102, 255, ${0.7 - (j * 0.2)});\n border-radius: 50%;\n transform: translate(-50%, -50%) scale(0);\n opacity: 1;\n animation: click-ripple-animation 0.8s ease-out ${j * 0.15}s forwards;\n box-shadow: 0 0 8px rgba(0, 102, 255, 0.4);\n `;\n clickEffectContainer.appendChild(clickRipple);\n }\n \n const clickDot = document.createElement('div');\n clickDot.style.cssText = `\n position: absolute;\n left: 50%;\n top: 50%;\n width: 12px;\n height: 12px;\n background: rgba(0, 102, 255, 0.9);\n border-radius: 50%;\n transform: translate(-50%, -50%) scale(0);\n animation: click-dot-animation 0.4s ease-out forwards;\n box-shadow: 0 0 5px rgba(0, 102, 255, 0.8);\n `;\n clickEffectContainer.appendChild(clickDot);\n \n const clickEvent = new MouseEvent('click', {\n view: window,\n bubbles: true,\n cancelable: true,\n });\n\n // Check for clickable subelements (links, buttons, inputs)\n const clickableElements = element.querySelectorAll('a, button, input[type=\"button\"], input[type=\"submit\"]');\n const clickableElement = clickableElements.length > 0 ? clickableElements[0] as HTMLElement : element as HTMLElement;\n console.log('Clicking element:', clickableElement);\n clickableElement.dispatchEvent(clickEvent);\n\n const originalBoxShadow = clickableElement.style.boxShadow;\n const originalTransition = clickableElement.style.transition;\n const originalZIndex = clickableElement.style.zIndex;\n\n clickableElement.style.transition = 'all 0.3s ease-out';\n clickableElement.style.boxShadow = '0 0 0 2px rgba(0, 102, 255, 0.5), 0 0 10px rgba(0, 102, 255, 0.3)';\n clickableElement.style.zIndex = '999';\n\n setTimeout(() => {\n clickableElement.style.boxShadow = originalBoxShadow;\n clickableElement.style.transition = originalTransition;\n clickableElement.style.zIndex = originalZIndex;\n\n clickEffectContainer.remove(); \n resolve();\n }, 1000);\n\n }, 1500);\n });\n};\n\n// Highlight elements on the page with animated cursor and click effects\nexport const highlightElement = async (\n selector: string | string[],\n isHighlighting: boolean,\n setIsHighlighting: (highlighting: boolean) => void,\n logMessage: (content: string, sender: 'GUIDEAI' | 'HUMAN') => void\n): Promise<boolean> => {\n if (isHighlighting) return false;\n \n const selectors = Array.isArray(selector) ? selector : [selector];\n if (selectors.length === 0) return false;\n \n console.log('Moving cursor to elements:', selectors);\n \n let cursorElement: HTMLElement | null = null;\n try {\n setIsHighlighting(true);\n \n for (let i = 0; i < selectors.length; i++) {\n const currentSelector = selectors[i];\n \n if (i > 0) {\n await new Promise(resolve => setTimeout(resolve, 1000));\n }\n \n let element;\n if (currentSelector.startsWith('//')) {\n const node = document.evaluate(currentSelector, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;\n if (!(node instanceof Element)) {\n console.log('XPath returned a non-Element node:', currentSelector);\n console.log(node);\n logMessage('XPath returned a non-Element node: ' + currentSelector, 'GUIDEAI');\n break;\n }\n element = node as Element;\n } else {\n element = document.querySelector(currentSelector);\n }\n \n if (!element) {\n console.log('Element not found:', currentSelector);\n logMessage('Element not found: ' + currentSelector, 'GUIDEAI');\n break;\n }\n \n const rect = element.getBoundingClientRect();\n \n // Create cursor if it's the first element, or reuse existing cursor\n if (!cursorElement) {\n cursorElement = document.createElement('div');\n cursorElement.id = 'guide-ai-cursor';\n \n const blueCursorSvg = `\n <svg width=\"100%\" height=\"100%\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill=\"#0066ff\" d=\"M7,2l12,11.2l-5.8,0.5l3.3,7.3l-2.2,1l-3.2-7.4L7,18.5V2\" />\n </svg>\n `;\n \n cursorElement.innerHTML = blueCursorSvg;\n cursorElement.style.cssText = `\n position: fixed;\n width: 64px;\n height: 64px;\n pointer-events: none;\n z-index: 9999;\n transition: all 0.8s ease-in-out;\n transform: translate(-50%, 0);\n filter: drop-shadow(0 0 4px rgba(0, 102, 255, 0.8));\n `;\n \n document.body.appendChild(cursorElement);\n \n // First element starts from center of viewport\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n cursorElement.style.left = `${viewportWidth / 2}px`;\n cursorElement.style.top = `${viewportHeight / 2}px`;\n }\n \n // Force reflow to ensure transition works\n cursorElement!.offsetHeight;\n \n await new Promise<void>(resolve => {\n setTimeout(() => {\n cursorElement!.style.left = `${rect.left + rect.width / 2}px`;\n cursorElement!.style.top = `${rect.top + rect.height / 2 - 10}px`;\n \n setTimeout(() => {\n cursorElement!.style.animation = 'cursor-jiggle 0.5s ease-in-out infinite';\n resolve();\n }, 800);\n }, 100);\n });\n \n await clickElement(element, rect);\n }\n\n setTimeout(() => {\n cursorElement?.remove();\n setIsHighlighting(false);\n }, 1000);\n \n return true;\n } catch (error) {\n console.error('Error moving cursor:', error);\n cursorElement?.remove();\n setIsHighlighting(false);\n return false;\n }\n}; ","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(258);\n"],"names":["root","factory","exports","module","require","define","amd","this","__WEBPACK_EXTERNAL_MODULE__156__","guideAIStyles","CONVERSATION_STORAGE_KEY","CONVERSATION_EXPIRY_MINUTES","MAX_STORED_MESSAGES","isLocalStorageAvailable","testKey","localStorage","setItem","removeItem","e","isConversationExpired","conversation","expiryTime","Date","now","timestamp","handleStorageError","error","operation","console","DOMException","name","loadConversationFromStorage","messages","length","slice","saveConversationToStorage","warn","clearConversationStorage","cleanupError","JSON","stringify","storedData","getItem","parsedData","parse","data","conversationId","Array","isArray","organizationKey","every","msg","content","sender","addMessageToStorage","message","push","checkForStoredConversation","currentOrganizationKey","storedConversation","shouldRestore","formatConversationContext","maxMessages","recentMessages","formattedMessages","map","join","DEFAULT_PROMPT","IGNORE_MESSAGE_TYPES","GUIDE_AI_API_BASE","OPENAI_REALTIME_BASE","OPENAI_REALTIME_MODEL","GEMINI_API_KEY","GEMINI_API_ENDPOINT","createNewConversation","onError","fetch","method","headers","body","userId","date","toISOString","split","time","toTimeString","response","ok","text","catch","errorText","status","Error","json","conversationData","log","id","logMessage","statusText","getReactHooks","window","React","useState","useEffect","useRef","props","position","setStatus","isClient","setIsClient","componentPosition","isHighlighting","setIsHighlighting","hasInteracted","setHasInteracted","setPrompt","setIsSessionReady","isConnecting","setIsConnecting","showOnboarding","setShowOnboarding","popupPosition","setPopupPosition","conversationIdRef","componentRef","peerConnectionRef","dataChannelRef","hasCreatedConversationRef","mediaStreamRef","audioElementRef","ephemeralToken","setEphemeralToken","hasInitializedRef","isConversationActive","setIsConversationActive","restoredMessages","setRestoredMessages","hasAttemptedAutoStartRef","geminiFlash","prompt","contents","parts","responseJson","candidates","handleCreateNewConversation","current","handleLogMessage","sendMessage","readyState","send","cleanupWebRTC","getAudioTracks","forEach","track","stop","close","srcObject","initializeWebRTC","audioStream","RTCPeerConnection","addTrack","audioEl","document","createElement","autoplay","appendChild","ontrack","kind","stream","MediaStream","dc","createDataChannel","onopen","type","session","tools","description","parameters","properties","selector","oneOf","items","required","tool_choice","turn_detection","create_response","interrupt_response","input_audio_transcription","model","language","onmessage","conversationContext","item","role","transcript","output","out","arguments","argsToUse","then","replace","trim","parsedArgs","highlightElement","err","call_id","code","some","fragment","includes","createOffer","offer","setLocalDescription","localDescription","sdp","baseUrl","Authorization","sdpResponse","answerSdp","answer","setRemoteDescription","startConversationSession","enabled","navigator","mediaDevices","getUserMedia","audio","echoCancellation","noiseSuppression","autoGainControl","channelCount","sampleRate","injectStyles","hasInteractedBefore","remove","success","elementHeight","spacing","rect","getBoundingClientRect","calculateOptimalPosition","getOptimalPosition","shouldUseFixedPosition","Object","keys","baseStyles","zIndex","ref","style","className","isVisible","onComplete","onClose","onClick","undefined","cursor","title","css","getElementById","styleElement","textContent","head","componentRect","viewportHeight","innerHeight","spaceAbove","top","spaceBelow","bottom","step","setStep","clickElement","element","Promise","resolve","setTimeout","clickEffectContainer","cssText","left","width","height","j","clickRipple","clickDot","clickEvent","MouseEvent","view","bubbles","cancelable","clickableElements","querySelectorAll","clickableElement","dispatchEvent","originalBoxShadow","boxShadow","originalTransition","transition","originalZIndex","selectors","cursorElement","i","currentSelector","startsWith","node","evaluate","XPathResult","FIRST_ORDERED_NODE_TYPE","singleNodeValue","Element","querySelector","innerHTML","viewportWidth","innerWidth","offsetHeight","animation","__webpack_module_cache__","__webpack_exports__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","call"],"sourceRoot":""}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export declare const DEFAULT_PROMPT = "you are Guide AI.\n Your role is to answer any question directly and succinctly that a user has. NEVER DIRECTLY MENTION THE SCREENSHOT, but use its information as much as possible to target your responses.\n If nothing is asked, then your goal is to generally assist them.\n IMPORTANT: NEVER answer in more than 10 words. Always be concise and limit answers to 1 sentence maximum. Be simple and as short as possible.\n Your job is to help them get it done through asking more and more targeted specific questions.";
|
|
2
2
|
export declare const IGNORE_MESSAGE_TYPES: string[];
|
|
3
|
-
export declare const GUIDE_AI_API_BASE = "
|
|
3
|
+
export declare const GUIDE_AI_API_BASE = "https://www.getguide.ai/api";
|
|
4
4
|
export declare const OPENAI_REALTIME_BASE = "https://api.openai.com/v1/realtime";
|
|
5
5
|
export declare const OPENAI_REALTIME_MODEL = "gpt-4o-realtime-preview-2024-12-17";
|
|
6
6
|
export declare const GEMINI_API_KEY = "AIzaSyBiFyzjYVupLyk8BdmfWzBL1GbzX8OUdPc";
|